draftjs_html 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7195ba4d0f0e659dfd6cb335ee461ca122d3db48f379e8c88c01000fbedefccb
4
- data.tar.gz: 0ee5ec82ddcac4ae7acb99399a7fd6d52054d21f23abcb2a2ff61cca6bc2c9b7
3
+ metadata.gz: 52f7615c058a8dc529adc63b4115922190a80e148abda3344945c65258b007c3
4
+ data.tar.gz: ad493439af6d379e4758b40381eec4a7f5a025d7058b25e67df616ca897d9716
5
5
  SHA512:
6
- metadata.gz: 9ee9d2f946504b1c79b936d215edda2a17ec94970c356e2b59be224da471ace3c0389af24418a7c9d93b0d343b3d6681e4a8638e8bf83b7e776257f8f5babb2e
7
- data.tar.gz: ebb33f7bfa4fd9a0ca6de27c4bd6a5ff8b24b4d0f480706edff7dbf1065ac89b28f4f6f075f06d9dcc03825c33e6e07df36166c4f1d333e5316b68a9b80454a1
6
+ metadata.gz: 7f6c3e0a9b93c474cdc9a2534eef0837ccd7f33d4fe3f278efaab3aa830bb4e00c39388fef8e41e14ee0278e4d9934f723f3486239876caa5d8e77d19639f4af
7
+ data.tar.gz: d743f9ac0708b38f25a49d3ccfd31d845ffcea9f7430c5d9313c69ec15dc5aa93b3c923069bf0f7999940c54c29049ea1ae4aa707e6b98fd4754a7c118a0c466
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DraftjsHtml
4
+ # This class implements a simplified "Bidi" algorithm to determine if a
5
+ # DraftJS block should be Right-to-Left or Left-to-Right. The spec can
6
+ # be found [here](http://www.unicode.org/reports/tr9).
7
+ #
8
+ # The algorithm is almost a direct copy of the UnicodeBidiService from
9
+ # [`fbjs`](https://github.com/facebook/fbjs/blob/main/packages/fbjs/src/unicode/UnicodeBidiService.js).
10
+ #
11
+ # In short, we initialize with a default LTR direction, and for each chunk of
12
+ # text, we update that direction based on "control" characters or known
13
+ # RTL/LTR characters (here called "strong" characters). The most recent state
14
+ # is preserved and used on following blocks/chunks until either a reset or
15
+ # another update changes the direction.
16
+ class CurrentBidiDirection
17
+ LTR = 'ltr'
18
+ RTL = 'rtl'
19
+
20
+ STRONG_LTR_CHAR_RANGES = [
21
+ 'A-Za-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB',
22
+ '\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0293\u0294\u0295-\u02AF\u02B0-\u02B8',
23
+ '\u02BB-\u02C1\u02D0-\u02D1\u02E0-\u02E4\u02EE\u0370-\u0373\u0376-\u0377',
24
+ '\u037A\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1',
25
+ '\u03A3-\u03F5\u03F7-\u0481\u0482\u048A-\u052F\u0531-\u0556\u0559',
26
+ '\u055A-\u055F\u0561-\u0587\u0589\u0903\u0904-\u0939\u093B\u093D',
27
+ '\u093E-\u0940\u0949-\u094C\u094E-\u094F\u0950\u0958-\u0961\u0964-\u0965',
28
+ '\u0966-\u096F\u0970\u0971\u0972-\u0980\u0982-\u0983\u0985-\u098C',
29
+ '\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD',
30
+ '\u09BE-\u09C0\u09C7-\u09C8\u09CB-\u09CC\u09CE\u09D7\u09DC-\u09DD',
31
+ '\u09DF-\u09E1\u09E6-\u09EF\u09F0-\u09F1\u09F4-\u09F9\u09FA\u0A03',
32
+ '\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33',
33
+ '\u0A35-\u0A36\u0A38-\u0A39\u0A3E-\u0A40\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F',
34
+ '\u0A72-\u0A74\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0',
35
+ '\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0ABE-\u0AC0\u0AC9\u0ACB-\u0ACC\u0AD0',
36
+ '\u0AE0-\u0AE1\u0AE6-\u0AEF\u0AF0\u0B02-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10',
37
+ '\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B3E\u0B40',
38
+ '\u0B47-\u0B48\u0B4B-\u0B4C\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F',
39
+ '\u0B70\u0B71\u0B72-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95',
40
+ '\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9',
41
+ '\u0BBE-\u0BBF\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD0\u0BD7',
42
+ '\u0BE6-\u0BEF\u0BF0-\u0BF2\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10',
43
+ '\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C41-\u0C44\u0C58-\u0C59\u0C60-\u0C61',
44
+ '\u0C66-\u0C6F\u0C7F\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8',
45
+ '\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CBE\u0CBF\u0CC0-\u0CC4\u0CC6',
46
+ '\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF',
47
+ '\u0CF1-\u0CF2\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D',
48
+ '\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D57\u0D60-\u0D61',
49
+ '\u0D66-\u0D6F\u0D70-\u0D75\u0D79\u0D7A-\u0D7F\u0D82-\u0D83\u0D85-\u0D96',
50
+ '\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD1\u0DD8-\u0DDF',
51
+ '\u0DE6-\u0DEF\u0DF2-\u0DF3\u0DF4\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45',
52
+ '\u0E46\u0E4F\u0E50-\u0E59\u0E5A-\u0E5B\u0E81-\u0E82\u0E84\u0E87-\u0E88',
53
+ '\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7',
54
+ '\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6',
55
+ '\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F01-\u0F03\u0F04-\u0F12\u0F13\u0F14',
56
+ '\u0F15-\u0F17\u0F1A-\u0F1F\u0F20-\u0F29\u0F2A-\u0F33\u0F34\u0F36\u0F38',
57
+ '\u0F3E-\u0F3F\u0F40-\u0F47\u0F49-\u0F6C\u0F7F\u0F85\u0F88-\u0F8C',
58
+ '\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE-\u0FCF\u0FD0-\u0FD4\u0FD5-\u0FD8',
59
+ '\u0FD9-\u0FDA\u1000-\u102A\u102B-\u102C\u1031\u1038\u103B-\u103C\u103F',
60
+ '\u1040-\u1049\u104A-\u104F\u1050-\u1055\u1056-\u1057\u105A-\u105D\u1061',
61
+ '\u1062-\u1064\u1065-\u1066\u1067-\u106D\u106E-\u1070\u1075-\u1081',
62
+ '\u1083-\u1084\u1087-\u108C\u108E\u108F\u1090-\u1099\u109A-\u109C',
63
+ '\u109E-\u109F\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FB\u10FC',
64
+ '\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288',
65
+ '\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5',
66
+ '\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1360-\u1368',
67
+ '\u1369-\u137C\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166D-\u166E',
68
+ '\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EB-\u16ED\u16EE-\u16F0',
69
+ '\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1735-\u1736',
70
+ '\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17B6\u17BE-\u17C5',
71
+ '\u17C7-\u17C8\u17D4-\u17D6\u17D7\u17D8-\u17DA\u17DC\u17E0-\u17E9',
72
+ '\u1810-\u1819\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u18AA',
73
+ '\u18B0-\u18F5\u1900-\u191E\u1923-\u1926\u1929-\u192B\u1930-\u1931',
74
+ '\u1933-\u1938\u1946-\u194F\u1950-\u196D\u1970-\u1974\u1980-\u19AB',
75
+ '\u19B0-\u19C0\u19C1-\u19C7\u19C8-\u19C9\u19D0-\u19D9\u19DA\u1A00-\u1A16',
76
+ '\u1A19-\u1A1A\u1A1E-\u1A1F\u1A20-\u1A54\u1A55\u1A57\u1A61\u1A63-\u1A64',
77
+ '\u1A6D-\u1A72\u1A80-\u1A89\u1A90-\u1A99\u1AA0-\u1AA6\u1AA7\u1AA8-\u1AAD',
78
+ '\u1B04\u1B05-\u1B33\u1B35\u1B3B\u1B3D-\u1B41\u1B43-\u1B44\u1B45-\u1B4B',
79
+ '\u1B50-\u1B59\u1B5A-\u1B60\u1B61-\u1B6A\u1B74-\u1B7C\u1B82\u1B83-\u1BA0',
80
+ '\u1BA1\u1BA6-\u1BA7\u1BAA\u1BAE-\u1BAF\u1BB0-\u1BB9\u1BBA-\u1BE5\u1BE7',
81
+ '\u1BEA-\u1BEC\u1BEE\u1BF2-\u1BF3\u1BFC-\u1BFF\u1C00-\u1C23\u1C24-\u1C2B',
82
+ '\u1C34-\u1C35\u1C3B-\u1C3F\u1C40-\u1C49\u1C4D-\u1C4F\u1C50-\u1C59',
83
+ '\u1C5A-\u1C77\u1C78-\u1C7D\u1C7E-\u1C7F\u1CC0-\u1CC7\u1CD3\u1CE1',
84
+ '\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF2-\u1CF3\u1CF5-\u1CF6\u1D00-\u1D2B',
85
+ '\u1D2C-\u1D6A\u1D6B-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1E00-\u1F15',
86
+ '\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D',
87
+ '\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC',
88
+ '\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200E',
89
+ '\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D',
90
+ '\u2124\u2126\u2128\u212A-\u212D\u212F-\u2134\u2135-\u2138\u2139',
91
+ '\u213C-\u213F\u2145-\u2149\u214E\u214F\u2160-\u2182\u2183-\u2184',
92
+ '\u2185-\u2188\u2336-\u237A\u2395\u249C-\u24E9\u26AC\u2800-\u28FF',
93
+ '\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2C7B\u2C7C-\u2C7D\u2C7E-\u2CE4',
94
+ '\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F',
95
+ '\u2D70\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE',
96
+ '\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007',
97
+ '\u3021-\u3029\u302E-\u302F\u3031-\u3035\u3038-\u303A\u303B\u303C',
98
+ '\u3041-\u3096\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF',
99
+ '\u3105-\u312D\u3131-\u318E\u3190-\u3191\u3192-\u3195\u3196-\u319F',
100
+ '\u31A0-\u31BA\u31F0-\u31FF\u3200-\u321C\u3220-\u3229\u322A-\u3247',
101
+ '\u3248-\u324F\u3260-\u327B\u327F\u3280-\u3289\u328A-\u32B0\u32C0-\u32CB',
102
+ '\u32D0-\u32FE\u3300-\u3376\u337B-\u33DD\u33E0-\u33FE\u3400-\u4DB5',
103
+ '\u4E00-\u9FCC\uA000-\uA014\uA015\uA016-\uA48C\uA4D0-\uA4F7\uA4F8-\uA4FD',
104
+ '\uA4FE-\uA4FF\uA500-\uA60B\uA60C\uA610-\uA61F\uA620-\uA629\uA62A-\uA62B',
105
+ '\uA640-\uA66D\uA66E\uA680-\uA69B\uA69C-\uA69D\uA6A0-\uA6E5\uA6E6-\uA6EF',
106
+ '\uA6F2-\uA6F7\uA722-\uA76F\uA770\uA771-\uA787\uA789-\uA78A\uA78B-\uA78E',
107
+ '\uA790-\uA7AD\uA7B0-\uA7B1\uA7F7\uA7F8-\uA7F9\uA7FA\uA7FB-\uA801',
108
+ '\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA823-\uA824\uA827\uA830-\uA835',
109
+ '\uA836-\uA837\uA840-\uA873\uA880-\uA881\uA882-\uA8B3\uA8B4-\uA8C3',
110
+ '\uA8CE-\uA8CF\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8F8-\uA8FA\uA8FB\uA900-\uA909',
111
+ '\uA90A-\uA925\uA92E-\uA92F\uA930-\uA946\uA952-\uA953\uA95F\uA960-\uA97C',
112
+ '\uA983\uA984-\uA9B2\uA9B4-\uA9B5\uA9BA-\uA9BB\uA9BD-\uA9C0\uA9C1-\uA9CD',
113
+ '\uA9CF\uA9D0-\uA9D9\uA9DE-\uA9DF\uA9E0-\uA9E4\uA9E6\uA9E7-\uA9EF',
114
+ '\uA9F0-\uA9F9\uA9FA-\uA9FE\uAA00-\uAA28\uAA2F-\uAA30\uAA33-\uAA34',
115
+ '\uAA40-\uAA42\uAA44-\uAA4B\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F\uAA60-\uAA6F',
116
+ '\uAA70\uAA71-\uAA76\uAA77-\uAA79\uAA7A\uAA7B\uAA7D\uAA7E-\uAAAF\uAAB1',
117
+ '\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAADD\uAADE-\uAADF',
118
+ '\uAAE0-\uAAEA\uAAEB\uAAEE-\uAAEF\uAAF0-\uAAF1\uAAF2\uAAF3-\uAAF4\uAAF5',
119
+ '\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E',
120
+ '\uAB30-\uAB5A\uAB5B\uAB5C-\uAB5F\uAB64-\uAB65\uABC0-\uABE2\uABE3-\uABE4',
121
+ '\uABE6-\uABE7\uABE9-\uABEA\uABEB\uABEC\uABF0-\uABF9\uAC00-\uD7A3',
122
+ '\uD7B0-\uD7C6\uD7CB-\uD7FB\uE000-\uF8FF\uF900-\uFA6D\uFA70-\uFAD9',
123
+ '\uFB00-\uFB06\uFB13-\uFB17\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF6F\uFF70',
124
+ '\uFF71-\uFF9D\uFF9E-\uFF9F\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF',
125
+ '\uFFD2-\uFFD7\uFFDA-\uFFDC',
126
+ ].join.freeze
127
+
128
+ LTR_MATCHER = /[#{STRONG_LTR_CHAR_RANGES}]/.freeze
129
+
130
+ STRONG_RTL_CHAR_RANGES = [
131
+ '\u0590\u05BE\u05C0\u05C3\u05C6\u05C8-\u05CF\u05D0-\u05EA\u05EB-\u05EF',
132
+ '\u05F0-\u05F2\u05F3-\u05F4\u05F5-\u05FF\u07C0-\u07C9\u07CA-\u07EA',
133
+ '\u07F4-\u07F5\u07FA\u07FB-\u07FF\u0800-\u0815\u081A\u0824\u0828',
134
+ '\u082E-\u082F\u0830-\u083E\u083F\u0840-\u0858\u085C-\u085D\u085E',
135
+ '\u085F-\u089F\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB37\uFB38-\uFB3C',
136
+ '\uFB3D\uFB3E\uFB3F\uFB40-\uFB41\uFB42\uFB43-\uFB44\uFB45\uFB46-\uFB4F',
137
+ '\u0608\u060B\u060D\u061B\u061C\u061D\u061E-\u061F\u0620-\u063F\u0640',
138
+ '\u0641-\u064A\u066D\u066E-\u066F\u0671-\u06D3\u06D4\u06D5\u06E5-\u06E6',
139
+ '\u06EE-\u06EF\u06FA-\u06FC\u06FD-\u06FE\u06FF\u0700-\u070D\u070E\u070F',
140
+ '\u0710\u0712-\u072F\u074B-\u074C\u074D-\u07A5\u07B1\u07B2-\u07BF',
141
+ '\u08A0-\u08B2\u08B3-\u08E3\uFB50-\uFBB1\uFBB2-\uFBC1\uFBC2-\uFBD2',
142
+ '\uFBD3-\uFD3D\uFD40-\uFD4F\uFD50-\uFD8F\uFD90-\uFD91\uFD92-\uFDC7',
143
+ '\uFDC8-\uFDCF\uFDF0-\uFDFB\uFDFC\uFDFE-\uFDFF\uFE70-\uFE74\uFE75',
144
+ '\uFE76-\uFEFC\uFEFD-\uFEFE',
145
+ ].join.freeze
146
+
147
+ STRONG_AL_CHAR_RANGES = [
148
+ '\u0608\u060B\u060D\u061B\u061C\u061D\u061E-\u061F\u0620-\u063F\u0640',
149
+ '\u0641-\u064A\u066D\u066E-\u066F\u0671-\u06D3\u06D4\u06D5\u06E5-\u06E6',
150
+ '\u06EE-\u06EF\u06FA-\u06FC\u06FD-\u06FE\u06FF\u0700-\u070D\u070E\u070F',
151
+ '\u0710\u0712-\u072F\u074B-\u074C\u074D-\u07A5\u07B1\u07B2-\u07BF',
152
+ '\u08A0-\u08B2\u08B3-\u08E3\uFB50-\uFBB1\uFBB2-\uFBC1\uFBC2-\uFBD2',
153
+ '\uFBD3-\uFD3D\uFD40-\uFD4F\uFD50-\uFD8F\uFD90-\uFD91\uFD92-\uFDC7',
154
+ '\uFDC8-\uFDCF\uFDF0-\uFDFB\uFDFC\uFDFE-\uFDFF\uFE70-\uFE74\uFE75',
155
+ '\uFE76-\uFEFC\uFEFD-\uFEFE',
156
+ ].join.freeze
157
+
158
+ RTL_MATCHER = /[#{STRONG_RTL_CHAR_RANGES}#{STRONG_AL_CHAR_RANGES}]/.freeze
159
+ STRONG_MATCHER = /[#{STRONG_LTR_CHAR_RANGES}#{STRONG_RTL_CHAR_RANGES}#{STRONG_AL_CHAR_RANGES}]/.freeze
160
+
161
+ attr_reader :default_dir, :last_dir
162
+
163
+ def initialize(initial_dir = LTR)
164
+ @default_dir = initial_dir
165
+ self.reset
166
+ end
167
+
168
+ def update(text)
169
+ return last_dir if text.empty?
170
+
171
+ block_dir = strong_char_dir(text)
172
+ @last_dir = block_dir.nil? ? last_dir : block_dir
173
+ end
174
+
175
+ def reset
176
+ @last_dir = default_dir
177
+ end
178
+
179
+ def rtl?
180
+ @last_dir == RTL
181
+ end
182
+
183
+ private
184
+
185
+ def strong_char_dir(text)
186
+ char = first_strong_char(text)
187
+ return if char.nil?
188
+
189
+ RTL_MATCHER.match?(char) ? RTL : LTR
190
+ end
191
+
192
+ def first_strong_char(text)
193
+ match = STRONG_MATCHER.match(text)
194
+ match && match[0]
195
+ end
196
+ end
197
+ end
@@ -54,9 +54,14 @@ module DraftjsHtml
54
54
  while current.pending_entities.any?
55
55
  pending_entity = current.pending_entities.pop
56
56
  range = pending_entity[:start]..current_character_offset
57
- user_created_entity = conversion.call(pending_entity[:tagname], current_text_buffer[range], pending_entity[:attrs])
57
+ content = current_text_buffer[range]
58
+ user_created_entity = conversion.call(pending_entity[:tagname], content, pending_entity[:attrs])
58
59
  next unless user_created_entity
59
60
 
61
+ if content == '' && !user_created_entity[:atomic]
62
+ current.text_buffer << ' '
63
+ range = range.begin..(range.end+1)
64
+ end
60
65
  current.entities << user_created_entity.merge(start: range.begin, finish: range.end)
61
66
  end
62
67
  end
@@ -39,7 +39,7 @@ module DraftjsHtml
39
39
  def flush_to(draftjs, styles)
40
40
  if text_buffer.any?
41
41
  chars.join.lines.each do |line|
42
- draftjs.typed_block(block_name, line.strip, depth: [depth, 0].max)
42
+ draftjs.typed_block(block_name, line.chomp, depth: [depth, 0].max)
43
43
  end
44
44
 
45
45
  styles.each do |descriptor|
@@ -57,10 +57,7 @@ module DraftjsHtml
57
57
  range = entity[:start]..entity[:finish]
58
58
  if entity[:atomic]
59
59
  draftjs.typed_block('atomic', ' ', depth: [depth, 0].max)
60
- range = 0..1
61
- elsif range.size < 1
62
- draftjs.typed_block('atomic', ' ', depth: [depth, 0].max) unless draftjs.has_blocks?
63
- range = (range.begin..range.end + 1)
60
+ range = 0..0
64
61
  end
65
62
 
66
63
  draftjs.apply_entity entity[:type], range, data: entity[:data], mutability: entity.fetch(:mutability, 'IMMUTABLE')
@@ -44,7 +44,7 @@ module DraftjsHtml
44
44
 
45
45
  ENTITY_CONVERSION_MAP = {
46
46
  'LINK' => ->(entity, content, *) {
47
- attributes = entity.data.slice('url', 'rel', 'target', 'title', 'className').each_with_object({}) do |(attr, value), h|
47
+ attributes = entity.data.slice('url', 'href', 'rel', 'target', 'title', 'className').each_with_object({}) do |(attr, value), h|
48
48
  h[ENTITY_ATTRIBUTE_NAME_MAP.fetch(attr, attr)] = value
49
49
  end
50
50
 
@@ -2,13 +2,13 @@ require_relative 'node'
2
2
  require_relative 'html_depth'
3
3
  require_relative 'html_defaults'
4
4
  require_relative 'overrideable_map'
5
- require_relative 'unicode_rtl_detector'
6
5
 
7
6
  module DraftjsHtml
8
7
  class ToHtml
9
8
  def initialize(options)
10
9
  @options = ensure_options!(options)
11
10
  @document = Nokogiri::HTML::Builder.new(encoding: @options.fetch(:encoding, 'UTF-8'))
11
+ @current_bidi_direction = CurrentBidiDirection.new
12
12
  end
13
13
 
14
14
  def convert(raw_draftjs)
@@ -56,7 +56,8 @@ module DraftjsHtml
56
56
 
57
57
  def append_child(nokogiri, child)
58
58
  new_node = DraftjsHtml::Node.of(child).to_nokogiri(@document.doc)
59
- nokogiri.parent['dir'] = 'rtl' if UnicodeRtlDetector.new.contains_rtl?(new_node.inner_text)
59
+ @current_bidi_direction.update(new_node.inner_text)
60
+ nokogiri.parent['dir'] = 'rtl' if @current_bidi_direction.rtl?
60
61
  nokogiri.parent.add_child(new_node)
61
62
  end
62
63
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DraftjsHtml
4
- VERSION = "0.15.0"
4
+ VERSION = "0.17.0"
5
5
  end
data/lib/draftjs_html.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative "draftjs_html/version"
4
4
  require 'nokogiri'
5
5
  require_relative 'draftjs_html/draftjs'
6
+ require_relative 'draftjs_html/current_bidi_direction'
6
7
  require_relative 'draftjs_html/to_html'
7
8
  require_relative 'draftjs_html/from_html'
8
9
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: draftjs_html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TJ Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-03 00:00:00.000000000 Z
11
+ date: 2022-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -57,6 +57,7 @@ files:
57
57
  - bin/setup
58
58
  - draftjs_html.gemspec
59
59
  - lib/draftjs_html.rb
60
+ - lib/draftjs_html/current_bidi_direction.rb
60
61
  - lib/draftjs_html/draftjs.rb
61
62
  - lib/draftjs_html/draftjs/applicable_range.rb
62
63
  - lib/draftjs_html/draftjs/block.rb
@@ -76,7 +77,6 @@ files:
76
77
  - lib/draftjs_html/node.rb
77
78
  - lib/draftjs_html/overrideable_map.rb
78
79
  - lib/draftjs_html/to_html.rb
79
- - lib/draftjs_html/unicode_rtl_detector.rb
80
80
  - lib/draftjs_html/version.rb
81
81
  homepage: https://github.com/dugancathal/draftjs_html
82
82
  licenses:
@@ -1,27 +0,0 @@
1
- module DraftjsHtml
2
- class UnicodeRtlDetector
3
- # This regex was copied from fbjs's UnicodeBidi detection
4
- # See https://github.com/facebook/fbjs/blob/main/packages/fbjs/src/unicode/UnicodeBidi.js.
5
- STRONG_RTL_CHAR_RANGES = [
6
- '\u0590\u05BE\u05C0\u05C3\u05C6\u05C8-\u05CF\u05D0-\u05EA\u05EB-\u05EF',
7
- '\u05F0-\u05F2\u05F3-\u05F4\u05F5-\u05FF\u07C0-\u07C9\u07CA-\u07EA',
8
- '\u07F4-\u07F5\u07FA\u07FB-\u07FF\u0800-\u0815\u081A\u0824\u0828',
9
- '\u082E-\u082F\u0830-\u083E\u083F\u0840-\u0858\u085C-\u085D\u085E',
10
- '\u085F-\u089F\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB37\uFB38-\uFB3C',
11
- '\uFB3D\uFB3E\uFB3F\uFB40-\uFB41\uFB42\uFB43-\uFB44\uFB45\uFB46-\uFB4F',
12
- '\u0608\u060B\u060D\u061B\u061C\u061D\u061E-\u061F\u0620-\u063F\u0640',
13
- '\u0641-\u064A\u066D\u066E-\u066F\u0671-\u06D3\u06D4\u06D5\u06E5-\u06E6',
14
- '\u06EE-\u06EF\u06FA-\u06FC\u06FD-\u06FE\u06FF\u0700-\u070D\u070E\u070F',
15
- '\u0710\u0712-\u072F\u074B-\u074C\u074D-\u07A5\u07B1\u07B2-\u07BF',
16
- '\u08A0-\u08B2\u08B3-\u08E3\uFB50-\uFBB1\uFBB2-\uFBC1\uFBC2-\uFBD2',
17
- '\uFBD3-\uFD3D\uFD40-\uFD4F\uFD50-\uFD8F\uFD90-\uFD91\uFD92-\uFDC7',
18
- '\uFDC8-\uFDCF\uFDF0-\uFDFB\uFDFC\uFDFE-\uFDFF\uFE70-\uFE74\uFE75',
19
- '\uFE76-\uFEFC\uFEFD-\uFEFE',
20
- ].join.freeze
21
- RTL_MATCHER = /[#{STRONG_RTL_CHAR_RANGES}]/
22
-
23
- def contains_rtl?(text)
24
- RTL_MATCHER.match?(text)
25
- end
26
- end
27
- end