feat(pipeline): per-wing sources, shared concepts/entities, one slug one page (#208)
With Config.Wing a source goes to wiki/<wing>/sources/ (wing/hall frontmatter); concepts and entities stay in the shared wiki/concepts and wiki/entities, so an entity cited from two wings is ONE page with both sources (the per-wing facts/ layout duplicated it). A source slug already used anywhere but its own wing's sources/ is refused (slug is the graph identity). wiki.FindSlug added. Mutation-checked: collision guard, shared inventory, per-wing source path. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,9 +17,11 @@ func BuildPages(rawPages []RawPage, sourceSlug, date string) ([]wiki.Page, []str
|
||||
return BuildPagesIn("", rawPages, sourceSlug, date)
|
||||
}
|
||||
|
||||
// BuildPagesIn is BuildPages for a wing: sources go to wiki/<wing>/sources/,
|
||||
// concepts and entities to wiki/<wing>/facts/ with `kind:` recording which.
|
||||
// An empty wing is the retired wiki/{sources,concepts,entities}/ layout.
|
||||
// BuildPagesIn is BuildPages for a wing: a source goes to wiki/<wing>/sources/
|
||||
// with wing/hall frontmatter. Concepts and entities stay in the shared
|
||||
// wiki/concepts/ and wiki/entities/, since their slug is the graph's global
|
||||
// identity and they are cited from many wings. An empty wing is the retired
|
||||
// layout for sources too.
|
||||
func BuildPagesIn(wing string, rawPages []RawPage, sourceSlug, date string) ([]wiki.Page, []string) {
|
||||
out := make([]wiki.Page, 0, len(rawPages))
|
||||
var warnings []string
|
||||
@@ -66,20 +68,13 @@ func buildPage(rp RawPage, sourceSlug, date, wing string) wiki.Page {
|
||||
dir = "wiki/" + rp.Type
|
||||
}
|
||||
|
||||
hall := ""
|
||||
if wing != "" {
|
||||
switch rp.Type {
|
||||
case "source":
|
||||
hall = "sources"
|
||||
default:
|
||||
hall = "facts"
|
||||
}
|
||||
dir = "wiki/" + wing + "/" + hall
|
||||
if wing != "" && rp.Type == "source" {
|
||||
dir = "wiki/" + wing + "/sources"
|
||||
}
|
||||
path := dir + "/" + slug + ".md"
|
||||
fm := buildFrontmatter(rp, date)
|
||||
if wing != "" {
|
||||
fm = addWingFrontmatter(fm, wing, hall, rp.Type)
|
||||
if wing != "" && rp.Type == "source" {
|
||||
fm = addWingFrontmatter(fm, wing, "sources")
|
||||
}
|
||||
|
||||
return wiki.Page{
|
||||
@@ -142,14 +137,10 @@ func buildFrontmatter(rp RawPage, date string) string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// addWingFrontmatter inserts wing/hall (and kind for facts pages) right after
|
||||
// the opening fence of an already-built frontmatter block.
|
||||
func addWingFrontmatter(fm, wing, hall, rpType string) string {
|
||||
extra := "wing: " + wing + "\nhall: " + hall + "\n"
|
||||
if hall == "facts" {
|
||||
extra += "kind: " + rpType + "\n"
|
||||
}
|
||||
return strings.Replace(fm, "---\n", "---\n"+extra, 1)
|
||||
// addWingFrontmatter inserts wing/hall right after the opening fence of an
|
||||
// already-built frontmatter block.
|
||||
func addWingFrontmatter(fm, wing, hall string) string {
|
||||
return strings.Replace(fm, "---\n", "---\nwing: "+wing+"\nhall: "+hall+"\n", 1)
|
||||
}
|
||||
|
||||
func yamlScalar(s string) string {
|
||||
|
||||
Reference in New Issue
Block a user