mirror of
https://github.com/Horizontal42/summarum.git
synced 2026-11-10 15:42:01 +03:00
"time in Europe/Berlin" dropped the second word
Two independent traps. The noise filter only keeps word tokens right
after a conversion token (in/as/...); any other token type resets
that, so the "/" in a slash-form IANA id ("Europe/Berlin") reset it
before the parser ever saw "Berlin". The word-collecting loop in
parseTarget() had the same blind spot even once the token was there.
Both needed the same exception, or "Europe/Berlin" still degrades to
just "Europe".
This commit is contained in:
parent
ef6244dc84
commit
a9aaff5490
2 changed files with 21 additions and 2 deletions
|
|
@ -232,4 +232,7 @@ describe("review fixes", () => {
|
|||
expect(calc("123456 in scientific")).toBe("1.23e5");
|
||||
expect(calc("123456 in exponent")).toBe("1.23e5");
|
||||
});
|
||||
it("timezone names with a slash resolve as IANA ids", () => {
|
||||
expect(calc("time in Europe/Berlin")).toMatch(/^\d{2}:\d{2}$/);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -72,6 +72,12 @@ export function parseLine(tokens: Token[], knownVars: Set<string>, line: string)
|
|||
if (knownVars.has(tk.raw) || afterConv) filtered.push(tk);
|
||||
continue;
|
||||
}
|
||||
// a bare "/" inside a timezone name ("Europe/Berlin") must not break the
|
||||
// word-keeping chain, otherwise the second half gets filtered as noise
|
||||
if (afterConv && tk.t === "op" && tk.op === "div") {
|
||||
filtered.push(tk);
|
||||
continue;
|
||||
}
|
||||
afterConv = tk.t === "conv";
|
||||
filtered.push(tk);
|
||||
}
|
||||
|
|
@ -256,8 +262,18 @@ class Parser {
|
|||
}
|
||||
if (tk.t === "word") {
|
||||
const words: string[] = [];
|
||||
while (this.peek()?.t === "word" && words.length < 4) {
|
||||
words.push((this.next() as Token & { raw: string }).raw);
|
||||
for (;;) {
|
||||
const w = this.peek();
|
||||
if (w?.t === "word" && words.length < 4) {
|
||||
words.push((this.next() as Token & { raw: string }).raw);
|
||||
continue;
|
||||
}
|
||||
// "Europe/Berlin": a slash between timezone words is part of the name
|
||||
if (w?.t === "op" && w.op === "div" && words.length > 0 && this.toks[this.i + 1]?.t === "word") {
|
||||
this.next();
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (words.length > 0) return { type: "tz", words };
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue