From bc1ffa88ed371a35ca4e3b3cfd93684dbcb7dfba Mon Sep 17 00:00:00 2001 From: "songtianyi.theo" Date: Thu, 9 Jul 2026 14:26:09 +0800 Subject: [PATCH] fix: allow longer svglide manifests --- shortcuts/slides/slides_create_svglide.go | 2 +- .../slides/slides_create_svglide_manifest.go | 11 +++--- .../slides/slides_create_svglide_test.go | 37 ++++++++++++++++++- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/shortcuts/slides/slides_create_svglide.go b/shortcuts/slides/slides_create_svglide.go index c1a6c9a09..1c9918e94 100644 --- a/shortcuts/slides/slides_create_svglide.go +++ b/shortcuts/slides/slides_create_svglide.go @@ -21,7 +21,7 @@ var SlidesCreateSVGlide = common.Shortcut{ AuthTypes: []string{"user", "bot"}, Scopes: []string{"slides:presentation:create", "slides:presentation:write_only", "docs:document.media:upload"}, Flags: []common.Flag{ - {Name: "manifest", Desc: "SVGlide manifest JSON file; version=svglide.manifest.v1, max 10 pages", Required: true}, + {Name: "manifest", Desc: "SVGlide manifest JSON file; version=svglide.manifest.v1, max 50 pages", Required: true}, {Name: "title", Desc: "presentation title override; defaults to manifest.title, then Untitled"}, }, Validate: func(ctx context.Context, runtime *common.RuntimeContext) error { diff --git a/shortcuts/slides/slides_create_svglide_manifest.go b/shortcuts/slides/slides_create_svglide_manifest.go index 2b64d2087..3f2c01acf 100644 --- a/shortcuts/slides/slides_create_svglide_manifest.go +++ b/shortcuts/slides/slides_create_svglide_manifest.go @@ -20,9 +20,10 @@ import ( ) const ( - svglideManifestVersion = "svglide.manifest.v1" - svglideBundleProtocol = "svg-slides.v1" - svglideSVGNamespace = "http://www.w3.org/2000/svg" + svglideManifestVersion = "svglide.manifest.v1" + svglideBundleProtocol = "svg-slides.v1" + svglideSVGNamespace = "http://www.w3.org/2000/svg" + maxSVGlideManifestPages = 50 ) type svglideManifest struct { @@ -100,8 +101,8 @@ func prepareSVGlidePublishSpec(runtime *common.RuntimeContext, manifestPath stri if manifest.Size.Width != defaultPresentationWidth || manifest.Size.Height != defaultPresentationHeight { return nil, errs.NewValidationError(errs.SubtypeInvalidArgument, "--manifest size must be %dx%d", defaultPresentationWidth, defaultPresentationHeight).WithParam("--manifest") } - if len(manifest.Pages) == 0 || len(manifest.Pages) > maxSlidesPerCreate { - return nil, errs.NewValidationError(errs.SubtypeInvalidArgument, "--manifest pages must contain 1 to %d entries", maxSlidesPerCreate).WithParam("--manifest") + if len(manifest.Pages) == 0 || len(manifest.Pages) > maxSVGlideManifestPages { + return nil, errs.NewValidationError(errs.SubtypeInvalidArgument, "--manifest pages must contain 1 to %d entries", maxSVGlideManifestPages).WithParam("--manifest") } baseDir := filepath.Dir(filepath.Clean(manifestPath)) diff --git a/shortcuts/slides/slides_create_svglide_test.go b/shortcuts/slides/slides_create_svglide_test.go index a99059f91..69e35da81 100644 --- a/shortcuts/slides/slides_create_svglide_test.go +++ b/shortcuts/slides/slides_create_svglide_test.go @@ -64,6 +64,41 @@ func TestPrepareSVGlidePublishSpecReadsManifestAndPages(t *testing.T) { } } +func TestPrepareSVGlidePublishSpecAcceptsTwelvePageManifest(t *testing.T) { + dir := t.TempDir() + withSlidesTestWorkingDir(t, dir) + mustWriteSVGlideTestFile(t, "receipts/validate_svg_deck.json", `{"totalErrors":0}`) + mustWriteSVGlideRequiredNonValidateReceipts(t) + + pages := make([]string, 0, 12) + for i := 1; i <= 12; i++ { + id := fmt.Sprintf("page-%03d", i) + file := fmt.Sprintf("pages/%s.svg", id) + page := fmt.Sprintf(``, id) + mustWriteSVGlideTestFile(t, file, page) + pages = append(pages, fmt.Sprintf(`{"id":%q,"index":%d,"file":%q,"sha256":%q}`, id, i, file, sha256Hex([]byte(page)))) + } + mustWriteSVGlideTestFile(t, "manifest.json", withSVGlideRequiredReceipts(fmt.Sprintf(`{ + "version": "svglide.manifest.v1", + "protocol": "svg-slides.v1", + "title": "Twelve Page Deck", + "size": {"width": 960, "height": 540}, + "publish_ready": true, + "published": false, + "pages": [%s], + "receipts": {"validate_svg_deck": "receipts/validate_svg_deck.json"} + }`, strings.Join(pages, ",")))) + + runtime, _ := newSVGlideTestRuntime(t) + spec, err := prepareSVGlidePublishSpec(runtime, "manifest.json", "") + if err != nil { + t.Fatalf("prepareSVGlidePublishSpec() error = %v", err) + } + if len(spec.Pages) != 12 { + t.Fatalf("Pages len = %d, want 12", len(spec.Pages)) + } +} + func TestPrepareSVGlidePublishSpecTitleOverride(t *testing.T) { dir := t.TempDir() withSlidesTestWorkingDir(t, dir) @@ -116,7 +151,7 @@ func TestPrepareSVGlidePublishSpecValidationErrors(t *testing.T) { name: "no pages", manifest: `{"version":"svglide.manifest.v1","protocol":"svg-slides.v1","title":"x","size":{"width":960,"height":540},"publish_ready":true,"published":false,"receipts":{"validate_svg_deck":"receipts/validate_svg_deck.json"},"pages":[]}`, pageFiles: map[string]string{"receipts/validate_svg_deck.json": `{"totalErrors":0}`}, - wantMessage: "--manifest pages must contain 1 to 10 entries", + wantMessage: "--manifest pages must contain 1 to 50 entries", }, { name: "unsafe child path",