All files / src/processors latexProcessor.ts

76.19% Statements 16/21
25% Branches 1/4
77.77% Functions 7/9
76.19% Lines 16/21

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