feat: add sb front matter
This commit is contained in:
+12
-3
@@ -427,11 +427,20 @@ func indexProse(sugar *zap.SugaredLogger, tsClient *typesense.Client, mongoDB *r
|
|||||||
content = joinParagraphs(strs)
|
content = joinParagraphs(strs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build URL: KB uses /books/kb/{volume}/{slug}, others use /books/{book}/{slug}
|
// Build URL: KB uses /books/kb/{volume}/{slug}; chapter summaries map
|
||||||
|
// their "<lila>-<n>" slug to the chapter landing page; others use
|
||||||
|
// /books/{book}/{slug}.
|
||||||
var proseURL string
|
var proseURL string
|
||||||
if book == "kb" {
|
switch {
|
||||||
|
case book == "kb":
|
||||||
proseURL = fmt.Sprintf("/books/kb/%d/%s", volume, slug)
|
proseURL = fmt.Sprintf("/books/kb/%d/%s", volume, slug)
|
||||||
} else {
|
case docType == "chapter-summary":
|
||||||
|
if parts := strings.SplitN(slug, "-", 2); len(parts) == 2 {
|
||||||
|
proseURL = fmt.Sprintf("/books/%s/%s/%s", book, parts[0], parts[1])
|
||||||
|
} else {
|
||||||
|
proseURL = fmt.Sprintf("/books/%s/%s", book, slug)
|
||||||
|
}
|
||||||
|
default:
|
||||||
proseURL = fmt.Sprintf("/books/%s/%s", book, slug)
|
proseURL = fmt.Sprintf("/books/%s/%s", book, slug)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+24
-13
@@ -35,14 +35,17 @@ type introSegment struct {
|
|||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Book string `json:"book"`
|
Book string `json:"book"`
|
||||||
Volume int `json:"volume"`
|
Volume int `json:"volume"`
|
||||||
|
Chapter int `json:"chapter"`
|
||||||
Order int `json:"order"`
|
Order int `json:"order"`
|
||||||
Paragraphs []string `json:"paragraphs"`
|
Paragraphs []string `json:"paragraphs"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
book := flag.String("book", "", "book code (e.g. bg, cc) — required")
|
book := flag.String("book", "", "book code (e.g. bg, cc) — required")
|
||||||
dir := flag.String("dir", "", "directory of intro-segment JSON files "+
|
segType := flag.String("type", "intro-segment",
|
||||||
"(default: ../extractor/jsons/books/<book>/intro)")
|
"prose_chapters type to seed (intro-segment | chapter-summary)")
|
||||||
|
dir := flag.String("dir", "", "directory of segment JSON files "+
|
||||||
|
"(default: ../extractor/jsons/books/<book>/<intro|chapter-summaries>)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if *book == "" {
|
if *book == "" {
|
||||||
@@ -51,7 +54,11 @@ func main() {
|
|||||||
}
|
}
|
||||||
segDir := *dir
|
segDir := *dir
|
||||||
if segDir == "" {
|
if segDir == "" {
|
||||||
segDir = filepath.Join("..", "extractor", "jsons", "books", *book, "intro")
|
sub := "intro"
|
||||||
|
if *segType == "chapter-summary" {
|
||||||
|
sub = "chapter-summaries"
|
||||||
|
}
|
||||||
|
segDir = filepath.Join("..", "extractor", "jsons", "books", *book, sub)
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg, err := config.Load()
|
cfg, err := config.Load()
|
||||||
@@ -93,7 +100,7 @@ func main() {
|
|||||||
if err := json.Unmarshal(raw, &seg); err != nil {
|
if err := json.Unmarshal(raw, &seg); err != nil {
|
||||||
sugar.Fatalf("parse %s: %v", name, err)
|
sugar.Fatalf("parse %s: %v", name, err)
|
||||||
}
|
}
|
||||||
if seg.Book != *book || seg.Type != "intro-segment" {
|
if seg.Book != *book || seg.Type != *segType {
|
||||||
sugar.Warnf("skipping %s (book=%q type=%q)", name, seg.Book, seg.Type)
|
sugar.Warnf("skipping %s (book=%q type=%q)", name, seg.Book, seg.Type)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -101,7 +108,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(segments) == 0 {
|
if len(segments) == 0 {
|
||||||
sugar.Fatalf("no %s intro-segments found in %s", *book, segDir)
|
sugar.Fatalf("no %s %s docs found in %s", *book, *segType, segDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
@@ -111,22 +118,26 @@ func main() {
|
|||||||
|
|
||||||
del, err := col.DeleteMany(ctx, map[string]any{
|
del, err := col.DeleteMany(ctx, map[string]any{
|
||||||
"book": *book,
|
"book": *book,
|
||||||
"type": "intro-segment",
|
"type": *segType,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sugar.Fatalf("delete existing %s intro-segments: %v", *book, err)
|
sugar.Fatalf("delete existing %s %s docs: %v", *book, *segType, err)
|
||||||
}
|
}
|
||||||
sugar.Infof("removed %d existing %s intro-segment(s)", del.DeletedCount, *book)
|
sugar.Infof("removed %d existing %s %s doc(s)", del.DeletedCount, *book, *segType)
|
||||||
|
|
||||||
docs := make([]any, 0, len(segments))
|
docs := make([]any, 0, len(segments))
|
||||||
for _, seg := range segments {
|
for _, seg := range segments {
|
||||||
// chapter is null for intro-segments (matches the ProseChapterDoc shape).
|
// chapter is null unless the segment carries one (chapter-summaries do).
|
||||||
|
var chapter any
|
||||||
|
if seg.Chapter > 0 {
|
||||||
|
chapter = seg.Chapter
|
||||||
|
}
|
||||||
docs = append(docs, map[string]any{
|
docs = append(docs, map[string]any{
|
||||||
"book": *book,
|
"book": *book,
|
||||||
"volume": 0,
|
"volume": 0,
|
||||||
"chapter": nil,
|
"chapter": chapter,
|
||||||
"title": seg.Title,
|
"title": seg.Title,
|
||||||
"type": "intro-segment",
|
"type": *segType,
|
||||||
"slug": seg.Slug,
|
"slug": seg.Slug,
|
||||||
"order": seg.Order,
|
"order": seg.Order,
|
||||||
"paragraphs": seg.Paragraphs,
|
"paragraphs": seg.Paragraphs,
|
||||||
@@ -136,7 +147,7 @@ func main() {
|
|||||||
|
|
||||||
res, err := col.InsertMany(ctx, docs)
|
res, err := col.InsertMany(ctx, docs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sugar.Fatalf("insert %s intro-segments: %v", *book, err)
|
sugar.Fatalf("insert %s %s docs: %v", *book, *segType, err)
|
||||||
}
|
}
|
||||||
sugar.Infof("inserted %d %s intro-segment(s)", len(res.InsertedIDs), *book)
|
sugar.Infof("inserted %d %s %s doc(s)", len(res.InsertedIDs), *book, *segType)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user