1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-11-30 10:49:00 +01:00
Go to file
Oliver Steele d263c04401 Lint
2017-07-04 08:29:11 -04:00
cmd/gojekyll Lint 2017-07-04 08:29:11 -04:00
collections Lint 2017-07-04 08:29:11 -04:00
config Coverage 2017-07-03 13:03:45 -04:00
filters Remove gratuitous liquid.Context wrapper 2017-07-02 21:17:32 -04:00
helpers Coverage 2017-07-03 13:03:45 -04:00
pages Use drops for site 2017-07-03 10:39:55 -04:00
pipelines Remove gratuitous liquid.Context wrapper 2017-07-02 21:17:32 -04:00
plugins Liquid renderers now return strings 2017-07-04 08:06:34 -04:00
scripts Add scripts/coverage 2017-06-22 17:37:32 -04:00
server Create MustRel 2017-07-01 21:12:22 -04:00
sites Coverage 2017-07-03 13:03:45 -04:00
tags Liquid renderers now return strings 2017-07-04 08:06:34 -04:00
templates Pipelines package 2017-06-24 14:00:19 -04:00
testdata/example Coverage 2017-07-03 11:48:06 -04:00
.gitignore Add scripts/coverage 2017-06-22 17:37:32 -04:00
.travis.yml Add coverage badge 2017-07-02 09:11:33 -04:00
LICENSE Create LICENSE 2017-06-11 19:18:10 -04:00
Makefile Go ahead and lint the tests 2017-07-02 09:10:40 -04:00
README.md README 2017-07-02 09:29:13 -04:00

Gojekyll

Build Status Go Report Card Coverage Status

Gojekyll is a re-implementation of the Jekyll static site generator, in the Go programming language.

Installation

  1. Install go. On macOS running Homebrew, brew install go is easier than the linked instructions.
  2. go get -u osteele/gojekyll/cmd/gojekyll
  3. You need Pygments in order use the {% highlight %} tag: pip install Pygments.

Usage

gojekyll build
gojekyll serve
gojekyll help
gojekyll help build

Limitations

  • Missing features:
    • themes, page tags, excerpts, plugins (except for a few listed below), pagination, math, warning mode.
    • Site variables: pages, static_files, html_pages, html_files, documents, and tags
    • Jekyll filters: group_by_exp, pop, shift, cgi_escape, uri_escape, scssify, and smartify.
    • Jekyll's include_relative tag
    • The Go Liquid engine is also missing some tags and a few filters. See its README for status.
    • Data files must be YAML. CSV and JSON data files are not supported.
  • {% highlight %} uses Pygments. There's no way to tell it to use Rouge. Also, I don't know what will happen if Pygments isn't installed.
  • <div markdown=1> doesn't work. I think this is a limitation of the Blackfriday Markdown processor.
  • This is a new code base. It probably panics or otherwise fails on a lot of legitimate constructs, and misbehaves on others.
  • Liquid errors aren't reported very nicely.

Other Differences

These will probably not change.

  • serve generates pages on the fly; it doesn't write to the file system.
  • Files are cached to /tmp/gojekyll-${USER}, not ./.sass-cache
  • Server live reload is always on.
  • The server reloads the _config.yml (and the rest of the site) when that file changes.
  • build with no -d option resolves the destination relative to the source directory, not the current directory.
  • Some plugins are built into the executable. Others may be added. There's no an extensible plugin mechanism in the near-to-medium future.

Timings

[go]jekyll -s jekyll/docs build on a late-2015 MacBook Pro, running current versions of everything as of 2017-07-01.

Executable Options Time
jekyll 18.53s
gojekyll single-threaded; cold cache 6.85s
gojekyll single-threaded; warm cache 0.61s
gojekyll multi-threaded; cache doesn't matter 0.34s

[There's currently no way to disable concurrency or the cache. They were switched off by re-building the executable to produce these timings.]

The cache is for calls to Pygments (via the highlight tag). For another site, SASS is greater overhead. This is another candidate for caching, but with multi-threading it may not matter.

Feature Status

  • Content
    • Front Matter
    • Posts
      • Categories
      • Tags
      • Drafts
      • Future
      • Related
    • Static Files
    • Variables
    • Collections
    • Data Files
      • CSV
      • JSON
      • YAML
    • Assets
      • Coffeescript
      • Sass/SCSS
  • Customization
    • Templates
      • Jekyll filters
        • group_by_exp pop shift cgi_escape uri_escape scssify smartify
        • everything else
      • Jekyll tags
        • include
        • include_relative
        • link
        • post_url
        • gist
        • highlight
    • Includes
      • include parameters
      • include variables (e.g. {% include {{ expr }} %})
    • Permalinks
    • Pagination
    • Plugins
      • jekyll-avatar
      • jekyll-coffeescript
      • jekyll-gist (ignores noscript: false)
      • jekyll-live-reload (always on)
      • jekyll-paginate
    • Themes
    • Layouts
  • Server
    • Directory watch
  • Commands
    • build
      • --source, --destination, --drafts, --future, --unpublished
      • --config, --baseurl, --lsi, --watch, etc.
      • won't implement: --force-polling, --limit-posts, --incremental, JEKYLL_ENV=production
    • clean
    • doctor
    • help
    • import
    • new
    • new-theme
    • serve
      • --open-uri
      • --detach, --host, --port, --baseurl
      • won't implement: --incremental, --ssl-*
  • Windows

Contributing

Install package dependencies and development tools:

make setup

Testing

make test
make lint
gojekyll  -s path/to/site render index.md      # render a file to stdout
gojekyll  -s path/to/site render /             # render a URL to stdout
gojekyll  -s path/to/site variables /          # print a file or URL's variables
./scripts/coverage && go tool cover -html=coverage.out

./scripts/gojekyll is an alternative to the gojekyll executable, that uses go run each time it's invoked.

Profiling

gojekyll -s path/to/site profile
go tool pprof gojekyll gojekyll.prof

Credits

Gojekyll uses these libraries:

Package Author(s) Description License
github.com/jaschaephraim/lrserver Jascha Ephraim Live Reload server MIT
github.com/osteele/liquid yours truly Liquid processor MIT
github.com/pkg/browser pkg The serve -o option to open the site in the browser BSD 2-clause "Simplified" License
github.com/russross/blackfriday Russ Ross Markdown processor Simplified BSD License
github.com/sass/libsass Listed here C port of the Ruby SASS compiler MIT
github.com/wellington/go-libsass Drew Wells Go bindings for libsass ???
gopkg.in/alecthomas/kingpin.v2 Alec Thomas command line and flag parser MIT
gopkg.in/yaml.v2 Canonical YAML support Apache License 2.0

In addition to being totally and obviously inspired by Jekyll, Jekyll's documentation was solid and indispensible. Many of the filter test cases are taken directly from the Jekyll documentation, and during development the Jekyll docs were always open in at least one tab.

The text for gojekyll help was taken from the output of jekyll help.

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.

Hugo is the pre-eminent Go static site generator. It isn't Jekyll-compatible (-), but it's extraordinarily polished, performant, and productized (+++).

Liquid is a Go implementation of Liquid templates. I wrote it for gojekyll, but it's implemented as a standalone library.

Jekyll, of course.

License

MIT