{"record":{"id":"56a27ef75856b68d","repo":"iOfficeAI/OfficeCLI","slug":"invalid-page-value-pagefilter-expected-n-or","errorCode":null,"errorMessage":"Invalid --page value '{pageFilter}': expected N or M-N or comma list.","messagePattern":"Invalid --page value '(.+?)': expected N or M-N or comma list\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/CommandBuilder.View.cs","lineNumber":766,"sourceCode":"            .Resolve(formatId, OfficeCli.Core.Rendering.RenderOutputKind.Png, options.Mode);\n        if (renderer == null) return null;\n        return renderer.Render(\n            new OfficeCli.Handlers.Rendering.HandlerRenderInput(handler, formatId), options).Bytes;\n    }\n\n    private static (int? start, int? end) ParsePptHtmlPage(\n        string? pageFilter, int? start, int? end,\n        OfficeCli.Handlers.PowerPointHandler pptHandler)\n    {\n        if (string.IsNullOrEmpty(pageFilter)) return (start, end);\n        var slideCount = pptHandler.Query(\"slide\").Count;\n        var firstTok = pageFilter.Split(',')[0].Trim();\n        // Range form \"M-N\"\n        if (firstTok.Contains('-'))\n        {\n            var parts = firstTok.Split('-', 2);\n            if (!int.TryParse(parts[0], out var ps) || !int.TryParse(parts[1], out var pe))\n                throw new ArgumentException($\"Invalid --page value '{pageFilter}': expected N or M-N or comma list.\");\n            if (ps <= 0 || pe <= 0)\n                throw new ArgumentException($\"Invalid --page value '{pageFilter}': slide number must be >= 1.\");\n            if (ps > slideCount)\n                throw new ArgumentException($\"--page {ps} out of range (total slides: {slideCount}).\");\n            return (ps, Math.Min(pe, slideCount));\n        }\n        if (!int.TryParse(firstTok, out var p))\n            throw new ArgumentException($\"Invalid --page value '{pageFilter}': expected a positive slide number.\");\n        if (p <= 0)\n            throw new ArgumentException($\"Invalid --page value '{pageFilter}': slide number must be >= 1.\");\n        if (p > slideCount)\n            throw new ArgumentException($\"--page {p} out of range (total slides: {slideCount}).\");\n        return (p, p);\n    }\n}\n","sourceCodeStart":748,"sourceCodeEnd":782,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/CommandBuilder.View.cs#L748-L782","documentation":"ParsePptHtmlPage handles the range form 'M-N' for pptx html previews. It splits on '-' into two tokens; if either token fails int.TryParse, an ArgumentException is thrown (no Code). This is the html-mode counterpart to the SVG page parser — accepts N, M-N, and comma lists, but a non-numeric bound in a range is rejected.","triggerScenarios":"`view --mode html --page a-3 deck.pptx`, `--page 1-b`, `--page x-y`, `--page 1-` (trailing dash → empty second token). Html mode, pptx handler, range form with a non-integer bound.","commonSituations":"Typo in a range bound; pasting a slide-title instead of a number; a dangling dash from string concatenation; using 'last' as a bound.","solutions":["Use integer bounds in the range, e.g. --page 1-3","For a single slide use --page 2 (no dash)","For a comma list ensure every token is an integer or integer range"],"exampleFix":"// before\nofficecli view --mode html --page 1-end deck.pptx\n// after\nofficecli view --mode html --page 1-3 deck.pptx","handlingStrategy":"validation","validationCode":"// Validate a range-form --page bound for pptx html mode.\nstatic bool IsValidPageSpec(string? pageFilter)\n{\n    if (string.IsNullOrEmpty(pageFilter)) return true;\n    foreach (var tok in pageFilter.Split(','))\n    {\n        var t = tok.Trim();\n        if (t.Contains('-'))\n        {\n            var parts = t.Split('-', 2);\n            if (!int.TryParse(parts[0], out _) || !int.TryParse(parts[1], out _)) return false;\n        }\n        else if (!int.TryParse(t, out _)) return false;\n    }\n    return true;\n}\nif (!IsValidPageSpec(pageFilter))\n{\n    // reject before invoking\n}","typeGuard":"bool IsValidPptxPageToken(string? pageFilter)\n{\n    if (string.IsNullOrEmpty(pageFilter)) return true;\n    var firstTok = pageFilter.Split(',')[0].Trim();\n    if (firstTok.Contains('-'))\n    {\n        var parts = firstTok.Split('-', 2);\n        return int.TryParse(parts[0], out _) && int.TryParse(parts[1], out _);\n    }\n    return int.TryParse(firstTok, out _);\n}","tryCatchPattern":"try\n{\n    // invoke view --mode html --page X-Y deck.pptx\n}\ncatch (System.ArgumentException ex) when (ex.Message.Contains(\"expected N or M-N or comma list\"))\n{\n    // a range bound was non-numeric; reprompt for integer bounds\n}","preventionTips":["Use integer bounds in ranges (e.g. --page 1-3)","Validate page tokens with IsValidPptxPageToken before invoking","For a single slide omit the dash"],"tags":["page-validation","powerpoint","html","range","validation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}