397777089e
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 lines
1.2 KiB
JavaScript
22 lines
1.2 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* negotiation-section — парсер раздела «## Переговоры» план-файла. Возвращает круги
|
||
* [{round, position}] с ДОСЛОВНЫМ текстом позиции контроллера (для наставника и арбитража).
|
||
* Раздел = «## Переговоры» до следующего «## », внутри — «### Круг N» блоки.
|
||
*/
|
||
export function parseNegotiationSection(md) {
|
||
const text = typeof md === 'string' ? md : '';
|
||
// БЕЗ флага m: `$` = конец ТЕКСТА (не строки), иначе нежадный захват обрывается на 1-й строке.
|
||
// Заголовки матчим через (?:^|\n), терминатор — следующий «\n## » или конец текста.
|
||
const sec = text.match(/(?:^|\n)##\s*Переговоры[^\n]*\n([\s\S]*?)(?=\n##\s|$)/i);
|
||
if (!sec) return [];
|
||
const body = sec[1];
|
||
const out = [];
|
||
const re = /(?:^|\n)###\s*Круг\s*(\d+)[^\n]*\n([\s\S]*?)(?=\n###\s|$)/gi;
|
||
let m;
|
||
while ((m = re.exec(body)) !== null) {
|
||
out.push({ round: Number(m[1]), position: m[2].trim() });
|
||
}
|
||
return out;
|
||
}
|