コードブロックを解析するやつ
Scrapboxの記法で書かれたコードブロックを解析するプログラム
前行がコードブロックに属しておりインデントが開始行より深ければ、それはコードブロックという原理に基づき構築している
コードブロック宣言はインデントを除く行頭に存在しないといけない
code:parsecode.ts
export function parseCode(lines: string[]) {
const files: Record<string, string[]> = {};
const parsed = [];
let codeIndent = Number.POSITIVE_INFINITY;
コードブロックの外にいるのを表すのに一番大きい値である無限大を使っておく
code:parsecode.ts
let code: string[] = [];
for (const line of lines) {
const text = line.trimStart();
const indent = line.length - text.length;
if (codeIndent !== Number.POSITIVE_INFINITY) {
if (codeIndent < indent) {
const codeLine = line.slice(codeIndent + 1);
code.push(codeLine);
parsed.push({
code: true,
indent: codeIndent + 1,
text: codeLine,
});
continue;
} else {
codeIndent = Number.POSITIVE_INFINITY;
}
}
if (text.startsWith("code:")) {
codeIndent = indent;
const name = text.slice(5);
}
コードブロックを発見するとfilesに格納する
全体的に楽をするために大域に直接中身を置いてるけどちょっと分かりにくいかもしれない
code:parsecode.ts
parsed.push({
code: false,
indent,
text,
});
}
return {
parsed,
files,
};
}