Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 5x 71x 71x 71x 71x 71x 71x 71x 142x 71x 71x 953x 3x 953x 71x 71x | export class LatexProcessor {
private singleLine = /\$(.*?)\$/g;
process(markdown: string) {
const withoutEscapedCharaters = this.markEscapedCharacters(markdown);
const processedMultiline = this.processMultiLine(withoutEscapedCharaters);
const multiWithoutEscapedCharaters = this.markEscapedCharacters(processedMultiline);
const processedSingleLine = this.processSingleLine(multiWithoutEscapedCharaters);
const finalResult = this.unmarkEscapedCharacters(processedSingleLine);
return finalResult;
}
private markEscapedCharacters(markdown: string) {
return (
markdown
//Escaped $ signs
.replaceAll('\\$', '~~d~~')
//Multiline in backticks
.replaceAll(/`\$\$/gm, '~~s~~')
.replaceAll(/\$\$`/gm, '~~e~~')
//Singleline in backticks
.replaceAll(/`\$/gm, '~~ss~~')
.replaceAll(/\$`/gm, '~~se~~')
);
}
private unmarkEscapedCharacters(markdown: string) {
return markdown
.replaceAll('~~d~~', '\\$')
.replaceAll('~~e~~', '$$$$`')
.replaceAll('~~s~~', '`$$$$')
.replaceAll('~~ss~~', '`$')
.replaceAll('~~se~~', '$$`');
}
private processSingleLine(markdown: string) {
return markdown
.split('\n')
.map(line => {
if (line.includes('$')) {
line = line.replaceAll(this.singleLine, '`$$$1$$`');
}
return line;
})
.join('\n');
}
private processMultiLine(markdown: string) {
Iif (markdown.includes('$$')) {
return markdown
.split('$$')
.map((line, index) => {
if (this.isOdd(index)) {
return line;
} else {
return '`' + line + '`';
}
})
.join('$$')
.slice(1, -1);
}
return markdown;
}
private isOdd(number: number) {
return number & 1;
}
}
|