19 lines
1.1 KiB
JavaScript
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') : '(ствол не двигался этот ход)';
|
|
}
|