Simple Site Builder
Overview
Simple Site Builder is my latest static site builder for my personal sites. It uses HTML, CSS, Vanilla JavaScript, Web Components, and JavaScript Libraries without requiring an underlying framework. It's specifically designed to compliment bitty.
The repo is at: https://github.com/alanwsmith/simple_site_builder if you want to check it out or tinker with it.
TODO/Goals:
-
[x] Transform any files with
.on.EXTENSIONregardless of whatEXTENSIONis -
[x] Do not transform any files with
.off.EXTENSIONregardless of whatEXTENSIONis -
[x] Drop automatically making
.htmlfiles be directories. Just put everything where you want it to go. The only change that should be made is turning.mdinto.html? -
[x] Run files through transform twice raw() function so you can pass the open and close tokens to the second process.
-
[x] can use
{and}instead of[and]
to pass tokens to the second pass of the transformation. -
[x] Single binary that can be run downloaded and run from the command line with no other dependencies.
-
[x] Built-in preview server.
-
[x] Automatically reload preview pages when content changes.
-
[x] Use jinja style templates, but with tokens that are easier to read (i.e.
[``!!``],[``@@``], and[``##``]instead of{% %},{{ }}, and) -
[x] Control what's published and what's only used for includes by naming convention (i.e. things that start with an "_" don't get published directly).
-
[x] Provide syntax highlighting to full files.
-
[x] Provide syntax highlighting to individual code snippets.
-
[x] Markdown can be used inside files via a filter.
-
[x] Markdown files can be included in other files.
-
[x] Provide file listings (e.g. for providing links)
-
[x] Provide folder listing (e.g. that can be used to include all files in a folder)
-
[x] Copy non-html and non-md files directly.
-
[x] Run .html files through minijinja when building the site.
-
[x] Log to JSON and txt files as well as the command line.
-
[x] Provide a pre-build find/replace to change out basic string matches.
-
[x] Send .txt files through the transformer
-
[x] Send .css files through the transformer
-
[x] Send file with
.mj.jsextensions though the MiniJinja transform -
[x] Automatically load .json files to use as data across templates.
-
[] Add automated tests
-
[] Automatically make minified version of .js files
-
[] Quality error messages is something goes wrong.
-
[] Call images by file name stem (i.e. without extension) regardless of where they are in the directory tree.
-
[] Auto generate srcset images and attributes.
-
[] Run .md files through minijinja when building the site.
-
[] Read optional YAML front matter form .md files to use as data on the page.
-
[] Use a YAML front matter "template" variable to set the template used for the page.
-
[] Run anything inside the
scripts/prefolder prior to building the site. -
[] Run anything inside the
scripts/postfolder after building the site. -
[] Command line options like
--help -
[] Handle neopolitan files
-
[] A GUI front end so the command line isn't required.
-
[] Auto generate basic directory structure and example files if run in an empty directory.
-
[] Put in a little buffer/throttle/debounce so that if multiple changes occur within like 100ms it only triggers one build.
-
[x] Process
.mj.jsfiles as templates. -
[x] Don't pre-highlight files. Or, maybe cache them if you do? The process bogs down on things like p5.min.js.
-
[] Set up the builder to restart itself if it crashes.
-
[] Auto run scripts in
support/preandsupport/postbefore and after each build. -
[] Split out build process from server process and use a command line flag to do just the build (e.g. to make testing easier).
-
[] Add a JavaScript Minifier.
-
[] Documentation
-
[] Image optimization where raw files are stored wherever in the
contentdir, but an output dir with each file available based on name the same way you do it in Neopoligen is made available (make it a.imagesdir name or some other dot directory to hide it? not sure that matters, but the other key is to let templates call any image with something like[@ image(NAME) @]) -
[] Ability to include files. (need to think through security, but maybe it's that you have an
includesdirectory that has sym links out to the files you want to include? Is that safe?) -
[x] Load any
.jsonfile in the content directory so it's data can be accessed in templates viadata.["FILE_STEM"].whatever. -
[] Set up a function to call out to
support/pluginsprocesses.
Release Build Process
-
First off, don't use
cargo install --path .Build a release file and drop it on your path next to the prior versions. Process for that is as follows: -
Get the prior version number by looking in the releases dir.
-
Bump the version number in the Cargo.toml file (Everything starts with
0right now. The second number is the "Major" version slot which indicates breaking changes. The third number is for both Minor and Patch bumps. Once a 1.0.0 is release it'll move to regular semantic versioning.) -
If it's a breaking change, bump the version number of the
src/bin/ssb-x-x-x.rsfile. -
Run the
build-releasescript. -
Copy the built artifact onto your path. (I'm currently using
~/binarieswhich I've added to my zsh config file. -
Make a commit on the
maingit branch that includes the release binary file.
Examples
These examples cover the basics. Check out the source code to see the input.
Automatically Loaded Data
{
"_config": {
"txtTest": "Processing .txt files with MiniJinja Worked!"
},
"examples": {
"data": {
"sample": {
"dataset": {
"alfa": "the quick brown fox",
"bravo": [
"the",
"quick",
"brown",
"fox"
]
}
},
"sample-2": {
"anotherSample": "with some data"
}
}
}
}
Inline Syntax Highlighting
}
highlighted HTML
print('this is lua')
Other languages can be added. It currently requires updating the source code.
File Syntax Highlighting
Markdown File Inclusion
NOTE: Uses filter to render markdown for: examples/markdown/sample.mdFind and Replace from: support/find-replace/*.txt
This should say `TEST_VAR_2_WORKED`: TEST_VAR_2_DID_NOT_WORK
Confirm Find and Replace works in included files
Could not load file to highlight: _includes/test-highlight-with-find-replace.js
Bitty Test
Current File
null
Folders List
[
{
"name": "_includes",
"parent": ""
},
{
"name": "_release-notes",
"parent": ""
},
{
"name": "_wrappers",
"parent": ""
},
{
"name": "components",
"parent": ""
},
{
"name": "examples",
"parent": ""
},
{
"name": "favicons",
"parent": ""
},
{
"name": "images",
"parent": ""
},
{
"name": "releases",
"parent": ""
},
{
"name": "scripts",
"parent": ""
},
{
"name": "styles",
"parent": ""
},
{
"name": "tests",
"parent": ""
},
{
"name": "data",
"parent": "examples"
},
{
"name": "markdown",
"parent": "examples"
},
{
"name": "aarch64-apple-darwin",
"parent": "releases"
},
{
"name": "0.3.0",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.4.0",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.5.0",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.6.0",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.6.1",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.6.2",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.6.3",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.7.0",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.7.1",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.7.2",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.7.3",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.7.4",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.8.0",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.8.1",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.8.2",
"parent": "releases/aarch64-apple-darwin"
},
{
"name": "0.8.3",
"parent": "releases/aarch64-apple-darwin"
}
]
File List
[
{
"extension": "json",
"file_move_type": "Skip",
"folder": "",
"input_path": "_config.json",
"name": "_config.json",
"output_folder": null,
"output_name": null,
"parent_folder_name": null,
"stem": "_config"
},
{
"extension": "ico",
"file_move_type": "Copy",
"folder": "",
"input_path": "favicon.ico",
"name": "favicon.ico",
"output_folder": "",
"output_name": "favicon.ico",
"parent_folder_name": null,
"stem": "favicon"
},
{
"extension": "html",
"file_move_type": "Transform",
"folder": "",
"input_path": "index.html",
"name": "index.html",
"output_folder": "",
"output_name": "index.html",
"parent_folder_name": null,
"stem": "index"
},
{
"extension": "html",
"file_move_type": "Transform",
"folder": "",
"input_path": "ping.html",
"name": "ping.html",
"output_folder": "",
"output_name": "ping.html",
"parent_folder_name": null,
"stem": "ping"
},
{
"extension": "js",
"file_move_type": "Skip",
"folder": "_includes",
"input_path": "_includes/test-highlight-with-find-replace.js",
"name": "test-highlight-with-find-replace.js",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_includes",
"stem": "test-highlight-with-find-replace"
},
{
"extension": "txt",
"file_move_type": "Skip",
"folder": "_includes",
"input_path": "_includes/txt-test.txt",
"name": "txt-test.txt",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_includes",
"stem": "txt-test"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.3.0.md",
"name": "v0.3.0.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.3.0"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.4.0.md",
"name": "v0.4.0.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.4.0"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.5.0.md",
"name": "v0.5.0.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.5.0"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.6.0.md",
"name": "v0.6.0.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.6.0"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.6.1.md",
"name": "v0.6.1.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.6.1"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.6.2.md",
"name": "v0.6.2.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.6.2"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.6.3.md",
"name": "v0.6.3.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.6.3"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.6.4.md",
"name": "v0.6.4.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.6.4"
},
{
"extension": "md",
"file_move_type": "Skip",
"folder": "_release-notes",
"input_path": "_release-notes/v0.8.3.md",
"name": "v0.8.3.md",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_release-notes",
"stem": "v0.8.3"
},
{
"extension": "html",
"file_move_type": "Skip",
"folder": "_wrappers",
"input_path": "_wrappers/main.html",
"name": "main.html",
"output_folder": null,
"output_name": null,
"parent_folder_name": "_wrappers",
"stem": "main"
},
{
"extension": "js",
"file_move_type": "Skip",
"folder": "components",
"input_path": "components/_js-include-test.js",
"name": "_js-include-test.js",
"output_folder": null,
"output_name": null,
"parent_folder_name": "components",
"stem": "_js-include-test"
},
{
"extension": "js",
"file_move_type": "Copy",
"folder": "components",
"input_path": "components/bitty-1.0.0-rc4.full.js",
"name": "bitty-1.0.0-rc4.full.js",
"output_folder": "components",
"output_name": "bitty-1.0.0-rc4.full.js",
"parent_folder_name": "components",
"stem": "bitty-1.0.0-rc4.full"
},
{
"extension": "js",
"file_move_type": "Copy",
"folder": "components",
"input_path": "components/page.js",
"name": "page.js",
"output_folder": "components",
"output_name": "page.js",
"parent_folder_name": "components",
"stem": "page"
},
{
"extension": "json",
"file_move_type": "Copy",
"folder": "examples/data",
"input_path": "examples/data/sample-2.json",
"name": "sample-2.json",
"output_folder": "examples/data",
"output_name": "sample-2.json",
"parent_folder_name": "data",
"stem": "sample-2"
},
{
"extension": "json",
"file_move_type": "Copy",
"folder": "examples/data",
"input_path": "examples/data/sample.json",
"name": "sample.json",
"output_folder": "examples/data",
"output_name": "sample.json",
"parent_folder_name": "data",
"stem": "sample"
},
{
"extension": "md",
"file_move_type": "Transform",
"folder": "examples/markdown",
"input_path": "examples/markdown/sample.md",
"name": "sample.md",
"output_folder": "examples/markdown",
"output_name": "sample.md",
"parent_folder_name": "markdown",
"stem": "sample"
},
{
"extension": "png",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/android-chrome-192x192.png",
"name": "android-chrome-192x192.png",
"output_folder": "favicons",
"output_name": "android-chrome-192x192.png",
"parent_folder_name": "favicons",
"stem": "android-chrome-192x192"
},
{
"extension": "png",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/android-chrome-512x512.png",
"name": "android-chrome-512x512.png",
"output_folder": "favicons",
"output_name": "android-chrome-512x512.png",
"parent_folder_name": "favicons",
"stem": "android-chrome-512x512"
},
{
"extension": "png",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/apple-touch-icon.png",
"name": "apple-touch-icon.png",
"output_folder": "favicons",
"output_name": "apple-touch-icon.png",
"parent_folder_name": "favicons",
"stem": "apple-touch-icon"
},
{
"extension": "xml",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/browserconfig.xml",
"name": "browserconfig.xml",
"output_folder": "favicons",
"output_name": "browserconfig.xml",
"parent_folder_name": "favicons",
"stem": "browserconfig"
},
{
"extension": "png",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/favicon-16x16.png",
"name": "favicon-16x16.png",
"output_folder": "favicons",
"output_name": "favicon-16x16.png",
"parent_folder_name": "favicons",
"stem": "favicon-16x16"
},
{
"extension": "png",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/favicon-32x32.png",
"name": "favicon-32x32.png",
"output_folder": "favicons",
"output_name": "favicon-32x32.png",
"parent_folder_name": "favicons",
"stem": "favicon-32x32"
},
{
"extension": "ico",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/favicon.ico",
"name": "favicon.ico",
"output_folder": "favicons",
"output_name": "favicon.ico",
"parent_folder_name": "favicons",
"stem": "favicon"
},
{
"extension": "png",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/mstile-150x150.png",
"name": "mstile-150x150.png",
"output_folder": "favicons",
"output_name": "mstile-150x150.png",
"parent_folder_name": "favicons",
"stem": "mstile-150x150"
},
{
"extension": "svg",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/safari-pinned-tab.svg",
"name": "safari-pinned-tab.svg",
"output_folder": "favicons",
"output_name": "safari-pinned-tab.svg",
"parent_folder_name": "favicons",
"stem": "safari-pinned-tab"
},
{
"extension": "webmanifest",
"file_move_type": "Copy",
"folder": "favicons",
"input_path": "favicons/site.webmanifest",
"name": "site.webmanifest",
"output_folder": "favicons",
"output_name": "site.webmanifest",
"parent_folder_name": "favicons",
"stem": "site"
},
{
"extension": "jpg",
"file_move_type": "Copy",
"folder": "images",
"input_path": "images/test-image.jpg",
"name": "test-image.jpg",
"output_folder": "images",
"output_name": "test-image.jpg",
"parent_folder_name": "images",
"stem": "test-image"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.3.0",
"input_path": "releases/aarch64-apple-darwin/0.3.0/ssb",
"name": "ssb",
"output_folder": "releases/aarch64-apple-darwin/0.3.0",
"output_name": "ssb",
"parent_folder_name": "0.3",
"stem": "ssb"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.4.0",
"input_path": "releases/aarch64-apple-darwin/0.4.0/ssb",
"name": "ssb",
"output_folder": "releases/aarch64-apple-darwin/0.4.0",
"output_name": "ssb",
"parent_folder_name": "0.4",
"stem": "ssb"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.5.0",
"input_path": "releases/aarch64-apple-darwin/0.5.0/ssb",
"name": "ssb",
"output_folder": "releases/aarch64-apple-darwin/0.5.0",
"output_name": "ssb",
"parent_folder_name": "0.5",
"stem": "ssb"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.6.0",
"input_path": "releases/aarch64-apple-darwin/0.6.0/ssb-0-6-x",
"name": "ssb-0-6-x",
"output_folder": "releases/aarch64-apple-darwin/0.6.0",
"output_name": "ssb-0-6-x",
"parent_folder_name": "0.6",
"stem": "ssb-0-6-x"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.6.1",
"input_path": "releases/aarch64-apple-darwin/0.6.1/ssb-0-6-x",
"name": "ssb-0-6-x",
"output_folder": "releases/aarch64-apple-darwin/0.6.1",
"output_name": "ssb-0-6-x",
"parent_folder_name": "0.6",
"stem": "ssb-0-6-x"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.6.2",
"input_path": "releases/aarch64-apple-darwin/0.6.2/ssb-0-6-x",
"name": "ssb-0-6-x",
"output_folder": "releases/aarch64-apple-darwin/0.6.2",
"output_name": "ssb-0-6-x",
"parent_folder_name": "0.6",
"stem": "ssb-0-6-x"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.6.3",
"input_path": "releases/aarch64-apple-darwin/0.6.3/ssb-0-6-x",
"name": "ssb-0-6-x",
"output_folder": "releases/aarch64-apple-darwin/0.6.3",
"output_name": "ssb-0-6-x",
"parent_folder_name": "0.6",
"stem": "ssb-0-6-x"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.7.0",
"input_path": "releases/aarch64-apple-darwin/0.7.0/ssb-0-7",
"name": "ssb-0-7",
"output_folder": "releases/aarch64-apple-darwin/0.7.0",
"output_name": "ssb-0-7",
"parent_folder_name": "0.7",
"stem": "ssb-0-7"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.7.1",
"input_path": "releases/aarch64-apple-darwin/0.7.1/ssb-0-7",
"name": "ssb-0-7",
"output_folder": "releases/aarch64-apple-darwin/0.7.1",
"output_name": "ssb-0-7",
"parent_folder_name": "0.7",
"stem": "ssb-0-7"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.7.2",
"input_path": "releases/aarch64-apple-darwin/0.7.2/ssb-0-7",
"name": "ssb-0-7",
"output_folder": "releases/aarch64-apple-darwin/0.7.2",
"output_name": "ssb-0-7",
"parent_folder_name": "0.7",
"stem": "ssb-0-7"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.7.3",
"input_path": "releases/aarch64-apple-darwin/0.7.3/ssb-0-7",
"name": "ssb-0-7",
"output_folder": "releases/aarch64-apple-darwin/0.7.3",
"output_name": "ssb-0-7",
"parent_folder_name": "0.7",
"stem": "ssb-0-7"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.7.4",
"input_path": "releases/aarch64-apple-darwin/0.7.4/ssb-0-7",
"name": "ssb-0-7",
"output_folder": "releases/aarch64-apple-darwin/0.7.4",
"output_name": "ssb-0-7",
"parent_folder_name": "0.7",
"stem": "ssb-0-7"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.8.0",
"input_path": "releases/aarch64-apple-darwin/0.8.0/ssb-0-8",
"name": "ssb-0-8",
"output_folder": "releases/aarch64-apple-darwin/0.8.0",
"output_name": "ssb-0-8",
"parent_folder_name": "0.8",
"stem": "ssb-0-8"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.8.1",
"input_path": "releases/aarch64-apple-darwin/0.8.1/ssb-0-8",
"name": "ssb-0-8",
"output_folder": "releases/aarch64-apple-darwin/0.8.1",
"output_name": "ssb-0-8",
"parent_folder_name": "0.8",
"stem": "ssb-0-8"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.8.2",
"input_path": "releases/aarch64-apple-darwin/0.8.2/ssb-0-8",
"name": "ssb-0-8",
"output_folder": "releases/aarch64-apple-darwin/0.8.2",
"output_name": "ssb-0-8",
"parent_folder_name": "0.8",
"stem": "ssb-0-8"
},
{
"extension": null,
"file_move_type": "Copy",
"folder": "releases/aarch64-apple-darwin/0.8.3",
"input_path": "releases/aarch64-apple-darwin/0.8.3/ssb-0-8",
"name": "ssb-0-8",
"output_folder": "releases/aarch64-apple-darwin/0.8.3",
"output_name": "ssb-0-8",
"parent_folder_name": "0.8",
"stem": "ssb-0-8"
},
{
"extension": "js",
"file_move_type": "Copy",
"folder": "scripts",
"input_path": "scripts/transform.mj.js",
"name": "transform.mj.js",
"output_folder": "scripts",
"output_name": "transform.mj.js",
"parent_folder_name": "scripts",
"stem": "transform.mj"
},
{
"extension": "css",
"file_move_type": "Copy",
"folder": "styles",
"input_path": "styles/highlight-base16-ocean-dark.css",
"name": "highlight-base16-ocean-dark.css",
"output_folder": "styles",
"output_name": "highlight-base16-ocean-dark.css",
"parent_folder_name": "styles",
"stem": "highlight-base16-ocean-dark"
},
{
"extension": "css",
"file_move_type": "Copy",
"folder": "styles",
"input_path": "styles/highlight-base16-ocean-light.css",
"name": "highlight-base16-ocean-light.css",
"output_folder": "styles",
"output_name": "highlight-base16-ocean-light.css",
"parent_folder_name": "styles",
"stem": "highlight-base16-ocean-light"
},
{
"extension": "css",
"file_move_type": "Copy",
"folder": "styles",
"input_path": "styles/main.css",
"name": "main.css",
"output_folder": "styles",
"output_name": "main.css",
"parent_folder_name": "styles",
"stem": "main"
},
{
"extension": "md",
"file_move_type": "Transform",
"folder": "tests",
"input_path": "tests/README.md",
"name": "README.md",
"output_folder": "tests",
"output_name": "README.md",
"parent_folder_name": "tests",
"stem": "README"
}
]
Test Transforming .txt Files
Test Transform JS with `.mj.js` extension
Test Raw
Release Notes
Version 0.8.3
-
A bunch of stuff changed that wasn't documented. See the todo checklist at the top where things show what's what
-
Deprecated
markdown_filein favor of usingfilter markdown -
changed
filetofile_detailsin the output that's available to files. -
Added
parent_folder_nametofile_deatils
Version 0.6.4
DATE: TBD
- TODO...
Version 0.6.3
Oct. 4. 2025
-
Removed deprecated message about find and replace not being included (it was added back in 0.6.2)
-
Removed deprecated JavaScript highlighting for all .js files (highlighting is done on a per file/pre request basis from the templates)
Version 0.6.2
Oct. 4, 2025
- Set up find/replace to work
with files that get highlighted or
processed by markdown by doing the
prep in the
.build-filesdir
Version 0.6.1
Oct. 4, 2025
-
Added highlight_file("file_path") function to replace original highlight_file["file_path"]
-
Added markdown_file("file_path") function to replace original markdown_file["file_path"]
-
Moved
config/find-replace.txttosupport/find-replace/*.txtdirectory that supports multiple text files.
Version 0.6.0
-
Added basic MiniJinja errors if something freaks out.
-
Starting to include the version numbers in the binary output for now so that older versions can hang around and be used on sites that are built with them and not have to worry about making breaking changes.
Names are like
ssb-0.6.xso that that non-breaking patches can be applied without changing the base number (for now, the second number (e.g..6is the major version that changes when breaking changes occur. Eventually it'll move to full semantic numbering with Major/Minor/Patch, but things need to stabilize more before a1.0.0is set) -
Looked at Updating so that
.jsfiles are treated as templates (e.g. can do include stuff from minijinja), but took it back out as it's to possible that the.jswill have something that fights with MiniJinja. -
Removed
scripts/file-prepthat ran against every file as a pre-processor. It bogged down on a moderately sized site. Might add it back in at some point since the issue is really the speed of the script/process that's being called out to. -
Renamed
scriptsdir tosupportwhich will contain scripts as well as plugins, find replace files, and data files.
Version 0.5.0
-
The content tree is moved to a
.build-filesdirectory and the build occurs from those files. -
Scripts inside the
scripts/file-prepdirectory are run over txt files during the move to the.build-filesdirectory to do things like find and replace or any other pre-processing work that needs to be done.
Version 0.4.0
Sept. 24, 2025
-
renamed
highlighttohighlight_file(highlightshows a deprecation message) -
renamed
markdowntomarkdown_file(markdownshows a deprecation message)
Version 0.3.0
Sept. 6, 2025
-
Ready for general personal use
-
See home page for details on features and functionality.
JSON Data Test
Processing .txt files with MiniJinja Worked!File Details
{
"extension": "html",
"file_move_type": "Transform",
"folder": "",
"input_path": "index.html",
"name": "index.html",
"output_folder": "",
"output_name": "index.html",
"parent_folder_name": null,
"stem": "index"
}