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.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.
|
||||
//
|
||||
// Deckt genau das ab, was config/*.yaml benutzt: verschachtelte Maps ueber
|
||||
// Einrueckung, Skalare, Inline-Maps `{a: 1, b: 2}`, Listen aus Skalaren und
|
||||
// Blockskalare (`>` / `|`). Bewusst kein vollstaendiges YAML - das Projekt
|
||||
// Einrueckung, Skalare, Inline-Maps `{a: 1, b: 2}`, Listen aus Skalaren oder
|
||||
// Maps (`- titel: X`) und Blockskalare (`>` / `|`). Bewusst kein vollstaendiges YAML - das Projekt
|
||||
// kommt ohne npm-Abhaengigkeiten aus, und der Sprachumfang, den wir selbst
|
||||
// schreiben, ist ueberschaubar.
|
||||
|
||||
@@ -73,7 +73,20 @@ export function parseYaml(text: string): YamlMap {
|
||||
if (body.startsWith('- ')) {
|
||||
const key = frame.listKey;
|
||||
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++;
|
||||
continue;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user