diff options
| author | Mitchell Riedstra <mitch@riedstra.dev> | 2021-02-15 15:31:37 -0500 |
|---|---|---|
| committer | Mitchell Riedstra <mitch@riedstra.dev> | 2021-02-15 15:32:05 -0500 |
| commit | fe9ec7a0b45c9fd23a615a8b95ade3e9c1ea2d12 (patch) | |
| tree | 80844a62d5d18b30862cfdc610aae88713fe97d9 /local | |
| parent | d83f4bca3f7026696a41225caac11807ed06fc2f (diff) | |
| download | go-website-0.0.12.tar.gz go-website-0.0.12.tar.xz | |
Another re-structure. Deleting code is wonderful.v0.0.12
Diffstat (limited to 'local')
| -rw-r--r-- | local/index.go | 71 | ||||
| -rw-r--r-- | local/page.go | 199 | ||||
| -rw-r--r-- | local/pagelist.go | 21 | ||||
| -rw-r--r-- | local/time.go | 23 |
4 files changed, 0 insertions, 314 deletions
diff --git a/local/index.go b/local/index.go deleted file mode 100644 index 7b821f6..0000000 --- a/local/index.go +++ /dev/null @@ -1,71 +0,0 @@ -package local - -import ( - "fmt" - "os" - "path/filepath" - "strings" - "time" -) - -var pageIndex map[string]PageList - -// RebuildIndex can be called in order to rebuild the entire website -// index -func (p *Page) RebuildIndex() error { - pageIndex = nil - _, err := p.Index() - return err -} - -// Index returns a map of all pages below the current Page's Path seperated -// into their respective tags If a Page has multiple tags it will be listed -// under each. -func (p *Page) Index() (map[string]PageList, error) { - if pageIndex != nil { - return pageIndex, nil - } - fmt.Fprintln(os.Stderr, "Rebuilding index...") - - out := make(map[string]PageList) - - var pageErr error - - filepath.Walk(filepath.Dir(p.path), - func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if !info.IsDir() && strings.HasSuffix(info.Name(), Suffix) { - - p2 := NewPage(strings.ReplaceAll(path, Suffix, "")) - err = p2.Read() - - if err != nil { - pageErr = err - fmt.Fprintln(os.Stderr, "Error encountered: ", err) - return err - } - - for tag, _ := range p2.Tags { - if _, ok := out[tag]; !ok { - out[tag] = []*Page{p2} - } else { - out[tag] = append(out[tag], p2) - } - } - - } - - return nil - }) - - pageIndex = out - - return out, nil -} - -func (p *Page) Time() time.Time { - return p.Date.Time -} diff --git a/local/page.go b/local/page.go deleted file mode 100644 index 0ccaf2e..0000000 --- a/local/page.go +++ /dev/null @@ -1,199 +0,0 @@ -// local implements the website backed by a local filesystem. -// -// Reading the base template off the disk, then any markdown files which are -// split into two sections by the DocumentSplit global variable. The first -// section is parsed as yaml to populate the Page struct. The second portion is -// markdown, first executed as part of the text/template then rendered by -// blackfriday. -// -// Usage: -// -// import ( -// "fmt" -// "os" -// site "riedstra.dev/mitch/go-website/local" -// ) -// // Where some/path.md exists -// p := site.NewPage("/some/path") -// // Dump the rendered HTML to stdout -// err := p.Render(os.Stdout) -// if err != nil { -// fmt.Fprintln(os.Stderr, err) -// } -package local - -import ( - "bufio" - "bytes" - "fmt" - "io" - "os" - "text/template" - - "github.com/russross/blackfriday" - "gopkg.in/yaml.v3" -) - -// Page should not be created directly as it will not set the interal path -// properly. Use NewPage instead. -// -// The exported fields can be filled in the yaml at the top of a page and -// utilized within. -type Page struct { - path string - Title string - Head string - Description string - // Tags to apply to the page in question. Useful for Index() - Tags map[string]interface{} - Date *PageTime - Published bool - Vars map[string]interface{} - markdown []byte -} - -// Global is meant to be supplied by external users of this package to populate -// globally accessable information across all of the templates accessiable via -// .Global care must be taken when utilizing this functionality -var Global interface{} - -// BaseTemplate can be adjusted to change the base template used in rendering -var BaseTemplate = "inc/base.html" - -// Suffix is applied to all pages for reading off of the disk -var Suffix = ".md" - -// DocumentSplit is used to split the .md files into yaml and markdown -var DocumentSplit = "|---\n" - -// NewPage returns a page struct with the path populated -func NewPage(pth string) *Page { - return &Page{path: pth} -} - -// NewPage Allow for the creation of a new page from the current page, does -// not inlcude any information about the current page. -func (p Page) NewPage(pth string) *Page { - return NewPage(pth) -} - -// Path gets the current path set on the struct for the page in question -// Useful if you're say iterating across tags to print out a list of -// relevant posts on a blog or so by topic. -func (p Page) Path() string { - return p.path -} - -// Global is specifically for use inside of a page markdown file or -// in a base template. This simply returns the package Global variable -func (p *Page) Global() interface{} { - return Global -} - -// SetVars Will set to `nil` if provided -func (p *Page) SetVars(vars map[string]interface{}) { - p.Vars = vars -} - -// Renders a page -func (p *Page) Render(wr io.Writer) error { - if err := p.Read(); err != nil { - return err - } - - t, err := template.ParseFiles(BaseTemplate) - if err != nil { - return err - } - - // Automatically pull from the yml file if applicable - if p.Head != "" { - t, err = t.Parse(` - {{define "head"}} - {{.RenderHead}} - {{end}} - `) - if err != nil { - return err - } - } - - return t.Execute(wr, p) -} - -func (p *Page) RenderHead() (string, error) { - buf := &bytes.Buffer{} - t, err := template.New("Head").Parse(p.Head) - if err != nil { - return "", err - } - err = t.Execute(buf, p) - if err != nil { - return "", err - } - return string(buf.Bytes()), nil -} - -// Reads in the special markdown file format for the website off of the disk -func (p *Page) Read() error { - yamlBuf := bytes.NewBuffer(nil) - markdownBuf := bytes.NewBuffer(nil) - - fh, err := os.Open(p.path + Suffix) - if err != nil { - return err - } - defer fh.Close() - rdr := bufio.NewReader(fh) - - // Read in the file and split between markdown and yaml buffers - yamlDone := false - for { - - bytes, err := rdr.ReadBytes('\n') - if err == io.EOF { - break - } else if err != nil { - return err - } - - // Is this the line where we stop reading the yaml and start reading markdown? - if DocumentSplit == string(bytes) && !yamlDone { - yamlDone = true - continue - } - - if !yamlDone { - yamlBuf.Write(bytes) - } else { - markdownBuf.Write(bytes) - } - } - - err = yaml.Unmarshal(yamlBuf.Bytes(), p) - if err != nil { - return err - } - - p.markdown = markdownBuf.Bytes() - return nil -} - -func (p *Page) RenderBody() (string, error) { - buf := &bytes.Buffer{} - t, err := template.New("Body").Parse(string(p.markdown)) - if err != nil { - return "", err - } - - err = t.Execute(buf, p) - if err != nil { - return "", err - } - - return string(blackfriday.Run(buf.Bytes())), nil -} - -func (p Page) String() string { - return fmt.Sprintf("Page: %s", p.path) -} diff --git a/local/pagelist.go b/local/pagelist.go deleted file mode 100644 index ea76117..0000000 --- a/local/pagelist.go +++ /dev/null @@ -1,21 +0,0 @@ -package local - -import ( - "sort" -) - -type PageList []*Page - -func (p PageList) SortDate() PageList { - sort.Slice(p, func(i, j int) bool { - return p[i].Time().After(p[j].Time()) - }) - return p -} - -func (p PageList) SortDateReverse() PageList { - sort.Slice(p, func(i, j int) bool { - return p[i].Time().Before(p[j].Time()) - }) - return p -} diff --git a/local/time.go b/local/time.go deleted file mode 100644 index 27efc88..0000000 --- a/local/time.go +++ /dev/null @@ -1,23 +0,0 @@ -package local - -import ( - "gopkg.in/yaml.v3" - "time" -) - -type PageTime struct { - time.Time -} - -// TimeFormat is the format string used when unmarshaling the time -// from the yaml information. -var TimeFormat = "01.02.2006 15:04:05 MST" - -func (pt *PageTime) UnmarshalYAML(n *yaml.Node) error { - t, err := time.Parse(TimeFormat, n.Value) - if err != nil { - return err - } - pt.Time = t - return nil -} |
