diff --git a/cmd/anna/anna.go b/cmd/anna/anna.go index 0db0eec..b83b9e6 100644 --- a/cmd/anna/anna.go +++ b/cmd/anna/anna.go @@ -74,4 +74,5 @@ func (cmd *Cmd) VanillaRender() { e.RenderUserDefinedPages(helpers.SiteDataPath, templ) e.RenderTags(helpers.SiteDataPath, templ) + cmd.VanillaNoteRender(p.LayoutConfig) } diff --git a/cmd/anna/notes.go b/cmd/anna/notes.go index 5777d35..3e1054c 100644 --- a/cmd/anna/notes.go +++ b/cmd/anna/notes.go @@ -6,11 +6,12 @@ import ( "os" "github.com/acmpesuecc/anna/pkg/helpers" + "github.com/acmpesuecc/anna/pkg/parser" zettel_engine "github.com/acmpesuecc/anna/pkg/zettel/engine" zettel_parser "github.com/acmpesuecc/anna/pkg/zettel/parser" ) -func (cmd *Cmd) VanillaNoteRender() { +func (cmd *Cmd) VanillaNoteRender(LayoutConfig parser.LayoutConfig) { p := zettel_parser.Parser{ ErrorLogger: log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile), } @@ -18,6 +19,7 @@ func (cmd *Cmd) VanillaNoteRender() { p.NotesMergedData.LinkStore = make(map[template.URL][]*zettel_parser.Note) fileSystem := os.DirFS(helpers.SiteDataPath + "content/notes") + p.Layout = LayoutConfig p.ParseNotesDir(helpers.SiteDataPath+"content/notes/", fileSystem) e := zettel_engine.Engine{ @@ -38,5 +40,6 @@ func (cmd *Cmd) VanillaNoteRender() { } e.GenerateLinkStore() - e.RenderUserNotes() + e.RenderUserNotes(helpers.SiteDataPath, templ) + e.GenerateRootNote(helpers.SiteDataPath, templ) } diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index db7c7e9..879b795 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -84,7 +84,7 @@ type Parser struct { func (p *Parser) ParseMDDir(baseDirPath string, baseDirFS fs.FS) { fs.WalkDir(baseDirFS, ".", func(path string, dir fs.DirEntry, err error) error { - if path != "." { + if path != "." && !strings.Contains(path, "notes") { if dir.IsDir() { subDir := os.DirFS(path) p.ParseMDDir(path, subDir) diff --git a/pkg/zettel/engine/engine.go b/pkg/zettel/engine/engine.go index 87db18c..425c4ee 100644 --- a/pkg/zettel/engine/engine.go +++ b/pkg/zettel/engine/engine.go @@ -2,6 +2,7 @@ package zettel_engine import ( "bytes" + "fmt" "html/template" "log" "os" @@ -38,7 +39,7 @@ func (e *Engine) RenderNote(fileOutPath string, pagePath template.URL, templ *te var buffer bytes.Buffer // Storing the rendered HTML file to a buffer - err := templ.ExecuteTemplate(&buffer, "note", e.NotesMergedData) + err := templ.ExecuteTemplate(&buffer, "note", e.NotesMergedData.Notes[noteURL]) if err != nil { e.ErrorLogger.Fatal(err) } @@ -50,10 +51,67 @@ func (e *Engine) RenderNote(fileOutPath string, pagePath template.URL, templ *te } } -func (e *Engine) RenderUserNotes(){ +func (e *Engine) RenderUserNotes(fileOutPath string, templ *template.Template) { // Loop and render user notes + for _, Note := range e.NotesMergedData.Notes { + + //htmlFilePath, _ := strings.CutSuffix(string(noteURL), ".md") + //destinationPath := fileOutPath + "render/" + htmlFilePath + ".html" + fileInPath := strings.TrimSuffix(string(Note.CompleteURL), ".html") + + e.RenderNote(fileOutPath, template.URL(fileInPath), templ, Note.CompleteURL) + + } } -func (e *Engine) GenerateLinkStore(){ +func (e *Engine) RetrieveNotePointer(noteTitle string) *zettel_parser.Note { + for _, Note := range e.NotesMergedData.Notes { + if Note.Frontmatter.Title == noteTitle { + return &Note + } + } + return nil +} + +func (e *Engine) GenerateLinkStore() { // Populate the LinkStore map + for _, Note := range e.NotesMergedData.Notes { + for _, referencedNoteTitle := range Note.LinkedNoteTitles { + referencedNotePointer := e.RetrieveNotePointer(referencedNoteTitle) + if referencedNotePointer == nil { + e.ErrorLogger.Fatalf("ERR: Failed to get pointer to note %s\n", referencedNoteTitle) + } + e.NotesMergedData.LinkStore[Note.CompleteURL] = append( + e.NotesMergedData.LinkStore[Note.CompleteURL], + referencedNotePointer, + ) + } + } +} + +func (e *Engine) GenerateRootNote(fileOutPath string, templ *template.Template) { + // This is the page that acts as the root of all the + // notes part of the site + + // Creating a map of all head notes + + var buffer bytes.Buffer + + fmt.Println(e.NotesMergedData.LinkStore) + + /* + t := template.Must(templ.Funcs(template.FuncMap{ + "Deref": func(i *zettel_parser.Note) zettel_parser.Note { return *note }, + }).Parse(src)) + */ + + err := templ.ExecuteTemplate(&buffer, "root", e.NotesMergedData.LinkStore) + if err != nil { + e.ErrorLogger.Fatal(err) + } + + err = os.WriteFile(fileOutPath+"rendered/notes.html", buffer.Bytes(), 0666) + if err != nil { + e.ErrorLogger.Fatal(err) + } } diff --git a/pkg/zettel/parser/parser.go b/pkg/zettel/parser/parser.go index 4a010bb..4dd21df 100644 --- a/pkg/zettel/parser/parser.go +++ b/pkg/zettel/parser/parser.go @@ -2,6 +2,7 @@ package zettel_parser import ( "bytes" + "fmt" "html/template" "io/fs" "log" @@ -33,13 +34,15 @@ type Note struct { Frontmatter Frontmatter Body template.HTML LinkedNoteTitles []string - LayoutConfig parser.LayoutConfig + Layout parser.LayoutConfig } type Parser struct { // Holds the data of all of the notes NotesMergedData NotesMerged + Layout parser.LayoutConfig + // Common logger for all parser functions ErrorLogger *log.Logger } @@ -70,19 +73,21 @@ func (p *Parser) ParseNotesDir(baseDirPath string, baseDirFS fs.FS) { p.ErrorLogger.Fatal(err) } - fronmatter, body, parseSuccess := p.ParseNoteMarkdownContent(string(content)) + fronmatter, body, linkedNoteTitles, parseSuccess := p.ParseNoteMarkdownContent(string(content)) if parseSuccess { // ISSUE - p.AddNote(baseDirPath, fileName, fronmatter, body) + p.AddNote(baseDirPath, fileName, fronmatter, body, linkedNoteTitles) + // fmt.Println(fileName, linkedNoteTitles) } } } } return nil }) + p.ValidateNoteReferences() } -func (p *Parser) ParseNoteMarkdownContent(filecontent string) (Frontmatter, string, bool) { +func (p *Parser) ParseNoteMarkdownContent(filecontent string) (Frontmatter, string, []string, bool) { var parsedFrontmatter Frontmatter var markdown string /* @@ -97,14 +102,14 @@ func (p *Parser) ParseNoteMarkdownContent(filecontent string) (Frontmatter, stri frontmatterSplit := "" if len(splitContents) <= 1 { - return Frontmatter{}, "", false + return Frontmatter{}, "", []string{}, false } regex := regexp.MustCompile(`title(.*): (.*)`) match := regex.FindStringSubmatch(splitContents[1]) if match == nil { - return Frontmatter{}, "", false + return Frontmatter{}, "", []string{}, false } frontmatterSplit = splitContents[1] @@ -118,6 +123,50 @@ func (p *Parser) ParseNoteMarkdownContent(filecontent string) (Frontmatter, stri // TODO: // This section must replace the callouts with // the html url references + /* + REGEX: + using regex we need to identify for the references to other + notes of the following pattern + + [Note Title Name](/note/somefilename) + */ + + // DONT DELETE: re := regexp.MustCompile(`\[[^\]]*\]\(/notes/[^\]]*\.html\)`) + re := regexp.MustCompile(`\[\[[^\]]*\]\]`) + + re_sub := regexp.MustCompile(`\[.*\]`) + matches := re.FindAllString(markdown, -1) + fmt.Printf("%s : ", parsedFrontmatter.Title) + + linkedNoteTitles := []string{} + fmt.Printf("%s\n", matches) + + for _, match := range matches { + /* + Extracting the file "Titles" from the first match + ex: [[Nunc ullamcorper]] + will extract out "Nunc ullamcorper" + + We will change the reference to use + [[Nunc ullamcorper]] => [Nunc ullamcorper]() + + NOTE: This is temoprary and will have to make it such that + it could be present in any file name. Hence this method + will have to move to another function + */ + sub_match := re_sub.FindString(match) + sub_match = strings.Trim(sub_match, "[]") + fmt.Printf("\t%s\n", sub_match) + + linkedNoteTitles = append(linkedNoteTitles, sub_match) + + note_name := strings.Join([]string{sub_match, "html"}, ".") + + // replacing reference with a markdown reference + new_reference := fmt.Sprintf("[%s]()", sub_match, note_name) + markdown = strings.ReplaceAll(markdown, match, new_reference) + fmt.Printf("%s => %s\n", match, fmt.Sprintf("[%s]()", sub_match, note_name)) + } // Parsing markdown to HTML var parsedMarkdown bytes.Buffer @@ -132,10 +181,10 @@ func (p *Parser) ParseNoteMarkdownContent(filecontent string) (Frontmatter, stri p.ErrorLogger.Fatal(err) } - return parsedFrontmatter, parsedMarkdown.String(), true + return parsedFrontmatter, parsedMarkdown.String(), linkedNoteTitles, true } -func (p *Parser) AddNote(baseDirPath string, dirEntryPath string, frontmatter Frontmatter, body string) { +func (p *Parser) AddNote(baseDirPath string, dirEntryPath string, frontmatter Frontmatter, body string, linkedNoteTitles []string) { filepath := baseDirPath + dirEntryPath var date int64 @@ -160,48 +209,38 @@ func (p *Parser) AddNote(baseDirPath string, dirEntryPath string, frontmatter Fr FilenameWithoutExtension: strings.Split(dirEntryPath, ".")[0], Frontmatter: frontmatter, Body: template.HTML(body), - LinkedNoteTitles: []string{}, - // Layout: p.LayoutConfig, + LinkedNoteTitles: linkedNoteTitles, + Layout: p.Layout, } - p.NotesMergedData.Notes[template.URL(key)] = note - - /* - REGEX: - using regex we need to identify for the references to other - notes of the following pattern - - [Note Title Name](/note/somefilename) - */ - - re := regexp.MustCompile(`\[.*\]\((\/notes\/).*(.md)\)`) - re_sub := regexp.MustCompile(`\[.*\]`) - matches := re.FindAllString(string(note.Body), -1) - - for _, match := range matches { - /* - Extracting the file "Titles" from the first match - ex: [Nunc ullamcorper](/notes/2021-09-01-nunc-ullamcorper.md) - will extract out "[Nunc ullamcorper]" - */ - sub_match := re_sub.FindString(match) - sub_match = strings.Trim(sub_match, "[]") + p.NotesMergedData.Notes[note.CompleteURL] = note + //fmt.Println(note.Layout) +} - note.LinkedNoteTitles = append(note.LinkedNoteTitles, sub_match) +func (p *Parser) ValidateNoteTitle(ReferenceNoteTitle string) bool { + for _, Note := range p.NotesMergedData.Notes { + if Note.Frontmatter.Title == ReferenceNoteTitle { + return true + } } + return false } func (p *Parser) ValidateNoteReferences() { /* - This function is going to validate whether all the - references in the notes have a valid link to another - note + This function is going to validate whether all the + references in the notes have a valid link to another + note - Example: for `[Nunc ullamcorper](/notes/1234.md)` to be - a valid reference, the title part of the frontmatter - of the note `/note/1234.md` must have "Nunc ullamcorper" + Example: for `[Nunc ullamcorper](/notes/1234.md)` to be + a valid reference, the title part of the frontmatter + of the note `/note/1234.md` must have "Nunc ullamcorper" */ - - - + for _, Note := range p.NotesMergedData.Notes { + for _, ReferenceNoteTitle := range Note.LinkedNoteTitles { + if !p.ValidateNoteTitle(ReferenceNoteTitle) { + p.ErrorLogger.Fatalf("ERR: Referenced note title (%s) doesnt have an existing note", ReferenceNoteTitle) + } + } + } } diff --git a/site/content/notes/Lorem Ipsum.md b/site/content/notes/Lorem Ipsum.md new file mode 100644 index 0000000..7f1c37e --- /dev/null +++ b/site/content/notes/Lorem Ipsum.md @@ -0,0 +1,8 @@ +--- +title: Lorem Ipsum +date: 2024-02-02 +type: zettler +head: true +--- + +Sed ut velit ante. Suspendisse ac porta urna, eget iaculis dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec vel enim dolor. [[Nunc ullamcorper]] neque ut mattis commodo. Morbi bibendum sem accumsan mi imperdiet, id egestas nulla posuere. Morbi sodales justo euismod nulla porttitor [[lobortis]] sed ut sem diff --git a/site/content/notes/Nunc ullamcorper.md b/site/content/notes/Nunc ullamcorper.md new file mode 100644 index 0000000..3c41d57 --- /dev/null +++ b/site/content/notes/Nunc ullamcorper.md @@ -0,0 +1,6 @@ +--- +title: Nunc ullamcorper +date: 2024-02-02 +type: zettler +head: false +--- diff --git a/site/content/notes/lobortis.md b/site/content/notes/lobortis.md new file mode 100644 index 0000000..b861d61 --- /dev/null +++ b/site/content/notes/lobortis.md @@ -0,0 +1,8 @@ +--- +title: lobortis +date: 2024-02-02 +type: zettler +head: false +--- + +This is back to the head [[Lorem Ipsum]] diff --git a/site/content/posts/zettel_impl.md b/site/content/posts/zettel_impl.md new file mode 100644 index 0000000..dc48bdb --- /dev/null +++ b/site/content/posts/zettel_impl.md @@ -0,0 +1,134 @@ +--- +title: Implementing Zettelkasten in Anna +description: This post focuses of the Proof of Concept behind how we plan to integrate zettelkasten in anna(our SSG) and implementing the new note taking functionality, supporting a new version of *Deep Data Merge* along with +authors: + - Aditya Hegde + - Anirudh Sudhir +date: 2024-04-10 +draft: false +type: post +tags: + - blog + - tech + - aiep +--- + +# Proof of concept + +[Andy Matuschak's](https://notes.andymatuschak.org/) working notes is the key inspiration for this concept. +We are trying to deviate from the "general idea" of a blog site and focus more on this niche use case. +By integrating this feature, we are letting users to create a space to store there "zettels" and share their short notes as well. + +We aren't trying to re-invent the process of making an editor that helps users maintain these zettels as there are already some fantastic applications, +namely [Obsidian](https://obsidian.md/), [Ginko Writer](https://app.gingkowriter.com) and [Evergreen Notes](https://evergreennotes.com/). +Our application as a rather needs to provide a generator to stitch these notes together to make it accessible on the site. + +## Stages of Generations of Notes + +--- + +## 1.0 Figuring out the named links. + +All notes usually have titles as a phrase that can be referred to in a certain note. Our job as the SSG is to link these two notes together. For example + +```md +Sed ut velit ante. Suspendisse ac porta urna, eget iaculis dui. Lorem ipsum +dolor sit amet, consectetur adipiscing elit. Donec vel enim dolor. +[[Nunc ullamcorper]] neque ut mattis commodo. Morbi bibendum sem accumsan mi +imperdiet, id egestas nulla posuere. Morbi sodales justo euismod nulla +porttitor lobortis sed ut sem. +``` + +The above md file is referencing a note namely `Nunc ullamcorper`. What needs to be done is, this "callout" is to be replaced by a link to that specific "note". + +### 1.1 Basic Working Model + +The parser must search through the `Body` section of these *notes*. +There are supposed to be "user defined" references to notes, which the parser must identify and add. +The specific reference to the `template data` of that specific post is appended with the information of all the links that it has found during parsing of the file. +This can be utilised later by the templating engine. + +### 1.2 Automation of linking process + +The previous method suggests the user has to manually link posts. +With automation, the goal is to remove the need for manually entering these links. +Instead we plan to use the `[[]]` callouts to the note name. +For example, `[[Nunc ullamcorper]]` will reference the markdown file which contains "Nunc ullamcoper" as the *Title*. +These callouts to other notes are to be picked out by the parser and replaced with a proper markdown reference in the buffer, so that the acutal file remains untouched. +For example `[[Nunc ullamcorper]]` will be updated to `[Nunc ullamcorper](/notes/zettel_name/123782734234)`. + +### 1.3 Automation of file creation + +This is a step forward from from [Automation of linking process](#linking-automation). As we are not a text editing application, this feature will make the process of creating subnotes simpler. + +Other than just the parser identifying the `[[]]` callouts, during the live reload process, an additional file will be created under the same *zettel*, provided a name is mentioned in the *callout*. + +--- + +## 2.0 Restructuring + +As of now, our content directory looks somewhat like this: + +```text +|— pages markdown files +|— /posts : post dir containing markdown files for all posts +``` + +To this, we plan to add an extra directory named `notes` that will handle all of our zettles. +Each zettel (related notes) can be organised in its own sub directories. + +> Reference: +> - [Zettelkasten creation](https://zettelkasten.de/posts/create-zettel-from-reading-notes/) +> - [Evergreen Notes should be Atomic](https://notes.andymatuschak.org/Evergreen_notes_should_be_atomic) + +We expect users users to specify the head of these zettels by themseves in the frontmatter explicitly + +```yaml +--- +title: Note taking can be fun +date: 2024-04-08 +type: zettel +head: true +--- +``` + +### 2.1 Concept of the `Mega Struct` (Deep Data Merge) + +As each zettel must have access to the information of all other zettels, the implementation of a Deep Data Merge is quite necessary. +Each page is rendered by passsing a `Mega Struct` that the entire data of the notes section. +This struct will have the following fields: + +```go +type NotesMerged struct { + //Stores all the notes + Notes map[template.URL]Note + + //Stores the links of each note to other notes + LinkStore map[string][]*NoteStruct +} +``` + +`LinkStore` is a map which contains a slice of pointers to the *linked notes* which eliminates data redundancy to certain extent. +This is an essential feature as Zettel emphasises on dense linking of notes. + +This `LinkStore` Map is the second step of generation after all the notes in the `notes` directory have been successfully parsed. +Once the link maps have been generated, we use a similar render note function to produce the linked html files. + +Each Note can is a struct that stores all of the data of a particular note, including the frontmatter. + +```go +type Note struct { + // Note data including frontmatter and content + LinkedNotes []string +} +``` + +--- + +# TODO for zettelkasten impl + +- [ ] Generation of Linked Notes + - [ ] Implement 1.1 version of linking (user defined references to notes) + - [ ] Implement automation for the process of linking. Using `[[]]` callouts to file names. +- Tests: + - [ ] unit tests for parsing parocess of the package rendering processes of package diff --git a/site/layout/config.yml b/site/layout/config.yml index a0776bc..39bd404 100644 --- a/site/layout/config.yml +++ b/site/layout/config.yml @@ -2,6 +2,7 @@ navbar: - index - docs - tags + - notes - posts baseURL: https://anna-docs.netlify.app siteTitle: "anna-docs" diff --git a/site/layout/notes/note.layout b/site/layout/notes/note.layout index e69de29..9d1c430 100644 --- a/site/layout/notes/note.layout +++ b/site/layout/notes/note.layout @@ -0,0 +1,34 @@ +{{ define "note" }} +{{ template "head" .}} + + + + {{template "header" .}} +
+ {{ if eq .Frontmatter.Type "post" }} +
+

{{ .Frontmatter.Title }}

+
+

+ Published on {{.Frontmatter.Date}} + + {{ if eq (len .Frontmatter.Authors) 0 }} + {{$.Layout.Author}} + {{ else }} + {{range .Frontmatter.Authors }} + {{ . }}, + {{ end }} + {{ end }} +

+
+
+ {{ else }} + {{ end }} + {{.Body}} +
+ {{template "footer" .}} + + + + +{{ end}} diff --git a/site/layout/notes/root.layout b/site/layout/notes/root.layout new file mode 100644 index 0000000..619169d --- /dev/null +++ b/site/layout/notes/root.layout @@ -0,0 +1,25 @@ +{{ define "root" }} + + + + + + + +
+
+ {{ range $templateURL, $Note := . }} + + {{ $templateURL }} + + {{ end }} +
+
+
+
+ {{template "footer" .}} + + + + +{{ end}} diff --git a/site/layout/page.layout b/site/layout/page.layout index 84a2478..61f8a5d 100644 --- a/site/layout/page.layout +++ b/site/layout/page.layout @@ -1,4 +1,4 @@ -{{ define "page"}} +{{ define "page" }} {{ template "head" .}} @@ -23,11 +23,11 @@

- {{range .Frontmatter.Tags}} +
{{ else }} @@ -40,4 +40,4 @@ -{{ end}} \ No newline at end of file +{{ end}} diff --git a/site/static/index.json b/site/static/index.json index 0236c6a..babaad0 100644 --- a/site/static/index.json +++ b/site/static/index.json @@ -1 +1 @@ -{"bench.md":{"CompleteURL":"posts/bench.html","FilenameWithoutExtension":"bench","Frontmatter":{"Title":"benchmark","Date":"2024-02-23","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["test-post"],"Authors":null},"Tags":["test-post"]},"building_anna.md":{"CompleteURL":"posts/building_anna.html","FilenameWithoutExtension":"building_anna","Frontmatter":{"Title":"Building anna","Date":"2024-04-04","Draft":false,"JSFiles":null,"Type":"post","Description":"This page contains a post about anna, a static site generator written in Go. This team project was built as part of AIEP 2024","PreviewImage":"","Tags":["acm","hsp","go","tech","talk","aiep"],"Authors":["Adhesh","Aditya","Nathan","Anirudh"]},"Tags":["acm","hsp","go","tech","talk","aiep"]},"docs.md":{"CompleteURL":"docs.html","FilenameWithoutExtension":"docs","Frontmatter":{"Title":"Anna Documentation","Date":"","Draft":false,"JSFiles":null,"Type":"","Description":"","PreviewImage":"","Tags":null,"Authors":null},"Tags":null},"index.md":{"CompleteURL":"index.html","FilenameWithoutExtension":"index","Frontmatter":{"Title":"Home","Date":"2024-02-24","Draft":false,"JSFiles":null,"Type":"","Description":"homepage for our ssg","PreviewImage":"/static/plane.jpg","Tags":null,"Authors":null},"Tags":null},"week-1.md":{"CompleteURL":"posts/week-1.html","FilenameWithoutExtension":"week-1","Frontmatter":{"Title":"Week-1 Progress","Date":"2024-03-18","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["progress"],"Authors":["Adhesh","Aditya","Anirudh","Nathan"]},"Tags":["progress"]},"week-2.md":{"CompleteURL":"posts/week-2.html","FilenameWithoutExtension":"week-2","Frontmatter":{"Title":"Week-2 Progress","Date":"2024-03-25","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["progress"],"Authors":["Adhesh","Aditya","Anirudh","Nathan"]},"Tags":["progress"]},"week-3.md":{"CompleteURL":"posts/week-3.html","FilenameWithoutExtension":"week-3","Frontmatter":{"Title":"Week-3 Progress","Date":"2024-04-01","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["progress"],"Authors":["Adhesh","Aditya","Anirudh","Nathan"]},"Tags":["progress"]}} \ No newline at end of file +{"bench.md":{"CompleteURL":"posts/bench.html","FilenameWithoutExtension":"bench","Frontmatter":{"Title":"benchmark","Date":"2024-02-23","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["test-post"],"Authors":null},"Tags":["test-post"]},"building_anna.md":{"CompleteURL":"posts/building_anna.html","FilenameWithoutExtension":"building_anna","Frontmatter":{"Title":"Building anna","Date":"2024-04-04","Draft":false,"JSFiles":null,"Type":"post","Description":"This page contains a post about anna, a static site generator written in Go. This team project was built as part of AIEP 2024","PreviewImage":"","Tags":["acm","hsp","go","tech","talk","aiep"],"Authors":["Adhesh","Aditya","Nathan","Anirudh"]},"Tags":["acm","hsp","go","tech","talk","aiep"]},"docs.md":{"CompleteURL":"docs.html","FilenameWithoutExtension":"docs","Frontmatter":{"Title":"Anna Documentation","Date":"","Draft":false,"JSFiles":null,"Type":"","Description":"","PreviewImage":"","Tags":null,"Authors":null},"Tags":null},"index.md":{"CompleteURL":"index.html","FilenameWithoutExtension":"index","Frontmatter":{"Title":"Home","Date":"2024-02-24","Draft":false,"JSFiles":null,"Type":"","Description":"homepage for our ssg","PreviewImage":"/static/plane.jpg","Tags":null,"Authors":null},"Tags":null},"week-1.md":{"CompleteURL":"posts/week-1.html","FilenameWithoutExtension":"week-1","Frontmatter":{"Title":"Week-1 Progress","Date":"2024-03-18","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["progress"],"Authors":["Adhesh","Aditya","Anirudh","Nathan"]},"Tags":["progress"]},"week-2.md":{"CompleteURL":"posts/week-2.html","FilenameWithoutExtension":"week-2","Frontmatter":{"Title":"Week-2 Progress","Date":"2024-03-25","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["progress"],"Authors":["Adhesh","Aditya","Anirudh","Nathan"]},"Tags":["progress"]},"week-3.md":{"CompleteURL":"posts/week-3.html","FilenameWithoutExtension":"week-3","Frontmatter":{"Title":"Week-3 Progress","Date":"2024-04-01","Draft":false,"JSFiles":null,"Type":"post","Description":"","PreviewImage":"","Tags":["progress"],"Authors":["Adhesh","Aditya","Anirudh","Nathan"]},"Tags":["progress"]},"zettel_impl.md":{"CompleteURL":"posts/zettel_impl.html","FilenameWithoutExtension":"zettel_impl","Frontmatter":{"Title":"Implementing Zettelkasten in Anna","Date":"2024-04-10","Draft":false,"JSFiles":null,"Type":"post","Description":"This post focuses of the Proof of Concept behind how we plan to integrate zettelkasten in anna(our SSG) and implementing the new note taking functionality, supporting a new version of *Deep Data Merge* along with","PreviewImage":"","Tags":["blog","tech","aiep"],"Authors":["Aditya Hegde","Anirudh Sudhir"]},"Tags":["blog","tech","aiep"]}} \ No newline at end of file