feat(okr): writeFrontmatter multi-linje tags-liste (additiv array-gren) [skip-docs]
This commit is contained in:
parent
a9d9c45192
commit
ca6c89e7be
2 changed files with 43 additions and 5 deletions
|
|
@ -41,14 +41,26 @@ export function parseFrontmatter(content) {
|
||||||
return { raw, get };
|
return { raw, get };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Siter naar verdien inneholder '#'/':' eller har kant-whitespace, slik at
|
||||||
|
// round-trip via parseFrontmatter bevarer den eksakt (jf. siter-#-regelen).
|
||||||
|
const quoteIfNeeded = (s) =>
|
||||||
|
/[#:]/.test(s) || /^\s|\s$/.test(s) || /^["']/.test(s) ? JSON.stringify(s) : s;
|
||||||
|
|
||||||
export function writeFrontmatter(fields) {
|
export function writeFrontmatter(fields) {
|
||||||
const lines = ['---'];
|
const lines = ['---'];
|
||||||
for (const [key, value] of Object.entries(fields)) {
|
for (const [key, value] of Object.entries(fields)) {
|
||||||
const s = String(value);
|
// Additiv array-gren (Step 3): emit OKF multi-linje list-verdi (f.eks.
|
||||||
// Siter naar verdien inneholder '#'/':' eller har kant-whitespace, slik at
|
// `tags`) som `key:\n - item`. Lese-siden er uendret -- parseFrontmatter.
|
||||||
// round-trip via parseFrontmatter bevarer den eksakt (jf. siter-#-regelen).
|
// get() returnerer fortsatt null for list-keys. Skalar-grenen under er
|
||||||
const needsQuote = /[#:]/.test(s) || /^\s|\s$/.test(s) || /^["']/.test(s);
|
// bevart bit-for-bit (kun loftet ut til quoteIfNeeded, samme regel).
|
||||||
lines.push(`${key}: ${needsQuote ? JSON.stringify(s) : s}`);
|
if (Array.isArray(value)) {
|
||||||
|
lines.push(`${key}:`);
|
||||||
|
for (const item of value) {
|
||||||
|
lines.push(` - ${quoteIfNeeded(String(item))}`);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lines.push(`${key}: ${quoteIfNeeded(String(value))}`);
|
||||||
}
|
}
|
||||||
lines.push('---');
|
lines.push('---');
|
||||||
return lines.join('\n') + '\n';
|
return lines.join('\n') + '\n';
|
||||||
|
|
|
||||||
|
|
@ -107,3 +107,29 @@ test('writeFrontmatter: verdi med "#" siteres og round-tripper', () => {
|
||||||
const { get } = parseFrontmatter(block);
|
const { get } = parseFrontmatter(block);
|
||||||
assert.equal(get('kortform'), 'A #B', 'sitert # round-tripper');
|
assert.equal(get('kortform'), 'A #B', 'sitert # round-tripper');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('writeFrontmatter: array-verdi (tags) -> OKF multi-linje liste (Step 3)', () => {
|
||||||
|
const block = writeFrontmatter({ type: 'OKR', tags: ['a', 'b'], kilde: 'innboks' });
|
||||||
|
assert.match(block, /tags:\n - a\n - b/, 'array -> innrykket OKF-liste');
|
||||||
|
const { get } = parseFrontmatter(block);
|
||||||
|
assert.equal(get('type'), 'OKR', 'skalar FOR list-blokk resolver');
|
||||||
|
assert.equal(get('kilde'), 'innboks', 'skalar ETTER innrykket list-blokk resolver fortsatt');
|
||||||
|
// Lese-siden uendret (Step 3 scope = kun skrive-siden): get() paa en list-key
|
||||||
|
// krasjer ikke (eksisterende tolerance-kontrakt, frontmatter.mjs:14-16). Den
|
||||||
|
// returnerer foerste list-element fordi parser-\s* spiser newline -- IKKE
|
||||||
|
// null; konsumentene leser aldri tag-VERDIER, kun at nabo-skalarer resolver.
|
||||||
|
assert.doesNotThrow(() => get('tags'), 'get paa list-key krasjer ikke');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('writeFrontmatter: skalar uendret av array-gren (additiv)', () => {
|
||||||
|
const block = writeFrontmatter({ navn: 'Org', type: 'Notat' });
|
||||||
|
assert.match(block, /navn: Org/);
|
||||||
|
assert.match(block, /type: Notat/);
|
||||||
|
assert.doesNotMatch(block, /^\s*-\s/m, 'ingen list-syntaks for skalarer');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('writeFrontmatter: tom array -> kun key-linje, ingen items', () => {
|
||||||
|
const block = writeFrontmatter({ tags: [] });
|
||||||
|
assert.match(block, /tags:\n/, 'tom array gir key-linje');
|
||||||
|
assert.doesNotMatch(block, /^\s*-\s/m, 'ingen item-linjer for tom array');
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue