libs/bidiEngine.js

  1. /**
  2. * @license
  3. * Unicode Bidi Engine based on the work of Alex Shensis (@asthensis)
  4. * MIT License
  5. */
  6. import { jsPDF } from "../jspdf.js";
  7. (function(jsPDF) {
  8. "use strict";
  9. /**
  10. * Table of Unicode types.
  11. *
  12. * Generated by:
  13. *
  14. * var bidi = require("./bidi/index");
  15. * var bidi_accumulate = bidi.slice(0, 256).concat(bidi.slice(0x0500, 0x0500 + 256 * 3)).
  16. * concat(bidi.slice(0x2000, 0x2000 + 256)).concat(bidi.slice(0xFB00, 0xFB00 + 256)).
  17. * concat(bidi.slice(0xFE00, 0xFE00 + 2 * 256));
  18. *
  19. * for( var i = 0; i < bidi_accumulate.length; i++) {
  20. * if(bidi_accumulate[i] === undefined || bidi_accumulate[i] === 'ON')
  21. * bidi_accumulate[i] = 'N'; //mark as neutral to conserve space and substitute undefined
  22. * }
  23. * var bidiAccumulateStr = 'return [ "' + bidi_accumulate.toString().replace(/,/g, '", "') + '" ];';
  24. * require("fs").writeFile('unicode-types.js', bidiAccumulateStr);
  25. *
  26. * Based on:
  27. * https://github.com/mathiasbynens/unicode-8.0.0
  28. */
  29. var bidiUnicodeTypes = [
  30. "BN",
  31. "BN",
  32. "BN",
  33. "BN",
  34. "BN",
  35. "BN",
  36. "BN",
  37. "BN",
  38. "BN",
  39. "S",
  40. "B",
  41. "S",
  42. "WS",
  43. "B",
  44. "BN",
  45. "BN",
  46. "BN",
  47. "BN",
  48. "BN",
  49. "BN",
  50. "BN",
  51. "BN",
  52. "BN",
  53. "BN",
  54. "BN",
  55. "BN",
  56. "BN",
  57. "BN",
  58. "B",
  59. "B",
  60. "B",
  61. "S",
  62. "WS",
  63. "N",
  64. "N",
  65. "ET",
  66. "ET",
  67. "ET",
  68. "N",
  69. "N",
  70. "N",
  71. "N",
  72. "N",
  73. "ES",
  74. "CS",
  75. "ES",
  76. "CS",
  77. "CS",
  78. "EN",
  79. "EN",
  80. "EN",
  81. "EN",
  82. "EN",
  83. "EN",
  84. "EN",
  85. "EN",
  86. "EN",
  87. "EN",
  88. "CS",
  89. "N",
  90. "N",
  91. "N",
  92. "N",
  93. "N",
  94. "N",
  95. "L",
  96. "L",
  97. "L",
  98. "L",
  99. "L",
  100. "L",
  101. "L",
  102. "L",
  103. "L",
  104. "L",
  105. "L",
  106. "L",
  107. "L",
  108. "L",
  109. "L",
  110. "L",
  111. "L",
  112. "L",
  113. "L",
  114. "L",
  115. "L",
  116. "L",
  117. "L",
  118. "L",
  119. "L",
  120. "L",
  121. "N",
  122. "N",
  123. "N",
  124. "N",
  125. "N",
  126. "N",
  127. "L",
  128. "L",
  129. "L",
  130. "L",
  131. "L",
  132. "L",
  133. "L",
  134. "L",
  135. "L",
  136. "L",
  137. "L",
  138. "L",
  139. "L",
  140. "L",
  141. "L",
  142. "L",
  143. "L",
  144. "L",
  145. "L",
  146. "L",
  147. "L",
  148. "L",
  149. "L",
  150. "L",
  151. "L",
  152. "L",
  153. "N",
  154. "N",
  155. "N",
  156. "N",
  157. "BN",
  158. "BN",
  159. "BN",
  160. "BN",
  161. "BN",
  162. "BN",
  163. "B",
  164. "BN",
  165. "BN",
  166. "BN",
  167. "BN",
  168. "BN",
  169. "BN",
  170. "BN",
  171. "BN",
  172. "BN",
  173. "BN",
  174. "BN",
  175. "BN",
  176. "BN",
  177. "BN",
  178. "BN",
  179. "BN",
  180. "BN",
  181. "BN",
  182. "BN",
  183. "BN",
  184. "BN",
  185. "BN",
  186. "BN",
  187. "BN",
  188. "BN",
  189. "BN",
  190. "CS",
  191. "N",
  192. "ET",
  193. "ET",
  194. "ET",
  195. "ET",
  196. "N",
  197. "N",
  198. "N",
  199. "N",
  200. "L",
  201. "N",
  202. "N",
  203. "BN",
  204. "N",
  205. "N",
  206. "ET",
  207. "ET",
  208. "EN",
  209. "EN",
  210. "N",
  211. "L",
  212. "N",
  213. "N",
  214. "N",
  215. "EN",
  216. "L",
  217. "N",
  218. "N",
  219. "N",
  220. "N",
  221. "N",
  222. "L",
  223. "L",
  224. "L",
  225. "L",
  226. "L",
  227. "L",
  228. "L",
  229. "L",
  230. "L",
  231. "L",
  232. "L",
  233. "L",
  234. "L",
  235. "L",
  236. "L",
  237. "L",
  238. "L",
  239. "L",
  240. "L",
  241. "L",
  242. "L",
  243. "L",
  244. "L",
  245. "N",
  246. "L",
  247. "L",
  248. "L",
  249. "L",
  250. "L",
  251. "L",
  252. "L",
  253. "L",
  254. "L",
  255. "L",
  256. "L",
  257. "L",
  258. "L",
  259. "L",
  260. "L",
  261. "L",
  262. "L",
  263. "L",
  264. "L",
  265. "L",
  266. "L",
  267. "L",
  268. "L",
  269. "L",
  270. "L",
  271. "L",
  272. "L",
  273. "L",
  274. "L",
  275. "L",
  276. "L",
  277. "N",
  278. "L",
  279. "L",
  280. "L",
  281. "L",
  282. "L",
  283. "L",
  284. "L",
  285. "L",
  286. "L",
  287. "L",
  288. "L",
  289. "L",
  290. "L",
  291. "L",
  292. "L",
  293. "L",
  294. "L",
  295. "L",
  296. "L",
  297. "L",
  298. "L",
  299. "L",
  300. "L",
  301. "L",
  302. "L",
  303. "L",
  304. "L",
  305. "L",
  306. "L",
  307. "L",
  308. "L",
  309. "L",
  310. "L",
  311. "L",
  312. "L",
  313. "L",
  314. "L",
  315. "L",
  316. "L",
  317. "L",
  318. "L",
  319. "L",
  320. "L",
  321. "L",
  322. "L",
  323. "L",
  324. "L",
  325. "L",
  326. "L",
  327. "L",
  328. "L",
  329. "L",
  330. "L",
  331. "L",
  332. "L",
  333. "L",
  334. "N",
  335. "L",
  336. "L",
  337. "L",
  338. "L",
  339. "L",
  340. "L",
  341. "L",
  342. "L",
  343. "L",
  344. "L",
  345. "L",
  346. "L",
  347. "L",
  348. "L",
  349. "L",
  350. "L",
  351. "L",
  352. "L",
  353. "L",
  354. "L",
  355. "L",
  356. "L",
  357. "L",
  358. "L",
  359. "L",
  360. "L",
  361. "L",
  362. "L",
  363. "L",
  364. "L",
  365. "L",
  366. "L",
  367. "L",
  368. "L",
  369. "L",
  370. "L",
  371. "L",
  372. "L",
  373. "N",
  374. "N",
  375. "L",
  376. "L",
  377. "L",
  378. "L",
  379. "L",
  380. "L",
  381. "L",
  382. "N",
  383. "L",
  384. "L",
  385. "L",
  386. "L",
  387. "L",
  388. "L",
  389. "L",
  390. "L",
  391. "L",
  392. "L",
  393. "L",
  394. "L",
  395. "L",
  396. "L",
  397. "L",
  398. "L",
  399. "L",
  400. "L",
  401. "L",
  402. "L",
  403. "L",
  404. "L",
  405. "L",
  406. "L",
  407. "L",
  408. "L",
  409. "L",
  410. "L",
  411. "L",
  412. "L",
  413. "L",
  414. "L",
  415. "L",
  416. "L",
  417. "L",
  418. "L",
  419. "L",
  420. "L",
  421. "L",
  422. "N",
  423. "L",
  424. "N",
  425. "N",
  426. "N",
  427. "N",
  428. "N",
  429. "ET",
  430. "N",
  431. "NSM",
  432. "NSM",
  433. "NSM",
  434. "NSM",
  435. "NSM",
  436. "NSM",
  437. "NSM",
  438. "NSM",
  439. "NSM",
  440. "NSM",
  441. "NSM",
  442. "NSM",
  443. "NSM",
  444. "NSM",
  445. "NSM",
  446. "NSM",
  447. "NSM",
  448. "NSM",
  449. "NSM",
  450. "NSM",
  451. "NSM",
  452. "NSM",
  453. "NSM",
  454. "NSM",
  455. "NSM",
  456. "NSM",
  457. "NSM",
  458. "NSM",
  459. "NSM",
  460. "NSM",
  461. "NSM",
  462. "NSM",
  463. "NSM",
  464. "NSM",
  465. "NSM",
  466. "NSM",
  467. "NSM",
  468. "NSM",
  469. "NSM",
  470. "NSM",
  471. "NSM",
  472. "NSM",
  473. "NSM",
  474. "NSM",
  475. "NSM",
  476. "R",
  477. "NSM",
  478. "R",
  479. "NSM",
  480. "NSM",
  481. "R",
  482. "NSM",
  483. "NSM",
  484. "R",
  485. "NSM",
  486. "N",
  487. "N",
  488. "N",
  489. "N",
  490. "N",
  491. "N",
  492. "N",
  493. "N",
  494. "R",
  495. "R",
  496. "R",
  497. "R",
  498. "R",
  499. "R",
  500. "R",
  501. "R",
  502. "R",
  503. "R",
  504. "R",
  505. "R",
  506. "R",
  507. "R",
  508. "R",
  509. "R",
  510. "R",
  511. "R",
  512. "R",
  513. "R",
  514. "R",
  515. "R",
  516. "R",
  517. "R",
  518. "R",
  519. "R",
  520. "R",
  521. "N",
  522. "N",
  523. "N",
  524. "N",
  525. "N",
  526. "R",
  527. "R",
  528. "R",
  529. "R",
  530. "R",
  531. "N",
  532. "N",
  533. "N",
  534. "N",
  535. "N",
  536. "N",
  537. "N",
  538. "N",
  539. "N",
  540. "N",
  541. "N",
  542. "AN",
  543. "AN",
  544. "AN",
  545. "AN",
  546. "AN",
  547. "AN",
  548. "N",
  549. "N",
  550. "AL",
  551. "ET",
  552. "ET",
  553. "AL",
  554. "CS",
  555. "AL",
  556. "N",
  557. "N",
  558. "NSM",
  559. "NSM",
  560. "NSM",
  561. "NSM",
  562. "NSM",
  563. "NSM",
  564. "NSM",
  565. "NSM",
  566. "NSM",
  567. "NSM",
  568. "NSM",
  569. "AL",
  570. "AL",
  571. "N",
  572. "AL",
  573. "AL",
  574. "AL",
  575. "AL",
  576. "AL",
  577. "AL",
  578. "AL",
  579. "AL",
  580. "AL",
  581. "AL",
  582. "AL",
  583. "AL",
  584. "AL",
  585. "AL",
  586. "AL",
  587. "AL",
  588. "AL",
  589. "AL",
  590. "AL",
  591. "AL",
  592. "AL",
  593. "AL",
  594. "AL",
  595. "AL",
  596. "AL",
  597. "AL",
  598. "AL",
  599. "AL",
  600. "AL",
  601. "AL",
  602. "AL",
  603. "AL",
  604. "AL",
  605. "AL",
  606. "AL",
  607. "AL",
  608. "AL",
  609. "AL",
  610. "AL",
  611. "AL",
  612. "AL",
  613. "AL",
  614. "AL",
  615. "AL",
  616. "AL",
  617. "NSM",
  618. "NSM",
  619. "NSM",
  620. "NSM",
  621. "NSM",
  622. "NSM",
  623. "NSM",
  624. "NSM",
  625. "NSM",
  626. "NSM",
  627. "NSM",
  628. "NSM",
  629. "NSM",
  630. "NSM",
  631. "NSM",
  632. "NSM",
  633. "NSM",
  634. "NSM",
  635. "NSM",
  636. "NSM",
  637. "NSM",
  638. "AN",
  639. "AN",
  640. "AN",
  641. "AN",
  642. "AN",
  643. "AN",
  644. "AN",
  645. "AN",
  646. "AN",
  647. "AN",
  648. "ET",
  649. "AN",
  650. "AN",
  651. "AL",
  652. "AL",
  653. "AL",
  654. "NSM",
  655. "AL",
  656. "AL",
  657. "AL",
  658. "AL",
  659. "AL",
  660. "AL",
  661. "AL",
  662. "AL",
  663. "AL",
  664. "AL",
  665. "AL",
  666. "AL",
  667. "AL",
  668. "AL",
  669. "AL",
  670. "AL",
  671. "AL",
  672. "AL",
  673. "AL",
  674. "AL",
  675. "AL",
  676. "AL",
  677. "AL",
  678. "AL",
  679. "AL",
  680. "AL",
  681. "AL",
  682. "AL",
  683. "AL",
  684. "AL",
  685. "AL",
  686. "AL",
  687. "AL",
  688. "AL",
  689. "AL",
  690. "AL",
  691. "AL",
  692. "AL",
  693. "AL",
  694. "AL",
  695. "AL",
  696. "AL",
  697. "AL",
  698. "AL",
  699. "AL",
  700. "AL",
  701. "AL",
  702. "AL",
  703. "AL",
  704. "AL",
  705. "AL",
  706. "AL",
  707. "AL",
  708. "AL",
  709. "AL",
  710. "AL",
  711. "AL",
  712. "AL",
  713. "AL",
  714. "AL",
  715. "AL",
  716. "AL",
  717. "AL",
  718. "AL",
  719. "AL",
  720. "AL",
  721. "AL",
  722. "AL",
  723. "AL",
  724. "AL",
  725. "AL",
  726. "AL",
  727. "AL",
  728. "AL",
  729. "AL",
  730. "AL",
  731. "AL",
  732. "AL",
  733. "AL",
  734. "AL",
  735. "AL",
  736. "AL",
  737. "AL",
  738. "AL",
  739. "AL",
  740. "AL",
  741. "AL",
  742. "AL",
  743. "AL",
  744. "AL",
  745. "AL",
  746. "AL",
  747. "AL",
  748. "AL",
  749. "AL",
  750. "AL",
  751. "AL",
  752. "AL",
  753. "AL",
  754. "AL",
  755. "AL",
  756. "NSM",
  757. "NSM",
  758. "NSM",
  759. "NSM",
  760. "NSM",
  761. "NSM",
  762. "NSM",
  763. "AN",
  764. "N",
  765. "NSM",
  766. "NSM",
  767. "NSM",
  768. "NSM",
  769. "NSM",
  770. "NSM",
  771. "AL",
  772. "AL",
  773. "NSM",
  774. "NSM",
  775. "N",
  776. "NSM",
  777. "NSM",
  778. "NSM",
  779. "NSM",
  780. "AL",
  781. "AL",
  782. "EN",
  783. "EN",
  784. "EN",
  785. "EN",
  786. "EN",
  787. "EN",
  788. "EN",
  789. "EN",
  790. "EN",
  791. "EN",
  792. "AL",
  793. "AL",
  794. "AL",
  795. "AL",
  796. "AL",
  797. "AL",
  798. "AL",
  799. "AL",
  800. "AL",
  801. "AL",
  802. "AL",
  803. "AL",
  804. "AL",
  805. "AL",
  806. "AL",
  807. "AL",
  808. "AL",
  809. "AL",
  810. "AL",
  811. "AL",
  812. "N",
  813. "AL",
  814. "AL",
  815. "NSM",
  816. "AL",
  817. "AL",
  818. "AL",
  819. "AL",
  820. "AL",
  821. "AL",
  822. "AL",
  823. "AL",
  824. "AL",
  825. "AL",
  826. "AL",
  827. "AL",
  828. "AL",
  829. "AL",
  830. "AL",
  831. "AL",
  832. "AL",
  833. "AL",
  834. "AL",
  835. "AL",
  836. "AL",
  837. "AL",
  838. "AL",
  839. "AL",
  840. "AL",
  841. "AL",
  842. "AL",
  843. "AL",
  844. "AL",
  845. "AL",
  846. "NSM",
  847. "NSM",
  848. "NSM",
  849. "NSM",
  850. "NSM",
  851. "NSM",
  852. "NSM",
  853. "NSM",
  854. "NSM",
  855. "NSM",
  856. "NSM",
  857. "NSM",
  858. "NSM",
  859. "NSM",
  860. "NSM",
  861. "NSM",
  862. "NSM",
  863. "NSM",
  864. "NSM",
  865. "NSM",
  866. "NSM",
  867. "NSM",
  868. "NSM",
  869. "NSM",
  870. "NSM",
  871. "NSM",
  872. "NSM",
  873. "N",
  874. "N",
  875. "AL",
  876. "AL",
  877. "AL",
  878. "AL",
  879. "AL",
  880. "AL",
  881. "AL",
  882. "AL",
  883. "AL",
  884. "AL",
  885. "AL",
  886. "AL",
  887. "AL",
  888. "AL",
  889. "AL",
  890. "AL",
  891. "AL",
  892. "AL",
  893. "AL",
  894. "AL",
  895. "AL",
  896. "AL",
  897. "AL",
  898. "AL",
  899. "AL",
  900. "AL",
  901. "AL",
  902. "AL",
  903. "AL",
  904. "AL",
  905. "AL",
  906. "AL",
  907. "AL",
  908. "AL",
  909. "AL",
  910. "AL",
  911. "AL",
  912. "AL",
  913. "AL",
  914. "AL",
  915. "AL",
  916. "AL",
  917. "AL",
  918. "AL",
  919. "AL",
  920. "AL",
  921. "AL",
  922. "AL",
  923. "AL",
  924. "AL",
  925. "AL",
  926. "AL",
  927. "AL",
  928. "AL",
  929. "AL",
  930. "AL",
  931. "AL",
  932. "AL",
  933. "AL",
  934. "AL",
  935. "AL",
  936. "AL",
  937. "AL",
  938. "AL",
  939. "AL",
  940. "AL",
  941. "AL",
  942. "AL",
  943. "AL",
  944. "AL",
  945. "AL",
  946. "AL",
  947. "AL",
  948. "AL",
  949. "AL",
  950. "AL",
  951. "AL",
  952. "AL",
  953. "AL",
  954. "AL",
  955. "AL",
  956. "AL",
  957. "AL",
  958. "AL",
  959. "AL",
  960. "AL",
  961. "AL",
  962. "AL",
  963. "AL",
  964. "NSM",
  965. "NSM",
  966. "NSM",
  967. "NSM",
  968. "NSM",
  969. "NSM",
  970. "NSM",
  971. "NSM",
  972. "NSM",
  973. "NSM",
  974. "NSM",
  975. "AL",
  976. "N",
  977. "N",
  978. "N",
  979. "N",
  980. "N",
  981. "N",
  982. "N",
  983. "N",
  984. "N",
  985. "N",
  986. "N",
  987. "N",
  988. "N",
  989. "N",
  990. "R",
  991. "R",
  992. "R",
  993. "R",
  994. "R",
  995. "R",
  996. "R",
  997. "R",
  998. "R",
  999. "R",
  1000. "R",
  1001. "R",
  1002. "R",
  1003. "R",
  1004. "R",
  1005. "R",
  1006. "R",
  1007. "R",
  1008. "R",
  1009. "R",
  1010. "R",
  1011. "R",
  1012. "R",
  1013. "R",
  1014. "R",
  1015. "R",
  1016. "R",
  1017. "R",
  1018. "R",
  1019. "R",
  1020. "R",
  1021. "R",
  1022. "R",
  1023. "R",
  1024. "R",
  1025. "R",
  1026. "R",
  1027. "R",
  1028. "R",
  1029. "R",
  1030. "R",
  1031. "R",
  1032. "R",
  1033. "NSM",
  1034. "NSM",
  1035. "NSM",
  1036. "NSM",
  1037. "NSM",
  1038. "NSM",
  1039. "NSM",
  1040. "NSM",
  1041. "NSM",
  1042. "R",
  1043. "R",
  1044. "N",
  1045. "N",
  1046. "N",
  1047. "N",
  1048. "R",
  1049. "N",
  1050. "N",
  1051. "N",
  1052. "N",
  1053. "N",
  1054. "WS",
  1055. "WS",
  1056. "WS",
  1057. "WS",
  1058. "WS",
  1059. "WS",
  1060. "WS",
  1061. "WS",
  1062. "WS",
  1063. "WS",
  1064. "WS",
  1065. "BN",
  1066. "BN",
  1067. "BN",
  1068. "L",
  1069. "R",
  1070. "N",
  1071. "N",
  1072. "N",
  1073. "N",
  1074. "N",
  1075. "N",
  1076. "N",
  1077. "N",
  1078. "N",
  1079. "N",
  1080. "N",
  1081. "N",
  1082. "N",
  1083. "N",
  1084. "N",
  1085. "N",
  1086. "N",
  1087. "N",
  1088. "N",
  1089. "N",
  1090. "N",
  1091. "N",
  1092. "N",
  1093. "N",
  1094. "WS",
  1095. "B",
  1096. "LRE",
  1097. "RLE",
  1098. "PDF",
  1099. "LRO",
  1100. "RLO",
  1101. "CS",
  1102. "ET",
  1103. "ET",
  1104. "ET",
  1105. "ET",
  1106. "ET",
  1107. "N",
  1108. "N",
  1109. "N",
  1110. "N",
  1111. "N",
  1112. "N",
  1113. "N",
  1114. "N",
  1115. "N",
  1116. "N",
  1117. "N",
  1118. "N",
  1119. "N",
  1120. "N",
  1121. "N",
  1122. "CS",
  1123. "N",
  1124. "N",
  1125. "N",
  1126. "N",
  1127. "N",
  1128. "N",
  1129. "N",
  1130. "N",
  1131. "N",
  1132. "N",
  1133. "N",
  1134. "N",
  1135. "N",
  1136. "N",
  1137. "N",
  1138. "N",
  1139. "N",
  1140. "N",
  1141. "N",
  1142. "N",
  1143. "N",
  1144. "N",
  1145. "N",
  1146. "N",
  1147. "N",
  1148. "N",
  1149. "WS",
  1150. "BN",
  1151. "BN",
  1152. "BN",
  1153. "BN",
  1154. "BN",
  1155. "N",
  1156. "LRI",
  1157. "RLI",
  1158. "FSI",
  1159. "PDI",
  1160. "BN",
  1161. "BN",
  1162. "BN",
  1163. "BN",
  1164. "BN",
  1165. "BN",
  1166. "EN",
  1167. "L",
  1168. "N",
  1169. "N",
  1170. "EN",
  1171. "EN",
  1172. "EN",
  1173. "EN",
  1174. "EN",
  1175. "EN",
  1176. "ES",
  1177. "ES",
  1178. "N",
  1179. "N",
  1180. "N",
  1181. "L",
  1182. "EN",
  1183. "EN",
  1184. "EN",
  1185. "EN",
  1186. "EN",
  1187. "EN",
  1188. "EN",
  1189. "EN",
  1190. "EN",
  1191. "EN",
  1192. "ES",
  1193. "ES",
  1194. "N",
  1195. "N",
  1196. "N",
  1197. "N",
  1198. "L",
  1199. "L",
  1200. "L",
  1201. "L",
  1202. "L",
  1203. "L",
  1204. "L",
  1205. "L",
  1206. "L",
  1207. "L",
  1208. "L",
  1209. "L",
  1210. "L",
  1211. "N",
  1212. "N",
  1213. "N",
  1214. "ET",
  1215. "ET",
  1216. "ET",
  1217. "ET",
  1218. "ET",
  1219. "ET",
  1220. "ET",
  1221. "ET",
  1222. "ET",
  1223. "ET",
  1224. "ET",
  1225. "ET",
  1226. "ET",
  1227. "ET",
  1228. "ET",
  1229. "ET",
  1230. "ET",
  1231. "ET",
  1232. "ET",
  1233. "ET",
  1234. "ET",
  1235. "ET",
  1236. "ET",
  1237. "ET",
  1238. "ET",
  1239. "ET",
  1240. "ET",
  1241. "ET",
  1242. "ET",
  1243. "ET",
  1244. "ET",
  1245. "N",
  1246. "N",
  1247. "N",
  1248. "N",
  1249. "N",
  1250. "N",
  1251. "N",
  1252. "N",
  1253. "N",
  1254. "N",
  1255. "N",
  1256. "N",
  1257. "N",
  1258. "N",
  1259. "N",
  1260. "N",
  1261. "N",
  1262. "NSM",
  1263. "NSM",
  1264. "NSM",
  1265. "NSM",
  1266. "NSM",
  1267. "NSM",
  1268. "NSM",
  1269. "NSM",
  1270. "NSM",
  1271. "NSM",
  1272. "NSM",
  1273. "NSM",
  1274. "NSM",
  1275. "NSM",
  1276. "NSM",
  1277. "NSM",
  1278. "NSM",
  1279. "NSM",
  1280. "NSM",
  1281. "NSM",
  1282. "NSM",
  1283. "NSM",
  1284. "NSM",
  1285. "NSM",
  1286. "NSM",
  1287. "NSM",
  1288. "NSM",
  1289. "NSM",
  1290. "NSM",
  1291. "NSM",
  1292. "NSM",
  1293. "NSM",
  1294. "NSM",
  1295. "N",
  1296. "N",
  1297. "N",
  1298. "N",
  1299. "N",
  1300. "N",
  1301. "N",
  1302. "N",
  1303. "N",
  1304. "N",
  1305. "N",
  1306. "N",
  1307. "N",
  1308. "N",
  1309. "N",
  1310. "L",
  1311. "L",
  1312. "L",
  1313. "L",
  1314. "L",
  1315. "L",
  1316. "L",
  1317. "N",
  1318. "N",
  1319. "N",
  1320. "N",
  1321. "N",
  1322. "N",
  1323. "N",
  1324. "N",
  1325. "N",
  1326. "N",
  1327. "N",
  1328. "N",
  1329. "L",
  1330. "L",
  1331. "L",
  1332. "L",
  1333. "L",
  1334. "N",
  1335. "N",
  1336. "N",
  1337. "N",
  1338. "N",
  1339. "R",
  1340. "NSM",
  1341. "R",
  1342. "R",
  1343. "R",
  1344. "R",
  1345. "R",
  1346. "R",
  1347. "R",
  1348. "R",
  1349. "R",
  1350. "R",
  1351. "ES",
  1352. "R",
  1353. "R",
  1354. "R",
  1355. "R",
  1356. "R",
  1357. "R",
  1358. "R",
  1359. "R",
  1360. "R",
  1361. "R",
  1362. "R",
  1363. "R",
  1364. "R",
  1365. "N",
  1366. "R",
  1367. "R",
  1368. "R",
  1369. "R",
  1370. "R",
  1371. "N",
  1372. "R",
  1373. "N",
  1374. "R",
  1375. "R",
  1376. "N",
  1377. "R",
  1378. "R",
  1379. "N",
  1380. "R",
  1381. "R",
  1382. "R",
  1383. "R",
  1384. "R",
  1385. "R",
  1386. "R",
  1387. "R",
  1388. "R",
  1389. "R",
  1390. "AL",
  1391. "AL",
  1392. "AL",
  1393. "AL",
  1394. "AL",
  1395. "AL",
  1396. "AL",
  1397. "AL",
  1398. "AL",
  1399. "AL",
  1400. "AL",
  1401. "AL",
  1402. "AL",
  1403. "AL",
  1404. "AL",
  1405. "AL",
  1406. "AL",
  1407. "AL",
  1408. "AL",
  1409. "AL",
  1410. "AL",
  1411. "AL",
  1412. "AL",
  1413. "AL",
  1414. "AL",
  1415. "AL",
  1416. "AL",
  1417. "AL",
  1418. "AL",
  1419. "AL",
  1420. "AL",
  1421. "AL",
  1422. "AL",
  1423. "AL",
  1424. "AL",
  1425. "AL",
  1426. "AL",
  1427. "AL",
  1428. "AL",
  1429. "AL",
  1430. "AL",
  1431. "AL",
  1432. "AL",
  1433. "AL",
  1434. "AL",
  1435. "AL",
  1436. "AL",
  1437. "AL",
  1438. "AL",
  1439. "AL",
  1440. "AL",
  1441. "AL",
  1442. "AL",
  1443. "AL",
  1444. "AL",
  1445. "AL",
  1446. "AL",
  1447. "AL",
  1448. "AL",
  1449. "AL",
  1450. "AL",
  1451. "AL",
  1452. "AL",
  1453. "AL",
  1454. "AL",
  1455. "AL",
  1456. "AL",
  1457. "AL",
  1458. "AL",
  1459. "AL",
  1460. "AL",
  1461. "AL",
  1462. "AL",
  1463. "AL",
  1464. "AL",
  1465. "AL",
  1466. "AL",
  1467. "AL",
  1468. "AL",
  1469. "AL",
  1470. "AL",
  1471. "AL",
  1472. "AL",
  1473. "AL",
  1474. "AL",
  1475. "AL",
  1476. "AL",
  1477. "AL",
  1478. "AL",
  1479. "AL",
  1480. "AL",
  1481. "AL",
  1482. "AL",
  1483. "AL",
  1484. "AL",
  1485. "AL",
  1486. "AL",
  1487. "AL",
  1488. "AL",
  1489. "AL",
  1490. "AL",
  1491. "AL",
  1492. "AL",
  1493. "AL",
  1494. "AL",
  1495. "AL",
  1496. "AL",
  1497. "AL",
  1498. "AL",
  1499. "AL",
  1500. "AL",
  1501. "AL",
  1502. "AL",
  1503. "AL",
  1504. "N",
  1505. "N",
  1506. "N",
  1507. "N",
  1508. "N",
  1509. "N",
  1510. "N",
  1511. "N",
  1512. "N",
  1513. "N",
  1514. "N",
  1515. "N",
  1516. "N",
  1517. "N",
  1518. "N",
  1519. "N",
  1520. "N",
  1521. "AL",
  1522. "AL",
  1523. "AL",
  1524. "AL",
  1525. "AL",
  1526. "AL",
  1527. "AL",
  1528. "AL",
  1529. "AL",
  1530. "AL",
  1531. "AL",
  1532. "AL",
  1533. "AL",
  1534. "AL",
  1535. "AL",
  1536. "AL",
  1537. "AL",
  1538. "AL",
  1539. "AL",
  1540. "AL",
  1541. "AL",
  1542. "AL",
  1543. "AL",
  1544. "AL",
  1545. "AL",
  1546. "AL",
  1547. "AL",
  1548. "AL",
  1549. "AL",
  1550. "AL",
  1551. "AL",
  1552. "AL",
  1553. "AL",
  1554. "AL",
  1555. "AL",
  1556. "AL",
  1557. "AL",
  1558. "AL",
  1559. "AL",
  1560. "AL",
  1561. "AL",
  1562. "AL",
  1563. "AL",
  1564. "AL",
  1565. "AL",
  1566. "NSM",
  1567. "NSM",
  1568. "NSM",
  1569. "NSM",
  1570. "NSM",
  1571. "NSM",
  1572. "NSM",
  1573. "NSM",
  1574. "NSM",
  1575. "NSM",
  1576. "NSM",
  1577. "NSM",
  1578. "NSM",
  1579. "NSM",
  1580. "NSM",
  1581. "NSM",
  1582. "N",
  1583. "N",
  1584. "N",
  1585. "N",
  1586. "N",
  1587. "N",
  1588. "N",
  1589. "N",
  1590. "N",
  1591. "N",
  1592. "N",
  1593. "N",
  1594. "N",
  1595. "N",
  1596. "N",
  1597. "N",
  1598. "NSM",
  1599. "NSM",
  1600. "NSM",
  1601. "NSM",
  1602. "NSM",
  1603. "NSM",
  1604. "NSM",
  1605. "NSM",
  1606. "NSM",
  1607. "NSM",
  1608. "NSM",
  1609. "NSM",
  1610. "NSM",
  1611. "NSM",
  1612. "NSM",
  1613. "NSM",
  1614. "N",
  1615. "N",
  1616. "N",
  1617. "N",
  1618. "N",
  1619. "N",
  1620. "N",
  1621. "N",
  1622. "N",
  1623. "N",
  1624. "N",
  1625. "N",
  1626. "N",
  1627. "N",
  1628. "N",
  1629. "N",
  1630. "N",
  1631. "N",
  1632. "N",
  1633. "N",
  1634. "N",
  1635. "N",
  1636. "N",
  1637. "N",
  1638. "N",
  1639. "N",
  1640. "N",
  1641. "N",
  1642. "N",
  1643. "N",
  1644. "N",
  1645. "N",
  1646. "CS",
  1647. "N",
  1648. "CS",
  1649. "N",
  1650. "N",
  1651. "CS",
  1652. "N",
  1653. "N",
  1654. "N",
  1655. "N",
  1656. "N",
  1657. "N",
  1658. "N",
  1659. "N",
  1660. "N",
  1661. "ET",
  1662. "N",
  1663. "N",
  1664. "ES",
  1665. "ES",
  1666. "N",
  1667. "N",
  1668. "N",
  1669. "N",
  1670. "N",
  1671. "ET",
  1672. "ET",
  1673. "N",
  1674. "N",
  1675. "N",
  1676. "N",
  1677. "N",
  1678. "AL",
  1679. "AL",
  1680. "AL",
  1681. "AL",
  1682. "AL",
  1683. "N",
  1684. "AL",
  1685. "AL",
  1686. "AL",
  1687. "AL",
  1688. "AL",
  1689. "AL",
  1690. "AL",
  1691. "AL",
  1692. "AL",
  1693. "AL",
  1694. "AL",
  1695. "AL",
  1696. "AL",
  1697. "AL",
  1698. "AL",
  1699. "AL",
  1700. "AL",
  1701. "AL",
  1702. "AL",
  1703. "AL",
  1704. "AL",
  1705. "AL",
  1706. "AL",
  1707. "AL",
  1708. "AL",
  1709. "AL",
  1710. "AL",
  1711. "AL",
  1712. "AL",
  1713. "AL",
  1714. "AL",
  1715. "AL",
  1716. "AL",
  1717. "AL",
  1718. "AL",
  1719. "AL",
  1720. "AL",
  1721. "AL",
  1722. "AL",
  1723. "AL",
  1724. "AL",
  1725. "AL",
  1726. "AL",
  1727. "AL",
  1728. "AL",
  1729. "AL",
  1730. "AL",
  1731. "AL",
  1732. "AL",
  1733. "AL",
  1734. "AL",
  1735. "AL",
  1736. "AL",
  1737. "AL",
  1738. "AL",
  1739. "AL",
  1740. "AL",
  1741. "AL",
  1742. "AL",
  1743. "AL",
  1744. "AL",
  1745. "AL",
  1746. "AL",
  1747. "AL",
  1748. "AL",
  1749. "AL",
  1750. "AL",
  1751. "AL",
  1752. "AL",
  1753. "AL",
  1754. "AL",
  1755. "AL",
  1756. "AL",
  1757. "AL",
  1758. "AL",
  1759. "AL",
  1760. "AL",
  1761. "AL",
  1762. "AL",
  1763. "AL",
  1764. "AL",
  1765. "AL",
  1766. "AL",
  1767. "AL",
  1768. "AL",
  1769. "AL",
  1770. "AL",
  1771. "AL",
  1772. "AL",
  1773. "AL",
  1774. "AL",
  1775. "AL",
  1776. "AL",
  1777. "AL",
  1778. "AL",
  1779. "AL",
  1780. "AL",
  1781. "AL",
  1782. "AL",
  1783. "AL",
  1784. "AL",
  1785. "AL",
  1786. "AL",
  1787. "AL",
  1788. "AL",
  1789. "AL",
  1790. "AL",
  1791. "AL",
  1792. "AL",
  1793. "AL",
  1794. "AL",
  1795. "AL",
  1796. "AL",
  1797. "AL",
  1798. "AL",
  1799. "AL",
  1800. "AL",
  1801. "AL",
  1802. "AL",
  1803. "AL",
  1804. "AL",
  1805. "AL",
  1806. "AL",
  1807. "AL",
  1808. "AL",
  1809. "AL",
  1810. "AL",
  1811. "AL",
  1812. "AL",
  1813. "AL",
  1814. "AL",
  1815. "AL",
  1816. "AL",
  1817. "AL",
  1818. "AL",
  1819. "N",
  1820. "N",
  1821. "BN",
  1822. "N",
  1823. "N",
  1824. "N",
  1825. "ET",
  1826. "ET",
  1827. "ET",
  1828. "N",
  1829. "N",
  1830. "N",
  1831. "N",
  1832. "N",
  1833. "ES",
  1834. "CS",
  1835. "ES",
  1836. "CS",
  1837. "CS",
  1838. "EN",
  1839. "EN",
  1840. "EN",
  1841. "EN",
  1842. "EN",
  1843. "EN",
  1844. "EN",
  1845. "EN",
  1846. "EN",
  1847. "EN",
  1848. "CS",
  1849. "N",
  1850. "N",
  1851. "N",
  1852. "N",
  1853. "N",
  1854. "N",
  1855. "L",
  1856. "L",
  1857. "L",
  1858. "L",
  1859. "L",
  1860. "L",
  1861. "L",
  1862. "L",
  1863. "L",
  1864. "L",
  1865. "L",
  1866. "L",
  1867. "L",
  1868. "L",
  1869. "L",
  1870. "L",
  1871. "L",
  1872. "L",
  1873. "L",
  1874. "L",
  1875. "L",
  1876. "L",
  1877. "L",
  1878. "L",
  1879. "L",
  1880. "L",
  1881. "N",
  1882. "N",
  1883. "N",
  1884. "N",
  1885. "N",
  1886. "N",
  1887. "L",
  1888. "L",
  1889. "L",
  1890. "L",
  1891. "L",
  1892. "L",
  1893. "L",
  1894. "L",
  1895. "L",
  1896. "L",
  1897. "L",
  1898. "L",
  1899. "L",
  1900. "L",
  1901. "L",
  1902. "L",
  1903. "L",
  1904. "L",
  1905. "L",
  1906. "L",
  1907. "L",
  1908. "L",
  1909. "L",
  1910. "L",
  1911. "L",
  1912. "L",
  1913. "N",
  1914. "N",
  1915. "N",
  1916. "N",
  1917. "N",
  1918. "N",
  1919. "N",
  1920. "N",
  1921. "N",
  1922. "N",
  1923. "N",
  1924. "L",
  1925. "L",
  1926. "L",
  1927. "L",
  1928. "L",
  1929. "L",
  1930. "L",
  1931. "L",
  1932. "L",
  1933. "L",
  1934. "L",
  1935. "L",
  1936. "L",
  1937. "L",
  1938. "L",
  1939. "L",
  1940. "L",
  1941. "L",
  1942. "L",
  1943. "L",
  1944. "L",
  1945. "L",
  1946. "L",
  1947. "L",
  1948. "L",
  1949. "L",
  1950. "L",
  1951. "L",
  1952. "L",
  1953. "L",
  1954. "L",
  1955. "L",
  1956. "L",
  1957. "L",
  1958. "L",
  1959. "L",
  1960. "L",
  1961. "L",
  1962. "L",
  1963. "L",
  1964. "L",
  1965. "L",
  1966. "L",
  1967. "L",
  1968. "L",
  1969. "L",
  1970. "L",
  1971. "L",
  1972. "L",
  1973. "L",
  1974. "L",
  1975. "L",
  1976. "L",
  1977. "L",
  1978. "L",
  1979. "L",
  1980. "L",
  1981. "L",
  1982. "L",
  1983. "L",
  1984. "L",
  1985. "L",
  1986. "L",
  1987. "L",
  1988. "L",
  1989. "L",
  1990. "L",
  1991. "L",
  1992. "L",
  1993. "L",
  1994. "L",
  1995. "L",
  1996. "L",
  1997. "L",
  1998. "L",
  1999. "L",
  2000. "L",
  2001. "L",
  2002. "L",
  2003. "L",
  2004. "L",
  2005. "L",
  2006. "L",
  2007. "L",
  2008. "L",
  2009. "L",
  2010. "L",
  2011. "L",
  2012. "L",
  2013. "N",
  2014. "N",
  2015. "N",
  2016. "L",
  2017. "L",
  2018. "L",
  2019. "L",
  2020. "L",
  2021. "L",
  2022. "N",
  2023. "N",
  2024. "L",
  2025. "L",
  2026. "L",
  2027. "L",
  2028. "L",
  2029. "L",
  2030. "N",
  2031. "N",
  2032. "L",
  2033. "L",
  2034. "L",
  2035. "L",
  2036. "L",
  2037. "L",
  2038. "N",
  2039. "N",
  2040. "L",
  2041. "L",
  2042. "L",
  2043. "N",
  2044. "N",
  2045. "N",
  2046. "ET",
  2047. "ET",
  2048. "N",
  2049. "N",
  2050. "N",
  2051. "ET",
  2052. "ET",
  2053. "N",
  2054. "N",
  2055. "N",
  2056. "N",
  2057. "N",
  2058. "N",
  2059. "N",
  2060. "N",
  2061. "N",
  2062. "N",
  2063. "N",
  2064. "N",
  2065. "N",
  2066. "N",
  2067. "N",
  2068. "N",
  2069. "N",
  2070. "N",
  2071. "N",
  2072. "N",
  2073. "N",
  2074. "N",
  2075. "N",
  2076. "N",
  2077. "N"
  2078. ];
  2079. /**
  2080. * Unicode Bidi algorithm compliant Bidi engine.
  2081. * For reference see http://unicode.org/reports/tr9/
  2082. */
  2083. /**
  2084. * constructor ( options )
  2085. *
  2086. * Initializes Bidi engine
  2087. *
  2088. * @param {Object} See 'setOptions' below for detailed description.
  2089. * options are cashed between invocation of 'doBidiReorder' method
  2090. *
  2091. * sample usage pattern of BidiEngine:
  2092. * var opt = {
  2093. * isInputVisual: true,
  2094. * isInputRtl: false,
  2095. * isOutputVisual: false,
  2096. * isOutputRtl: false,
  2097. * isSymmetricSwapping: true
  2098. * }
  2099. * var sourceToTarget = [], levels = [];
  2100. * var bidiEng = Globalize.bidiEngine(opt);
  2101. * var src = "text string to be reordered";
  2102. * var ret = bidiEng.doBidiReorder(src, sourceToTarget, levels);
  2103. */
  2104. jsPDF.__bidiEngine__ = jsPDF.prototype.__bidiEngine__ = function(options) {
  2105. var _UNICODE_TYPES = _bidiUnicodeTypes;
  2106. var _STATE_TABLE_LTR = [
  2107. [0, 3, 0, 1, 0, 0, 0],
  2108. [0, 3, 0, 1, 2, 2, 0],
  2109. [0, 3, 0, 0x11, 2, 0, 1],
  2110. [0, 3, 5, 5, 4, 1, 0],
  2111. [0, 3, 0x15, 0x15, 4, 0, 1],
  2112. [0, 3, 5, 5, 4, 2, 0]
  2113. ];
  2114. var _STATE_TABLE_RTL = [
  2115. [2, 0, 1, 1, 0, 1, 0],
  2116. [2, 0, 1, 1, 0, 2, 0],
  2117. [2, 0, 2, 1, 3, 2, 0],
  2118. [2, 0, 2, 0x21, 3, 1, 1]
  2119. ];
  2120. var _TYPE_NAMES_MAP = { L: 0, R: 1, EN: 2, AN: 3, N: 4, B: 5, S: 6 };
  2121. var _UNICODE_RANGES_MAP = {
  2122. 0: 0,
  2123. 5: 1,
  2124. 6: 2,
  2125. 7: 3,
  2126. 0x20: 4,
  2127. 0xfb: 5,
  2128. 0xfe: 6,
  2129. 0xff: 7
  2130. };
  2131. var _SWAP_TABLE = [
  2132. "\u0028",
  2133. "\u0029",
  2134. "\u0028",
  2135. "\u003C",
  2136. "\u003E",
  2137. "\u003C",
  2138. "\u005B",
  2139. "\u005D",
  2140. "\u005B",
  2141. "\u007B",
  2142. "\u007D",
  2143. "\u007B",
  2144. "\u00AB",
  2145. "\u00BB",
  2146. "\u00AB",
  2147. "\u2039",
  2148. "\u203A",
  2149. "\u2039",
  2150. "\u2045",
  2151. "\u2046",
  2152. "\u2045",
  2153. "\u207D",
  2154. "\u207E",
  2155. "\u207D",
  2156. "\u208D",
  2157. "\u208E",
  2158. "\u208D",
  2159. "\u2264",
  2160. "\u2265",
  2161. "\u2264",
  2162. "\u2329",
  2163. "\u232A",
  2164. "\u2329",
  2165. "\uFE59",
  2166. "\uFE5A",
  2167. "\uFE59",
  2168. "\uFE5B",
  2169. "\uFE5C",
  2170. "\uFE5B",
  2171. "\uFE5D",
  2172. "\uFE5E",
  2173. "\uFE5D",
  2174. "\uFE64",
  2175. "\uFE65",
  2176. "\uFE64"
  2177. ];
  2178. var _LTR_RANGES_REG_EXPR = new RegExp(
  2179. /^([1-4|9]|1[0-9]|2[0-9]|3[0168]|4[04589]|5[012]|7[78]|159|16[0-9]|17[0-2]|21[569]|22[03489]|250)$/
  2180. );
  2181. var _lastArabic = false,
  2182. _hasUbatAl,
  2183. _hasUbatB,
  2184. _hasUbatS,
  2185. DIR_LTR = 0,
  2186. DIR_RTL = 1,
  2187. _isInVisual,
  2188. _isInRtl,
  2189. _isOutVisual,
  2190. _isOutRtl,
  2191. _isSymmetricSwapping,
  2192. _dir = DIR_LTR;
  2193. this.__bidiEngine__ = {};
  2194. var _init = function(text, sourceToTargetMap) {
  2195. if (sourceToTargetMap) {
  2196. for (var i = 0; i < text.length; i++) {
  2197. sourceToTargetMap[i] = i;
  2198. }
  2199. }
  2200. if (_isInRtl === undefined) {
  2201. _isInRtl = _isContextualDirRtl(text);
  2202. }
  2203. if (_isOutRtl === undefined) {
  2204. _isOutRtl = _isContextualDirRtl(text);
  2205. }
  2206. };
  2207. // for reference see 3.2 in http://unicode.org/reports/tr9/
  2208. //
  2209. var _getCharType = function(ch) {
  2210. var charCode = ch.charCodeAt(),
  2211. range = charCode >> 8,
  2212. rangeIdx = _UNICODE_RANGES_MAP[range];
  2213. if (rangeIdx !== undefined) {
  2214. return _UNICODE_TYPES[rangeIdx * 256 + (charCode & 0xff)];
  2215. } else if (range === 0xfc || range === 0xfd) {
  2216. return "AL";
  2217. } else if (_LTR_RANGES_REG_EXPR.test(range)) {
  2218. //unlikely case
  2219. return "L";
  2220. } else if (range === 8) {
  2221. // even less likely
  2222. return "R";
  2223. }
  2224. return "N"; //undefined type, mark as neutral
  2225. };
  2226. var _isContextualDirRtl = function(text) {
  2227. for (var i = 0, charType; i < text.length; i++) {
  2228. charType = _getCharType(text.charAt(i));
  2229. if (charType === "L") {
  2230. return false;
  2231. } else if (charType === "R") {
  2232. return true;
  2233. }
  2234. }
  2235. return false;
  2236. };
  2237. // for reference see 3.3.4 & 3.3.5 in http://unicode.org/reports/tr9/
  2238. //
  2239. var _resolveCharType = function(chars, types, resolvedTypes, index) {
  2240. var cType = types[index],
  2241. wType,
  2242. nType,
  2243. i,
  2244. len;
  2245. switch (cType) {
  2246. case "L":
  2247. case "R":
  2248. _lastArabic = false;
  2249. break;
  2250. case "N":
  2251. case "AN":
  2252. break;
  2253. case "EN":
  2254. if (_lastArabic) {
  2255. cType = "AN";
  2256. }
  2257. break;
  2258. case "AL":
  2259. _lastArabic = true;
  2260. _hasUbatAl = true;
  2261. cType = "R";
  2262. break;
  2263. case "WS":
  2264. cType = "N";
  2265. break;
  2266. case "CS":
  2267. if (
  2268. index < 1 ||
  2269. index + 1 >= types.length ||
  2270. ((wType = resolvedTypes[index - 1]) !== "EN" && wType !== "AN") ||
  2271. ((nType = types[index + 1]) !== "EN" && nType !== "AN")
  2272. ) {
  2273. cType = "N";
  2274. } else if (_lastArabic) {
  2275. nType = "AN";
  2276. }
  2277. cType = nType === wType ? nType : "N";
  2278. break;
  2279. case "ES":
  2280. wType = index > 0 ? resolvedTypes[index - 1] : "B";
  2281. cType =
  2282. wType === "EN" &&
  2283. index + 1 < types.length &&
  2284. types[index + 1] === "EN"
  2285. ? "EN"
  2286. : "N";
  2287. break;
  2288. case "ET":
  2289. if (index > 0 && resolvedTypes[index - 1] === "EN") {
  2290. cType = "EN";
  2291. break;
  2292. } else if (_lastArabic) {
  2293. cType = "N";
  2294. break;
  2295. }
  2296. i = index + 1;
  2297. len = types.length;
  2298. while (i < len && types[i] === "ET") {
  2299. i++;
  2300. }
  2301. if (i < len && types[i] === "EN") {
  2302. cType = "EN";
  2303. } else {
  2304. cType = "N";
  2305. }
  2306. break;
  2307. case "NSM":
  2308. if (_isInVisual && !_isInRtl) {
  2309. //V->L
  2310. len = types.length;
  2311. i = index + 1;
  2312. while (i < len && types[i] === "NSM") {
  2313. i++;
  2314. }
  2315. if (i < len) {
  2316. var c = chars[index];
  2317. var rtlCandidate = (c >= 0x0591 && c <= 0x08ff) || c === 0xfb1e;
  2318. wType = types[i];
  2319. if (rtlCandidate && (wType === "R" || wType === "AL")) {
  2320. cType = "R";
  2321. break;
  2322. }
  2323. }
  2324. }
  2325. if (index < 1 || (wType = types[index - 1]) === "B") {
  2326. cType = "N";
  2327. } else {
  2328. cType = resolvedTypes[index - 1];
  2329. }
  2330. break;
  2331. case "B":
  2332. _lastArabic = false;
  2333. _hasUbatB = true;
  2334. cType = _dir;
  2335. break;
  2336. case "S":
  2337. _hasUbatS = true;
  2338. cType = "N";
  2339. break;
  2340. case "LRE":
  2341. case "RLE":
  2342. case "LRO":
  2343. case "RLO":
  2344. case "PDF":
  2345. _lastArabic = false;
  2346. break;
  2347. case "BN":
  2348. cType = "N";
  2349. break;
  2350. }
  2351. return cType;
  2352. };
  2353. var _handleUbatS = function(types, levels, length) {
  2354. for (var i = 0; i < length; i++) {
  2355. if (types[i] === "S") {
  2356. levels[i] = _dir;
  2357. for (var j = i - 1; j >= 0; j--) {
  2358. if (types[j] === "WS") {
  2359. levels[j] = _dir;
  2360. } else {
  2361. break;
  2362. }
  2363. }
  2364. }
  2365. }
  2366. };
  2367. var _invertString = function(text, sourceToTargetMap, levels) {
  2368. var charArray = text.split("");
  2369. if (levels) {
  2370. _computeLevels(charArray, levels, { hiLevel: _dir });
  2371. }
  2372. charArray.reverse();
  2373. sourceToTargetMap && sourceToTargetMap.reverse();
  2374. return charArray.join("");
  2375. };
  2376. // For reference see 3.3 in http://unicode.org/reports/tr9/
  2377. //
  2378. var _computeLevels = function(chars, levels, params) {
  2379. var action,
  2380. condition,
  2381. i,
  2382. index,
  2383. newLevel,
  2384. prevState,
  2385. condPos = -1,
  2386. len = chars.length,
  2387. newState = 0,
  2388. resolvedTypes = [],
  2389. stateTable = _dir ? _STATE_TABLE_RTL : _STATE_TABLE_LTR,
  2390. types = [];
  2391. _lastArabic = false;
  2392. _hasUbatAl = false;
  2393. _hasUbatB = false;
  2394. _hasUbatS = false;
  2395. for (i = 0; i < len; i++) {
  2396. types[i] = _getCharType(chars[i]);
  2397. }
  2398. for (index = 0; index < len; index++) {
  2399. prevState = newState;
  2400. resolvedTypes[index] = _resolveCharType(
  2401. chars,
  2402. types,
  2403. resolvedTypes,
  2404. index
  2405. );
  2406. newState = stateTable[prevState][_TYPE_NAMES_MAP[resolvedTypes[index]]];
  2407. action = newState & 0xf0;
  2408. newState &= 0x0f;
  2409. levels[index] = newLevel = stateTable[newState][5];
  2410. if (action > 0) {
  2411. if (action === 0x10) {
  2412. for (i = condPos; i < index; i++) {
  2413. levels[i] = 1;
  2414. }
  2415. condPos = -1;
  2416. } else {
  2417. condPos = -1;
  2418. }
  2419. }
  2420. condition = stateTable[newState][6];
  2421. if (condition) {
  2422. if (condPos === -1) {
  2423. condPos = index;
  2424. }
  2425. } else {
  2426. if (condPos > -1) {
  2427. for (i = condPos; i < index; i++) {
  2428. levels[i] = newLevel;
  2429. }
  2430. condPos = -1;
  2431. }
  2432. }
  2433. if (types[index] === "B") {
  2434. levels[index] = 0;
  2435. }
  2436. params.hiLevel |= newLevel;
  2437. }
  2438. if (_hasUbatS) {
  2439. _handleUbatS(types, levels, len);
  2440. }
  2441. };
  2442. // for reference see 3.4 in http://unicode.org/reports/tr9/
  2443. //
  2444. var _invertByLevel = function(
  2445. level,
  2446. charArray,
  2447. sourceToTargetMap,
  2448. levels,
  2449. params
  2450. ) {
  2451. if (params.hiLevel < level) {
  2452. return;
  2453. }
  2454. if (level === 1 && _dir === DIR_RTL && !_hasUbatB) {
  2455. charArray.reverse();
  2456. sourceToTargetMap && sourceToTargetMap.reverse();
  2457. return;
  2458. }
  2459. var ch,
  2460. high,
  2461. end,
  2462. low,
  2463. len = charArray.length,
  2464. start = 0;
  2465. while (start < len) {
  2466. if (levels[start] >= level) {
  2467. end = start + 1;
  2468. while (end < len && levels[end] >= level) {
  2469. end++;
  2470. }
  2471. for (low = start, high = end - 1; low < high; low++, high--) {
  2472. ch = charArray[low];
  2473. charArray[low] = charArray[high];
  2474. charArray[high] = ch;
  2475. if (sourceToTargetMap) {
  2476. ch = sourceToTargetMap[low];
  2477. sourceToTargetMap[low] = sourceToTargetMap[high];
  2478. sourceToTargetMap[high] = ch;
  2479. }
  2480. }
  2481. start = end;
  2482. }
  2483. start++;
  2484. }
  2485. };
  2486. // for reference see 7 & BD16 in http://unicode.org/reports/tr9/
  2487. //
  2488. var _symmetricSwap = function(charArray, levels, params) {
  2489. if (params.hiLevel !== 0 && _isSymmetricSwapping) {
  2490. for (var i = 0, index; i < charArray.length; i++) {
  2491. if (levels[i] === 1) {
  2492. index = _SWAP_TABLE.indexOf(charArray[i]);
  2493. if (index >= 0) {
  2494. charArray[i] = _SWAP_TABLE[index + 1];
  2495. }
  2496. }
  2497. }
  2498. }
  2499. };
  2500. var _reorder = function(text, sourceToTargetMap, levels) {
  2501. var charArray = text.split(""),
  2502. params = { hiLevel: _dir };
  2503. if (!levels) {
  2504. levels = [];
  2505. }
  2506. _computeLevels(charArray, levels, params);
  2507. _symmetricSwap(charArray, levels, params);
  2508. _invertByLevel(DIR_RTL + 1, charArray, sourceToTargetMap, levels, params);
  2509. _invertByLevel(DIR_RTL, charArray, sourceToTargetMap, levels, params);
  2510. return charArray.join("");
  2511. };
  2512. // doBidiReorder( text, sourceToTargetMap, levels )
  2513. // Performs Bidi reordering by implementing Unicode Bidi algorithm.
  2514. // Returns reordered string
  2515. // @text [String]:
  2516. // - input string to be reordered, this is input parameter
  2517. // $sourceToTargetMap [Array] (optional)
  2518. // - resultant mapping between input and output strings, this is output parameter
  2519. // $levels [Array] (optional)
  2520. // - array of calculated Bidi levels, , this is output parameter
  2521. this.__bidiEngine__.doBidiReorder = function(
  2522. text,
  2523. sourceToTargetMap,
  2524. levels
  2525. ) {
  2526. _init(text, sourceToTargetMap);
  2527. if (!_isInVisual && _isOutVisual && !_isOutRtl) {
  2528. // LLTR->VLTR, LRTL->VLTR
  2529. _dir = _isInRtl ? DIR_RTL : DIR_LTR;
  2530. text = _reorder(text, sourceToTargetMap, levels);
  2531. } else if (_isInVisual && _isOutVisual && _isInRtl ^ _isOutRtl) {
  2532. // VRTL->VLTR, VLTR->VRTL
  2533. _dir = _isInRtl ? DIR_RTL : DIR_LTR;
  2534. text = _invertString(text, sourceToTargetMap, levels);
  2535. } else if (!_isInVisual && _isOutVisual && _isOutRtl) {
  2536. // LLTR->VRTL, LRTL->VRTL
  2537. _dir = _isInRtl ? DIR_RTL : DIR_LTR;
  2538. text = _reorder(text, sourceToTargetMap, levels);
  2539. text = _invertString(text, sourceToTargetMap);
  2540. } else if (_isInVisual && !_isInRtl && !_isOutVisual && !_isOutRtl) {
  2541. // VLTR->LLTR
  2542. _dir = DIR_LTR;
  2543. text = _reorder(text, sourceToTargetMap, levels);
  2544. } else if (_isInVisual && !_isOutVisual && _isInRtl ^ _isOutRtl) {
  2545. // VLTR->LRTL, VRTL->LLTR
  2546. text = _invertString(text, sourceToTargetMap);
  2547. if (_isInRtl) {
  2548. //LLTR -> VLTR
  2549. _dir = DIR_LTR;
  2550. text = _reorder(text, sourceToTargetMap, levels);
  2551. } else {
  2552. //LRTL -> VRTL
  2553. _dir = DIR_RTL;
  2554. text = _reorder(text, sourceToTargetMap, levels);
  2555. text = _invertString(text, sourceToTargetMap);
  2556. }
  2557. } else if (_isInVisual && _isInRtl && !_isOutVisual && _isOutRtl) {
  2558. // VRTL->LRTL
  2559. _dir = DIR_RTL;
  2560. text = _reorder(text, sourceToTargetMap, levels);
  2561. text = _invertString(text, sourceToTargetMap);
  2562. } else if (!_isInVisual && !_isOutVisual && _isInRtl ^ _isOutRtl) {
  2563. // LRTL->LLTR, LLTR->LRTL
  2564. var isSymmetricSwappingOrig = _isSymmetricSwapping;
  2565. if (_isInRtl) {
  2566. //LRTL->LLTR
  2567. _dir = DIR_RTL;
  2568. text = _reorder(text, sourceToTargetMap, levels);
  2569. _dir = DIR_LTR;
  2570. _isSymmetricSwapping = false;
  2571. text = _reorder(text, sourceToTargetMap, levels);
  2572. _isSymmetricSwapping = isSymmetricSwappingOrig;
  2573. } else {
  2574. //LLTR->LRTL
  2575. _dir = DIR_LTR;
  2576. text = _reorder(text, sourceToTargetMap, levels);
  2577. text = _invertString(text, sourceToTargetMap);
  2578. _dir = DIR_RTL;
  2579. _isSymmetricSwapping = false;
  2580. text = _reorder(text, sourceToTargetMap, levels);
  2581. _isSymmetricSwapping = isSymmetricSwappingOrig;
  2582. text = _invertString(text, sourceToTargetMap);
  2583. }
  2584. }
  2585. return text;
  2586. };
  2587. /**
  2588. * @name setOptions( options )
  2589. * @function
  2590. * Sets options for Bidi conversion
  2591. * @param {Object}:
  2592. * - isInputVisual {boolean} (defaults to false): allowed values: true(Visual mode), false(Logical mode)
  2593. * - isInputRtl {boolean}: allowed values true(Right-to-left direction), false (Left-to-right directiion), undefined(Contectual direction, i.e.direction defined by first strong character of input string)
  2594. * - isOutputVisual {boolean} (defaults to false): allowed values: true(Visual mode), false(Logical mode)
  2595. * - isOutputRtl {boolean}: allowed values true(Right-to-left direction), false (Left-to-right directiion), undefined(Contectual direction, i.e.direction defined by first strong characterof input string)
  2596. * - isSymmetricSwapping {boolean} (defaults to false): allowed values true(needs symmetric swapping), false (no need in symmetric swapping),
  2597. */
  2598. this.__bidiEngine__.setOptions = function(options) {
  2599. if (options) {
  2600. _isInVisual = options.isInputVisual;
  2601. _isOutVisual = options.isOutputVisual;
  2602. _isInRtl = options.isInputRtl;
  2603. _isOutRtl = options.isOutputRtl;
  2604. _isSymmetricSwapping = options.isSymmetricSwapping;
  2605. }
  2606. };
  2607. this.__bidiEngine__.setOptions(options);
  2608. return this.__bidiEngine__;
  2609. };
  2610. var _bidiUnicodeTypes = bidiUnicodeTypes;
  2611. var bidiEngine = new jsPDF.__bidiEngine__({ isInputVisual: true });
  2612. var bidiEngineFunction = function(args) {
  2613. var text = args.text;
  2614. var x = args.x;
  2615. var y = args.y;
  2616. var options = args.options || {};
  2617. var mutex = args.mutex || {};
  2618. var lang = options.lang;
  2619. var tmpText = [];
  2620. options.isInputVisual =
  2621. typeof options.isInputVisual === "boolean" ? options.isInputVisual : true;
  2622. bidiEngine.setOptions(options);
  2623. if (Object.prototype.toString.call(text) === "[object Array]") {
  2624. var i = 0;
  2625. tmpText = [];
  2626. for (i = 0; i < text.length; i += 1) {
  2627. if (Object.prototype.toString.call(text[i]) === "[object Array]") {
  2628. tmpText.push([
  2629. bidiEngine.doBidiReorder(text[i][0]),
  2630. text[i][1],
  2631. text[i][2]
  2632. ]);
  2633. } else {
  2634. tmpText.push([bidiEngine.doBidiReorder(text[i])]);
  2635. }
  2636. }
  2637. args.text = tmpText;
  2638. } else {
  2639. args.text = bidiEngine.doBidiReorder(text);
  2640. }
  2641. bidiEngine.setOptions({ isInputVisual: true });
  2642. };
  2643. jsPDF.API.events.push(["postProcessText", bidiEngineFunction]);
  2644. })(jsPDF);