Topdata wiki alignment links
This commit is contained in:
@@ -326,13 +326,17 @@ the toolkit keeps its legacy default injections for compatibility.
|
|||||||
`topdata.wiki.alignment_links.target_pattern` controls whether formatted
|
`topdata.wiki.alignment_links.target_pattern` controls whether formatted
|
||||||
alignment names become internal wiki links. The pattern may use `{alignment}`
|
alignment names become internal wiki links. The pattern may use `{alignment}`
|
||||||
for the title-shaped alignment segment with spaces converted to underscores, and
|
for the title-shaped alignment segment with spaces converted to underscores, and
|
||||||
`{label}` for the display label:
|
`{label}` for the display label. `alignment_links.link_format` defaults to
|
||||||
|
`wiki_markup`, which emits `[[target|label]]`. Use `html_anchor` when the
|
||||||
|
configured target should be emitted as a root URL anchor instead of being
|
||||||
|
resolved as namespace-relative wiki markup:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
topdata:
|
topdata:
|
||||||
wiki:
|
wiki:
|
||||||
alignment_links:
|
alignment_links:
|
||||||
target_pattern: Guides/Alignment/{alignment}
|
target_pattern: /wiki/Guides/Alignment/{alignment}
|
||||||
|
link_format: html_anchor
|
||||||
```
|
```
|
||||||
|
|
||||||
Generated wiki input and output paths are YAML-configurable. `source` points to
|
Generated wiki input and output paths are YAML-configurable. `source` points to
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ const (
|
|||||||
DefaultTopDataWikiTitlePrefixMinLength = 3
|
DefaultTopDataWikiTitlePrefixMinLength = 3
|
||||||
DefaultTopDataWikiStatusPages = true
|
DefaultTopDataWikiStatusPages = true
|
||||||
DefaultTopDataWikiStatusListingScope = "all"
|
DefaultTopDataWikiStatusListingScope = "all"
|
||||||
|
DefaultTopDataWikiAlignmentLinkFormat = "wiki_markup"
|
||||||
DefaultWikiDeployManifest = ".wiki_deploy_manifest.json"
|
DefaultWikiDeployManifest = ".wiki_deploy_manifest.json"
|
||||||
DefaultWikiDeployEditSummary = "Auto-generated from native builder"
|
DefaultWikiDeployEditSummary = "Auto-generated from native builder"
|
||||||
DefaultTopDataPackageHAK = "sow_top.hak"
|
DefaultTopDataPackageHAK = "sow_top.hak"
|
||||||
@@ -251,26 +252,29 @@ func (p *Project) EffectiveConfig() EffectiveConfig {
|
|||||||
RowGeneration: cloneTopDataRowGeneration(p.Config.TopData.RowGeneration),
|
RowGeneration: cloneTopDataRowGeneration(p.Config.TopData.RowGeneration),
|
||||||
ClassFeatInjections: cloneTopDataClassFeatInjections(p.Config.TopData.ClassFeatInjections),
|
ClassFeatInjections: cloneTopDataClassFeatInjections(p.Config.TopData.ClassFeatInjections),
|
||||||
Wiki: TopDataWikiConfig{
|
Wiki: TopDataWikiConfig{
|
||||||
OutputRoot: defaultString(p.Config.TopData.Wiki.OutputRoot, DefaultTopDataWikiOutputRoot),
|
OutputRoot: defaultString(p.Config.TopData.Wiki.OutputRoot, DefaultTopDataWikiOutputRoot),
|
||||||
PagesDir: defaultString(p.Config.TopData.Wiki.PagesDir, DefaultTopDataWikiPagesDir),
|
PagesDir: defaultString(p.Config.TopData.Wiki.PagesDir, DefaultTopDataWikiPagesDir),
|
||||||
StateFile: defaultString(p.Config.TopData.Wiki.StateFile, DefaultTopDataWikiStateFile),
|
StateFile: defaultString(p.Config.TopData.Wiki.StateFile, DefaultTopDataWikiStateFile),
|
||||||
ManagedNamespaces: defaultStringSlice(p.Config.TopData.Wiki.ManagedNamespaces, []string{"classes", "feat", "itemtypes", "races", "skills", "spells", "meta"}),
|
ManagedNamespaces: defaultStringSlice(p.Config.TopData.Wiki.ManagedNamespaces, []string{"classes", "feat", "itemtypes", "races", "skills", "spells", "meta"}),
|
||||||
DeployManifest: defaultString(p.Config.TopData.Wiki.DeployManifest, DefaultWikiDeployManifest),
|
DeployManifest: defaultString(p.Config.TopData.Wiki.DeployManifest, DefaultWikiDeployManifest),
|
||||||
DeployEditSummary: defaultString(p.Config.TopData.Wiki.DeployEditSummary, DefaultWikiDeployEditSummary),
|
DeployEditSummary: defaultString(p.Config.TopData.Wiki.DeployEditSummary, DefaultWikiDeployEditSummary),
|
||||||
Source: defaultString(p.Config.TopData.Wiki.Source, DefaultTopDataWikiSource),
|
Source: defaultString(p.Config.TopData.Wiki.Source, DefaultTopDataWikiSource),
|
||||||
Renderer: defaultString(p.Config.TopData.Wiki.Renderer, DefaultTopDataWikiRenderer),
|
Renderer: defaultString(p.Config.TopData.Wiki.Renderer, DefaultTopDataWikiRenderer),
|
||||||
LinkStrategy: defaultString(p.Config.TopData.Wiki.LinkStrategy, DefaultTopDataWikiLinkStrategy),
|
LinkStrategy: defaultString(p.Config.TopData.Wiki.LinkStrategy, DefaultTopDataWikiLinkStrategy),
|
||||||
NamespacesFile: defaultString(p.Config.TopData.Wiki.NamespacesFile, DefaultTopDataWikiNamespacesFile),
|
NamespacesFile: defaultString(p.Config.TopData.Wiki.NamespacesFile, DefaultTopDataWikiNamespacesFile),
|
||||||
TablesFile: defaultString(p.Config.TopData.Wiki.TablesFile, DefaultTopDataWikiTablesFile),
|
TablesFile: defaultString(p.Config.TopData.Wiki.TablesFile, DefaultTopDataWikiTablesFile),
|
||||||
VisibilityFile: defaultString(p.Config.TopData.Wiki.VisibilityFile, DefaultTopDataWikiVisibilityFile),
|
VisibilityFile: defaultString(p.Config.TopData.Wiki.VisibilityFile, DefaultTopDataWikiVisibilityFile),
|
||||||
DataFile: defaultString(p.Config.TopData.Wiki.DataFile, DefaultTopDataWikiDataFile),
|
DataFile: defaultString(p.Config.TopData.Wiki.DataFile, DefaultTopDataWikiDataFile),
|
||||||
PagePathsFile: defaultString(p.Config.TopData.Wiki.PagePathsFile, DefaultTopDataWikiPagePathsFile),
|
PagePathsFile: defaultString(p.Config.TopData.Wiki.PagePathsFile, DefaultTopDataWikiPagePathsFile),
|
||||||
TemplatesDir: defaultString(p.Config.TopData.Wiki.TemplatesDir, DefaultTopDataWikiTemplatesDir),
|
TemplatesDir: defaultString(p.Config.TopData.Wiki.TemplatesDir, DefaultTopDataWikiTemplatesDir),
|
||||||
PageTemplatesDir: defaultWikiPageTemplatesDir(p.Config.TopData.Wiki),
|
PageTemplatesDir: defaultWikiPageTemplatesDir(p.Config.TopData.Wiki),
|
||||||
ManualSectionsDir: defaultString(p.Config.TopData.Wiki.ManualSectionsDir, DefaultTopDataWikiManualSectionsDir),
|
ManualSectionsDir: defaultString(p.Config.TopData.Wiki.ManualSectionsDir, DefaultTopDataWikiManualSectionsDir),
|
||||||
ManualSectionsFile: defaultWikiManualSectionsFile(p.Config.TopData.Wiki),
|
ManualSectionsFile: defaultWikiManualSectionsFile(p.Config.TopData.Wiki),
|
||||||
PageIndexFile: defaultString(p.Config.TopData.Wiki.PageIndexFile, DefaultTopDataWikiPageIndexFile),
|
PageIndexFile: defaultString(p.Config.TopData.Wiki.PageIndexFile, DefaultTopDataWikiPageIndexFile),
|
||||||
AlignmentLinks: p.Config.TopData.Wiki.AlignmentLinks,
|
AlignmentLinks: TopDataWikiAlignmentLinks{
|
||||||
|
TargetPattern: strings.TrimSpace(p.Config.TopData.Wiki.AlignmentLinks.TargetPattern),
|
||||||
|
LinkFormat: defaultString(p.Config.TopData.Wiki.AlignmentLinks.LinkFormat, DefaultTopDataWikiAlignmentLinkFormat),
|
||||||
|
},
|
||||||
TitlePrefixMinLength: defaultInt(p.Config.TopData.Wiki.TitlePrefixMinLength, DefaultTopDataWikiTitlePrefixMinLength),
|
TitlePrefixMinLength: defaultInt(p.Config.TopData.Wiki.TitlePrefixMinLength, DefaultTopDataWikiTitlePrefixMinLength),
|
||||||
StatusPages: defaultBoolPointer(p.Config.TopData.Wiki.StatusPages, DefaultTopDataWikiStatusPages),
|
StatusPages: defaultBoolPointer(p.Config.TopData.Wiki.StatusPages, DefaultTopDataWikiStatusPages),
|
||||||
StatusListingScope: defaultString(p.Config.TopData.Wiki.StatusListingScope, DefaultTopDataWikiStatusListingScope),
|
StatusListingScope: defaultString(p.Config.TopData.Wiki.StatusListingScope, DefaultTopDataWikiStatusListingScope),
|
||||||
@@ -571,6 +575,7 @@ func markMissingDefaults(provenance ConfigProvenance) {
|
|||||||
"topdata.wiki.title_prefix_min_length": "3",
|
"topdata.wiki.title_prefix_min_length": "3",
|
||||||
"topdata.wiki.status_pages": "true",
|
"topdata.wiki.status_pages": "true",
|
||||||
"topdata.wiki.status_listing_scope": DefaultTopDataWikiStatusListingScope,
|
"topdata.wiki.status_listing_scope": DefaultTopDataWikiStatusListingScope,
|
||||||
|
"topdata.wiki.alignment_links.link_format": DefaultTopDataWikiAlignmentLinkFormat,
|
||||||
"topdata.wiki.stale_pages.default": DefaultTopDataWikiStaleDefault,
|
"topdata.wiki.stale_pages.default": DefaultTopDataWikiStaleDefault,
|
||||||
"topdata.wiki.stale_pages.live_cleanup": DefaultTopDataWikiStaleLiveCleanup,
|
"topdata.wiki.stale_pages.live_cleanup": DefaultTopDataWikiStaleLiveCleanup,
|
||||||
"topdata.wiki.managed_region.marker_format": DefaultTopDataWikiMarkerFormat,
|
"topdata.wiki.managed_region.marker_format": DefaultTopDataWikiMarkerFormat,
|
||||||
|
|||||||
+51
-44
@@ -294,6 +294,7 @@ type TopDataWikiConfig struct {
|
|||||||
|
|
||||||
type TopDataWikiAlignmentLinks struct {
|
type TopDataWikiAlignmentLinks struct {
|
||||||
TargetPattern string `json:"target_pattern" yaml:"target_pattern"`
|
TargetPattern string `json:"target_pattern" yaml:"target_pattern"`
|
||||||
|
LinkFormat string `json:"link_format" yaml:"link_format"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TopDataWikiStalePagesConfig struct {
|
type TopDataWikiStalePagesConfig struct {
|
||||||
@@ -567,50 +568,51 @@ func (p *Project) ValidateLayout() error {
|
|||||||
failures = append(failures, errors.New("at least one of paths.source, paths.assets, or topdata.source is required"))
|
failures = append(failures, errors.New("at least one of paths.source, paths.assets, or topdata.source is required"))
|
||||||
}
|
}
|
||||||
for field, value := range map[string]string{
|
for field, value := range map[string]string{
|
||||||
"paths.source": p.Config.Paths.Source,
|
"paths.source": p.Config.Paths.Source,
|
||||||
"paths.assets": p.Config.Paths.Assets,
|
"paths.assets": p.Config.Paths.Assets,
|
||||||
"paths.build": p.Config.Paths.Build,
|
"paths.build": p.Config.Paths.Build,
|
||||||
"paths.cache": p.Config.Paths.Cache,
|
"paths.cache": p.Config.Paths.Cache,
|
||||||
"paths.tools": p.Config.Paths.Tools,
|
"paths.tools": p.Config.Paths.Tools,
|
||||||
"outputs.module_archive": p.Config.Outputs.ModuleArchive,
|
"outputs.module_archive": p.Config.Outputs.ModuleArchive,
|
||||||
"outputs.hak_manifest": p.Config.Outputs.HAKManifest,
|
"outputs.hak_manifest": p.Config.Outputs.HAKManifest,
|
||||||
"outputs.hak_archive": p.Config.Outputs.HAKArchive,
|
"outputs.hak_archive": p.Config.Outputs.HAKArchive,
|
||||||
"generated_assets.topdata_2da": "",
|
"generated_assets.topdata_2da": "",
|
||||||
"validation.profile": p.Config.Validation.Profile,
|
"validation.profile": p.Config.Validation.Profile,
|
||||||
"scripts.source_dir": p.Config.Scripts.SourceDir,
|
"scripts.source_dir": p.Config.Scripts.SourceDir,
|
||||||
"scripts.cache": p.Config.Scripts.Cache,
|
"scripts.cache": p.Config.Scripts.Cache,
|
||||||
"scripts.compiler.path": p.Config.Scripts.Compiler.Path,
|
"scripts.compiler.path": p.Config.Scripts.Compiler.Path,
|
||||||
"scripts.compiler.env.path": p.Config.Scripts.Compiler.Env.Path,
|
"scripts.compiler.env.path": p.Config.Scripts.Compiler.Env.Path,
|
||||||
"topdata.source": p.Config.TopData.Source,
|
"topdata.source": p.Config.TopData.Source,
|
||||||
"topdata.build": p.Config.TopData.Build,
|
"topdata.build": p.Config.TopData.Build,
|
||||||
"topdata.reference_builder": p.Config.TopData.ReferenceBuilder,
|
"topdata.reference_builder": p.Config.TopData.ReferenceBuilder,
|
||||||
"topdata.assets": p.Config.TopData.Assets,
|
"topdata.assets": p.Config.TopData.Assets,
|
||||||
"topdata.compiled_2da_dir": p.Config.TopData.Compiled2DADir,
|
"topdata.compiled_2da_dir": p.Config.TopData.Compiled2DADir,
|
||||||
"topdata.compiled_tlk": p.Config.TopData.CompiledTLK,
|
"topdata.compiled_tlk": p.Config.TopData.CompiledTLK,
|
||||||
"topdata.wiki.output_root": p.Config.TopData.Wiki.OutputRoot,
|
"topdata.wiki.output_root": p.Config.TopData.Wiki.OutputRoot,
|
||||||
"topdata.wiki.pages_dir": p.Config.TopData.Wiki.PagesDir,
|
"topdata.wiki.pages_dir": p.Config.TopData.Wiki.PagesDir,
|
||||||
"topdata.wiki.state_file": p.Config.TopData.Wiki.StateFile,
|
"topdata.wiki.state_file": p.Config.TopData.Wiki.StateFile,
|
||||||
"topdata.wiki.deploy_manifest": p.Config.TopData.Wiki.DeployManifest,
|
"topdata.wiki.deploy_manifest": p.Config.TopData.Wiki.DeployManifest,
|
||||||
"topdata.wiki.deploy_edit_summary": p.Config.TopData.Wiki.DeployEditSummary,
|
"topdata.wiki.deploy_edit_summary": p.Config.TopData.Wiki.DeployEditSummary,
|
||||||
"topdata.wiki.source": p.Config.TopData.Wiki.Source,
|
"topdata.wiki.source": p.Config.TopData.Wiki.Source,
|
||||||
"topdata.wiki.namespaces_file": p.Config.TopData.Wiki.NamespacesFile,
|
"topdata.wiki.namespaces_file": p.Config.TopData.Wiki.NamespacesFile,
|
||||||
"topdata.wiki.tables_file": p.Config.TopData.Wiki.TablesFile,
|
"topdata.wiki.tables_file": p.Config.TopData.Wiki.TablesFile,
|
||||||
"topdata.wiki.visibility_file": p.Config.TopData.Wiki.VisibilityFile,
|
"topdata.wiki.visibility_file": p.Config.TopData.Wiki.VisibilityFile,
|
||||||
"topdata.wiki.data_file": p.Config.TopData.Wiki.DataFile,
|
"topdata.wiki.data_file": p.Config.TopData.Wiki.DataFile,
|
||||||
"topdata.wiki.page_paths_file": p.Config.TopData.Wiki.PagePathsFile,
|
"topdata.wiki.page_paths_file": p.Config.TopData.Wiki.PagePathsFile,
|
||||||
"topdata.wiki.templates_dir": p.Config.TopData.Wiki.TemplatesDir,
|
"topdata.wiki.templates_dir": p.Config.TopData.Wiki.TemplatesDir,
|
||||||
"topdata.wiki.page_templates_dir": p.Config.TopData.Wiki.PageTemplatesDir,
|
"topdata.wiki.page_templates_dir": p.Config.TopData.Wiki.PageTemplatesDir,
|
||||||
"topdata.wiki.manual_sections_dir": p.Config.TopData.Wiki.ManualSectionsDir,
|
"topdata.wiki.manual_sections_dir": p.Config.TopData.Wiki.ManualSectionsDir,
|
||||||
"topdata.wiki.manual_sections_file": p.Config.TopData.Wiki.ManualSectionsFile,
|
"topdata.wiki.manual_sections_file": p.Config.TopData.Wiki.ManualSectionsFile,
|
||||||
"topdata.wiki.page_index_file": p.Config.TopData.Wiki.PageIndexFile,
|
"topdata.wiki.page_index_file": p.Config.TopData.Wiki.PageIndexFile,
|
||||||
"extract.layout": p.Config.Extract.Layout,
|
"topdata.wiki.alignment_links.link_format": p.Config.TopData.Wiki.AlignmentLinks.LinkFormat,
|
||||||
"extract.hak_discovery": p.Config.Extract.HAKDiscovery,
|
"extract.layout": p.Config.Extract.Layout,
|
||||||
"autogen.cache.root": p.Config.Autogen.Cache.Root,
|
"extract.hak_discovery": p.Config.Extract.HAKDiscovery,
|
||||||
"autogen.cache.max_age": p.Config.Autogen.Cache.MaxAge,
|
"autogen.cache.root": p.Config.Autogen.Cache.Root,
|
||||||
"autogen.cache.refresh_env": p.Config.Autogen.Cache.RefreshEnv,
|
"autogen.cache.max_age": p.Config.Autogen.Cache.MaxAge,
|
||||||
"autogen.release_source.provider": p.Config.Autogen.ReleaseSource.Provider,
|
"autogen.cache.refresh_env": p.Config.Autogen.Cache.RefreshEnv,
|
||||||
"autogen.release_source.server_url_env": p.Config.Autogen.ReleaseSource.ServerURLEnv,
|
"autogen.release_source.provider": p.Config.Autogen.ReleaseSource.Provider,
|
||||||
"autogen.release_source.repo_env": p.Config.Autogen.ReleaseSource.RepoEnv,
|
"autogen.release_source.server_url_env": p.Config.Autogen.ReleaseSource.ServerURLEnv,
|
||||||
|
"autogen.release_source.repo_env": p.Config.Autogen.ReleaseSource.RepoEnv,
|
||||||
} {
|
} {
|
||||||
if strings.Contains(value, "\x00") {
|
if strings.Contains(value, "\x00") {
|
||||||
failures = append(failures, fmt.Errorf("%s must not contain NUL bytes", field))
|
failures = append(failures, fmt.Errorf("%s must not contain NUL bytes", field))
|
||||||
@@ -674,6 +676,11 @@ func (p *Project) ValidateLayout() error {
|
|||||||
default:
|
default:
|
||||||
failures = append(failures, fmt.Errorf("topdata.wiki.link_strategy %q is not supported", effective.TopData.Wiki.LinkStrategy))
|
failures = append(failures, fmt.Errorf("topdata.wiki.link_strategy %q is not supported", effective.TopData.Wiki.LinkStrategy))
|
||||||
}
|
}
|
||||||
|
switch effective.TopData.Wiki.AlignmentLinks.LinkFormat {
|
||||||
|
case "wiki_markup", "html_anchor":
|
||||||
|
default:
|
||||||
|
failures = append(failures, fmt.Errorf("topdata.wiki.alignment_links.link_format %q is not supported", effective.TopData.Wiki.AlignmentLinks.LinkFormat))
|
||||||
|
}
|
||||||
if effective.TopData.Wiki.TitlePrefixMinLength < 1 {
|
if effective.TopData.Wiki.TitlePrefixMinLength < 1 {
|
||||||
failures = append(failures, fmt.Errorf("topdata.wiki.title_prefix_min_length must be at least 1"))
|
failures = append(failures, fmt.Errorf("topdata.wiki.title_prefix_min_length must be at least 1"))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1206,6 +1206,9 @@ func TestValidateLayoutRejectsInvalidTopDataWikiConfig(t *testing.T) {
|
|||||||
ManualSectionsFile: "../manual/default.yaml",
|
ManualSectionsFile: "../manual/default.yaml",
|
||||||
PageIndexFile: "../page-index.json",
|
PageIndexFile: "../page-index.json",
|
||||||
ManualSectionsDir: "../manual",
|
ManualSectionsDir: "../manual",
|
||||||
|
AlignmentLinks: TopDataWikiAlignmentLinks{
|
||||||
|
LinkFormat: "raw_url",
|
||||||
|
},
|
||||||
StalePages: TopDataWikiStalePagesConfig{
|
StalePages: TopDataWikiStalePagesConfig{
|
||||||
Default: "delete",
|
Default: "delete",
|
||||||
LiveCleanup: "delete",
|
LiveCleanup: "delete",
|
||||||
@@ -1234,6 +1237,7 @@ func TestValidateLayoutRejectsInvalidTopDataWikiConfig(t *testing.T) {
|
|||||||
"topdata.wiki.manual_sections_file",
|
"topdata.wiki.manual_sections_file",
|
||||||
"topdata.wiki.page_index_file",
|
"topdata.wiki.page_index_file",
|
||||||
"topdata.wiki.manual_sections_dir",
|
"topdata.wiki.manual_sections_dir",
|
||||||
|
"topdata.wiki.alignment_links.link_format",
|
||||||
"topdata.wiki.stale_pages.default",
|
"topdata.wiki.stale_pages.default",
|
||||||
"topdata.wiki.stale_pages.live_cleanup",
|
"topdata.wiki.stale_pages.live_cleanup",
|
||||||
} {
|
} {
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ type wikiContext struct {
|
|||||||
namespaceTitles map[string]string
|
namespaceTitles map[string]string
|
||||||
namespacePaths map[string]string
|
namespacePaths map[string]string
|
||||||
alignmentLinkPattern string
|
alignmentLinkPattern string
|
||||||
|
alignmentLinkFormat string
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildWiki(p *project.Project, nativeResult BuildResult, force bool, progress func(string)) (wikiResult, error) {
|
func buildWiki(p *project.Project, nativeResult BuildResult, force bool, progress func(string)) (wikiResult, error) {
|
||||||
@@ -155,6 +156,7 @@ func buildWiki(p *project.Project, nativeResult BuildResult, force bool, progres
|
|||||||
ctx.manualSections = manualSections
|
ctx.manualSections = manualSections
|
||||||
ctx.templateDir = p.TopDataWikiPageTemplatesDir()
|
ctx.templateDir = p.TopDataWikiPageTemplatesDir()
|
||||||
ctx.alignmentLinkPattern = p.EffectiveConfig().TopData.Wiki.AlignmentLinks.TargetPattern
|
ctx.alignmentLinkPattern = p.EffectiveConfig().TopData.Wiki.AlignmentLinks.TargetPattern
|
||||||
|
ctx.alignmentLinkFormat = p.EffectiveConfig().TopData.Wiki.AlignmentLinks.LinkFormat
|
||||||
ctx.wikiTablesPath = filepath.Join(p.TopDataWikiSourceDir(), filepath.FromSlash(p.EffectiveConfig().TopData.Wiki.TablesFile))
|
ctx.wikiTablesPath = filepath.Join(p.TopDataWikiSourceDir(), filepath.FromSlash(p.EffectiveConfig().TopData.Wiki.TablesFile))
|
||||||
tableDefinitions, err := loadWikiTableDefinitions(ctx.wikiTablesPath)
|
tableDefinitions, err := loadWikiTableDefinitions(ctx.wikiTablesPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1312,6 +1312,31 @@ func TestWikiTemplateFormatsPreferredAlignmentsWithConfiguredLinks(t *testing.T)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWikiTemplateFormatsPreferredAlignmentsWithConfiguredRootAnchors(t *testing.T) {
|
||||||
|
ctx := &wikiContext{
|
||||||
|
alignmentLinkPattern: "/wiki/Guides/Alignment/{alignment}",
|
||||||
|
alignmentLinkFormat: "html_anchor",
|
||||||
|
}
|
||||||
|
page := wikiTemplatePage{
|
||||||
|
PageID: "racialtypes:tiefling",
|
||||||
|
Category: "racialtypes",
|
||||||
|
Key: "racialtypes:tiefling",
|
||||||
|
Title: "Tiefling",
|
||||||
|
Row: map[string]any{
|
||||||
|
"PreferredAlignments": map[string]any{"list": []any{"le"}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
got, err := ctx.renderWikiTemplateString("racialtypes.html", `{{alignments(PreferredAlignments)}}`, page)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("render template: %v", err)
|
||||||
|
}
|
||||||
|
want := `<a class="wiki-internal-link" href="/wiki/Guides/Alignment/Lawful_Evil">Lawful Evil</a>`
|
||||||
|
if got != want {
|
||||||
|
t.Fatalf("expected %q, got %q", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestWikiTemplateDescriptionFiltersExtractParagraphsAndSections(t *testing.T) {
|
func TestWikiTemplateDescriptionFiltersExtractParagraphsAndSections(t *testing.T) {
|
||||||
ctx := &wikiContext{}
|
ctx := &wikiContext{}
|
||||||
page := wikiTemplatePage{
|
page := wikiTemplatePage{
|
||||||
|
|||||||
@@ -367,7 +367,7 @@ func joinWikiTemplateValue(value any, sep string) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *wikiContext) formatWikiTemplateAlignments(value any) (string, error) {
|
func (ctx *wikiContext) formatWikiTemplateAlignments(value any) (any, error) {
|
||||||
values, err := wikiTemplateAlignmentValues(value)
|
values, err := wikiTemplateAlignmentValues(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
@@ -389,13 +389,21 @@ func (ctx *wikiContext) formatWikiTemplateAlignments(value any) (string, error)
|
|||||||
if len(labels) == 0 {
|
if len(labels) == 0 {
|
||||||
return "Any", nil
|
return "Any", nil
|
||||||
}
|
}
|
||||||
return strings.Join(labels, ", "), nil
|
rendered := strings.Join(labels, ", ")
|
||||||
|
if ctx != nil && strings.TrimSpace(ctx.alignmentLinkFormat) == "html_anchor" {
|
||||||
|
return wikiTemplateHTML(rendered), nil
|
||||||
|
}
|
||||||
|
return rendered, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *wikiContext) renderWikiTemplateAlignmentLabel(label string) string {
|
func (ctx *wikiContext) renderWikiTemplateAlignmentLabel(label string) string {
|
||||||
pattern := ""
|
pattern := ""
|
||||||
|
format := "wiki_markup"
|
||||||
if ctx != nil {
|
if ctx != nil {
|
||||||
pattern = strings.TrimSpace(ctx.alignmentLinkPattern)
|
pattern = strings.TrimSpace(ctx.alignmentLinkPattern)
|
||||||
|
if strings.TrimSpace(ctx.alignmentLinkFormat) != "" {
|
||||||
|
format = strings.TrimSpace(ctx.alignmentLinkFormat)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if pattern == "" {
|
if pattern == "" {
|
||||||
return label
|
return label
|
||||||
@@ -405,6 +413,9 @@ func (ctx *wikiContext) renderWikiTemplateAlignmentLabel(label string) string {
|
|||||||
if strings.TrimSpace(target) == "" {
|
if strings.TrimSpace(target) == "" {
|
||||||
return label
|
return label
|
||||||
}
|
}
|
||||||
|
if format == "html_anchor" {
|
||||||
|
return `<a class="wiki-internal-link" href="` + html.EscapeString(target) + `">` + html.EscapeString(label) + `</a>`
|
||||||
|
}
|
||||||
return "[[" + target + "|" + label + "]]"
|
return "[[" + target + "|" + label + "]]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user