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; } } |