Fix Wiki Deploy Post Titles
This commit is contained in:
@@ -238,6 +238,7 @@ func planNodeBBDeploy(pages map[string]wikiDeployPage, manifest wikiDeployManife
|
|||||||
return nil, result, next, fmt.Errorf("wiki page %q requires --category %s=<cid> for creation", pageID, page.Namespace)
|
return nil, result, next, fmt.Errorf("wiki page %q requires --category %s=<cid> for creation", pageID, page.Namespace)
|
||||||
}
|
}
|
||||||
result.Created++
|
result.Created++
|
||||||
|
page.Title = nodeBBTopicTitle(page)
|
||||||
plans = append(plans, wikiDeployPlan{Page: page, Entry: entry, Action: "create", Content: page.Content})
|
plans = append(plans, wikiDeployPlan{Page: page, Entry: entry, Action: "create", Content: page.Content})
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -347,6 +348,22 @@ func extractHTMLTitle(content, fallback string) string {
|
|||||||
return namespaceTitle(parts[len(parts)-1])
|
return namespaceTitle(parts[len(parts)-1])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func nodeBBTopicTitle(page wikiDeployPage) string {
|
||||||
|
title := strings.TrimSpace(page.Title)
|
||||||
|
if len([]rune(title)) >= 5 {
|
||||||
|
return title
|
||||||
|
}
|
||||||
|
namespace := strings.TrimSpace(namespaceTitle(page.Namespace))
|
||||||
|
if namespace == "" {
|
||||||
|
namespace = "Wiki"
|
||||||
|
}
|
||||||
|
if title == "" {
|
||||||
|
parts := strings.Split(page.PageID, ":")
|
||||||
|
title = namespaceTitle(parts[len(parts)-1])
|
||||||
|
}
|
||||||
|
return namespace + ": " + title
|
||||||
|
}
|
||||||
|
|
||||||
func stripSimpleTags(text string) string {
|
func stripSimpleTags(text string) string {
|
||||||
var out strings.Builder
|
var out strings.Builder
|
||||||
inTag := false
|
inTag := false
|
||||||
|
|||||||
@@ -140,3 +140,57 @@ func TestDeployWikiCreatesNodeBBTopicAndWritesManifest(t *testing.T) {
|
|||||||
t.Fatalf("unexpected manifest entry: %#v", entry)
|
t.Fatalf("unexpected manifest entry: %#v", entry)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDeployWikiCreatesNodeBBTopicWithFallbackForShortTitle(t *testing.T) {
|
||||||
|
root := t.TempDir()
|
||||||
|
sourceDir := filepath.Join(root, "pages")
|
||||||
|
if err := os.MkdirAll(filepath.Join(sourceDir, "spells"), 0755); err != nil {
|
||||||
|
t.Fatalf("create source dir: %v", err)
|
||||||
|
}
|
||||||
|
generated := "<!-- sow-topdata-wiki:managed:start -->\n<h1>Aid</h1>\n<p>Generated spell page</p>\n<!-- sow-topdata-wiki:managed:end -->\n"
|
||||||
|
if err := os.WriteFile(filepath.Join(sourceDir, "spells", "aid.html"), []byte(generated), 0644); err != nil {
|
||||||
|
t.Fatalf("write source page: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.Method != http.MethodPost || r.URL.Path != "/api/v3/topics" {
|
||||||
|
t.Fatalf("unexpected request %s %s", r.Method, r.URL.Path)
|
||||||
|
}
|
||||||
|
var req struct {
|
||||||
|
Title string `json:"title"`
|
||||||
|
Content string `json:"content"`
|
||||||
|
}
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
t.Fatalf("decode create request: %v", err)
|
||||||
|
}
|
||||||
|
if req.Title != "Spells: Aid" {
|
||||||
|
t.Fatalf("expected fallback title, got %q", req.Title)
|
||||||
|
}
|
||||||
|
if req.Content != generated {
|
||||||
|
t.Fatalf("expected page body to keep short h1 unchanged:\n%s", req.Content)
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
_ = json.NewEncoder(w).Encode(map[string]any{
|
||||||
|
"response": map[string]any{
|
||||||
|
"tid": 11,
|
||||||
|
"mainPost": map[string]any{
|
||||||
|
"pid": 42,
|
||||||
|
"tid": 11,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
_, err := DeployWikiWithOptions(&project.Project{}, DeployWikiOptions{
|
||||||
|
SourceDir: sourceDir,
|
||||||
|
Endpoint: server.URL,
|
||||||
|
Token: "nodebb-token",
|
||||||
|
ManifestPath: filepath.Join(root, "deploy-manifest.json"),
|
||||||
|
CategoryIDs: map[string]int{"spells": 5},
|
||||||
|
AllowCreates: true,
|
||||||
|
}, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("DeployWikiWithOptions create failed: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -833,7 +833,11 @@ func (ctx *wikiContext) renderReferenceList(values []any) string {
|
|||||||
|
|
||||||
func (ctx *wikiContext) resolveRowName(category string, row map[string]any) string {
|
func (ctx *wikiContext) resolveRowName(category string, row map[string]any) string {
|
||||||
spec := specForDataset(category)
|
spec := specForDataset(category)
|
||||||
for _, field := range spec.NameFields {
|
nameFields := spec.NameFields
|
||||||
|
if category == "classes" {
|
||||||
|
nameFields = []string{"Name", "Plural", "Lower", "CLASS", "Label", "Short"}
|
||||||
|
}
|
||||||
|
for _, field := range nameFields {
|
||||||
if value, ok := lookupField(row, field); ok {
|
if value, ok := lookupField(row, field); ok {
|
||||||
if text := ctx.resolveTextValue(value, nil); text != "" {
|
if text := ctx.resolveTextValue(value, nil); text != "" {
|
||||||
return text
|
return text
|
||||||
|
|||||||
@@ -86,6 +86,17 @@ func TestBuildNativeGeneratesAndSkipsWikiPages(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWikiClassNamePrefersFullNameInsteadOfShortCode(t *testing.T) {
|
||||||
|
ctx := &wikiContext{}
|
||||||
|
got := ctx.resolveRowName("classes", map[string]any{
|
||||||
|
"Name": map[string]any{"tlk": map[string]any{"key": "classes:wizard.name", "text": "Wizard"}},
|
||||||
|
"Short": map[string]any{"tlk": map[string]any{"key": "classes:wizard.short", "text": "Wiz"}},
|
||||||
|
})
|
||||||
|
if got != "Wizard" {
|
||||||
|
t.Fatalf("expected full class name, got %q", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestBuildAndPackageBuildsWikiOnlyWhenRequested(t *testing.T) {
|
func TestBuildAndPackageBuildsWikiOnlyWhenRequested(t *testing.T) {
|
||||||
root := testProjectRoot(t)
|
root := testProjectRoot(t)
|
||||||
mkdirAll(t, filepath.Join(root, "topdata", "data", "skills"))
|
mkdirAll(t, filepath.Join(root, "topdata", "data", "skills"))
|
||||||
|
|||||||
Reference in New Issue
Block a user