.github | ||
cache | ||
collection | ||
commands | ||
config | ||
docs | ||
filters | ||
frontmatter | ||
pages | ||
pipelines | ||
plugins | ||
scripts | ||
server | ||
site | ||
tags | ||
templates | ||
testdata/example | ||
utils | ||
.appveyor.yml | ||
.dockerignore | ||
.gitignore | ||
.goreleaser-darwin.yml | ||
.goreleaser.yml | ||
.travis.yml | ||
CONTRIBUTING.md | ||
Dockerfile | ||
LICENSE | ||
main.go | ||
Makefile | ||
README.md |
Gojekyll
Gojekyll is a partially-compatible clone of the Jekyll static site generator, written in the Go programming language. It provides build
and serve
commands, with directory watch and live reload.
Gojekyll | Jekyll | Hugo | |
---|---|---|---|
Stable | ✓ | ✓ | |
Fast | ✓ (~20×Jekyll) |
✓ | |
Template language | Liquid | Liquid | Go templates |
Jekyll compatibility | partial | ✓ | |
Plugins | some | yes | ? |
Runs on Windows | ✓ | ✓ | |
Implementation language | Go | Ruby | Go |
Usage
gojekyll build # builds the site in the current directory into _site
gojekyll serve # serve the app at http://localhost:4000; reload on changes
gojekyll help
gojekyll help build
Installation
Binary Downloads
- Ubuntu (64-bit) and macOS binaries are available from the releases page.
- [Optional] To use the
{% highlight %}
tag, you also need Pygments:pip install Pygments
.
From Source
Pre-requisites:
- Install go (1) via Homebrew:
brew install go
; or (2) download. - [Optional] To use the
{% highlight %}
tag, you also need Pygments:pip install Pygments
.
First-time install:
go get github.com/osteele/gojekyll
[Later] Update to the latest version:
go get -u github.com/osteele/liquid github.com/osteele/gojekyll
[Optional] Install command-line autocompletion:
# Bash:
eval "$(gojekyll --completion-script-bash)"
# Zsh:
eval "$(gojekyll --completion-script-zsh)"
Status
This project is at an early stage of development.
It works on the GitHub Pages sites that I care about, and it looks credible on a spot-check of other Jekyll sites.
Current Limitations
Missing features:
- Themes
- Pagination
- Math
- Plugin system. (Some plugins are emulated.)
- Liquid filter
sassify
- Markdown features: attribute lists,
markdown=1
. site.data
is not sorted.- Windows compatibility
Also see the detailed status below.
Other Differences
These will probably not change:
By design:
- Plugins must be listed in the config file, not a Gemfile.
- Liquid is run in strict mode; undefined filters are errors.a
- The wrong type in a
_config.yml
is an error. - Server live reload is always on.
serve --watch
(the default) reloads the_config.yml
and data files too.serve
generates pages on the fly; it doesn't write to the file system.- Files are cached in
/tmp/gojekyll-${USER}
, not./.sass-cache
- Jekyll provides an (undocumented)
jekyll.version
variable to templates. Copying this didn't seem right.
Muzukashii:
- An extensible plugin mechanism – support for plugins that aren't compiled into the executable.
Feature Checklist
- Content
- Front Matter
- Posts
- Static Files
- Variables
- Collections
- Data Files
- Assets
- Coffeescript
- Sass/SCSS
- Customization
- Templates
- Jekyll filters
group_by_exp
andscssify
- everything else
- Jekyll tags
- Jekyll filters
- Includes
- Permalinks
- Pagination
- Plugins – partial; see here
- Themes
- Layouts
- Templates
- Server
- Directory watch
- Commands
build
--source
,--destination
,--drafts
,--future
,--unpublished
,--watch
--baseurl
,--config
,--incremental
,--lsi
--force_polling
,--limit-posts
,JEKYLL_ENV=production
– not planned
clean
help
serve
--open-uri
,--host
,--port
,–watch
(enabled by default)--baseurl
,--config
,--incremental
--detach
,--ssl
-* – not planned
doctor
,import
,new
,new-theme
– not planned
- Windows
Contributing
Bug reports, test cases, and code contributions are more than welcome.
Attribution
Gojekyll uses these libraries:
Package | Author(s) | Usage | License |
---|---|---|---|
github.com/jaschaephraim/lrserver | Jascha Ephraim | Live Reload | MIT License |
github.com/dchest/cssmin | Dmitry Chestnykh | CSS minimization | BSD 3-clause "New" or "Revised" License |
github.com/kyokomi/emoji | kyokomi | jemoji plugin emulation |
MIT License |
github.com/osteele/liquid | yours truly | Liquid processor | MIT License |
github.com/pkg/browser | pkg | serve --open-url option |
BSD 2-clause "Simplified" License |
github.com/russross/blackfriday | Russ Ross | Markdown processing | Simplified BSD License |
github.com/sass/libsass | Listed here | C port of the Ruby SASS compiler | MIT License |
github.com/wellington/go-libsass | Drew Wells | Go bindings for libsass | ??? |
gopkg.in/alecthomas/kingpin.v2 | Alec Thomas | command-line arguments | MIT License |
gopkg.in/yaml.v2 | Canonical | YAML support | Apache License 2.0 |
In addition, the following pieces of text were taken from Jekyll and its plugins. They are used under the terms of the MIT License.
Source | Use | Description |
---|---|---|
jekyll help command |
gojekyll help text |
help text |
Jekyll template documentation | test cases | filter examples |
jekyll-feed plugin |
plugin emulation | feed.xml template |
jekyll-redirect-from plugin |
plugin emulation | redirect page template |
jekyll-sitemap plugin |
plugin emulation | sitemap template |
jekyll-seo-tag plugin |
plugin emulation | feed template |
The theme for in-browser error reporting was adapted from facebookincubator/create-react-app.
The gopher image in the testdata
directory is from Wikimedia Commons. It is used under the Creative Commons Attribution-Share Alike 3.0 Unported license.
In addition to being totally and obviously inspired by Jekyll and its plugins, Jekyll's solid documentation was indispensible --- especially since I wanted to implement Jekyll as documented, not port its source code. The Jekyll docs were always open in at least one tab during development.
Related
Hugo is the pre-eminent Go static site generator. It isn't Jekyll-compatible (-), but it's highly polished, performant, and productized (+++).
jkl is another Go clone of Jekyll. If I'd found it sooner I might have started this project by forking that one. It's got a better name.
Liquid is a pure Go implementation of Liquid templates, that I finally caved and wrote in order to use in this project.
Jekyll, of course.
License
MIT