annotate .cms/lib/codemirror/src/util/bidi.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 import { lst } from "./misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 // BIDI HELPERS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 export function iterateBidiSections(order, from, to, f) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 if (!order) return f(from, to, "ltr", 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 let found = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 for (let i = 0; i < order.length; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 let part = order[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 if (part.from < to && part.to > from || from == to && part.to == from) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 found = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 if (!found) f(from, to, "ltr")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 export let bidiOther = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 export function getBidiPartAt(order, ch, sticky) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 let found
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 bidiOther = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 for (let i = 0; i < order.length; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 let cur = order[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 if (cur.from < ch && cur.to > ch) return i
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 if (cur.to == ch) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 if (cur.from != cur.to && sticky == "before") found = i
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 else bidiOther = i
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 if (cur.from == ch) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 if (cur.from != cur.to && sticky != "before") found = i
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 else bidiOther = i
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 return found != null ? found : bidiOther
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 // Bidirectional ordering algorithm
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 // that this (partially) implements.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 // One-char codes used for character types:
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 // L (L): Left-to-Right
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 // R (R): Right-to-Left
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 // r (AL): Right-to-Left Arabic
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 // 1 (EN): European Number
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 // + (ES): European Number Separator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 // % (ET): European Number Terminator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 // n (AN): Arabic Number
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 // , (CS): Common Number Separator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 // m (NSM): Non-Spacing Mark
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 // b (BN): Boundary Neutral
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 // s (B): Paragraph Separator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 // t (S): Segment Separator
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 // w (WS): Whitespace
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 // N (ON): Other Neutrals
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 // Returns null if characters are ordered as they appear
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 // (left-to-right), or an array of sections ({from, to, level}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 // objects) in the order in which they occur visually.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 let bidiOrdering = (function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 // Character types for codepoints 0 to 0xff
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 let lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 // Character types for codepoints 0x600 to 0x6f9
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 let arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 function charType(code) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 if (code <= 0xf7) return lowTypes.charAt(code)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 else if (0x590 <= code && code <= 0x5f4) return "R"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 else if (0x600 <= code && code <= 0x6f9) return arabicTypes.charAt(code - 0x600)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 else if (0x6ee <= code && code <= 0x8ac) return "r"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 else if (0x2000 <= code && code <= 0x200b) return "w"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 else if (code == 0x200c) return "b"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 else return "L"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 let bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 let isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 function BidiSpan(level, from, to) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 this.level = level
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 this.from = from; this.to = to
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 return function(str, direction) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 let outerType = direction == "ltr" ? "L" : "R"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 let len = str.length, types = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 for (let i = 0; i < len; ++i)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 types.push(charType(str.charCodeAt(i)))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 // W1. Examine each non-spacing mark (NSM) in the level run, and
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 // change the type of the NSM to the type of the previous
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 // character. If the NSM is at the start of the level run, it will
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 // get the type of sor.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 for (let i = 0, prev = outerType; i < len; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 let type = types[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 if (type == "m") types[i] = prev
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 else prev = type
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 // W2. Search backwards from each instance of a European number
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 // until the first strong type (R, L, AL, or sor) is found. If an
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 // AL is found, change the type of the European number to Arabic
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 // number.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 // W3. Change all ALs to R.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 for (let i = 0, cur = outerType; i < len; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 let type = types[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 if (type == "1" && cur == "r") types[i] = "n"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R" }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 // W4. A single European separator between two European numbers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 // changes to a European number. A single common separator between
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 // two numbers of the same type changes to that type.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 for (let i = 1, prev = types[0]; i < len - 1; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 let type = types[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 else if (type == "," && prev == types[i+1] &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 (prev == "1" || prev == "n")) types[i] = prev
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 prev = type
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 // W5. A sequence of European terminators adjacent to European
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 // numbers changes to all European numbers.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 // W6. Otherwise, separators and terminators change to Other
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 // Neutral.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 for (let i = 0; i < len; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 let type = types[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 if (type == ",") types[i] = "N"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 else if (type == "%") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 let end
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 for (end = i + 1; end < len && types[end] == "%"; ++end) {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 let replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 for (let j = i; j < end; ++j) types[j] = replace
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 i = end - 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 // W7. Search backwards from each instance of a European number
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 // until the first strong type (R, L, or sor) is found. If an L is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 // found, then change the type of the European number to L.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 for (let i = 0, cur = outerType; i < len; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 let type = types[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 if (cur == "L" && type == "1") types[i] = "L"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 else if (isStrong.test(type)) cur = type
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 // N1. A sequence of neutrals takes the direction of the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 // surrounding strong text if the text on both sides has the same
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 // direction. European and Arabic numbers act as if they were R in
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 // terms of their influence on neutrals. Start-of-level-run (sor)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 // and end-of-level-run (eor) are used at level run boundaries.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 // N2. Any remaining neutrals take the embedding direction.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 for (let i = 0; i < len; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 if (isNeutral.test(types[i])) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 let end
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 for (end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 let before = (i ? types[i-1] : outerType) == "L"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 let after = (end < len ? types[end] : outerType) == "L"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 let replace = before == after ? (before ? "L" : "R") : outerType
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 for (let j = i; j < end; ++j) types[j] = replace
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 i = end - 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 // Here we depart from the documented algorithm, in order to avoid
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 // building up an actual levels array. Since there are only three
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 // levels (0, 1, 2) in an implementation that doesn't take
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 // explicit embedding into account, we can build up the order on
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 // the fly, without following the level-based algorithm.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 let order = [], m
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 for (let i = 0; i < len;) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 if (countsAsLeft.test(types[i])) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 let start = i
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 order.push(new BidiSpan(0, start, i))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 let pos = i, at = order.length, isRTL = direction == "rtl" ? 1 : 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 for (++i; i < len && types[i] != "L"; ++i) {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 for (let j = pos; j < i;) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 if (countsAsNum.test(types[j])) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 if (pos < j) { order.splice(at, 0, new BidiSpan(1, pos, j)); at += isRTL }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 let nstart = j
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 order.splice(at, 0, new BidiSpan(2, nstart, j))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 at += isRTL
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 pos = j
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 } else ++j
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 if (direction == "ltr") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 if (order[0].level == 1 && (m = str.match(/^\s+/))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 order[0].from = m[0].length
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 order.unshift(new BidiSpan(0, 0, m[0].length))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 lst(order).to -= m[0].length
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 order.push(new BidiSpan(0, len - m[0].length, len))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 return direction == "rtl" ? order.reverse() : order
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 })()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 // Get the bidi ordering for the given line (and cache it). Returns
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 // false for lines that are fully left-to-right, and an array of
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 // BidiSpan objects otherwise.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 export function getOrder(line, direction) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 let order = line.order
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 if (order == null) order = line.order = bidiOrdering(line.text, direction)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 return order
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 }