Goodbye legacy DokuWiki translators...
This commit is contained in:
+19
-270
@@ -912,7 +912,7 @@ func (ctx *wikiContext) renderFacts(category, key string, row map[string]any) st
|
||||
lines = append(lines, formatFact("Item Class", stringValue(row, "ItemClass")))
|
||||
lines = append(lines, formatFact("Weapon Type", stringValue(row, "WeaponType")))
|
||||
lines = append(lines, formatFact("Required Feats", ctx.renderReferenceList(ctx.wikiReqFeats(row))))
|
||||
lines = append(lines, formatFact("Base Item Stats", toInlineDokuWiki(ctx.resolveTextValue(fieldValue(row, "BaseItemStatRef"), nil))))
|
||||
lines = append(lines, formatFact("Base Item Stats", ctx.resolveTextValue(fieldValue(row, "BaseItemStatRef"), nil)))
|
||||
case "classes":
|
||||
lines = append(lines, formatFact("Hit Die", "d"+stringValue(row, "HitDie")))
|
||||
lines = append(lines, formatFact("Skill Points", stringValue(row, "SkillPointBase")))
|
||||
@@ -1607,14 +1607,14 @@ func wikiNamespacePublicTitle(ctx *wikiContext, namespace string) string {
|
||||
}
|
||||
|
||||
func renderWikiNamespaceFragment(namespace string, summary map[string]any, ctx *wikiContext) string {
|
||||
return renderStatusTable(wikiNamespacePublicTitle(ctx, namespace), summary, "")
|
||||
return renderStatusTable(wikiNamespacePublicTitle(ctx, namespace)+" Namespace", summary, "")
|
||||
}
|
||||
|
||||
func renderWikiStatusReportPage(summaries map[string]map[string]any, namespaces []string, ctx *wikiContext) string {
|
||||
if ctx == nil {
|
||||
ctx = &wikiContext{}
|
||||
}
|
||||
lines := []string{"====== Wiki Status ======", "", "This page is auto-generated from builder source provenance.", ""}
|
||||
lines := []string{"<h2>Wiki Status</h2>", "<p>This page is auto-generated from builder source provenance.</p>"}
|
||||
for _, namespace := range namespaces {
|
||||
summary := summaries[namespace]
|
||||
title := wikiNamespacePublicTitle(ctx, namespace)
|
||||
@@ -1627,35 +1627,38 @@ func renderWikiStatusListingPage(title string, pageIDs []string, pageTitles map[
|
||||
if ctx == nil {
|
||||
ctx = &wikiContext{}
|
||||
}
|
||||
lines := []string{"====== " + title + " ======", ""}
|
||||
lines := []string{"<h2>" + html.EscapeString(title) + "</h2>"}
|
||||
if len(pageIDs) == 0 {
|
||||
lines = append(lines, "No matching generated pages.")
|
||||
lines = append(lines, "<p>No matching generated pages.</p>")
|
||||
} else {
|
||||
lines = append(lines, `<ul class="wiki-list wiki-status-list">`)
|
||||
for _, pageID := range pageIDs {
|
||||
title := pageTitles[pageID]
|
||||
if title == "" {
|
||||
title = pageID
|
||||
}
|
||||
namespace := strings.SplitN(pageID, ":", 2)[0]
|
||||
lines = append(lines, " * [["+ctx.publicWikiPath(namespace, title)+"|"+title+"]]")
|
||||
lines = append(lines, "<li>"+renderInlineHTML("[["+ctx.publicWikiPath(namespace, title)+"|"+title+"]]")+"</li>")
|
||||
}
|
||||
lines = append(lines, "</ul>")
|
||||
}
|
||||
return strings.Join(lines, "\n")
|
||||
}
|
||||
|
||||
func renderStatusTable(title string, summary map[string]any, namespaceLink string) string {
|
||||
rows := []string{
|
||||
"===== " + title + " =====",
|
||||
"",
|
||||
fmt.Sprintf("**Namespace Status:** %s\\\\", wikiStatusLabels[summary["status"].(string)]),
|
||||
fmt.Sprintf("**Generated Pages:** %d\\\\", summary["total"].(int)),
|
||||
fmt.Sprintf("**New:** %d\\\\", summary["new"].(int)),
|
||||
fmt.Sprintf("**Modified:** %d\\\\", summary["modified"].(int)),
|
||||
fmt.Sprintf("**Vanilla:** %d\\\\", summary["vanilla"].(int)),
|
||||
"<h2>" + html.EscapeString(title) + "</h2>",
|
||||
`<table class="wiki-facts wiki-status-summary"><tbody>`,
|
||||
"<tr><th>Namespace Status</th><td>" + html.EscapeString(wikiStatusLabels[summary["status"].(string)]) + "</td></tr>",
|
||||
fmt.Sprintf("<tr><th>Generated Pages</th><td>%d</td></tr>", summary["total"].(int)),
|
||||
fmt.Sprintf("<tr><th>New</th><td>%d</td></tr>", summary["new"].(int)),
|
||||
fmt.Sprintf("<tr><th>Modified</th><td>%d</td></tr>", summary["modified"].(int)),
|
||||
fmt.Sprintf("<tr><th>Vanilla</th><td>%d</td></tr>", summary["vanilla"].(int)),
|
||||
}
|
||||
if namespaceLink != "" {
|
||||
rows = append(rows, fmt.Sprintf("**Namespace:** %s", namespaceLink))
|
||||
rows = append(rows, "<tr><th>Namespace</th><td>"+renderInlineHTML(namespaceLink)+"</td></tr>")
|
||||
}
|
||||
rows = append(rows, "</tbody></table>")
|
||||
return strings.Join(rows, "\n")
|
||||
}
|
||||
|
||||
@@ -1973,61 +1976,13 @@ func formatFact(label, value string) string {
|
||||
return "**" + label + ":** " + value + `\\`
|
||||
}
|
||||
|
||||
func toInlineDokuWiki(text string) string {
|
||||
lines := strings.Split(strings.TrimSpace(text), "\n")
|
||||
for index, line := range lines {
|
||||
lines[index] = strings.TrimSpace(line)
|
||||
}
|
||||
return strings.Join(lines, `\\`)
|
||||
}
|
||||
|
||||
func toDokuWiki(text string) string {
|
||||
text = strings.ReplaceAll(strings.TrimSpace(text), "\r\n", "\n")
|
||||
if text == "" {
|
||||
return ""
|
||||
}
|
||||
lines := strings.Split(text, "\n")
|
||||
out := make([]string, 0, len(lines))
|
||||
for _, line := range lines {
|
||||
trimmed := strings.TrimSpace(line)
|
||||
switch {
|
||||
case trimmed == "":
|
||||
out = append(out, "")
|
||||
case strings.HasPrefix(trimmed, "- "):
|
||||
out = append(out, " * "+strings.TrimSpace(strings.TrimPrefix(trimmed, "- ")))
|
||||
default:
|
||||
out = append(out, line)
|
||||
}
|
||||
}
|
||||
return strings.Join(out, "\n")
|
||||
}
|
||||
|
||||
func renderNodeBBManagedMarkdown(pageID, dokuText string) string {
|
||||
generated, notes := splitDokuWikiNotes(dokuText)
|
||||
body := dokuWikiToNodeBBMarkdown(generated)
|
||||
parts := []string{
|
||||
"[//]: # (sow-topdata-wiki:page=" + pageID + ")",
|
||||
"[//]: # (sow-topdata-wiki:managed:start)",
|
||||
body,
|
||||
"[//]: # (sow-topdata-wiki:managed:end)",
|
||||
}
|
||||
notesMarkdown := dokuWikiToNodeBBMarkdown("===== Notes =====\n" + notes)
|
||||
if strings.TrimSpace(notesMarkdown) != "" {
|
||||
parts = append(parts, notesMarkdown)
|
||||
}
|
||||
return ensureTrailingNewline(strings.Join(parts, "\n"))
|
||||
}
|
||||
|
||||
func renderNodeBBManagedHTML(pageID, sourceText string, manualSections []wikiManualSection) string {
|
||||
body := sourceText
|
||||
if !strings.Contains(sourceText, "<h1") {
|
||||
body = dokuWikiToNodeBBHTML(sourceText)
|
||||
}
|
||||
body := strings.TrimSpace(sourceText)
|
||||
hash := computeManagedHash(body)
|
||||
parts := []string{
|
||||
"<!-- sow-topdata-wiki:page=" + pageID + " -->",
|
||||
"<!-- sow-topdata-wiki:managed:start hash=\"sha256:" + hash + "\" -->",
|
||||
strings.TrimSpace(body),
|
||||
body,
|
||||
"<!-- sow-topdata-wiki:managed:end -->",
|
||||
}
|
||||
renderedSections := extractManualRegions(body)
|
||||
@@ -2042,104 +1997,6 @@ func renderNodeBBManagedHTML(pageID, sourceText string, manualSections []wikiMan
|
||||
return ensureTrailingNewline(strings.Join(parts, "\n"))
|
||||
}
|
||||
|
||||
func dokuWikiToNodeBBHTML(text string) string {
|
||||
text = strings.ReplaceAll(strings.TrimSpace(text), "\r\n", "\n")
|
||||
if text == "" {
|
||||
return ""
|
||||
}
|
||||
lines := strings.Split(text, "\n")
|
||||
var out []string
|
||||
var paragraph []string
|
||||
var list []string
|
||||
var tableRows []string
|
||||
|
||||
flushParagraph := func() {
|
||||
if len(paragraph) == 0 {
|
||||
return
|
||||
}
|
||||
out = append(out, "<p>"+renderInlineHTML(strings.Join(paragraph, " "))+"</p>")
|
||||
paragraph = nil
|
||||
}
|
||||
flushList := func() {
|
||||
if len(list) == 0 {
|
||||
return
|
||||
}
|
||||
out = append(out, "<ul>")
|
||||
for _, item := range list {
|
||||
out = append(out, "<li>"+renderInlineHTML(item)+"</li>")
|
||||
}
|
||||
out = append(out, "</ul>")
|
||||
list = nil
|
||||
}
|
||||
flushTable := func() {
|
||||
if len(tableRows) == 0 {
|
||||
return
|
||||
}
|
||||
out = append(out, "<table><tbody>")
|
||||
out = append(out, tableRows...)
|
||||
out = append(out, "</tbody></table>")
|
||||
tableRows = nil
|
||||
}
|
||||
flushBlocks := func() {
|
||||
flushParagraph()
|
||||
flushList()
|
||||
flushTable()
|
||||
}
|
||||
|
||||
for _, line := range lines {
|
||||
trimmed := strings.TrimSpace(line)
|
||||
if trimmed == "" {
|
||||
flushBlocks()
|
||||
continue
|
||||
}
|
||||
if strings.HasPrefix(trimmed, "<p class=\"wiki-callout") {
|
||||
flushBlocks()
|
||||
out = append(out, trimmed)
|
||||
continue
|
||||
}
|
||||
if heading, level, ok := parseDokuHeading(trimmed); ok {
|
||||
flushBlocks()
|
||||
out = append(out, fmt.Sprintf("<h%d>%s</h%d>", level, renderInlineHTML(heading), level))
|
||||
continue
|
||||
}
|
||||
if strings.HasPrefix(trimmed, " * ") || strings.HasPrefix(trimmed, "* ") || strings.HasPrefix(trimmed, "- ") {
|
||||
flushParagraph()
|
||||
flushTable()
|
||||
item := strings.TrimSpace(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(trimmed, " * "), "* "), "- "))
|
||||
list = append(list, item)
|
||||
continue
|
||||
}
|
||||
if label, value, ok := parseFactLine(trimmed); ok {
|
||||
flushParagraph()
|
||||
flushList()
|
||||
tableRows = append(tableRows, "<tr><th>"+html.EscapeString(label)+"</th><td>"+renderInlineHTML(value)+"</td></tr>")
|
||||
continue
|
||||
}
|
||||
flushList()
|
||||
flushTable()
|
||||
for _, part := range strings.Split(trimmed, `\\`) {
|
||||
part = strings.TrimSpace(part)
|
||||
if part != "" {
|
||||
paragraph = append(paragraph, part)
|
||||
}
|
||||
}
|
||||
}
|
||||
flushBlocks()
|
||||
return strings.TrimSpace(strings.Join(out, "\n"))
|
||||
}
|
||||
|
||||
func parseFactLine(line string) (string, string, bool) {
|
||||
if !strings.HasPrefix(line, "**") {
|
||||
return "", "", false
|
||||
}
|
||||
rest := strings.TrimPrefix(line, "**")
|
||||
label, value, ok := strings.Cut(rest, ":**")
|
||||
if !ok {
|
||||
return "", "", false
|
||||
}
|
||||
return strings.TrimSpace(label), strings.Trim(strings.TrimSpace(value), `\`), true
|
||||
}
|
||||
|
||||
func renderInlineHTML(text string) string {
|
||||
var out strings.Builder
|
||||
for {
|
||||
@@ -2161,114 +2018,6 @@ func renderInlineHTML(text string) string {
|
||||
return out.String()
|
||||
}
|
||||
|
||||
func splitDokuWikiNotes(text string) (string, string) {
|
||||
const delimiter = "===== Notes ====="
|
||||
before, after, ok := strings.Cut(text, delimiter)
|
||||
if !ok {
|
||||
return text, ""
|
||||
}
|
||||
return before, after
|
||||
}
|
||||
|
||||
func dokuWikiToNodeBBMarkdown(text string) string {
|
||||
text = strings.ReplaceAll(strings.TrimSpace(text), "\r\n", "\n")
|
||||
if text == "" {
|
||||
return ""
|
||||
}
|
||||
|
||||
var out []string
|
||||
inNotice := false
|
||||
|
||||
closeNotice := func() {
|
||||
if inNotice {
|
||||
inNotice = false
|
||||
if len(out) > 0 && strings.TrimSpace(out[len(out)-1]) != "" {
|
||||
out = append(out, "")
|
||||
}
|
||||
}
|
||||
}
|
||||
appendBlank := func() {
|
||||
if len(out) == 0 || strings.TrimSpace(out[len(out)-1]) == "" {
|
||||
return
|
||||
}
|
||||
out = append(out, "")
|
||||
}
|
||||
|
||||
for _, line := range strings.Split(text, "\n") {
|
||||
trimmed := strings.TrimSpace(line)
|
||||
if trimmed == "" {
|
||||
appendBlank()
|
||||
continue
|
||||
}
|
||||
if strings.HasPrefix(trimmed, "<WRAP") {
|
||||
appendBlank()
|
||||
inNotice = true
|
||||
continue
|
||||
}
|
||||
if trimmed == "</WRAP>" {
|
||||
closeNotice()
|
||||
continue
|
||||
}
|
||||
if heading, level, ok := parseDokuHeading(trimmed); ok {
|
||||
closeNotice()
|
||||
appendBlank()
|
||||
out = append(out, strings.Repeat("#", level)+" "+renderInlineNodeBBMarkdown(heading))
|
||||
out = append(out, "")
|
||||
continue
|
||||
}
|
||||
if strings.HasPrefix(trimmed, " * ") || strings.HasPrefix(trimmed, "* ") || strings.HasPrefix(trimmed, "- ") {
|
||||
item := strings.TrimSpace(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(trimmed, " * "), "* "), "- "))
|
||||
prefix := "- "
|
||||
if inNotice {
|
||||
prefix = "> - "
|
||||
}
|
||||
out = append(out, prefix+renderInlineNodeBBMarkdown(item))
|
||||
continue
|
||||
}
|
||||
|
||||
parts := strings.Split(trimmed, `\\`)
|
||||
for _, part := range parts {
|
||||
part = strings.TrimSpace(part)
|
||||
if part != "" {
|
||||
prefix := ""
|
||||
if inNotice {
|
||||
prefix = "> "
|
||||
}
|
||||
out = append(out, prefix+renderInlineNodeBBMarkdown(part))
|
||||
}
|
||||
}
|
||||
}
|
||||
closeNotice()
|
||||
return strings.TrimSpace(strings.Join(out, "\n"))
|
||||
}
|
||||
|
||||
func parseDokuHeading(line string) (string, int, bool) {
|
||||
if !strings.HasPrefix(line, "=") || !strings.HasSuffix(line, "=") {
|
||||
return "", 0, false
|
||||
}
|
||||
left := len(line) - len(strings.TrimLeft(line, "="))
|
||||
right := len(line) - len(strings.TrimRight(line, "="))
|
||||
if left == 0 || left != right {
|
||||
return "", 0, false
|
||||
}
|
||||
title := strings.TrimSpace(line[left : len(line)-right])
|
||||
if title == "" {
|
||||
return "", 0, false
|
||||
}
|
||||
level := 7 - left
|
||||
if level < 1 {
|
||||
level = 1
|
||||
}
|
||||
if level > 6 {
|
||||
level = 6
|
||||
}
|
||||
return title, level, true
|
||||
}
|
||||
|
||||
func renderInlineNodeBBMarkdown(text string) string {
|
||||
return renderWikiLinks(text)
|
||||
}
|
||||
|
||||
func renderWikiLinks(text string) string {
|
||||
var out strings.Builder
|
||||
for {
|
||||
|
||||
Reference in New Issue
Block a user