1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-11-30 09:49:00 +01:00
Go to file
2017-07-11 13:36:09 -04:00
.github Update docs to point to issues. 2017-07-09 19:20:26 -04:00
cache Cache sass conversion 2017-07-09 18:19:22 -04:00
cmd/gojekyll First pass at SEO tag 2017-07-11 13:36:09 -04:00
collection Don't apply permalinks to static files 2017-07-10 14:14:42 -04:00
config Move helpers -> utils 2017-07-09 16:17:20 -04:00
filters group_by was returning reflection values 2017-07-11 13:36:09 -04:00
frontmatter remove page.RenderContext 2017-07-10 13:23:51 -04:00
pages Don't apply permalinks to static files 2017-07-10 14:14:42 -04:00
pipelines Rename PathError -> WrapPathError 2017-07-10 14:33:06 -04:00
plugins First pass at SEO tag 2017-07-11 13:36:09 -04:00
scripts Add scripts/coverage 2017-06-22 17:37:32 -04:00
server Move helpers -> utils 2017-07-09 16:17:20 -04:00
site Rename PathError -> WrapPathError 2017-07-10 14:33:06 -04:00
tags Update to Liquid API Engine interface -> struct 2017-07-10 09:17:31 -04:00
templates Use template.SetSourceLocation instead of adding fake whitespace 2017-07-09 11:57:20 -04:00
testdata/example Coverage 2017-07-03 11:48:06 -04:00
utils First pass at SEO tag 2017-07-11 13:36:09 -04:00
.appveyor.yml move mingw install from init 2017-07-06 22:15:35 -04:00
.gitignore experiment with goreleaser 2017-07-09 22:40:01 -04:00
.goreleaser.yml experiment with goreleaser 2017-07-09 22:40:01 -04:00
.travis.yml Try pip install --user 2017-07-04 18:01:53 -04:00
benchmarks.md Update docs to point to issues. 2017-07-09 19:20:26 -04:00
CONTRIBUTING.md Update docs to point to issues. 2017-07-09 19:20:26 -04:00
LICENSE Create LICENSE 2017-06-11 19:18:10 -04:00
Makefile Add version subcommand 2017-07-05 11:18:46 -04:00
README.md Complete #11 cgi_escape and uri_escape 2017-07-10 17:16:53 -04:00
version_test.go rename 2017-07-09 09:37:23 -04:00
version.go Add version subcommand 2017-07-05 11:18:46 -04:00

Gojekyll

Gojekyll is a clone of the Jekyll static site generator, written in the Go programming language. It supports the build and serve commands, with directory watch and live reload.

I wrote this in order to learn Go. I was also hoping for faster preview of changes to GitHub Pages.

Gojekyll is incomplete, minimally tested, and doesn't run on Windows. It appears to be about twenty times faster than Jekyll, so that's something.

Installation

First-time install:

  1. Install go. (On macOS running Homebrew, brew install go is easier than the Install instructions on the Go site.)
  2. go get osteele/gojekyll/cmd/gojekyll
  3. To use the {% highlight %} tag, you also need Pygments. pip install Pygments.

Update to the latest version:

  • go get -u github.com/osteele/liquid github.com/osteele/gojekyll/cmd/gojekyll

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

Status

This project is at an early stage of development.

It works on the Google Pages sites that I care about, and it looks credible on a spot-check of other Jekyll sites.

It doesn't run on Windows, and it may not work for you.

In addition to the limitations listed below, this software isn't robust. Jekyll, Hugo, and other mature projects have lots of test coverage, and have had lots of testing by lots of people. I've this used only in limited ways, in the month since I started writing it.

Current Limitations

Missing features:

  • Themes
  • Excerpts
  • Pagination
  • Math
  • CSV and JSON data files
  • Plugins. (Some plugins are emulated. See the plugin board for their status.)
  • Template filters group_by_exp and scssify
  • More Liquid tags and filters, listed here.
  • Markdown features: attribute lists, automatic ids, markdown=1.
  • site.data is not sorted.
  • Windows compatibility

Also see the detailed status below.

Other Differences

These will probably not change:

By design:

  • Having the wrong type in a _config.yml is an error.
  • Plugins must be listed in the config file, not a Gemfile.
  • 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.
  • serve --watch (the default) reloads _config.yml too.
  • Jekyll provides an (undocumented) jekyll.version variable to templates. Copying this didn't seem right.
  • Incremental build. The emphasis is on optimizing the non-incremental case. This is easier with fewer code paths.

Muzukashii:

  • uniq on objects (things that aren't strings or numbers) doesn't work the way it does in Jekyll / Shopify Liquid. See the Go Liquid differences for more on this.
  • An extensible plugin mechanism support for plugins that aren't compiled into the executable.

Feature Checklist

  • 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 and scssify
        • everything else
      • Jekyll tags
        • include
        • include_relative
        • link
        • post_url
        • 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, --no-watch
      • not planned: --force-polling, --limit-posts, --incremental, JEKYLL_ENV=production
    • clean
    • help
    • serve
      • --open-uri, --host, --port
      • --detach, --baseurl
      • not planned: --incremental, --ssl-*
    • not planned: doctor, import, new, new-theme
  • Windows

Also see:

  • The feature parity board board lists differences between Jekyll and gojekyll in more detail.
  • The plugin board lists the implementation status of common plugins. (Gojekyll lacks an extensible plugin mechanism. The goal is to be able to use it to build Jekyll sites that use the most popular plugins.)
  • The Go Liquid feature parity board to see differences between the real Liquid library and the one that is used in gojekyll.

Contributing

Bug reports, test cases, and code contributions are more than welcome. Please refer to the contribution guidelines.

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

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.

Hugo is the pre-eminent Go static site generator. It isn't Jekyll-compatible (-), but it's extraordinarily 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, too.

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