M builder.go => builder.go +6 -0
@@ 145,6 145,12 @@ func Build(root string, args *Args) (*Config, error) {
return cfg, err
}
+ // 8b. Invoke the search indexer
+ err = fb.HandleSearchIndex(&mainSection)
+ if err != nil {
+ return cfg, err
+ }
+
// 9. Analyse the file index for broken content
for _, link := range index.FoundLinks {
if strings.HasPrefix(link.PointsTo, "/") {
M domain/types.go => domain/types.go +2 -2
@@ 34,7 34,7 @@ type Feed struct {
RelativePath string
Slug string
Permalink string
- Section *Section
+ Section *Section `json:"-"`
Title string
Description string
@@ 51,7 51,7 @@ type Page struct {
Path string // Absolute path
RelativePath string // Relative path, relative to the content root
Permalink string
- Section *Section // The section the page is in
+ Section *Section `json:"-"` // The section the page is in
Title string
Summary string
M handler.go => handler.go +118 -0
@@ 3,6 3,7 @@ package main
import (
"bytes"
"context"
+ "encoding/json"
"fmt"
"io"
"net/url"
@@ 398,3 399,120 @@ func (f *FsBuilder) HandleBuildMetadata() error {
})
return err
}
+
+func (fb *FsBuilder) HandleSearchIndex(entry *domain.Section) error {
+ timeoutCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+
+ domain.L.Debug("Executing search index building")
+ cmd := exec.CommandContext(timeoutCtx, "tee", "nl.json")
+ writer, err := cmd.StdinPipe()
+ if err != nil {
+ return err
+ }
+ err = cmd.Start()
+ if err != nil {
+ return err
+ }
+
+ type BullshitToMarshal struct {
+ Kind string
+ Value interface{}
+ }
+
+ sectionsToBrowse := []*domain.Section{entry}
+browser:
+ for {
+ var section *domain.Section
+ var rest []*domain.Section
+ if len(sectionsToBrowse) > 0 {
+ section = sectionsToBrowse[0]
+ }
+ if len(sectionsToBrowse) > 1 {
+ rest = sectionsToBrowse[1:]
+ }
+ if section == nil {
+ break browser
+ }
+ sectionsToBrowse = append(rest, section.Subsections...)
+
+ if section.Page != nil {
+ encoded, err := json.Marshal(BullshitToMarshal{Kind: "page", Value: section.Page})
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write(encoded)
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write([]byte{'\n'})
+ if err != nil {
+ return err
+ }
+ }
+
+ for _, page := range section.Pages {
+ encoded, err := json.Marshal(BullshitToMarshal{Kind: "page", Value: page})
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write(encoded)
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write([]byte{'\n'})
+ if err != nil {
+ return err
+ }
+ }
+
+ for _, page := range section.Feeds {
+ encoded, err := json.Marshal(BullshitToMarshal{Kind: "feed", Value: page})
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write(encoded)
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write([]byte{'\n'})
+ if err != nil {
+ return err
+ }
+ }
+
+ for _, page := range section.Media {
+ encoded, err := json.Marshal(BullshitToMarshal{Kind: "media", Value: page})
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write(encoded)
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write([]byte{'\n'})
+ if err != nil {
+ return err
+ }
+ }
+
+ for _, page := range section.Files {
+ encoded, err := json.Marshal(BullshitToMarshal{Kind: "file", Value: page})
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write(encoded)
+ if err != nil {
+ return err
+ }
+ _, err = writer.Write([]byte{'\n'})
+ if err != nil {
+ return err
+ }
+ }
+ }
+ writer.Close()
+
+ // Yes this is horrible. Let's hope i'll finish the refactor soon.
+ return cmd.Wait()
+}