concept blog generator
npm install turtleblogexpected site directory structure
```
source/
articles/ # contains page dirs
blog-index/ # is a page dir
blog-posts/ # contains dated page dirs
home/ # is a page dir
templates/
article.pug
blog-index.pug
blog-post.pug
home.pug
--------
concept blog generator
here's one way
``
turtleblog \
--source source \
--dist dist \
--blog devblog
concept walkthrough
- turtle-scan: scan website structure, assign ids, make navigation and links
``
interface WebsiteData {
articles: PageData[]
blog: PageData[]
blogIndex: PageData
home: PageData
navigation: [
{
label: "devblog"
}
]
}
- turtle-generate: read the files and perform compilations
``
interface WebsiteOutput {
articles: PageOutput[]
}
- turtle-write: output all results to disk and copy files
--------
1. turtle-read — read a source directory, return website metadata json
2. turtle-generate — compile pug, sass, and return website output json
3. turtle-write — save the website to disk
`bash
#!/bin/bash
turtle-read | turtle-generate | turtle-write
# ^ ^
# {metadata json} {output json}
turtle-read --source src # load website source
| turtle-transform-metadata-pass # (optional) transform metadata
| turtle-generate # compile pug, sass, etc
| turtle-transform-output-pass # (optional) transform output
| turtle-write --dist dist # write website to disk
`
`js
import {turtleRead, turtleGenerate, turtleWrite} from "turtleblog"
async function main() {
// 1. read the website
const websiteMetadata = await turtleRead({source: "src"})
// 2. generate the website
const websiteOutput = await turtleGenerate({websiteMetadata})
// 3. write the website
await turtleWrite({dist: "dist", websiteOutput})
}
`
`
{source-dir}/
layouts/
page.pug
blog-index.pug
blog-post.pug
pages/
{page-name}/ # standard page directory
{section-name}.md # sections are passed to pug layouts
{section-name}.md
...{any other files are copied}
{page-name}/ # standard page directory
{section-name}.md
{section-name}.md
{page-name}/ # sub-page directory
{section-name}.md
{section-name}.md
blog/
index/ # standard page directory
{section-name}.md
{section-name}.md
posts/
{year}/
{month}/
{day}/
{page-name}/ # standard page directory
{section-name}.md
{section-name}.md
`
turtleblog exposes its typescript interfaces, so you extend turtleblog and make your own interoperable replacement tools
of course, you could wholly replace turtle-read, if you wanted to have control over your directory structure
also note you could wholly replace turtle-generate, for control over the compilation process
- all pages
- pageMetadatawebsiteMetadata
-
- articles
- articleMetadata
- blog posts
- blogPostMetadata
- blog index
- blogIndexMetadata`