[
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Handling Bookmarks In Neopoligen",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "title",
"template_list": [
"sections/title/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Introduction",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "I just read a post from Roma Komarov",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "footnote-shorthand",
"text": "1",
"type": "footnote-shorthand"
},
{
"kind": "plain-text",
"text": " about managing and publishing bookmarks on a website",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "footnote-shorthand",
"text": "2",
"type": "footnote-shorthand"
},
{
"kind": "plain-text",
"text": ". Handling bookmarks is something I\u0027ve been giving a lot of thought to as I work on my website builder (which is called Neopoligen",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "footnote-shorthand",
"text": "3",
"type": "footnote-shorthand"
},
{
"kind": "plain-text",
"text": ").",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Bookmarks are interesting in their own right. They also make a great proxy for other categories of content. Quotes, reviews, and image galleries all come to mind.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "h2",
"template_list": [
"sections/h2/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Starting With Sections",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Neopoligen (the website builder) is designed to work with files written in Neopolitan",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "footnote-shorthand",
"text": "4",
"type": "footnote-shorthand"
},
{
"kind": "plain-text",
"text": " (a markdown replacement format). Each file consists of sections that start with tags that look like this:",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "h2",
"template_list": [
"sections/h2/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"body": "-- section-name\n\nThis is where the section content goes",
"bound": "start",
"end_section": {
"attrs": {},
"bound": "end",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Section can have flags and key/value attributes. For example:",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"flags": [],
"kind": "code-end",
"template_list": [
"sections/code-end/default.neoj",
"sections/end/default.neoj"
],
"type": "end"
},
"flags": [
"neo"
],
"kind": "code",
"template_list": [
"sections/code/default.neoj",
"sections/raw/default.neoj"
],
"type": "raw"
},
{
"attrs": {},
"body": "-- section-name\n-- flag\n-- key: value\n\nThis is where the section content goes",
"bound": "start",
"end_section": {
"attrs": {},
"bound": "end",
"children": [],
"flags": [],
"kind": "code-end",
"template_list": [
"sections/code-end/default.neoj",
"sections/end/default.neoj"
],
"type": "end"
},
"flags": [
"neo"
],
"kind": "code",
"template_list": [
"sections/code/default.neoj",
"sections/raw/default.neoj"
],
"type": "raw"
},
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "A Basic Bookmark",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "For a real-world example, here\u0027s a ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "code-shorthand",
"text": "demo-bookmark-v1",
"type": "code-shorthand"
},
{
"kind": "plain-text",
"text": " section that\u0027s slated to ship with the first version Neopoligen:",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "h2",
"template_list": [
"sections/h2/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"body": "-- demo-bookmark-v1\n-- title: Example.com\n-- url: https://www.example.com/\n\nThe go-to URL for when you need to point test \nlinks somewhere",
"bound": "start",
"end_section": {
"attrs": {},
"bound": "end",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Output for each section is controlled by template files (which will see a bit further below). Here\u0027s the live output from the demo template:",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"flags": [],
"kind": "code-end",
"template_list": [
"sections/code-end/default.neoj",
"sections/end/default.neoj"
],
"type": "end"
},
"flags": [
"neo"
],
"kind": "code",
"template_list": [
"sections/code/default.neoj",
"sections/raw/default.neoj"
],
"type": "raw"
},
{
"attrs": {
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "Example.com",
"type": "plain-text"
}
],
"text": "Example.com"
}
],
"url": [
{
"spans": [
{
"kind": "plain-text",
"text": "https://www.example.com/",
"type": "plain-text"
}
],
"text": "https://www.example.com/"
}
]
},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "The go-to URL for when you need to point test links somewhere",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "demo-bookmark-v1",
"template_list": [
"sections/demo-bookmark-v1/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Adding Details",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Attributes are arbitrary. You can add as many as you like and just wire the template up to use them.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "It\u0027s also possible to nest sections inside each other.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Here\u0027s another example that combines those two things: more attributes and a block quote nested inside the bookmark:",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "h2",
"template_list": [
"sections/h2/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"body": "-- demo-bookmark-v1/\n-- title: Example.com\n-- subtitle: My favorite place to link to\n-- url: https://www.example.com/\n-- tag: web dev \n-- tag: neopoligen\n\nThe go-to URL for when you need to point test \nlinks somewhere. According to the page itself:\n\n -- blockquote/\n\n This domain is for use in illustrative \n examples in documents. You may use this \n domain in literature without prior \n coordination or asking for permission.\n\n -- /blockquote\n\nI wonder how much traffic that site gets \nevery time I link to it.\n\n-- /demo-bookmark-v1",
"bound": "start",
"end_section": {
"attrs": {},
"bound": "end",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Here\u0027s the output:",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"flags": [],
"kind": "code-end",
"template_list": [
"sections/code-end/default.neoj",
"sections/end/default.neoj"
],
"type": "end"
},
"flags": [
"neo"
],
"kind": "code",
"template_list": [
"sections/code/default.neoj",
"sections/raw/default.neoj"
],
"type": "raw"
},
{
"attrs": {
"subtitle": [
{
"spans": [
{
"kind": "plain-text",
"text": "My favorite place to link to",
"type": "plain-text"
}
],
"text": "My favorite place to link to"
}
],
"tag": [
{
"spans": [
{
"kind": "plain-text",
"text": "web dev",
"type": "plain-text"
}
],
"text": "web dev"
},
{
"spans": [
{
"kind": "plain-text",
"text": "neopoligen",
"type": "plain-text"
}
],
"text": "neopoligen"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "Example.com",
"type": "plain-text"
}
],
"text": "Example.com"
}
],
"url": [
{
"spans": [
{
"kind": "plain-text",
"text": "https://www.example.com/",
"type": "plain-text"
}
],
"text": "https://www.example.com/"
}
]
},
"bound": "start",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "The go-to URL for when you need to point test links somewhere. According to the page itself:",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"attrs": {},
"bound": "start",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": {
"attrs": {},
"bound": "end",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "I wonder how much traffic that site gets every time I link to it.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"flags": [],
"kind": "blockquote-end",
"template_list": [
"sections/blockquote-end/default.neoj",
"sections/end/default.neoj"
],
"type": "end"
},
"flags": [],
"kind": "blockquote",
"template_list": [
"sections/blockquote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
}
],
"end_section": {
"attrs": {},
"bound": "end",
"children": [],
"flags": [],
"kind": "demo-bookmark-v1-end",
"template_list": [
"sections/demo-bookmark-v1-end/default.neoj",
"sections/end/default.neoj"
],
"type": "end"
},
"flags": [],
"kind": "demo-bookmark-v1",
"template_list": [
"sections/demo-bookmark-v1/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "No JavaScript Required",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Neopoligen doesn\u0027t use a JavaScript framework. It uses templates written in a modified flavor of Jinja",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "footnote-shorthand",
"text": "5",
"type": "footnote-shorthand"
},
{
"kind": "plain-text",
"text": ". Here\u0027s the complete template that rendered everything above. (Fair warning: syntax highlighting might not be working when you see this page. It makes looking at the sample a bit tough.)",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "h2",
"template_list": [
"sections/h2/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"body": "[!- import \"built-in/macros.neoj\" as neo -!]\n\n[# TYPE: basic #]\n[# ATTRS_TO_HOIST: [class, id] #]\n\n\u003csection [@- neo.hoist_section_attrs() -@]\u003e\n\n \u003cdiv class=\"demo-bookmark-v1-header\"\u003e\n Bookmark\n \u003c/div\u003e\n\n \u003cdiv class=\"demo-bookmark-v1-body\"\u003e\n\n \u003cdiv class=\"demo-bookmark-v1-title\"\u003e\n \u003ca href=\"[@- neo.output_attr(\"url\") -@]\"\u003e\n [@- neo.output_attr(\"title\") -@]\n \u003c/a\u003e\n \u003c/div\u003e\n\n [!- if \"subtitle\" in section.attrs -!]\n \u003cdiv class=\"demo-bookmark-v1-subtitle\"\u003e\n [@- neo.output_attr(\"subtitle\") -@]\n \u003c/div\u003e\n [!- endif -!]\n\n \u003cdiv class=\"demo-bookmark-v1-details\"\u003e\n [@- neo.output_all_child_sections() -@]\n \u003c/div\u003e\n\n [!- if \"tag\" in section.attrs -!]\n \u003cdiv class=\"demo-bookmark-v1-tag-wrapper\"\u003e\n tags:[@- \u0027 \u0027 -@]\n [!- for tag_item in section.attrs[\"tag\"] -!]\n [@- neo.output_spans(tag_item.spans) -@]\n [!- if not loop.last -!]\n ,[@- \u0027 \u0027 -@]\n [!- endif -!]\n [!- endfor -!]\n \u003c/div\u003e\n [!- endif -!]\n\n \u003cdiv class=\"demo-bookmark-v1-url-wrapper\"\u003e\n \u003ca href=\"[@- neo.output_attr(\"url\") -@]\"\u003e\n [@- neo.output_attr(\"url\") -@]\n \u003c/a\u003e\n \u003c/div\u003e\n\n \u003c/div\u003e\n\u003c/section\u003e\n\n[@- neo.output_end_section(section) -@]",
"bound": "start",
"end_section": {
"attrs": {},
"bound": "end",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "I\u0027ll write up more about how the templates work in other posts. In the mean time, you can probably get a good idea of what\u0027s going on if you\u0027ve worked with HTML before.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Neopoligen will come with enough basic templates that you\u0027ll be able to build a basic site without having to mess with them at all. But, everything is open and accessible to either modify or make entirely new sections and templates yourself.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"flags": [],
"kind": "code-end",
"template_list": [
"sections/code-end/default.neoj",
"sections/end/default.neoj"
],
"type": "end"
},
"flags": [
"neoj"
],
"kind": "code",
"template_list": [
"sections/code/default.neoj",
"sections/raw/default.neoj"
],
"type": "raw"
},
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "A Database Of Files",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "One of my favorite things about working with Neopoligen is not having to spin up database software. The content files act like a database on their own. It\u0027s so nice to be a able to create ad-hoc types by simply naming a new section then making a corresponding template for it.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "There\u0027s more in store along those lines. I\u0027m working on querying capabilities for the content. They\u0027ll provide for making collections, links between the tags in the example, and all the other stuff you can do with collections.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "You\u0027ll also be able to have files that don\u0027t end up as posts. The idea is to set a flag in them so they load their sections for querying without directly publishing the underlying page.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Bookmarks will be one of my main use cases for this. Specifically, it\u0027ll let you have a bunch of files with different categories of bookmarks that can either be output directly or via sets gathered from queries.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "h2",
"template_list": [
"sections/h2/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Wrapping Up",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "I\u0027ve been working on Neopoligen (and Neopolitan) for two years. The journey has been longer than you might expected. Partially, that\u0027s because I decided to make it in Rust",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "footnote-shorthand",
"text": "6",
"type": "footnote-shorthand"
},
{
"kind": "plain-text",
"text": " (which I\u0027d never used before) with a parser combinator (which I\u0027d never even heard of before).",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "More importantly, I wanted to make the experience ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "emphasis-shorthand",
"text": "feel",
"type": "emphasis-shorthand"
},
{
"kind": "plain-text",
"text": " right. I spent revision after revision working to reduce the friction between having an idea and getting it to show up on a web page.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "It\u0027s been a long haul, but I couldn\u0027t be happier with where it\u0027s landing. The more chances I get to ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "emphasis-shorthand",
"text": "use",
"type": "emphasis-shorthand"
},
{
"kind": "plain-text",
"text": " Neopoligen instead of just working on it, the more enjoyment I\u0027m getting out of it.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Right now, Neopoligen works on my computer. I\u0027m close to publishing a beta version that other folks will be able to use too. The goal is to have it out by the end of the year.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "I can\u0027t wait to share it with you.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
},
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "- alan",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "h2",
"template_list": [
"sections/h2/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "1",
"type": "plain-text"
}
],
"text": "1"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "Roma Komarov on Mastodon",
"type": "plain-text"
}
],
"text": "Roma Komarov on Mastodon"
}
],
"url": [
{
"spans": [
{
"kind": "plain-text",
"text": "https://front-end.social/@kizu",
"type": "plain-text"
}
],
"text": "https://front-end.social/@kizu"
}
]
},
"bound": "full",
"children": [],
"end_section": null,
"flags": [],
"kind": "footnote",
"template_list": [
"sections/footnote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "2",
"type": "plain-text"
}
],
"text": "2"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "Managing Bookmarks, part 1 - by Roma Komarov",
"type": "plain-text"
}
],
"text": "Managing Bookmarks, part 1 - by Roma Komarov"
}
],
"url": [
{
"spans": [
{
"kind": "plain-text",
"text": "https://blog.kizu.dev/managing-bookmarks-part-1/",
"type": "plain-text"
}
],
"text": "https://blog.kizu.dev/managing-bookmarks-part-1/"
}
]
},
"bound": "full",
"children": [],
"end_section": null,
"flags": [],
"kind": "footnote",
"template_list": [
"sections/footnote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "3",
"type": "plain-text"
}
],
"text": "3"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "Neopoligen - The Website Builder",
"type": "plain-text"
}
],
"text": "Neopoligen - The Website Builder"
}
],
"url": [
{
"spans": [
{
"kind": "plain-text",
"text": "https://www.neopoligen.com/",
"type": "plain-text"
}
],
"text": "https://www.neopoligen.com/"
}
]
},
"bound": "full",
"children": [],
"end_section": null,
"flags": [],
"kind": "footnote",
"template_list": [
"sections/footnote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "4",
"type": "plain-text"
}
],
"text": "4"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "Neopolitan",
"type": "plain-text"
}
],
"text": "Neopolitan"
}
]
},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "I don\u0027t have a good link handy for the Neopolitan format at the moment. The details are on the ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [
"https://www.neopoligen.com/"
],
"kind": "link-shorthand",
"text": "Neopoligen page for now",
"type": "link-shorthand"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "footnote",
"template_list": [
"sections/footnote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "5",
"type": "plain-text"
}
],
"text": "5"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "Jinja, MiniJinja, and NeoJinja",
"type": "plain-text"
}
],
"text": "Jinja, MiniJinja, and NeoJinja"
}
]
},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Neopoligen is written in Rust and uses the ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [
"https://docs.rs/minijinja/latest/minijinja/"
],
"kind": "link-shorthand",
"text": "MiniJinja template engine",
"type": "link-shorthand"
},
{
"kind": "plain-text",
"text": " (which is based off the original ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [
"https://jinja.palletsprojects.com/en/stable/"
],
"kind": "link-shorthand",
"text": "Jinja template engine",
"type": "link-shorthand"
},
{
"kind": "plain-text",
"text": "). I\u0027ve modified it a little to change the tokens from things like ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "code-shorthand",
"text": "{{ }}",
"type": "code-shorthand"
},
{
"kind": "plain-text",
"text": " to ",
"type": "plain-text"
},
{
"attrs": {},
"flags": [],
"kind": "code-shorthand",
"text": "[@ @]",
"type": "code-shorthand"
},
{
"kind": "plain-text",
"text": " which I find easier to read and track when working with the templates.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "footnote",
"template_list": [
"sections/footnote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "6",
"type": "plain-text"
}
],
"text": "6"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "The Rust Programming Language",
"type": "plain-text"
}
],
"text": "The Rust Programming Language"
}
],
"url": [
{
"spans": [
{
"kind": "plain-text",
"text": "https://www.rust-lang.org/",
"type": "plain-text"
}
],
"text": "https://www.rust-lang.org/"
}
]
},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "The learning curve has been no joke, but the more I use Rust the more I like it.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "footnote",
"template_list": [
"sections/footnote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "7",
"type": "plain-text"
}
],
"text": "7"
}
],
"title": [
{
"spans": [
{
"kind": "plain-text",
"text": "The nom parser cobinator",
"type": "plain-text"
}
],
"text": "The nom parser cobinator"
}
],
"url": [
{
"spans": [
{
"kind": "plain-text",
"text": "https://docs.rs/nom/latest/nom/",
"type": "plain-text"
}
],
"text": "https://docs.rs/nom/latest/nom/"
}
]
},
"bound": "full",
"children": [
{
"children": [],
"kind": "paragraph",
"spans": [
{
"kind": "plain-text",
"text": "Written in rust and \"eating data byte by byte\". Another part of the process where the learning curve kicked my butt for a while. Now that I\u0027ve got my head around it a bit, it\u0027s super powerful to work with.",
"type": "plain-text"
}
],
"template_list": [
"sections/paragraph/default.neoj"
],
"type": "block"
}
],
"end_section": null,
"flags": [],
"kind": "footnote",
"template_list": [
"sections/footnote/default.neoj",
"sections/basic/default.neoj"
],
"type": "basic"
},
{
"attrs": {
"created": [
{
"spans": [
{
"kind": "plain-text",
"text": "2024-11-11T18:27:43-04:00",
"type": "plain-text"
}
],
"text": "2024-11-11T18:27:43-04:00"
}
],
"id": [
{
"spans": [
{
"kind": "plain-text",
"text": "2o/j0/ql/48",
"type": "plain-text"
}
],
"text": "2o/j0/ql/48"
}
],
"status": [
{
"spans": [
{
"kind": "plain-text",
"text": "scratch",
"type": "plain-text"
}
],
"text": "scratch"
}
],
"template": [
{
"spans": [
{
"kind": "plain-text",
"text": "post",
"type": "plain-text"
}
],
"text": "post"
}
],
"updated": [
{
"spans": [
{
"kind": "plain-text",
"text": "2024-11-11T18:27:43-04:00",
"type": "plain-text"
}
],
"text": "2024-11-11T18:27:43-04:00"
}
]
},
"bound": "full",
"data": {},
"end_section": null,
"error": null,
"flags": [],
"kind": "page",
"template_list": [
"sections/page/default.neoj",
"sections/json5/default.neoj"
],
"type": "json5"
}
]