Fix parsing of ambiguous date formats like Hm

We support having hours/minutes numbers with one or two digits for strings like "1:30:31" but
if the format is for example Hm, then "12" is really ambiguous.
So the idea is to match the longest string as possible.
This commit is contained in:
Calixte Denizet 2026-07-20 14:48:01 +02:00
parent 547236bcd5
commit d5661f801f
2 changed files with 14 additions and 1 deletions

View File

@ -602,7 +602,11 @@ class Util extends PDFObject {
function (match, patternElement) { function (match, patternElement) {
const { pattern, action } = handlers[patternElement]; const { pattern, action } = handlers[patternElement];
actions.push(action); actions.push(action);
return pattern; // If the format is "Hm", then /\d{1,2}\d{1,2}/ is ambiguous so we use
// a lookahead to ensure that we match the longest possible sequence.
return pattern.includes(",")
? `(?=${pattern})\\${actions.length}`
: pattern;
} }
); );

View File

@ -251,6 +251,15 @@ describe("Scripting", function () {
value = await myeval(`util.scand("mmddyyyy", "07a15b2007").toString()`); value = await myeval(`util.scand("mmddyyyy", "07a15b2007").toString()`);
expect(new Date(value)).toEqual(new Date("07/15/2007 12:00:00")); expect(new Date(value)).toEqual(new Date("07/15/2007 12:00:00"));
}); });
it("should handle a format with repeated specifiers", async () => {
const cFormat = "Hm".repeat(40);
const cDate = `${"1".repeat(84)}x`;
const value = await myeval(
`util.scand("${cFormat}", "${cDate}")?.toString() ?? "null"`
);
expect(value).toEqual("null");
});
}); });
describe("printf", function () { describe("printf", function () {