~james/core

core/web/src/lib/markup/collapse.ts -rw-r--r-- 566 bytes
452f17b7 — james chore(import): snapshot james.dad.town/core at f70c71c7696a 15 hours ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
export const COLLAPSED_LINES = 28;

const PRE = /<pre(?:\s[^>]*)?>(?:(?!<pre[\s>])[\s\S])*?<\/pre>/g;

const MERMAID = /^<pre\s[^>]*\bclass="mermaid"/;

const lineCount = (pre: string): number =>
	pre
		.replace(/<[^>]*>/g, "")
		.replace(/\n$/, "")
		.split("\n").length;

export const collapseCodeblocks = (html: string): string =>
	html.replace(PRE, (pre) => {
		if (MERMAID.test(pre)) return pre;
		const lines = lineCount(pre);
		return lines < COLLAPSED_LINES
			? pre
			: `<div data-codeblock="${lines}"><div data-codeblock-toolbar></div>${pre}</div>`;
	});