Files
brain/tools/secretary-trunkdiff.mjs
T

19 lines
1.1 KiB
JavaScript

// tools/secretary-trunkdiff.mjs
// Детерминированный дифф ствола (роль хука: до/после редактора).
const SECS = [['decisions', 'РЕШЕНИЕ'], ['will', 'ВОЛЯ'], ['open', 'ОТКРЫТЫЙ'], ['consequences', 'ПОСЛЕДСТВИЕ'], ['alternatives', 'АЛЬТЕРНАТИВА'], ['doneNext', 'СДЕЛАНО']];
const nz = (s) => String(s || '').trim().toLowerCase().replace(/\s+/g, ' ');
export function diffTrunk(oldP, newP) {
const lines = [];
for (const [sec, label] of SECS) {
const o = new Map(((oldP[sec]) || []).map((e) => [nz(e.text), e]));
for (const e of (newP[sec]) || []) {
const prev = o.get(nz(e.text));
if (!prev) lines.push(`${label} добавлен: «${e.text}${e.why ? ' — ' + e.why : ''}»`);
else if (!prev.struck && e.struck) lines.push(`${label} зачёркнут (закрыт ствол): «${e.text}»`);
else if (prev.struck && !e.struck) lines.push(`${label} расчёркнут (снова актуален): «${e.text}»`);
}
}
return lines.length ? lines.join('\n') : '(ствол не двигался этот ход)';
}