Files
bamort/backend/pdfrender/template_metadata.go
T
Frank b99adede94 mapping the character data to a viewmodel
that  can be rendered easily into the html template
2025-12-18 21:26:28 +01:00

167 lines
4.3 KiB
Go

package pdfrender
// TemplateMetadata contains information about a template's capacity and requirements
type TemplateMetadata struct {
Name string // Template name (e.g., "page1_stats.html")
PageType string // "stats", "play", "spell", "equip"
Description string
Blocks []BlockMetadata // List blocks and their capacities
}
// BlockMetadata defines a list block within a template and how many items it can hold
type BlockMetadata struct {
Name string // Logical name (e.g., "skills_column1", "weapons_main")
ListType string // "skills", "weapons", "spells", "equipment", "magicItems", "gameResults"
MaxItems int // Maximum number of items this block can display
Filter string // Optional filter criteria (e.g., "learned", "unlearned", "languages")
Column int // Column number for multi-column layouts (0 if single column)
}
// TemplateSet contains all templates and their metadata for a format
type TemplateSet struct {
Name string // e.g., "Default_A4_Quer"
Description string
Templates []TemplateWithMeta
}
// TemplateWithMeta combines a template with its metadata
type TemplateWithMeta struct {
Metadata TemplateMetadata
Path string // File path to the template
}
// DefaultA4QuerTemplateSet returns the template set for A4 Querformat
func DefaultA4QuerTemplateSet() TemplateSet {
return TemplateSet{
Name: "Default_A4_Quer",
Description: "Standard A4 Querformat Charakterbogen",
Templates: []TemplateWithMeta{
{
Metadata: TemplateMetadata{
Name: "page1_stats.html",
PageType: "stats",
Description: "Statistikseite mit Grundwerten",
Blocks: []BlockMetadata{
{
Name: "skills_column1",
ListType: "skills",
MaxItems: 32,
Column: 1,
},
{
Name: "skills_column2",
ListType: "skills",
MaxItems: 32,
Column: 2,
},
},
},
Path: "templates/Default_A4_Quer/page1_stats.html",
},
{
Metadata: TemplateMetadata{
Name: "page2_play.html",
PageType: "play",
Description: "Spielbogen mit gelernten Fertigkeiten und Waffen",
Blocks: []BlockMetadata{
{
Name: "skills_learned",
ListType: "skills",
MaxItems: 24,
Filter: "learned",
},
{
Name: "skills_unlearned",
ListType: "skills",
MaxItems: 15,
Filter: "unlearned",
},
{
Name: "skills_languages",
ListType: "skills",
MaxItems: 11,
Filter: "languages",
},
{
Name: "weapons_main",
ListType: "weapons",
MaxItems: 30,
},
},
},
Path: "templates/Default_A4_Quer/page2_play.html",
},
{
Metadata: TemplateMetadata{
Name: "page3_spell.html",
PageType: "spell",
Description: "Zauberseite mit Zauberliste",
Blocks: []BlockMetadata{
{
Name: "spells_column1",
ListType: "spells",
MaxItems: 12,
Column: 1,
},
{
Name: "spells_column2",
ListType: "spells",
MaxItems: 12,
Column: 2,
},
{
Name: "magic_items",
ListType: "magicItems",
MaxItems: 5,
},
},
},
Path: "templates/Default_A4_Quer/page3_spell.html",
},
{
Metadata: TemplateMetadata{
Name: "page4_equip.html",
PageType: "equip",
Description: "Ausrüstungsseite",
Blocks: []BlockMetadata{
{
Name: "equipment_sections",
ListType: "equipment",
MaxItems: 20,
},
{
Name: "game_results",
ListType: "gameResults",
MaxItems: 10,
},
},
},
Path: "templates/Default_A4_Quer/page4_equip.html",
},
},
}
}
// GetBlockMetadata returns the metadata for a specific block in a template
func (tm *TemplateMetadata) GetBlockMetadata(blockName string) *BlockMetadata {
for i := range tm.Blocks {
if tm.Blocks[i].Name == blockName {
return &tm.Blocks[i]
}
}
return nil
}
// GetMaxItems returns the maximum items for a specific list type in this template
func (tm *TemplateMetadata) GetMaxItems(listType string, filter string) int {
total := 0
for _, block := range tm.Blocks {
if block.ListType == listType {
if filter == "" || block.Filter == filter {
total += block.MaxItems
}
}
}
return total
}