summaryrefslogtreecommitdiff
path: root/internal/comic/generator.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-21 10:28:17 +0300
committerPaul Buetow <paul@buetow.org>2026-04-21 10:28:17 +0300
commita6f516d8b3fbd719bdbfc51c7963f75379597831 (patch)
treeea9ed9ad34b70b6b18e76f0511fd1276f8261a2b /internal/comic/generator.go
parent5c2d6e68838aad0dad8e67b7934b6b255b95e1e1 (diff)
Fix n7: honor comic page and panel counts
Diffstat (limited to 'internal/comic/generator.go')
-rw-r--r--internal/comic/generator.go69
1 files changed, 43 insertions, 26 deletions
diff --git a/internal/comic/generator.go b/internal/comic/generator.go
index 89591c8..8a13c0d 100644
--- a/internal/comic/generator.go
+++ b/internal/comic/generator.go
@@ -11,23 +11,27 @@ import (
// GeneratorConfig configures story generation.
type GeneratorConfig struct {
- TextProvider provider.TextProvider
- Prompts PromptRenderer
- Language string
- Script string
- Theme string
- Genres []string
+ TextProvider provider.TextProvider
+ Prompts PromptRenderer
+ Language string
+ Script string
+ Theme string
+ Genres []string
+ StoryPages int
+ PanelsPerPage int
}
// Generator produces the comic story text, bible, title, and panel script.
type Generator struct {
- textProvider provider.TextProvider
- prompts PromptRenderer
- language string
- script string
- theme string
- genres []string
- initErr error
+ textProvider provider.TextProvider
+ prompts PromptRenderer
+ language string
+ script string
+ theme string
+ genres []string
+ storyPages int
+ panelsPerPage int
+ initErr error
}
var _ = (*Generator)(nil)
@@ -35,9 +39,11 @@ var _ = (*Generator)(nil)
// NewGenerator creates a new story generator.
func NewGenerator(cfg *GeneratorConfig) *Generator {
g := &Generator{
- language: "Bulgarian",
- script: "Cyrillic",
- genres: defaultStoryGenres,
+ language: "Bulgarian",
+ script: "Cyrillic",
+ genres: defaultStoryGenres,
+ storyPages: defaultStoryPagesInScript,
+ panelsPerPage: defaultStoryPanelsPerPage,
}
if cfg == nil {
g.initErr = errors.New("generator config is required")
@@ -48,6 +54,12 @@ func NewGenerator(cfg *GeneratorConfig) *Generator {
g.language = orDefault(cfg.Language, g.language)
g.script = orDefault(cfg.Script, g.script)
g.theme = cfg.Theme
+ if cfg.StoryPages > 0 {
+ g.storyPages = cfg.StoryPages
+ }
+ if cfg.PanelsPerPage > 0 {
+ g.panelsPerPage = cfg.PanelsPerPage
+ }
if len(cfg.Genres) > 0 {
g.genres = append([]string(nil), cfg.Genres...)
}
@@ -107,7 +119,7 @@ func (g *Generator) GenerateFull(ctx context.Context, entries []WordEntry) (Gene
if text == "" {
return GenerateResult{}, fmt.Errorf("no content returned")
}
- result := parseGenerateResult(text)
+ result := parseGenerateResultWithDimensions(text, g.storyPages, g.panelsPerPage)
if err := validateGeneratedResult(result, g.script); err != nil {
return GenerateResult{}, err
}
@@ -127,15 +139,20 @@ func (g *Generator) ready() error {
func (g *Generator) renderStoryPrompt(templateName string, entries []WordEntry) (string, error) {
genre := resolveGenre(g.theme, g.genres)
data := map[string]any{
- "Language": g.language,
- "LanguageName": localizedLanguageName(g.language, g.script),
- "Script": g.script,
- "ScriptName": localizedScriptName(g.script),
- "Genre": genre,
- "Words": buildWordList(entries, ""),
- "StoryBibleSeparator": storyBibleSeparator,
- "StoryTitleSeparator": storyTitleSeparator,
- "StoryPanelSeparator": storyPanelSeparator,
+ "Language": g.language,
+ "LanguageName": localizedLanguageName(g.language, g.script),
+ "Script": g.script,
+ "ScriptName": localizedScriptName(g.script),
+ "Genre": genre,
+ "Words": buildWordList(entries, ""),
+ "StoryPages": g.storyPages,
+ "PanelsPerPage": g.panelsPerPage,
+ "TotalPanels": g.storyPages * g.panelsPerPage,
+ "PanelLabelsText": panelLabelsText(g.panelsPerPage),
+ "RequiredDialoguePanels": requiredDialoguePanels(g.panelsPerPage),
+ "StoryBibleSeparator": storyBibleSeparator,
+ "StoryTitleSeparator": storyTitleSeparator,
+ "StoryPanelSeparator": storyPanelSeparator,
}
systemPrompt, err := g.prompts.RenderPrompt(storySystemPromptTemplate, map[string]any{