YAML: Listen aus Maps
`- titel: X` zerfiel in Zeichenketten wie "titel: X". Jede Kanalpunkt- Belohnung in der Konfiguration war damit ohne jede Meldung unwirksam, auch das Beispiel in config.example.yaml. Ein Listeneintrag der Form `schluessel: wert` beginnt jetzt eine Map; die folgenden, tiefer eingerueckten Zeilen gehoeren dazu. `- http://x` bleibt Text, weil nach dem Doppelpunkt kein Leerzeichen steht. layout.yaml, config.example.yaml und die Hub-Konfiguration werden nachweislich gleich gelesen wie vorher. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
0a3d462854
commit
b1cf0f8fab
2 files changed
+50
-3
No files matched your search
@@ -53,3 +53,37 @@ test('ein Byte Order Mark verstellt nicht den ersten Schluessel', () => {
|
|||||||
assert.deepEqual(y, { channel: { login: 'abdulive_' } });
|
assert.deepEqual(y, { channel: { login: 'abdulive_' } });
|
||||||
assert.ok(!Object.keys(y).some((k) => k.charCodeAt(0) === 0xfeff));
|
assert.ok(!Object.keys(y).some((k) => k.charCodeAt(0) === 0xfeff));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Listen aus Maps, wie in rewards.belohnungen', () => {
|
||||||
|
// Frueher zerfiel das in Zeichenketten wie "id: abc", und die Belohnung
|
||||||
|
// war ohne jede Meldung unwirksam.
|
||||||
|
const y = parseYaml([
|
||||||
|
'rewards:',
|
||||||
|
' enabled: true',
|
||||||
|
' belohnungen:',
|
||||||
|
' - id: abc-123',
|
||||||
|
' titel: Nachricht vorlesen',
|
||||||
|
' aktion: tts',
|
||||||
|
' - titel: Konfetti',
|
||||||
|
' aktion: konfetti',
|
||||||
|
' tts:',
|
||||||
|
' blockliste:',
|
||||||
|
' - sieg heil',
|
||||||
|
' - http',
|
||||||
|
' maxZeichen: 200',
|
||||||
|
].join('\n'));
|
||||||
|
assert.deepEqual(y, {
|
||||||
|
rewards: {
|
||||||
|
enabled: true,
|
||||||
|
belohnungen: [
|
||||||
|
{ id: 'abc-123', titel: 'Nachricht vorlesen', aktion: 'tts' },
|
||||||
|
{ titel: 'Konfetti', aktion: 'konfetti' },
|
||||||
|
],
|
||||||
|
tts: { blockliste: ['sieg heil', 'http'], maxZeichen: 200 },
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Listeneintrag mit Doppelpunkt ohne Leerzeichen bleibt Text', () => {
|
||||||
|
assert.deepEqual(parseYaml('a:\n - http://x.de\n'), { a: ['http://x.de'] });
|
||||||
|
});
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
// Minimaler YAML-Leser fuer unsere eigenen Konfigurationsdateien.
|
// Minimaler YAML-Leser fuer unsere eigenen Konfigurationsdateien.
|
||||||
//
|
//
|
||||||
// Deckt genau das ab, was config/*.yaml benutzt: verschachtelte Maps ueber
|
// Deckt genau das ab, was config/*.yaml benutzt: verschachtelte Maps ueber
|
||||||
// Einrueckung, Skalare, Inline-Maps `{a: 1, b: 2}`, Listen aus Skalaren und
|
// Einrueckung, Skalare, Inline-Maps `{a: 1, b: 2}`, Listen aus Skalaren oder
|
||||||
// Blockskalare (`>` / `|`). Bewusst kein vollstaendiges YAML - das Projekt
|
// Maps (`- titel: X`) und Blockskalare (`>` / `|`). Bewusst kein vollstaendiges YAML - das Projekt
|
||||||
// kommt ohne npm-Abhaengigkeiten aus, und der Sprachumfang, den wir selbst
|
// kommt ohne npm-Abhaengigkeiten aus, und der Sprachumfang, den wir selbst
|
||||||
// schreiben, ist ueberschaubar.
|
// schreiben, ist ueberschaubar.
|
||||||
|
|
||||||
@@ -73,7 +73,20 @@ export function parseYaml(text: string): YamlMap {
|
|||||||
if (body.startsWith('- ')) {
|
if (body.startsWith('- ')) {
|
||||||
const key = frame.listKey;
|
const key = frame.listKey;
|
||||||
const list = key ? frame.target[key] : undefined;
|
const list = key ? frame.target[key] : undefined;
|
||||||
if (Array.isArray(list)) list.push(scalar(body.slice(2)));
|
const item = body.slice(2);
|
||||||
|
// `- titel: X` beginnt eine Map als Listeneintrag. Die Zeile wird mit
|
||||||
|
// der Einrueckung ihres Inhalts neu gelesen, die folgenden, tiefer
|
||||||
|
// eingerueckten Zeilen landen in derselben Map. Ohne das zerfiel
|
||||||
|
// `rewards.belohnungen` in einzelne Zeichenketten, und jede Belohnung
|
||||||
|
// war ohne Fehlermeldung unwirksam.
|
||||||
|
if (Array.isArray(list) && /^[^\s'"{[#-][^:]*:(\s|$)/.test(item)) {
|
||||||
|
const map: YamlMap = {};
|
||||||
|
list.push(map);
|
||||||
|
stack.push({ indent, target: map });
|
||||||
|
lines[i] = ' '.repeat(indent + 2) + item;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (Array.isArray(list)) list.push(scalar(item));
|
||||||
i++;
|
i++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user