Files
bamort/backend/templates/Default_A4_Quer/page_2.html
T
Frank 59fe69d35d refactor: Unify PDF pagination system and rename templates
BREAKING CHANGE: Template names changed from page1_stats.html to page_1.html

## Phase 1: Unified Pagination Function
- Implemented PaginateMultiList() to replace PaginateSkills(), PaginateSpells(), and PaginatePage2PlayLists()
- Single metadata-driven function handles all list types (skills, weapons, spells, equipment)
- Properly handles filters (learned/unlearned/language) via template metadata
- Shares list trackers by ListType+Filter combination to avoid duplication
- Added comprehensive tests for all edge cases

## Phase 2: Template Naming Convention
- Renamed templates to be data-agnostic:
  - page1_stats.html -> page_1.html
  - page1.2_stats.html -> page_1.2.html
  - page2_play.html -> page_2.html
  - page2.2_play.html -> page_2.2.html
  - page3_spell.html -> page_3.html
  - page3.2_spell.html -> page_3.2.html
  - page4_equip.html -> page_4.html
- Updated GenerateContinuationTemplateName() for new naming (page_1.html -> page_1.2.html)
- Updated ExtractBaseTemplateName() to handle new format
- Updated all test files and source files with new template names

## Phase 3: Simplified RenderPageWithContinuations
- Removed hardcoded switch statements based on template names
- Replaced with generic dataMap and unified pagination call
- Extracted populatePageDataFromDistribution() to handle data mapping
- Template type detection now driven by metadata, not hardcoded names

## Benefits
-  Extensibility: Add new templates without code changes
-  Maintainability: One pagination algorithm instead of three
-  Clarity: Template names reflect page numbers, not content types
-  Flexibility: Templates can mix any data types
-  All 40+ tests passing

## Technical Details
- Added SkillsColumn3 and SkillsColumn4 fields to PageData for continuation pages
- Template metadata loaded from HTML comments drives pagination behavior
- Backward compatibility maintained for old template references in comments
2025-12-21 22:07:46 +01:00

188 lines
9.9 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Abenteuerblatt - {{.Character.Name}}</title>
<link rel="stylesheet" href="shared/export_format_a4_quer.css">
</head>
<body>
<div class="container">
<div class="header">
<span class="header-left">Abenteuerblatt</span>
<span class="header-right">Datum: {{.Meta.Date}}</span>
</div>
<div class="title-row">
<img src="shared/images/headerimg.png" alt="Schmuckgrafik" class="header-decoration">
<div class="info-box">
<div><strong>Figur</strong> {{.Character.Name}} &nbsp;&nbsp; <strong>Grad</strong> {{.Character.Grade}}</div>
<hr>
<div><strong>Typ</strong> {{.Character.Type}} &nbsp;&nbsp; <strong>GG</strong> {{.DerivedValues.GG}} &nbsp;&nbsp; <strong>SG</strong> {{.DerivedValues.SG}}</div>
</div>
<img src="shared/images/headerimg.png" alt="Schmuckgrafik" class="header-decoration">
</div>
<div class="flex main-content">
<!-- Left section -->
<div class="left-section">
<!-- Stats boxes top -->
<div class="stats-row">
<div class="attr-box"><div class="attr-label">St</div><div class="attr-value">{{.Attributes.St}}</div></div>
<div class="attr-box"><div class="attr-label">Gs</div><div class="attr-value">{{.Attributes.Gs}}</div></div>
<div class="attr-box"><div class="attr-label">Gw</div><div class="attr-value">{{.Attributes.Gw}}</div></div>
<div class="attr-box"><div class="attr-label">Ko</div><div class="attr-value">{{.Attributes.Ko}}</div></div>
<div class="attr-box"><div class="attr-label">In</div><div class="attr-value">{{.Attributes.In}}</div></div>
</div>
<div class="stats-row">
<div class="attr-box"><div class="attr-label">Zt</div><div class="attr-value">{{.Attributes.Zt}}</div></div>
<div class="attr-box"><div class="attr-label">Au</div><div class="attr-value">{{.Attributes.Au}}</div></div>
<div class="attr-box"><div class="attr-label">pA</div><div class="attr-value">{{.Attributes.PA}}</div></div>
<div class="attr-box"><div class="attr-label">Wk</div><div class="attr-value">{{.Attributes.Wk}}</div></div>
<div class="attr-box"><div class="attr-label">B</div><div class="attr-value">{{.Attributes.B}}</div></div>
</div>
<!-- Combat stats -->
<div class="combat-stats">
<div><strong>Abwehr + {{.DerivedValues.Abwehr}}</strong></div>
<div><strong>+</strong> <span class="combat-stats-small">mit Vert.<br>waffe</span></div>
<div><strong>Resistenz + {{.DerivedValues.ResistenzKoerper}}/{{.DerivedValues.ResistenzGeist}}</strong></div>
<div><strong>Zaubern + {{.DerivedValues.Zaubern}}</strong></div>
</div>
<!-- Skills tables -->
<div class="skills-row">
<!-- BLOCK: skills_learned, TYPE: skills, MAX: 17, FILTER: learned -->
<table class="skills-table">
<tr>
<th>Fertigkeit</th>
<th>EW</th>
<th>PP</th>
</tr>
{{range .SkillsLearned}}
<tr><td>{{.Name}}</td><td>{{if .Value}}+ {{.Value}}{{else}}&nbsp;{{end}}</td><td>{{if .PracticePoints}}{{.PracticePoints}}{{end}}</td></tr>
{{end}}
</table>
<div class="skills-stack">
<!-- BLOCK: skills_unlearned, TYPE: skills, MAX: 15, FILTER: unlearned -->
<table class="skills-col-table">
<tr>
<th colspan="2"><em>ungelernte Fertigkeiten</em></th>
</tr>
<tr><td colspan="2" class="unlearned-small">alle wenigstens +(0) außer Musizieren, Schreiben, Sprache, Lesen von Zauberschrift</td></tr>
<tr><td>Akrobatik+(6)</td> <td>Stehlen+(3)</td></tr>
<tr><td>Athletik+(6)</td> <td>Tanzen+(6)</td></tr>
<tr><td>Balancieren+(6)</td> <td>Tarnen+(3)</td></tr>
<tr><td>Betäubungsgriff+(6)</td> <td>Tauchen~(6)</td></tr>
<tr><td>Bootfahren+(3)</td> <td>Trinken+(3)</td></tr>
<tr><td>Einschüchtern+(3)</td> <td>Überreden+(6)</td></tr>
<tr><td>Klettern+(6)</td> <td>Verführen+(3)</td></tr>
<tr><td>Menschenkenntnis+(3)</td><td>Verfroren+(3)</td></tr>
<tr><td>Reiten+(6)</td> <td>Verstecken+(3)</td></tr>
<tr><td>Schwimmen+(3)</td> <td>Wahrnehmung+(6)</td></tr>
<tr><td>Seilkunst+(3)</td> <td>&nbsp;</td></tr>
</table>
<!-- BLOCK: skills_languages, TYPE: skills, MAX: 4, FILTER: language -->
<table class="skills-table" style="width: 100%; height: unset;">
<tr>
<th>Fertigkeit</th>
<th>EW</th>
<th>PP</th>
</tr>
{{range .SkillsLanguage}}
<tr><td>{{.Name}}</td><td>{{if .Value}}+ {{.Value}}{{else}}&nbsp;{{end}}</td><td>{{if .PracticePoints}}{{.PracticePoints}}{{end}}</td></tr>
{{end}}
</table>
</div>
</div>
</div>
<!-- Right section -->
<div class="right-section">
<div>
<table class="table">
<tr>
<td>LP {{.DerivedValues.LPMax}}</td>
{{range $i := iterate 13}}<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>{{end}}
</tr><tr>
<td>AP {{.DerivedValues.APMax}}</td>
{{range $i := iterate 13}}<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>{{end}}
</tr>
</table>
</div>
<!-- Bonus table -->
<div class="margin-bottom-3">
<table class="bonus-table">
<tr>
<th>pers.</th>
<th colspan="2">Ausdauer</th>
<th colspan="2">Angriff</th>
<th colspan="2">Abwehr</th>
<th colspan="2">Schaden</th>
</tr>
<tr>
<td>Bonus</td>
<td>{{.DerivedValues.AusdauerBonus}}</td>
<td></td>
<td>{{.DerivedValues.AngriffBonus}}</td>
<td></td>
<td>{{.DerivedValues.Abwehr}}</td>
<td></td>
<td>{{.DerivedValues.SchadenBonus}}</td>
<td></td>
</tr>
<tr>
<td>Situativ</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Summe</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</div>
<!-- Weapons table -->
<div class="margin-bottom-3">
<!-- BLOCK: weapons_main, TYPE: weapons, MAX: 22 -->
<table class="weapons-table">
<tr>
<th>Waffe</th>
<th>Fert.<br>wert</th>
<th>Schaden</th>
<th>Reichweite<br/>nah/mitte/fern</th>
</tr>
{{range .Weapons}}
<tr>
<td>{{.Name}}</td>
<td>{{if .Value}}{{.Value}}{{else}}&nbsp;{{end}}</td>
<td>{{if .Damage}}{{.Damage}}{{else}}&nbsp;{{end}}</td>
<td>{{if .Range}}{{.Range}}{{else}}&nbsp;{{end}}</td>
</tr>
{{end}}
</table>
</div>
<!-- Senses row at bottom -->
<div class="senses-row">
<span><b>Sehen</b> +{{.DerivedValues.Sehen}}</span>
<span><b>Nachtsicht</b> +{{.DerivedValues.Sehen}}</span>
<span><b>Hören</b> +{{.DerivedValues.Horen}}</span>
<span><b>Riechen/Schmecken</b> +{{.DerivedValues.Riechen}}</span>
<span><b>Sechster Sinn</b> +{{.DerivedValues.Sechster}}</span>
</div>
</div>
</div>
</div>
</body>
</html>