-
Notifications
You must be signed in to change notification settings - Fork 1
/
textPacker.js
39 lines (37 loc) · 1.1 KB
/
textPacker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const HTMLClass = new Map([
['INIT', 'tag'],
['TEXT', '-TEXT'],
['SYMBOL', '-SYMBOL'],
['CURSOR', '-CURSOR'],
['SELECT', '-SELECT'],
]);
function getHTMLClass(type) {
return HTMLClass.get(type) || '';
}
function toHTML(str) {
return (
str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
);
}
function mkSpanStr(textMark, classList=[]) {
let inner = textMark.view;
let classString = `class="${classList.join(' ')}"`;
let data = (`data-start="${textMark.startOffset}" ` +
`data-end="${textMark.startOffset + textMark.raw.length}" ` +
`data-scale="${inner.length / textMark.raw.length}"` +
`data-content="${toHTML(inner.replace('\n', '\\n'))}"`);
return `<span ${classString} ${data}>${toHTML(inner)}</span>`;
}
function* spanStringGenerator(textMarkGenerator) {
for (let textMark of textMarkGenerator) {
let classList = [
getHTMLClass('INIT'),
getHTMLClass(textMark.isSymbol ? 'SYMBOL' : 'TEXT')
].concat(textMark.markList);
yield mkSpanStr(textMark, classList);
}
}