[DRE-commits] [jekyll] 03/12: Imported Upstream version 3.0.1+dfsg
Youhei SASAKI
uwabami-guest at moszumanska.debian.org
Sun Dec 27 14:49:35 UTC 2015
This is an automated email from the git hooks/post-receive script.
uwabami-guest pushed a commit to branch master
in repository jekyll.
commit c3d8e1a7e997819141b86e4280b64c0196123962
Author: Youhei SASAKI <uwabami at gfd-dennou.org>
Date: Mon Dec 7 01:30:30 2015 +0900
Imported Upstream version 3.0.1+dfsg
---
.gitignore | 5 +
.jrubyrc | 6 +
.travis.yml | 32 +-
CONDUCT.md | 22 +
CONTRIBUTING.markdown | 39 +-
Gemfile | 55 +-
History.markdown | 561 ++++++++++-
LICENSE | 8 +-
README.markdown | 29 +-
Rakefile | 87 +-
benchmark/end-with-vs-regexp | 13 +
benchmark/flat-map | 16 +
benchmark/hash-fetch | 9 +
benchmark/jekyll-sanitize-path | 46 +
benchmark/proc-call-vs-yield | 14 +
benchmark/sequential-assignment | 11 +
benchmark/string-concat | 8 +
benchmark/string-replacement | 13 +
benchmark/symbol-to-proc | 6 +
bin/jekyll | 18 +-
checksums.yaml.gz | Bin 271 -> 0 bytes
cucumber.yml | 3 -
docs/jp/CONTRIBUTING.jp.markdown | 93 --
docs/jp/README.jp.markdown | 68 --
features/collections.feature | 24 +-
features/create_sites.feature | 20 +-
features/data.feature | 14 +
features/drafts.feature | 2 +-
features/embed_filters.feature | 8 +-
features/frontmatter_defaults.feature | 39 +-
features/hooks.feature | 326 ++++++
features/include_tag.feature | 37 +-
features/incremental_rebuild.feature | 60 ++
features/markdown.feature | 43 +-
features/pagination.feature | 7 +-
features/permalinks.feature | 41 +-
features/plugins.feature | 34 +
features/post_data.feature | 26 +-
features/post_excerpts.feature | 4 +-
features/rendering.feature | 28 +-
features/site_configuration.feature | 58 +-
features/step_definitions/jekyll_steps.rb | 49 +-
features/support/env.rb | 61 +-
features/support/overview.rb | 147 +++
jekyll.gemspec | 71 +-
lib/jekyll.rb | 156 +--
lib/jekyll/cleaner.rb | 162 +--
lib/jekyll/collection.rb | 83 +-
lib/jekyll/command.rb | 30 +-
lib/jekyll/commands/build.rb | 20 +-
lib/jekyll/commands/clean.rb | 44 +
lib/jekyll/commands/docs.rb | 30 -
lib/jekyll/commands/doctor.rb | 34 +-
lib/jekyll/commands/help.rb | 33 +
lib/jekyll/commands/new.rb | 110 +-
lib/jekyll/commands/serve.rb | 46 +-
lib/jekyll/configuration.rb | 204 ++--
lib/jekyll/converters/markdown.rb | 10 +-
lib/jekyll/converters/markdown/kramdown_parser.rb | 11 +-
lib/jekyll/converters/markdown/maruku_parser.rb | 55 -
lib/jekyll/converters/markdown/rdiscount_parser.rb | 2 +-
lib/jekyll/converters/markdown/redcarpet_parser.rb | 14 +-
lib/jekyll/converters/textile.rb | 50 -
lib/jekyll/convertible.rb | 111 +-
lib/jekyll/deprecator.rb | 38 +-
lib/jekyll/document.rb | 293 +++++-
lib/jekyll/draft.rb | 40 -
lib/jekyll/entry_filter.rb | 2 +-
lib/jekyll/excerpt.rb | 85 +-
lib/jekyll/external.rb | 59 ++
lib/jekyll/filters.rb | 116 ++-
lib/jekyll/frontmatter_defaults.rb | 64 +-
lib/jekyll/hooks.rb | 101 ++
lib/jekyll/layout.rb | 4 +
lib/jekyll/liquid_renderer.rb | 39 +
lib/jekyll/liquid_renderer/file.rb | 50 +
lib/jekyll/liquid_renderer/table.rb | 94 ++
lib/jekyll/log_adapter.rb | 31 +-
lib/jekyll/mime.types | 893 ++++++++++++++--
lib/jekyll/page.rb | 33 +-
lib/jekyll/plugin.rb | 11 +-
lib/jekyll/plugin_manager.rb | 32 +-
lib/jekyll/post.rb | 320 ------
lib/jekyll/publisher.rb | 4 +-
lib/jekyll/reader.rb | 126 +++
lib/jekyll/readers/collection_reader.rb | 21 +
lib/jekyll/readers/data_reader.rb | 69 ++
lib/jekyll/{ => readers}/layout_reader.rb | 6 +-
lib/jekyll/readers/page_reader.rb | 21 +
lib/jekyll/readers/post_reader.rb | 62 ++
lib/jekyll/readers/static_file_reader.rb | 21 +
lib/jekyll/regenerator.rb | 176 ++++
lib/jekyll/related_posts.rb | 13 +-
lib/jekyll/renderer.rb | 49 +-
lib/jekyll/site.rb | 348 +++----
lib/jekyll/static_file.rb | 79 +-
lib/jekyll/tags/highlight.rb | 43 +-
lib/jekyll/tags/include.rb | 64 +-
lib/jekyll/tags/post_url.rb | 37 +-
lib/jekyll/url.rb | 54 +-
lib/jekyll/utils.rb | 273 +++--
lib/jekyll/utils/platforms.rb | 30 +
lib/jekyll/version.rb | 2 +-
lib/site_template/.gitignore | 4 +-
lib/site_template/_config.yml | 17 +-
lib/site_template/_includes/footer.html | 75 +-
lib/site_template/_includes/head.html | 16 +-
lib/site_template/_includes/header.html | 21 +-
lib/site_template/_includes/icon-github.html | 1 +
lib/site_template/_includes/icon-github.svg | 1 +
lib/site_template/_includes/icon-twitter.html | 1 +
lib/site_template/_includes/icon-twitter.svg | 1 +
lib/site_template/_layouts/default.html | 11 +-
lib/site_template/_layouts/page.html | 12 +-
lib/site_template/_layouts/post.html | 14 +-
.../0000-00-00-welcome-to-jekyll.markdown.erb | 13 +-
lib/site_template/_sass/_base.scss | 206 ++++
lib/site_template/_sass/_layout.scss | 242 +++++
lib/site_template/_sass/_syntax-highlighting.scss | 71 ++
lib/site_template/about.md | 8 +-
lib/site_template/css/main.css | 410 --------
lib/site_template/css/main.scss | 53 +
lib/site_template/feed.xml | 4 +-
lib/site_template/index.html | 11 +-
metadata.yml | 957 ------------------
script/bootstrap | 4 +-
script/branding | 2 +-
script/cibuild | 18 +-
script/cucumber | 11 +
script/proof | 36 +-
script/rebund | 2 +-
script/rubyprof | 19 +
script/stackprof | 16 +
script/test | 59 +-
script/vendor-mimes | 35 +
site/README | 1 -
site/README.md | 16 +
site/_config.yml | 20 +-
site/_data/docs.yml | 1 +
site/_docs/assets.md | 93 ++
site/_docs/collections.md | 380 +++++++
site/{docs => _docs}/configuration.md | 313 ++++--
site/{docs => _docs}/continuous-integration.md | 82 +-
site/{docs => _docs}/contributing.md | 73 +-
site/{docs => _docs}/datafiles.md | 63 +-
site/{docs => _docs}/deployment-methods.md | 79 +-
site/_docs/drafts.md | 20 +
site/{docs => _docs}/extras.md | 2 -
site/{docs => _docs}/frontmatter.md | 38 +-
site/{docs => _docs}/github-pages.md | 55 +-
site/{docs => _docs}/history.md | 616 +++++++++++-
site/{docs => _docs}/index.md | 8 +-
site/{docs => _docs}/installation.md | 14 +-
site/{docs => _docs}/migrations.md | 2 -
site/{docs => _docs}/pages.md | 20 +-
site/{docs => _docs}/pagination.md | 53 +-
site/_docs/permalinks.md | 307 ++++++
site/{docs => _docs}/plugins.md | 422 +++++++-
site/{docs => _docs}/posts.md | 108 +-
site/{docs => _docs}/quickstart.md | 7 +-
site/{docs => _docs}/resources.md | 9 +-
site/{docs => _docs}/sites.md | 4 +-
site/_docs/static_files.md | 52 +
site/{docs => _docs}/structure.md | 53 +-
site/{docs => _docs}/templates.md | 87 +-
site/_docs/troubleshooting.md | 207 ++++
site/{docs => _docs}/upgrading.md | 64 +-
site/{docs => _docs}/usage.md | 43 +-
site/{docs => _docs}/variables.md | 36 +-
site/{docs => _docs}/windows.md | 8 +-
site/_includes/analytics.html | 8 +-
site/_includes/anchor_links.html | 3 +-
site/_includes/css/font-awesome.css | 44 -
site/_includes/css/pygments.css | 72 --
site/_includes/css/style.css | 1045 -------------------
site/_includes/docs_option.html | 2 +-
site/_includes/docs_ul.html | 3 +-
site/_includes/footer.html | 2 +-
site/_includes/header.html | 6 +-
site/_includes/news_item.html | 2 +-
site/_includes/primary-nav-items.html | 2 +-
site/_includes/section_nav.html | 59 +-
site/_includes/top.html | 2 +-
site/_layouts/docs.html | 3 +
site/_layouts/news_item.html | 2 +-
site/_layouts/page.html | 18 +
.../2013-10-28-jekyll-1-3-0-rc1-released.markdown | 2 -
.../2013-12-09-jekyll-1-4-1-released.markdown | 2 -
site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown | 4 +-
...014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown | 4 +-
.../2014-07-29-jekyll-2-2-0-released.markdown | 2 +-
.../2014-08-10-jekyll-2-3-0-released.markdown | 41 +
.../2014-09-09-jekyll-2-4-0-released.markdown | 25 +
...ylls-midlife-crisis-jekyll-turns-2-5-0.markdown | 47 +
.../2014-11-08-jekyll-2-5-1-released.markdown | 29 +
.../2014-11-12-jekyll-2-5-2-released.markdown | 18 +
...2014-12-17-alfredxing-welcome-to-jekyll-core.md | 27 +
.../2014-12-22-jekyll-2-5-3-released.markdown | 20 +
.../2015-01-20-jekyll-meet-and-greet.markdown | 20 +
...2015-01-24-jekyll-3-0-0-beta1-released.markdown | 40 +
.../2015-02-26-introducing-jekyll-talk.markdown | 15 +
.../_posts/2015-10-26-jekyll-3-0-released.markdown | 35 +
.../2015-11-17-jekyll-3-0-1-released.markdown | 25 +
site/_sass/_font-awesome.scss | 25 +
.../css/gridism.css => _sass/_gridism.scss} | 44 +-
site/_sass/_mixins.scss | 38 +
site/_sass/_pygments.scss | 78 ++
site/_sass/_style.scss | 998 ++++++++++++++++++
site/css/screen.css | 31 -
site/css/screen.scss | 9 +
site/docs/assets.md | 66 --
site/docs/collections.md | 259 -----
site/docs/drafts.md | 21 -
site/docs/permalinks.md | 188 ----
site/docs/troubleshooting.md | 147 ---
site/feed.xml | 48 -
site/fonts/FontAwesome.otf | Bin 75188 -> 0 bytes
site/fonts/fontawesome-webfont.eot | Bin 72449 -> 68875 bytes
site/fonts/fontawesome-webfont.svg | 1064 +++++++++++---------
site/fonts/fontawesome-webfont.ttf | Bin 141564 -> 138204 bytes
site/fonts/fontawesome-webfont.woff | Bin 83760 -> 81284 bytes
site/fonts/fontawesome-webfont.woff2 | Bin 0 -> 64464 bytes
site/help/index.md | 36 +
site/img/jekyll-sticker.jpg | Bin 127782 -> 116915 bytes
site/index.html | 4 +-
site/latest_version.txt | 1 +
test/fixtures/broken_front_matter3.erb | 1 -
test/helper.rb | 105 +-
test/simplecov_custom_profile.rb | 10 +
test/source/+/%# +.md | 2 +-
test/source/_data/products.yml | 5 +-
test/source/_includes/tmp | 1 +
test/source/_includes_custom/custom.html | 1 +
test/source/_methods/escape-+ #%20[].md | 5 +
test/source/_methods/um_hi.md | 7 +-
test/source/_methods/yaml_with_dots.md | 8 +
...d.textile => 2008-02-02-not-published.markdown} | 0
...ished.textile => 2008-02-02-published.markdown} | 1 -
...foo-bar.textile => 2008-10-18-foo-bar.markdown} | 4 +-
...complex.textile => 2008-11-21-complex.markdown} | 0
...extile => 2008-12-03-permalinked-post.markdown} | 0
test/source/_posts/2008-12-13-include.markdown | 2 +-
...extile => 2009-01-27-array-categories.markdown} | 0
...ries.textile => 2009-01-27-categories.markdown} | 0
...tegory.textile => 2009-01-27-category.markdown} | 0
...extile => 2009-01-27-empty-categories.markdown} | 0
....textile => 2009-01-27-empty-category.markdown} | 0
...ory.textile => 2009-01-27-no-category.markdown} | 0
...y-tag.textile => 2009-05-18-empty-tag.markdown} | 0
...tags.textile => 2009-05-18-empty-tags.markdown} | 0
...9-05-18-tag.textile => 2009-05-18-tag.markdown} | 0
...05-18-tags.textile => 2009-05-18-tags.markdown} | 0
...yaml.textile => 2009-06-22-empty-yaml.markdown} | 0
...no-yaml.textile => 2009-06-22-no-yaml.markdown} | 0
...e.textile => 2010-01-09-date-override.markdown} | 0
...e.textile => 2010-01-09-time-override.markdown} | 0
...xtile => 2010-01-09-timezone-override.markdown} | 0
...a.textile => 2010-01-16-override-data.markdown} | 0
...yout.textile => 2013-01-12-nil-layout.markdown} | 0
...ayout.textile => 2013-01-12-no-layout.markdown} | 0
...textile => 2013-05-10-number-category.markdown} | 0
.../2013-07-22-post-excerpt-with-layout.markdown | 1 +
.../2013-12-17-include-variable-filters.markdown | 4 +
test/source/_posts/2013-12-20-properties.text | 2 +-
...2014-07-05-another-mixed-case-category.markdown | 7 +
.../_posts/2014-07-05-mixed-case-category.markdown | 7 +
.../_posts/2014-09-02-relative-includes.markdown | 29 +
.../2014-11-24-Rmd-extension.Rmd} | 0
.../2015-01-08-post-excerpt-separator.markdown | 15 +
.../2015-02-20-extensionless-permalink.markdown | 7 +
...1-nested.textile => 2008-11-21-nested.markdown} | 0
test/source/_posts/include_relative/params.html | 7 +
.../_posts/include_relative/rel_include.html | 1 +
test/source/_slides/example-slide-1.html | 2 +
test/source/_slides/example-slide-4.html | 15 +
.../{example-slide-1.html => example-slide-5.html} | 3 +-
test/source/_slides/example-slide-6.html | 15 +
test/source/_slides/example-slide-Upper-Cased.html | 6 +
test/source/_slides/non-outputted-slide.html | 7 +
test/source/_slides/octojekyll.png | Bin 0 -> 22360 bytes
test/source/_with.dots/file.with.dots.md | 4 +
...ories.textile => 2008-9-23-categories.markdown} | 0
test/source/deal.with.dots.html | 3 +-
...st.textile => 2008-12-12-topical-post.markdown} | 0
test/source/js/coffeescript.coffee | 3 +-
test/source/static_files.html | 2 +-
test/source/symlink-test/_data | 1 +
test/source/symlink-test/symlinked-dir | 1 +
test/source/symlink-test/symlinked-file | 23 +-
...ories.textile => 2008-9-23-categories.markdown} | 0
test/suite.rb | 11 -
test/test_cleaner.rb | 16 +-
test/test_coffeescript.rb | 24 +-
test/test_collections.rb | 38 +-
test/test_command.rb | 43 +-
test/test_configuration.rb | 120 ++-
test/test_convertible.rb | 10 +-
test/test_document.rb | 312 ++++--
test/test_draft.rb | 56 --
test/test_entry_filter.rb | 53 +-
test/test_excerpt.rb | 71 +-
test/test_filters.rb | 207 +++-
test/test_front_matter_defaults.rb | 178 ++++
test/test_generated_site.rb | 44 +-
test/test_kramdown.rb | 14 +-
test/test_layout_reader.rb | 12 +-
test/test_liquid_extensions.rb | 2 +-
test/test_liquid_renderer.rb | 26 +
test/test_log_adapter.rb | 71 +-
test/test_new_command.rb | 27 +-
test/test_page.rb | 79 +-
test/test_path_sanitization.rb | 4 +-
test/test_plugin_manager.rb | 33 +
test/test_post.rb | 741 --------------
test/test_rdiscount.rb | 35 +-
test/test_redcarpet.rb | 19 +-
test/test_redcloth.rb | 86 --
test/test_regenerator.rb | 327 ++++++
test/test_related_posts.rb | 54 +-
test/test_sass.rb | 6 +-
test/test_site.rb | 191 ++--
test/test_static_file.rb | 133 +++
test/test_tags.rb | 495 +++++++--
test/test_url.rb | 34 +-
test/test_utils.rb | 133 ++-
325 files changed, 13832 insertions(+), 7852 deletions(-)
diff --git a/.gitignore b/.gitignore
index 42bba81..d75a498 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,9 @@ gh-pages/
site/_site/
coverage
.ruby-version
+.ruby-gemset
.sass-cache
+tmp/*
+.jekyll-metadata
+/vendor
+/test/source/file_name.txt
diff --git a/.jrubyrc b/.jrubyrc
new file mode 100644
index 0000000..c4f9370
--- /dev/null
+++ b/.jrubyrc
@@ -0,0 +1,6 @@
+backtrace.mask=true
+compile.invokedynamic=true
+objectspace.enabled=true
+backtrace.color=true
+compat.version=2.2
+backtrace.style=mri
diff --git a/.travis.yml b/.travis.yml
index 09b649a..8026187 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,27 +1,35 @@
language: ruby
cache: bundler
-install:
-- script/rebund download
-- travis_retry bundle install --path vendor/bundle
+sudo: false
rvm:
+- 2.2
- 2.1
- 2.0
-- 1.9.3
+- ruby-head
+- jruby-9.0.3.0
+matrix:
+ allow_failures:
+ - rvm: ruby-head
+ - rvm: jruby-9.0.3.0
+ exclude:
+ - rvm: jruby-9.0.3.0
+ env: TEST_SUITE=cucumber
+env:
+ matrix:
+ - TEST_SUITE=test
+ - TEST_SUITE=cucumber
+before_script: bundle update
script: script/cibuild
-after_script:
-- script/rebund upload
notifications:
irc:
on_success: change
on_failure: change
channels:
- - irc.freenode.org#jekyll
+ - irc.freenode.org#jekyll
template:
- - '%{repository}#%{build_number} (%{branch}) %{message} %{build_url}'
+ - "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}"
email:
on_success: never
on_failure: never
-env:
- global:
- - secure: bt5nglPTdsc0N5fB1dOJz2WbM81dGpDuVD8PnhEsxgUfoo6xavhU4+pNrUADlSUqQ1aJrdU+MKW4x+JZ2ZnJS8vOpNzRymuMZSbFaljK4pgFGiKFgBdMKxVikvoYcxKCjLAl7NJZ11W6hUw+JtJScClDZwrJJAQB6I7Isp/LsdM=
- - secure: Ym8nx7nbfGYGo47my92M+deJykaiMkdZdb615EO51liv/xy/0aQ919Jpfieugc9d3zVnm+zFGPbpv4YzRpsik6OlVBNa4lP+BnQ27ptf5YcLWD8Hksi7845WFLecXMoaTCoYer/TvYZsIWJb2nSDMH9qbfZhnd1YZKuvUpK0rEU=
+ slack:
+ secure: dNdKk6nahNURIUbO3ULhA09/vTEQjK0fNbgjVjeYPEvROHgQBP1cIP3AJy8aWs8rl5Yyow4YGEilNRzKPz18AsFptVXofpwyqcBxaCfmHP809NX5PHBaadydveLm+TNVao2XeLXSWu+HUNAYO1AanCUbJSEyJTju347xCBGzESU=
diff --git a/CONDUCT.md b/CONDUCT.md
new file mode 100644
index 0000000..65c05c5
--- /dev/null
+++ b/CONDUCT.md
@@ -0,0 +1,22 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic addresses, without explicit permission
+* Other unethical or unprofessional conduct.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
+
+This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
+
+This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
\ No newline at end of file
diff --git a/CONTRIBUTING.markdown b/CONTRIBUTING.markdown
index 9453341..f83249c 100644
--- a/CONTRIBUTING.markdown
+++ b/CONTRIBUTING.markdown
@@ -4,18 +4,19 @@ Contribute
So you've got an awesome idea to throw into Jekyll. Great! Please keep the
following in mind:
+* **Use https://talk.jekyllrb.com for non-technical or indirect Jekyll questions that are not bugs.**
* **Contributions will not be accepted without tests or necessary documentation updates.**
* If you're creating a small fix or patch to an existing feature, just a simple
test will do. Please stay in the confines of the current test suite and use
[Shoulda](https://github.com/thoughtbot/shoulda/tree/master) and
- [RR](https://github.com/rr/rr).
+ [RSpec-Mocks](https://github.com/rspec/rspec-mocks).
* If it's a brand new feature, make sure to create a new
[Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps
where appropriate. Also, whipping up some documentation in your fork's `site`
would be appreciated, and once merged it will be transferred over to the main
`site`, jekyllrb.com.
* If your contribution changes any Jekyll behavior, make sure to update the
- documentation. It lives in `site/docs`. If the docs are missing information,
+ documentation. It lives in `site/_docs`. If the docs are missing information,
please feel free to add it in. Great docs make a great project!
* Please follow the [GitHub Ruby Styleguide](https://github.com/styleguide/ruby)
when modifying Ruby code.
@@ -30,16 +31,25 @@ Test Dependencies
-----------------
To run the test suite and build the gem you'll need to install Jekyll's
-dependencies. Jekyll uses Bundler, so a quick run of the bundle command and
-you're all set!
+dependencies. Simply run this command to get all setup:
- $ bundle
+ $ script/bootstrap
Before you start, run the tests and make sure that they pass (to confirm your
environment is configured properly):
- $ bundle exec rake test
- $ bundle exec rake features
+ $ script/cibuild
+
+If you are only updating a file in `test/`, you can use the command:
+
+ $ script/test test/blah_test.rb
+
+If you are only updating a `.feature` file, you can use the command:
+
+ $ script/cucumber features/blah.feature
+
+Both `script/test` and `script/cucumber` can be run without arguments to
+run its entire respective suite.
Workflow
--------
@@ -47,10 +57,10 @@ Workflow
Here's the most direct way to get your work merged into the project:
* Fork the project.
-* Clone down your fork ( `git clone git at github.com:<username>/jekyll.git` ).
+* Clone down your fork ( `git clone git at github.com:[username]/jekyll.git` ).
* Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ).
* Hack away, add tests. Not necessarily in that order.
-* Make sure everything still passes by running `rake`.
+* Make sure everything still passes by running `script/cibuild`.
* If necessary, rebase your commits into logical chunks, without errors.
* Push the branch up ( `git push origin my_awesome_feature` ).
* Create a pull request against jekyll/jekyll and describe what your change
@@ -67,17 +77,22 @@ You can find the documentation for jekyllrb.com in the
[site](https://github.com/jekyll/jekyll/tree/master/site) directory of
Jekyll's repo on GitHub.com.
-All documentation pull requests should be directed at `master`. Pull
+All documentation pull requests should be directed at `master`. Pull
requests directed at another branch will not be accepted.
The [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) on GitHub
can be freely updated without a pull request as all GitHub users have access.
+If you want to add your plugin to the
+[list of plugins](http://jekyllrb.com/docs/plugins/#available-plugins),
+please submit a pull request modifying the
+[plugins page source file](site/_docs/plugins.md) by adding a
+link to your plugin under the proper subheading depending upon its type.
+
Gotchas
-------
-* If you want to bump the gem version, please put that in a separate commit.
- This way, the maintainers can control when the gem gets released.
+* Please do not bump the gem version in your pull requests.
* Try to keep your patch(es) based from the latest commit on jekyll/jekyll.
The easier it is to apply your work, the less work the maintainers have to do,
which is always a good thing.
diff --git a/Gemfile b/Gemfile
index 851fabc..9b64809 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,2 +1,55 @@
source 'https://rubygems.org'
-gemspec
+gemspec name: 'jekyll'
+
+gem 'rake', '~> 10.1'
+group :development do
+ gem 'rdoc', '~> 4.2'
+ gem 'launchy', '~> 2.3'
+ gem 'toml', '~> 0.1.0'
+ gem 'pry'
+end
+
+group :test do
+ gem 'redgreen', '~> 1.2'
+ gem 'shoulda', '~> 3.5'
+ gem 'cucumber', '~> 2.0', '< 2.1'
+ gem 'simplecov', '~> 0.9'
+ gem 'jekyll_test_plugin'
+ gem 'jekyll_test_plugin_malicious'
+ gem 'minitest-reporters'
+ gem 'minitest-profile'
+ gem 'minitest'
+ gem 'rspec-mocks'
+
+ if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2")
+ gem 'test-unit'
+ end
+
+ if ENV['PROOF']
+ gem 'html-proofer', '~> 2.0'
+ end
+end
+
+group :benchmark do
+ if ENV['BENCHMARK']
+ gem 'ruby-prof'
+ gem 'rbtrace'
+ gem 'stackprof'
+ gem 'benchmark-ips'
+ end
+end
+
+gem 'jekyll-paginate', '~> 1.0'
+gem 'jekyll-coffeescript', '~> 1.0'
+gem 'jekyll-feed'
+gem 'jekyll-gist', '~> 1.0'
+gem 'mime-types', '~> 2.6'
+gem 'kramdown', '~> 1.9'
+
+platform :ruby, :mswin, :mingw do
+ gem 'rdiscount', '~> 2.0'
+ gem 'pygments.rb', '~> 0.6.0'
+ gem 'redcarpet', '~> 3.2', '>= 3.2.3'
+ gem 'classifier-reborn', '~> 2.0'
+ gem 'liquid-c', '~> 3.0'
+end
diff --git a/History.markdown b/History.markdown
index 1246165..26fa98d 100644
--- a/History.markdown
+++ b/History.markdown
@@ -1,15 +1,550 @@
-## HEAD
+## 3.0.1 / 2015-11-17
+
+### Bug Fixes
+
+ * Document: only superdirectories of the collection are categories (#4110)
+ * `Convertible#render_liquid` should use `render!` to cause failure on bad Liquid (#4077)
+ * Don't generate `.jekyll-metadata` in non-incremental build (#4079)
+ * Set `highlighter` config val to `kramdown.syntax_highlighter` (#4090)
+ * Align hooks implementation with documentation (#4104)
+ * Fix the deprecation warning in the doctor command (#4114)
+ * Fix case in `:title` and add `:slug` which is downcased (#4100)
+
+### Development Fixes
+
+ * Fix test warnings when doing rake {test,spec} or script/test (#4078)
+
+### Site Enhancements
+
+ * Update normalize.css to v3.0.3. (#4085)
+ * Update Font Awesome to v4.4.0. (#4086)
+ * Adds a note about installing the jekyll-gist gem to make gist tag work (#4101)
+ * Align hooks documentation with implementation (#4104)
+ * Add Jekyll Flickr Plugin to the list of third party plugins (#4111)
+ * Remove link to now-deleted blog post (#4125)
+ * Update the liquid syntax in the pagination docs (#4130)
+ * Add jekyll-language-plugin to plugins.md (#4134)
+ * Updated to reflect feedback in #4129 (#4137)
+ * Clarify assets.md based on feedback of #4129 (#4142)
+ * Re-correct the liquid syntax in the pagination docs (#4140)
+
+## 3.0.0 / 2015-10-26
### Major Enhancements
+ * Liquid profiler (i.e. know how fast or slow your templates render) (#3762)
+ * Incremental regeneration (#3116)
+ * Add Hooks: a new kind of plugin (#3553)
+ * Upgrade to Liquid 3.0.0 (#3002)
+ * `site.posts` is now a Collection instead of an Array (#4055)
+ * Add basic support for JRuby (commit: 0f4477)
+ * Drop support for Ruby 1.9.3. (#3235)
+ * Support Ruby v2.2 (#3234)
+ * Support RDiscount 2 (#2767)
+ * Remove most runtime deps (#3323)
+ * Move to Rouge as default highlighter (#3323)
+ * Mimic GitHub Pages `.html` extension stripping behavior in WEBrick (#3452)
+ * Always include file extension on output files (#3490)
+ * Improved permalinks for pages and collections (#3538)
+ * Sunset (i.e. remove) Maruku (#3655)
+ * Remove support for relative permalinks (#3679)
+ * Iterate over `site.collections` as an array instead of a hash. (#3670)
+ * Adapt StaticFile for collections, config defaults (#3823)
+ * Add a Code of Conduct for the Jekyll project (#3925)
+ * Added permalink time variables (#3990)
+ * Add `--incremental` flag to enable incremental regen (disabled by default) (#4059)
+
+### Minor Enhancements
+
+ * Deprecate access to Document#data properties and Collection#docs methods (#4058)
+ * Sort static files just once, and call `site_payload` once for all collections (#3204)
+ * Separate `jekyll docs` and optimize external gem handling (#3241)
+ * Improve `Site#getConverterImpl` and call it `Site#find_converter_instance` (#3240)
+ * Use relative path for `path` Liquid variable in Documents for consistency (#2908)
+ * Generalize `Utils#slugify` for any scripts (#3047)
+ * Added basic microdata to post template in site template (#3189)
+ * Store log messages in an array of messages. (#3244)
+ * Allow collection documents to override `output` property in front matter (#3172)
+ * Keep file modification times between builds for static files (#3220)
+ * Only downcase mixed-case categories for the URL (#2571)
+ * Added per post `excerpt_separator` functionality (#3274)
+ * Allow collections YAML to end with three dots (#3134)
+ * Add mode parameter to `slugify` Liquid filter (#2918)
+ * Perf: `Markdown#matches` should avoid regexp (#3321)
+ * Perf: Use frozen regular expressions for `Utils#slugify` (#3321)
+ * Split off Textile support into jekyll-textile-converter (#3319)
+ * Improve the navigation menu alignment in the site template on small
+ screens (#3331)
+ * Show the regeneration time after the initial generation (#3378)
+ * Site template: Switch default font to Helvetica Neue (#3376)
+ * Make the `include` tag a teensy bit faster. (#3391)
+ * Add `pkill -f jekyll` to ways to kill. (#3397)
+ * Site template: collapsed, variable-driven font declaration (#3360)
+ * Site template: Don't always show the scrollbar in code blocks (#3419)
+ * Site template: Remove undefined `text` class from `p` element (#3440)
+ * Site template: Optimize text rendering for legibility (#3382)
+ * Add `draft?` method to identify if Post is a Draft & expose to Liquid (#3456)
+ * Write regeneration metadata even on full rebuild (#3464)
+ * Perf: Use `String#end_with?("/")` instead of regexp when checking paths (#3516)
+ * Docs: document 'ordinal' built-in permalink style (#3532)
+ * Upgrade liquid-c to 3.x (#3531)
+ * Use consistent syntax for deprecation warning (#3535)
+ * Added build --destination and --source flags (#3418)
+ * Site template: remove unused `page.meta` attribute (#3537)
+ * Improve the error message when sorting null objects (#3520)
+ * Added liquid-md5 plugin (#3598)
+ * Documentation: RR replaced with RSpec Mocks (#3600)
+ * Documentation: Fix subpath. (#3599)
+ * Create 'tmp' dir for test_tags if it doesn't exist (#3609)
+ * Extract reading of data from `Site` to reduce responsibilities. (#3545)
+ * Removed the word 'Jekyll' a few times from the comments (#3617)
+ * `bin/jekyll`: with no args, exit with exit code 1 (#3619)
+ * Incremental build if destination file missing (#3614)
+ * Static files `mtime` liquid should return a `Time` obj (#3596)
+ * Use `Jekyll::Post`s for both LSI indexing and lookup. (#3629)
+ * Add `charset=utf-8` for HTML and XML pages in WEBrick (#3649)
+ * Set log level to debug when verbose flag is set (#3665)
+ * Added a mention on the Gemfile to complete the instructions (#3671)
+ * Perf: Cache `Document#to_liquid` and invalidate where necessary (#3693)
+ * Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and
+ `keep_dirs` only once, not once per iteration (#3696)
+ * Omit jekyll/jekyll-help from list of resources. (#3698)
+ * Add basic `jekyll doctor` test to detect fsnotify (OSX) anomalies. (#3704)
+ * Added talk.jekyllrb.com to "Have questions?" (#3694)
+ * Performance: Sort files only once (#3707)
+ * Performance: Marshal metadata (#3706)
+ * Upgrade highlight wrapper from `div` to `figure` (#3779)
+ * Upgrade mime-types to `~> 2.6` (#3795)
+ * Update windows.md with Ruby version info (#3818)
+ * Make the directory for includes configurable (#3782)
+ * Rename directory configurations to match `*_dir` convention for consistency (#3782)
+ * Internal: trigger hooks by owner symbol (#3871)
+ * Update MIME types from mime-db (#3933)
+ * Add header to site template `_config.yml` for clarity & direction (#3997)
+ * Site template: add timezone offset to post date frontmatter (#4001)
+ * Make a constant for the regex to find hidden files (#4032)
+ * Site template: refactor github & twitter icons into includes (#4049)
+ * Site template: add background to Kramdown Rouge-ified backtick code blocks (#4053)
+
+### Bug Fixes
+
+ * `post_url`: fix access deprecation warning & fix deprecation msg (#4060)
+ * Perform jekyll-paginate deprecation warning correctly. (#3580)
+ * Make permalink parsing consistent with pages (#3014)
+ * `time()`pre-filter method should accept a `Date` object (#3299)
+ * Remove unneeded end tag for `link` in site template (#3236)
+ * Kramdown: Use `enable_coderay` key instead of `use_coderay` (#3237)
+ * Unescape `Document` output path (#2924)
+ * Fix nav items alignment when on multiple rows (#3264)
+ * Highlight: Only Strip Newlines/Carriage Returns, not Spaces (#3278)
+ * Find variables in front matter defaults by searching with relative file path. (#2774)
+ * Allow variables (e.g `:categories`) in YAML front matter permalinks (#3320)
+ * Handle nil URL placeholders in permalinks (#3325)
+ * Template: Fix nav items alignment when in "burger" mode (#3329)
+ * Template: Remove `!important` from nav SCSS introduced in #3329 (#3375)
+ * The `:title` URL placeholder for collections should be the filename slug. (#3383)
+ * Trim the generate time diff to just 3 places past the decimal place (#3415)
+ * The highlight tag should only clip the newlines before and after the *entire* block, not in between (#3401)
+ * highlight: fix problem with linenos and rouge. (#3436)
+ * `Site#read_data_file`: read CSV's with proper file encoding (#3455)
+ * Ignore `.jekyll-metadata` in site template (#3496)
+ * Template: Point documentation link to the documentation pages (#3502)
+ * Removed the trailing slash from the example `/blog` baseurl comment (#3485)
+ * Clear the regenerator cache every time we process (#3592)
+ * Readd (bring back) minitest-profile (#3628)
+ * Add WOFF2 font MIME type to Jekyll server MIME types (#3647)
+ * Be smarter about extracting the extname in `StaticFile` (#3632)
+ * Process metadata for all dependencies (#3608)
+ * Show error message if the YAML front matter on a page/post is invalid. (#3643)
+ * Upgrade redcarpet to 3.2 (Security fix: OSVDB-120415) (#3652)
+ * Create #mock_expects that goes directly to RSpec Mocks. (#3658)
+ * Open `.jekyll-metadata` in binary mode to read binary Marshal data (#3713)
+ * Incremental regeneration: handle deleted, renamed, and moved dependencies (#3717)
+ * Fix typo on line 19 of pagination.md (#3760)
+ * Fix it so that 'blog.html' matches 'blog.html' (#3732)
+ * Remove occasionally-problematic `ensure` in `LiquidRenderer` (#3811)
+ * Fixed an unclear code comment in site template SCSS (#3837)
+ * Fix reading of binary metadata file (#3845)
+ * Remove var collision with site template header menu iteration variable (#3838)
+ * Change non-existent `hl_linenos` to `hl_lines` to allow passthrough in safe mode (#3787)
+ * Add missing flag to disable the watcher (#3820)
+ * Update CI guide to include more direct explanations of the flow (#3891)
+ * Set `future` to `false` in the default config (#3892)
+ * filters: `where` should compare stringified versions of input & comparator (#3935)
+ * Read build options for `jekyll clean` command (#3828)
+ * Fix #3970: Use Gem::Version to compare versions, not `>`.
+ * Abort if no subcommand. Fixes confusing message. (#3992)
+ * Whole-post excerpts should match the post content (#4004)
+ * Change default font weight to 400 to fix bold/strong text issues (#4050)
+ * Document: Only auto-generate the excerpt if it's not overridden (#4062)
+ * Utils: `deep_merge_hashes` should also merge `default_proc` (45f69bb)
+ * Defaults: compare paths in `applies_path?` as `String`s to avoid confusion (7b81f00)
+
+### Development Fixes
+
+ * Remove loader.rb and "modernize" `script/test`. (#3574)
+ * Improve the grammar in the documentation (#3233)
+ * Update the LICENSE text to match the MIT license exactly (#3253)
+ * Update rake task `site:publish` to fix minor bugs. (#3254)
+ * Switch to shields.io for the README badges. (#3255)
+ * Use `FileList` instead of `Dir.glob` in `site:publish` rake task (#3261)
+ * Fix test script to be platform-independent (#3279)
+ * Instead of symlinking `/tmp`, create and symlink a local `tmp` in the tests (#3258)
+ * Fix some spacing (#3312)
+ * Fix comment typo in `lib/jekyll/frontmatter_defaults.rb` (#3322)
+ * Move all `regenerate?` checking to `Regenerator` (#3326)
+ * Factor out a `read_data_file` call to keep things clean (#3380)
+ * Proof the site with CircleCI. (#3427)
+ * Update LICENSE to 2015. (#3477)
+ * Upgrade tests to use Minitest (#3492)
+ * Remove trailing whitespace (#3497)
+ * Use `fixture_site` for Document tests (#3511)
+ * Remove adapters deprecation warning (#3529)
+ * Minor fixes to `url.rb` to follow GitHub style guide (#3544)
+ * Minor changes to resolve deprecation warnings (#3547)
+ * Convert remaining textile test documents to markdown (#3528)
+ * Migrate the tests to use rspec-mocks (#3552)
+ * Remove `activesupport` (#3612)
+ * Added tests for `Jekyll:StaticFile` (#3633)
+ * Force minitest version to 5.5.1 (#3657)
+ * Update the way cucumber accesses Minitest assertions (#3678)
+ * Add `script/rubyprof` to generate cachegrind callgraphs (#3692)
+ * Upgrade cucumber to 2.x (#3795)
+ * Update Kramdown. (#3853)
+ * Updated the scripts shebang for portability (#3858)
+ * Update JRuby testing to 9K ([3ab386f](https://github.com/jekyll/jekyll/commit/3ab386f1b096be25a24fe038fc70fd0fb08d545d))
+ * Organize dependencies into dev and test groups. (#3852)
+ * Contributing.md should refer to `script/cucumber` (#3894)
+ * Update contributing documentation to reflect workflow updates (#3895)
+ * Add script to vendor mime types (#3933)
+ * Ignore .bundle dir in SimpleCov (#4033)
+
+### Site Enhancements
+
+ * Add 'info' labels to certain notes in collections docs (#3601)
+ * Remove extra spaces, make the last sentence less awkward in permalink docs (#3603)
+ * Update the permalinks documentation to reflect the updates for 3.0 (#3556)
+ * Add blog post announcing Jekyll Help (#3523)
+ * Add Jekyll Talk to Help page on site (#3518)
+ * Change Ajax pagination resource link to use HTTPS (#3570)
+ * Fixing the default host on docs (#3229)
+ * Add `jekyll-thumbnail-filter` to list of third-party plugins (#2790)
+ * Add link to 'Adding Ajax pagination to Jekyll' to Resources page (#3186)
+ * Add a Resources link to tutorial on building dynamic navbars (#3185)
+ * Semantic structure improvements to the post and page layouts (#3251)
+ * Add new AsciiDoc plugin to list of third-party plugins. (#3277)
+ * Specify that all transformable collection documents must contain YAML front matter (#3271)
+ * Assorted accessibility fixes (#3256)
+ * Update configuration docs to mention `keep_files` for `destination` (#3288, #3296)
+ * Break when we successfully generate nav link to save CPU cycles. (#3291)
+ * Update usage docs to mention `keep_files` and a warning about `destination` cleaning (#3295)
+ * Add logic to automatically generate the `next_section` and `prev_section` navigation items (#3292)
+ * Some small fixes for the Plugins TOC. (#3306)
+ * Added versioning comment to configuration file (#3314)
+ * Add `jekyll-minifier` to list of third-party plugins (#3333)
+ * Add blog post about the Jekyll meet-up (#3332)
+ * Use `highlight` Liquid tag instead of the four-space tabs for code (#3336)
+ * 3.0.0.beta1 release post (#3346)
+ * Add `twa` to the list of third-party plugins (#3384)
+ * Remove extra spaces (#3388)
+ * Fix small grammar errors on a couple pages (#3396)
+ * Fix typo on Templates docs page (#3420)
+ * s/three/four for plugin type list (#3424)
+ * Release jekyllrb.com as a locally-compiled site. (#3426)
+ * Add a jekyllrb.com/help page which elucidates places from which to get help (#3428)
+ * Remove extraneous dash on Plugins doc page which caused a formatting error (#3431)
+ * Fix broken link to Jordan Thornquest's website. (#3438)
+ * Change the link to an extension (#3457)
+ * Fix Twitter link on the help page (#3466)
+ * Fix wording in code snippet highlighting section (#3475)
+ * Add a `/` to `paginate_path` in the Pagination documentation (#3479)
+ * Add a link on all the docs pages to "Improve this page". (#3510)
+ * Add jekyll-auto-image generator to the list of third-party plugins (#3489)
+ * Replace link to the proposed `picture` element spec (#3530)
+ * Add frontmatter date formatting information (#3469)
+ * Improve consistency and clarity of plugins options note (#3546)
+ * Add permalink warning to pagination docs (#3551)
+ * Fix grammar in Collections docs API stability warning (#3560)
+ * Restructure `excerpt_separator` documentation for clarity (#3550)
+ * Fix accidental line break in collections docs (#3585)
+ * Add information about the `.jekyll-metadata` file (#3597)
+ * Document addition of variable parameters to an include (#3581)
+ * Add `jekyll-files` to the list of third-party plugins. (#3586)
+ * Define the `install` step in the CI example `.travis.yml` (#3622)
+ * Expand collections documentation. (#3638)
+ * Add the "warning" note label to excluding `vendor` in the CI docs page (#3623)
+ * Upgrade pieces of the Ugrading guide for Jekyll 3 (#3607)
+ * Showing how to access specific data items (#3468)
+ * Clarify pagination works from within HTML files (#3467)
+ * Add note to `excerpt_separator` documentation that it can be set globally (#3667)
+ * Fix some names on Troubleshooting page (#3683)
+ * Add `remote_file_content` tag plugin to list of third-party plugins (#3691)
+ * Update the Redcarpet version on the Configuration page. (#3743)
+ * Update the link in the welcome post to point to Jekyll Talk (#3745)
+ * Update link for navbars with data attributes tutorial (#3728)
+ * Add `jekyll-asciinema` to list of third-party plugins (#3750)
+ * Update pagination example to be agnostic to first pagination dir (#3763)
+ * Detailed instructions for rsync deployment method (#3848)
+ * Add Jekyll Portfolio Generator to list of plugins (#3883)
+ * Add `site.html_files` to variables docs (#3880)
+ * Add Static Publisher tool to list of deployment methods (#3865)
+ * Fix a few typos. (#3897)
+ * Add `jekyll-youtube` to the list of third-party plugins (#3931)
+ * Add Views Router plugin (#3950)
+ * Update install docs (Core dependencies, Windows reqs, etc) (#3769)
+ * Use Jekyll Feed for jekyllrb.com (#3736)
+ * Add jekyll-umlauts to plugins.md ($3966)
+ * Troubleshooting: fix broken link, add other mac-specific info (#3968)
+ * Add a new site for learning purposes (#3917)
+ * Added documentation for Jekyll environment variables (#3989)
+ * Fix broken configuration documentation page (#3994)
+ * Add troubleshooting docs for installing on El Capitan (#3999)
+ * Add Lazy Tweet Embedding to the list of third-party plugins (#4015)
+ * Add installation instructions for 2 of 3 options for plugins (#4013)
+ * Add alternative jekyll gem installation instructions (#4018)
+ * Fix a few typos and formatting problems. (#4022)
+ * Fix pretty permalink example (#4029)
+ * Note that `_config.yml` is not reloaded during regeneration (#4034)
+ * Apply code block figure syntax to blocks in CONTRIBUTING (#4046)
+ * Add jekyll-smartify to the list of third-party plugins (#3572)
+
+## 2.5.3 / 2014-12-22
+
+### Bug Fixes
+
+ * When checking a Markdown extname, include position of the `.` (#3147)
+ * Fix `jsonify` Liquid filter handling of boolean values (#3154)
+ * Add comma to value of `viewport` meta tag (#3170)
+ * Set the link type for the RSS feed to `application/rss+xml` (#3176)
+ * Refactor `#as_liquid` (#3158)
+
+### Development Fixes
+
+ * Exclude built-in bundles from being added to coverage report (#3180)
+
+### Site Enhancements
+
+ * Add `@alfredxing` to the `@jekyll/core` team. :tada: (#3218)
+ * Document the `-q` option for the `build` and `serve` commands (#3149)
+ * Fix some minor typos/flow fixes in documentation website content (#3165)
+ * Add `keep_files` to configuration documentation (#3162)
+ * Repeat warning about cleaning of the `destination` directory (#3161)
+ * Add jekyll-500px-embed to list of third-party plugins (#3163)
+ * Simplified platform detection in Gemfile example for Windows (#3177)
+ * Add the `jekyll-jalali` plugin added to the list of third-party plugins. (#3198)
+ * Add Table of Contents to Troubleshooting page (#3196)
+ * Add `inline_highlight` plugin to list of third-party plugins (#3212)
+ * Add `jekyll-mermaid` plugin to list of third-party plugins (#3222)
+
+## 2.5.2 / 2014-11-17
+
+### Minor Enhancements
+
+ * `post_url` should match `post.name` instead of slugs and dates (#3058)
+
+### Bug Fixes
+
+ * Fix bundle require for `:jekyll_plugins` (#3119)
+ * Remove duplicate regexp phrase: `^\A` (#3089)
+ * Remove duplicate `Conversion error:` message in `Convertible` (#3088)
+ * Print full conversion error message in `Renderer#convert` (#3090)
+
+### Site Enhancements
+
+ * Change variable names in Google Analytics script (#3093)
+ * Mention CSV files in the docs for data files (#3101)
+ * Add trailing slash to `paginate_path` example. (#3091)
+ * Get rid of noifniof (`excerpt_separator`) (#3094)
+ * Sass improvements, around nesting mostly. (#3123)
+ * Add webmentions.io plugin to the list of third-party plugins (#3127)
+ * Add Sass mixins and use them. (#2904)
+ * Slightly compress jekyll-sticker.jpg. (#3133)
+ * Update gridism and separate out related but custom styles. (#3132)
+ * Add remote-include plugin to list of third-party plugins (#3136)
+
+## 2.5.1 / 2014-11-09
+
+### Bug Fixes
+
+ * Fix path sanitation bug related to Windows drive names (#3077)
+
+### Development Fixes
+
+ * Add development time dependencies on minitest and test-unit to gemspec for cygwin (#3064)
+ * Use Travis's built-in caching. (#3075)
+
+## 2.5.0 / 2014-11-06
+
### Minor Enhancements
+ * Require gems in `:jekyll_plugins` Gemfile group unless `JEKYLL_NO_BUNDLER_REQUIRE` is specified in the environment. (#2865)
+ * Centralize path sanitation in the `Site` object (#2882)
+ * Allow placeholders in permalinks (#3031)
+ * Allow users to specify the log level via `JEKYLL_LOG_LEVEL`. (#3067)
+ * Fancy Indexing with WEBrick (#3018)
+ * Allow Enumerables to be used with `where` filter. (#2986)
+ * Meta descriptions in the site template now use `page.excerpt` if it's available (#2964)
+ * Change indentation in `head.html` of site template to 2 spaces from 4 (#2973)
+ * Use a `$content-width` variable instead of a fixed value in the site template CSS (#2972)
+ * Strip newlines in site template `<meta>` description. (#2982)
+ * Add link to atom feed in `head` of site template files (#2996)
+ * Performance optimizations (#2994)
+ * Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration
+ over hash keys. (#3017)
+ * Further minor performance enhancements. (#3022)
+ * Add 'b' and 's' aliases for build and serve, respectively (#3065)
+
### Bug Fixes
+ * Fix Rouge's RedCarpet plugin interface integration (#2951)
+ * Remove `--watch` from the site template blog post since it defaults
+ to watching in in 2.4.0 (#2922)
+ * Fix code for media query mixin in site template (#2946)
+ * Allow post URL's to have `.htm` extensions (#2925)
+ * `Utils.slugify`: Don't create new objects when gsubbing (#2997)
+ * The jsonify filter should deep-convert to Liquid when given an Array. (#3032)
+ * Apply `jsonify` filter to Hashes deeply and effectively (#3063)
+ * Use `127.0.0.1` as default host instead of `0.0.0.0` (#3053)
+ * In the case that a Gemfile does not exist, ensure Jekyll doesn't fail on requiring the Gemfile group (#3066)
+
### Development Fixes
+ * Fix a typo in the doc block for `Jekyll::URL.escape_path` (#3052)
+ * Add integration test for `jekyll new --blank` in TestUnit (#2913)
+ * Add unit test for `jekyll new --force` logic (#2929)
+ * Update outdated comment for `Convertible#transform` (#2957)
+ * Add Hakiri badge to README. (#2953)
+ * Add some simple benchmarking tools. (#2993)
+
### Site Enhancements
+ * `NOKOGIRI_USE_SYSTEM_LIBRARIES=true` **decreases** installation time. (#3040)
+ * Add FormKeep to resources as Jekyll form backend (#3010)
+ * Fixing a mistake in the name of the new Liquid tag (#2969)
+ * Update Font Awesome to v4.2.0. (#2898)
+ * Fix link to #2895 in 2.4.0 release post. (#2899)
+ * Add Big Footnotes for Kramdown plugin to list of third-party plugins (#2916)
+ * Remove warning regarding GHP use of singular types for front matter defaults (#2919)
+ * Fix quote character typo in site documentation for templates (#2917)
+ * Point Liquid links to Liquid’s Github wiki (#2887)
+ * Add HTTP Basic Auth (.htaccess) plugin to list of third-party plugins (#2931)
+ * (Minor) Grammar & `_config.yml` filename fixes (#2911)
+ * Added `mathml.rb` to the list of third-party plugins. (#2937)
+ * Add `--force_polling` to the list of configuration options (#2943)
+ * Escape unicode characters in site CSS (#2906)
+ * Add note about using the github-pages gem via pages.github.com/versions.json (#2939)
+ * Update usage documentation to reflect 2.4 auto-enabling of `--watch`. (#2954)
+ * Add `--skip-initial-build` to configuration docs (#2949)
+ * Fix a minor typo in Templates docs page (#2959)
+ * Add a ditaa-ditaa plugin under Other section on the Plugins page (#2967)
+ * Add `build/serve -V` option to configuration documentation (#2948)
+ * Add 'Jekyll Twitter Plugin' to list of third-party plugins (#2979)
+ * Docs: Update normalize.css to v3.0.2. (#2981)
+ * Fix typo in Continuous Integration documentation (#2984)
+ * Clarify behavior of `:categories` in permalinks (#3011)
+
+## 2.4.0 / 2014-09-09
+
+### Minor Enhancements
+
+ * Support a new `relative_include` tag (#2870)
+ * Auto-enable watch on 'serve' (#2858)
+ * Render Liquid in CoffeeScript files (#2830)
+ * Array Liquid filters: `push`, `pop`, `unshift`, `shift` (#2895)
+ * Add `:title` to collection URL template fillers (#2864)
+ * Add support for CSV files in the `_data` directory (#2761)
+ * Add the `name` variable to collection permalinks (#2799)
+ * Add `inspect` liquid filter. (#2867)
+ * Add a `slugify` Liquid filter (#2880)
+
+### Bug Fixes
+
+ * Use `Jekyll.sanitized_path` when adding static files to Collections (#2849)
+ * Fix encoding of `main.scss` in site template (#2771)
+ * Fix orientation bugs in default site template (#2862)
+
+### Development Fixes
+
+ * Update simplecov gem to 0.9 (#2748)
+ * Remove `docs/` dir (#2768)
+ * add class `<< self` idiom to `New` command (#2817)
+ * Allow Travis to 'parallelize' our tests (#2859)
+ * Fix test for Liquid rendering in Sass (#2856)
+ * Fixing "vertycal" typo in site template's `_base.scss` (#2889)
+
+### Site Enhancements
+
+ * Document the `name` variable for collection permalinks (#2829)
+ * Adds info about installing jekyll in current dir (#2839)
+ * Remove deprecated `jekyll-projectlist` plugin from list of third-party
+ plugins (#2742)
+ * Remove tag plugins that are built in to Jekyll (#2751)
+ * Add `markdown-writer` package for Atom Editor to list of third-party
+ plugins (#2763)
+ * Fix typo in site documentation for collections (#2764)
+ * Fix minor typo on plugins docs page (#2765)
+ * Replace markdown with HTML in `sass_dir` note on assets page (#2791)
+ * Fixed "bellow" typo in datafiles docs (#2879)
+ * Fix code/markdown issue in documentation for variables (#2877)
+ * Remove Good Include third-party plugin from plugins page (#2881)
+ * Add some more docs on `include_relative` (#2884)
+
+## 2.3.0 / 2014-08-10
+
+### Minor Enhancements
+
+ * Allow Convertibles to be converted by >= 1 converters (#2704)
+ * Allow Sass files to be rendered in Liquid, but never place them in layouts. (#2733)
+ * Add `jekyll help` command (#2707)
+ * Use `.scss` for `site_template` styles. (#2667)
+ * Don't require the `scope` key in front matter defaults (#2659)
+ * No longer set `permalink: pretty` in the `_config.yml` for the site template (#2680)
+ * Rework site template to utilize Sass (#2687)
+ * Notify the user when auto-regeneration is disabled. (#2696)
+ * Allow partial variables in include tag filename argument (#2693)
+ * Move instances of `Time.parse` into a Utils method (#2682)
+ * Ignore subfolders in the `_posts` folder (#2705) REVERTS (#2633)
+ * Front Matter default types should always be pluralized (#2732)
+ * Read in static files into `collection.files` as `StaticFile`s (#2737)
+ * Add `sassify` and `scssify` Liquid filters (#2739)
+ * Replace `classifier` gem with `classifier-reborn` (#2721)
+
+### Bug Fixes
+
+ * Use only the last extname when multiple converters exist (#2722)
+ * Call `#to_liquid` before calling `#to_json` in jsonify filter (#2729)
+ * Use non padded config in `strftime` to avoid parse string twice (#2673)
+ * Replace deprecated Ruby methods with undeprecated ones (#2664)
+ * Catch errors when parsing Post `date` front matter value & produce nice error message (#2649)
+ * Allow static files in Collections (#2615)
+ * Fixed typo in `Deprecator#gracefully_require` error message (#2694)
+ * Remove preemptive loading of the 'classifier' gem. (#2697)
+ * Use case-insensitive checking for the file extensions when loading config files (#2718)
+ * When Reading Documents, Respect `encoding` Option (#2720)
+ * Refactor based on jekyll-watch clean-up. (#2716)
+ * `Document#to_s` should produce just the content of the document (#2731)
+
+### Development Fixes
+
+ * Only include lib files in the gem (#2671)
+ * Fix `git diff` command in `proof` script (#2672)
+ * Make default rake task a multitask so tests run in parallel (#2735)
+
+### Site Enhancements
+
+ * Use Sass and a Docs Collection (#2651)
+ * Add `latest_version.txt` file to the site (#2740)
+ * Be more ambiguous about `page.content`. But more transparent. (#2522)
+ * Streamlining front matter wording (instead of front-matter/frontmatter) (#2674)
+ * Add note that source directory cannot be modified in GitHub Pages (#2669)
+ * Fix links from #2669 to be actual HTML. Whoops. (#2679)
+ * Add link to `jekyll-slim` in list of third-party plugins (#2689)
+ * Add Barry Clark's Smashing Magazine tutorial to resources page (#2688)
+ * Reorganize and update default configuration settings (#2456)
+ * Fixing indentation in the configuration docs about Redcarpet exts (#2717)
+ * Use `null` in YAML instead of `nil` in default config list (#2719)
+ * Fix typo in Continuous Integration docs (#2708)
+
## 2.2.0 / 2014-07-29
### Minor Enhancements
@@ -80,7 +615,7 @@
* Upgrade listen to `2.7.6 <= x < 3.0.0` (#2492)
* Allow configuration of different Twitter and GitHub usernames in site template (#2485)
* Bump Pygments to v0.6.0 (#2504)
- * Front-matter defaults for documents in collections (#2419)
+ * Front matter defaults for documents in collections (#2419)
* Include files with a url which ends in `/` in the `site.html_pages` list (#2524)
* Make `highlight` tag use `language-` prefix in CSS class (#2511)
* Lookup item property via `item#to_liquid` before `#data` or `#[]` in filters (#2493)
@@ -98,7 +633,7 @@
* Prevent code from overflowing container in site template (#2429)
* Encode URLs in UTF-8 when escaping and unescaping (#2420)
* No Layouts or Liquid for Asset Files (#2431)
- * Allow front-matter defaults to set post categories (#2373)
+ * Allow front matter defaults to set post categories (#2373)
* Fix command in subcommand deprecation warning (#2457)
* Keep all parent directories of files/dirs in `keep_files` (#2458)
* When using RedCarpet and Rouge without Rouge installed, fixed erroneous
@@ -131,7 +666,7 @@
* Prevent table from extending parent width in permalink style table (#2424)
* Add collections to info about pagination support (#2389)
* Add `jekyll_github_sample` plugin to list of third-party plugins (#2463)
- * Clarify documentation around front-matter defaults and add details
+ * Clarify documentation around front matter defaults and add details
about defaults for collections. (#2439)
* Add Jekyll Project Version Tag to list of third-party plugins (#2468)
* Use `https` for GitHub links across whole site (#2470)
@@ -166,7 +701,7 @@
* Update docs to reflect new `baseurl` default (#2341)
* Add links to headers who have an ID. (#2342)
* Use symbol instead of HTML number in `upgrading.md` (#2351)
- * Fix link to frontmatter defaults docs (#2353)
+ * Fix link to front matter defaults docs (#2353)
* Fix for `History.markdown` in order to fix history page in docs (#2363)
## 2.0.2 / 2014-05-07
@@ -206,7 +741,7 @@
* Expose `site.static_files` to Liquid (#2075)
* Complete redesign of the template site generated by `jekyll new` (#2050)
* Update Listen from 1.x to 2.x (#2097)
- * Front-matter defaults (#2205)
+ * Front matter defaults (#2205)
* Deprecate `relative_permalinks` configuration option (default to `false`) (#2307)
* Exclude files based on prefix as well as `fnmatch?` (#2303)
@@ -251,12 +786,12 @@
* Permit YAML blocks to end with three dots to better conform with the
YAML spec (#2110)
* Use `File.exist?` instead of deprecated `File.exists?` (#2214)
- * Require newline after start of YAML front-matter header (#2211)
+ * Require newline after start of YAML Front Matter header (#2211)
* Add the ability for pages to be marked as `published: false` (#1492)
* Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy
looking up of variable values in a Liquid context. (#2253)
* Remove literal lang name from class (#2292)
- * Return `utf-8` encoding in header for webrick error page response (#2289)
+ * Return `utf-8` encoding in header for webrick error page response (#2289)
* Make template site easier to customize (#2268)
* Add two-digit year to permalink template option (#2301)
* Add `site.documents` to Liquid payload (list of all docs) (#2295)
@@ -924,7 +1459,7 @@
* Bullet-proof `limit_posts` option (#1004)
* Read in YAML as UTF-8 to accept non-ASCII chars (#836)
* Fix the CLI option `--plugins` to actually accept dirs and files (#993)
- * Allow 'excerpt' in YAML Front-Matter to override the extracted excerpt (#946)
+ * Allow 'excerpt' in YAML front matter to override the extracted excerpt (#946)
* Fix cascade problem with site.baseurl, site.port and site.host. (#935)
* Filter out directories with valid post names (#875)
* Fix symlinked static files not being correctly built in unsafe mode (#909)
@@ -936,7 +1471,7 @@
* Patch for multibyte URI problem with `jekyll serve` (#723)
* Order plugin execution by priority (#864)
* Fixed Page#dir and Page#url for edge cases (#536)
- * Fix broken `post_url` with posts with a time in their YAML Front-Matter (#831)
+ * Fix broken `post_url` with posts with a time in their YAML front matter (#831)
* Look for plugins under the source directory (#654)
* Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long
post names (#775)
@@ -995,7 +1530,7 @@
* Fix error with `limit_posts` (#442)
* Properly select dotfile during directory scan (#363, #431, #377)
* Allow setting of Kramdown `smart_quotes` (#482)
- * Ensure front-matter is at start of file (#562)
+ * Ensure front matter is at start of file (#562)
## 0.11.2 / 2011-12-27
* Bug Fixes
@@ -1116,7 +1651,7 @@
## 0.5.6 / 2010-01-08
* Bug Fixes
* Require redcloth >= 4.2.1 in tests (#92)
- * Don't break on triple dashes in yaml frontmatter (#93)
+ * Don't break on triple dashes in yaml front matter (#93)
### Minor Enhancements
* Allow .mkd as markdown extension
@@ -1164,7 +1699,7 @@
(@eugenebolshakov)
* Bad markdown processor in config fails sooner and with better message
(@ gcnovus)
- * Allow CRLFs in yaml frontmatter (@juretta)
+ * Allow CRLFs in yaml front matter (@juretta)
* Added Date#xmlschema for Ruby versions < 1.9
## 0.5.1 / 2009-05-06
diff --git a/LICENSE b/LICENSE
index 0e5f844..527166b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,9 +1,9 @@
-(The MIT License)
+The MIT License (MIT)
-Copyright (c) 2008-2014 Tom Preston-Werner
+Copyright (c) 2008-2015 Tom Preston-Werner
Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the 'Software'), to deal
+of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
@@ -12,7 +12,7 @@ furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
diff --git a/README.markdown b/README.markdown
index 124004f..b1dfae4 100644
--- a/README.markdown
+++ b/README.markdown
@@ -1,11 +1,12 @@
# [Jekyll](http://jekyllrb.com/)
-[![Gem Version](https://badge.fury.io/rb/jekyll.svg)](https://rubygems.org/gems/jekyll)
-[![Build Status](https://secure.travis-ci.org/jekyll/jekyll.svg?branch=master)](https://travis-ci.org/jekyll/jekyll)
-[![Code Climate](http://img.shields.io/codeclimate/github/jekyll/jekyll.svg)](https://codeclimate.com/github/jekyll/jekyll)
-[![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)](https://gemnasium.com/jekyll/jekyll)
+[![Gem Version](https://img.shields.io/gem/v/jekyll.svg)](https://rubygems.org/gems/jekyll)
+[![Build Status](https://img.shields.io/travis/jekyll/jekyll/master.svg)](https://travis-ci.org/jekyll/jekyll)
+[![Code Climate](https://img.shields.io/codeclimate/github/jekyll/jekyll.svg)](https://codeclimate.com/github/jekyll/jekyll)
+[![Dependency Status](https://img.shields.io/gemnasium/jekyll/jekyll.svg)](https://gemnasium.com/jekyll/jekyll)
+[![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)](https://hakiri.io/github/jekyll/jekyll/master)
-By Tom Preston-Werner, Nick Quaranto, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)!
+By Tom Preston-Werner, Nick Quaranto, Parker Moore, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)!
Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites. Think of it like a file-based CMS, without all the complexity. Jekyll takes your content, renders Markdown and Liquid templates, and spits out a complete, static website ready to be served by Apache, Nginx or another web server. Jekyll is the engine behind [GitHub Pages](http://pages.github.com), which you can use to host sites right from your GitHub repositories.
@@ -13,13 +14,29 @@ Jekyll is a simple, blog-aware, static site generator perfect for personal, proj
Jekyll does what you tell it to do — no more, no less. It doesn't try to outsmart users by making bold assumptions, nor does it burden them with needless complexity and configuration. Put simply, Jekyll gets out of your way and allows you to concentrate on what truly matters: your content.
+## Having trouble with OS X El Capitan?
+
+See: http://jekyllrb.com/docs/troubleshooting/#jekyll-amp-mac-os-x-1011
+
## Getting Started
* [Install](http://jekyllrb.com/docs/installation/) the gem
* Read up about its [Usage](http://jekyllrb.com/docs/usage/) and [Configuration](http://jekyllrb.com/docs/configuration/)
* Take a gander at some existing [Sites](https://wiki.github.com/jekyll/jekyll/sites)
* Fork and [Contribute](http://jekyllrb.com/docs/contributing/) your own modifications
-* Have questions? Check out [`#jekyll` on irc.freenode.net](https://botbot.me/freenode/jekyll/).
+* Have questions? Check out our official forum community [Jekyll Talk](https://talk.jekyllrb.com/) or [`#jekyll` on irc.freenode.net](https://botbot.me/freenode/jekyll/)
+
+## Code of Conduct
+
+In order to have a more open and welcoming community, Jekyll adheres to a
+[code of conduct](CONDUCT.md) adapted from the Ruby on Rails code of
+conduct.
+
+Please adhere to this code of conduct in any interactions you have in the
+Jekyll community. It is strictly enforced on all official Jekyll
+repositories, websites, and resources. If you encounter someone violating
+these terms, please let a maintainer (@parkr, @envygeeks, or @mattr-) know
+and we will address it as soon as possible.
## Diving In
diff --git a/Rakefile b/Rakefile
index 0f16adb..ff473e6 100644
--- a/Rakefile
+++ b/Rakefile
@@ -14,7 +14,7 @@ require 'jekyll/version'
#############################################################################
def name
- @name ||= File.basename(Dir['*.gemspec'].first, ".*")
+ 'jekyll'.freeze
end
def version
@@ -26,7 +26,7 @@ def gemspec_file
end
def gem_file
- "#{name}-#{version}.gem"
+ "#{name}-#{Gem::Version.new(version).to_s}.gem"
end
def normalize_bullets(markdown)
@@ -87,8 +87,9 @@ end
#
#############################################################################
-task :default => [:test, :features]
+multitask :default => [:test, :features]
+task :spec => :test
require 'rake/testtask'
Rake::TestTask.new(:test) do |test|
test.libs << 'lib' << 'test'
@@ -134,6 +135,7 @@ namespace :site do
desc "Generate and view the site locally"
task :preview do
require "launchy"
+ require "jekyll"
# Yep, it's a hack! Wait a few seconds for the Jekyll site to generate and
# then open it in a browser. Someday we can do better than this, I hope.
@@ -145,47 +147,76 @@ namespace :site do
# Generate the site in server mode.
puts "Running Jekyll..."
- Dir.chdir("site") do
- sh "#{File.expand_path('bin/jekyll', File.dirname(__FILE__))} serve --watch"
- end
+ options = {
+ "source" => File.expand_path("site"),
+ "destination" => File.expand_path("site/_site"),
+ "watch" => true,
+ "serving" => true
+ }
+ Jekyll::Commands::Build.process(options)
+ Jekyll::Commands::Serve.process(options)
+ end
+
+ desc "Generate the site"
+ task :generate => [:history, :version_file] do
+ require "jekyll"
+ Jekyll::Commands::Build.process({
+ "source" => File.expand_path("site"),
+ "destination" => File.expand_path("site/_site")
+ })
end
desc "Update normalize.css library to the latest version and minify"
task :update_normalize_css do
- Dir.chdir("site/_includes/css") do
+ Dir.chdir("site/_sass") do
sh 'curl "http://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"'
- sh 'sass "normalize.scss":"normalize.css" --style compressed'
- sh 'rm "normalize.scss"'
+ sh 'sass "normalize.scss":"_normalize.scss" --style compressed'
+ rm ['normalize.scss', Dir.glob('*.map')].flatten
end
end
desc "Commit the local site to the gh-pages branch and publish to GitHub Pages"
- task :publish => [:history] do
+ task :publish => [:history, :version_file] do
# Ensure the gh-pages dir exists so we can generate into it.
puts "Checking for gh-pages dir..."
unless File.exist?("./gh-pages")
- puts "No gh-pages directory found. Run the following commands first:"
- puts " `git clone git at github.com:jekyll/jekyll gh-pages"
- puts " `cd gh-pages"
- puts " `git checkout gh-pages`"
- exit(1)
+ puts "Creating gh-pages dir..."
+ sh "git clone git at github.com:jekyll/jekyll gh-pages"
end
- # Ensure gh-pages branch is up to date.
+ # Ensure latest gh-pages branch history.
Dir.chdir('gh-pages') do
+ sh "git checkout gh-pages"
sh "git pull origin gh-pages"
end
- # Copy to gh-pages dir.
- puts "Copying site to gh-pages branch..."
- Dir.glob("site/*") do |path|
- next if path.include? "_site"
- sh "cp -R #{path} gh-pages/"
+ # Proceed to purge all files in case we removed a file in this release.
+ puts "Cleaning gh-pages directory..."
+ purge_exclude = %w[
+ gh-pages/.
+ gh-pages/..
+ gh-pages/.git
+ gh-pages/.gitignore
+ ]
+ FileList["gh-pages/{*,.*}"].exclude(*purge_exclude).each do |path|
+ sh "rm -rf #{path}"
end
+ # Copy site to gh-pages dir.
+ puts "Building site into gh-pages branch..."
+ ENV['JEKYLL_ENV'] = 'production'
+ require "jekyll"
+ Jekyll::Commands::Build.process({
+ "source" => File.expand_path("site"),
+ "destination" => File.expand_path("gh-pages"),
+ "sass" => { "style" => "compressed" }
+ })
+
+ File.open('gh-pages/.nojekyll', 'wb') { |f| f.puts(":dog: food.") }
+
# Commit and push.
puts "Committing and pushing to GitHub Pages..."
- sha = `git log`.match(/[a-z0-9]{40}/)[0]
+ sha = `git rev-parse HEAD`.strip
Dir.chdir('gh-pages') do
sh "git add ."
sh "git commit --allow-empty -m 'Updating to #{sha}.'"
@@ -201,10 +232,9 @@ namespace :site do
front_matter = {
"layout" => "docs",
"title" => "History",
- "permalink" => "/docs/history/",
- "prev_section" => "contributing"
+ "permalink" => "/docs/history/"
}
- Dir.chdir('site/docs/') do
+ Dir.chdir('site/_docs/') do
File.open("history.md", "w") do |file|
file.write("#{front_matter.to_yaml}---\n\n")
file.write(converted_history(history_file))
@@ -215,6 +245,11 @@ namespace :site do
end
end
+ desc "Write the site latest_version.txt file"
+ task :version_file do
+ File.open('site/latest_version.txt', 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i
+ end
+
namespace :releases do
desc "Create new release post"
task :new, :version do |t, args|
@@ -253,7 +288,7 @@ task :release => :build do
puts "You must be on the master branch to release!"
exit!
end
- sh "git commit --allow-empty -m 'Release #{version}'"
+ sh "git commit --allow-empty -m 'Release :gem: #{version}'"
sh "git tag v#{version}"
sh "git push origin master"
sh "git push origin v#{version}"
diff --git a/benchmark/end-with-vs-regexp b/benchmark/end-with-vs-regexp
new file mode 100644
index 0000000..cb849f4
--- /dev/null
+++ b/benchmark/end-with-vs-regexp
@@ -0,0 +1,13 @@
+require 'benchmark/ips'
+
+Benchmark.ips do |x|
+ path_without_ending_slash = '/some/very/very/long/path/to/a/file/i/like'
+ x.report('no slash regexp') { path_without_ending_slash =~ /\/$/ }
+ x.report('no slash end_with?') { path_without_ending_slash.end_with?("/") }
+end
+
+Benchmark.ips do |x|
+ path_with_ending_slash = '/some/very/very/long/path/to/a/file/i/like/'
+ x.report('slash regexp') { path_with_ending_slash =~ /\/$/ }
+ x.report('slash end_with?') { path_with_ending_slash.end_with?("/") }
+end
diff --git a/benchmark/flat-map b/benchmark/flat-map
new file mode 100644
index 0000000..547bcee
--- /dev/null
+++ b/benchmark/flat-map
@@ -0,0 +1,16 @@
+require 'benchmark/ips'
+
+enum = (0..50).to_a
+nested = enum.map { |i| [i] }
+
+def do_thing(blah)
+ blah * 1
+end
+
+Benchmark.ips do |x|
+ x.report('.map.flatten with nested arrays') { nested.map { |i| do_thing(i) }.flatten(1) }
+ x.report('.flat_map with nested arrays') { nested.flat_map { |i| do_thing(i) } }
+
+ x.report('.map.flatten with no nested arrays') { enum.map { |i| do_thing(i) }.flatten(1) }
+ x.report('.flat_map with no nested arrays') { enum.flat_map { |i| do_thing(i) } }
+end
diff --git a/benchmark/hash-fetch b/benchmark/hash-fetch
new file mode 100644
index 0000000..3570835
--- /dev/null
+++ b/benchmark/hash-fetch
@@ -0,0 +1,9 @@
+require 'benchmark/ips'
+
+h = {:bar => 'uco'}
+
+Benchmark.ips do |x|
+ x.report('fetch with no block') { h.fetch(:bar, (0..9).to_a) }
+ x.report('fetch with a block') { h.fetch(:bar) { (0..9).to_a } }
+ x.report('brackets with an ||') { h[:bar] || (0..9).to_a }
+end
diff --git a/benchmark/jekyll-sanitize-path b/benchmark/jekyll-sanitize-path
new file mode 100644
index 0000000..231de27
--- /dev/null
+++ b/benchmark/jekyll-sanitize-path
@@ -0,0 +1,46 @@
+#!/usr/bin/env ruby
+
+require_relative '../lib/jekyll'
+require 'benchmark/ips'
+
+base_directory = Dir.pwd
+
+Benchmark.ips do |x|
+ #
+ # Does not include the base_directory
+ #
+ x.report('with no questionable path') do
+ Jekyll.sanitized_path(base_directory, '')
+ end
+ x.report('with a single-part questionable path') do
+ Jekyll.sanitized_path(base_directory, 'thingy')
+ end
+ x.report('with a multi-part questionable path') do
+ Jekyll.sanitized_path(base_directory, 'thingy/in/my/soup')
+ end
+ x.report('with a single-part traversal path') do
+ Jekyll.sanitized_path(base_directory, '../thingy')
+ end
+ x.report('with a multi-part traversal path') do
+ Jekyll.sanitized_path(base_directory, '../thingy/in/my/../../soup')
+ end
+
+ #
+ # Including the base_directory
+ #
+ x.report('with the exact same paths') do
+ Jekyll.sanitized_path(base_directory, base_directory)
+ end
+ x.report('with a single-part absolute path including the base_directory') do
+ Jekyll.sanitized_path(base_directory, File.join(base_directory, 'thingy'))
+ end
+ x.report('with a multi-part absolute path including the base_directory') do
+ Jekyll.sanitized_path(base_directory, File.join(base_directory, 'thingy/in/my/soup'))
+ end
+ x.report('with a single-part traversal path including the base_directory') do
+ Jekyll.sanitized_path(base_directory, File.join(base_directory, 'thingy/..'))
+ end
+ x.report('with a multi-part traversal path including the base_directory') do
+ Jekyll.sanitized_path(base_directory, File.join('thingy/in/my/../../soup'))
+ end
+end
diff --git a/benchmark/proc-call-vs-yield b/benchmark/proc-call-vs-yield
new file mode 100644
index 0000000..3d55979
--- /dev/null
+++ b/benchmark/proc-call-vs-yield
@@ -0,0 +1,14 @@
+require 'benchmark/ips'
+
+def fast
+ yield
+end
+
+def slow(&block)
+ block.call
+end
+
+Benchmark.ips do |x|
+ x.report('yield') { fast { (0..9).to_a } }
+ x.report('block.call') { slow { (0..9).to_a } }
+end
diff --git a/benchmark/sequential-assignment b/benchmark/sequential-assignment
new file mode 100644
index 0000000..945e982
--- /dev/null
+++ b/benchmark/sequential-assignment
@@ -0,0 +1,11 @@
+require 'benchmark/ips'
+
+Benchmark.ips do |x|
+ x.report('parallel assignment') do
+ a, b = 1, 2
+ end
+ x.report('multi-line assignment') do
+ a = 1
+ b = 2
+ end
+end
diff --git a/benchmark/string-concat b/benchmark/string-concat
new file mode 100644
index 0000000..c4a9174
--- /dev/null
+++ b/benchmark/string-concat
@@ -0,0 +1,8 @@
+require 'benchmark/ips'
+
+url = "http://jekyllrb.com"
+
+Benchmark.ips do |x|
+ x.report('+=') { url += '/' }
+ x.report('<<') { url << '/' }
+end
diff --git a/benchmark/string-replacement b/benchmark/string-replacement
new file mode 100644
index 0000000..36de613
--- /dev/null
+++ b/benchmark/string-replacement
@@ -0,0 +1,13 @@
+require 'benchmark/ips'
+
+def str
+ 'http://baruco.org/2014/some-talk-with-some-amount-of-value'
+end
+
+Benchmark.ips do |x|
+ x.report('#tr') { str.tr('some', 'a') }
+ x.report('#gsub') { str.gsub('some', 'a') }
+ x.report('#gsub!') { str.gsub!('some', 'a') }
+ x.report('#sub') { str.sub('some', 'a') }
+ x.report('#sub!') { str.sub!('some', 'a') }
+end
diff --git a/benchmark/symbol-to-proc b/benchmark/symbol-to-proc
new file mode 100644
index 0000000..bc08b2f
--- /dev/null
+++ b/benchmark/symbol-to-proc
@@ -0,0 +1,6 @@
+require 'benchmark/ips'
+
+Benchmark.ips do |x|
+ x.report('block') { (1..100).map { |i| i.to_s } }
+ x.report('&:to_s') { (1..100).map(&:to_s) }
+end
diff --git a/bin/jekyll b/bin/jekyll
index 194295c..67705b5 100755
--- a/bin/jekyll
+++ b/bin/jekyll
@@ -6,12 +6,11 @@ $:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
require 'jekyll'
require 'mercenary'
-%w[jekyll-import].each do |blessed_gem|
- begin
- require blessed_gem
- rescue LoadError
- end
-end
+Jekyll::External.require_if_present(
+ Jekyll::External.blessed_gems
+)
+
+Jekyll::PluginManager.require_from_bundler
Jekyll::Deprecator.process(ARGV)
@@ -23,14 +22,17 @@ Mercenary.program(:jekyll) do |p|
p.option 'source', '-s', '--source [DIR]', 'Source directory (defaults to ./)'
p.option 'destination', '-d', '--destination [DIR]', 'Destination directory (defaults to ./_site)'
p.option 'safe', '--safe', 'Safe mode (defaults to false)'
- p.option 'plugins', '-p', '--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]', Array, 'Plugins directory (defaults to ./_plugins)'
- p.option 'layouts', '--layouts DIR', String, 'Layouts directory (defaults to ./_layouts)'
+ p.option 'plugins_dir', '-p', '--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]', Array, 'Plugins directory (defaults to ./_plugins)'
+ p.option 'layouts_dir', '--layouts DIR', String, 'Layouts directory (defaults to ./_layouts)'
+ p.option 'profile', '--profile', 'Generate a Liquid rendering profile'
Jekyll::Command.subclasses.each { |c| c.init_with_program(p) }
p.action do |args, options|
if args.empty?
+ Jekyll.logger.error "A subcommand is required."
puts p
+ abort
else
unless p.has_command?(args.first)
Jekyll.logger.abort_with "Invalid command. Use --help for more information"
diff --git a/checksums.yaml.gz b/checksums.yaml.gz
deleted file mode 100644
index 1e3423c..0000000
Binary files a/checksums.yaml.gz and /dev/null differ
diff --git a/cucumber.yml b/cucumber.yml
deleted file mode 100644
index 78342a1..0000000
--- a/cucumber.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-default: --format pretty
-travis: --format progress
-html_report: --format progress --format html --out=features_report.html
diff --git a/docs/jp/CONTRIBUTING.jp.markdown b/docs/jp/CONTRIBUTING.jp.markdown
deleted file mode 100644
index fa8e71c..0000000
--- a/docs/jp/CONTRIBUTING.jp.markdown
+++ /dev/null
@@ -1,93 +0,0 @@
-コントリビュート
-==========
-
-あなたは Jekyll に投じるすばらしいアイディアを持っています。
-すばらしいことです!次の事柄を心に留めてください。
-
-* **テストなしではコントリビュートはできません。**
-* もし、既存の機能への小さな修正やパッチを作成したなら、シンプルなテストを行います。
- 現在のテストスイートの範囲にとどまり、そして
- [Shoulda](https://github.com/thoughtbot/shoulda/tree/master) や
- [RR](https://github.com/btakita/rr/tree/master) を使用してください。
-* もし、それが新しい機能の場合は、必ず新しい
- [Cucumber](https://github.com/cucumber/cucumber/) の機能を作成し、
- 必要に応じて手順を再利用します。
- また、あなたがフォークした `site` に
- 急ぎいくつかのドキュメントを用意し、一度マージを行い
- メイン `site` の jekyllrb.com に転送していただければ幸いです。
-* あなたのコントリビュートによって Jekyll の振る舞いが変わった場合、ドキュメントを更新すべきです。
- それは `site/docs` にあります。
- もし、 docs に情報の誤りがあった場合、遠慮なく追加してください。
- すばらしいドキュメントはすばらしいプロジェクトを作ります!
-* Ruby のコードを変更するときは、 [GitHub Ruby Styleguide](https://github.com/styleguide/ruby)
- に従ってください。
-* **小さなプルリクエスト** に最善を尽くしてください。
- 簡単に提案された変更はレビューされ、マージされる可能性が高いです。
-* プルリクエストを送信するとき、プルリクエストのボディを賢明に使用してください。
- 変更されたかどうかの記述、変更の背後にある動機、 [完了したかどうかのタスクリスト](http://git.io/gfm-tasks)
- もレビュー時間を早めます。
-
-テストの依存関係
------------------
-
-テストスイートの実行や gem のビルドのために、
-Jekyll の依存ツールをインストールする必要があります。
-Jekyll は Bundler を使用しており、 `bundle` コマンドを実行すると全ての設定が迅速に行われます!
-
- $ bundle
-
-はじめる前に、テストを実行し、必ずテストが通ることを
-確認してください(あなたの環境が適切に設定されているかを確認するために):
-
- $ bundle exec rake test
- $ bundle exec rake features
-
-ワークフロー
---------
-
-これは、あなたの作業がプロジェクトにマージされるもっとも直接的な方法です:
-
-* プロジェクトをフォークします。
-* あなたのフォークプロジェクトをクローンします ( `git clone git at github.com:<username>/jekyll.git` )。
-* トピックブランチを作成し、あなたの変更を含んでください ( `git checkout -b my_awesome_feature` )。
-* ハックし、テストを追加します。必ずしもこの順番でなくてかまいません
-* `rake` を実行し、テストが必ず全て通ることを確認してください
-* 必要に応じて、エラーがないようにコミットを論理的な塊にリベースしてください
-* ブランチをプッシュしてください ( `git push origin my_awesome_feature` ).
-* jekyll/jekyll プロジェクトの master ブランチに対してプルリクエストを作成し、
- あなたの変更内容と、なぜそれをマージすべきかを記述してください
-
-ドキュメントの更新
-----------------------
-
-私たちは Jekyll のドキュメントについて最善を尽くしたいです。
-私たちはドキュメントをオープンソース化しました、そして
-あなたが Jekyll に欠けているものを見つけた場合、私たちはプルリクエストを歓迎しています。
-
-あなたは、 GitHub.com 上の Jekyll リポジトリの [site]({{ site.repository }}/tree/master/site) で
-jekyllrb.comのドキュメントを見つけることができます。
-
-全てのドキュメントのプルリクエストは `master` に向けられる必要があります。
-他のブランチに向けたプルリクエストは受け入れられません。
-
-GitHub の [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) は、
-自由に更新することができるように、プルリクエストなしで
-全ての GitHub ユーザがアクセス権を持つことができます。
-
-落とし穴
--------
-
-* もし、 gem のバージョンがかちあった場合、コミットを分けてください。
- この方法だと、メンテナが gem をリリースするときに制御できます。
-* jekyll/jekyll の最新コミットに基づいて(複数の)パッチを維持してください。
- それは適用するためのあなたの仕事で、メンテナがしなければならないことを少なくするのは
- とてもよいことです。
-* あなたの GitHub issue で [fix], [feature] などのタグをつけないでください。
- メンテナは積極的に issue を読み、彼らが問題に出くわしたらラベルをつけるでしょう。
-
-最後に…
-----------
-
-ありがとう! Jekyll のハックは楽しいものでなければなりません。
-もし、あなたがこのハードを理解するための何かを発見した場合、知らせてください。
-我々のプロセスやドキュメントを改善することができます!
diff --git a/docs/jp/README.jp.markdown b/docs/jp/README.jp.markdown
deleted file mode 100644
index 2bf7e81..0000000
--- a/docs/jp/README.jp.markdown
+++ /dev/null
@@ -1,68 +0,0 @@
-# [Jekyll](http://jekyllrb.com/)
-
-[![Gem Version](https://badge.fury.io/rb/jekyll.png)](http://badge.fury.io/rb/jekyll)
-
-[![Build Status](https://secure.travis-ci.org/jekyll/jekyll.png?branch=master)](https://travis-ci.org/jekyll/jekyll)
-[![Code Climate](https://codeclimate.com/github/jekyll/jekyll.png)](https://codeclimate.com/github/jekyll/jekyll)
-[![Dependency Status](https://gemnasium.com/jekyll/jekyll.png)](https://gemnasium.com/jekyll/jekyll)
-
-Tom Preston-Werner, Nick Quaranto や多くの[素晴らしいコントリビュータ](https://github.com/jekyll/jekyll/graphs/contributors)によって作成されています!
-
-Jekyll は個人プロジェクトや組織のサイトに最適な、シンプルで、ブログを意識した静的サイトジェネレータです。
-複雑さを排除したファイルベースのCMSのようなものと考えてください。
-Jekyll はコンテンツを受け取り、 Markdown や Liquid テンプレート をレンダリングし、
-Apache や Nginx やその他の Web サーバに提供する準備ができた静的な Web サイトを完全に出力してくれます。
-Jekyll は [GitHub Pages](http://pages.github.com) の背後にあるエンジンなので、
-あなたの GitHub リポジトリからサイトをホストするために使用する事ができます。
-
-## 原理
-
-Jekyll あなたがするように伝えたことをします ― それ以上でもそれ以下でもありません。
-それは、大胆な仮定によってユーザの裏をかこうとせず、
-また、不必要な複雑さや設定をユーザに負担しません。
-簡単に言えば、 Jekyll はあなたの道を開け、
-真に重要なもの: コンテンツに集中することができます。
-
-## 開始方法
-
-* gem を[インストール](http://jekyllrb.com/docs/installation/)します
-* [使用方法](http://jekyllrb.com/docs/usage/) と [設定方法](http://jekyllrb.com/docs/configuration/) を読みます
-* 既存の [Jekyll で作られたサイト](https://wiki.github.com/jekyll/jekyll/sites) をチラッと見ます
-* Fork し、あなたの変更を [コントリビュート](http://jekyllrb.com/docs/contributing/) します
-* 質問があったら? irc.freenode.net の `#jekyll` チャンネルをチェックしてください
-
-## より深く
-
-* 以前のシステムからの[移行](http://jekyllrb.com/docs/migrations/)
-* [YAML Front Matter](http://jekyllrb.com/docs/frontmatter/) がどのように働くかを学ぶ
-* [変数](http://jekyllrb.com/docs/variables/)を使ってサイトに情報を表示する
-* posts が生成される時の[パーマリンク](http://jekyllrb.com/docs/permalinks/)をカスタマイズ
-* 人生を容易にするために、組み込みの [Liquid 拡張](http://jekyllrb.com/docs/templates/)を使用する
-* あなたのサイト固有のコンテンツを生成するために、カスタム[プラグイン](http://jekyllrb.com/docs/plugins/)を使用する
-
-## 実行時の依存関係
-
-* Commander: コマンドラインインターフェース構築 (Ruby)
-* Colorator: コマンドライン出力に色付け (Ruby)
-* Classifier: posts の関連を生成 (Ruby)
-* Directory Watcher: サイトの自動再生成 (Ruby)
-* Kramdown: デフォルトの Markdown エンジン (Ruby)
-* Liquid: テンプレートシステム (Ruby)
-* Pygments.rb: シンタックスハイライト (Ruby/Python)
-* RedCarpet: Markdown エンジン (Ruby)
-* Safe YAML: セキュリティのために構築された YAML パーサ (Ruby)
-
-## 開発時の依存関係
-
-* Launchy: クロスプラットフォーム ファイルランチャ (Ruby)
-* Maruku: Markdown スーパーセット インタプリタ (Ruby)
-* RDiscount: Discount Markdown プロセッサ (Ruby)
-* RedCloth: Textile サポート (Ruby)
-* RedGreen: よりよいテスト出力 (Ruby)
-* RR: モック (Ruby)
-* Shoulda: テストフレームワーク (Ruby)
-* SimpleCov: カバレッジフレームワーク (Ruby)
-
-## ライセンス
-
-[ライセンス](https://github.com/jekyll/jekyll/blob/master/LICENSE)を見てください。
diff --git a/features/collections.feature b/features/collections.feature
index 4f69e8b..d97918b 100644
--- a/features/collections.feature
+++ b/features/collections.feature
@@ -9,12 +9,12 @@ Feature: Collections
And I have a configuration file with "collections" set to "['methods']"
When I run jekyll build
Then the _site directory should exist
- And I should see "Collections: <p>Use <code>Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>\n<p><code>Jekyll.sanitized_path</code> is used to make sure your path is in your source.</p>\n<p>Run your generators! default</p>\n<p>Page without title.</p>\n<p>Run your generators! default</p>" in "_site/index.html"
+ And I should see "Collections: <p>Use <code class=\"highlighter-rouge\">Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>\n<p>Signs are nice</p>\n<p><code class=\"highlighter-rouge\">Jekyll.sanitized_path</code> is used to make sure your path is in your source.</p>\n<p>Run your generators! default</p>\n<p>Page without title.</p>\n<p>Run your generators! default</p>" in "_site/index.html"
And the "_site/methods/configuration.html" file should not exist
Scenario: Rendered collection
Given I have an "index.html" page that contains "Collections: {{ site.collections }}"
- And I have an "collection_metadata.html" page that contains "Methods metadata: {{ site.collections.methods.foo }} {{ site.collections.methods }}"
+ And I have an "collection_metadata.html" page that contains "Methods metadata: {{ site.collections[0].foo }} {{ site.collections[0] }}"
And I have fixture collections
And I have a "_config.yml" file with content:
"""
@@ -25,7 +25,8 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "Collections: {\"methods" in "_site/index.html"
+ And I should see "Collections: {\"output\"=>true" in "_site/index.html"
+ And I should see "\"label\"=>\"methods\"," in "_site/index.html"
And I should see "Methods metadata: bar" in "_site/collection_metadata.html"
And I should see "<p>Whatever: foo.bar</p>" in "_site/methods/configuration.html"
@@ -56,7 +57,8 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "Collections: {\"methods" in "_site/index.html"
+ And I should see "Collections: {\"output\"=>true" in "_site/index.html"
+ And I should see "\"label\"=>\"methods\"," in "_site/index.html"
And I should see "<p>Run your generators! default</p>" in "_site/methods/site/generate.html"
And I should see "<div class='title'>Tom Preston-Werner</div>" in "_site/methods/site/generate.html"
@@ -70,7 +72,7 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "Collections: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
+ And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
Scenario: Collections specified as an hash
Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}"
@@ -82,7 +84,7 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "Collections: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
+ And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
Scenario: All the documents
Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}"
@@ -94,7 +96,7 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "All documents: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
+ And I should see "All documents: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
Scenario: Documents have an output attribute, which is the converted HTML
Given I have an "index.html" page that contains "First document's output: {{ site.documents.first.output }}"
@@ -106,7 +108,7 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "First document's output: <p>Use <code>Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>" in "_site/index.html"
+ And I should see "First document's output: <p>Use <code class=\"highlighter-rouge\">Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>" in "_site/index.html"
Scenario: Filter documents by where
Given I have an "index.html" page that contains "{% assign items = site.methods | where: 'whatever','foo.bar' %}Item count: {{ items.size }}"
@@ -118,7 +120,7 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "Item count: 1" in "_site/index.html"
+ And I should see "Item count: 2" in "_site/index.html"
Scenario: Sort by title
Given I have an "index.html" page that contains "{% assign items = site.methods | sort: 'title' %}1. of {{ items.size }}: {{ items.first.output }}"
@@ -130,7 +132,7 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "1. of 5: <p>Page without title.</p>" in "_site/index.html"
+ And I should see "1. of 7: <p>Page without title.</p>" in "_site/index.html"
Scenario: Sort by relative_path
Given I have an "index.html" page that contains "Collections: {% assign methods = site.methods | sort: 'relative_path' %}{% for method in methods %}{{ method.title }}, {% endfor %}"
@@ -142,4 +144,4 @@ Feature: Collections
"""
When I run jekyll build
Then the _site directory should exist
- And I should see "Collections: Jekyll.configuration, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html"
+ And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html"
diff --git a/features/create_sites.feature b/features/create_sites.feature
index 18996bf..898115c 100644
--- a/features/create_sites.feature
+++ b/features/create_sites.feature
@@ -112,16 +112,16 @@ Feature: Create sites
And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html"
Scenario: Basic site with internal post linking
- Given I have an "index.html" page that contains "URL: {% post_url 2020-01-31-entry2 %}"
+ Given I have an "index.html" page that contains "URL: {% post_url 2008-01-01-entry2 %}"
And I have a configuration file with "permalink" set to "pretty"
And I have a _posts directory
And I have the following posts:
| title | date | layout | content |
| entry1 | 2007-12-31 | post | content for entry1. |
- | entry2 | 2020-01-31 | post | content for entry2. |
+ | entry2 | 2008-01-01 | post | content for entry2. |
When I run jekyll build
Then the _site directory should exist
- And I should see "URL: /2020/01/31/entry2/" in "_site/index.html"
+ And I should see "URL: /2008/01/01/entry2/" in "_site/index.html"
Scenario: Basic site with whitelisted dotfile
Given I have an ".htaccess" file that contains "SomeDirective"
@@ -156,3 +156,17 @@ Feature: Create sites
And the "_site/index.html" file should exist
And the "_site/public.html" file should exist
And the "_site/secret.html" file should exist
+
+ Scenario: Basic site with page with future date
+ Given I have a _posts directory
+ And I have the following post:
+ | title | date | layout | content |
+ | entry1 | 2020-12-31 | post | content for entry1. |
+ | entry2 | 2007-12-31 | post | content for entry2. |
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "content for entry2" in "_site/2007/12/31/entry2.html"
+ And the "_site/2020/12/31/entry1.html" file should not exist
+ When I run jekyll build --future
+ Then the _site directory should exist
+ And the "_site/2020/12/31/entry1.html" file should exist
diff --git a/features/data.feature b/features/data.feature
index 4f0e32e..e44be8a 100644
--- a/features/data.feature
+++ b/features/data.feature
@@ -45,6 +45,20 @@ Feature: Data
And I should see "Jack" in "_site/index.html"
And I should see "Leon" in "_site/index.html"
+ Scenario: autoload *.csv files in _data directory
+ Given I have a _data directory
+ And I have a "_data/members.csv" file with content:
+ """
+ name,age
+ Jack,28
+ Leon,34
+ """
+ And I have an "index.html" page that contains "{% for member in site.data.members %}{{member.name}}{% endfor %}"
+ When I run jekyll build
+ Then the "_site/index.html" file should exist
+ And I should see "Jack" in "_site/index.html"
+ And I should see "Leon" in "_site/index.html"
+
Scenario: autoload *.yml files in _data directory with space in file name
Given I have a _data directory
And I have a "_data/team members.yml" file with content:
diff --git a/features/drafts.feature b/features/drafts.feature
index c55edbb..5d7982e 100644
--- a/features/drafts.feature
+++ b/features/drafts.feature
@@ -43,4 +43,4 @@ Feature: Draft Posts
| Recipe | 2009-03-27 | simple | Post path: {{ page.path }} |
When I run jekyll build --drafts
Then the _site directory should exist
- And I should see "Post path: _drafts/recipe.textile" in "_site/recipe.html"
+ And I should see "Post path: _drafts/recipe.markdown" in "_site/recipe.html"
diff --git a/features/embed_filters.feature b/features/embed_filters.feature
index 889a1fc..d6f99fc 100644
--- a/features/embed_filters.feature
+++ b/features/embed_filters.feature
@@ -20,8 +20,6 @@ Feature: Embed filters
And I have the following post:
| title | date | layout | content |
| Star & Wars | 2009-03-27 | default | These aren't the droids you're looking for. |
-
-
And I have a default layout that contains "{{ page.title | xml_escape }}"
When I run jekyll build
Then the _site directory should exist
@@ -33,7 +31,7 @@ Feature: Embed filters
And I have the following post:
| title | date | layout | content |
| Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. |
- And I have a default layout that contains "{{ content | xml_escape }}"
+ And I have a default layout that contains "{{ content | number_of_words }}"
When I run jekyll build
Then the _site directory should exist
And I should see "7" in "_site/2009/03/27/star-wars.html"
@@ -49,13 +47,13 @@ Feature: Embed filters
Then the _site directory should exist
And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html"
- Scenario: Textilize a given string
+ Scenario: Markdownify a given string
Given I have a _posts directory
And I have a _layouts directory
And I have the following post:
| title | date | layout | content |
| Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. |
- And I have a default layout that contains "By {{ '_Obi-wan_' | textilize }}"
+ And I have a default layout that contains "By {{ '_Obi-wan_' | markdownify }}"
When I run jekyll build
Then the _site directory should exist
And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html"
diff --git a/features/frontmatter_defaults.feature b/features/frontmatter_defaults.feature
index 41a7a35..a9a64ae 100644
--- a/features/frontmatter_defaults.feature
+++ b/features/frontmatter_defaults.feature
@@ -25,7 +25,7 @@ Feature: frontmatter defaults
And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {custom: "some special data", author: "Ben"}}]"
When I run jekyll build
Then the _site directory should exist
- And I should see "<p>some special data</p><div>Ben</div>" in "_site/2013/09/11/default-data.html"
+ And I should see "<p>some special data</p>\n<div>Ben</div>" in "_site/2013/09/11/default-data.html"
And I should see "just some special data by Ben" in "_site/index.html"
Scenario: Override frontmatter defaults by path
@@ -54,6 +54,28 @@ Feature: frontmatter defaults
And I should see "root: Overview for the webpage" in "_site/index.html"
And I should see "subfolder: Overview for the special section" in "_site/special/index.html"
+ Scenario: Use frontmatter variables by relative path
+ Given I have a _layouts directory
+ And I have a main layout that contains "main: {{ content }}"
+
+ And I have a _posts directory
+ And I have the following post:
+ | title | date | content |
+ | about | 2013-10-14 | content of site/2013/10/14/about.html |
+ And I have a special/_posts directory
+ And I have the following post in "special":
+ | title | date | path | content |
+ | about1 | 2013-10-14 | local | content of site/special/2013/10/14/about1.html |
+ | about2 | 2013-10-14 | local | content of site/special/2013/10/14/about2.html |
+
+ And I have a configuration file with "defaults" set to "[{scope: {path: "special"}, values: {layout: "main"}}, {scope: {path: "special/_posts"}, values: {layout: "main"}}, {scope: {path: "_posts"}, values: {layout: "main"}}]"
+
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "main: <p>content of site/2013/10/14/about.html</p>" in "_site/2013/10/14/about.html"
+ And I should see "main: <p>content of site/special/2013/10/14/about1.html</p>" in "_site/special/2013/10/14/about1.html"
+ And I should see "main: <p>content of site/special/2013/10/14/about2.html</p>" in "_site/special/2013/10/14/about2.html"
+
Scenario: Override frontmatter defaults by type
Given I have a _posts directory
And I have the following post:
@@ -78,11 +100,22 @@ Feature: frontmatter defaults
And I should see "nothing" in "_site/override.html"
But the "_site/perma.html" file should not exist
+ Scenario: Define permalink default for posts
+ Given I have a _posts directory
+ And I have the following post:
+ | title | date | category | content |
+ | testpost | 2013-10-14 | blog | blabla |
+ And I have a configuration file with "defaults" set to "[{scope: {path: "", type: "posts"}, values: {permalink: "/:categories/:title/"}}]"
+ When I run jekyll build
+ Then I should see "blabla" in "_site/blog/testpost/index.html"
+
Scenario: Use frontmatter defaults in collections
Given I have a _slides directory
And I have a "index.html" file that contains "nothing"
- And I have a "_slides/slide1.html" file with content:
+ And I have a "_slides/slide1.html" file with content:
"""
+ ---
+ ---
Value: {{ page.myval }}
"""
And I have a "_config.yml" file with content:
@@ -105,7 +138,7 @@ Feature: frontmatter defaults
Scenario: Override frontmatter defaults inside a collection
Given I have a _slides directory
And I have a "index.html" file that contains "nothing"
- And I have a "_slides/slide2.html" file with content:
+ And I have a "_slides/slide2.html" file with content:
"""
---
myval: Override
diff --git a/features/hooks.feature b/features/hooks.feature
new file mode 100644
index 0000000..489f256
--- /dev/null
+++ b/features/hooks.feature
@@ -0,0 +1,326 @@
+Feature: Hooks
+ As a plugin author
+ I want to be able to run code during various stages of the build process
+
+ Scenario: Run some code after site reset
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :site, :after_reset do |site|
+ pageklass = Class.new(Jekyll::Page) do
+ def initialize(site, base)
+ @site = site
+ @base = base
+ @data = {}
+ @dir = '/'
+ @name = 'foo.html'
+ @content = 'mytinypage'
+
+ self.process(@name)
+ end
+ end
+
+ site.pages << pageklass.new(site, site.source)
+ end
+ """
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "mytinypage" in "_site/foo.html"
+
+ Scenario: Modify the payload before rendering the site
+ Given I have a _plugins directory
+ And I have a "index.html" page that contains "{{ site.injected }}!"
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :site, :pre_render do |site, payload|
+ payload['site']['injected'] = 'myparam'
+ end
+ """
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "myparam!" in "_site/index.html"
+
+ Scenario: Modify the site contents after reading
+ Given I have a _plugins directory
+ And I have a "page1.html" page that contains "page1"
+ And I have a "page2.html" page that contains "page2"
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :site, :post_read do |site|
+ site.pages.delete_if { |p| p.name == 'page1.html' }
+ end
+ """
+ When I run jekyll build
+ Then the _site directory should exist
+ And the "_site/page1.html" file should not exist
+ And I should see "page2" in "_site/page2.html"
+
+ Scenario: Work with the site files after they've been written to disk
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :site, :post_write do |site|
+ firstpage = site.pages.first
+ content = File.read firstpage.destination(site.dest)
+ File.write(File.join(site.dest, 'firstpage.html'), content)
+ end
+ """
+ And I have a "page1.html" page that contains "page1"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "page1" in "_site/firstpage.html"
+
+ Scenario: Alter a page right after it is initialized
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :pages, :post_init do |page|
+ page.name = 'renamed.html'
+ page.process(page.name)
+ end
+ """
+ And I have a "page1.html" page that contains "page1"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "page1" in "_site/renamed.html"
+
+ Scenario: Alter the payload for one page but not another
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :pages, :pre_render do |page, payload|
+ payload['myparam'] = 'special' if page.name == 'page1.html'
+ end
+ """
+ And I have a "page1.html" page that contains "{{ myparam }}"
+ And I have a "page2.html" page that contains "{{ myparam }}"
+ When I run jekyll build
+ Then I should see "special" in "_site/page1.html"
+ And I should not see "special" in "_site/page2.html"
+
+ Scenario: Modify page contents before writing to disk
+ Given I have a _plugins directory
+ And I have a "index.html" page that contains "WRAP ME"
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :pages, :post_render do |page|
+ page.output = "{{{{{ #{page.output.chomp} }}}}}"
+ end
+ """
+ When I run jekyll build
+ Then I should see "{{{{{ WRAP ME }}}}}" in "_site/index.html"
+
+ Scenario: Work with a page after writing it to disk
+ Given I have a _plugins directory
+ And I have a "index.html" page that contains "HELLO FROM A PAGE"
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :pages, :post_write do |page|
+ require 'fileutils'
+ filename = page.destination(page.site.dest)
+ FileUtils.mv(filename, "#{filename}.moved")
+ end
+ """
+ When I run jekyll build
+ Then I should see "HELLO FROM A PAGE" in "_site/index.html.moved"
+
+ Scenario: Alter a post right after it is initialized
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :posts, :post_init do |post|
+ post.data['harold'] = "content for entry1.".tr!('abcdefghijklmnopqrstuvwxyz',
+ 'nopqrstuvwxyzabcdefghijklm')
+ end
+ """
+ And I have a _posts directory
+ And I have the following posts:
+ | title | date | layout | content |
+ | entry1 | 2015-03-14 | nil | {{ page.harold }} |
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "pbagrag sbe ragel1." in "_site/2015/03/14/entry1.html"
+
+ Scenario: Alter the payload for certain posts
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ # Add myvar = 'old' to posts before 2015-03-15, and myvar = 'new' for
+ # others
+ Jekyll::Hooks.register :posts, :pre_render do |post, payload|
+ if post.date < Time.new(2015, 3, 15)
+ payload['myvar'] = 'old'
+ else
+ payload['myvar'] = 'new'
+ end
+ end
+ """
+ And I have a _posts directory
+ And I have the following posts:
+ | title | date | layout | content |
+ | entry1 | 2015-03-14 | nil | {{ myvar }} post |
+ | entry2 | 2015-03-15 | nil | {{ myvar }} post |
+ When I run jekyll build
+ Then I should see "old post" in "_site/2015/03/14/entry1.html"
+ And I should see "new post" in "_site/2015/03/15/entry2.html"
+
+ Scenario: Modify post contents before writing to disk
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ # Replace content after rendering
+ Jekyll::Hooks.register :posts, :post_render do |post|
+ post.output.gsub! /42/, 'the answer to life, the universe and everything'
+ end
+ """
+ And I have a _posts directory
+ And I have the following posts:
+ | title | date | layout | content |
+ | entry1 | 2015-03-14 | nil | {{ 6 \| times: 7 }} |
+ | entry2 | 2015-03-15 | nil | {{ 6 \| times: 8 }} |
+ When I run jekyll build
+ Then I should see "the answer to life, the universe and everything" in "_site/2015/03/14/entry1.html"
+ And I should see "48" in "_site/2015/03/15/entry2.html"
+
+ Scenario: Work with a post after writing it to disk
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ # Log all post filesystem writes
+ Jekyll::Hooks.register :posts, :post_write do |post|
+ filename = post.destination(post.site.dest)
+ open('_site/post-build.log', 'a') do |f|
+ f.puts "Wrote #{filename} at #{Time.now}"
+ end
+ end
+ """
+ And I have a _posts directory
+ And I have the following posts:
+ | title | date | layout | content |
+ | entry1 | 2015-03-14 | nil | entry one |
+ | entry2 | 2015-03-15 | nil | entry two |
+ When I run jekyll build
+ Then I should see "_site/2015/03/14/entry1.html at" in "_site/post-build.log"
+ Then I should see "_site/2015/03/15/entry2.html at" in "_site/post-build.log"
+
+ Scenario: Register a hook on multiple owners at the same time
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register [:pages, :posts], :post_render do |owner|
+ owner.output = "{{{{{ #{owner.output.chomp} }}}}}"
+ end
+ """
+ And I have a "index.html" page that contains "WRAP ME"
+ And I have a _posts directory
+ And I have the following posts:
+ | title | date | layout | content |
+ | entry1 | 2015-03-14 | nil | entry one |
+ When I run jekyll build
+ Then I should see "{{{{{ WRAP ME }}}}}" in "_site/index.html"
+ And I should see "{{{{{ <p>entry one</p> }}}}}" in "_site/2015/03/14/entry1.html"
+
+ Scenario: Allow hooks to have a named priority
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :pages, :post_render, priority: :normal do |owner|
+ # first normal runs second
+ owner.output = "1 #{owner.output.chomp}"
+ end
+ Jekyll::Hooks.register :pages, :post_render, priority: :high do |owner|
+ # high runs last
+ owner.output = "2 #{owner.output.chomp}"
+ end
+ Jekyll::Hooks.register :pages, :post_render do |owner|
+ # second normal runs third (normal is default)
+ owner.output = "3 #{owner.output.chomp}"
+ end
+ Jekyll::Hooks.register :pages, :post_render, priority: :low do |owner|
+ # low runs first
+ owner.output = "4 #{owner.output.chomp}"
+ end
+ """
+ And I have a "index.html" page that contains "WRAP ME"
+ When I run jekyll build
+ Then I should see "2 3 1 4 WRAP ME" in "_site/index.html"
+
+ Scenario: Alter a document right after it is initialized
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :documents, :pre_render do |doc, payload|
+ doc.data['text'] = doc.data['text'] << ' are belong to us'
+ end
+ """
+ And I have a "_config.yml" file that contains "collections: [ memes ]"
+ And I have a _memes directory
+ And I have a "_memes/doc1.md" file with content:
+ """
+ ---
+ text: all your base
+ ---
+ """
+ And I have an "index.md" file with content:
+ """
+ ---
+ ---
+ {{ site.memes.first.text }}
+ """
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "all your base are belong to us" in "_site/index.html"
+
+ Scenario: Update a document after rendering it, but before writing it to disk
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :documents, :post_render do |doc|
+ doc.output.gsub! /<p>/, '<p class="meme">'
+ end
+ """
+ And I have a "_config.yml" file with content:
+ """
+ collections:
+ memes:
+ output: true
+ """
+ And I have a _memes directory
+ And I have a "_memes/doc1.md" file with content:
+ """
+ ---
+ text: all your base are belong to us
+ ---
+ {{ page.text }}
+ """
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "<p class=\"meme\">all your base are belong to us" in "_site/memes/doc1.html"
+
+ Scenario: Perform an action after every document is written
+ Given I have a _plugins directory
+ And I have a "_plugins/ext.rb" file with content:
+ """
+ Jekyll::Hooks.register :documents, :post_write do |doc|
+ open('_site/document-build.log', 'a') do |f|
+ f.puts "Wrote document #{doc.collection.docs.index doc} at #{Time.now}"
+ end
+ end
+ """
+ And I have a "_config.yml" file with content:
+ """
+ collections:
+ memes:
+ output: true
+ """
+ And I have a _memes directory
+ And I have a "_memes/doc1.md" file with content:
+ """
+ ---
+ text: all your base are belong to us
+ ---
+ {{ page.text }}
+ """
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Wrote document 0" in "_site/document-build.log"
diff --git a/features/include_tag.feature b/features/include_tag.feature
index 3d2f48c..c7e03de 100644
--- a/features/include_tag.feature
+++ b/features/include_tag.feature
@@ -9,15 +9,15 @@ Feature: Include tags
And I have an "_includes/params.html" file that contains "Parameters:<ul>{% for param in include %}<li>{{param[0]}} = {{param[1]}}</li>{% endfor %}</ul>"
And I have an "_includes/ignore.html" file that contains "<footer>My blog footer</footer>"
And I have a _posts directory
- And I have the following post:
- | title | date | layout | content |
- | Include Files | 2013-03-21 | default | {% include header.html param="myparam" %} |
- | Ignore params if unused | 2013-03-21 | default | {% include ignore.html date="today" %} |
- | List multiple parameters | 2013-03-21 | default | {% include params.html date="today" start="tomorrow" %} |
- | Dont keep parameters | 2013-03-21 | default | {% include ignore.html param="test" %}\n{% include header.html %} |
- | Allow params with spaces and quotes | 2013-04-07 | default | {% include params.html cool="param with spaces" super="\"quoted\"" single='has "quotes"' escaped='\'single\' quotes' %} |
- | Parameter syntax | 2013-04-12 | default | {% include params.html param1_or_2="value" %} |
- | Pass a variable | 2013-06-22 | default | {% assign var = 'some text' %}{% include params.html local=var layout=page.layout %} |
+ And I have the following posts:
+ | title | date | type | content |
+ | Include Files | 2013-03-21 | html | {% include header.html param="myparam" %} |
+ | Ignore params if unused | 2013-03-21 | html | {% include ignore.html date="today" %} |
+ | List multiple parameters | 2013-03-21 | html | {% include params.html date="today" start="tomorrow" %} |
+ | Dont keep parameters | 2013-03-21 | html | {% include ignore.html param="test" %}\n{% include header.html %} |
+ | Allow params with spaces and quotes | 2013-04-07 | html | {% include params.html cool="param with spaces" super="\"quoted\"" single='has "quotes"' escaped='\'single\' quotes' %} |
+ | Parameter syntax | 2013-04-12 | html | {% include params.html param1_or_2="value" %} |
+ | Pass a variable | 2013-06-22 | html | {% assign var = 'some text' %}{% include params.html local=var title=page.title %} |
When I run jekyll build
Then the _site directory should exist
And I should see "<header>My awesome blog header: myparam</header>" in "_site/2013/03/21/include-files.html"
@@ -27,12 +27,12 @@ Feature: Include tags
And I should not see "<header>My awesome blog header: myparam</header>" in "_site/2013/03/21/dont-keep-parameters.html"
But I should see "<header>My awesome blog header: </header>" in "_site/2013/03/21/dont-keep-parameters.html"
And I should see "<li>cool = param with spaces</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
- And I should see "<li>super = “quoted”</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
- And I should see "<li>single = has “quotes”</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
- And I should see "<li>escaped = ‘single’ quotes</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
+ And I should see "<li>super = \"quoted\"</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
+ And I should see "<li>single = has \"quotes\"</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
+ And I should see "<li>escaped = 'single' quotes</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
And I should see "<li>param1_or_2 = value</li>" in "_site/2013/04/12/parameter-syntax.html"
And I should see "<li>local = some text</li>" in "_site/2013/06/22/pass-a-variable.html"
- And I should see "<li>layout = default</li>" in "_site/2013/06/22/pass-a-variable.html"
+ And I should see "<li>title = Pass a variable</li>" in "_site/2013/06/22/pass-a-variable.html"
Scenario: Include a file from a variable
Given I have an _includes directory
@@ -66,3 +66,14 @@ Feature: Include tags
When I run jekyll build
Then the _site directory should exist
And I should see "one included" in "_site/index.html"
+
+ Scenario: Include a file with partial variables
+ Given I have an _includes directory
+ And I have an "_includes/one.html" file that contains "one included"
+ And I have a configuration file with:
+ | key | value |
+ | include_file | one |
+ And I have an "index.html" page that contains "{% include {{ site.include_file }}.html %}"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "one included" in "_site/index.html"
diff --git a/features/incremental_rebuild.feature b/features/incremental_rebuild.feature
new file mode 100644
index 0000000..fb95e0c
--- /dev/null
+++ b/features/incremental_rebuild.feature
@@ -0,0 +1,60 @@
+Feature: Incremental rebuild
+ As an impatient hacker who likes to blog
+ I want to be able to make a static site
+ Without waiting too long for it to build
+
+ Scenario: Produce correct output site
+ Given I have a _layouts directory
+ And I have a _posts directory
+ And I have the following posts:
+ | title | date | layout | content |
+ | Wargames | 2009-03-27 | default | The only winning move is not to play. |
+ And I have a default layout that contains "Post Layout: {{ content }}"
+ When I run jekyll build -I
+ Then the _site directory should exist
+ And I should see "Post Layout: <p>The only winning move is not to play.</p>" in "_site/2009/03/27/wargames.html"
+ When I run jekyll build -I
+ Then the _site directory should exist
+ And I should see "Post Layout: <p>The only winning move is not to play.</p>" in "_site/2009/03/27/wargames.html"
+
+ Scenario: Generate a metadata file
+ Given I have an "index.html" file that contains "Basic Site"
+ When I run jekyll build -I
+ Then the ".jekyll-metadata" file should exist
+
+ Scenario: Rebuild when content is changed
+ Given I have an "index.html" file that contains "Basic Site"
+ When I run jekyll build -I
+ Then the _site directory should exist
+ And I should see "Basic Site" in "_site/index.html"
+ When I wait 1 second
+ Then I have an "index.html" file that contains "Bacon Site"
+ When I run jekyll build -I
+ Then the _site directory should exist
+ And I should see "Bacon Site" in "_site/index.html"
+
+ Scenario: Rebuild when layout is changed
+ Given I have a _layouts directory
+ And I have an "index.html" page with layout "default" that contains "Basic Site with Layout"
+ And I have a default layout that contains "Page Layout: {{ content }}"
+ When I run jekyll build -I
+ Then the _site directory should exist
+ And I should see "Page Layout: Basic Site with Layout" in "_site/index.html"
+ When I wait 1 second
+ Then I have a default layout that contains "Page Layout Changed: {{ content }}"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Page Layout Changed: Basic Site with Layout" in "_site/index.html"
+
+ Scenario: Rebuild when an include is changed
+ Given I have a _includes directory
+ And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}"
+ And I have an "_includes/about.textile" file that contains "Generated by Jekyll"
+ When I run jekyll build -I
+ Then the _site directory should exist
+ And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html"
+ When I wait 1 second
+ Then I have an "_includes/about.textile" file that contains "Regenerated by Jekyll"
+ When I run jekyll build -I
+ Then the _site directory should exist
+ And I should see "Basic Site with include tag: Regenerated by Jekyll" in "_site/index.html"
diff --git a/features/markdown.feature b/features/markdown.feature
index 659eed0..c0eeb25 100644
--- a/features/markdown.feature
+++ b/features/markdown.feature
@@ -17,7 +17,10 @@ Feature: Markdown
And I should see "<h1 id=\"my-title\">My Title</h1>" in "_site/index.html"
Scenario: Markdown in pagination on index
- Given I have a configuration file with "paginate" set to "5"
+ Given I have a configuration file with:
+ | key | value |
+ | paginate | 5 |
+ | gems | [jekyll-paginate] |
And I have an "index.html" page that contains "Index - {% for post in paginator.posts %} {{ post.content }} {% endfor %}"
And I have a _posts directory
And I have the following post:
@@ -27,41 +30,3 @@ Feature: Markdown
Then the _site directory should exist
And I should see "Index" in "_site/index.html"
And I should see "<h1 id=\"my-title\">My Title</h1>" in "_site/index.html"
-
- Scenario: Maruku fenced codeblocks
- Given I have a configuration file with "markdown" set to "maruku"
- And I have an "index.markdown" file with content:
- """
- ---
- title: My title
- ---
-
- # My title
-
- ```
- My awesome code
- ```
- """
- When I run jekyll build
- Then the _site directory should exist
- And I should see "My awesome code" in "_site/index.html"
- And I should see "<pre><code>My awesome code</code></pre>" in "_site/index.html"
-
- Scenario: Maruku fenced codeblocks
- Given I have a configuration file with "markdown" set to "maruku"
- And I have an "index.markdown" file with content:
- """
- ---
- title: My title
- ---
-
- # My title
-
- ```ruby
- puts "My awesome string"
- ```
- """
- When I run jekyll build
- Then the _site directory should exist
- And I should see "My awesome string" in "_site/index.html"
- And I should see "<pre class="ruby"><code class="ruby">puts "My awesome string"</code></pre>" in "_site/index.html"
diff --git a/features/pagination.feature b/features/pagination.feature
index 21b96b0..b8b89ed 100644
--- a/features/pagination.feature
+++ b/features/pagination.feature
@@ -4,7 +4,10 @@ Feature: Site pagination
I want divide the posts in several pages
Scenario Outline: Paginate with N posts per page
- Given I have a configuration file with "paginate" set to "<num>"
+ Given I have a configuration file with:
+ | key | value |
+ | paginate | <num> |
+ | gems | [jekyll-paginate] |
And I have a _layouts directory
And I have an "index.html" page that contains "{{ paginator.posts.size }}"
And I have a _posts directory
@@ -32,6 +35,7 @@ Feature: Site pagination
| paginate | 1 |
| paginate_path | /blog/page-:num |
| permalink | /blog/:year/:month/:day/:title |
+ | gems | [jekyll-paginate] |
And I have a blog directory
And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}"
And I have a _posts directory
@@ -59,6 +63,7 @@ Feature: Site pagination
| paginate | 1 |
| paginate_path | /blog/page/:num |
| permalink | /blog/:year/:month/:day/:title |
+ | gems | [jekyll-paginate] |
And I have a blog directory
And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}"
And I have an "index.html" page that contains "Don't pick me!"
diff --git a/features/permalinks.feature b/features/permalinks.feature
index f63aaf8..74f2e40 100644
--- a/features/permalinks.feature
+++ b/features/permalinks.feature
@@ -39,7 +39,7 @@ Feature: Fancy permalinks
And I have the following post:
| title | category | date | content |
| Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. |
- And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title"
+ And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title/"
When I run jekyll build
Then the _site directory should exist
And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html"
@@ -64,11 +64,24 @@ Feature: Fancy permalinks
Then the _site directory should exist
And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-schema.html"
+ Scenario: Use custom permalink schema with date and time
+ Given I have a _posts directory
+ And I have the following post:
+ | title | category | date | content |
+ | Custom Permalink Schema | stuff | 2009-03-27 22:31:07 | Totally custom. |
+ And I have a configuration file with:
+ | key | value |
+ | permalink | "/:year:month:day:hour:minute:second.html" |
+ | timezone | UTC |
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Totally custom." in "_site/20090327223107.html"
+
Scenario: Use per-post permalink
Given I have a _posts directory
And I have the following post:
| title | date | permalink | content |
- | Some post | 2013-04-14 | /custom/posts/1 | bla bla |
+ | Some post | 2013-04-14 | /custom/posts/1/ | bla bla |
When I run jekyll build
Then the _site directory should exist
And the _site/custom/posts/1 directory should exist
@@ -83,3 +96,27 @@ Feature: Fancy permalinks
Then the _site directory should exist
And the _site/custom/posts directory should exist
And I should see "bla bla" in "_site/custom/posts/some.html"
+
+ Scenario: Use pretty permalink schema with cased file name
+ Given I have a _posts directory
+ And I have an "_posts/2009-03-27-Pretty-Permalink-Schema.md" page that contains "Totally wordpress"
+ And I have a configuration file with "permalink" set to "pretty"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Totally wordpress." in "_site/2009/03/27/Pretty-Permalink-Schema/index.html"
+
+ Scenario: Use custom permalink schema with cased file name
+ Given I have a _posts directory
+ And I have an "_posts/2009-03-27-Custom-Schema.md" page with title "Custom Schema" that contains "Totally awesome"
+ And I have a configuration file with "permalink" set to "/:year/:month/:day/:slug/"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Totally awesome" in "_site/2009/03/27/custom-schema/index.html"
+
+ Scenario: Use pretty permalink schema with title containing underscore
+ Given I have a _posts directory
+ And I have an "_posts/2009-03-27-Custom_Schema.md" page with title "Custom Schema" that contains "Totally awesome"
+ And I have a configuration file with "permalink" set to "pretty"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Totally awesome" in "_site/2009/03/27/Custom_Schema/index.html"
diff --git a/features/plugins.feature b/features/plugins.feature
new file mode 100644
index 0000000..a36c6c8
--- /dev/null
+++ b/features/plugins.feature
@@ -0,0 +1,34 @@
+Feature: Configuring and using plugins
+ As a hacker
+ I want to specify my own plugins that can modify Jekyll's behaviour
+
+ Scenario: Add a gem-based plugin
+ Given I have an "index.html" file that contains "Whatever"
+ And I have a configuration file with "gems" set to "[jekyll_test_plugin]"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Whatever" in "_site/index.html"
+ And I should see "this is a test" in "_site/test.txt"
+
+ Scenario: Add an empty whitelist to restrict all gems
+ Given I have an "index.html" file that contains "Whatever"
+ And I have a configuration file with:
+ | key | value |
+ | gems | [jekyll_test_plugin] |
+ | whitelist | [] |
+ When I run jekyll build --safe
+ Then the _site directory should exist
+ And I should see "Whatever" in "_site/index.html"
+ And the "_site/test.txt" file should not exist
+
+ Scenario: Add a whitelist to restrict some gems but allow others
+ Given I have an "index.html" file that contains "Whatever"
+ And I have a configuration file with:
+ | key | value |
+ | gems | [jekyll_test_plugin, jekyll_test_plugin_malicious] |
+ | whitelist | [jekyll_test_plugin] |
+ When I run jekyll build --safe
+ Then the _site directory should exist
+ And I should see "Whatever" in "_site/index.html"
+ And the "_site/test.txt" file should exist
+ And I should see "this is a test" in "_site/test.txt"
diff --git a/features/post_data.feature b/features/post_data.feature
index 0ecaeef..6ebfb27 100644
--- a/features/post_data.feature
+++ b/features/post_data.feature
@@ -141,7 +141,7 @@ Feature: Post data
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
When I run jekyll build
Then the _site directory should exist
- And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
+ And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
Scenario: Use post.categories variable when category is in YAML
Given I have a _posts directory
@@ -163,7 +163,7 @@ Feature: Post data
And I have a simple layout that contains "Post category: {{ page.categories }}"
When I run jekyll build
Then the _site directory should exist
- And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
+ And I should see "Post category: Movies" in "_site/movies/2009/03/27/star-wars.html"
Scenario: Use post.categories variable when categories are in YAML
Given I have a _posts directory
@@ -187,6 +187,24 @@ Feature: Post data
Then the _site directory should exist
And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
+ Scenario: Superdirectories of _posts applied to post.categories
+ Given I have a movies/_posts directory
+ And I have a "movies/_posts/2009-03-27-star-wars.html" page with layout "simple" that contains "hi"
+ And I have a _layouts directory
+ And I have a simple layout that contains "Post category: {{ page.categories }}"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
+
+ Scenario: Subdirectories of _posts not applied to post.categories
+ Given I have a movies/_posts/scifi directory
+ And I have a "movies/_posts/scifi/2009-03-27-star-wars.html" page with layout "simple" that contains "hi"
+ And I have a _layouts directory
+ And I have a simple layout that contains "Post category: {{ page.categories }}"
+ When I run jekyll build
+ Then the _site directory should exist
+ And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
+
Scenario: Use post.categories variable when categories are in YAML with mixed case
Given I have a _posts directory
And I have a _layouts directory
@@ -197,8 +215,8 @@ Feature: Post data
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
When I run jekyll build
Then the _site directory should exist
- And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
- And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html"
+ And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
+ And I should see "Post categories: SciFi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html"
Scenario Outline: Use page.path variable
Given I have a <dir>/_posts directory
diff --git a/features/post_excerpts.feature b/features/post_excerpts.feature
index 4ad6d12..c66c527 100644
--- a/features/post_excerpts.feature
+++ b/features/post_excerpts.feature
@@ -46,5 +46,5 @@ Feature: Post excerpts
And the _site/2007/12 directory should exist
And the _site/2007/12/31 directory should exist
And the "_site/2007/12/31/entry1.html" file should exist
- And I should see exactly "<p>content for entry1.</p>" in "_site/index.html"
- And I should see exactly "<html><head></head><body><p>content for entry1.</p></body></html>" in "_site/2007/12/31/entry1.html"
+ And I should see "<p>content for entry1.</p>" in "_site/index.html"
+ And I should see "<html><head></head><body><p>content for entry1.</p>\n</body></html>" in "_site/2007/12/31/entry1.html"
diff --git a/features/rendering.feature b/features/rendering.feature
index 5f71e2c..01507cb 100644
--- a/features/rendering.feature
+++ b/features/rendering.feature
@@ -5,6 +5,13 @@ Feature: Rendering
But I want to make it as simply as possible
So render with Liquid and place in Layouts
+ Scenario: When receiving bad Liquid
+ Given I have a "index.html" page with layout "simple" that contains "{% include invalid.html %}"
+ And I have a simple layout that contains "{{ content }}"
+ When I run jekyll build
+ Then I should get a non-zero exit-status
+ And I should see "Liquid Exception" in the build output
+
Scenario: Render Liquid and place in layout
Given I have a "index.html" page with layout "simple" that contains "Hi there, Jekyll {{ jekyll.environment }}!"
And I have a simple layout that contains "{{ content }}Ahoy, indeed!"
@@ -15,20 +22,29 @@ Feature: Rendering
Scenario: Don't place asset files in layout
Given I have an "index.scss" page with layout "simple" that contains ".foo-bar { color:black; }"
And I have an "index.coffee" page with layout "simple" that contains "whatever()"
+ And I have a configuration file with "gems" set to "[jekyll-coffeescript]"
And I have a simple layout that contains "{{ content }}Ahoy, indeed!"
When I run jekyll build
Then the _site directory should exist
And I should not see "Ahoy, indeed!" in "_site/index.css"
And I should not see "Ahoy, indeed!" in "_site/index.js"
- Scenario: Don't render liquid in Sass
+ Scenario: Render liquid in Sass
Given I have an "index.scss" page that contains ".foo-bar { color:{{site.color}}; }"
+ And I have a configuration file with "color" set to "red"
When I run jekyll build
- Then the _site directory should not exist
- And I should see "Invalid CSS after" in the build output
+ Then the _site directory should exist
+ And I should see ".foo-bar {\n color: red; }" in "_site/index.css"
+
+ Scenario: Not render liquid in CoffeeScript without explicitly including jekyll-coffeescript
+ Given I have an "index.coffee" page with animal "cicada" that contains "hey='for {{page.animal}}'"
+ When I run jekyll build
+ Then the _site directory should exist
+ And the "_site/index.js" file should not exist
- Scenario: Don't render liquid in CoffeeScript
- Given I have an "index.coffee" page that contains "hey='for {{site.animal}}'"
+ Scenario: Render liquid in CoffeeScript with jekyll-coffeescript enabled
+ Given I have an "index.coffee" page with animal "cicada" that contains "hey='for {{page.animal}}'"
+ And I have a configuration file with "gems" set to "[jekyll-coffeescript]"
When I run jekyll build
Then the _site directory should exist
- And I should see "hey = 'for {{site.animal}}';" in "_site/index.js"
+ And I should see "hey = 'for cicada';" in "_site/index.js"
diff --git a/features/site_configuration.feature b/features/site_configuration.feature
index 8aaa9e1..379cea4 100644
--- a/features/site_configuration.feature
+++ b/features/site_configuration.feature
@@ -83,13 +83,6 @@ Feature: Site configuration
Then the _site directory should exist
And I should see "<a href=\"http://google.com\">Google</a>" in "_site/index.html"
- Scenario: Use Maruku for markup
- Given I have an "index.markdown" page that contains "[Google](http://google.com)"
- And I have a configuration file with "markdown" set to "maruku"
- When I run jekyll build
- Then the _site directory should exist
- And I should see "<a href=\"http://google.com\">Google</a>" in "_site/index.html"
-
Scenario: Highlight code with pygments
Given I have an "index.html" page that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}"
When I run jekyll build
@@ -170,8 +163,8 @@ Feature: Site configuration
When I run jekyll build
Then the _site directory should exist
And I should see "Page Layout: 2" in "_site/index.html"
- And I should see "Post Layout: <p>content for entry1.</p> built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html"
- And I should see "Post Layout: <p>content for entry2.</p> built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html"
+ And I should see "Post Layout: <p>content for entry1.</p>\n built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html"
+ And I should see "Post Layout: <p>content for entry2.</p>\n built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html"
Scenario: Generate proper dates with explicitly set timezone (different than posts' time)
Given I have a _layouts directory
@@ -180,19 +173,19 @@ Feature: Site configuration
And I have an "index.html" page with layout "page" that contains "site index page"
And I have a configuration file with:
| key | value |
- | timezone | Australia/Melbourne |
+ | timezone | Pacific/Honolulu |
And I have a _posts directory
And I have the following posts:
| title | date | layout | content |
- | entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. |
- | entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. |
+ | entry1 | 2013-04-09 23:22 +0400 | post | content for entry1. |
+ | entry2 | 2013-04-10 03:14 +0400 | post | content for entry2. |
When I run jekyll build
Then the _site directory should exist
And I should see "Page Layout: 2" in "_site/index.html"
- And the "_site/2013/04/10/entry1.html" file should exist
- And the "_site/2013/04/10/entry2.html" file should exist
- And I should see escaped "Post Layout: <p>content for entry1.</p> built at 2013-04-10T13:22:00+10:00" in "_site/2013/04/10/entry1.html"
- And I should see escaped "Post Layout: <p>content for entry2.</p> built at 2013-04-10T17:14:00+10:00" in "_site/2013/04/10/entry2.html"
+ And the "_site/2013/04/09/entry1.html" file should exist
+ And the "_site/2013/04/09/entry2.html" file should exist
+ And I should see "Post Layout: <p>content for entry1.</p>\n built at 2013-04-09T09:22:00-10:00" in "_site/2013/04/09/entry1.html"
+ And I should see "Post Layout: <p>content for entry2.</p>\n built at 2013-04-09T13:14:00-10:00" in "_site/2013/04/09/entry2.html"
Scenario: Limit the number of posts generated by most recent date
Given I have a _posts directory
@@ -231,7 +224,7 @@ Feature: Site configuration
| key | value |
| time | 2010-01-01 |
| future | true |
- | layouts | _theme |
+ | layouts_dir | _theme |
And I have a _posts directory
And I have the following posts:
| title | date | layout | content |
@@ -243,37 +236,6 @@ Feature: Site configuration
And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
And I should see "Post Layout: <p>content for entry2.</p>" in "_site/2020/01/31/entry2.html"
- Scenario: Add a gem-based plugin
- Given I have an "index.html" file that contains "Whatever"
- And I have a configuration file with "gems" set to "[jekyll_test_plugin]"
- When I run jekyll build
- Then the _site directory should exist
- And I should see "Whatever" in "_site/index.html"
- And I should see "this is a test" in "_site/test.txt"
-
- Scenario: Add an empty whitelist to restrict all gems
- Given I have an "index.html" file that contains "Whatever"
- And I have a configuration file with:
- | key | value |
- | gems | [jekyll_test_plugin] |
- | whitelist | [] |
- When I run jekyll build --safe
- Then the _site directory should exist
- And I should see "Whatever" in "_site/index.html"
- And the "_site/test.txt" file should not exist
-
- Scenario: Add a whitelist to restrict some gems but allow others
- Given I have an "index.html" file that contains "Whatever"
- And I have a configuration file with:
- | key | value |
- | gems | [jekyll_test_plugin, jekyll_test_plugin_malicious] |
- | whitelist | [jekyll_test_plugin] |
- When I run jekyll build --safe
- Then the _site directory should exist
- And I should see "Whatever" in "_site/index.html"
- And the "_site/test.txt" file should exist
- And I should see "this is a test" in "_site/test.txt"
-
Scenario: arbitrary file reads via layouts
Given I have an "index.html" page with layout "page" that contains "FOO"
And I have a "_config.yml" file that contains "layouts: '../../../../../../../../../../../../../../usr/include'"
diff --git a/features/step_definitions/jekyll_steps.rb b/features/step_definitions/jekyll_steps.rb
index b0cb4c8..9164d54 100644
--- a/features/step_definitions/jekyll_steps.rb
+++ b/features/step_definitions/jekyll_steps.rb
@@ -8,7 +8,7 @@ def file_content_from_hash(input_hash)
input_hash['content']
end
- <<EOF
+ <<-EOF
---
#{matter}
---
@@ -22,11 +22,15 @@ Before do
end
After do
- FileUtils.rm_rf(TEST_DIR) if File.exists?(TEST_DIR)
- FileUtils.rm(JEKYLL_COMMAND_OUTPUT_FILE) if File.exists?(JEKYLL_COMMAND_OUTPUT_FILE)
+ FileUtils.rm_rf(TEST_DIR) if File.exist?(TEST_DIR)
+ FileUtils.rm(JEKYLL_COMMAND_OUTPUT_FILE) if File.exist?(JEKYLL_COMMAND_OUTPUT_FILE)
+ FileUtils.rm(JEKYLL_COMMAND_STATUS_FILE) if File.exist?(JEKYLL_COMMAND_STATUS_FILE)
+ Dir.chdir(File.dirname(TEST_DIR))
end
-World(Test::Unit::Assertions)
+World do
+ MinitestWorld.new
+end
Given /^I have a blank site in "(.*)"$/ do |path|
FileUtils.mkdir_p(path) unless File.exist?(path)
@@ -39,7 +43,7 @@ end
# Like "I have a foo file" but gives a yaml front matter so jekyll actually processes it
Given /^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$/ do |file, key, value, text|
File.open(file, 'w') do |f|
- f.write <<EOF
+ f.write <<-EOF
---
#{key || 'layout'}: #{value || 'nil'}
---
@@ -83,7 +87,7 @@ end
Given /^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table|
table.hashes.each do |input_hash|
title = slug(input_hash['title'])
- ext = input_hash['type'] || 'textile'
+ ext = input_hash['type'] || 'markdown'
before, after = location(folder, direction)
case status
@@ -133,6 +137,10 @@ Given /^I have fixture collections$/ do
FileUtils.cp_r File.join(JEKYLL_SOURCE_DIR, "test", "source", "_methods"), source_dir
end
+Given /^I wait (\d+) second(s?)$/ do |time, plural|
+ sleep(time.to_f)
+end
+
##################
#
# Changing stuff
@@ -146,6 +154,13 @@ When /^I run jekyll(.*)$/ do |args|
end
end
+When /^I run bundle(.*)$/ do |args|
+ status = run_bundle(args)
+ if args.include?("--verbose") || ENV['DEBUG']
+ puts jekyll_run_output
+ end
+end
+
When /^I change "(.*)" to contain "(.*)"$/ do |file, text|
File.open(file, 'a') do |f|
f.write(text)
@@ -156,6 +171,12 @@ When /^I delete the file "(.*)"$/ do |file|
File.delete(file)
end
+##################
+#
+# Checking stuff
+#
+##################
+
Then /^the (.*) directory should +exist$/ do |dir|
assert File.directory?(dir), "The directory \"#{dir}\" does not exist"
end
@@ -173,7 +194,7 @@ Then /^I should see exactly "(.*)" in "(.*)"$/ do |text, file|
end
Then /^I should not see "(.*)" in "(.*)"$/ do |text, file|
- assert_no_match Regexp.new(text, Regexp::MULTILINE), file_contents(file)
+ refute_match Regexp.new(text, Regexp::MULTILINE), file_contents(file)
end
Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file|
@@ -181,7 +202,15 @@ Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file|
end
Then /^the "(.*)" file should +exist$/ do |file|
- assert File.file?(file), "The file \"#{file}\" does not exist"
+ file_does_exist = File.file?(file)
+ unless file_does_exist
+ all_steps_to_path(file).each do |dir|
+ STDERR.puts ""
+ STDERR.puts "Dir #{dir}:"
+ STDERR.puts Dir["#{dir}/**/*"]
+ end
+ end
+ assert file_does_exist, "The file \"#{file}\" does not exist.\n"
end
Then /^the "(.*)" file should not exist$/ do |file|
@@ -199,3 +228,7 @@ end
Then /^I should see "(.*)" in the build output$/ do |text|
assert_match Regexp.new(text), jekyll_run_output
end
+
+Then /^I should get a non-zero exit(?:\-| )status$/ do
+ assert jekyll_run_status > 0
+end
diff --git a/features/support/env.rb b/features/support/env.rb
index 2f5f5e5..76a3e70 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -1,27 +1,78 @@
require 'fileutils'
-require 'rr'
-require 'test/unit'
+require 'posix-spawn'
+require 'minitest/spec'
require 'time'
+class MinitestWorld
+ extend Minitest::Assertions
+ attr_accessor :assertions
+
+ def initialize
+ self.assertions = 0
+ end
+end
+
JEKYLL_SOURCE_DIR = File.dirname(File.dirname(File.dirname(__FILE__)))
TEST_DIR = File.expand_path(File.join('..', '..', 'tmp', 'jekyll'), File.dirname(__FILE__))
-JEKYLL_PATH = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'jekyll')
+JEKYLL_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'jekyll'))
JEKYLL_COMMAND_OUTPUT_FILE = File.join(File.dirname(TEST_DIR), 'jekyll_output.txt')
+JEKYLL_COMMAND_STATUS_FILE = File.join(File.dirname(TEST_DIR), 'jekyll_status.txt')
def source_dir(*files)
File.join(TEST_DIR, *files)
end
+def all_steps_to_path(path)
+ source = Pathname.new(source_dir('_site')).expand_path
+ dest = Pathname.new(path).expand_path
+ paths = []
+ dest.ascend do |f|
+ break if f.eql? source
+ paths.unshift f.to_s
+ end
+ paths
+end
+
def jekyll_output_file
JEKYLL_COMMAND_OUTPUT_FILE
end
+def jekyll_status_file
+ JEKYLL_COMMAND_STATUS_FILE
+end
+
def jekyll_run_output
- File.read(jekyll_output_file)
+ File.read(jekyll_output_file) if File.file?(jekyll_output_file)
+end
+
+def jekyll_run_status
+ (File.read(jekyll_status_file) rescue 0).to_i
+end
+
+def run_bundle(args)
+ run_in_shell('bundle', *args.strip.split(' '))
end
def run_jekyll(args)
- system "#{JEKYLL_PATH} #{args} --trace > #{jekyll_output_file} 2>&1"
+ child = run_in_shell(JEKYLL_PATH, *args.strip.split(' '), "--trace")
+ child.status.exitstatus == 0
+end
+
+# -----------------------------------------------------------------------------
+# XXX: POSIX::Spawn::Child does not write output when the exit status is > 0
+# for example when doing [:out, :err] => [file, "w"] it will skip
+# writing the file entirely, we sould switch to Open.
+# -----------------------------------------------------------------------------
+
+def run_in_shell(*args)
+ spawned = POSIX::Spawn::Child.new(*args)
+ status = spawned.status.exitstatus
+ File.write(JEKYLL_COMMAND_STATUS_FILE, status)
+ File.open(JEKYLL_COMMAND_OUTPUT_FILE, "w+") do |file|
+ status == 0 ? file.write(spawned.out) : file.write(spawned.err)
+ end
+
+ spawned
end
def slug(title)
diff --git a/features/support/overview.rb b/features/support/overview.rb
new file mode 100644
index 0000000..8d414be
--- /dev/null
+++ b/features/support/overview.rb
@@ -0,0 +1,147 @@
+require 'fileutils'
+require 'colorator'
+require 'cucumber/formatter/console'
+require 'cucumber/formatter/io'
+require 'gherkin/formatter/escaping'
+
+module Features
+ module Support
+ # The formatter used for <tt>--format pretty</tt> (the default formatter).
+ #
+ # This formatter prints features to plain text - exactly how they were parsed,
+ # just prettier. That means with proper indentation and alignment of table columns.
+ #
+ # If the output is STDOUT (and not a file), there are bright colours to watch too.
+ #
+ class Overview
+ include FileUtils
+ include Cucumber::Formatter::Console
+ include Cucumber::Formatter::Io
+ include Gherkin::Formatter::Escaping
+ attr_writer :indent
+ attr_reader :runtime
+
+ def initialize(runtime, path_or_io, options)
+ @runtime, @io, @options = runtime, ensure_io(path_or_io, "pretty"), options
+ @exceptions = []
+ @indent = 0
+ @prefixes = options[:prefixes] || {}
+ @delayed_messages = []
+ end
+
+ def before_features(features)
+ print_profile_information
+ end
+
+ def after_features(features)
+ @io.puts
+ print_summary(features)
+ end
+
+ def before_feature(feature)
+ @exceptions = []
+ @indent = 0
+ end
+
+ def comment_line(comment_line)
+ end
+
+ def after_tags(tags)
+ end
+
+ def tag_name(tag_name)
+ end
+
+ def before_feature_element(feature_element)
+ @indent = 2
+ @scenario_indent = 2
+ end
+
+ def after_feature_element(feature_element)
+ end
+
+ def before_background(background)
+ @indent = 2
+ @scenario_indent = 2
+ @in_background = true
+ end
+
+ def after_background(background)
+ @in_background = nil
+ end
+
+ def background_name(keyword, name, file_colon_line, source_indent)
+ print_feature_element_name(keyword, name, file_colon_line, source_indent)
+ end
+
+ def scenario_name(keyword, name, file_colon_line, source_indent)
+ print_feature_element_name(keyword, name, file_colon_line, source_indent)
+ end
+
+ def before_step(step)
+ @current_step = step
+ end
+
+ def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
+ @hide_this_step = false
+ if exception
+ if @exceptions.include?(exception)
+ @hide_this_step = true
+ return
+ end
+ @exceptions << exception
+ end
+ if status != :failed && @in_background ^ background
+ @hide_this_step = true
+ return
+ end
+ @status = status
+ end
+
+ CHARS = {
+ :failed => "x".red,
+ :pending => "?".yellow,
+ :undefined => "x".red,
+ :passed => ".".green,
+ :skipped => "-".blue
+ }
+
+ def step_name(keyword, step_match, status, source_indent, background, file_colon_line)
+ @io.print CHARS[status]
+ end
+
+ def exception(exception, status)
+ return if @hide_this_step
+ @io.puts
+ print_exception(exception, status, @indent)
+ @io.flush
+ end
+
+ private
+
+ def print_feature_element_name(keyword, name, file_colon_line, source_indent)
+ @io.puts
+ names = name.empty? ? [name] : name.split("\n")
+ line = " #{keyword}: #{names[0]}"
+ if @options[:source]
+ line_comment = "#{file_colon_line}"
+ @io.print(line_comment)
+ end
+ @io.print(line)
+ @io.print " "
+ @io.flush
+ end
+
+ def cell_prefix(status)
+ @prefixes[status]
+ end
+
+ def print_summary(features)
+ @io.puts
+ print_stats(features, @options)
+ print_snippets(@options)
+ print_passing_wip(@options)
+ end
+ end
+ end
+end
diff --git a/jekyll.gemspec b/jekyll.gemspec
index 4a43cf1..470781c 100644
--- a/jekyll.gemspec
+++ b/jekyll.gemspec
@@ -5,62 +5,35 @@ require 'jekyll/version'
Gem::Specification.new do |s|
s.specification_version = 2 if s.respond_to? :specification_version=
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+ s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
s.rubygems_version = '2.2.2'
- s.required_ruby_version = '>= 1.9.3'
+ s.required_ruby_version = '>= 2.0.0'
- s.name = 'jekyll'
- s.version = Jekyll::VERSION
- s.license = 'MIT'
+ s.name = 'jekyll'
+ s.version = Jekyll::VERSION
+ s.license = 'MIT'
- s.summary = "A simple, blog aware, static site generator."
- s.description = "Jekyll is a simple, blog aware, static site generator."
+ s.summary = 'A simple, blog aware, static site generator.'
+ s.description = 'Jekyll is a simple, blog aware, static site generator.'
- s.authors = ["Tom Preston-Werner"]
- s.email = 'tom at mojombo.com'
- s.homepage = 'https://github.com/jekyll/jekyll'
+ s.authors = ['Tom Preston-Werner']
+ s.email = 'tom at mojombo.com'
+ s.homepage = 'https://github.com/jekyll/jekyll'
- s.files = `git ls-files`.split($/)
- s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
- s.require_paths = ["lib"]
+ all_files = `git ls-files -z`.split("\x0")
+ s.files = all_files.grep(%r{^(bin|lib)/})
+ s.executables = all_files.grep(%r{^bin/}) { |f| File.basename(f) }
+ s.require_paths = ['lib']
- s.rdoc_options = ["--charset=UTF-8"]
+ s.rdoc_options = ['--charset=UTF-8']
s.extra_rdoc_files = %w[README.markdown LICENSE]
- s.add_runtime_dependency('liquid', "~> 2.6.1")
- s.add_runtime_dependency('kramdown', "~> 1.3")
- s.add_runtime_dependency('mercenary', "~> 0.3.3")
- s.add_runtime_dependency('safe_yaml', "~> 1.0")
- s.add_runtime_dependency('colorator', "~> 0.1")
-
- # Before 3.0 drops, phase the following gems out as dev dependencies
- # and gracefully handle their absence.
- s.add_runtime_dependency('classifier', "~> 1.3")
- s.add_runtime_dependency('pygments.rb', "~> 0.6.0")
- s.add_runtime_dependency('redcarpet', "~> 3.1")
- s.add_runtime_dependency('toml', '~> 0.1.0')
- s.add_runtime_dependency('jekyll-paginate', '~> 1.0')
- s.add_runtime_dependency('jekyll-gist', '~> 1.0')
- s.add_runtime_dependency('jekyll-coffeescript', '~> 1.0')
+ s.add_runtime_dependency('liquid', '~> 3.0')
+ s.add_runtime_dependency('kramdown', '~> 1.3')
+ s.add_runtime_dependency('mercenary', '~> 0.3.3')
+ s.add_runtime_dependency('safe_yaml', '~> 1.0')
+ s.add_runtime_dependency('colorator', '~> 0.1')
+ s.add_runtime_dependency('rouge', '~> 1.7')
s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0')
- s.add_runtime_dependency('jekyll-watch', '~> 1.0')
-
- s.add_development_dependency('rake', "~> 10.1")
- s.add_development_dependency('rdoc', "~> 3.11")
- s.add_development_dependency('redgreen', "~> 1.2")
- s.add_development_dependency('shoulda', "~> 3.5")
- s.add_development_dependency('rr', "~> 1.1")
- s.add_development_dependency('cucumber', "1.3.11")
- s.add_development_dependency('RedCloth', "~> 4.2")
- s.add_development_dependency('maruku', "~> 0.7.0")
- s.add_development_dependency('rdiscount', "~> 1.6")
- s.add_development_dependency('launchy', "~> 2.3")
- s.add_development_dependency('simplecov', "~> 0.7")
- s.add_development_dependency('simplecov-gem-adapter', "~> 1.0.1")
- s.add_development_dependency('mime-types', "~> 1.5")
- s.add_development_dependency('activesupport', '~> 3.2.13')
- s.add_development_dependency('jekyll_test_plugin')
- s.add_development_dependency('jekyll_test_plugin_malicious')
- s.add_development_dependency('rouge', '~> 1.3')
+ s.add_runtime_dependency('jekyll-watch', '~> 1.1')
end
diff --git a/lib/jekyll.rb b/lib/jekyll.rb
index ba892e1..3e8e639 100644
--- a/lib/jekyll.rb
+++ b/lib/jekyll.rb
@@ -21,6 +21,7 @@ require 'time'
require 'English'
require 'pathname'
require 'logger'
+require 'set'
# 3rd party
require 'safe_yaml/load'
@@ -43,17 +44,26 @@ module Jekyll
autoload :EntryFilter, 'jekyll/entry_filter'
autoload :Errors, 'jekyll/errors'
autoload :Excerpt, 'jekyll/excerpt'
+ autoload :External, 'jekyll/external'
autoload :Filters, 'jekyll/filters'
autoload :FrontmatterDefaults, 'jekyll/frontmatter_defaults'
+ autoload :Hooks, 'jekyll/hooks'
autoload :Layout, 'jekyll/layout'
- autoload :LayoutReader, 'jekyll/layout_reader'
+ autoload :CollectionReader, 'jekyll/readers/collection_reader'
+ autoload :DataReader, 'jekyll/readers/data_reader'
+ autoload :LayoutReader, 'jekyll/readers/layout_reader'
+ autoload :PostReader, 'jekyll/readers/post_reader'
+ autoload :PageReader, 'jekyll/readers/page_reader'
+ autoload :StaticFileReader, 'jekyll/readers/static_file_reader'
autoload :LogAdapter, 'jekyll/log_adapter'
autoload :Page, 'jekyll/page'
autoload :PluginManager, 'jekyll/plugin_manager'
- autoload :Post, 'jekyll/post'
autoload :Publisher, 'jekyll/publisher'
+ autoload :Reader, 'jekyll/reader'
+ autoload :Regenerator, 'jekyll/regenerator'
autoload :RelatedPosts, 'jekyll/related_posts'
autoload :Renderer, 'jekyll/renderer'
+ autoload :LiquidRenderer, 'jekyll/liquid_renderer'
autoload :Site, 'jekyll/site'
autoload :StaticFile, 'jekyll/static_file'
autoload :Stevenson, 'jekyll/stevenson'
@@ -68,66 +78,94 @@ module Jekyll
require 'jekyll/command'
require 'jekyll/liquid_extensions'
- # Public: Tells you which Jekyll environment you are building in so you can skip tasks
- # if you need to. This is useful when doing expensive compression tasks on css and
- # images and allows you to skip that when working in development.
+ class << self
+ # Public: Tells you which Jekyll environment you are building in so you can skip tasks
+ # if you need to. This is useful when doing expensive compression tasks on css and
+ # images and allows you to skip that when working in development.
- def self.env
- ENV["JEKYLL_ENV"] || "development"
- end
+ def env
+ ENV["JEKYLL_ENV"] || "development"
+ end
- # Public: Generate a Jekyll configuration Hash by merging the default
- # options with anything in _config.yml, and adding the given options on top.
- #
- # override - A Hash of config directives that override any options in both
- # the defaults and the config file. See Jekyll::Configuration::DEFAULTS for a
- # list of option names and their defaults.
- #
- # Returns the final configuration Hash.
- def self.configuration(override)
- config = Configuration[Configuration::DEFAULTS]
- override = Configuration[override].stringify_keys
- config = config.read_config_files(config.config_files(override))
-
- # Merge DEFAULTS < _config.yml < override
- config = Utils.deep_merge_hashes(config, override).stringify_keys
- set_timezone(config['timezone']) if config['timezone']
-
- config
- end
+ # Public: Generate a Jekyll configuration Hash by merging the default
+ # options with anything in _config.yml, and adding the given options on top.
+ #
+ # override - A Hash of config directives that override any options in both
+ # the defaults and the config file. See Jekyll::Configuration::DEFAULTS for a
+ # list of option names and their defaults.
+ #
+ # Returns the final configuration Hash.
+ def configuration(override = Hash.new)
+ config = Configuration[Configuration::DEFAULTS]
+ override = Configuration[override].stringify_keys
+ unless override.delete('skip_config_files')
+ config = config.read_config_files(config.config_files(override))
+ end
+
+ # Merge DEFAULTS < _config.yml < override
+ config = Utils.deep_merge_hashes(config, override).stringify_keys
+ set_timezone(config['timezone']) if config['timezone']
+
+ config
+ end
- # Static: Set the TZ environment variable to use the timezone specified
- #
- # timezone - the IANA Time Zone
- #
- # Returns nothing
- def self.set_timezone(timezone)
- ENV['TZ'] = timezone
- end
+ # Public: Set the TZ environment variable to use the timezone specified
+ #
+ # timezone - the IANA Time Zone
+ #
+ # Returns nothing
+ def set_timezone(timezone)
+ ENV['TZ'] = timezone
+ end
- def self.logger
- @logger ||= LogAdapter.new(Stevenson.new)
- end
+ # Public: Fetch the logger instance for this Jekyll process.
+ #
+ # Returns the LogAdapter instance.
+ def logger
+ @logger ||= LogAdapter.new(Stevenson.new, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym)
+ end
- def self.logger=(writer)
- @logger = LogAdapter.new(writer)
- end
+ # Public: Set the log writer.
+ # New log writer must respond to the same methods
+ # as Ruby's interal Logger.
+ #
+ # writer - the new Logger-compatible log transport
+ #
+ # Returns the new logger.
+ def logger=(writer)
+ @logger = LogAdapter.new(writer, (ENV["JEKYLL_LOG_LEVEL"] || :info).to_sym)
+ end
- # Public: File system root
- #
- # Returns the root of the filesystem as a Pathname
- def self.fs_root
- @fs_root ||= "/"
- end
+ # Public: An array of sites
+ #
+ # Returns the Jekyll sites created.
+ def sites
+ @sites ||= []
+ end
- def self.sanitized_path(base_directory, questionable_path)
- clean_path = File.expand_path(questionable_path, fs_root)
- clean_path.gsub!(/\A\w\:\//, '/')
- unless clean_path.start_with?(base_directory)
- File.join(base_directory, clean_path)
- else
- clean_path
+ # Public: Ensures the questionable path is prefixed with the base directory
+ # and prepends the questionable path with the base directory if false.
+ #
+ # base_directory - the directory with which to prefix the questionable path
+ # questionable_path - the path we're unsure about, and want prefixed
+ #
+ # Returns the sanitized path.
+ def sanitized_path(base_directory, questionable_path)
+ return base_directory if base_directory.eql?(questionable_path)
+
+ clean_path = File.expand_path(questionable_path, "/")
+ clean_path = clean_path.sub(/\A\w\:\//, '/')
+
+ unless clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/'))
+ File.join(base_directory, clean_path)
+ else
+ clean_path
+ end
end
+
+ # Conditional optimizations
+ Jekyll::External.require_if_present('liquid-c')
+
end
end
@@ -137,12 +175,4 @@ require_all 'jekyll/converters/markdown'
require_all 'jekyll/generators'
require_all 'jekyll/tags'
-# Eventually remove these for 3.0 as non-core
-Jekyll::Deprecator.gracefully_require(%w[
- classifier
- toml
- jekyll-paginate
- jekyll-gist
- jekyll-coffeescript
- jekyll-sass-converter
-])
+require 'jekyll-sass-converter'
diff --git a/lib/jekyll/cleaner.rb b/lib/jekyll/cleaner.rb
index 0aa3cdf..d23da78 100644
--- a/lib/jekyll/cleaner.rb
+++ b/lib/jekyll/cleaner.rb
@@ -1,95 +1,105 @@
require 'set'
module Jekyll
- class Site
- # Handles the cleanup of a site's destination before it is built.
- class Cleaner
- attr_reader :site
+ # Handles the cleanup of a site's destination before it is built.
+ class Cleaner
+ HIDDEN_FILE_REGEX = /\/\.{1,2}$/
+ attr_reader :site
- def initialize(site)
- @site = site
- end
+ def initialize(site)
+ @site = site
+ end
- # Cleans up the site's destination directory
- def cleanup!
- FileUtils.rm_rf(obsolete_files)
- end
+ # Cleans up the site's destination directory
+ def cleanup!
+ FileUtils.rm_rf(obsolete_files)
+ FileUtils.rm_rf(metadata_file) if !@site.incremental?
+ end
- private
+ private
- # Private: The list of files and directories to be deleted during cleanup process
- #
- # Returns an Array of the file and directory paths
- def obsolete_files
- (existing_files - new_files - new_dirs + replaced_files).to_a
- end
+ # Private: The list of files and directories to be deleted during cleanup process
+ #
+ # Returns an Array of the file and directory paths
+ def obsolete_files
+ (existing_files - new_files - new_dirs + replaced_files).to_a
+ end
- # Private: The list of existing files, apart from those included in keep_files and hidden files.
- #
- # Returns a Set with the file paths
- def existing_files
- files = Set.new
- Dir.glob(File.join(site.dest, "**", "*"), File::FNM_DOTMATCH) do |file|
- files << file unless file =~ /\/\.{1,2}$/ || file =~ keep_file_regex || keep_dirs.include?(file)
- end
- files
- end
+ # Private: The metadata file storing dependency tree and build history
+ #
+ # Returns an Array with the metdata file as the only item
+ def metadata_file
+ [site.regenerator.metadata_file]
+ end
- # Private: The list of files to be created when site is built.
- #
- # Returns a Set with the file paths
- def new_files
- files = Set.new
- site.each_site_file { |item| files << item.destination(site.dest) }
- files
- end
+ # Private: The list of existing files, apart from those included in keep_files and hidden files.
+ #
+ # Returns a Set with the file paths
+ def existing_files
+ files = Set.new
+ regex = keep_file_regex
+ dirs = keep_dirs
- # Private: The list of directories to be created when site is built.
- # These are the parent directories of the files in #new_files.
- #
- # Returns a Set with the directory paths
- def new_dirs
- new_files.map { |file| parent_dirs(file) }.flatten.to_set
+ Dir.glob(site.in_dest_dir("**", "*"), File::FNM_DOTMATCH) do |file|
+ next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file)
+ files << file
end
- # Private: The list of parent directories of a given file
- #
- # Returns an Array with the directory paths
- def parent_dirs(file)
- parent_dir = File.dirname(file)
- if parent_dir == site.dest
- []
- else
- [parent_dir] + parent_dirs(parent_dir)
- end
- end
+ files
+ end
- # Private: The list of existing files that will be replaced by a directory during build
- #
- # Returns a Set with the file paths
- def replaced_files
- new_dirs.select { |dir| File.file?(dir) }.to_set
- end
+ # Private: The list of files to be created when site is built.
+ #
+ # Returns a Set with the file paths
+ def new_files
+ files = Set.new
+ site.each_site_file { |item| files << item.destination(site.dest) }
+ files
+ end
- # Private: The list of directories that need to be kept because they are parent directories
- # of files specified in keep_files
- #
- # Returns a Set with the directory paths
- def keep_dirs
- site.keep_files.map{|file| parent_dirs(File.join(site.dest, file))}.flatten.to_set
- end
+ # Private: The list of directories to be created when site is built.
+ # These are the parent directories of the files in #new_files.
+ #
+ # Returns a Set with the directory paths
+ def new_dirs
+ new_files.map { |file| parent_dirs(file) }.flatten.to_set
+ end
- # Private: Creates a regular expression from the config's keep_files array
- #
- # Examples
- # ['.git','.svn'] creates the following regex: /\/(\.git|\/.svn)/
- #
- # Returns the regular expression
- def keep_file_regex
- or_list = site.keep_files.join("|")
- pattern = "\/(#{or_list.gsub(".", "\.")})"
- Regexp.new pattern
+ # Private: The list of parent directories of a given file
+ #
+ # Returns an Array with the directory paths
+ def parent_dirs(file)
+ parent_dir = File.dirname(file)
+ if parent_dir == site.dest
+ []
+ else
+ [parent_dir] + parent_dirs(parent_dir)
end
end
+
+ # Private: The list of existing files that will be replaced by a directory during build
+ #
+ # Returns a Set with the file paths
+ def replaced_files
+ new_dirs.select { |dir| File.file?(dir) }.to_set
+ end
+
+ # Private: The list of directories that need to be kept because they are parent directories
+ # of files specified in keep_files
+ #
+ # Returns a Set with the directory paths
+ def keep_dirs
+ site.keep_files.map { |file| parent_dirs(site.in_dest_dir(file)) }.flatten.to_set
+ end
+
+ # Private: Creates a regular expression from the config's keep_files array
+ #
+ # Examples
+ # ['.git','.svn'] creates the following regex: /\/(\.git|\/.svn)/
+ #
+ # Returns the regular expression
+ def keep_file_regex
+ Regexp.union(site.keep_files)
+ end
end
end
diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb
index 8db6c54..4363aee 100644
--- a/lib/jekyll/collection.rb
+++ b/lib/jekyll/collection.rb
@@ -1,6 +1,7 @@
module Jekyll
class Collection
attr_reader :site, :label, :metadata
+ attr_writer :docs
# Create a new Collection.
#
@@ -22,14 +23,46 @@ module Jekyll
@docs ||= []
end
+ # Override of normal respond_to? to match method_missing's logic for
+ # looking in @data.
+ def respond_to?(method, include_private = false)
+ docs.respond_to?(method.to_sym, include_private) || super
+ end
+
+ # Override of method_missing to check in @data for the key.
+ def method_missing(method, *args, &blck)
+ if docs.respond_to?(method.to_sym)
+ Jekyll.logger.warn "Deprecation:", "Collection##{method} should be called on the #docs array directly."
+ Jekyll.logger.warn "", "Called by #{caller.first}."
+ docs.public_send(method.to_sym, *args, &blck)
+ else
+ super
+ end
+ end
+
+ # Fetch the static files in this collection.
+ # Defaults to an empty array if no static files have been read in.
+ #
+ # Returns an array of Jekyll::StaticFile objects.
+ def files
+ @files ||= []
+ end
+
# Read the allowed documents into the collection's array of docs.
#
# Returns the sorted array of docs.
def read
filtered_entries.each do |file_path|
- doc = Jekyll::Document.new(Jekyll.sanitized_path(directory, file_path), { site: site, collection: self })
- doc.read
- docs << doc
+ full_path = collection_dir(file_path)
+ next if File.directory?(full_path)
+ if Utils.has_yaml_header? full_path
+ doc = Jekyll::Document.new(full_path, { site: site, collection: self })
+ doc.read
+ docs << doc if site.publisher.publish?(doc) || !write?
+ else
+ relative_dir = Jekyll.sanitized_path(relative_directory, File.dirname(file_path)).chomp("/.")
+ files << StaticFile.new(site, site.source, relative_dir, File.basename(full_path), self)
+ end
end
docs.sort!
end
@@ -40,9 +73,10 @@ module Jekyll
# relative to the collection's directory
def entries
return Array.new unless exists?
- Dir.glob(File.join(directory, "**", "*.*")).map do |entry|
- entry[File.join(directory, "")] = ''; entry
- end
+ @entries ||=
+ Dir.glob(collection_dir("**", "*.*")).map do |entry|
+ entry["#{collection_dir}/"] = ''; entry
+ end
end
# Filtered version of the entries in this collection.
@@ -51,9 +85,13 @@ module Jekyll
# Returns a list of filtered entry paths.
def filtered_entries
return Array.new unless exists?
- Dir.chdir(directory) do
- entry_filter.filter(entries).reject { |f| File.directory?(f) }
- end
+ @filtered_entries ||=
+ Dir.chdir(directory) do
+ entry_filter.filter(entries).reject do |f|
+ path = collection_dir(f)
+ File.directory?(path) || (File.symlink?(f) && site.safe)
+ end
+ end
end
# The directory for this Collection, relative to the site source.
@@ -61,15 +99,28 @@ module Jekyll
# Returns a String containing the directory name where the collection
# is stored on the filesystem.
def relative_directory
- "_#{label}"
+ @relative_directory ||= "_#{label}"
end
- # The full path to the directory containing the
+ # The full path to the directory containing the collection.
#
# Returns a String containing th directory name where the collection
# is stored on the filesystem.
def directory
- Jekyll.sanitized_path(site.source, relative_directory)
+ @directory ||= site.in_source_dir(relative_directory)
+ end
+
+ # The full path to the directory containing the collection, with
+ # optional subpaths.
+ #
+ # *files - (optional) any other path pieces relative to the
+ # directory to append to the path
+ #
+ # Returns a String containing th directory name where the collection
+ # is stored on the filesystem.
+ def collection_dir(*files)
+ return directory if files.empty?
+ site.in_source_dir(relative_directory, *files)
end
# Checks whether the directory "exists" for this collection.
@@ -118,6 +169,7 @@ module Jekyll
metadata.merge({
"label" => label,
"docs" => docs,
+ "files" => files,
"directory" => directory,
"output" => write?,
"relative_directory" => relative_directory
@@ -129,14 +181,16 @@ module Jekyll
#
# Returns true if the 'write' metadata is true, false otherwise.
def write?
- !!metadata['output']
+ !!metadata.fetch('output', false)
end
# The URL template to render collection's documents at.
#
# Returns the URL template to render collection's documents at.
def url_template
- metadata.fetch('permalink', "/:collection/:path:output_ext")
+ metadata.fetch('permalink') do
+ Utils.add_permalink_suffix("/:collection/:path", site.permalink_style)
+ end
end
# Extract options for this collection from the site configuration.
@@ -149,6 +203,5 @@ module Jekyll
{}
end
end
-
end
end
diff --git a/lib/jekyll/command.rb b/lib/jekyll/command.rb
index d11631d..f3c89df 100644
--- a/lib/jekyll/command.rb
+++ b/lib/jekyll/command.rb
@@ -19,31 +19,6 @@ module Jekyll
super(base)
end
- # Paths to ignore for the watch option
- #
- # options - A Hash of options passed to the command
- #
- # Returns a list of relative paths from source that should be ignored
- def ignore_paths(options)
- source = options['source']
- destination = options['destination']
- config_files = Configuration[options].config_files(options)
- paths = config_files + Array(destination)
- ignored = []
-
- source_abs = Pathname.new(source).expand_path
- paths.each do |p|
- path_abs = Pathname.new(p).expand_path
- begin
- rel_path = path_abs.relative_path_from(source_abs).to_s
- ignored << Regexp.new(Regexp.escape(rel_path)) unless rel_path.start_with?('../')
- rescue ArgumentError
- # Could not find a relative path
- end
- end
- ignored
- end
-
# Run Site#process and catch errors
#
# site - the Jekyll::Site object
@@ -74,15 +49,18 @@ module Jekyll
# Returns nothing
def add_build_options(c)
c.option 'config', '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
+ c.option 'destination', '-d', '--destination DESTINATION', 'The current folder will be generated into DESTINATION'
+ c.option 'source', '-s', '--source SOURCE', 'Custom source directory'
c.option 'future', '--future', 'Publishes posts with a future date'
c.option 'limit_posts', '--limit_posts MAX_POSTS', Integer, 'Limits the number of posts to parse and publish'
- c.option 'watch', '-w', '--watch', 'Watch for changes and rebuild'
+ c.option 'watch', '-w', '--[no-]watch', 'Watch for changes and rebuild'
c.option 'force_polling', '--force_polling', 'Force watch to use polling'
c.option 'lsi', '--lsi', 'Use LSI for improved related posts'
c.option 'show_drafts', '-D', '--drafts', 'Render posts in the _drafts folder'
c.option 'unpublished', '--unpublished', 'Render posts that were marked as unpublished'
c.option 'quiet', '-q', '--quiet', 'Silence output.'
c.option 'verbose', '-V', '--verbose', 'Print verbose output.'
+ c.option 'incremental', '-I', '--incremental', 'Enable incremental rebuild.'
end
end
diff --git a/lib/jekyll/commands/build.rb b/lib/jekyll/commands/build.rb
index 140a7ae..de0cc8b 100644
--- a/lib/jekyll/commands/build.rb
+++ b/lib/jekyll/commands/build.rb
@@ -9,6 +9,7 @@ module Jekyll
prog.command(:build) do |c|
c.syntax 'build [options]'
c.description 'Build your site'
+ c.alias :b
add_build_options(c)
@@ -22,7 +23,8 @@ module Jekyll
# Build your jekyll site
# Continuously watch if `watch` is set to true in the config.
def process(options)
- Jekyll.logger.log_level = :error if options['quiet']
+ # Adjust verbosity quickly
+ Jekyll.logger.adjust_verbosity(options)
options = configuration_from_options(options)
site = Jekyll::Site.new(options)
@@ -32,7 +34,12 @@ module Jekyll
else
build(site, options)
end
- watch(site, options) if options['watch']
+
+ if options.fetch('watch', false)
+ watch(site, options)
+ else
+ Jekyll.logger.info "Auto-regeneration:", "disabled. Use --watch to enable."
+ end
end
# Build your Jekyll site.
@@ -42,13 +49,16 @@ module Jekyll
#
# Returns nothing.
def build(site, options)
+ t = Time.now
source = options['source']
destination = options['destination']
+ incremental = options['incremental']
Jekyll.logger.info "Source:", source
Jekyll.logger.info "Destination:", destination
+ Jekyll.logger.info "Incremental build:", (incremental ? "enabled" : "disabled. Enable with --incremental")
Jekyll.logger.info "Generating..."
process_site(site)
- Jekyll.logger.info "", "done."
+ Jekyll.logger.info "", "done in #{(Time.now - t).round(3)} seconds."
end
# Private: Watch for file changes and rebuild the site.
@@ -58,8 +68,8 @@ module Jekyll
#
# Returns nothing.
def watch(site, options)
- Deprecator.gracefully_require 'jekyll-watch'
- Jekyll::Commands::Watch.watch(site, options)
+ External.require_with_graceful_fail 'jekyll-watch'
+ Jekyll::Watcher.watch(options)
end
end # end of class << self
diff --git a/lib/jekyll/commands/clean.rb b/lib/jekyll/commands/clean.rb
new file mode 100644
index 0000000..bf05dbe
--- /dev/null
+++ b/lib/jekyll/commands/clean.rb
@@ -0,0 +1,44 @@
+module Jekyll
+ module Commands
+ class Clean < Command
+ class << self
+
+ def init_with_program(prog)
+ prog.command(:clean) do |c|
+ c.syntax 'clean [subcommand]'
+ c.description 'Clean the site (removes site output and metadata file) without building.'
+
+ add_build_options(c)
+
+ c.action do |args, _|
+ Jekyll::Commands::Clean.process({})
+ end
+ end
+ end
+
+ def process(options)
+ options = configuration_from_options(options)
+ destination = options['destination']
+ metadata_file = File.join(options['source'], '.jekyll-metadata')
+
+ if File.directory? destination
+ Jekyll.logger.info "Cleaning #{destination}..."
+ FileUtils.rm_rf(destination)
+ Jekyll.logger.info "", "done."
+ else
+ Jekyll.logger.info "Nothing to do for #{destination}."
+ end
+
+ if File.file? metadata_file
+ Jekyll.logger.info "Removing #{metadata_file}..."
+ FileUtils.rm_rf(metadata_file)
+ Jekyll.logger.info "", "done."
+ else
+ Jekyll.logger.info "Nothing to do for #{metadata_file}."
+ end
+ end
+
+ end
+ end
+ end
+end
diff --git a/lib/jekyll/commands/docs.rb b/lib/jekyll/commands/docs.rb
deleted file mode 100644
index 71c1016..0000000
--- a/lib/jekyll/commands/docs.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-module Jekyll
- module Commands
- class Docs < Command
-
- class << self
-
- def init_with_program(prog)
- prog.command(:docs) do |c|
- c.syntax 'docs'
- c.description "Launch local server with docs for Jekyll v#{Jekyll::VERSION}"
-
- c.option 'port', '-P', '--port [PORT]', 'Port to listen on'
- c.option 'host', '-H', '--host [HOST]', 'Host to bind to'
-
- c.action do |args, options|
- options.merge!({
- 'source' => File.expand_path("../../../site", File.dirname(__FILE__)),
- 'destination' => File.expand_path("../../../site/_site", File.dirname(__FILE__))
- })
- Jekyll::Commands::Build.process(options)
- Jekyll::Commands::Serve.process(options)
- end
- end
- end
-
- end
-
- end
- end
-end
diff --git a/lib/jekyll/commands/doctor.rb b/lib/jekyll/commands/doctor.rb
index 0fab8b3..6d7429e 100644
--- a/lib/jekyll/commands/doctor.rb
+++ b/lib/jekyll/commands/doctor.rb
@@ -30,29 +30,26 @@ module Jekyll
def healthy?(site)
[
+ fsnotify_buggy?(site),
!deprecated_relative_permalinks(site),
!conflicting_urls(site)
].all?
end
def deprecated_relative_permalinks(site)
- contains_deprecated_pages = false
- site.pages.each do |page|
- if page.uses_relative_permalinks
- Jekyll.logger.warn "Deprecation:", "'#{page.path}' uses relative" +
- " permalinks which will be deprecated in" +
- " Jekyll v2.0.0 and beyond."
- contains_deprecated_pages = true
- end
+ if site.config['relative_permalinks']
+ Jekyll::Deprecator.deprecation_message "Your site still uses relative" +
+ " permalinks, which was removed in" +
+ " Jekyll v3.0.0."
+ return true
end
- contains_deprecated_pages
end
def conflicting_urls(site)
conflicting_urls = false
urls = {}
urls = collect_urls(urls, site.pages, site.dest)
- urls = collect_urls(urls, site.posts, site.dest)
+ urls = collect_urls(urls, site.posts.docs, site.dest)
urls.each do |url, paths|
if paths.size > 1
conflicting_urls = true
@@ -63,8 +60,23 @@ module Jekyll
conflicting_urls
end
- private
+ def fsnotify_buggy?(site)
+ return true if !Utils::Platforms.osx?
+ if Dir.pwd != `pwd`.strip
+ Jekyll.logger.error " " + <<-STR.strip.gsub(/\n\s+/, "\n ")
+ We have detected that there might be trouble using fsevent on your
+ operating system, you can read https://github.com/thibaudgg/rb-fsevent/wiki/no-fsevents-fired-(OSX-bug)
+ for possible work arounds or you can work around it immediately
+ with `--force-polling`.
+ STR
+
+ false
+ end
+ true
+ end
+
+ private
def collect_urls(urls, things, destination)
things.each do |thing|
dest = thing.destination(destination)
diff --git a/lib/jekyll/commands/help.rb b/lib/jekyll/commands/help.rb
new file mode 100644
index 0000000..421d87e
--- /dev/null
+++ b/lib/jekyll/commands/help.rb
@@ -0,0 +1,33 @@
+module Jekyll
+ module Commands
+ class Help < Command
+ class << self
+
+ def init_with_program(prog)
+ prog.command(:help) do |c|
+ c.syntax 'help [subcommand]'
+ c.description 'Show the help message, optionally for a given subcommand.'
+
+ c.action do |args, _|
+ cmd = (args.first || "").to_sym
+ if args.empty?
+ puts prog
+ elsif prog.has_command? cmd
+ puts prog.commands[cmd]
+ else
+ invalid_command(prog, cmd)
+ abort
+ end
+ end
+ end
+ end
+
+ def invalid_command(prog, cmd)
+ Jekyll.logger.error "Error:", "Hmm... we don't know what the '#{cmd}' command is."
+ Jekyll.logger.info "Valid commands:", prog.commands.keys.join(", ")
+ end
+
+ end
+ end
+ end
+end
diff --git a/lib/jekyll/commands/new.rb b/lib/jekyll/commands/new.rb
index ca5ed16..433d33b 100644
--- a/lib/jekyll/commands/new.rb
+++ b/lib/jekyll/commands/new.rb
@@ -3,77 +3,79 @@ require 'erb'
module Jekyll
module Commands
class New < Command
- def self.init_with_program(prog)
- prog.command(:new) do |c|
- c.syntax 'new PATH'
- c.description 'Creates a new Jekyll site scaffold in PATH'
-
- c.option 'force', '--force', 'Force creation even if PATH already exists'
- c.option 'blank', '--blank', 'Creates scaffolding but with empty files'
-
- c.action do |args, options|
- Jekyll::Commands::New.process(args, options)
+ class << self
+ def init_with_program(prog)
+ prog.command(:new) do |c|
+ c.syntax 'new PATH'
+ c.description 'Creates a new Jekyll site scaffold in PATH'
+
+ c.option 'force', '--force', 'Force creation even if PATH already exists'
+ c.option 'blank', '--blank', 'Creates scaffolding but with empty files'
+
+ c.action do |args, options|
+ Jekyll::Commands::New.process(args, options)
+ end
end
end
- end
- def self.process(args, options = {})
- raise ArgumentError.new('You must specify a path.') if args.empty?
+ def process(args, options = {})
+ raise ArgumentError.new('You must specify a path.') if args.empty?
- new_blog_path = File.expand_path(args.join(" "), Dir.pwd)
- FileUtils.mkdir_p new_blog_path
- if preserve_source_location?(new_blog_path, options)
- Jekyll.logger.abort_with "Conflict:", "#{new_blog_path} exists and is not empty."
- end
+ new_blog_path = File.expand_path(args.join(" "), Dir.pwd)
+ FileUtils.mkdir_p new_blog_path
+ if preserve_source_location?(new_blog_path, options)
+ Jekyll.logger.abort_with "Conflict:", "#{new_blog_path} exists and is not empty."
+ end
- if options["blank"]
- create_blank_site new_blog_path
- else
- create_sample_files new_blog_path
+ if options["blank"]
+ create_blank_site new_blog_path
+ else
+ create_sample_files new_blog_path
- File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f|
- f.write(scaffold_post_content)
+ File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f|
+ f.write(scaffold_post_content)
+ end
end
- end
- Jekyll.logger.info "New jekyll site installed in #{new_blog_path}."
- end
+ Jekyll.logger.info "New jekyll site installed in #{new_blog_path}."
+ end
- def self.create_blank_site(path)
- Dir.chdir(path) do
- FileUtils.mkdir(%w(_layouts _posts _drafts))
- FileUtils.touch("index.html")
+ def create_blank_site(path)
+ Dir.chdir(path) do
+ FileUtils.mkdir(%w(_layouts _posts _drafts))
+ FileUtils.touch("index.html")
+ end
end
- end
- def self.scaffold_post_content
- ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result
- end
+ def scaffold_post_content
+ ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result
+ end
- # Internal: Gets the filename of the sample post to be created
- #
- # Returns the filename of the sample post, as a String
- def self.initialized_post_name
- "_posts/#{Time.now.strftime('%Y-%m-%d')}-welcome-to-jekyll.markdown"
- end
+ # Internal: Gets the filename of the sample post to be created
+ #
+ # Returns the filename of the sample post, as a String
+ def initialized_post_name
+ "_posts/#{Time.now.strftime('%Y-%m-%d')}-welcome-to-jekyll.markdown"
+ end
- private
+ private
- def self.preserve_source_location?(path, options)
- !options["force"] && !Dir["#{path}/**/*"].empty?
- end
+ def preserve_source_location?(path, options)
+ !options["force"] && !Dir["#{path}/**/*"].empty?
+ end
- def self.create_sample_files(path)
- FileUtils.cp_r site_template + '/.', path
- FileUtils.rm File.expand_path(scaffold_path, path)
- end
+ def create_sample_files(path)
+ FileUtils.cp_r site_template + '/.', path
+ FileUtils.rm File.expand_path(scaffold_path, path)
+ end
- def self.site_template
- File.expand_path("../../site_template", File.dirname(__FILE__))
- end
+ def site_template
+ File.expand_path("../../site_template", File.dirname(__FILE__))
+ end
- def self.scaffold_path
- "_posts/0000-00-00-welcome-to-jekyll.markdown.erb"
+ def scaffold_path
+ "_posts/0000-00-00-welcome-to-jekyll.markdown.erb"
+ end
end
end
end
diff --git a/lib/jekyll/commands/serve.rb b/lib/jekyll/commands/serve.rb
index 2fbfd74..111d670 100644
--- a/lib/jekyll/commands/serve.rb
+++ b/lib/jekyll/commands/serve.rb
@@ -10,6 +10,7 @@ module Jekyll
c.syntax 'serve [options]'
c.description 'Serve your site locally'
c.alias :server
+ c.alias :s
add_build_options(c)
@@ -20,7 +21,8 @@ module Jekyll
c.option 'skip_initial_build', '--skip-initial-build', 'Skips the initial site build which occurs before the server is started.'
c.action do |args, options|
- options["serving"] ||= true
+ options["serving"] = true
+ options["watch"] = true unless options.key?("watch")
Jekyll::Commands::Build.process(options)
Jekyll::Commands::Serve.process(options)
end
@@ -38,7 +40,7 @@ module Jekyll
s.mount(
options['baseurl'],
- WEBrick::HTTPServlet::FileHandler,
+ custom_file_handler,
destination,
file_handler_options
)
@@ -48,7 +50,7 @@ module Jekyll
if options['detach'] # detach the server
pid = Process.fork { s.start }
Process.detach(pid)
- Jekyll.logger.info "Server detached with pid '#{pid}'.", "Run `kill -9 #{pid}' to stop the server."
+ Jekyll.logger.info "Server detached with pid '#{pid}'.", "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server."
else # create a new server thread, then join it with current terminal
t = Thread.new { s.start }
trap("INT") { s.shutdown }
@@ -74,16 +76,20 @@ module Jekyll
def webrick_options(config)
opts = {
- :DocumentRoot => config['destination'],
- :Port => config['port'],
:BindAddress => config['host'],
- :MimeTypes => mime_types,
+ :DirectoryIndex => %w(index.html index.htm index.cgi index.rhtml index.xml),
+ :DocumentRoot => config['destination'],
:DoNotReverseLookup => true,
- :StartCallback => start_callback(config['detach']),
- :DirectoryIndex => %w(index.html index.htm index.cgi index.rhtml index.xml)
+ :MimeTypes => mime_types,
+ :Port => config['port'],
+ :StartCallback => start_callback(config['detach'])
}
- if !config['verbose']
+ if config['verbose']
+ opts.merge!({
+ :Logger => WEBrick::Log.new($stdout, WEBrick::Log::DEBUG)
+ })
+ else
opts.merge!({
:AccessLog => [],
:Logger => WEBrick::Log.new([], WEBrick::Log::WARN)
@@ -93,6 +99,21 @@ module Jekyll
opts
end
+ # Custom WEBrick FileHandler servlet for serving "/file.html" at "/file"
+ # when no exact match is found. This mirrors the behavior of GitHub
+ # Pages and many static web server configs.
+ def custom_file_handler
+ Class.new WEBrick::HTTPServlet::FileHandler do
+ def search_file(req, res, basename)
+ if file = super
+ file
+ else
+ super(req, res, "#{basename}.html")
+ end
+ end
+ end
+ end
+
def start_callback(detached)
unless detached
Proc.new { Jekyll.logger.info "Server running...", "press ctrl-c to stop." }
@@ -117,9 +138,10 @@ module Jekyll
# recreate NondisclosureName under utf-8 circumstance
def file_handler_options
- fh_option = WEBrick::Config::FileHandler
- fh_option[:NondisclosureName] = ['.ht*','~*']
- fh_option
+ WEBrick::Config::FileHandler.merge({
+ :FancyIndexing => true,
+ :NondisclosureName => ['.ht*','~*']
+ })
end
end
diff --git a/lib/jekyll/configuration.rb b/lib/jekyll/configuration.rb
index 6f5cbc1..f57b3ae 100644
--- a/lib/jekyll/configuration.rb
+++ b/lib/jekyll/configuration.rb
@@ -5,57 +5,55 @@ module Jekyll
# Default options. Overridden by values in _config.yml.
# Strings rather than symbols are used for compatibility with YAML.
- DEFAULTS = {
+ DEFAULTS = Configuration[{
+ # Where things are
'source' => Dir.pwd,
'destination' => File.join(Dir.pwd, '_site'),
- 'plugins' => '_plugins',
- 'layouts' => '_layouts',
- 'data_source' => '_data',
- 'keep_files' => ['.git','.svn'],
- 'gems' => [],
- 'collections' => nil,
-
- 'timezone' => nil, # use the local timezone
-
- 'encoding' => 'utf-8', # always use utf-8 encoding. NEVER FORGET
+ 'plugins_dir' => '_plugins',
+ 'layouts_dir' => '_layouts',
+ 'data_dir' => '_data',
+ 'includes_dir' => '_includes',
+ 'collections' => {},
+ # Handling Reading
'safe' => false,
- 'detach' => false, # default to not detaching the server
+ 'include' => ['.htaccess'],
+ 'exclude' => [],
+ 'keep_files' => ['.git','.svn'],
+ 'encoding' => 'utf-8',
+ 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md',
+
+ # Filtering Content
'show_drafts' => nil,
'limit_posts' => 0,
- 'lsi' => false,
- 'future' => true, # remove and make true just default
+ 'future' => false,
'unpublished' => false,
- 'relative_permalinks' => false,
+ # Plugins
+ 'whitelist' => [],
+ 'gems' => [],
+ # Conversion
'markdown' => 'kramdown',
- 'highlighter' => 'pygments',
- 'permalink' => 'date',
- 'baseurl' => '',
- 'include' => ['.htaccess'],
- 'exclude' => [],
- 'paginate_path' => '/page:num',
-
- 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md',
- 'textile_ext' => 'textile',
+ 'highlighter' => 'rouge',
+ 'lsi' => false,
+ 'excerpt_separator' => "\n\n",
+ 'incremental' => false,
- 'quiet' => false,
+ # Serving
+ 'detach' => false, # default to not detaching the server
'port' => '4000',
- 'host' => '0.0.0.0',
-
- 'excerpt_separator' => "\n\n",
+ 'host' => '127.0.0.1',
+ 'baseurl' => '',
- 'defaults' => [],
+ # Output Configuration
+ 'permalink' => 'date',
+ 'paginate_path' => '/page:num',
+ 'timezone' => nil, # use the local timezone
- 'maruku' => {
- 'use_tex' => false,
- 'use_divs' => false,
- 'png_engine' => 'blahtex',
- 'png_dir' => 'images/latex',
- 'png_url' => '/images/latex',
- 'fenced_code_blocks' => true
- },
+ 'quiet' => false,
+ 'verbose' => false,
+ 'defaults' => [],
'rdiscount' => {
'extensions' => []
@@ -66,12 +64,12 @@ module Jekyll
},
'kramdown' => {
- 'auto_ids' => true,
- 'footnote_nr' => 1,
- 'entity_output' => 'as_char',
- 'toc_levels' => '1..6',
- 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo',
- 'use_coderay' => false,
+ 'auto_ids' => true,
+ 'footnote_nr' => 1,
+ 'entity_output' => 'as_char',
+ 'toc_levels' => '1..6',
+ 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo',
+ 'enable_coderay' => false,
'coderay' => {
'coderay_wrap' => 'div',
@@ -81,12 +79,8 @@ module Jekyll
'coderay_bold_every' => 10,
'coderay_css' => 'style'
}
- },
-
- 'redcloth' => {
- 'hard_breaks' => true
}
- }
+ }]
# Public: Turn all keys into string
#
@@ -95,24 +89,35 @@ module Jekyll
reduce({}) { |hsh,(k,v)| hsh.merge(k.to_s => v) }
end
+ def get_config_value_with_override(config_key, override)
+ override[config_key] || self[config_key] || DEFAULTS[config_key]
+ end
+
# Public: Directory of the Jekyll source folder
#
# override - the command-line options hash
#
# Returns the path to the Jekyll source directory
def source(override)
- override['source'] || self['source'] || DEFAULTS['source']
+ get_config_value_with_override('source', override)
end
- def quiet?(override = {})
- override['quiet'] || self['quiet'] || DEFAULTS['quiet']
+ def quiet(override = {})
+ get_config_value_with_override('quiet', override)
end
+ alias_method :quiet?, :quiet
+
+ def verbose(override = {})
+ get_config_value_with_override('verbose', override)
+ end
+ alias_method :verbose?, :verbose
def safe_load_file(filename)
case File.extname(filename)
- when '.toml'
+ when /\.toml/i
+ Jekyll::External.require_with_graceful_fail('toml') unless defined?(TOML)
TOML.load_file(filename)
- when /\.y(a)?ml/
+ when /\.ya?ml/i
SafeYAML.load_file(filename)
else
raise ArgumentError, "No parser for '#{filename}' is available. Use a .toml or .y(a)ml file instead."
@@ -125,14 +130,14 @@ module Jekyll
#
# Returns an Array of config files
def config_files(override)
- # Be quiet quickly.
- Jekyll.logger.log_level = :error if quiet?(override)
+ # Adjust verbosity quickly
+ Jekyll.logger.adjust_verbosity(:quiet => quiet?(override), :verbose => verbose?(override))
# Get configuration from <source>/_config.yml or <source>/<config_file>
config_files = override.delete('config')
if config_files.to_s.empty?
default = %w[yml yaml].find(Proc.new { 'yml' }) do |ext|
- File.exists? Jekyll.sanitized_path(source(override), "_config.#{ext}")
+ File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}"))
end
config_files = Jekyll.sanitized_path(source(override), "_config.#{default}")
@default_config_file = true
@@ -181,7 +186,7 @@ module Jekyll
$stderr.puts "#{err}"
end
- configuration.fix_common_issues.backwards_compatibilize
+ configuration.fix_common_issues.backwards_compatibilize.add_default_collections
end
# Public: Split a CSV string into an array containing its values
@@ -200,32 +205,28 @@ module Jekyll
def backwards_compatibilize
config = clone
# Provide backwards-compatibility
- if config.has_key?('auto') || config.has_key?('watch')
- Jekyll.logger.warn "Deprecation:", "Auto-regeneration can no longer" +
+ if config.key?('auto') || config.key?('watch')
+ Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" +
" be set from your configuration file(s). Use the"+
- " --watch/-w command-line option instead."
+ " --[no-]watch/-w command-line option instead."
config.delete('auto')
config.delete('watch')
end
- if config.has_key? 'server'
- Jekyll.logger.warn "Deprecation:", "The 'server' configuration option" +
+ if config.key? 'server'
+ Jekyll::Deprecator.deprecation_message "The 'server' configuration option" +
" is no longer accepted. Use the 'jekyll serve'" +
" subcommand to serve your site with WEBrick."
config.delete('server')
end
- if config.has_key? 'server_port'
- Jekyll.logger.warn "Deprecation:", "The 'server_port' configuration option" +
- " has been renamed to 'port'. Please update your config" +
- " file accordingly."
- # copy but don't overwrite:
- config['port'] = config['server_port'] unless config.has_key?('port')
- config.delete('server_port')
- end
+ renamed_key 'server_port', 'port', config
+ renamed_key 'plugins', 'plugins_dir', config
+ renamed_key 'layouts', 'layouts_dir', config
+ renamed_key 'data_source', 'data_dir', config
- if config.has_key? 'pygments'
- Jekyll.logger.warn "Deprecation:", "The 'pygments' configuration option" +
+ if config.key? 'pygments'
+ Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" +
" has been renamed to 'highlighter'. Please update your" +
" config file accordingly. The allowed values are 'rouge', " +
"'pygments' or null."
@@ -236,7 +237,7 @@ module Jekyll
%w[include exclude].each do |option|
if config.fetch(option, []).is_a?(String)
- Jekyll.logger.warn "Deprecation:", "The '#{option}' configuration option" +
+ Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" +
" must now be specified as an array, but you specified" +
" a string. For now, we've treated the string you provided" +
" as a list of comma-separated values."
@@ -245,18 +246,27 @@ module Jekyll
config[option].map!(&:to_s)
end
+ if (config['kramdown'] || {}).key?('use_coderay')
+ Jekyll::Deprecator.deprecation_message "Please change 'use_coderay'" +
+ " to 'enable_coderay' in your configuration file."
+ config['kramdown']['use_coderay'] = config['kramdown'].delete('enable_coderay')
+ end
+
if config.fetch('markdown', 'kramdown').to_s.downcase.eql?("maruku")
- Jekyll::Deprecator.deprecation_message "You're using the 'maruku' " +
- "Markdown processor. Maruku support has been deprecated and will " +
- "be removed in 3.0.0. We recommend you switch to Kramdown."
+ Jekyll.logger.abort_with "Error:", "You're using the 'maruku' " +
+ "Markdown processor, which has been removed as of 3.0.0. " +
+ "We recommend you switch to Kramdown. To do this, replace " +
+ "`markdown: maruku` with `markdown: kramdown` in your " +
+ "`_config.yml` file."
end
+
config
end
def fix_common_issues
config = clone
- if config.has_key?('paginate') && (!config['paginate'].is_a?(Integer) || config['paginate'] < 1)
+ if config.key?('paginate') && (!config['paginate'].is_a?(Integer) || config['paginate'] < 1)
Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a" +
" positive integer or nil. It's currently set to '#{config['paginate'].inspect}'."
config['paginate'] = nil
@@ -264,5 +274,45 @@ module Jekyll
config
end
+
+ def add_default_collections
+ config = clone
+
+ return config if config['collections'].nil?
+
+ if config['collections'].is_a?(Array)
+ config['collections'] = Hash[config['collections'].map{|c| [c, {}]}]
+ end
+ config['collections']['posts'] ||= {}
+ config['collections']['posts']['output'] = true
+ config['collections']['posts']['permalink'] = style_to_permalink(config['permalink'])
+
+ config
+ end
+
+ def renamed_key(old, new, config, allowed_values = nil)
+ if config.key?(old)
+ Jekyll::Deprecator.deprecation_message "The '#{old}' configuration" +
+ "option has been renamed to '#{new}'. Please update your config " +
+ "file accordingly."
+ config[new] = config.delete(old)
+ end
+ end
+
+ private
+ def style_to_permalink(permalink_style)
+ case permalink_style.to_sym
+ when :pretty
+ "/:categories/:year/:month/:day/:title/"
+ when :none
+ "/:categories/:title.html"
+ when :date
+ "/:categories/:year/:month/:day/:title.html"
+ when :ordinal
+ "/:categories/:year/:y_day/:title.html"
+ else
+ permalink_style.to_s
+ end
+ end
end
end
diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb
index 687b0ec..30c7ef3 100644
--- a/lib/jekyll/converters/markdown.rb
+++ b/lib/jekyll/converters/markdown.rb
@@ -13,7 +13,6 @@ module Jekyll
when 'redcarpet' then RedcarpetParser.new(@config)
when 'kramdown' then KramdownParser.new(@config)
when 'rdiscount' then RDiscountParser.new(@config)
- when 'maruku' then MarukuParser.new(@config)
else
# So they can't try some tricky bullshit or go down the ancestor chain, I hope.
if allowed_custom_class?(@config['markdown'])
@@ -29,7 +28,6 @@ module Jekyll
def valid_processors
%w[
- maruku
rdiscount
kramdown
redcarpet
@@ -39,16 +37,18 @@ module Jekyll
def third_party_processors
self.class.constants - %w[
KramdownParser
- MarukuParser
RDiscountParser
RedcarpetParser
PRIORITIES
].map(&:to_sym)
end
+ def extname_list
+ @extname_list ||= @config['markdown_ext'].split(',').map { |e| ".#{e.downcase}" }
+ end
+
def matches(ext)
- rgx = '^\.(' + @config['markdown_ext'].gsub(',','|') +')$'
- ext =~ Regexp.new(rgx, Regexp::IGNORECASE)
+ extname_list.include? ext.downcase
end
def output_ext(ext)
diff --git a/lib/jekyll/converters/markdown/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb
index 9dd086e..40dfa87 100644
--- a/lib/jekyll/converters/markdown/kramdown_parser.rb
+++ b/lib/jekyll/converters/markdown/kramdown_parser.rb
@@ -5,6 +5,11 @@ module Jekyll
def initialize(config)
require 'kramdown'
@config = config
+ # If kramdown supported highlighter enabled, use that
+ highlighter = @config['highlighter']
+ if highlighter == 'rouge' || highlighter == 'coderay'
+ @config['kramdown']['syntax_highlighter'] ||= highlighter
+ end
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install kramdown'
@@ -13,14 +18,14 @@ module Jekyll
def convert(content)
# Check for use of coderay
- if @config['kramdown']['use_coderay']
+ if @config['kramdown']['enable_coderay']
%w[wrap line_numbers line_numbers_start tab_width bold_every css default_lang].each do |opt|
key = "coderay_#{opt}"
- @config['kramdown'][key] = @config['kramdown']['coderay'][key] unless @config['kramdown'].has_key?(key)
+ @config['kramdown'][key] = @config['kramdown']['coderay'][key] unless @config['kramdown'].key?(key)
end
end
- Kramdown::Document.new(content, Utils.symbolize_hash_keys(@config["kramdown"])).to_html
+ Kramdown::Document.new(content, Utils.symbolize_hash_keys(@config['kramdown'])).to_html
end
end
diff --git a/lib/jekyll/converters/markdown/maruku_parser.rb b/lib/jekyll/converters/markdown/maruku_parser.rb
deleted file mode 100644
index 7be577c..0000000
--- a/lib/jekyll/converters/markdown/maruku_parser.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-module Jekyll
- module Converters
- class Markdown
- class MarukuParser
- def initialize(config)
- require 'maruku'
- @config = config
- @errors = []
- load_divs_library if @config['maruku']['use_divs']
- load_blahtext_library if @config['maruku']['use_tex']
-
- # allow fenced code blocks (new in Maruku 0.7.0)
- MaRuKu::Globals[:fenced_code_blocks] = !!@config['maruku']['fenced_code_blocks']
-
- rescue LoadError
- STDERR.puts 'You are missing a library required for Markdown. Please run:'
- STDERR.puts ' $ [sudo] gem install maruku'
- raise Errors::FatalException.new("Missing dependency: maruku")
- end
-
- def load_divs_library
- require 'maruku/ext/div'
- STDERR.puts 'Maruku: Using extended syntax for div elements.'
- end
-
- def load_blahtext_library
- require 'maruku/ext/math'
- STDERR.puts "Maruku: Using LaTeX extension. Images in `#{@config['maruku']['png_dir']}`."
-
- # Switch off MathML output
- MaRuKu::Globals[:html_math_output_mathml] = false
- MaRuKu::Globals[:html_math_engine] = 'none'
-
- # Turn on math to PNG support with blahtex
- # Resulting PNGs stored in `images/latex`
- MaRuKu::Globals[:html_math_output_png] = true
- MaRuKu::Globals[:html_png_engine] = @config['maruku']['png_engine']
- MaRuKu::Globals[:html_png_dir] = @config['maruku']['png_dir']
- MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url']
- end
-
- def print_errors_and_fail
- print @errors.join
- raise MaRuKu::Exception, "MaRuKu encountered problem(s) while converting your markup."
- end
-
- def convert(content)
- converted = Maruku.new(content, :error_stream => @errors).to_html.strip
- print_errors_and_fail unless @errors.empty?
- converted
- end
- end
- end
- end
-end
diff --git a/lib/jekyll/converters/markdown/rdiscount_parser.rb b/lib/jekyll/converters/markdown/rdiscount_parser.rb
index 0c8634e..fb5172e 100644
--- a/lib/jekyll/converters/markdown/rdiscount_parser.rb
+++ b/lib/jekyll/converters/markdown/rdiscount_parser.rb
@@ -3,7 +3,7 @@ module Jekyll
class Markdown
class RDiscountParser
def initialize(config)
- Jekyll::Deprecator.gracefully_require "rdiscount"
+ Jekyll::External.require_with_graceful_fail "rdiscount"
@config = config
@rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym }
end
diff --git a/lib/jekyll/converters/markdown/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb
index b69df9b..6788d96 100644
--- a/lib/jekyll/converters/markdown/redcarpet_parser.rb
+++ b/lib/jekyll/converters/markdown/redcarpet_parser.rb
@@ -14,7 +14,7 @@ module Jekyll
module WithPygments
include CommonMethods
def block_code(code, lang)
- Jekyll::Deprecator.gracefully_require("pygments")
+ Jekyll::External.require_with_graceful_fail("pygments")
lang = lang && lang.split.first || "text"
add_code_tags(
Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),
@@ -29,7 +29,7 @@ module Jekyll
include CommonMethods
def code_wrap(code)
- "<div class=\"highlight\"><pre>#{CGI::escapeHTML(code)}</pre></div>"
+ "<figure class=\"highlight\"><pre>#{CGI::escapeHTML(code)}</pre></figure>"
end
def block_code(code, lang)
@@ -48,14 +48,14 @@ module Jekyll
end
protected
- def rouge_formatter(opts = {})
- Rouge::Formatters::HTML.new(opts.merge(wrap: false))
+ def rouge_formatter(lexer)
+ Rouge::Formatters::HTML.new(:wrap => false)
end
end
def initialize(config)
- Deprecator.gracefully_require("redcarpet")
+ External.require_with_graceful_fail("redcarpet")
@config = config
@redcarpet_extensions = {}
@config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true }
@@ -71,12 +71,12 @@ module Jekyll
end
when "rouge"
Class.new(Redcarpet::Render::HTML) do
- Jekyll::Deprecator.gracefully_require(%w[
+ Jekyll::External.require_with_graceful_fail(%w[
rouge
rouge/plugins/redcarpet
])
- if Rouge.version < '1.3.0'
+ unless Gem::Version.new(Rouge.version) > Gem::Version.new("1.3.0")
abort "Please install Rouge 1.3.0 or greater and try running Jekyll again."
end
diff --git a/lib/jekyll/converters/textile.rb b/lib/jekyll/converters/textile.rb
deleted file mode 100644
index 366aa0c..0000000
--- a/lib/jekyll/converters/textile.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-module Jekyll
- module Converters
- class Textile < Converter
- safe true
-
- highlighter_prefix '<notextile>'
- highlighter_suffix '</notextile>'
-
- def setup
- return if @setup
- require 'redcloth'
- @setup = true
- rescue LoadError
- STDERR.puts 'You are missing a library required for Textile. Please run:'
- STDERR.puts ' $ [sudo] gem install RedCloth'
- raise Errors::FatalException.new("Missing dependency: RedCloth")
- end
-
- def matches(ext)
- rgx = '(' + @config['textile_ext'].gsub(',','|') +')'
- ext =~ Regexp.new(rgx, Regexp::IGNORECASE)
- end
-
- def output_ext(ext)
- ".html"
- end
-
- def convert(content)
- setup
-
- # Shortcut if config doesn't contain RedCloth section
- return RedCloth.new(content).to_html if @config['redcloth'].nil?
-
- # List of attributes defined on RedCloth
- # (from https://github.com/jgarber/redcloth/blob/master/lib/redcloth/textile_doc.rb)
- attrs = ['filter_classes', 'filter_html', 'filter_ids', 'filter_styles',
- 'hard_breaks', 'lite_mode', 'no_span_caps', 'sanitize_html']
-
- r = RedCloth.new(content)
-
- # Set attributes in r if they are NOT nil in the config
- attrs.each do |attr|
- r.instance_variable_set("@#{attr}".to_sym, @config['redcloth'][attr]) unless @config['redcloth'][attr].nil?
- end
-
- r.to_html
- end
- end
- end
-end
diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb
index 1d9ed31..1215139 100644
--- a/lib/jekyll/convertible.rb
+++ b/lib/jekyll/convertible.rb
@@ -25,7 +25,7 @@ module Jekyll
# Whether the file is published or not, as indicated in YAML front-matter
def published?
- !(data.has_key?('published') && data['published'] == false)
+ !(data.key?('published') && data['published'] == false)
end
# Returns merged option hash for File.read of self.site (if exists)
@@ -43,7 +43,7 @@ module Jekyll
# Returns nothing.
def read_yaml(base, name, opts = {})
begin
- self.content = File.read(Jekyll.sanitized_path(base, name),
+ self.content = File.read(site.in_source_dir(base, name),
merged_file_read_opts(opts))
if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
self.content = $POSTMATCH
@@ -56,17 +56,27 @@ module Jekyll
end
self.data ||= {}
+
+ unless self.data.is_a?(Hash)
+ Jekyll.logger.abort_with "Fatal:", "Invalid YAML front matter in #{File.join(base, name)}"
+ end
+
+ self.data
end
# Transform the contents based on the content type.
#
- # Returns nothing.
+ # Returns the transformed contents.
def transform
- self.content = converter.convert(content)
- rescue => e
- Jekyll.logger.error "Conversion error:", "There was an error converting" +
- " '#{path}'."
- raise e
+ converters.reduce(content) do |output, converter|
+ begin
+ converter.convert output
+ rescue => e
+ Jekyll.logger.error "Conversion error:", "#{converter.class} encountered an error while converting '#{path}':"
+ Jekyll.logger.error("", e.to_s)
+ raise e
+ end
+ end
end
# Determine the extension depending on content_type.
@@ -74,15 +84,21 @@ module Jekyll
# Returns the String extension for the output file.
# e.g. ".html" for an HTML output file.
def output_ext
- converter.output_ext(ext)
+ if converters.all? { |c| c.is_a?(Jekyll::Converters::Identity) }
+ ext
+ else
+ converters.map { |c|
+ c.output_ext(ext) unless c.is_a?(Jekyll::Converters::Identity)
+ }.compact.last
+ end
end
# Determine which converter to use based on this convertible's
# extension.
#
# Returns the Converter instance.
- def converter
- @converter ||= site.converters.find { |c| c.matches(ext) }
+ def converters
+ @converters ||= site.converters.select { |c| c.matches(ext) }.sort
end
# Render Liquid in the content
@@ -92,8 +108,8 @@ module Jekyll
# info - the info for Liquid
#
# Returns the converted content
- def render_liquid(content, payload, info, path = nil)
- Liquid::Template.parse(content).render!(payload, info)
+ def render_liquid(content, payload, info, path)
+ site.liquid_renderer.file(path).parse(content).render!(payload, info)
rescue Tags::IncludeTagError => e
Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || self.path}"
raise e
@@ -119,12 +135,15 @@ module Jekyll
#
# Returns the type of self.
def type
- if is_a?(Post)
- :post
- elsif is_a?(Page)
- :page
- elsif is_a?(Draft)
- :draft
+ if is_a?(Page)
+ :pages
+ end
+ end
+
+ # returns the owner symbol for hook triggering
+ def hook_owner
+ if is_a?(Page)
+ :pages
end
end
@@ -134,21 +153,33 @@ module Jekyll
# Returns true if the extname belongs to the set of extensions
# that asset files use.
def asset_file?
- %w[.sass .scss .coffee].include?(ext)
+ sass_file? || coffeescript_file?
+ end
+
+ # Determine whether the document is a Sass file.
+ #
+ # Returns true if extname == .sass or .scss, false otherwise.
+ def sass_file?
+ %w[.sass .scss].include?(ext)
+ end
+
+ # Determine whether the document is a CoffeeScript file.
+ #
+ # Returns true if extname == .coffee, false otherwise.
+ def coffeescript_file?
+ '.coffee'.eql?(ext)
end
# Determine whether the file should be rendered with Liquid.
#
- # Returns false if the document is either an asset file or a yaml file,
- # true otherwise.
+ # Always returns true.
def render_with_liquid?
- !asset_file?
+ true
end
# Determine whether the file should be placed into layouts.
#
- # Returns false if the document is either an asset file or a yaml file,
- # true otherwise.
+ # Returns false if the document is an asset file.
def place_in_layout?
!asset_file?
end
@@ -159,7 +190,7 @@ module Jekyll
#
# Returns true if the layout is invalid, false if otherwise
def invalid_layout?(layout)
- !data["layout"].nil? && data["layout"] != "none" && layout.nil? && !(self.is_a? Jekyll::Excerpt)
+ !data["layout"].nil? && layout.nil? && !(self.is_a? Jekyll::Excerpt)
end
# Recursively render layouts
@@ -178,12 +209,19 @@ module Jekyll
used = Set.new([layout])
while layout
+ Jekyll.logger.debug "Rendering Layout:", path
payload = Utils.deep_merge_hashes(payload, {"content" => output, "page" => layout.data})
self.output = render_liquid(layout.content,
payload,
info,
- File.join(site.config['layouts'], layout.name))
+ File.join(site.config['layouts_dir'], layout.name))
+
+ # Add layout to dependency tree
+ site.regenerator.add_dependency(
+ site.in_source_dir(path),
+ site.in_source_dir(layout.path)
+ )
if layout = layouts[layout.data["layout"]]
if used.include?(layout)
@@ -202,19 +240,29 @@ module Jekyll
#
# Returns nothing.
def do_layout(payload, layouts)
+ Jekyll.logger.debug "Rendering:", self.relative_path
+
+ Jekyll.logger.debug "Pre-Render Hooks:", self.relative_path
+ Jekyll::Hooks.trigger hook_owner, :pre_render, self, payload
info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload['page'] } }
# render and transform content (this becomes the final content of the object)
- payload["highlighter_prefix"] = converter.highlighter_prefix
- payload["highlighter_suffix"] = converter.highlighter_suffix
+ payload["highlighter_prefix"] = converters.first.highlighter_prefix
+ payload["highlighter_suffix"] = converters.first.highlighter_suffix
- self.content = render_liquid(content, payload, info) if render_with_liquid?
- transform
+ if render_with_liquid?
+ Jekyll.logger.debug "Rendering Liquid:", self.relative_path
+ self.content = render_liquid(content, payload, info, path)
+ end
+ Jekyll.logger.debug "Rendering Markup:", self.relative_path
+ self.content = transform
# output keeps track of what will finally be written
self.output = content
render_all_layouts(layouts, payload, info) if place_in_layout?
+ Jekyll.logger.debug "Post-Render Hooks:", self.relative_path
+ Jekyll::Hooks.trigger hook_owner, :post_render, self
end
# Write the generated page file to the destination directory.
@@ -228,6 +276,7 @@ module Jekyll
File.open(path, 'wb') do |f|
f.write(output)
end
+ Jekyll::Hooks.trigger hook_owner, :post_write, self
end
# Accessor for data properties by Liquid.
diff --git a/lib/jekyll/deprecator.rb b/lib/jekyll/deprecator.rb
index 6fd94fb..8fda510 100644
--- a/lib/jekyll/deprecator.rb
+++ b/lib/jekyll/deprecator.rb
@@ -1,9 +1,12 @@
module Jekyll
module Deprecator
- def self.process(args)
- no_subcommand(args)
+ extend self
+
+ def process(args)
arg_is_present? args, "--server", "The --server command has been replaced by the \
'serve' subcommand."
+ arg_is_present? args, "--serve", "The --server command has been replaced by the \
+ 'serve' subcommand."
arg_is_present? args, "--no-server", "To build Jekyll without launching a server, \
use the 'build' subcommand."
arg_is_present? args, "--auto", "The switch '--auto' has been replaced with '--watch'."
@@ -14,41 +17,30 @@ module Jekyll
arg_is_present? args, "--paginate", "The 'paginate' setting can only be set in your \
config files."
arg_is_present? args, "--url", "The 'url' setting can only be set in your config files."
+ no_subcommand(args)
end
- def self.no_subcommand(args)
+ def no_subcommand(args)
if args.size > 0 && args.first =~ /^--/ && !%w[--help --version].include?(args.first)
- Jekyll.logger.error "Deprecation:", "Jekyll now uses subcommands instead of just \
- switches. Run `jekyll --help' to find out more."
+ deprecation_message "Jekyll now uses subcommands instead of just switches. Run `jekyll --help` to find out more."
+ abort
end
end
- def self.arg_is_present?(args, deprecated_argument, message)
+ def arg_is_present?(args, deprecated_argument, message)
if args.include?(deprecated_argument)
deprecation_message(message)
end
end
- def self.deprecation_message(message)
+ def deprecation_message(message)
Jekyll.logger.error "Deprecation:", message
end
- def self.gracefully_require(gem_name)
- Array(gem_name).each do |name|
- begin
- require name
- rescue LoadError => e
- Jekyll.logger.error "Dependency Error:", <<-MSG
- Yikes! It looks like you don't have #{name} or one of its dependencies installed.
- In order to use Jekyll as currently contfigured, you'll need to install this gem.
-
- The full error message from Ruby is: '#{e.message}'
-
- If you run into trouble, you can find helpful resources at http://jekyllrb.com/help/!
- MSG
- raise Errors::MissingDependencyException.new(name)
- end
- end
+ def defaults_deprecate_type(old, current)
+ Jekyll.logger.warn "Defaults:", "The '#{old}' type has become '#{current}'."
+ Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use 'type: #{current}'."
end
+
end
end
diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb
index 85b22ba..528fed6 100644
--- a/lib/jekyll/document.rb
+++ b/lib/jekyll/document.rb
@@ -1,9 +1,14 @@
+# encoding: UTF-8
+
module Jekyll
class Document
include Comparable
- attr_reader :path, :site
- attr_accessor :content, :collection, :output
+ attr_reader :path, :site, :extname, :output_ext, :content, :output, :collection
+
+ YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
+ DATELESS_FILENAME_MATCHER = /^(.*)(\.[^.]+)$/
+ DATE_FILENAME_MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/
# Create a new Document.
#
@@ -14,7 +19,32 @@ module Jekyll
def initialize(path, relations)
@site = relations[:site]
@path = path
+ @extname = File.extname(path)
+ @output_ext = Jekyll::Renderer.new(site, self).output_ext
@collection = relations[:collection]
+ @has_yaml_header = nil
+
+ if draft?
+ categories_from_path("_drafts")
+ else
+ categories_from_path(collection.relative_directory)
+ end
+
+ data.default_proc = proc do |hash, key|
+ site.frontmatter_defaults.find(relative_path, collection.label, key)
+ end
+
+ trigger_hooks(:post_init)
+ end
+
+ def output=(output)
+ @to_liquid = nil
+ @output = output
+ end
+
+ def content=(content)
+ @to_liquid = nil
+ @content = content
end
# Fetch the Document's data.
@@ -25,28 +55,56 @@ module Jekyll
@data ||= Hash.new
end
+ # Merge some data in with this document's data.
+ #
+ # Returns the merged data.
+ def merge_data!(other)
+ if other.key?('categories') && !other['categories'].nil?
+ if other['categories'].is_a?(String)
+ other['categories'] = other['categories'].split(" ").map(&:strip)
+ end
+ other['categories'] = (data['categories'] || []) | other['categories']
+ end
+ Utils.deep_merge_hashes!(data, other)
+ if data.key?('date') && !data['date'].is_a?(Time)
+ data['date'] = Utils.parse_date(data['date'].to_s, "Document '#{relative_path}' does not have a valid date in the YAML front matter.")
+ end
+ data
+ end
+
+ def date
+ data['date'] ||= site.time
+ end
+
+ # Returns whether the document is a draft. This is only the case if
+ # the document is in the 'posts' collection but in a different
+ # directory than '_posts'.
+ #
+ # Returns whether the document is a draft.
+ def draft?
+ data['draft'] ||= relative_path.index(collection.relative_directory).nil? && collection.label == "posts"
+ end
+
# The path to the document, relative to the site source.
#
# Returns a String path which represents the relative path
# from the site source to this document
def relative_path
- Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s
+ @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s
end
- # The base filename of the document.
+ # The base filename of the document, without the file extname.
#
- # suffix - (optional) the suffix to be removed from the end of the filename
- #
- # Returns the base filename of the document.
- def basename(suffix = "")
- File.basename(path, suffix)
+ # Returns the basename without the file extname.
+ def basename_without_ext
+ @basename_without_ext ||= File.basename(path, '.*')
end
- # The extension name of the document.
+ # The base filename of the document.
#
- # Returns the extension name of the document.
- def extname
- File.extname(path)
+ # Returns the base filename of the document.
+ def basename
+ @basename ||= File.basename(path)
end
# Produces a "cleaned" relative path.
@@ -61,7 +119,8 @@ module Jekyll
#
# Returns the cleaned relative path of the document.
def cleaned_relative_path
- relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "")
+ @cleaned_relative_path ||=
+ relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "")
end
# Determine whether the document is a YAML file.
@@ -77,7 +136,21 @@ module Jekyll
# Returns true if the extname belongs to the set of extensions
# that asset files use.
def asset_file?
- %w[.sass .scss .coffee].include?(extname)
+ sass_file? || coffeescript_file?
+ end
+
+ # Determine whether the document is a Sass file.
+ #
+ # Returns true if extname == .sass or .scss, false otherwise.
+ def sass_file?
+ %w[.sass .scss].include?(extname)
+ end
+
+ # Determine whether the document is a CoffeeScript file.
+ #
+ # Returns true if extname == .coffee, false otherwise.
+ def coffeescript_file?
+ '.coffee'.eql?(extname)
end
# Determine whether the file should be rendered with Liquid.
@@ -85,7 +158,7 @@ module Jekyll
# Returns false if the document is either an asset file or a yaml file,
# true otherwise.
def render_with_liquid?
- !(asset_file? || yaml_file?)
+ !(coffeescript_file? || yaml_file?)
end
# Determine whether the file should be placed into layouts.
@@ -109,9 +182,25 @@ module Jekyll
# Returns the Hash of key-value pairs for replacement in the URL.
def url_placeholders
{
- collection: collection.label,
- path: cleaned_relative_path,
- output_ext: Jekyll::Renderer.new(site, self).output_ext
+ collection: collection.label,
+ path: cleaned_relative_path,
+ output_ext: output_ext,
+ name: Utils.slugify(basename_without_ext),
+ title: Utils.slugify(data['slug'], mode: "pretty", cased: true) || Utils
+ .slugify(basename_without_ext, mode: "pretty", cased: true),
+ slug: Utils.slugify(data['slug']) || Utils.slugify(basename_without_ext),
+ year: date.strftime("%Y"),
+ month: date.strftime("%m"),
+ day: date.strftime("%d"),
+ hour: date.strftime("%H"),
+ minute: date.strftime("%M"),
+ second: date.strftime("%S"),
+ i_day: date.strftime("%-d"),
+ i_month: date.strftime("%-m"),
+ categories: (data['categories'] || []).map { |c| c.to_s.downcase }.uniq.join('/'),
+ short_month: date.strftime("%b"),
+ short_year: date.strftime("%y"),
+ y_day: date.strftime("%j"),
}
end
@@ -134,14 +223,20 @@ module Jekyll
}).to_s
end
+ def [](key)
+ data[key]
+ end
+
# The full path to the output file.
#
# base_directory - the base path of the output directory
#
# Returns the full path to the output file of this document.
def destination(base_directory)
- path = Jekyll.sanitized_path(base_directory, url)
- path = File.join(path, "index.html") if url =~ /\/$/
+ dest = site.in_dest_dir(base_directory)
+ path = site.in_dest_dir(dest, URL.unescape_path(url))
+ path = File.join(path, "index.html") if url.end_with?("/")
+ path << output_ext unless path.end_with?(output_ext)
path
end
@@ -156,6 +251,8 @@ module Jekyll
File.open(path, 'wb') do |f|
f.write(output)
end
+
+ trigger_hooks(:post_write)
end
# Returns merged option hash for File.read of self.site (if exists)
@@ -172,7 +269,7 @@ module Jekyll
#
# Returns true if the 'published' key is specified in the YAML front-matter and not `false`.
def published?
- !(data.has_key?('published') && data['published'] == false)
+ !(data.key?('published') && data['published'] == false)
end
# Read in the file and assign the content and data based on the file contents.
@@ -181,22 +278,25 @@ module Jekyll
#
# Returns nothing.
def read(opts = {})
+ @to_liquid = nil
+
+ Jekyll.logger.debug "Reading:", relative_path
+
if yaml_file?
@data = SafeYAML.load_file(path)
else
begin
defaults = @site.frontmatter_defaults.all(url, collection.label.to_sym)
- unless defaults.empty?
- @data = defaults
- end
- @content = File.read(path, merged_file_read_opts(opts))
- if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
- @content = $POSTMATCH
+ merge_data!(defaults) unless defaults.empty?
+
+ self.content = File.read(path, merged_file_read_opts(opts))
+ if content =~ YAML_FRONT_MATTER_REGEXP
+ self.content = $POSTMATCH
data_file = SafeYAML.load($1)
- unless data_file.nil?
- @data = Utils.deep_merge_hashes(defaults, data_file)
- end
+ merge_data!(data_file) if data_file
end
+
+ post_read
rescue SyntaxError => e
puts "YAML Exception reading #{path}: #{e.message}"
rescue Exception => e
@@ -205,19 +305,66 @@ module Jekyll
end
end
+ def post_read
+ if DATE_FILENAME_MATCHER =~ relative_path
+ m, cats, date, slug, ext = *relative_path.match(DATE_FILENAME_MATCHER)
+ merge_data!({
+ "slug" => slug,
+ "ext" => ext
+ })
+ merge_data!({"date" => date}) if data['date'].nil? || data['date'].to_i == site.time.to_i
+ data['title'] ||= slug.split('-').select {|w| w.capitalize! || w }.join(' ')
+ end
+ populate_categories
+ populate_tags
+
+ if generate_excerpt?
+ data['excerpt'] ||= Jekyll::Excerpt.new(self)
+ end
+ end
+
+ # Add superdirectories of the special_dir to categories.
+ # In the case of es/_posts, 'es' is added as a category.
+ # In the case of _posts/es, 'es' is NOT added as a category.
+ #
+ # Returns nothing.
+ def categories_from_path(special_dir)
+ superdirs = relative_path.sub(/#{special_dir}(.*)/, '').split(File::SEPARATOR).reject do |c|
+ c.empty? || c.eql?(special_dir) || c.eql?(basename)
+ end
+ merge_data!({ 'categories' => superdirs })
+ end
+
+ def populate_categories
+ merge_data!({
+ 'categories' => (
+ Array(data['categories']) + Utils.pluralized_array_from_hash(data, 'category', 'categories')
+ ).map { |c| c.to_s }.flatten.uniq
+ })
+ end
+
+ def populate_tags
+ merge_data!({
+ "tags" => Utils.pluralized_array_from_hash(data, "tag", "tags").flatten
+ })
+ end
+
# Create a Liquid-understandable version of this Document.
#
# Returns a Hash representing this Document's data.
def to_liquid
- if data.is_a?(Hash)
- Utils.deep_merge_hashes data, {
+ @to_liquid ||= if data.is_a?(Hash)
+ Utils.deep_merge_hashes Utils.deep_merge_hashes({
"output" => output,
"content" => content,
- "path" => path,
"relative_path" => relative_path,
+ "path" => relative_path,
"url" => url,
- "collection" => collection.label
- }
+ "collection" => collection.label,
+ "next" => next_doc,
+ "previous" => previous_doc,
+ "id" => id,
+ }, data), { 'excerpt' => data['excerpt'].to_s }
else
data
end
@@ -235,7 +382,7 @@ module Jekyll
#
# Returns the content of the document
def to_s
- output || content
+ output || content || 'NO CONTENT'
end
# Compare this document against another document.
@@ -243,8 +390,11 @@ module Jekyll
#
# Returns -1, 0, +1 or nil depending on whether this doc's path is less than,
# equal or greater than the other doc's path. See String#<=> for more details.
- def <=>(anotherDocument)
- path <=> anotherDocument.path
+ def <=>(other)
+ return nil if !other.respond_to?(:data)
+ cmp = data['date'] <=> other.data['date']
+ cmp = path <=> other.path if cmp == 0
+ cmp
end
# Determine whether this document should be written.
@@ -256,5 +406,70 @@ module Jekyll
collection && collection.write?
end
+ # The Document excerpt_separator, from the YAML Front-Matter or site
+ # default excerpt_separator value
+ #
+ # Returns the document excerpt_separator
+ def excerpt_separator
+ (data['excerpt_separator'] || site.config['excerpt_separator']).to_s
+ end
+
+ # Whether to generate an excerpt
+ #
+ # Returns true if the excerpt separator is configured.
+ def generate_excerpt?
+ !excerpt_separator.empty?
+ end
+
+ def next_doc
+ pos = collection.docs.index {|post| post.equal?(self) }
+ if pos && pos < collection.docs.length - 1
+ collection.docs[pos + 1]
+ else
+ nil
+ end
+ end
+
+ def previous_doc
+ pos = collection.docs.index {|post| post.equal?(self) }
+ if pos && pos > 0
+ collection.docs[pos - 1]
+ else
+ nil
+ end
+ end
+
+ def trigger_hooks(hook_name, *args)
+ Jekyll::Hooks.trigger collection.label.to_sym, hook_name, self, *args if collection
+ Jekyll::Hooks.trigger :documents, hook_name, self, *args
+ end
+
+ def id
+ @id ||= File.join(File.dirname(url), (data['slug'] || basename_without_ext).to_s)
+ end
+
+ # Calculate related posts.
+ #
+ # Returns an Array of related Posts.
+ def related_posts
+ Jekyll::RelatedPosts.new(self).build
+ end
+
+ # Override of normal respond_to? to match method_missing's logic for
+ # looking in @data.
+ def respond_to?(method, include_private = false)
+ data.key?(method.to_s) || super
+ end
+
+ # Override of method_missing to check in @data for the key.
+ def method_missing(method, *args, &blck)
+ if data.key?(method.to_s)
+ Jekyll.logger.warn "Deprecation:", "Document##{method} is now a key in the #data hash."
+ Jekyll.logger.warn "", "Called by #{caller.first}."
+ data[method.to_s]
+ else
+ super
+ end
+ end
end
end
diff --git a/lib/jekyll/draft.rb b/lib/jekyll/draft.rb
deleted file mode 100644
index 7b1d9ac..0000000
--- a/lib/jekyll/draft.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-module Jekyll
-
- class Draft < Post
-
- # Valid post name regex (no date)
- MATCHER = /^(.*)(\.[^.]+)$/
-
- # Draft name validator. Draft filenames must be like:
- # my-awesome-post.textile
- #
- # Returns true if valid, false if not.
- def self.valid?(name)
- name =~ MATCHER
- end
-
- # Get the full path to the directory containing the draft files
- def containing_dir(source, dir)
- File.join(source, dir, '_drafts')
- end
-
- # The path to the draft source file, relative to the site source
- def relative_path
- File.join(@dir, '_drafts', @name)
- end
-
- # Extract information from the post filename.
- #
- # name - The String filename of the post file.
- #
- # Returns nothing.
- def process(name)
- m, slug, ext = *name.match(MATCHER)
- self.date = File.mtime(File.join(@base, name))
- self.slug = slug
- self.ext = ext
- end
-
- end
-
-end
diff --git a/lib/jekyll/entry_filter.rb b/lib/jekyll/entry_filter.rb
index d2cd6f8..e427018 100644
--- a/lib/jekyll/entry_filter.rb
+++ b/lib/jekyll/entry_filter.rb
@@ -47,7 +47,7 @@ module Jekyll
def excluded?(entry)
excluded = glob_include?(site.exclude, relative_to_source(entry))
- Jekyll.logger.debug "excluded?(#{relative_to_source(entry)}) ==> #{excluded}"
+ Jekyll.logger.debug "EntryFilter:", "excluded?(#{relative_to_source(entry)}) ==> #{excluded}"
excluded
end
diff --git a/lib/jekyll/excerpt.rb b/lib/jekyll/excerpt.rb
index 958e3f3..36fcd11 100644
--- a/lib/jekyll/excerpt.rb
+++ b/lib/jekyll/excerpt.rb
@@ -2,46 +2,43 @@ require 'forwardable'
module Jekyll
class Excerpt
- include Convertible
extend Forwardable
- attr_accessor :post
- attr_accessor :content, :output, :ext
+ attr_accessor :doc
+ attr_accessor :content, :ext
+ attr_writer :output
- def_delegator :@post, :site, :site
- def_delegator :@post, :name, :name
- def_delegator :@post, :ext, :ext
+ def_delegators :@doc, :site, :name, :ext, :relative_path, :extname,
+ :render_with_liquid?, :collection, :related_posts
- # Initialize this Post instance.
+ # Initialize this Excerpt instance.
#
- # site - The Site.
- # base - The String path to the dir containing the post file.
- # name - The String filename of the post file.
+ # doc - The Document.
#
- # Returns the new Post.
- def initialize(post)
- self.post = post
- self.content = extract_excerpt(post.content)
+ # Returns the new Excerpt.
+ def initialize(doc)
+ self.doc = doc
+ self.content = extract_excerpt(doc.content)
end
- def to_liquid
- post.to_liquid(post.class::EXCERPT_ATTRIBUTES_FOR_LIQUID)
- end
-
- # Fetch YAML front-matter data from related post, without layout key
+ # Fetch YAML front-matter data from related doc, without layout key
#
- # Returns Hash of post data
+ # Returns Hash of doc data
def data
- @data ||= post.data.dup
+ @data ||= doc.data.dup
@data.delete("layout")
+ @data.delete("excerpt")
@data
end
+ def trigger_hooks(*)
+ end
+
# 'Path' of the excerpt.
#
- # Returns the path for the post this excerpt belongs to with #excerpt appended
+ # Returns the path for the doc this excerpt belongs to with #excerpt appended
def path
- File.join(post.path, "#excerpt")
+ File.join(doc.path, "#excerpt")
end
# Check if excerpt includes a string
@@ -51,28 +48,43 @@ module Jekyll
(output && output.include?(something)) || content.include?(something)
end
- # The UID for this post (useful in feeds).
- # e.g. /2008/11/05/my-awesome-post
+ # The UID for this doc (useful in feeds).
+ # e.g. /2008/11/05/my-awesome-doc
#
# Returns the String UID.
def id
- File.join(post.dir, post.slug, "#excerpt")
+ "#{doc.id}#excerpt"
end
def to_s
output || content
end
- # Returns the shorthand String identifier of this Post.
+ def to_liquid
+ doc.data['excerpt'] = nil
+ @to_liquid ||= doc.to_liquid
+ doc.data['excerpt'] = self
+ @to_liquid
+ end
+
+ # Returns the shorthand String identifier of this doc.
def inspect
"<Excerpt: #{self.id}>"
end
+ def output
+ @output ||= Renderer.new(doc.site, self, site.site_payload).run
+ end
+
+ def place_in_layout?
+ false
+ end
+
protected
# Internal: Extract excerpt from the content
#
- # By default excerpt is your first paragraph of a post: everything before
+ # By default excerpt is your first paragraph of a doc: everything before
# the first two new lines:
#
# ---
@@ -86,16 +98,16 @@ module Jekyll
# [1]: http://example.com/
#
# This is fairly good option for Markdown and Textile files. But might cause
- # problems for HTML posts (which is quite unusual for Jekyll). If default
+ # problems for HTML docs (which is quite unusual for Jekyll). If default
# excerpt delimiter is not good for you, you might want to set your own via
# configuration option `excerpt_separator`. For example, following is a good
- # alternative for HTML posts:
+ # alternative for HTML docs:
#
# # file: _config.yml
# excerpt_separator: "<!-- more -->"
#
# Notice that all markdown-style link references will be appended to the
- # excerpt. So the example post above will have this excerpt source:
+ # excerpt. So the example doc above will have this excerpt source:
#
# First paragraph with [link][1].
#
@@ -104,11 +116,14 @@ module Jekyll
# Excerpts are rendered same time as content is rendered.
#
# Returns excerpt String
- def extract_excerpt(post_content)
- separator = site.config['excerpt_separator']
- head, _, tail = post_content.partition(separator)
+ def extract_excerpt(doc_content)
+ head, _, tail = doc_content.to_s.partition(doc.excerpt_separator)
- "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n")
+ if tail.empty?
+ head
+ else
+ "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n")
+ end
end
end
end
diff --git a/lib/jekyll/external.rb b/lib/jekyll/external.rb
new file mode 100644
index 0000000..e41bce2
--- /dev/null
+++ b/lib/jekyll/external.rb
@@ -0,0 +1,59 @@
+module Jekyll
+ module External
+ class << self
+
+ #
+ # Gems that, if installed, should be loaded.
+ # Usually contain subcommands.
+ #
+ def blessed_gems
+ %w{
+ jekyll-docs
+ jekyll-import
+ }
+ end
+
+ #
+ # Require a gem or file if it's present, otherwise silently fail.
+ #
+ # names - a string gem name or array of gem names
+ #
+ def require_if_present(names)
+ Array(names).each do |name|
+ begin
+ require name
+ rescue LoadError
+ Jekyll.logger.debug "Couldn't load #{name}. Skipping."
+ false
+ end
+ end
+ end
+
+ #
+ # Require a gem or gems. If it's not present, show a very nice error
+ # message that explains everything and is much more helpful than the
+ # normal LoadError.
+ #
+ # names - a string gem name or array of gem names
+ #
+ def require_with_graceful_fail(names)
+ Array(names).each do |name|
+ begin
+ require name
+ rescue LoadError => e
+ Jekyll.logger.error "Dependency Error:", <<-MSG
+Yikes! It looks like you don't have #{name} or one of its dependencies installed.
+In order to use Jekyll as currently configured, you'll need to install this gem.
+
+The full error message from Ruby is: '#{e.message}'
+
+If you run into trouble, you can find helpful resources at http://jekyllrb.com/help/!
+ MSG
+ raise Jekyll::Errors::MissingDependencyException.new(name)
+ end
+ end
+ end
+
+ end
+ end
+end
diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb
index 002d926..7e2d30f 100644
--- a/lib/jekyll/filters.rb
+++ b/lib/jekyll/filters.rb
@@ -1,30 +1,53 @@
require 'uri'
require 'json'
+require 'date'
module Jekyll
module Filters
- # Convert a Textile string into HTML output.
+ # Convert a Markdown string into HTML output.
#
- # input - The Textile String to convert.
+ # input - The Markdown String to convert.
#
# Returns the HTML formatted String.
- def textilize(input)
+ def markdownify(input)
site = @context.registers[:site]
- converter = site.getConverterImpl(Jekyll::Converters::Textile)
+ converter = site.find_converter_instance(Jekyll::Converters::Markdown)
converter.convert(input)
end
- # Convert a Markdown string into HTML output.
+ # Convert a Sass string into CSS output.
#
- # input - The Markdown String to convert.
+ # input - The Sass String to convert.
#
- # Returns the HTML formatted String.
- def markdownify(input)
+ # Returns the CSS formatted String.
+ def sassify(input)
+ site = @context.registers[:site]
+ converter = site.find_converter_instance(Jekyll::Converters::Sass)
+ converter.convert(input)
+ end
+
+ # Convert a Scss string into CSS output.
+ #
+ # input - The Scss String to convert.
+ #
+ # Returns the CSS formatted String.
+ def scssify(input)
site = @context.registers[:site]
- converter = site.getConverterImpl(Jekyll::Converters::Markdown)
+ converter = site.find_converter_instance(Jekyll::Converters::Scss)
converter.convert(input)
end
+ # Slugify a filename or title.
+ #
+ # input - The filename or title to slugify.
+ # mode - how string is slugified
+ #
+ # Returns the given filename or title as a lowercase URL String.
+ # See Utils.slugify for more detail.
+ def slugify(input, mode=nil)
+ Utils.slugify(input, mode: mode)
+ end
+
# Format a date in short format e.g. "27 Jan 2011".
#
# date - the Time to format.
@@ -155,7 +178,7 @@ module Jekyll
#
# Returns the converted json string
def jsonify(input)
- input.to_json
+ as_liquid(input).to_json
end
# Group an array of items by a property
@@ -181,13 +204,14 @@ module Jekyll
# Filter an array of objects
#
# input - the object array
- # key - key within each object to filter by
+ # property - property within each object to filter by
# value - desired value
#
# Returns the filtered array of objects
def where(input, property, value)
- return input unless input.is_a?(Array)
- input.select { |object| item_property(object, property) == value }
+ return input unless input.is_a?(Enumerable)
+ input = input.values if input.is_a?(Hash)
+ input.select { |object| item_property(object, property).to_s == value.to_s }
end
# Sort an array of objects
@@ -198,6 +222,9 @@ module Jekyll
#
# Returns the filtered array of objects
def sort(input, property = nil, nils = "first")
+ if input.nil?
+ raise ArgumentError.new("Cannot sort a null object.")
+ end
if property.nil?
input.sort
else
@@ -226,11 +253,50 @@ module Jekyll
end
end
+ def pop(array, input = 1)
+ return array unless array.is_a?(Array)
+ new_ary = array.dup
+ new_ary.pop(input.to_i || 1)
+ new_ary
+ end
+
+ def push(array, input)
+ return array unless array.is_a?(Array)
+ new_ary = array.dup
+ new_ary.push(input)
+ new_ary
+ end
+
+ def shift(array, input = 1)
+ return array unless array.is_a?(Array)
+ new_ary = array.dup
+ new_ary.shift(input.to_i || 1)
+ new_ary
+ end
+
+ def unshift(array, input)
+ return array unless array.is_a?(Array)
+ new_ary = array.dup
+ new_ary.unshift(input)
+ new_ary
+ end
+
+ # Convert an object into its String representation for debugging
+ #
+ # input - The Object to be converted
+ #
+ # Returns a String representation of the object.
+ def inspect(input)
+ CGI.escapeHTML(input.inspect)
+ end
+
private
def time(input)
case input
when Time
input
+ when Date
+ input.to_time
when String
Time.parse(input) rescue Time.at(input.to_i)
when Numeric
@@ -238,7 +304,7 @@ module Jekyll
else
Jekyll.logger.error "Invalid Date:", "'#{input}' is not a valid datetime."
exit(1)
- end
+ end.localtime
end
def groupable?(element)
@@ -254,5 +320,27 @@ module Jekyll
item[property.to_s]
end
end
+
+ def as_liquid(item)
+ case item
+ when Hash
+ pairs = item.map { |k, v| as_liquid([k, v]) }
+ Hash[pairs]
+ when Array
+ item.map{ |i| as_liquid(i) }
+ else
+ if item.respond_to?(:to_liquid)
+ liquidated = item.to_liquid
+ # prevent infinite recursion for simple types (which return `self`)
+ if liquidated == item
+ item
+ else
+ as_liquid(liquidated)
+ end
+ else
+ item
+ end
+ end
+ end
end
end
diff --git a/lib/jekyll/frontmatter_defaults.rb b/lib/jekyll/frontmatter_defaults.rb
index e747143..d6cb173 100644
--- a/lib/jekyll/frontmatter_defaults.rb
+++ b/lib/jekyll/frontmatter_defaults.rb
@@ -10,6 +10,26 @@ module Jekyll
@site = site
end
+ def update_deprecated_types(set)
+ return set unless set.key?('scope') && set['scope'].key?('type')
+
+ set['scope']['type'] = case set['scope']['type']
+ when 'page'
+ Deprecator.defaults_deprecate_type('page', 'pages')
+ 'pages'
+ when 'post'
+ Deprecator.defaults_deprecate_type('post', 'posts')
+ 'posts'
+ when 'draft'
+ Deprecator.defaults_deprecate_type('draft', 'drafts')
+ 'drafts'
+ else
+ set['scope']['type']
+ end
+
+ set
+ end
+
# Finds a default value for a given setting, filtered by path and type
#
# path - the path (relative to the source) of the page, post or :draft the default is used in
@@ -21,7 +41,7 @@ module Jekyll
old_scope = nil
matching_sets(path, type).each do |set|
- if set['values'].has_key?(setting) && has_precedence?(old_scope, set['scope'])
+ if set['values'].key?(setting) && has_precedence?(old_scope, set['scope'])
value = set['values'][setting]
old_scope = set['scope']
end
@@ -63,18 +83,29 @@ module Jekyll
end
def applies_path?(scope, path)
- return true if scope['path'].empty?
+ return true if !scope.has_key?('path') || scope['path'].empty?
scope_path = Pathname.new(scope['path'])
Pathname.new(sanitize_path(path)).ascend do |path|
- if path == scope_path
+ if path.to_s == scope_path.to_s
return true
end
end
end
+ # Determines whether the scope applies to type.
+ # The scope applies to the type if:
+ # 1. no 'type' is specified
+ # 2. the 'type' in the scope is the same as the type asked about
+ #
+ # scope - the Hash defaults set being asked about application
+ # type - the type of the document being processed / asked about
+ # its defaults.
+ #
+ # Returns true if either of the above conditions are satisfied,
+ # otherwise returns false
def applies_type?(scope, type)
- !scope.has_key?('type') || scope['type'] == type.to_s
+ !scope.key?('type') || scope['type'].eql?(type.to_s)
end
# Checks if a given set of default values is valid
@@ -83,7 +114,7 @@ module Jekyll
#
# Returns true if the set is valid and can be used in this class
def valid?(set)
- set.is_a?(Hash) && set['scope'].is_a?(Hash) && set['scope']['path'].is_a?(String) && set['values'].is_a?(Hash)
+ set.is_a?(Hash) && set['values'].is_a?(Hash)
end
# Determines if a new scope has precedence over an old one
@@ -100,10 +131,10 @@ module Jekyll
if new_path.length != old_path.length
new_path.length >= old_path.length
- elsif new_scope.has_key? 'type'
+ elsif new_scope.key? 'type'
true
else
- !old_scope.has_key? 'type'
+ !old_scope.key? 'type'
end
end
@@ -112,7 +143,7 @@ module Jekyll
# Returns an array of hashes
def matching_sets(path, type)
valid_sets.select do |set|
- applies?(set['scope'], path, type)
+ !set.has_key?('scope') || applies?(set['scope'], path, type)
end
end
@@ -126,20 +157,23 @@ module Jekyll
sets = @site.config['defaults']
return [] unless sets.is_a?(Array)
- sets.select do |set|
- unless valid?(set)
- Jekyll.logger.warn "Default:", "An invalid default set was found"
+ sets.map do |set|
+ if valid?(set)
+ update_deprecated_types(set)
+ else
+ Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:"
+ Jekyll.logger.warn "#{set}"
+ nil
end
- valid?(set)
- end
+ end.compact
end
- # Sanitizes the given path by removing a leading and addding a trailing slash
+ # Sanitizes the given path by removing a leading and adding a trailing slash
def sanitize_path(path)
if path.nil? || path.empty?
""
else
- path.gsub(/\A\//, '').gsub(/([^\/])\z/, '\1/')
+ path.gsub(/\A\//, '').gsub(/([^\/])\z/, '\1')
end
end
end
diff --git a/lib/jekyll/hooks.rb b/lib/jekyll/hooks.rb
new file mode 100644
index 0000000..a9a5e73
--- /dev/null
+++ b/lib/jekyll/hooks.rb
@@ -0,0 +1,101 @@
+module Jekyll
+ module Hooks
+ DEFAULT_PRIORITY = 20
+
+ # compatibility layer for octopress-hooks users
+ PRIORITY_MAP = {
+ low: 10,
+ normal: 20,
+ high: 30,
+ }.freeze
+
+ # initial empty hooks
+ @registry = {
+ :site => {
+ after_reset: [],
+ post_read: [],
+ pre_render: [],
+ post_render: [],
+ post_write: [],
+ },
+ :pages => {
+ post_init: [],
+ pre_render: [],
+ post_render: [],
+ post_write: [],
+ },
+ :posts => {
+ post_init: [],
+ pre_render: [],
+ post_render: [],
+ post_write: [],
+ },
+ :documents => {
+ post_init: [],
+ pre_render: [],
+ post_render: [],
+ post_write: [],
+ },
+ }
+
+ # map of all hooks and their priorities
+ @hook_priority = {}
+
+ NotAvailable = Class.new(RuntimeError)
+ Uncallable = Class.new(RuntimeError)
+
+ # register hook(s) to be called later, public API
+ def self.register(owners, event, priority: DEFAULT_PRIORITY, &block)
+ Array(owners).each do |owner|
+ register_one(owner, event, priority_value(priority), &block)
+ end
+ end
+
+ # Ensure the priority is a Fixnum
+ def self.priority_value(priority)
+ return priority if priority.is_a?(Fixnum)
+ PRIORITY_MAP[priority] || DEFAULT_PRIORITY
+ end
+
+ # register a single hook to be called later, internal API
+ def self.register_one(owner, event, priority, &block)
+ @registry[owner] ||={
+ post_init: [],
+ pre_render: [],
+ post_render: [],
+ post_write: [],
+ }
+
+ unless @registry[owner][event]
+ raise NotAvailable, "Invalid hook. #{owner} supports only the " <<
+ "following hooks #{@registry[owner].keys.inspect}"
+ end
+
+ unless block.respond_to? :call
+ raise Uncallable, "Hooks must respond to :call"
+ end
+
+ insert_hook owner, event, priority, &block
+ end
+
+ def self.insert_hook(owner, event, priority, &block)
+ @hook_priority[block] = "#{priority}.#{@hook_priority.size}".to_f
+ @registry[owner][event] << block
+ end
+
+ # interface for Jekyll core components to trigger hooks
+ def self.trigger(owner, event, *args)
+ # proceed only if there are hooks to call
+ return unless @registry[owner]
+ return unless @registry[owner][event]
+
+ # hooks to call for this owner and event
+ hooks = @registry[owner][event]
+
+ # sort and call hooks according to priority and load order
+ hooks.sort_by { |h| @hook_priority[h] }.each do |hook|
+ hook.call(*args)
+ end
+ end
+ end
+end
diff --git a/lib/jekyll/layout.rb b/lib/jekyll/layout.rb
index 4dde59b..c29f353 100644
--- a/lib/jekyll/layout.rb
+++ b/lib/jekyll/layout.rb
@@ -8,6 +8,9 @@ module Jekyll
# Gets the name of this layout.
attr_reader :name
+ # Gets the path to this layout.
+ attr_reader :path
+
# Gets/Sets the extension of this layout.
attr_accessor :ext
@@ -26,6 +29,7 @@ module Jekyll
@site = site
@base = base
@name = name
+ @path = site.in_source_dir(base, name)
self.data = {}
diff --git a/lib/jekyll/liquid_renderer.rb b/lib/jekyll/liquid_renderer.rb
new file mode 100644
index 0000000..0edeb44
--- /dev/null
+++ b/lib/jekyll/liquid_renderer.rb
@@ -0,0 +1,39 @@
+require 'jekyll/liquid_renderer/file'
+require 'jekyll/liquid_renderer/table'
+
+module Jekyll
+ class LiquidRenderer
+ def initialize(site)
+ @site = site
+ reset
+ end
+
+ def reset
+ @stats = {}
+ end
+
+ def file(filename)
+ filename = @site.in_source_dir(filename).sub(/\A#{Regexp.escape(@site.source)}\//, '')
+
+ LiquidRenderer::File.new(self, filename).tap do |file|
+ @stats[filename] ||= {}
+ @stats[filename][:count] ||= 0
+ @stats[filename][:count] += 1
+ end
+ end
+
+ def increment_bytes(filename, bytes)
+ @stats[filename][:bytes] ||= 0
+ @stats[filename][:bytes] += bytes
+ end
+
+ def increment_time(filename, time)
+ @stats[filename][:time] ||= 0.0
+ @stats[filename][:time] += time
+ end
+
+ def stats_table(n = 50)
+ LiquidRenderer::Table.new(@stats).to_s(n)
+ end
+ end
+end
diff --git a/lib/jekyll/liquid_renderer/file.rb b/lib/jekyll/liquid_renderer/file.rb
new file mode 100644
index 0000000..f91a5a2
--- /dev/null
+++ b/lib/jekyll/liquid_renderer/file.rb
@@ -0,0 +1,50 @@
+module Jekyll
+ class LiquidRenderer
+ class File
+ def initialize(renderer, filename)
+ @renderer = renderer
+ @filename = filename
+ end
+
+ def parse(content)
+ measure_time do
+ @template = Liquid::Template.parse(content)
+ end
+
+ self
+ end
+
+ def render(*args)
+ measure_time do
+ measure_bytes do
+ @template.render(*args)
+ end
+ end
+ end
+
+ def render!(*args)
+ measure_time do
+ measure_bytes do
+ @template.render!(*args)
+ end
+ end
+ end
+
+ private
+
+ def measure_bytes
+ yield.tap do |str|
+ @renderer.increment_bytes(@filename, str.bytesize)
+ end
+ end
+
+ def measure_time
+ before = Time.now
+ yield
+ ensure
+ after = Time.now
+ @renderer.increment_time(@filename, after - before)
+ end
+ end
+ end
+end
diff --git a/lib/jekyll/liquid_renderer/table.rb b/lib/jekyll/liquid_renderer/table.rb
new file mode 100644
index 0000000..32b09cb
--- /dev/null
+++ b/lib/jekyll/liquid_renderer/table.rb
@@ -0,0 +1,94 @@
+module Jekyll
+ class LiquidRenderer::Table
+ def initialize(stats)
+ @stats = stats
+ end
+
+ def to_s(n = 50)
+ data = data_for_table(n)
+ widths = table_widths(data)
+ generate_table(data, widths)
+ end
+
+ private
+
+ def generate_table(data, widths)
+ str = "\n"
+
+ table_head = data.shift
+ str << generate_row(table_head, widths)
+ str << generate_table_head_border(table_head, widths)
+
+ data.each do |row_data|
+ str << generate_row(row_data, widths)
+ end
+
+ str << "\n"
+ str
+ end
+
+ def generate_table_head_border(row_data, widths)
+ str = ""
+
+ row_data.each_index do |cell_index|
+ str << '-' * widths[cell_index]
+ str << '-+-' unless cell_index == row_data.length-1
+ end
+
+ str << "\n"
+ str
+ end
+
+ def generate_row(row_data, widths)
+ str = ''
+
+ row_data.each_with_index do |cell_data, cell_index|
+ if cell_index == 0
+ str << cell_data.ljust(widths[cell_index], ' ')
+ else
+ str << cell_data.rjust(widths[cell_index], ' ')
+ end
+
+ str << ' | ' unless cell_index == row_data.length-1
+ end
+
+ str << "\n"
+ str
+ end
+
+ def table_widths(data)
+ widths = []
+
+ data.each do |row|
+ row.each_with_index do |cell, index|
+ widths[index] = [ cell.length, widths[index] ].compact.max
+ end
+ end
+
+ widths
+ end
+
+ def data_for_table(n)
+ sorted = @stats.sort_by{ |filename, file_stats| -file_stats[:time] }
+ sorted = sorted.slice(0, n)
+
+ table = [[ 'Filename', 'Count', 'Bytes', 'Time' ]]
+
+ sorted.each do |filename, file_stats|
+ row = []
+ row << filename
+ row << file_stats[:count].to_s
+ row << format_bytes(file_stats[:bytes])
+ row << "%.3f" % file_stats[:time]
+ table << row
+ end
+
+ table
+ end
+
+ def format_bytes(bytes)
+ bytes /= 1024.0
+ "%.2fK" % bytes
+ end
+ end
+end
diff --git a/lib/jekyll/log_adapter.rb b/lib/jekyll/log_adapter.rb
index 63e23fc..df0cfdc 100644
--- a/lib/jekyll/log_adapter.rb
+++ b/lib/jekyll/log_adapter.rb
@@ -1,6 +1,6 @@
module Jekyll
class LogAdapter
- attr_reader :writer
+ attr_reader :writer, :messages
LOG_LEVELS = {
:debug => ::Logger::DEBUG,
@@ -9,13 +9,14 @@ module Jekyll
:error => ::Logger::ERROR
}
- # Public: Create a new instance of Jekyll's log writer
+ # Public: Create a new instance of a log writer
#
# writer - Logger compatible instance
# log_level - (optional, symbol) the log level
#
# Returns nothing
def initialize(writer, level = :info)
+ @messages = []
@writer = writer
self.log_level = level
end
@@ -29,7 +30,17 @@ module Jekyll
writer.level = LOG_LEVELS.fetch(level)
end
- # Public: Print a jekyll debug message
+ def adjust_verbosity(options = {})
+ # Quiet always wins.
+ if options[:quiet]
+ self.log_level = :error
+ elsif options[:verbose]
+ self.log_level = :debug
+ end
+ debug "Logging at level:", LOG_LEVELS.key(writer.level).to_s
+ end
+
+ # Public: Print a debug message
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
@@ -39,7 +50,7 @@ module Jekyll
writer.debug(message(topic, message))
end
- # Public: Print a jekyll message
+ # Public: Print a message
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
@@ -49,7 +60,7 @@ module Jekyll
writer.info(message(topic, message))
end
- # Public: Print a jekyll message
+ # Public: Print a message
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
@@ -59,7 +70,7 @@ module Jekyll
writer.warn(message(topic, message))
end
- # Public: Print a jekyll error message
+ # Public: Print an error message
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
@@ -69,7 +80,7 @@ module Jekyll
writer.error(message(topic, message))
end
- # Public: Print a Jekyll error message and immediately abort the process
+ # Public: Print an error message and immediately abort the process
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail (can be omitted)
@@ -80,14 +91,16 @@ module Jekyll
abort
end
- # Internal: Build a Jekyll topic method
+ # Internal: Build a topic method
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
#
# Returns the formatted message
def message(topic, message)
- formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ')
+ msg = formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ')
+ messages << msg
+ msg
end
# Internal: Format the topic
diff --git a/lib/jekyll/mime.types b/lib/jekyll/mime.types
index ee7aa44..15828b9 100644
--- a/lib/jekyll/mime.types
+++ b/lib/jekyll/mime.types
@@ -1,95 +1,800 @@
--# These are the same MIME types that GitHub Pages uses as of 26 January 2014
+# Woah there. Do not edit this file directly.
+# This file is generated automatically by script/vendor-mimes.
-text/html html htm shtml
-text/css css
-text/xml xml rss xsl xsd
-image/gif gif
-image/jpeg jpeg jpg
-application/x-javascript js
-application/atom+xml atom
-application/json json geojson topojson
-
-text/mathml mml
-text/plain txt
-text/vnd.sun.j2me.app-descriptor jad
-text/vnd.wap.wml wml
-text/x-component htc
-text/cache-manifest manifest appcache
-text/coffeescript coffee
-text/plain pde
-text/plain md markdown
-text/vcard vcf vcard
-
-image/png png
-image/svg+xml svg
-image/svg+xml svgz
-image/tiff tif tiff
-image/vnd.wap.wbmp wbmp
-image/x-icon ico
-image/x-jng jng
-image/x-ms-bmp bmp
-
-application/vnd.ms-fontobject eot
-application/x-font-ttf ttf
-application/x-font-woff woff
-font/opentype otf
-
-application/java-archive jar ear
-application/mac-binhex40 hqx
-application/msword doc
-application/pdf pdf
-application/postscript ps eps ai
-application/rdf+xml rdf
-application/rtf rtf
-application/vnd.apple.pkpass pkpass
-application/vnd.ms-excel xls
-application/vnd.ms-powerpoint ppt
-application/vnd.wap.wmlc wmlc
-application/xhtml+xml xhtml
-application/x-cocoa cco
-application/x-chrome-extension crx
-application/x-java-archive-diff jardiff
-application/x-java-jnlp-file jnlp
-application/x-makeself run
-application/x-ms-application application
-application/x-ms-manifest manifest
-application/x-ms-vsto vsto
-application/x-ns-proxy-autoconfig pac
-application/x-perl pl pm
-application/x-pilot prc pdb
-application/x-rar-compressed rar
-application/x-redhat-package-manager rpm
-application/x-sea sea
-application/x-shockwave-flash swf
-application/x-stuffit sit
-application/x-tcl tcl tk
-application/x-web-app-manifest+json webapp
-application/x-x509-ca-cert der pem crt
-application/x-xpinstall xpi
-application/x-zip war
-application/zip zip
-
-application/octet-stream bin exe dll
-application/octet-stream deb
-application/octet-stream deploy
-application/octet-stream dmg
-application/octet-stream iso img
-application/octet-stream msi msp msm
-
-audio/midi mid midi kar
-audio/mpeg mp3
-audio/x-realaudio ra
-audio/ogg ogg
-
-video/3gpp 3gpp 3gp
-video/m4v m4v
-video/mp4 mp4
-video/mpeg mpeg mpg
-video/ogg ogg ogv
-video/quicktime mov
-video/webm webm
-video/x-flv flv
-video/x-mng mng
-video/x-ms-asf asx asf
-video/x-ms-wmv wmv
-video/x-msvideo avi
+application/andrew-inset ez
+application/applixware aw
+application/atom+xml atom
+application/atomcat+xml atomcat
+application/atomsvc+xml atomsvc
+application/bdoc bdoc
+application/ccxml+xml ccxml
+application/cdmi-capability cdmia
+application/cdmi-container cdmic
+application/cdmi-domain cdmid
+application/cdmi-object cdmio
+application/cdmi-queue cdmiq
+application/cu-seeme cu
+application/dash+xml mdp
+application/davmount+xml davmount
+application/docbook+xml dbk
+application/dssc+der dssc
+application/dssc+xml xdssc
+application/ecmascript ecma
+application/emma+xml emma
+application/epub+zip epub
+application/exi exi
+application/font-tdpfr pfr
+application/font-woff woff
+application/font-woff2 woff2
+application/gml+xml gml
+application/gpx+xml gpx
+application/gxf gxf
+application/hyperstudio stk
+application/inkml+xml ink inkml
+application/ipfix ipfix
+application/java-archive jar war ear
+application/java-serialized-object ser
+application/java-vm class
+application/javascript js
+application/json json map
+application/json5 json5
+application/jsonml+json jsonml
+application/ld+json jsonld
+application/lost+xml lostxml
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+application/mads+xml mads
+application/manifest+json webmanifest
+application/marc mrc
+application/marcxml+xml mrcx
+application/mathematica ma nb mb
+application/mathml+xml mathml
+application/mbox mbox
+application/mediaservercontrol+xml mscml
+application/metalink+xml metalink
+application/metalink4+xml meta4
+application/mets+xml mets
+application/mods+xml mods
+application/mp21 m21 mp21
+application/mp4 mp4s m4p
+application/msword doc dot
+application/mxf mxf
+application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy exe dll deb dmg iso img msi msp msm buffer
+application/oda oda
+application/oebps-package+xml opf
+application/ogg ogx
+application/omdoc+xml omdoc
+application/onenote onetoc onetoc2 onetmp onepkg
+application/oxps oxps
+application/patch-ops-error+xml xer
+application/pdf pdf
+application/pgp-encrypted pgp
+application/pgp-signature asc sig
+application/pics-rules prf
+application/pkcs10 p10
+application/pkcs7-mime p7m p7c
+application/pkcs7-signature p7s
+application/pkcs8 p8
+application/pkix-attr-cert ac
+application/pkix-cert cer
+application/pkix-crl crl
+application/pkix-pkipath pkipath
+application/pkixcmp pki
+application/pls+xml pls
+application/postscript ai eps ps
+application/prs.cww cww
+application/pskc+xml pskcxml
+application/rdf+xml rdf
+application/reginfo+xml rif
+application/relax-ng-compact-syntax rnc
+application/resource-lists+xml rl
+application/resource-lists-diff+xml rld
+application/rls-services+xml rs
+application/rpki-ghostbusters gbr
+application/rpki-manifest mft
+application/rpki-roa roa
+application/rsd+xml rsd
+application/rss+xml rss
+application/rtf rtf
+application/sbml+xml sbml
+application/scvp-cv-request scq
+application/scvp-cv-response scs
+application/scvp-vp-request spq
+application/scvp-vp-response spp
+application/sdp sdp
+application/set-payment-initiation setpay
+application/set-registration-initiation setreg
+application/shf+xml shf
+application/smil+xml smi smil
+application/sparql-query rq
+application/sparql-results+xml srx
+application/srgs gram
+application/srgs+xml grxml
+application/sru+xml sru
+application/ssdl+xml ssdl
+application/ssml+xml ssml
+application/tei+xml tei teicorpus
+application/thraud+xml tfi
+application/timestamped-data tsd
+application/vnd.3gpp.pic-bw-large plb
+application/vnd.3gpp.pic-bw-small psb
+application/vnd.3gpp.pic-bw-var pvb
+application/vnd.3gpp2.tcap tcap
+application/vnd.3m.post-it-notes pwn
+application/vnd.accpac.simply.aso aso
+application/vnd.accpac.simply.imp imp
+application/vnd.acucobol acu
+application/vnd.acucorp atc acutc
+application/vnd.adobe.air-application-installer-package+zip air
+application/vnd.adobe.formscentral.fcdt fcdt
+application/vnd.adobe.fxp fxp fxpl
+application/vnd.adobe.xdp+xml xdp
+application/vnd.adobe.xfdf xfdf
+application/vnd.ahead.space ahead
+application/vnd.airzip.filesecure.azf azf
+application/vnd.airzip.filesecure.azs azs
+application/vnd.amazon.ebook azw
+application/vnd.americandynamics.acc acc
+application/vnd.amiga.ami ami
+application/vnd.android.package-archive apk
+application/vnd.anser-web-certificate-issue-initiation cii
+application/vnd.anser-web-funds-transfer-initiation fti
+application/vnd.antix.game-component atx
+application/vnd.apple.installer+xml mpkg
+application/vnd.apple.mpegurl m3u8
+application/vnd.aristanetworks.swi swi
+application/vnd.astraea-software.iota iota
+application/vnd.audiograph aep
+application/vnd.blueice.multipass mpm
+application/vnd.bmi bmi
+application/vnd.businessobjects rep
+application/vnd.chemdraw+xml cdxml
+application/vnd.chipnuts.karaoke-mmd mmd
+application/vnd.cinderella cdy
+application/vnd.claymore cla
+application/vnd.cloanto.rp9 rp9
+application/vnd.clonk.c4group c4g c4d c4f c4p c4u
+application/vnd.cluetrust.cartomobile-config c11amc
+application/vnd.cluetrust.cartomobile-config-pkg c11amz
+application/vnd.commonspace csp
+application/vnd.contact.cmsg cdbcmsg
+application/vnd.cosmocaller cmc
+application/vnd.crick.clicker clkx
+application/vnd.crick.clicker.keyboard clkk
+application/vnd.crick.clicker.palette clkp
+application/vnd.crick.clicker.template clkt
+application/vnd.crick.clicker.wordbank clkw
+application/vnd.criticaltools.wbs+xml wbs
+application/vnd.ctc-posml pml
+application/vnd.cups-ppd ppd
+application/vnd.curl.car car
+application/vnd.curl.pcurl pcurl
+application/vnd.dart dart
+application/vnd.data-vision.rdz rdz
+application/vnd.dece.data uvf uvvf uvd uvvd
+application/vnd.dece.ttml+xml uvt uvvt
+application/vnd.dece.unspecified uvx uvvx
+application/vnd.dece.zip uvz uvvz
+application/vnd.denovo.fcselayout-link fe_launch
+application/vnd.dna dna
+application/vnd.dolby.mlp mlp
+application/vnd.dpgraph dpg
+application/vnd.dreamfactory dfac
+application/vnd.ds-keypoint kpxx
+application/vnd.dvb.ait ait
+application/vnd.dvb.service svc
+application/vnd.dynageo geo
+application/vnd.ecowin.chart mag
+application/vnd.enliven nml
+application/vnd.epson.esf esf
+application/vnd.epson.msf msf
+application/vnd.epson.quickanime qam
+application/vnd.epson.salt slt
+application/vnd.epson.ssf ssf
+application/vnd.eszigno3+xml es3 et3
+application/vnd.ezpix-album ez2
+application/vnd.ezpix-package ez3
+application/vnd.fdf fdf
+application/vnd.fdsn.mseed mseed
+application/vnd.fdsn.seed seed dataless
+application/vnd.flographit gph
+application/vnd.fluxtime.clip ftc
+application/vnd.framemaker fm frame maker book
+application/vnd.frogans.fnc fnc
+application/vnd.frogans.ltf ltf
+application/vnd.fsc.weblaunch fsc
+application/vnd.fujitsu.oasys oas
+application/vnd.fujitsu.oasys2 oa2
+application/vnd.fujitsu.oasys3 oa3
+application/vnd.fujitsu.oasysgp fg5
+application/vnd.fujitsu.oasysprs bh2
+application/vnd.fujixerox.ddd ddd
+application/vnd.fujixerox.docuworks xdw
+application/vnd.fujixerox.docuworks.binder xbd
+application/vnd.fuzzysheet fzs
+application/vnd.genomatix.tuxedo txd
+application/vnd.geogebra.file ggb
+application/vnd.geogebra.tool ggt
+application/vnd.geometry-explorer gex gre
+application/vnd.geonext gxt
+application/vnd.geoplan g2w
+application/vnd.geospace g3w
+application/vnd.gmx gmx
+application/vnd.google-earth.kml+xml kml
+application/vnd.google-earth.kmz kmz
+application/vnd.grafeq gqf gqs
+application/vnd.groove-account gac
+application/vnd.groove-help ghf
+application/vnd.groove-identity-message gim
+application/vnd.groove-injector grv
+application/vnd.groove-tool-message gtm
+application/vnd.groove-tool-template tpl
+application/vnd.groove-vcard vcg
+application/vnd.hal+xml hal
+application/vnd.handheld-entertainment+xml zmm
+application/vnd.hbci hbci
+application/vnd.hhe.lesson-player les
+application/vnd.hp-hpgl hpgl
+application/vnd.hp-hpid hpid
+application/vnd.hp-hps hps
+application/vnd.hp-jlyt jlt
+application/vnd.hp-pcl pcl
+application/vnd.hp-pclxl pclxl
+application/vnd.hydrostatix.sof-data sfd-hdstx
+application/vnd.ibm.minipay mpy
+application/vnd.ibm.modcap afp listafp list3820
+application/vnd.ibm.rights-management irm
+application/vnd.ibm.secure-container sc
+application/vnd.iccprofile icc icm
+application/vnd.igloader igl
+application/vnd.immervision-ivp ivp
+application/vnd.immervision-ivu ivu
+application/vnd.insors.igm igm
+application/vnd.intercon.formnet xpw xpx
+application/vnd.intergeo i2g
+application/vnd.intu.qbo qbo
+application/vnd.intu.qfx qfx
+application/vnd.ipunplugged.rcprofile rcprofile
+application/vnd.irepository.package+xml irp
+application/vnd.is-xpr xpr
+application/vnd.isac.fcs fcs
+application/vnd.jam jam
+application/vnd.jcp.javame.midlet-rms rms
+application/vnd.jisp jisp
+application/vnd.joost.joda-archive joda
+application/vnd.kahootz ktz ktr
+application/vnd.kde.karbon karbon
+application/vnd.kde.kchart chrt
+application/vnd.kde.kformula kfo
+application/vnd.kde.kivio flw
+application/vnd.kde.kontour kon
+application/vnd.kde.kpresenter kpr kpt
+application/vnd.kde.kspread ksp
+application/vnd.kde.kword kwd kwt
+application/vnd.kenameaapp htke
+application/vnd.kidspiration kia
+application/vnd.kinar kne knp
+application/vnd.koan skp skd skt skm
+application/vnd.kodak-descriptor sse
+application/vnd.las.las+xml lasxml
+application/vnd.llamagraphics.life-balance.desktop lbd
+application/vnd.llamagraphics.life-balance.exchange+xml lbe
+application/vnd.lotus-1-2-3 123
+application/vnd.lotus-approach apr
+application/vnd.lotus-freelance pre
+application/vnd.lotus-notes nsf
+application/vnd.lotus-organizer org
+application/vnd.lotus-screencam scm
+application/vnd.lotus-wordpro lwp
+application/vnd.macports.portpkg portpkg
+application/vnd.mcd mcd
+application/vnd.medcalcdata mc1
+application/vnd.mediastation.cdkey cdkey
+application/vnd.mfer mwf
+application/vnd.mfmp mfm
+application/vnd.micrografx.flo flo
+application/vnd.micrografx.igx igx
+application/vnd.mif mif
+application/vnd.mobius.daf daf
+application/vnd.mobius.dis dis
+application/vnd.mobius.mbk mbk
+application/vnd.mobius.mqy mqy
+application/vnd.mobius.msl msl
+application/vnd.mobius.plc plc
+application/vnd.mobius.txf txf
+application/vnd.mophun.application mpn
+application/vnd.mophun.certificate mpc
+application/vnd.mozilla.xul+xml xul
+application/vnd.ms-artgalry cil
+application/vnd.ms-cab-compressed cab
+application/vnd.ms-excel xls xlm xla xlc xlt xlw
+application/vnd.ms-excel.addin.macroenabled.12 xlam
+application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb
+application/vnd.ms-excel.sheet.macroenabled.12 xlsm
+application/vnd.ms-excel.template.macroenabled.12 xltm
+application/vnd.ms-fontobject eot
+application/vnd.ms-htmlhelp chm
+application/vnd.ms-ims ims
+application/vnd.ms-lrm lrm
+application/vnd.ms-officetheme thmx
+application/vnd.ms-pki.seccat cat
+application/vnd.ms-pki.stl stl
+application/vnd.ms-powerpoint ppt pps pot
+application/vnd.ms-powerpoint.addin.macroenabled.12 ppam
+application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm
+application/vnd.ms-powerpoint.slide.macroenabled.12 sldm
+application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm
+application/vnd.ms-powerpoint.template.macroenabled.12 potm
+application/vnd.ms-project mpp mpt
+application/vnd.ms-word.document.macroenabled.12 docm
+application/vnd.ms-word.template.macroenabled.12 dotm
+application/vnd.ms-works wps wks wcm wdb
+application/vnd.ms-wpl wpl
+application/vnd.ms-xpsdocument xps
+application/vnd.mseq mseq
+application/vnd.musician mus
+application/vnd.muvee.style msty
+application/vnd.mynfc taglet
+application/vnd.neurolanguage.nlu nlu
+application/vnd.nitf ntf nitf
+application/vnd.noblenet-directory nnd
+application/vnd.noblenet-sealer nns
+application/vnd.noblenet-web nnw
+application/vnd.nokia.n-gage.data ngdat
+application/vnd.nokia.n-gage.symbian.install n-gage
+application/vnd.nokia.radio-preset rpst
+application/vnd.nokia.radio-presets rpss
+application/vnd.novadigm.edm edm
+application/vnd.novadigm.edx edx
+application/vnd.novadigm.ext ext
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.chart-template otc
+application/vnd.oasis.opendocument.database odb
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.formula-template odft
+application/vnd.oasis.opendocument.graphics odg
+application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.image odi
+application/vnd.oasis.opendocument.image-template oti
+application/vnd.oasis.opendocument.presentation odp
+application/vnd.oasis.opendocument.presentation-template otp
+application/vnd.oasis.opendocument.spreadsheet ods
+application/vnd.oasis.opendocument.spreadsheet-template ots
+application/vnd.oasis.opendocument.text odt
+application/vnd.oasis.opendocument.text-master odm
+application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.text-web oth
+application/vnd.olpc-sugar xo
+application/vnd.oma.dd2+xml dd2
+application/vnd.openofficeorg.extension oxt
+application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
+application/vnd.openxmlformats-officedocument.presentationml.slide sldx
+application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
+application/vnd.openxmlformats-officedocument.presentationml.template potx
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
+application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx
+application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
+application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
+application/vnd.osgeo.mapguide.package mgp
+application/vnd.osgi.dp dp
+application/vnd.osgi.subsystem esa
+application/vnd.palm pdb pqa oprc
+application/vnd.pawaafile paw
+application/vnd.pg.format str
+application/vnd.pg.osasli ei6
+application/vnd.picsel efif
+application/vnd.pmi.widget wg
+application/vnd.pocketlearn plf
+application/vnd.powerbuilder6 pbd
+application/vnd.previewsystems.box box
+application/vnd.proteus.magazine mgz
+application/vnd.publishare-delta-tree qps
+application/vnd.pvi.ptid1 ptid
+application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb
+application/vnd.realvnc.bed bed
+application/vnd.recordare.musicxml mxl
+application/vnd.recordare.musicxml+xml musicxml
+application/vnd.rig.cryptonote cryptonote
+application/vnd.rim.cod cod
+application/vnd.rn-realmedia rm
+application/vnd.rn-realmedia-vbr rmvb
+application/vnd.route66.link66+xml link66
+application/vnd.sailingtracker.track st
+application/vnd.seemail see
+application/vnd.sema sema
+application/vnd.semd semd
+application/vnd.semf semf
+application/vnd.shana.informed.formdata ifm
+application/vnd.shana.informed.formtemplate itp
+application/vnd.shana.informed.interchange iif
+application/vnd.shana.informed.package ipk
+application/vnd.simtech-mindmapper twd twds
+application/vnd.smaf mmf
+application/vnd.smart.teacher teacher
+application/vnd.solent.sdkm+xml sdkm sdkd
+application/vnd.spotfire.dxp dxp
+application/vnd.spotfire.sfs sfs
+application/vnd.stardivision.calc sdc
+application/vnd.stardivision.draw sda
+application/vnd.stardivision.impress sdd
+application/vnd.stardivision.math smf
+application/vnd.stardivision.writer sdw vor
+application/vnd.stardivision.writer-global sgl
+application/vnd.stepmania.package smzip
+application/vnd.stepmania.stepchart sm
+application/vnd.sun.xml.calc sxc
+application/vnd.sun.xml.calc.template stc
+application/vnd.sun.xml.draw sxd
+application/vnd.sun.xml.draw.template std
+application/vnd.sun.xml.impress sxi
+application/vnd.sun.xml.impress.template sti
+application/vnd.sun.xml.math sxm
+application/vnd.sun.xml.writer sxw
+application/vnd.sun.xml.writer.global sxg
+application/vnd.sun.xml.writer.template stw
+application/vnd.sus-calendar sus susp
+application/vnd.svd svd
+application/vnd.symbian.install sis sisx
+application/vnd.syncml+xml xsm
+application/vnd.syncml.dm+wbxml bdm
+application/vnd.syncml.dm+xml xdm
+application/vnd.tao.intent-module-archive tao
+application/vnd.tcpdump.pcap pcap cap dmp
+application/vnd.tmobile-livetv tmo
+application/vnd.trid.tpt tpt
+application/vnd.triscape.mxs mxs
+application/vnd.trueapp tra
+application/vnd.ufdl ufd ufdl
+application/vnd.uiq.theme utz
+application/vnd.umajin umj
+application/vnd.unity unityweb
+application/vnd.uoml+xml uoml
+application/vnd.vcx vcx
+application/vnd.visio vsd vst vss vsw
+application/vnd.visionary vis
+application/vnd.vsf vsf
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/vnd.webturbo wtb
+application/vnd.wolfram.player nbp
+application/vnd.wordperfect wpd
+application/vnd.wqd wqd
+application/vnd.wt.stf stf
+application/vnd.xara xar
+application/vnd.xfdl xfdl
+application/vnd.yamaha.hv-dic hvd
+application/vnd.yamaha.hv-script hvs
+application/vnd.yamaha.hv-voice hvp
+application/vnd.yamaha.openscoreformat osf
+application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg
+application/vnd.yamaha.smaf-audio saf
+application/vnd.yamaha.smaf-phrase spf
+application/vnd.yellowriver-custom-menu cmp
+application/vnd.zul zir zirz
+application/vnd.zzazz.deck+xml zaz
+application/voicexml+xml vxml
+application/widget wgt
+application/winhlp hlp
+application/wsdl+xml wsdl
+application/wspolicy+xml wspolicy
+application/x-7z-compressed 7z
+application/x-abiword abw
+application/x-ace-compressed ace
+application/x-authorware-bin aab x32 u32 vox
+application/x-authorware-map aam
+application/x-authorware-seg aas
+application/x-bcpio bcpio
+application/x-bittorrent torrent
+application/x-blorb blb blorb
+application/x-bzip bz
+application/x-bzip2 bz2 boz
+application/x-cbr cbr cba cbt cbz cb7
+application/x-cdlink vcd
+application/x-cfs-compressed cfs
+application/x-chat chat
+application/x-chess-pgn pgn
+application/x-chrome-extension crx
+application/x-cocoa cco
+application/x-conference nsc
+application/x-cpio cpio
+application/x-csh csh
+application/x-debian-package udeb
+application/x-dgc-compressed dgc
+application/x-director dir dcr dxr cst cct cxt w3d fgd swa
+application/x-doom wad
+application/x-dtbncx+xml ncx
+application/x-dtbook+xml dtb
+application/x-dtbresource+xml res
+application/x-dvi dvi
+application/x-envoy evy
+application/x-eva eva
+application/x-font-bdf bdf
+application/x-font-ghostscript gsf
+application/x-font-linux-psf psf
+application/x-font-otf otf
+application/x-font-pcf pcf
+application/x-font-snf snf
+application/x-font-ttf ttf ttc
+application/x-font-type1 pfa pfb pfm afm
+application/x-freearc arc
+application/x-futuresplash spl
+application/x-gca-compressed gca
+application/x-glulx ulx
+application/x-gnumeric gnumeric
+application/x-gramps-xml gramps
+application/x-gtar gtar
+application/x-hdf hdf
+application/x-httpd-php php
+application/x-install-instructions install
+application/x-java-archive-diff jardiff
+application/x-java-jnlp-file jnlp
+application/x-latex latex
+application/x-lua-bytecode luac
+application/x-lzh-compressed lzh lha
+application/x-makeself run
+application/x-mie mie
+application/x-mobipocket-ebook prc mobi
+application/x-ms-application application
+application/x-ms-shortcut lnk
+application/x-ms-wmd wmd
+application/x-ms-wmz wmz
+application/x-ms-xbap xbap
+application/x-msaccess mdb
+application/x-msbinder obd
+application/x-mscardfile crd
+application/x-msclip clp
+application/x-msdownload com bat
+application/x-msmediaview mvb m13 m14
+application/x-msmetafile wmf emf emz
+application/x-msmoney mny
+application/x-mspublisher pub
+application/x-msschedule scd
+application/x-msterminal trm
+application/x-mswrite wri
+application/x-netcdf nc cdf
+application/x-ns-proxy-autoconfig pac
+application/x-nzb nzb
+application/x-perl pl pm
+application/x-pkcs12 p12 pfx
+application/x-pkcs7-certificates p7b spc
+application/x-pkcs7-certreqresp p7r
+application/x-rar-compressed rar
+application/x-redhat-package-manager rpm
+application/x-research-info-systems ris
+application/x-sea sea
+application/x-sh sh
+application/x-shar shar
+application/x-shockwave-flash swf
+application/x-silverlight-app xap
+application/x-sql sql
+application/x-stuffit sit
+application/x-stuffitx sitx
+application/x-subrip srt
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-t3vm-image t3
+application/x-tads gam
+application/x-tar tar
+application/x-tcl tcl tk
+application/x-tex tex
+application/x-tex-tfm tfm
+application/x-texinfo texinfo texi
+application/x-tgif obj
+application/x-ustar ustar
+application/x-wais-source src
+application/x-web-app-manifest+json webapp
+application/x-x509-ca-cert der crt pem
+application/x-xfig fig
+application/x-xliff+xml xlf
+application/x-xpinstall xpi
+application/x-xz xz
+application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8
+application/xaml+xml xaml
+application/xcap-diff+xml xdf
+application/xenc+xml xenc
+application/xhtml+xml xhtml xht
+application/xml xml xsl xsd
+application/xml-dtd dtd
+application/xop+xml xop
+application/xproc+xml xpl
+application/xslt+xml xslt
+application/xspf+xml xspf
+application/xv+xml mxml xhvml xvml xvm
+application/yang yang
+application/yin+xml yin
+application/zip zip
+audio/adpcm adp
+audio/basic au snd
+audio/midi mid midi kar rmi
+audio/mp4 mp4a m4a
+audio/mpeg mpga mp2 mp2a mp3 m2a m3a
+audio/ogg oga ogg spx
+audio/s3m s3m
+audio/silk sil
+audio/vnd.dece.audio uva uvva
+audio/vnd.digital-winds eol
+audio/vnd.dra dra
+audio/vnd.dts dts
+audio/vnd.dts.hd dtshd
+audio/vnd.lucent.voice lvp
+audio/vnd.ms-playready.media.pya pya
+audio/vnd.nuera.ecelp4800 ecelp4800
+audio/vnd.nuera.ecelp7470 ecelp7470
+audio/vnd.nuera.ecelp9600 ecelp9600
+audio/vnd.rip rip
+audio/wav wav
+audio/webm weba
+audio/x-aac aac
+audio/x-aiff aif aiff aifc
+audio/x-caf caf
+audio/x-flac flac
+audio/x-matroska mka
+audio/x-mpegurl m3u
+audio/x-ms-wax wax
+audio/x-ms-wma wma
+audio/x-pn-realaudio ram ra
+audio/x-pn-realaudio-plugin rmp
+audio/xm xm
+chemical/x-cdx cdx
+chemical/x-cif cif
+chemical/x-cmdf cmdf
+chemical/x-cml cml
+chemical/x-csml csml
+chemical/x-xyz xyz
+image/bmp bmp
+image/cgm cgm
+image/g3fax g3
+image/gif gif
+image/ief ief
+image/jpeg jpeg jpg jpe
+image/ktx ktx
+image/png png
+image/prs.btif btif
+image/sgi sgi
+image/svg+xml svg svgz
+image/tiff tiff tif
+image/vnd.adobe.photoshop psd
+image/vnd.dece.graphic uvi uvvi uvg uvvg
+image/vnd.djvu djvu djv
+image/vnd.dvb.subtitle sub
+image/vnd.dwg dwg
+image/vnd.dxf dxf
+image/vnd.fastbidsheet fbs
+image/vnd.fpx fpx
+image/vnd.fst fst
+image/vnd.fujixerox.edmics-mmr mmr
+image/vnd.fujixerox.edmics-rlc rlc
+image/vnd.ms-modi mdi
+image/vnd.ms-photo wdp
+image/vnd.net-fpx npx
+image/vnd.wap.wbmp wbmp
+image/vnd.xiff xif
+image/webp webp
+image/x-3ds 3ds
+image/x-cmu-raster ras
+image/x-cmx cmx
+image/x-freehand fh fhc fh4 fh5 fh7
+image/x-icon ico
+image/x-jng jng
+image/x-mrsid-image sid
+image/x-pcx pcx
+image/x-pict pic pct
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-rgb rgb
+image/x-tga tga
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+message/rfc822 eml mime
+model/iges igs iges
+model/mesh msh mesh silo
+model/vnd.collada+xml dae
+model/vnd.dwf dwf
+model/vnd.gdl gdl
+model/vnd.gtw gtw
+model/vnd.mts mts
+model/vnd.vtu vtu
+model/vrml wrl vrml
+model/x3d+binary x3db x3dbz
+model/x3d+vrml x3dv x3dvz
+model/x3d+xml x3d x3dz
+text/cache-manifest appcache manifest
+text/calendar ics ifb
+text/coffeescript coffee litcoffee
+text/css css
+text/csv csv
+text/hjson hjson
+text/html html htm shtml
+text/jade jade
+text/jsx jsx
+text/less less
+text/mathml mml
+text/n3 n3
+text/plain txt text conf def list log in ini
+text/prs.lines.tag dsc
+text/richtext rtx
+text/sgml sgml sgm
+text/stylus stylus styl
+text/tab-separated-values tsv
+text/troff t tr roff man me ms
+text/turtle ttl
+text/uri-list uri uris urls
+text/vcard vcard
+text/vnd.curl curl
+text/vnd.curl.dcurl dcurl
+text/vnd.curl.mcurl mcurl
+text/vnd.curl.scurl scurl
+text/vnd.fly fly
+text/vnd.fmi.flexstor flx
+text/vnd.graphviz gv
+text/vnd.in3d.3dml 3dml
+text/vnd.in3d.spot spot
+text/vnd.sun.j2me.app-descriptor jad
+text/vnd.wap.wml wml
+text/vnd.wap.wmlscript wmls
+text/vtt vtt
+text/x-asm s asm
+text/x-c c cc cxx cpp h hh dic
+text/x-component htc
+text/x-fortran f for f77 f90
+text/x-handlebars-template hbs
+text/x-java-source java
+text/x-lua lua
+text/x-markdown markdown md mkd
+text/x-nfo nfo
+text/x-opml opml
+text/x-pascal p pas
+text/x-processing pde
+text/x-sass sass
+text/x-scss scss
+text/x-setext etx
+text/x-sfv sfv
+text/x-uuencode uu
+text/x-vcalendar vcs
+text/x-vcard vcf
+text/yaml yaml yml
+video/3gpp 3gp 3gpp
+video/3gpp2 3g2
+video/h261 h261
+video/h263 h263
+video/h264 h264
+video/jpeg jpgv
+video/jpm jpm jpgm
+video/mj2 mj2 mjp2
+video/mp2t ts
+video/mp4 mp4 mp4v mpg4
+video/mpeg mpeg mpg mpe m1v m2v
+video/ogg ogv
+video/quicktime qt mov
+video/vnd.dece.hd uvh uvvh
+video/vnd.dece.mobile uvm uvvm
+video/vnd.dece.pd uvp uvvp
+video/vnd.dece.sd uvs uvvs
+video/vnd.dece.video uvv uvvv
+video/vnd.dvb.file dvb
+video/vnd.fvt fvt
+video/vnd.mpegurl mxu m4u
+video/vnd.ms-playready.media.pyv pyv
+video/vnd.uvvu.mp4 uvu uvvu
+video/vnd.vivo viv
+video/webm webm
+video/x-f4v f4v
+video/x-fli fli
+video/x-flv flv
+video/x-m4v m4v
+video/x-matroska mkv mk3d mks
+video/x-mng mng
+video/x-ms-asf asf asx
+video/x-ms-vob vob
+video/x-ms-wm wm
+video/x-ms-wmv wmv
+video/x-ms-wmx wmx
+video/x-ms-wvx wvx
+video/x-msvideo avi
+video/x-sgi-movie movie
+video/x-smv smv
+x-conference/x-cooltalk ice
\ No newline at end of file
diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb
index d045b7c..ca5bb26 100644
--- a/lib/jekyll/page.rb
+++ b/lib/jekyll/page.rb
@@ -35,6 +35,8 @@ module Jekyll
data.default_proc = proc do |hash, key|
site.frontmatter_defaults.find(File.join(dir, name), type, key)
end
+
+ Jekyll::Hooks.trigger :pages, :post_init, self
end
# The generated directory into which the page will be placed
@@ -52,27 +54,19 @@ module Jekyll
# Returns the String permalink or nil if none has been set.
def permalink
return nil if data.nil? || data['permalink'].nil?
- if site.config['relative_permalinks']
- File.join(@dir, data['permalink'])
- else
- data['permalink']
- end
+ data['permalink']
end
# The template of the permalink.
#
# Returns the template String.
def template
- if site.permalink_style == :pretty
- if index? && html?
- "/:path/"
- elsif html?
- "/:path/:basename/"
- else
- "/:path/:basename:output_ext"
- end
- else
+ if !html?
"/:path/:basename:output_ext"
+ elsif index?
+ "/:path/"
+ else
+ Utils.add_permalink_suffix("/:path/:basename", site.permalink_style)
end
end
@@ -126,7 +120,7 @@ module Jekyll
#
# Returns the path to the source file
def path
- data.fetch('path', relative_path.sub(/\A\//, ''))
+ data.fetch('path') { relative_path.sub(/\A\//, '') }
end
# The path to the page source file, relative to the site source
@@ -140,8 +134,9 @@ module Jekyll
#
# Returns the destination file path String.
def destination(dest)
- path = Jekyll.sanitized_path(dest, URL.unescape_path(url))
- path = File.join(path, "index.html") if url =~ /\/$/
+ path = site.in_dest_dir(dest, URL.unescape_path(url))
+ path = File.join(path, "index.html") if url.end_with?("/")
+ path << output_ext unless path.end_with?(output_ext)
path
end
@@ -159,9 +154,5 @@ module Jekyll
def index?
basename == 'index'
end
-
- def uses_relative_permalinks
- permalink && !@dir.empty? && site.config['relative_permalinks']
- end
end
end
diff --git a/lib/jekyll/plugin.rb b/lib/jekyll/plugin.rb
index 94c0b28..0207314 100644
--- a/lib/jekyll/plugin.rb
+++ b/lib/jekyll/plugin.rb
@@ -27,7 +27,7 @@ module Jekyll
# Returns the Symbol priority.
def self.priority(priority = nil)
@priority ||= nil
- if priority && PRIORITIES.has_key?(priority)
+ if priority && PRIORITIES.key?(priority)
@priority = priority
end
@priority || :normal
@@ -56,6 +56,15 @@ module Jekyll
PRIORITIES[other.priority] <=> PRIORITIES[self.priority]
end
+ # Spaceship is priority [higher -> lower]
+ #
+ # other - The class to be compared.
+ #
+ # Returns -1, 0, 1.
+ def <=>(other)
+ self.class <=> other.class
+ end
+
# Initialize a new plugin. This should be overridden by the subclass.
#
# config - The Hash of configuration options.
diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb
index 7b817e3..bc54161 100644
--- a/lib/jekyll/plugin_manager.rb
+++ b/lib/jekyll/plugin_manager.rb
@@ -17,6 +17,7 @@ module Jekyll
def conscientious_require
require_plugin_files
require_gems
+ deprecation_checks
end
# Require each of the gem plugins specified.
@@ -25,11 +26,27 @@ module Jekyll
def require_gems
site.gems.each do |gem|
if plugin_allowed?(gem)
+ Jekyll.logger.debug("PluginManager:", "Requiring #{gem}")
require gem
end
end
end
+ def self.require_from_bundler
+ if !ENV["JEKYLL_NO_BUNDLER_REQUIRE"] && File.file?("Gemfile")
+ require "bundler"
+ Bundler.setup # puts all groups on the load path
+ required_gems = Bundler.require(:jekyll_plugins) # requires the gems in this group only
+ Jekyll.logger.debug("PluginManager:", "Required #{required_gems.map(&:name).join(', ')}")
+ ENV["JEKYLL_NO_BUNDLER_REQUIRE"] = "true"
+ true
+ else
+ false
+ end
+ rescue LoadError, Bundler::GemfileNotFound
+ false
+ end
+
# Check whether a gem plugin is allowed to be used during this build.
#
# gem_name - the name of the gem
@@ -65,10 +82,19 @@ module Jekyll
#
# Returns an Array of plugin search paths
def plugins_path
- if (site.config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
- [Jekyll.sanitized_path(site.source, site.config['plugins'])]
+ if (site.config['plugins_dir'] == Jekyll::Configuration::DEFAULTS['plugins_dir'])
+ [site.in_source_dir(site.config['plugins_dir'])]
else
- Array(site.config['plugins']).map { |d| File.expand_path(d) }
+ Array(site.config['plugins_dir']).map { |d| File.expand_path(d) }
+ end
+ end
+
+ def deprecation_checks
+ pagination_included = (site.config['gems'] || []).include?('jekyll-paginate') || defined?(Jekyll::Paginate)
+ if site.config['paginate'] && !pagination_included
+ Jekyll::Deprecator.deprecation_message "You appear to have pagination " +
+ "turned on, but you haven't included the `jekyll-paginate` gem. " +
+ "Ensure you have `gems: [jekyll-paginate]` in your configuration file."
end
end
diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb
deleted file mode 100644
index e570930..0000000
--- a/lib/jekyll/post.rb
+++ /dev/null
@@ -1,320 +0,0 @@
-module Jekyll
- class Post
- include Comparable
- include Convertible
-
- # Valid post name regex.
- MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/
-
- EXCERPT_ATTRIBUTES_FOR_LIQUID = %w[
- title
- url
- dir
- date
- id
- categories
- next
- previous
- tags
- path
- ]
-
- # Attributes for Liquid templates
- ATTRIBUTES_FOR_LIQUID = EXCERPT_ATTRIBUTES_FOR_LIQUID + %w[
- content
- excerpt
- ]
-
- # Post name validator. Post filenames must be like:
- # 2008-11-05-my-awesome-post.textile
- #
- # Returns true if valid, false if not.
- def self.valid?(name)
- name =~ MATCHER
- end
-
- attr_accessor :site
- attr_accessor :data, :extracted_excerpt, :content, :output, :ext
- attr_accessor :date, :slug, :tags, :categories
-
- attr_reader :name
-
- # Initialize this Post instance.
- #
- # site - The Site.
- # base - The String path to the dir containing the post file.
- # name - The String filename of the post file.
- #
- # Returns the new Post.
- def initialize(site, source, dir, name)
- @site = site
- @dir = dir
- @base = containing_dir(source, dir)
- @name = name
-
- self.categories = dir.downcase.split('/').reject { |x| x.empty? }
- process(name)
- read_yaml(@base, name)
-
- data.default_proc = proc do |hash, key|
- site.frontmatter_defaults.find(File.join(dir, name), type, key)
- end
-
- if data.has_key?('date')
- self.date = Time.parse(data["date"].to_s)
- end
-
- populate_categories
- populate_tags
- end
-
- def published?
- if data.has_key?('published') && data['published'] == false
- false
- else
- true
- end
- end
-
- def populate_categories
- categories_from_data = Utils.pluralized_array_from_hash(data, 'category', 'categories')
- self.categories = (
- Array(categories) + categories_from_data
- ).map {|c| c.to_s.downcase}.flatten.uniq
- end
-
- def populate_tags
- self.tags = Utils.pluralized_array_from_hash(data, "tag", "tags").flatten
- end
-
- # Get the full path to the directory containing the post files
- def containing_dir(source, dir)
- return File.join(source, dir, '_posts')
- end
-
- # Read the YAML frontmatter.
- #
- # base - The String path to the dir containing the file.
- # name - The String filename of the file.
- #
- # Returns nothing.
- def read_yaml(base, name)
- super(base, name)
- self.extracted_excerpt = extract_excerpt
- end
-
- # The post excerpt. This is either a custom excerpt
- # set in YAML front matter or the result of extract_excerpt.
- #
- # Returns excerpt string.
- def excerpt
- data.fetch('excerpt', extracted_excerpt.to_s)
- end
-
- # Public: the Post title, from the YAML Front-Matter or from the slug
- #
- # Returns the post title
- def title
- data.fetch("title", titleized_slug)
- end
-
- # Turns the post slug into a suitable title
- def titleized_slug
- slug.split('-').select {|w| w.capitalize! || w }.join(' ')
- end
-
- # Public: the path to the post relative to the site source,
- # from the YAML Front-Matter or from a combination of
- # the directory it's in, "_posts", and the name of the
- # post file
- #
- # Returns the path to the file relative to the site source
- def path
- data.fetch('path', relative_path.sub(/\A\//, ''))
- end
-
- # The path to the post source file, relative to the site source
- def relative_path
- File.join(*[@dir, "_posts", @name].map(&:to_s).reject(&:empty?))
- end
-
- # Compares Post objects. First compares the Post date. If the dates are
- # equal, it compares the Post slugs.
- #
- # other - The other Post we are comparing to.
- #
- # Returns -1, 0, 1
- def <=>(other)
- cmp = self.date <=> other.date
- if 0 == cmp
- cmp = self.slug <=> other.slug
- end
- return cmp
- end
-
- # Extract information from the post filename.
- #
- # name - The String filename of the post file.
- #
- # Returns nothing.
- def process(name)
- m, cats, date, slug, ext = *name.match(MATCHER)
- self.categories ||= []
- self.categories += (cats || '').downcase.split('/')
- self.date = Time.parse(date)
- self.slug = slug
- self.ext = ext
- rescue ArgumentError
- path = File.join(@dir || "", name)
- msg = "Post '#{path}' does not have a valid date.\n"
- msg << "Fix the date, or exclude the file or directory from being processed"
- raise Errors::FatalException.new(msg)
- end
-
- # The generated directory into which the post will be placed
- # upon generation. This is derived from the permalink or, if
- # permalink is absent, set to the default date
- # e.g. "/2008/11/05/" if the permalink style is :date, otherwise nothing.
- #
- # Returns the String directory.
- def dir
- File.dirname(url)
- end
-
- # The full path and filename of the post. Defined in the YAML of the post
- # body (optional).
- #
- # Returns the String permalink.
- def permalink
- data && data['permalink']
- end
-
- def template
- case site.permalink_style
- when :pretty
- "/:categories/:year/:month/:day/:title/"
- when :none
- "/:categories/:title.html"
- when :date
- "/:categories/:year/:month/:day/:title.html"
- when :ordinal
- "/:categories/:year/:y_day/:title.html"
- else
- site.permalink_style.to_s
- end
- end
-
- # The generated relative url of this post.
- #
- # Returns the String url.
- def url
- @url ||= URL.new({
- :template => template,
- :placeholders => url_placeholders,
- :permalink => permalink
- }).to_s
- end
-
- # Returns a hash of URL placeholder names (as symbols) mapping to the
- # desired placeholder replacements. For details see "url.rb"
- def url_placeholders
- {
- :year => date.strftime("%Y"),
- :month => date.strftime("%m"),
- :day => date.strftime("%d"),
- :title => slug,
- :i_day => date.strftime("%d").to_i.to_s,
- :i_month => date.strftime("%m").to_i.to_s,
- :categories => (categories || []).map { |c| c.to_s }.join('/'),
- :short_month => date.strftime("%b"),
- :short_year => date.strftime("%y"),
- :y_day => date.strftime("%j"),
- :output_ext => output_ext
- }
- end
-
- # The UID for this post (useful in feeds).
- # e.g. /2008/11/05/my-awesome-post
- #
- # Returns the String UID.
- def id
- File.join(dir, slug)
- end
-
- # Calculate related posts.
- #
- # Returns an Array of related Posts.
- def related_posts(posts)
- Jekyll::RelatedPosts.new(self).build
- end
-
- # Add any necessary layouts to this post.
- #
- # layouts - A Hash of {"name" => "layout"}.
- # site_payload - The site payload hash.
- #
- # Returns nothing.
- def render(layouts, site_payload)
- # construct payload
- payload = Utils.deep_merge_hashes({
- "site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) },
- "page" => to_liquid(self.class::EXCERPT_ATTRIBUTES_FOR_LIQUID)
- }, site_payload)
-
- if generate_excerpt?
- extracted_excerpt.do_layout(payload, {})
- end
-
- do_layout(payload.merge({"page" => to_liquid}), layouts)
- end
-
- # Obtain destination path.
- #
- # dest - The String path to the destination dir.
- #
- # Returns destination file path String.
- def destination(dest)
- # The url needs to be unescaped in order to preserve the correct filename
- path = Jekyll.sanitized_path(dest, URL.unescape_path(url))
- path = File.join(path, "index.html") if path[/\.html$/].nil?
- path
- end
-
- # Returns the shorthand String identifier of this Post.
- def inspect
- "<Post: #{id}>"
- end
-
- def next
- pos = site.posts.index {|post| post.equal?(self) }
- if pos && pos < site.posts.length - 1
- site.posts[pos + 1]
- else
- nil
- end
- end
-
- def previous
- pos = site.posts.index {|post| post.equal?(self) }
- if pos && pos > 0
- site.posts[pos - 1]
- else
- nil
- end
- end
-
- protected
-
- def extract_excerpt
- if generate_excerpt?
- Jekyll::Excerpt.new(self)
- else
- ""
- end
- end
-
- def generate_excerpt?
- !(site.config['excerpt_separator'].to_s.empty?)
- end
- end
-end
diff --git a/lib/jekyll/publisher.rb b/lib/jekyll/publisher.rb
index e86e96b..6bb8a88 100644
--- a/lib/jekyll/publisher.rb
+++ b/lib/jekyll/publisher.rb
@@ -15,7 +15,7 @@ module Jekyll
end
def hidden_in_the_future?(thing)
- thing.is_a?(Post) && !@site.future && thing.date > @site.time
+ thing.respond_to?(:date) && !@site.future && thing.date.to_i > @site.time.to_i
end
end
-end
\ No newline at end of file
+end
diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb
new file mode 100644
index 0000000..45a2042
--- /dev/null
+++ b/lib/jekyll/reader.rb
@@ -0,0 +1,126 @@
+# encoding: UTF-8
+require 'csv'
+
+module Jekyll
+ class Reader
+ attr_reader :site
+
+ def initialize(site)
+ @site = site
+ end
+
+ # Read Site data from disk and load it into internal data structures.
+ #
+ # Returns nothing.
+ def read
+ @site.layouts = LayoutReader.new(site).read
+ read_directories
+ sort_files!
+ @site.data = DataReader.new(site).read(site.config['data_dir'])
+ CollectionReader.new(site).read
+ end
+
+ # Sorts posts, pages, and static files.
+ def sort_files!
+ site.collections.values.each{|c| c.docs.sort!}
+ site.pages.sort_by!(&:name)
+ site.static_files.sort_by!(&:relative_path)
+ end
+
+ # Recursively traverse directories to find pages and static files
+ # that will become part of the site according to the rules in
+ # filter_entries.
+ #
+ # dir - The String relative path of the directory to read. Default: ''.
+ #
+ # Returns nothing.
+ def read_directories(dir = '')
+ base = site.in_source_dir(dir)
+
+ dot = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) }
+ dot_dirs = dot.select{ |file| File.directory?(@site.in_source_dir(base,file)) }
+ dot_files = (dot - dot_dirs)
+ dot_pages = dot_files.select{ |file| Utils.has_yaml_header?(@site.in_source_dir(base,file)) }
+ dot_static_files = dot_files - dot_pages
+
+ retrieve_posts(dir)
+ retrieve_dirs(base, dir, dot_dirs)
+ retrieve_pages(dir, dot_pages)
+ retrieve_static_files(dir, dot_static_files)
+ end
+
+ # Retrieves all the posts(posts/drafts) from the given directory
+ # and add them to the site and sort them.
+ #
+ # dir - The String representing the directory to retrieve the posts from.
+ #
+ # Returns nothing.
+ def retrieve_posts(dir)
+ site.posts.docs.concat(PostReader.new(site).read_posts(dir))
+ site.posts.docs.concat(PostReader.new(site).read_drafts(dir)) if site.show_drafts
+ end
+
+ # Recursively traverse directories with the read_directories function.
+ #
+ # base - The String representing the site's base directory.
+ # dir - The String representing the directory to traverse down.
+ # dot_dirs - The Array of subdirectories in the dir.
+ #
+ # Returns nothing.
+ def retrieve_dirs(base, dir, dot_dirs)
+ dot_dirs.map { |file|
+ dir_path = site.in_source_dir(dir,file)
+ rel_path = File.join(dir, file)
+ @site.reader.read_directories(rel_path) unless @site.dest.sub(/\/$/, '') == dir_path
+ }
+ end
+
+ # Retrieve all the pages from the current directory,
+ # add them to the site and sort them.
+ #
+ # dir - The String representing the directory retrieve the pages from.
+ # dot_pages - The Array of pages in the dir.
+ #
+ # Returns nothing.
+ def retrieve_pages(dir, dot_pages)
+ site.pages.concat(PageReader.new(site, dir).read(dot_pages))
+ end
+
+ # Retrieve all the static files from the current directory,
+ # add them to the site and sort them.
+ #
+ # dir - The directory retrieve the static files from.
+ # dot_static_files - The static files in the dir.
+ #
+ # Returns nothing.
+ def retrieve_static_files(dir, dot_static_files)
+ site.static_files.concat(StaticFileReader.new(site, dir).read(dot_static_files))
+ end
+
+ # Filter out any files/directories that are hidden or backup files (start
+ # with "." or "#" or end with "~"), or contain site content (start with "_"),
+ # or are excluded in the site configuration, unless they are web server
+ # files such as '.htaccess'.
+ #
+ # entries - The Array of String file/directory entries to filter.
+ # base_directory - The string representing the optional base directory.
+ #
+ # Returns the Array of filtered entries.
+ def filter_entries(entries, base_directory = nil)
+ EntryFilter.new(site, base_directory).filter(entries)
+ end
+
+ # Read the entries from a particular directory for processing
+ #
+ # dir - The String representing the relative path of the directory to read.
+ # subfolder - The String representing the directory to read.
+ #
+ # Returns the list of entries to process
+ def get_entries(dir, subfolder)
+ base = site.in_source_dir(dir, subfolder)
+ return [] unless File.exist?(base)
+ entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) }
+ entries.delete_if { |e| File.directory?(site.in_source_dir(base, e)) }
+ end
+ end
+end
diff --git a/lib/jekyll/readers/collection_reader.rb b/lib/jekyll/readers/collection_reader.rb
new file mode 100644
index 0000000..6a54321
--- /dev/null
+++ b/lib/jekyll/readers/collection_reader.rb
@@ -0,0 +1,21 @@
+module Jekyll
+ class CollectionReader
+ SPECIAL_COLLECTIONS = %w{posts data}.freeze
+
+ attr_reader :site, :content
+ def initialize(site)
+ @site = site
+ @content = {}
+ end
+
+ # Read in all collections specified in the configuration
+ #
+ # Returns nothing.
+ def read
+ site.collections.each do |_, collection|
+ collection.read unless SPECIAL_COLLECTIONS.include?(collection.label)
+ end
+ end
+
+ end
+end
diff --git a/lib/jekyll/readers/data_reader.rb b/lib/jekyll/readers/data_reader.rb
new file mode 100644
index 0000000..cbb24be
--- /dev/null
+++ b/lib/jekyll/readers/data_reader.rb
@@ -0,0 +1,69 @@
+module Jekyll
+ class DataReader
+ attr_reader :site, :content
+ def initialize(site)
+ @site = site
+ @content = {}
+ end
+
+ # Read all the files in <source>/<dir>/_drafts and create a new Draft
+ # object with each one.
+ #
+ # dir - The String relative path of the directory to read.
+ #
+ # Returns nothing.
+ def read(dir)
+ base = site.in_source_dir(dir)
+ read_data_to(base, @content)
+ @content
+ end
+
+ # Read and parse all yaml files under <dir> and add them to the
+ # <data> variable.
+ #
+ # dir - The string absolute path of the directory to read.
+ # data - The variable to which data will be added.
+ #
+ # Returns nothing
+ def read_data_to(dir, data)
+ return unless File.directory?(dir) && (!site.safe || !File.symlink?(dir))
+
+ entries = Dir.chdir(dir) do
+ Dir['*.{yaml,yml,json,csv}'] + Dir['*'].select { |fn| File.directory?(fn) }
+ end
+
+ entries.each do |entry|
+ path = @site.in_source_dir(dir, entry)
+ next if File.symlink?(path) && site.safe
+
+ key = sanitize_filename(File.basename(entry, '.*'))
+ if File.directory?(path)
+ read_data_to(path, data[key] = {})
+ else
+ data[key] = read_data_file(path)
+ end
+ end
+ end
+
+ # Determines how to read a data file.
+ #
+ # Returns the contents of the data file.
+ def read_data_file(path)
+ case File.extname(path).downcase
+ when '.csv'
+ CSV.read(path, {
+ :headers => true,
+ :encoding => site.config['encoding']
+ }).map(&:to_hash)
+ else
+ SafeYAML.load_file(path)
+ end
+ end
+
+ def sanitize_filename(name)
+ name.gsub!(/[^\w\s-]+/, '')
+ name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
+ name.gsub(/\s+/, '_')
+ end
+ end
+end
diff --git a/lib/jekyll/layout_reader.rb b/lib/jekyll/readers/layout_reader.rb
similarity index 84%
rename from lib/jekyll/layout_reader.rb
rename to lib/jekyll/readers/layout_reader.rb
index a9172c0..f062029 100644
--- a/lib/jekyll/layout_reader.rb
+++ b/lib/jekyll/readers/layout_reader.rb
@@ -38,12 +38,12 @@ module Jekyll
end
def layout_directory_inside_source
- Jekyll.sanitized_path(site.source, site.config['layouts'])
+ site.in_source_dir(site.config['layouts_dir'])
end
def layout_directory_in_cwd
- dir = Jekyll.sanitized_path(Dir.pwd, site.config['layouts'])
- if File.directory?(dir)
+ dir = Jekyll.sanitized_path(Dir.pwd, site.config['layouts_dir'])
+ if File.directory?(dir) && !site.safe
dir
else
nil
diff --git a/lib/jekyll/readers/page_reader.rb b/lib/jekyll/readers/page_reader.rb
new file mode 100644
index 0000000..099ebf1
--- /dev/null
+++ b/lib/jekyll/readers/page_reader.rb
@@ -0,0 +1,21 @@
+module Jekyll
+ class PageReader
+ attr_reader :site, :dir, :unfiltered_content
+ def initialize(site, dir)
+ @site = site
+ @dir = dir
+ @unfiltered_content = Array.new
+ end
+
+ # Read all the files in <source>/<dir>/ for Yaml header and create a new Page
+ # object for each file.
+ #
+ # dir - The String relative path of the directory to read.
+ #
+ # Returns an array of static pages.
+ def read(files)
+ files.map{ |page| @unfiltered_content << Page.new(@site, @site.source, @dir, page) }
+ @unfiltered_content.select{ |page| site.publisher.publish?(page) }
+ end
+ end
+end
diff --git a/lib/jekyll/readers/post_reader.rb b/lib/jekyll/readers/post_reader.rb
new file mode 100644
index 0000000..c41ef10
--- /dev/null
+++ b/lib/jekyll/readers/post_reader.rb
@@ -0,0 +1,62 @@
+module Jekyll
+ class PostReader
+ attr_reader :site, :unfiltered_content
+ def initialize(site)
+ @site = site
+ end
+
+ # Read all the files in <source>/<dir>/_drafts and create a new
+ # Document object with each one.
+ #
+ # dir - The String relative path of the directory to read.
+ #
+ # Returns nothing.
+ def read_drafts(dir)
+ read_publishable(dir, '_drafts', Document::DATELESS_FILENAME_MATCHER)
+ end
+
+ # Read all the files in <source>/<dir>/_posts and create a new Document
+ # object with each one.
+ #
+ # dir - The String relative path of the directory to read.
+ #
+ # Returns nothing.
+ def read_posts(dir)
+ read_publishable(dir, '_posts', Document::DATE_FILENAME_MATCHER)
+ end
+
+ # Read all the files in <source>/<dir>/<magic_dir> and create a new
+ # Document object with each one insofar as it matches the regexp matcher.
+ #
+ # dir - The String relative path of the directory to read.
+ #
+ # Returns nothing.
+ def read_publishable(dir, magic_dir, matcher)
+ read_content(dir, magic_dir, matcher).tap do |docs|
+ docs.each(&:read)
+ end.select do |doc|
+ site.publisher.publish?(doc)
+ end
+ end
+
+ # Read all the content files from <source>/<dir>/magic_dir
+ # and return them with the type klass.
+ #
+ # dir - The String relative path of the directory to read.
+ # magic_dir - The String relative directory to <dir>,
+ # looks for content here.
+ # klass - The return type of the content.
+ #
+ # Returns klass type of content files
+ def read_content(dir, magic_dir, matcher)
+ @site.reader.get_entries(dir, magic_dir).map do |entry|
+ next unless entry =~ matcher
+ path = @site.in_source_dir(File.join(dir, magic_dir, entry))
+ Document.new(path, {
+ site: @site,
+ collection: @site.posts
+ })
+ end.reject(&:nil?)
+ end
+ end
+end
diff --git a/lib/jekyll/readers/static_file_reader.rb b/lib/jekyll/readers/static_file_reader.rb
new file mode 100644
index 0000000..279bea4
--- /dev/null
+++ b/lib/jekyll/readers/static_file_reader.rb
@@ -0,0 +1,21 @@
+module Jekyll
+ class StaticFileReader
+ attr_reader :site, :dir, :unfiltered_content
+ def initialize(site, dir)
+ @site = site
+ @dir = dir
+ @unfiltered_content = Array.new
+ end
+
+ # Read all the files in <source>/<dir>/ for Yaml header and create a new Page
+ # object for each file.
+ #
+ # dir - The String relative path of the directory to read.
+ #
+ # Returns an array of static files.
+ def read(files)
+ files.map{ |file| @unfiltered_content << StaticFile.new(@site, @site.source, @dir, file)}
+ @unfiltered_content
+ end
+ end
+end
diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb
new file mode 100644
index 0000000..2d84ee3
--- /dev/null
+++ b/lib/jekyll/regenerator.rb
@@ -0,0 +1,176 @@
+module Jekyll
+ class Regenerator
+ attr_reader :site, :metadata, :cache
+
+ def initialize(site)
+ @site = site
+
+ # Read metadata from file
+ read_metadata
+
+ # Initialize cache to an empty hash
+ clear_cache
+ end
+
+ # Checks if a renderable object needs to be regenerated
+ #
+ # Returns a boolean.
+ def regenerate?(document)
+ case document
+ when Page
+ document.asset_file? || document.data['regenerate'] ||
+ source_modified_or_dest_missing?(
+ site.in_source_dir(document.relative_path), document.destination(@site.dest)
+ )
+ when Document
+ !document.write? || document.data['regenerate'] ||
+ source_modified_or_dest_missing?(
+ document.path, document.destination(@site.dest)
+ )
+ else
+ source_path = document.respond_to?(:path) ? document.path : nil
+ dest_path = document.respond_to?(:destination) ? document.destination(@site.dest) : nil
+ source_modified_or_dest_missing?(source_path, dest_path)
+ end
+ end
+
+ # Add a path to the metadata
+ #
+ # Returns true, also on failure.
+ def add(path)
+ return true unless File.exist?(path)
+
+ metadata[path] = {
+ "mtime" => File.mtime(path),
+ "deps" => []
+ }
+ cache[path] = true
+ end
+
+ # Force a path to regenerate
+ #
+ # Returns true.
+ def force(path)
+ cache[path] = true
+ end
+
+ # Clear the metadata and cache
+ #
+ # Returns nothing
+ def clear
+ @metadata = {}
+ clear_cache
+ end
+
+
+ # Clear just the cache
+ #
+ # Returns nothing
+ def clear_cache
+ @cache = {}
+ end
+
+
+ # Checks if the source has been modified or the
+ # destination is missing
+ #
+ # returns a boolean
+ def source_modified_or_dest_missing?(source_path, dest_path)
+ modified?(source_path) || (dest_path and !File.exist?(dest_path))
+ end
+
+ # Checks if a path's (or one of its dependencies)
+ # mtime has changed
+ #
+ # Returns a boolean.
+ def modified?(path)
+ return true if disabled?
+
+ # objects that don't have a path are always regenerated
+ return true if path.nil?
+
+ # Check for path in cache
+ if cache.has_key? path
+ return cache[path]
+ end
+
+ # Check path that exists in metadata
+ data = metadata[path]
+ if data
+ data["deps"].each do |dependency|
+ if modified?(dependency)
+ return cache[dependency] = cache[path] = true
+ end
+ end
+ if File.exist?(path) && data["mtime"].eql?(File.mtime(path))
+ return cache[path] = false
+ else
+ return add(path)
+ end
+ end
+
+ # Path does not exist in metadata, add it
+ return add(path)
+ end
+
+ # Add a dependency of a path
+ #
+ # Returns nothing.
+ def add_dependency(path, dependency)
+ return if (metadata[path].nil? || @disabled)
+
+ if !metadata[path]["deps"].include? dependency
+ metadata[path]["deps"] << dependency
+ add(dependency) unless metadata.include?(dependency)
+ end
+ regenerate? dependency
+ end
+
+ # Write the metadata to disk
+ #
+ # Returns nothing.
+ def write_metadata
+ unless disabled?
+ File.binwrite(metadata_file, Marshal.dump(metadata))
+ end
+ end
+
+ # Produce the absolute path of the metadata file
+ #
+ # Returns the String path of the file.
+ def metadata_file
+ site.in_source_dir('.jekyll-metadata')
+ end
+
+ # Check if metadata has been disabled
+ #
+ # Returns a Boolean (true for disabled, false for enabled).
+ def disabled?
+ @disabled = !site.incremental? if @disabled.nil?
+ @disabled
+ end
+
+ private
+
+ # Read metadata from the metadata file, if no file is found,
+ # initialize with an empty hash
+ #
+ # Returns the read metadata.
+ def read_metadata
+ @metadata = if !disabled? && File.file?(metadata_file)
+ content = File.binread(metadata_file)
+
+ begin
+ Marshal.load(content)
+ rescue TypeError
+ SafeYAML.load(content)
+ rescue ArgumentError => e
+ Jekyll.logger.warn("Failed to load #{metadata_file}: #{e}")
+ {}
+ end
+ else
+ {}
+ end
+ end
+ end
+end
diff --git a/lib/jekyll/related_posts.rb b/lib/jekyll/related_posts.rb
index bc71ebd..fbc2837 100644
--- a/lib/jekyll/related_posts.rb
+++ b/lib/jekyll/related_posts.rb
@@ -10,11 +10,11 @@ module Jekyll
def initialize(post)
@post = post
@site = post.site
- require 'classifier' if site.lsi
+ Jekyll::External.require_with_graceful_fail('classifier-reborn') if site.lsi
end
def build
- return [] unless site.posts.size > 1
+ return [] unless site.posts.docs.size > 1
if site.lsi
build_index
@@ -27,10 +27,10 @@ module Jekyll
def build_index
self.class.lsi ||= begin
- lsi = Classifier::LSI.new(:auto_rebuild => false)
+ lsi = ClassifierReborn::LSI.new(:auto_rebuild => false)
display("Populating LSI...")
- site.posts.each do |x|
+ site.posts.docs.each do |x|
lsi.add_item(x)
end
@@ -42,12 +42,11 @@ module Jekyll
end
def lsi_related_posts
- self.class.lsi.find_related(post.content, 11) - [post]
+ self.class.lsi.find_related(post, 11)
end
def most_recent_posts
- recent_posts = site.posts.reverse - [post]
- recent_posts.first(10)
+ @most_recent_posts ||= (site.posts.docs.reverse - [post]).first(10)
end
def display(output)
diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb
index 25a1552..529ff84 100644
--- a/lib/jekyll/renderer.rb
+++ b/lib/jekyll/renderer.rb
@@ -1,11 +1,14 @@
+# encoding: UTF-8
+
module Jekyll
class Renderer
- attr_reader :document, :site
+ attr_reader :document, :site, :site_payload
- def initialize(site, document)
- @site = site
- @document = document
+ def initialize(site, document, site_payload = nil)
+ @site = site
+ @document = document
+ @site_payload = site_payload
end
# Determine which converters to use based on this document's
@@ -20,7 +23,7 @@ module Jekyll
#
# Returns the output extname including the leading period.
def output_ext
- converters.first.output_ext(document.extname)
+ @output_ext ||= converters.first.output_ext(document.extname)
end
######################
@@ -28,9 +31,18 @@ module Jekyll
######################
def run
+ Jekyll.logger.debug "Rendering:", document.relative_path
+
payload = Utils.deep_merge_hashes({
"page" => document.to_liquid
- }, site.site_payload)
+ }, site_payload || site.site_payload)
+
+ if document.collection.label == 'posts' && document.is_a?(Document)
+ payload['site']['related_posts'] = document.related_posts
+ end
+
+ Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path
+ document.trigger_hooks(:pre_render, payload)
info = {
filters: [Jekyll::Filters],
@@ -44,17 +56,23 @@ module Jekyll
output = document.content
if document.render_with_liquid?
- output = render_liquid(output, payload, info)
+ Jekyll.logger.debug "Rendering Liquid:", document.relative_path
+ output = render_liquid(output, payload, info, document.path)
end
+ Jekyll.logger.debug "Rendering Markup:", document.relative_path
+ output = convert(output)
+ document.content = output
+
if document.place_in_layout?
+ Jekyll.logger.debug "Rendering Layout:", document.relative_path
place_in_layouts(
- convert(output),
+ output,
payload,
info
)
else
- convert(output)
+ output
end
end
@@ -68,7 +86,8 @@ module Jekyll
begin
converter.convert output
rescue => e
- Jekyll.logger.error "Conversion error:", "#{converter.class} encountered an error converting '#{document.relative_path}'."
+ Jekyll.logger.error "Conversion error:", "#{converter.class} encountered an error while converting '#{document.relative_path}':"
+ Jekyll.logger.error("", e.to_s)
raise e
end
end
@@ -83,7 +102,7 @@ module Jekyll
#
# Returns the content, rendered by Liquid.
def render_liquid(content, payload, info, path = nil)
- Liquid::Template.parse(content).render!(payload, info)
+ site.liquid_renderer.file(path).parse(content).render!(payload, info)
rescue Tags::IncludeTagError => e
Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || document.relative_path}"
raise e
@@ -129,9 +148,15 @@ module Jekyll
layout.content,
payload,
info,
- File.join(site.config['layouts'], layout.name)
+ File.join(site.config['layouts_dir'], layout.name)
)
+ # Add layout to dependency tree
+ site.regenerator.add_dependency(
+ site.in_source_dir(document.path),
+ site.in_source_dir(layout.path)
+ ) if document.write?
+
if layout = site.layouts[layout.data["layout"]]
if used.include?(layout)
layout = nil # avoid recursive chain
diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb
index 15bacb1..5e9402f 100644
--- a/lib/jekyll/site.rb
+++ b/lib/jekyll/site.rb
@@ -1,27 +1,39 @@
+# encoding: UTF-8
+require 'csv'
+
module Jekyll
class Site
- attr_accessor :config, :layouts, :posts, :pages, :static_files,
- :exclude, :include, :source, :dest, :lsi, :highlighter,
- :permalink_style, :time, :future, :unpublished, :safe, :plugins, :limit_posts,
- :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems,
- :plugin_manager
+ attr_reader :source, :dest, :config
+ attr_accessor :layouts, :pages, :static_files, :drafts,
+ :exclude, :include, :lsi, :highlighter, :permalink_style,
+ :time, :future, :unpublished, :safe, :plugins, :limit_posts,
+ :show_drafts, :keep_files, :baseurl, :data, :file_read_opts,
+ :gems, :plugin_manager
- attr_accessor :converters, :generators
+ attr_accessor :converters, :generators, :reader
+ attr_reader :regenerator, :liquid_renderer
# Public: Initialize a new Site.
#
# config - A Hash containing site configuration details.
def initialize(config)
- self.config = config.clone
+ @config = config.clone
%w[safe lsi highlighter baseurl exclude include future unpublished
show_drafts limit_posts keep_files gems].each do |opt|
self.send("#{opt}=", config[opt])
end
- self.source = File.expand_path(config['source'])
- self.dest = File.expand_path(config['destination'])
- self.permalink_style = config['permalink'].to_sym
+ # Source and destination may not be changed after the site has been created.
+ @source = File.expand_path(config['source']).freeze
+ @dest = File.expand_path(config['destination']).freeze
+
+ @reader = Jekyll::Reader.new(self)
+
+ # Initialize incremental regenerator
+ @regenerator = Regenerator.new(self)
+
+ @liquid_renderer = LiquidRenderer.new(self)
self.plugin_manager = Jekyll::PluginManager.new(self)
self.plugins = plugin_manager.plugins_path
@@ -29,6 +41,10 @@ module Jekyll
self.file_read_opts = {}
self.file_read_opts[:encoding] = config['encoding'] if config['encoding']
+ self.permalink_style = config['permalink'].to_sym
+
+ Jekyll.sites << self
+
reset
setup
end
@@ -43,23 +59,33 @@ module Jekyll
render
cleanup
write
+ print_stats
+ end
+
+ def print_stats
+ if @config['profile']
+ puts @liquid_renderer.stats_table
+ end
end
# Reset Site details.
#
# Returns nothing
def reset
- self.time = (config['time'] ? Time.parse(config['time'].to_s) : Time.now)
+ self.time = (config['time'] ? Utils.parse_date(config['time'].to_s, "Invalid time in _config.yml.") : Time.now)
self.layouts = {}
- self.posts = []
self.pages = []
self.static_files = []
self.data = {}
@collections = nil
+ @regenerator.clear_cache
+ @liquid_renderer.reset
if limit_posts < 0
raise ArgumentError, "limit_posts must be a non-negative number"
end
+
+ Jekyll::Hooks.trigger :site, :after_reset, self
end
# Load necessary libraries, plugins, converters, and generators.
@@ -115,124 +141,9 @@ module Jekyll
#
# Returns nothing.
def read
- self.layouts = LayoutReader.new(self).read
- read_directories
- read_data(config['data_source'])
- read_collections
- end
-
- # Recursively traverse directories to find posts, pages and static files
- # that will become part of the site according to the rules in
- # filter_entries.
- #
- # dir - The String relative path of the directory to read. Default: ''.
- #
- # Returns nothing.
- def read_directories(dir = '')
- base = File.join(source, dir)
- entries = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) }
-
- read_posts(dir)
- read_drafts(dir) if show_drafts
- posts.sort!
- limit_posts! if limit_posts > 0 # limit the posts if :limit_posts option is set
-
- entries.each do |f|
- f_abs = File.join(base, f)
- if File.directory?(f_abs)
- f_rel = File.join(dir, f)
- read_directories(f_rel) unless dest.sub(/\/$/, '') == f_abs
- elsif has_yaml_header?(f_abs)
- page = Page.new(self, source, dir, f)
- pages << page if publisher.publish?(page)
- else
- static_files << StaticFile.new(self, source, dir, f)
- end
- end
-
- pages.sort_by!(&:name)
- end
-
- # Read all the files in <source>/<dir>/_posts and create a new Post
- # object with each one.
- #
- # dir - The String relative path of the directory to read.
- #
- # Returns nothing.
- def read_posts(dir)
- posts = read_content(dir, '_posts', Post)
-
- posts.each do |post|
- aggregate_post_info(post) if publisher.publish?(post)
- end
- end
-
- # Read all the files in <source>/<dir>/_drafts and create a new Post
- # object with each one.
- #
- # dir - The String relative path of the directory to read.
- #
- # Returns nothing.
- def read_drafts(dir)
- drafts = read_content(dir, '_drafts', Draft)
-
- drafts.each do |draft|
- if draft.published?
- aggregate_post_info(draft)
- end
- end
- end
-
- def read_content(dir, magic_dir, klass)
- get_entries(dir, magic_dir).map do |entry|
- klass.new(self, source, dir, entry) if klass.valid?(entry)
- end.reject do |entry|
- entry.nil?
- end
- end
-
- # Read and parse all yaml files under <source>/<dir>
- #
- # Returns nothing
- def read_data(dir)
- base = Jekyll.sanitized_path(source, dir)
- read_data_to(base, self.data)
- end
-
- # Read and parse all yaml files under <dir> and add them to the
- # <data> variable.
- #
- # dir - The string absolute path of the directory to read.
- # data - The variable to which data will be added.
- #
- # Returns nothing
- def read_data_to(dir, data)
- return unless File.directory?(dir) && (!safe || !File.symlink?(dir))
-
- entries = Dir.chdir(dir) do
- Dir['*.{yaml,yml,json}'] + Dir['*'].select { |fn| File.directory?(fn) }
- end
-
- entries.each do |entry|
- path = Jekyll.sanitized_path(dir, entry)
- next if File.symlink?(path) && safe
-
- key = sanitize_filename(File.basename(entry, '.*'))
- if File.directory?(path)
- read_data_to(path, data[key] = {})
- else
- data[key] = SafeYAML.load_file(path)
- end
- end
- end
-
- # Read in all collections specified in the configuration
- #
- # Returns nothing.
- def read_collections
- collections.each do |_, collection|
- collection.read unless collection.label.eql?("data")
- end
+ reader.read
+ limit_posts!
+ Jekyll::Hooks.trigger :site, :post_read, self
end
# Run each of the Generators.
@@ -248,19 +159,29 @@ module Jekyll
#
# Returns nothing.
def render
- relative_permalinks_deprecation_method
+ relative_permalinks_are_deprecated
+
+ payload = site_payload
+
+ Jekyll::Hooks.trigger :site, :pre_render, self, payload
collections.each do |label, collection|
collection.docs.each do |document|
- document.output = Jekyll::Renderer.new(self, document).run
+ if regenerator.regenerate?(document)
+ document.output = Jekyll::Renderer.new(self, document, payload).run
+ document.trigger_hooks(:post_render)
+ end
end
end
- payload = site_payload
- [posts, pages].flatten.each do |page_or_post|
- page_or_post.render(layouts, payload)
+ pages.flatten.each do |page|
+ if regenerator.regenerate?(page)
+ page.render(layouts, payload)
+ end
end
- rescue Errno::ENOENT => e
+
+ Jekyll::Hooks.trigger :site, :post_render, self, payload
+ rescue Errno::ENOENT
# ignore missing layout dir
end
@@ -275,7 +196,15 @@ module Jekyll
#
# Returns nothing.
def write
- each_site_file { |item| item.write(dest) }
+ each_site_file { |item|
+ item.write(dest) if regenerator.regenerate?(item)
+ }
+ regenerator.write_metadata
+ Jekyll::Hooks.trigger :site, :post_write, self
+ end
+
+ def posts
+ collections['posts'] ||= Collection.new(self, 'posts')
end
# Construct a Hash of Posts indexed by the specified Post attribute.
@@ -295,7 +224,7 @@ module Jekyll
# Build a hash map based on the specified post attribute ( post attr =>
# array of posts ) then sort each array in reverse order.
hash = Hash.new { |h, key| h[key] = [] }
- posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } }
+ posts.docs.each { |p| p.data[post_attr].each { |t| hash[t] << p } }
hash.values.each { |posts| posts.sort!.reverse! }
hash
end
@@ -338,43 +267,26 @@ module Jekyll
"site" => Utils.deep_merge_hashes(config,
Utils.deep_merge_hashes(Hash[collections.map{|label, coll| [label, coll.docs]}], {
"time" => time,
- "posts" => posts.sort { |a, b| b <=> a },
+ "posts" => posts.docs.sort { |a, b| b <=> a },
"pages" => pages,
- "static_files" => static_files.sort { |a, b| a.relative_path <=> b.relative_path },
+ "static_files" => static_files,
"html_pages" => pages.select { |page| page.html? || page.url.end_with?("/") },
"categories" => post_attr_hash('categories'),
"tags" => post_attr_hash('tags'),
- "collections" => collections,
+ "collections" => collections.values.map(&:to_liquid),
"documents" => documents,
"data" => site_data
}))
}
end
- # Filter out any files/directories that are hidden or backup files (start
- # with "." or "#" or end with "~"), or contain site content (start with "_"),
- # or are excluded in the site configuration, unless they are web server
- # files such as '.htaccess'.
- #
- # entries - The Array of String file/directory entries to filter.
- #
- # Returns the Array of filtered entries.
- def filter_entries(entries, base_directory = nil)
- EntryFilter.new(self, base_directory).filter(entries)
- end
-
# Get the implementation class for the given Converter.
#
# klass - The Class of the Converter to fetch.
#
# Returns the Converter instance implementing the given Converter.
- def getConverterImpl(klass)
- matches = converters.select { |c| c.class == klass }
- if impl = matches.first
- impl
- else
- raise "Converter implementation not found for #{klass}"
- end
+ def find_converter_instance(klass)
+ converters.find { |c| c.class == klass } || proc { raise "No converter for #{klass}" }.call
end
# Create array of instances of the subclasses of the class or module
@@ -392,87 +304,109 @@ module Jekyll
end
end
- # Read the entries from a particular directory for processing
- #
- # dir - The String relative path of the directory to read
- # subfolder - The String directory to read
- #
- # Returns the list of entries to process
- def get_entries(dir, subfolder)
- base = File.join(source, dir, subfolder)
- return [] unless File.exist?(base)
- entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) }
- entries.delete_if { |e| File.directory?(File.join(base, e)) }
- end
-
- # Aggregate post information
- #
- # post - The Post object to aggregate information for
+ # Warns the user if permanent links are relative to the parent
+ # directory. As this is a deprecated function of Jekyll.
#
- # Returns nothing
- def aggregate_post_info(post)
- posts << post
- end
-
- def relative_permalinks_deprecation_method
- if config['relative_permalinks'] && has_relative_page?
- Jekyll.logger.warn "Deprecation:", "Starting in 2.0, permalinks for pages" +
- " in subfolders must be relative to the" +
- " site source directory, not the parent" +
- " directory. Check http://jekyllrb.com/docs/upgrading/"+
- " for more info."
+ # Returns
+ def relative_permalinks_are_deprecated
+ if config['relative_permalinks']
+ Jekyll.logger.abort_with "Since v3.0, permalinks for pages" +
+ " in subfolders must be relative to the" +
+ " site source directory, not the parent" +
+ " directory. Check http://jekyllrb.com/docs/upgrading/"+
+ " for more info."
end
end
+ # Get the to be written documents
+ #
+ # Returns an Array of Documents which should be written
def docs_to_write
documents.select(&:write?)
end
+ # Get all the documents
+ #
+ # Returns an Array of all Documents
def documents
collections.reduce(Set.new) do |docs, (_, collection)|
- docs.merge(collection.docs)
+ docs + collection.docs + collection.files
end.to_a
end
def each_site_file
- %w(posts pages static_files docs_to_write).each do |type|
+ %w(pages static_files docs_to_write).each do |type|
send(type).each do |item|
yield item
end
end
end
+ # Returns the FrontmatterDefaults or creates a new FrontmatterDefaults
+ # if it doesn't already exist.
+ #
+ # Returns The FrontmatterDefaults
def frontmatter_defaults
@frontmatter_defaults ||= FrontmatterDefaults.new(self)
end
- private
-
- def has_relative_page?
- pages.any? { |page| page.uses_relative_permalinks }
+ # Whether to perform a full rebuild without incremental regeneration
+ #
+ # Returns a Boolean: true for a full rebuild, false for normal build
+ def incremental?(override = {})
+ override['incremental'] || config['incremental']
end
- def has_yaml_header?(file)
- !!(File.open(file, 'rb') { |f| f.read(5) } =~ /\A---\r?\n/)
+ # Returns the publisher or creates a new publisher if it doesn't
+ # already exist.
+ #
+ # Returns The Publisher
+ def publisher
+ @publisher ||= Publisher.new(self)
end
- def limit_posts!
- limit = posts.length < limit_posts ? posts.length : limit_posts
- self.posts = posts[-limit, limit]
+ # Public: Prefix a given path with the source directory.
+ #
+ # paths - (optional) path elements to a file or directory within the
+ # source directory
+ #
+ # Returns a path which is prefixed with the source directory.
+ def in_source_dir(*paths)
+ paths.reduce(source) do |base, path|
+ Jekyll.sanitized_path(base, path)
+ end
end
- def site_cleaner
- @site_cleaner ||= Cleaner.new(self)
+ # Public: Prefix a given path with the destination directory.
+ #
+ # paths - (optional) path elements to a file or directory within the
+ # destination directory
+ #
+ # Returns a path which is prefixed with the destination directory.
+ def in_dest_dir(*paths)
+ paths.reduce(dest) do |base, path|
+ Jekyll.sanitized_path(base, path)
+ end
end
- def sanitize_filename(name)
- name.gsub!(/[^\w\s_-]+/, '')
- name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
- name.gsub(/\s+/, '_')
+ private
+
+ # Limits the current posts; removes the posts which exceed the limit_posts
+ #
+ # Returns nothing
+ def limit_posts!
+ if limit_posts > 0
+ limit = posts.docs.length < limit_posts ? posts.docs.length : limit_posts
+ self.posts.docs = posts.docs[-limit, limit]
+ end
end
- def publisher
- @publisher ||= Publisher.new(self)
+ # Returns the Cleaner or creates a new Cleaner if it doesn't
+ # already exist.
+ #
+ # Returns The Cleaner
+ def site_cleaner
+ @site_cleaner ||= Cleaner.new(self)
end
end
end
diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb
index 2382d03..48fa34c 100644
--- a/lib/jekyll/static_file.rb
+++ b/lib/jekyll/static_file.rb
@@ -3,17 +3,22 @@ module Jekyll
# The cache of last modification times [path] -> mtime.
@@mtimes = Hash.new
+ attr_reader :relative_path, :extname
+
# Initialize a new StaticFile.
#
# site - The Site.
# base - The String path to the <source>.
# dir - The String path between <source> and the file.
# name - The String filename of the file.
- def initialize(site, base, dir, name)
+ def initialize(site, base, dir, name, collection = nil)
@site = site
@base = base
@dir = dir
@name = name
+ @collection = collection
+ @relative_path = File.join(*[@dir, @name].compact)
+ @extname = File.extname(@name)
end
# Returns source file path.
@@ -21,23 +26,30 @@ module Jekyll
File.join(*[@base, @dir, @name].compact)
end
- # Returns the source file path relative to the site source
- def relative_path
- @relative_path ||= path.sub(/\A#{@site.source}/, '')
- end
-
# Obtain destination path.
#
# dest - The String path to the destination dir.
#
# Returns destination file path.
def destination(dest)
- File.join(*[dest, @dir, @name].compact)
+ @site.in_dest_dir(*[dest, destination_rel_dir, @name].compact)
+ end
+
+ def destination_rel_dir
+ if @collection
+ File.dirname(url)
+ else
+ @dir
+ end
+ end
+
+ def modified_time
+ @modified_time ||= File.stat(path).mtime
end
# Returns last modification time for this file.
def mtime
- File.stat(path).mtime.to_i
+ modified_time.to_i
end
# Is source path modified?
@@ -47,6 +59,14 @@ module Jekyll
@@mtimes[path] != mtime
end
+ # Whether to write the file to the filesystem
+ #
+ # Returns true unless the defaults for the destination path from
+ # _config.yml contain `published: false`.
+ def write?
+ defaults.fetch('published', true)
+ end
+
# Write the static file to the destination directory (if modified).
#
# dest - The String path to the destination dir.
@@ -61,6 +81,7 @@ module Jekyll
FileUtils.mkdir_p(File.dirname(dest_path))
FileUtils.rm(dest_path) if File.exist?(dest_path)
FileUtils.cp(path, dest_path)
+ File.utime(@@mtimes[path], @@mtimes[path], dest_path)
true
end
@@ -75,10 +96,46 @@ module Jekyll
def to_liquid
{
- "path" => relative_path,
- "modified_time" => mtime.to_s,
- "extname" => File.extname(relative_path)
+ "extname" => extname,
+ "modified_time" => modified_time,
+ "path" => File.join("", relative_path)
}
end
+
+ def placeholders
+ {
+ collection: @collection.label,
+ path: relative_path[
+ @collection.relative_directory.size..relative_path.size],
+ output_ext: '',
+ name: '',
+ title: '',
+ }
+ end
+
+ # Applies a similar URL-building technique as Jekyll::Document that takes
+ # the collection's URL template into account. The default URL template can
+ # be overriden in the collection's configuration in _config.yml.
+ def url
+ @url ||= if @collection.nil?
+ relative_path
+ else
+ ::Jekyll::URL.new({
+ template: @collection.url_template,
+ placeholders: placeholders,
+ })
+ end.to_s.gsub /\/$/, ''
+ end
+
+ # Returns the type of the collection if present, nil otherwise.
+ def type
+ @type ||= @collection.nil? ? nil : @collection.label.to_sym
+ end
+
+ # Returns the front matter defaults defined for the file's URL and/or type
+ # as defined in _config.yml.
+ def defaults
+ @defaults ||= @site.frontmatter_defaults.all url, type
+ end
end
end
diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb
index 837919f..454c09a 100644
--- a/lib/jekyll/tags/highlight.rb
+++ b/lib/jekyll/tags/highlight.rb
@@ -42,18 +42,19 @@ eos
def render(context)
prefix = context["highlighter_prefix"] || ""
suffix = context["highlighter_suffix"] || ""
- code = super.to_s.strip
+ code = super.to_s.gsub(/\A(\n|\r)+|(\n|\r)+\z/, '')
is_safe = !!context.registers[:site].safe
- output = case context.registers[:site].highlighter
- when 'pygments'
- render_pygments(code, is_safe)
- when 'rouge'
- render_rouge(code)
- else
- render_codehighlighter(code)
- end
+ output =
+ case context.registers[:site].highlighter
+ when 'pygments'
+ render_pygments(code, is_safe)
+ when 'rouge'
+ render_rouge(code)
+ else
+ render_codehighlighter(code)
+ end
rendered_output = add_code_tag(output)
prefix + rendered_output + suffix
@@ -63,7 +64,7 @@ eos
if is_safe
Hash[[
[:startinline, opts.fetch(:startinline, nil)],
- [:hl_linenos, opts.fetch(:hl_linenos, nil)],
+ [:hl_lines, opts.fetch(:hl_lines, nil)],
[:linenos, opts.fetch(:linenos, nil)],
[:encoding, opts.fetch(:encoding, 'utf-8')],
[:cssclass, opts.fetch(:cssclass, nil)]
@@ -74,9 +75,7 @@ eos
end
def render_pygments(code, is_safe)
- require 'pygments'
-
- @options[:encoding] = 'utf-8'
+ Jekyll::External.require_with_graceful_fail('pygments')
highlighted_code = Pygments.highlight(
code,
@@ -95,26 +94,26 @@ eos
raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.")
end
- highlighted_code
+ highlighted_code.sub('<div class="highlight"><pre>', '').sub('</pre></div>', '')
end
def render_rouge(code)
- require 'rouge'
+ Jekyll::External.require_with_graceful_fail('rouge')
formatter = Rouge::Formatters::HTML.new(line_numbers: @options[:linenos], wrap: false)
lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText
- code = formatter.format(lexer.lex(code))
- "<div class=\"highlight\"><pre>#{code}</pre></div>"
+ formatter.format(lexer.lex(code))
end
def render_codehighlighter(code)
- "<div class=\"highlight\"><pre>#{h(code).strip}</pre></div>"
+ h(code).strip
end
def add_code_tag(code)
- # Add nested <code> tags to code blocks
- code = code.sub(/<pre>\n*/,'<pre><code class="language-' + @lang.to_s.gsub("+", "-") + '" data-lang="' + @lang.to_s + '">')
- code = code.sub(/\n*<\/pre>/,"</code></pre>")
- code.strip
+ code_attributes = [
+ "class=\"language-#{@lang.to_s.gsub('+', '-')}\"",
+ "data-lang=\"#{@lang.to_s}\""
+ ].join(" ")
+ "<figure class=\"highlight\"><pre><code #{code_attributes}>#{code.chomp}</code></pre></figure>"
end
end
diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb
index f8518df..92ce7c6 100644
--- a/lib/jekyll/tags/include.rb
+++ b/lib/jekyll/tags/include.rb
@@ -1,3 +1,5 @@
+# encoding: UTF-8
+
module Jekyll
module Tags
class IncludeTagError < StandardError
@@ -11,12 +13,10 @@ module Jekyll
class IncludeTag < Liquid::Tag
- SYNTAX_EXAMPLE = "{% include file.ext param='value' param2='value' %}"
+ attr_reader :includes_dir
VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/
- VARIABLE_SYNTAX = /(?<variable>\{\{\s*(?<name>[\w\-\.]+)\s*(\|.*)?\}\})(?<params>.*)/
-
- INCLUDES_DIR = '_includes'
+ VARIABLE_SYNTAX = /(?<variable>[^{]*\{\{\s*(?<name>[\w\-\.]+)\s*(\|.*)?\}\}[^\s}]*)(?<params>.*)/
def initialize(tag_name, markup, tokens)
super
@@ -28,6 +28,11 @@ module Jekyll
@file, @params = markup.strip.split(' ', 2);
end
validate_params if @params
+ @tag_name = tag_name
+ end
+
+ def syntax_example
+ "{% #{@tag_name} file.ext param='value' param2='value' %}"
end
def parse_params(context)
@@ -59,7 +64,7 @@ Invalid syntax for include tag. File contains invalid characters or sequences:
Valid syntax:
- #{SYNTAX_EXAMPLE}
+ #{syntax_example}
eos
end
@@ -75,7 +80,7 @@ Invalid syntax for include tag:
Valid syntax:
- #{SYNTAX_EXAMPLE}
+ #{syntax_example}
eos
end
@@ -89,32 +94,50 @@ eos
# Render the variable if required
def render_variable(context)
if @file.match(VARIABLE_SYNTAX)
- partial = Liquid::Template.parse(@file)
+ partial = context.registers[:site].liquid_renderer.file("(variable)").parse(@file)
partial.render!(context)
end
end
+ def tag_includes_dir(context)
+ context.registers[:site].config['includes_dir'].freeze
+ end
+
def render(context)
- dir = File.join(File.realpath(context.registers[:site].source), INCLUDES_DIR)
+ site = context.registers[:site]
+ @includes_dir = tag_includes_dir(context)
+ dir = resolved_includes_dir(context)
file = render_variable(context) || @file
validate_file_name(file)
path = File.join(dir, file)
- validate_path(path, dir, context.registers[:site].safe)
+ validate_path(path, dir, site.safe)
+
+ # Add include to dependency tree
+ if context.registers[:page] and context.registers[:page].has_key? "path"
+ site.regenerator.add_dependency(
+ site.in_source_dir(context.registers[:page]["path"]),
+ path
+ )
+ end
begin
- partial = Liquid::Template.parse(source(path, context))
+ partial = site.liquid_renderer.file(path).parse(read_file(path, context))
context.stack do
context['include'] = parse_params(context) if @params
partial.render!(context)
end
rescue => e
- raise IncludeTagError.new e.message, File.join(INCLUDES_DIR, @file)
+ raise IncludeTagError.new e.message, File.join(@includes_dir, @file)
end
end
+ def resolved_includes_dir(context)
+ context.registers[:site].in_source_dir(@includes_dir)
+ end
+
def validate_path(path, dir, safe)
if safe && !realpath_prefixed_with?(path, dir)
raise IOError.new "The included file '#{path}' should exist and should not be a symlink"
@@ -124,7 +147,7 @@ eos
end
def path_relative_to_source(dir, path)
- File.join(INCLUDES_DIR, path.sub(Regexp.new("^#{dir}"), ""))
+ File.join(@includes_dir, path.sub(Regexp.new("^#{dir}"), ""))
end
def realpath_prefixed_with?(path, dir)
@@ -132,11 +155,26 @@ eos
end
# This method allows to modify the file content by inheriting from the class.
- def source(file, context)
+ def read_file(file, context)
File.read(file, file_read_opts(context))
end
end
+
+ class IncludeRelativeTag < IncludeTag
+ def tag_includes_dir(context)
+ '.'.freeze
+ end
+
+ def page_path(context)
+ context.registers[:page].nil? ? includes_dir : File.dirname(context.registers[:page]["path"])
+ end
+
+ def resolved_includes_dir(context)
+ context.registers[:site].in_source_dir(page_path(context))
+ end
+ end
end
end
Liquid::Template.register_tag('include', Jekyll::Tags::IncludeTag)
+Liquid::Template.register_tag('include_relative', Jekyll::Tags::IncludeRelativeTag)
diff --git a/lib/jekyll/tags/post_url.rb b/lib/jekyll/tags/post_url.rb
index af36670..5b0d647 100644
--- a/lib/jekyll/tags/post_url.rb
+++ b/lib/jekyll/tags/post_url.rb
@@ -3,16 +3,22 @@ module Jekyll
class PostComparer
MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)$/
- attr_accessor :date, :slug
+ attr_reader :path, :date, :slug, :name
def initialize(name)
- all, path, date, slug = *name.sub(/^\//, "").match(MATCHER)
- raise ArgumentError.new("'#{name}' does not contain valid date and/or title") unless all
- @slug = path ? path + slug : slug
- @date = Time.parse(date)
+ @name = name
+ all, @path, @date, @slug = *name.sub(/^\//, "").match(MATCHER)
+ raise ArgumentError.new("'#{name}' does not contain valid date and/or title.") unless all
+
+ @name_regex = /^#{path}#{date}-#{slug}\.[^.]+/
end
def ==(other)
+ other.basename.match(@name_regex)
+ end
+
+ def deprecated_equality(other)
+ date = Utils.parse_date(name, "'#{name}' does not contain valid date and/or title.")
slug == post_slug(other) &&
date.year == other.date.year &&
date.month == other.date.month &&
@@ -26,11 +32,11 @@ module Jekyll
#
# Returns the post slug with the subdirectory (relative to _posts)
def post_slug(other)
- path = other.name.split("/")[0...-1].join("/")
+ path = other.basename.split("/")[0...-1].join("/")
if path.nil? || path == ""
- other.slug
+ other.data['slug']
else
- path + '/' + other.slug
+ path + '/' + other.data['slug']
end
end
end
@@ -53,12 +59,25 @@ eos
def render(context)
site = context.registers[:site]
- site.posts.each do |p|
+ site.posts.docs.each do |p|
if @post == p
return p.url
end
end
+ # New matching method did not match, fall back to old method
+ # with deprecation warning if this matches
+
+ site.posts.docs.each do |p|
+ if @post.deprecated_equality p
+ Jekyll::Deprecator.deprecation_message "A call to '{{ post_url #{@post.name} }}' did not match " +
+ "a post using the new matching method of checking name " +
+ "(path-date-slug) equality. Please make sure that you " +
+ "change this tag to match the post's name exactly."
+ return p.url
+ end
+ end
+
raise ArgumentError.new <<-eos
Could not find post "#{@orig_post}" in tag 'post_url'.
diff --git a/lib/jekyll/url.rb b/lib/jekyll/url.rb
index f4ea4d3..14b7063 100644
--- a/lib/jekyll/url.rb
+++ b/lib/jekyll/url.rb
@@ -37,33 +37,51 @@ module Jekyll
#
# Returns the String URL
def to_s
- sanitize_url(@permalink || generate_url)
+ sanitize_url(generated_permalink || generated_url)
+ end
+
+ # Generates a URL from the permalink
+ #
+ # Returns the _unsanitized String URL
+ def generated_permalink
+ (@generated_permalink ||= generate_url(@permalink)) if @permalink
+ end
+
+ # Generates a URL from the template
+ #
+ # Returns the unsanitized String URL
+ def generated_url
+ @generated_url ||= generate_url(@template)
end
# Internal: Generate the URL by replacing all placeholders with their
- # respective values
+ # respective values in the given template
#
- # Returns the _unsanitizied_ String URL
- def generate_url
- @placeholders.inject(@template) do |result, token|
- result.gsub(/:#{token.first}/, self.class.escape_path(token.last))
+ # Returns the unsanitized String URL
+ def generate_url(template)
+ @placeholders.inject(template) do |result, token|
+ break result if result.index(':').nil?
+ if token.last.nil?
+ # Remove leading '/' to avoid generating urls with `//`
+ result.gsub(/\/:#{token.first}/, '')
+ else
+ result.gsub(/:#{token.first}/, self.class.escape_path(token.last))
+ end
end
end
# Returns a sanitized String URL
def sanitize_url(in_url)
-
- # Remove all double slashes
- url = in_url.gsub(/\/\//, "/")
-
- # Remove every URL segment that consists solely of dots
- url = url.split('/').reject{ |part| part =~ /^\.+$/ }.join('/')
+ url = in_url \
+ # Remove all double slashes
+ .gsub(/\/\//, '/') \
+ # Remove every URL segment that consists solely of dots
+ .split('/').reject{ |part| part =~ /^\.+$/ }.join('/') \
+ # Always add a leading slash
+ .gsub(/\A([^\/])/, '/\1')
# Append a trailing slash to the URL if the unsanitized URL had one
- url += "/" if in_url =~ /\/$/
-
- # Always add a leading slash
- url.gsub!(/\A([^\/])/, '/\1')
+ url << "/" if in_url.end_with?("/")
url
end
@@ -79,7 +97,7 @@ module Jekyll
#
# Returns the escaped path.
def self.escape_path(path)
- # Because URI.escape doesn't escape '?', '[' and ']' by defaut,
+ # Because URI.escape doesn't escape '?', '[' and ']' by default,
# specify unsafe string (except unreserved, sub-delims, ":", "@" and "/").
#
# URI path segment is defined in RFC 3986 as follows:
@@ -89,7 +107,7 @@ module Jekyll
# pct-encoded = "%" HEXDIG HEXDIG
# sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
# / "*" / "+" / "," / ";" / "="
- URI.escape(path, /[^a-zA-Z\d\-._~!$&\'()*+,;=:@\/]/).encode('utf-8')
+ URI.escape(path, /[^a-zA-Z\d\-._~!$&'()*+,;=:@\/]/).encode('utf-8')
end
# Unescapes a URL path segment
diff --git a/lib/jekyll/utils.rb b/lib/jekyll/utils.rb
index e1b4704..7d2490a 100644
--- a/lib/jekyll/utils.rb
+++ b/lib/jekyll/utils.rb
@@ -1,87 +1,222 @@
module Jekyll
- module Utils
- class << self
-
- # Merges a master hash with another hash, recursively.
- #
- # master_hash - the "parent" hash whose values will be overridden
- # other_hash - the other hash whose values will be persisted after the merge
- #
- # This code was lovingly stolen from some random gem:
- # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
- #
- # Thanks to whoever made it.
- def deep_merge_hashes(master_hash, other_hash)
- target = master_hash.dup
-
- other_hash.keys.each do |key|
- if other_hash[key].is_a? Hash and target[key].is_a? Hash
- target[key] = Utils.deep_merge_hashes(target[key], other_hash[key])
- next
- end
-
- target[key] = other_hash[key]
+ module Utils extend self
+ autoload :Platforms, 'jekyll/utils/platforms'
+
+ # Constants for use in #slugify
+ SLUGIFY_MODES = %w{raw default pretty}
+ SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze
+ SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze
+ SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze
+
+ # Non-destructive version of deep_merge_hashes! See that method.
+ #
+ # Returns the merged hashes.
+ def deep_merge_hashes(master_hash, other_hash)
+ deep_merge_hashes!(master_hash.dup, other_hash)
+ end
+
+ # Merges a master hash with another hash, recursively.
+ #
+ # master_hash - the "parent" hash whose values will be overridden
+ # other_hash - the other hash whose values will be persisted after the merge
+ #
+ # This code was lovingly stolen from some random gem:
+ # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
+ #
+ # Thanks to whoever made it.
+ def deep_merge_hashes!(target, overwrite)
+ overwrite.each_key do |key|
+ if overwrite[key].is_a? Hash and target[key].is_a? Hash
+ target[key] = Utils.deep_merge_hashes(target[key], overwrite[key])
+ next
end
- target
+ target[key] = overwrite[key]
end
- # Read array from the supplied hash favouring the singular key
- # and then the plural key, and handling any nil entries.
- #
- # hash - the hash to read from
- # singular_key - the singular key
- # plural_key - the plural key
- #
- # Returns an array
- def pluralized_array_from_hash(hash, singular_key, plural_key)
- [].tap do |array|
- array << (value_from_singular_key(hash, singular_key) || value_from_plural_key(hash, plural_key))
- end.flatten.compact
+ if target.default_proc.nil?
+ target.default_proc = overwrite.default_proc
end
-
- def value_from_singular_key(hash, key)
- hash[key] if (hash.has_key?(key) || (hash.default_proc && hash[key]))
- end
-
- def value_from_plural_key(hash, key)
- if hash.has_key?(key) || (hash.default_proc && hash[key])
- val = hash[key]
- case val
- when String
- val.split
- when Array
- val.compact
- end
+
+ target
+ end
+
+ # Read array from the supplied hash favouring the singular key
+ # and then the plural key, and handling any nil entries.
+ #
+ # hash - the hash to read from
+ # singular_key - the singular key
+ # plural_key - the plural key
+ #
+ # Returns an array
+ def pluralized_array_from_hash(hash, singular_key, plural_key)
+ [].tap do |array|
+ array << (value_from_singular_key(hash, singular_key) || value_from_plural_key(hash, plural_key))
+ end.flatten.compact
+ end
+
+ def value_from_singular_key(hash, key)
+ hash[key] if (hash.key?(key) || (hash.default_proc && hash[key]))
+ end
+
+ def value_from_plural_key(hash, key)
+ if hash.key?(key) || (hash.default_proc && hash[key])
+ val = hash[key]
+ case val
+ when String
+ val.split
+ when Array
+ val.compact
end
end
+ end
- def transform_keys(hash)
- result = {}
- hash.each_key do |key|
- result[yield(key)] = hash[key]
- end
- result
+ def transform_keys(hash)
+ result = {}
+ hash.each_key do |key|
+ result[yield(key)] = hash[key]
end
+ result
+ end
- # Apply #to_sym to all keys in the hash
- #
- # hash - the hash to which to apply this transformation
- #
- # Returns a new hash with symbolized keys
- def symbolize_hash_keys(hash)
- transform_keys(hash) { |key| key.to_sym rescue key }
+ # Apply #to_sym to all keys in the hash
+ #
+ # hash - the hash to which to apply this transformation
+ #
+ # Returns a new hash with symbolized keys
+ def symbolize_hash_keys(hash)
+ transform_keys(hash) { |key| key.to_sym rescue key }
+ end
+
+ # Apply #to_s to all keys in the Hash
+ #
+ # hash - the hash to which to apply this transformation
+ #
+ # Returns a new hash with stringified keys
+ def stringify_hash_keys(hash)
+ transform_keys(hash) { |key| key.to_s rescue key }
+ end
+
+ # Parse a date/time and throw an error if invalid
+ #
+ # input - the date/time to parse
+ # msg - (optional) the error message to show the user
+ #
+ # Returns the parsed date if successful, throws a FatalException
+ # if not
+ def parse_date(input, msg = "Input could not be parsed.")
+ Time.parse(input).localtime
+ rescue ArgumentError
+ raise Errors::FatalException.new("Invalid date '#{input}': " + msg)
+ end
+
+ # Determines whether a given file has
+ #
+ # Returns true if the YAML front matter is present.
+ def has_yaml_header?(file)
+ !!(File.open(file, 'rb') { |f| f.read(5) } =~ /\A---\r?\n/)
+ end
+
+ # Slugify a filename or title.
+ #
+ # string - the filename or title to slugify
+ # mode - how string is slugified
+ # cased - whether to replace all uppercase letters with their
+ # lowercase counterparts
+ #
+ # When mode is "none", return the given string.
+ #
+ # When mode is "raw", return the given string,
+ # with every sequence of spaces characters replaced with a hyphen.
+ #
+ # When mode is "default" or nil, non-alphabetic characters are
+ # replaced with a hyphen too.
+ #
+ # When mode is "pretty", some non-alphabetic characters (._~!$&'()+,;=@)
+ # are not replaced with hyphen.
+ #
+ # If cased is true, all uppercase letters in the result string are
+ # replaced with their lowercase counterparts.
+ #
+ # Examples:
+ # slugify("The _config.yml file")
+ # # => "the-config-yml-file"
+ #
+ # slugify("The _config.yml file", "pretty")
+ # # => "the-_config.yml-file"
+ #
+ # slugify("The _config.yml file", "pretty", true)
+ # # => "The-_config.yml file"
+ #
+ # Returns the slugified string.
+ def slugify(string, mode: nil, cased: false)
+ mode ||= 'default'
+ return nil if string.nil?
+
+ unless SLUGIFY_MODES.include?(mode)
+ return cased ? string : string.downcase
end
- # Apply #to_s to all keys in the Hash
- #
- # hash - the hash to which to apply this transformation
- #
- # Returns a new hash with stringified keys
- def stringify_hash_keys(hash)
- transform_keys(hash) { |key| key.to_s rescue key }
+ # Replace each character sequence with a hyphen
+ re = case mode
+ when 'raw'
+ SLUGIFY_RAW_REGEXP
+ when 'default'
+ SLUGIFY_DEFAULT_REGEXP
+ when 'pretty'
+ # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL
+ # and is allowed in both extN and NTFS.
+ SLUGIFY_PRETTY_REGEXP
end
+ slug = string.
+ # Strip according to the mode
+ gsub(re, '-').
+ # Remove leading/trailing hyphen
+ gsub(/^\-|\-$/i, '')
+
+ cased ? slug : slug.downcase
end
+
+ # Add an appropriate suffix to template so that it matches the specified
+ # permalink style.
+ #
+ # template - permalink template without trailing slash or file extension
+ # permalink_style - permalink style, either built-in or custom
+ #
+ # The returned permalink template will use the same ending style as
+ # specified in permalink_style. For example, if permalink_style contains a
+ # trailing slash (or is :pretty, which indirectly has a trailing slash),
+ # then so will the returned template. If permalink_style has a trailing
+ # ":output_ext" (or is :none, :date, or :ordinal) then so will the returned
+ # template. Otherwise, template will be returned without modification.
+ #
+ # Examples:
+ # add_permalink_suffix("/:basename", :pretty)
+ # # => "/:basename/"
+ #
+ # add_permalink_suffix("/:basename", :date)
+ # # => "/:basename:output_ext"
+ #
+ # add_permalink_suffix("/:basename", "/:year/:month/:title/")
+ # # => "/:basename/"
+ #
+ # add_permalink_suffix("/:basename", "/:year/:month/:title")
+ # # => "/:basename"
+ #
+ # Returns the updated permalink template
+ def add_permalink_suffix(template, permalink_style)
+ case permalink_style
+ when :pretty
+ template << "/"
+ when :date, :ordinal, :none
+ template << ":output_ext"
+ else
+ template << "/" if permalink_style.to_s.end_with?("/")
+ template << ":output_ext" if permalink_style.to_s.end_with?(":output_ext")
+ end
+ template
+ end
+
end
end
diff --git a/lib/jekyll/utils/platforms.rb b/lib/jekyll/utils/platforms.rb
new file mode 100644
index 0000000..83858a0
--- /dev/null
+++ b/lib/jekyll/utils/platforms.rb
@@ -0,0 +1,30 @@
+module Jekyll
+ module Utils
+ module Platforms extend self
+
+ # Provides jruby? and mri? which respectively detect these two types of
+ # tested Engines we support, in the future we might probably support the
+ # other one that everyone used to talk about.
+
+ { :jruby? => "jruby", :mri? => "ruby" }.each do |k, v|
+ define_method k do
+ ::RUBY_ENGINE == v
+ end
+ end
+
+ # Provides windows?, linux?, osx?, unix? so that we can detect
+ # platforms. This is mostly useful for `jekyll doctor` and for testing
+ # where we kick off certain tests based on the platform.
+
+ { :windows? => /mswin|mingw|cygwin/, :linux? => /linux/, \
+ :osx? => /darwin|mac os/, :unix? => /solaris|bsd/ }.each do |k, v|
+
+ define_method k do
+ !!(
+ RbConfig::CONFIG["host_os"] =~ v
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/lib/jekyll/version.rb b/lib/jekyll/version.rb
index f6525ae..7907aaa 100644
--- a/lib/jekyll/version.rb
+++ b/lib/jekyll/version.rb
@@ -1,3 +1,3 @@
module Jekyll
- VERSION = '2.2.0'
+ VERSION = '3.0.1'
end
diff --git a/lib/site_template/.gitignore b/lib/site_template/.gitignore
index c08f9ad..45c1505 100644
--- a/lib/site_template/.gitignore
+++ b/lib/site_template/.gitignore
@@ -1 +1,3 @@
-_site
\ No newline at end of file
+_site
+.sass-cache
+.jekyll-metadata
diff --git a/lib/site_template/_config.yml b/lib/site_template/_config.yml
index ae45638..1c5e5bc 100644
--- a/lib/site_template/_config.yml
+++ b/lib/site_template/_config.yml
@@ -1,12 +1,21 @@
+# Welcome to Jekyll!
+#
+# This config file is meant for settings that affect your whole blog, values
+# which you are expected to set up once and rarely need to edit after that.
+# For technical reasons, this file is *NOT* reloaded automatically when you use
+# 'jekyll serve'. If you change this file, please restart the server process.
+
# Site settings
title: Your awesome title
email: your-email at domain.com
-description: "Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description."
-baseurl: ""
-url: "http://yourdomain.com"
+description: > # this means to ignore newlines until "baseurl:"
+ Write an awesome description for your new site here. You can edit this
+ line in _config.yml. It will appear in your document head meta (for
+ Google search results) and in your feed.xml site description.
+baseurl: "" # the subpath of your site, e.g. /blog
+url: "http://yourdomain.com" # the base hostname & protocol for your site
twitter_username: jekyllrb
github_username: jekyll
# Build settings
markdown: kramdown
-permalink: pretty
diff --git a/lib/site_template/_includes/footer.html b/lib/site_template/_includes/footer.html
index 0026c4c..72239f1 100644
--- a/lib/site_template/_includes/footer.html
+++ b/lib/site_template/_includes/footer.html
@@ -1,59 +1,36 @@
<footer class="site-footer">
- <div class="wrap">
+ <div class="wrapper">
<h2 class="footer-heading">{{ site.title }}</h2>
- <div class="footer-col-1 column">
- <ul>
- <li>{{ site.title }}</li>
- <li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
- </ul>
- </div>
+ <div class="footer-col-wrapper">
+ <div class="footer-col footer-col-1">
+ <ul class="contact-list">
+ <li>{{ site.title }}</li>
+ <li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
+ </ul>
+ </div>
- <div class="footer-col-2 column">
- <ul>
- {% if site.github_username %}<li>
- <a href="https://github.com/{{ site.github_username }}">
- <span class="icon github">
- <svg version="1.1" class="github-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
- <path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C2C2" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761
- c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32
- c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472
- c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037
- C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65
- c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261
- c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082
- c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129
- c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
- </svg>
- </span>
- <span class="username">{{ site.github_username }}</span>
- </a>
- </li>{% endif %}
- {% if site.twitter_username %}<li>
- <a href="https://twitter.com/{{ site.twitter_username }}">
- <span class="icon twitter">
- <svg version="1.1" class="twitter-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
- <path fill="#C2C2C2" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
- c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27
- c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767
- c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206
- C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271
- c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469
- c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
- </svg>
- </span>
- <span class="username">{{ site.twitter_username }}</span>
- </a>
- </li>{% endif %}
- </ul>
- </div>
+ <div class="footer-col footer-col-2">
+ <ul class="social-media-list">
+ {% if site.github_username %}
+ <li>
+ {% include icon-github.html username=site.github_username %}
+ </li>
+ {% endif %}
+
+ {% if site.twitter_username %}
+ <li>
+ {% include icon-twitter.html username=site.twitter_username %}
+ </li>
+ {% endif %}
+ </ul>
+ </div>
- <div class="footer-col-3 column">
- <p class="text">{{ site.description }}</p>
+ <div class="footer-col footer-col-3">
+ <p>{{ site.description }}</p>
+ </div>
</div>
</div>
diff --git a/lib/site_template/_includes/head.html b/lib/site_template/_includes/head.html
index c8f1016..41340ae 100644
--- a/lib/site_template/_includes/head.html
+++ b/lib/site_template/_includes/head.html
@@ -1,12 +1,12 @@
<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
- <meta name="viewport" content="width=device-width">
- <meta name="description" content="{{ site.description }}">
- <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
- <!-- Custom CSS -->
- <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
+ <title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
+ <meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
+ <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
+ <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
+ <link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}">
</head>
diff --git a/lib/site_template/_includes/header.html b/lib/site_template/_includes/header.html
index e5e6f26..b3f86db 100644
--- a/lib/site_template/_includes/header.html
+++ b/lib/site_template/_includes/header.html
@@ -1,24 +1,23 @@
<header class="site-header">
- <div class="wrap">
+ <div class="wrapper">
<a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
<nav class="site-nav">
<a href="#" class="menu-icon">
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 18 15" enable-background="new 0 0 18 15" xml:space="preserve">
- <path fill="#505050" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0
- h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
- <path fill="#505050" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484
- h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
- <path fill="#505050" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0
- c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
+ <svg viewBox="0 0 18 15">
+ <path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
+ <path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
+ <path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
+
<div class="trigger">
- {% for page in site.pages %}
- {% if page.title %}<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>{% endif %}
+ {% for my_page in site.pages %}
+ {% if my_page.title %}
+ <a class="page-link" href="{{ my_page.url | prepend: site.baseurl }}">{{ my_page.title }}</a>
+ {% endif %}
{% endfor %}
</div>
</nav>
diff --git a/lib/site_template/_includes/icon-github.html b/lib/site_template/_includes/icon-github.html
new file mode 100644
index 0000000..e501a16
--- /dev/null
+++ b/lib/site_template/_includes/icon-github.html
@@ -0,0 +1 @@
+<a href="https://github.com/{{ include.username }}"><span class="icon icon--github">{% include icon-github.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/lib/site_template/_includes/icon-github.svg b/lib/site_template/_includes/icon-github.svg
new file mode 100644
index 0000000..4422c4f
--- /dev/null
+++ b/lib/site_template/_includes/icon-github.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 16 16"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4 [...]
diff --git a/lib/site_template/_includes/icon-twitter.html b/lib/site_template/_includes/icon-twitter.html
new file mode 100644
index 0000000..e623dbd
--- /dev/null
+++ b/lib/site_template/_includes/icon-twitter.html
@@ -0,0 +1 @@
+<a href="https://twitter.com/{{ include.username }}"><span class="icon icon--twitter">{% include icon-twitter.svg %}</span><span class="username">{{ include.username }}</span></a>
diff --git a/lib/site_template/_includes/icon-twitter.svg b/lib/site_template/_includes/icon-twitter.svg
new file mode 100644
index 0000000..dcf660e
--- /dev/null
+++ b/lib/site_template/_includes/icon-twitter.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 16 16"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2 [...]
diff --git a/lib/site_template/_layouts/default.html b/lib/site_template/_layouts/default.html
index af41586..e4ab96f 100644
--- a/lib/site_template/_layouts/default.html
+++ b/lib/site_template/_layouts/default.html
@@ -3,17 +3,18 @@
{% include head.html %}
- <body>
+ <body>
{% include header.html %}
<div class="page-content">
- <div class="wrap">
- {{ content }}
+ <div class="wrapper">
+ {{ content }}
</div>
</div>
{% include footer.html %}
- </body>
-</html>
\ No newline at end of file
+ </body>
+
+</html>
diff --git a/lib/site_template/_layouts/page.html b/lib/site_template/_layouts/page.html
index 59821b1..ce233ad 100644
--- a/lib/site_template/_layouts/page.html
+++ b/lib/site_template/_layouts/page.html
@@ -1,14 +1,14 @@
---
layout: default
---
-<div class="post">
+<article class="post">
<header class="post-header">
- <h1>{{ page.title }}</h1>
+ <h1 class="post-title">{{ page.title }}</h1>
</header>
- <article class="post-content">
- {{ content }}
- </article>
+ <div class="post-content">
+ {{ content }}
+ </div>
-</div>
\ No newline at end of file
+</article>
diff --git a/lib/site_template/_layouts/post.html b/lib/site_template/_layouts/post.html
index 838ad7a..3a0fb52 100644
--- a/lib/site_template/_layouts/post.html
+++ b/lib/site_template/_layouts/post.html
@@ -1,15 +1,15 @@
---
layout: default
---
-<div class="post">
+<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
<header class="post-header">
- <h1>{{ page.title }}</h1>
- <p class="meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
+ <h1 class="post-title" itemprop="name headline">{{ page.title }}</h1>
+ <p class="post-meta"><time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">{{ page.date | date: "%b %-d, %Y" }}</time>{% if page.author %} • <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">{{ page.author }}</span></span>{% endif %}</p>
</header>
- <article class="post-content">
- {{ content }}
- </article>
+ <div class="post-content" itemprop="articleBody">
+ {{ content }}
+ </div>
-</div>
\ No newline at end of file
+</article>
diff --git a/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb b/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
index bc639fc..6ad2994 100644
--- a/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
+++ b/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
@@ -1,12 +1,12 @@
---
layout: post
title: "Welcome to Jekyll!"
-date: <%= Time.now.strftime('%Y-%m-%d %H:%M:%S') %>
+date: <%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>
categories: jekyll update
---
+You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.
-You'll find this post in your `_posts` directory - edit this post and re-build (or run with the `-w` switch) to see your changes!
-To add new posts, simply add a file in the `_posts` directory that follows the convention: YYYY-MM-DD-name-of-post.ext.
+To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.
Jekyll also offers powerful support for code snippets:
@@ -18,7 +18,8 @@ print_hi('Tom')
#=> prints 'Hi, Tom' to STDOUT.
{% endhighlight %}
-Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll's GitHub repo][jekyll-gh].
+Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk].
-[jekyll-gh]: https://github.com/jekyll/jekyll
-[jekyll]: http://jekyllrb.com
+[jekyll-docs]: http://jekyllrb.com/docs/home
+[jekyll-gh]: https://github.com/jekyll/jekyll
+[jekyll-talk]: https://talk.jekyllrb.com/
diff --git a/lib/site_template/_sass/_base.scss b/lib/site_template/_sass/_base.scss
new file mode 100644
index 0000000..0883c3c
--- /dev/null
+++ b/lib/site_template/_sass/_base.scss
@@ -0,0 +1,206 @@
+/**
+ * Reset some basic elements
+ */
+body, h1, h2, h3, h4, h5, h6,
+p, blockquote, pre, hr,
+dl, dd, ol, ul, figure {
+ margin: 0;
+ padding: 0;
+}
+
+
+
+/**
+ * Basic styling
+ */
+body {
+ font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;
+ color: $text-color;
+ background-color: $background-color;
+ -webkit-text-size-adjust: 100%;
+ -webkit-font-feature-settings: "kern" 1;
+ -moz-font-feature-settings: "kern" 1;
+ -o-font-feature-settings: "kern" 1;
+ font-feature-settings: "kern" 1;
+ font-kerning: normal;
+}
+
+
+
+/**
+ * Set `margin-bottom` to maintain vertical rhythm
+ */
+h1, h2, h3, h4, h5, h6,
+p, blockquote, pre,
+ul, ol, dl, figure,
+%vertical-rhythm {
+ margin-bottom: $spacing-unit / 2;
+}
+
+
+
+/**
+ * Images
+ */
+img {
+ max-width: 100%;
+ vertical-align: middle;
+}
+
+
+
+/**
+ * Figures
+ */
+figure > img {
+ display: block;
+}
+
+figcaption {
+ font-size: $small-font-size;
+}
+
+
+
+/**
+ * Lists
+ */
+ul, ol {
+ margin-left: $spacing-unit;
+}
+
+li {
+ > ul,
+ > ol {
+ margin-bottom: 0;
+ }
+}
+
+
+
+/**
+ * Headings
+ */
+h1, h2, h3, h4, h5, h6 {
+ font-weight: $base-font-weight;
+}
+
+
+
+/**
+ * Links
+ */
+a {
+ color: $brand-color;
+ text-decoration: none;
+
+ &:visited {
+ color: darken($brand-color, 15%);
+ }
+
+ &:hover {
+ color: $text-color;
+ text-decoration: underline;
+ }
+}
+
+
+
+/**
+ * Blockquotes
+ */
+blockquote {
+ color: $grey-color;
+ border-left: 4px solid $grey-color-light;
+ padding-left: $spacing-unit / 2;
+ font-size: 18px;
+ letter-spacing: -1px;
+ font-style: italic;
+
+ > :last-child {
+ margin-bottom: 0;
+ }
+}
+
+
+
+/**
+ * Code formatting
+ */
+pre,
+code {
+ font-size: 15px;
+ border: 1px solid $grey-color-light;
+ border-radius: 3px;
+ background-color: #eef;
+}
+
+code {
+ padding: 1px 5px;
+}
+
+pre {
+ padding: 8px 12px;
+ overflow-x: auto;
+
+ > code {
+ border: 0;
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+
+
+/**
+ * Wrapper
+ */
+.wrapper {
+ max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2));
+ max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: $spacing-unit;
+ padding-left: $spacing-unit;
+ @extend %clearfix;
+
+ @include media-query($on-laptop) {
+ max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit}));
+ max-width: calc(#{$content-width} - (#{$spacing-unit}));
+ padding-right: $spacing-unit / 2;
+ padding-left: $spacing-unit / 2;
+ }
+}
+
+
+
+/**
+ * Clearfix
+ */
+%clearfix {
+
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+
+
+/**
+ * Icons
+ */
+.icon {
+
+ > svg {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ vertical-align: middle;
+
+ path {
+ fill: $grey-color;
+ }
+ }
+}
diff --git a/lib/site_template/_sass/_layout.scss b/lib/site_template/_sass/_layout.scss
new file mode 100644
index 0000000..9cbfdde
--- /dev/null
+++ b/lib/site_template/_sass/_layout.scss
@@ -0,0 +1,242 @@
+/**
+ * Site header
+ */
+.site-header {
+ border-top: 5px solid $grey-color-dark;
+ border-bottom: 1px solid $grey-color-light;
+ min-height: 56px;
+
+ // Positioning context for the mobile navigation icon
+ position: relative;
+}
+
+.site-title {
+ font-size: 26px;
+ font-weight: 300;
+ line-height: 56px;
+ letter-spacing: -1px;
+ margin-bottom: 0;
+ float: left;
+
+ &,
+ &:visited {
+ color: $grey-color-dark;
+ }
+}
+
+.site-nav {
+ float: right;
+ line-height: 56px;
+
+ .menu-icon {
+ display: none;
+ }
+
+ .page-link {
+ color: $text-color;
+ line-height: $base-line-height;
+
+ // Gaps between nav items, but not on the last one
+ &:not(:last-child) {
+ margin-right: 20px;
+ }
+ }
+
+ @include media-query($on-palm) {
+ position: absolute;
+ top: 9px;
+ right: $spacing-unit / 2;
+ background-color: $background-color;
+ border: 1px solid $grey-color-light;
+ border-radius: 5px;
+ text-align: right;
+
+ .menu-icon {
+ display: block;
+ float: right;
+ width: 36px;
+ height: 26px;
+ line-height: 0;
+ padding-top: 10px;
+ text-align: center;
+
+ > svg {
+ width: 18px;
+ height: 15px;
+
+ path {
+ fill: $grey-color-dark;
+ }
+ }
+ }
+
+ .trigger {
+ clear: both;
+ display: none;
+ }
+
+ &:hover .trigger {
+ display: block;
+ padding-bottom: 5px;
+ }
+
+ .page-link {
+ display: block;
+ padding: 5px 10px;
+
+ &:not(:last-child) {
+ margin-right: 0;
+ }
+ margin-left: 20px;
+ }
+ }
+}
+
+
+
+/**
+ * Site footer
+ */
+.site-footer {
+ border-top: 1px solid $grey-color-light;
+ padding: $spacing-unit 0;
+}
+
+.footer-heading {
+ font-size: 18px;
+ margin-bottom: $spacing-unit / 2;
+}
+
+.contact-list,
+.social-media-list {
+ list-style: none;
+ margin-left: 0;
+}
+
+.footer-col-wrapper {
+ font-size: 15px;
+ color: $grey-color;
+ margin-left: -$spacing-unit / 2;
+ @extend %clearfix;
+}
+
+.footer-col {
+ float: left;
+ margin-bottom: $spacing-unit / 2;
+ padding-left: $spacing-unit / 2;
+}
+
+.footer-col-1 {
+ width: -webkit-calc(35% - (#{$spacing-unit} / 2));
+ width: calc(35% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-2 {
+ width: -webkit-calc(20% - (#{$spacing-unit} / 2));
+ width: calc(20% - (#{$spacing-unit} / 2));
+}
+
+.footer-col-3 {
+ width: -webkit-calc(45% - (#{$spacing-unit} / 2));
+ width: calc(45% - (#{$spacing-unit} / 2));
+}
+
+ at include media-query($on-laptop) {
+ .footer-col-1,
+ .footer-col-2 {
+ width: -webkit-calc(50% - (#{$spacing-unit} / 2));
+ width: calc(50% - (#{$spacing-unit} / 2));
+ }
+
+ .footer-col-3 {
+ width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+ width: calc(100% - (#{$spacing-unit} / 2));
+ }
+}
+
+ at include media-query($on-palm) {
+ .footer-col {
+ float: none;
+ width: -webkit-calc(100% - (#{$spacing-unit} / 2));
+ width: calc(100% - (#{$spacing-unit} / 2));
+ }
+}
+
+
+
+/**
+ * Page content
+ */
+.page-content {
+ padding: $spacing-unit 0;
+}
+
+.page-heading {
+ font-size: 20px;
+}
+
+.post-list {
+ margin-left: 0;
+ list-style: none;
+
+ > li {
+ margin-bottom: $spacing-unit;
+ }
+}
+
+.post-meta {
+ font-size: $small-font-size;
+ color: $grey-color;
+}
+
+.post-link {
+ display: block;
+ font-size: 24px;
+}
+
+
+
+/**
+ * Posts
+ */
+.post-header {
+ margin-bottom: $spacing-unit;
+}
+
+.post-title {
+ font-size: 42px;
+ letter-spacing: -1px;
+ line-height: 1;
+
+ @include media-query($on-laptop) {
+ font-size: 36px;
+ }
+}
+
+.post-content {
+ margin-bottom: $spacing-unit;
+
+ h2 {
+ font-size: 32px;
+
+ @include media-query($on-laptop) {
+ font-size: 28px;
+ }
+ }
+
+ h3 {
+ font-size: 26px;
+
+ @include media-query($on-laptop) {
+ font-size: 22px;
+ }
+ }
+
+ h4 {
+ font-size: 20px;
+
+ @include media-query($on-laptop) {
+ font-size: 18px;
+ }
+ }
+}
diff --git a/lib/site_template/_sass/_syntax-highlighting.scss b/lib/site_template/_sass/_syntax-highlighting.scss
new file mode 100644
index 0000000..8fac597
--- /dev/null
+++ b/lib/site_template/_sass/_syntax-highlighting.scss
@@ -0,0 +1,71 @@
+/**
+ * Syntax highlighting styles
+ */
+.highlight {
+ background: #fff;
+ @extend %vertical-rhythm;
+
+ .highlighter-rouge & {
+ background: #eef;
+ }
+
+ .c { color: #998; font-style: italic } // Comment
+ .err { color: #a61717; background-color: #e3d2d2 } // Error
+ .k { font-weight: bold } // Keyword
+ .o { font-weight: bold } // Operator
+ .cm { color: #998; font-style: italic } // Comment.Multiline
+ .cp { color: #999; font-weight: bold } // Comment.Preproc
+ .c1 { color: #998; font-style: italic } // Comment.Single
+ .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
+ .gd { color: #000; background-color: #fdd } // Generic.Deleted
+ .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
+ .ge { font-style: italic } // Generic.Emph
+ .gr { color: #a00 } // Generic.Error
+ .gh { color: #999 } // Generic.Heading
+ .gi { color: #000; background-color: #dfd } // Generic.Inserted
+ .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
+ .go { color: #888 } // Generic.Output
+ .gp { color: #555 } // Generic.Prompt
+ .gs { font-weight: bold } // Generic.Strong
+ .gu { color: #aaa } // Generic.Subheading
+ .gt { color: #a00 } // Generic.Traceback
+ .kc { font-weight: bold } // Keyword.Constant
+ .kd { font-weight: bold } // Keyword.Declaration
+ .kp { font-weight: bold } // Keyword.Pseudo
+ .kr { font-weight: bold } // Keyword.Reserved
+ .kt { color: #458; font-weight: bold } // Keyword.Type
+ .m { color: #099 } // Literal.Number
+ .s { color: #d14 } // Literal.String
+ .na { color: #008080 } // Name.Attribute
+ .nb { color: #0086B3 } // Name.Builtin
+ .nc { color: #458; font-weight: bold } // Name.Class
+ .no { color: #008080 } // Name.Constant
+ .ni { color: #800080 } // Name.Entity
+ .ne { color: #900; font-weight: bold } // Name.Exception
+ .nf { color: #900; font-weight: bold } // Name.Function
+ .nn { color: #555 } // Name.Namespace
+ .nt { color: #000080 } // Name.Tag
+ .nv { color: #008080 } // Name.Variable
+ .ow { font-weight: bold } // Operator.Word
+ .w { color: #bbb } // Text.Whitespace
+ .mf { color: #099 } // Literal.Number.Float
+ .mh { color: #099 } // Literal.Number.Hex
+ .mi { color: #099 } // Literal.Number.Integer
+ .mo { color: #099 } // Literal.Number.Oct
+ .sb { color: #d14 } // Literal.String.Backtick
+ .sc { color: #d14 } // Literal.String.Char
+ .sd { color: #d14 } // Literal.String.Doc
+ .s2 { color: #d14 } // Literal.String.Double
+ .se { color: #d14 } // Literal.String.Escape
+ .sh { color: #d14 } // Literal.String.Heredoc
+ .si { color: #d14 } // Literal.String.Interpol
+ .sx { color: #d14 } // Literal.String.Other
+ .sr { color: #009926 } // Literal.String.Regex
+ .s1 { color: #d14 } // Literal.String.Single
+ .ss { color: #990073 } // Literal.String.Symbol
+ .bp { color: #999 } // Name.Builtin.Pseudo
+ .vc { color: #008080 } // Name.Variable.Class
+ .vg { color: #008080 } // Name.Variable.Global
+ .vi { color: #008080 } // Name.Variable.Instance
+ .il { color: #099 } // Literal.Number.Integer.Long
+}
diff --git a/lib/site_template/about.md b/lib/site_template/about.md
index 3ed64bb..d0e6de5 100644
--- a/lib/site_template/about.md
+++ b/lib/site_template/about.md
@@ -6,6 +6,10 @@ permalink: /about/
This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](http://jekyllrb.com/)
-You can find the source code for the Jekyll new theme at: [github.com/jglovier/jekyll-new](https://github.com/jglovier/jekyll-new)
+You can find the source code for the Jekyll new theme at:
+{% include icon-github.html username="jglovier" %} /
+[jekyll-new](https://github.com/jglovier/jekyll-new)
-You can find the source code for Jekyll at [github.com/jekyll/jekyll](https://github.com/jekyll/jekyll)
+You can find the source code for Jekyll at
+{% include icon-github.html username="jekyll" %} /
+[jekyll](https://github.com/jekyll/jekyll)
diff --git a/lib/site_template/css/main.css b/lib/site_template/css/main.css
deleted file mode 100644
index 88090a3..0000000
--- a/lib/site_template/css/main.css
+++ /dev/null
@@ -1,410 +0,0 @@
-/* Base */
-/* ----------------------------------------------------------*/
-
-* {
- margin: 0;
- padding: 0;
-}
-
-html, body { height: 100%; }
-
-body {
- font-family: Helvetica, Arial, sans-serif;
- font-size: 16px;
- line-height: 1.5;
- font-weight: 300;
- background-color: #fdfdfd;
-}
-
-h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: 400; }
-
-a { color: #2a7ae2; text-decoration: none; }
-a:hover { color: #000; text-decoration: underline; }
-a:visited { color: #205caa; }
-
-/* Utility */
-
-.wrap:before,
-.wrap:after { content:""; display:table; }
-.wrap:after { clear: both; }
-.wrap {
- max-width: 800px;
- padding: 0 30px;
- margin: 0 auto;
- zoom: 1;
-}
-
-
-/* Layout Styles */
-/* ----------------------------------------------------------*/
-
-/* Site header */
-
-.site-header {
- border-top: 5px solid #333;
- border-bottom: 1px solid #e8e8e8;
- min-height: 56px;
- background-color: white;
-}
-
-.site-title,
-.site-title:hover,
-.site-title:visited {
- display: block;
- color: #333;
- font-size: 26px;
- letter-spacing: -1px;
- float: left;
- line-height: 56px;
- position: relative;
- z-index: 1;
-}
-
-.site-nav {
- float: right;
- line-height: 56px;
-}
-
-.site-nav .menu-icon { display: none; }
-
-.site-nav .page-link {
- margin-left: 20px;
- color: #727272;
- letter-spacing: -.5px;
-}
-
-/* Site footer */
-
-.site-footer {
- border-top: 1px solid #e8e8e8;
- padding: 30px 0;
-}
-
-.footer-heading {
- font-size: 18px;
- font-weight: 300;
- letter-spacing: -.5px;
- margin-bottom: 15px;
-}
-
-.site-footer .column { float: left; margin-bottom: 15px; }
-
-.footer-col-1 {
- width: 270px; /*fallback*/
- width: -webkit-calc(35% - 10px);
- width: -moz-calc(35% - 10px);
- width: -o-calc(35% - 10px);
- width: calc(35% - 10px);
- margin-right: 10px
-}
-.footer-col-2 {
- width: 175px; /*fallback*/
- width: -webkit-calc(23.125% - 10px);
- width: -moz-calc(23.125% - 10px);
- width: -o-calc(23.125% - 10px);
- width: calc(23.125% - 10px);
- margin-right: 10px
-}
-.footer-col-3 {
- width: 335px; /*fallback*/
- width: -webkit-calc(41.875%);
- width: -moz-calc(41.875%);
- width: -o-calc(41.875%);
- width: calc(41.875%);
-}
-
-.site-footer ul { list-style: none; }
-
-.site-footer li,
-.site-footer p {
- font-size: 15px;
- letter-spacing: -.3px;
- color: #828282;
-}
-
-.github-icon-svg,
-.twitter-icon-svg {
- display: inline-block;
- width: 16px;
- height: 16px;
- position: relative;
- top: 3px;
-}
-
-
-/* Page Content styles */
-/* ----------------------------------------------------------*/
-
-.page-content {
- padding: 30px 0;
- background-color: #fff;
-}
-
-
-/* Home styles */
-/* ----------------------------------------------------------*/
-
-.home h1 { margin-bottom: 25px; }
-
-.posts { list-style-type: none; }
-
-.posts li { margin-bottom: 30px; }
-
-.posts .post-link {
- font-size: 24px;
- letter-spacing: -1px;
- line-height: 1;
-}
-
-.posts .post-date {
- display: block;
- font-size: 15px;
- color: #818181;
-}
-
-
-/* Post styles */
-/* ----------------------------------------------------------*/
-
-.post-header { margin: 10px 0 30px; }
-
-.post-header h1 {
- font-size: 42px;
- letter-spacing: -1.75px;
- line-height: 1;
- font-weight: 300;
-}
-
-.post-header .meta {
- font-size: 15px;
- color: #818181;
- margin-top: 5px;
-}
-
-.post-content { margin: 0 0 30px; }
-
-.post-content > * { margin: 20px 0; }
-
-
-.post-content h1,
-.post-content h2,
-.post-content h3,
-.post-content h4,
-.post-content h5,
-.post-content h6 {
- line-height: 1;
- font-weight: 300;
- margin: 40px 0 20px;
-}
-
-.post-content h2 {
- font-size: 32px;
- letter-spacing: -1.25px;
-}
-
-.post-content h3 {
- font-size: 26px;
- letter-spacing: -1px;
-}
-
-.post-content h4 {
- font-size: 20px;
- letter-spacing: -1px;
-}
-
-.post-content blockquote {
- border-left: 4px solid #e8e8e8;
- padding-left: 20px;
- font-size: 18px;
- opacity: .6;
- letter-spacing: -1px;
- font-style: italic;
- margin: 30px 0;
-}
-
-.post-content ul,
-.post-content ol { padding-left: 20px; }
-
-.post pre,
-.post code {
- border: 1px solid #d5d5e9;
- background-color: #eef;
- padding: 8px 12px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- font-size: 15px;
- overflow:scroll;
-}
-
-.post code { padding: 1px 5px; }
-
-.post ul,
-.post ol { margin-left: 1.35em; }
-
-.post pre code {
- border: 0;
- padding-right: 0;
- padding-left: 0;
-}
-
-/* terminal */
-.post pre.terminal {
- border: 1px solid #000;
- background-color: #333;
- color: #FFF;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-.post pre.terminal code { background-color: #333; }
-
-/* Syntax highlighting styles */
-/* ----------------------------------------------------------*/
-
-.highlight { background: #ffffff; }
-.highlight .c { color: #999988; font-style: italic } /* Comment */
-.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-.highlight .k { font-weight: bold } /* Keyword */
-.highlight .o { font-weight: bold } /* Operator */
-.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
-.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
-.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
-.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
-.highlight .ge { font-style: italic } /* Generic.Emph */
-.highlight .gr { color: #aa0000 } /* Generic.Error */
-.highlight .gh { color: #999999 } /* Generic.Heading */
-.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
-.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
-.highlight .go { color: #888888 } /* Generic.Output */
-.highlight .gp { color: #555555 } /* Generic.Prompt */
-.highlight .gs { font-weight: bold } /* Generic.Strong */
-.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
-.highlight .gt { color: #aa0000 } /* Generic.Traceback */
-.highlight .kc { font-weight: bold } /* Keyword.Constant */
-.highlight .kd { font-weight: bold } /* Keyword.Declaration */
-.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
-.highlight .kr { font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
-.highlight .m { color: #009999 } /* Literal.Number */
-.highlight .s { color: #d14 } /* Literal.String */
-.highlight .na { color: #008080 } /* Name.Attribute */
-.highlight .nb { color: #0086B3 } /* Name.Builtin */
-.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
-.highlight .no { color: #008080 } /* Name.Constant */
-.highlight .ni { color: #800080 } /* Name.Entity */
-.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
-.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
-.highlight .nn { color: #555555 } /* Name.Namespace */
-.highlight .nt { color: #000080 } /* Name.Tag */
-.highlight .nv { color: #008080 } /* Name.Variable */
-.highlight .ow { font-weight: bold } /* Operator.Word */
-.highlight .w { color: #bbbbbb } /* Text.Whitespace */
-.highlight .mf { color: #009999 } /* Literal.Number.Float */
-.highlight .mh { color: #009999 } /* Literal.Number.Hex */
-.highlight .mi { color: #009999 } /* Literal.Number.Integer */
-.highlight .mo { color: #009999 } /* Literal.Number.Oct */
-.highlight .sb { color: #d14 } /* Literal.String.Backtick */
-.highlight .sc { color: #d14 } /* Literal.String.Char */
-.highlight .sd { color: #d14 } /* Literal.String.Doc */
-.highlight .s2 { color: #d14 } /* Literal.String.Double */
-.highlight .se { color: #d14 } /* Literal.String.Escape */
-.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
-.highlight .si { color: #d14 } /* Literal.String.Interpol */
-.highlight .sx { color: #d14 } /* Literal.String.Other */
-.highlight .sr { color: #009926 } /* Literal.String.Regex */
-.highlight .s1 { color: #d14 } /* Literal.String.Single */
-.highlight .ss { color: #990073 } /* Literal.String.Symbol */
-.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
-.highlight .vc { color: #008080 } /* Name.Variable.Class */
-.highlight .vg { color: #008080 } /* Name.Variable.Global */
-.highlight .vi { color: #008080 } /* Name.Variable.Instance */
-.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
-
-
-/* media queries */
-/* ----------------------------------------------------------*/
-
-
- at media screen and (max-width: 750px) {
-
- .footer-col-1 { width: 50%; }
-
- .footer-col-2 {
- width: 45%; /*fallback*/
- width: -webkit-calc(50% - 10px);
- width: -moz-calc(50% - 10px);
- width: -o-calc(50% - 10px);
- width: calc(50% - 10px);
- margin-right: 0;
- }
-
- .site-footer .column.footer-col-3 {
- width: auto;
- float: none;
- clear: both;
- }
-
-}
-
- at media screen and (max-width: 600px) {
-
- .wrap { padding: 0 12px; }
-
- .site-nav {
- position: fixed;
- z-index: 10;
- top: 14px; right: 8px;
- background-color: white;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 1px solid #e8e8e8;
- }
-
- .site-nav .menu-icon {
- display: block;
- font-size: 24px;
- color: #505050;
- float: right;
- width: 36px;
- text-align: center;
- line-height: 36px;
- }
-
- .site-nav .menu-icon svg { width: 18px; height: 16px; }
-
- .site-nav .trigger {
- clear: both;
- margin-bottom: 5px;
- display: none;
- }
-
- .site-nav:hover .trigger { display: block; }
-
- .site-nav .page-link {
- display: block;
- text-align: right;
- line-height: 1.25;
- padding: 5px 10px;
- margin: 0;
- }
-
- .post-header h1 { font-size: 36px; }
- .post-content h2 { font-size: 28px; }
- .post-content h3 { font-size: 22px; }
- .post-content h4 { font-size: 18px; }
- .post-content blockquote { padding-left: 10px; }
- .post-content ul,
- .post-content ol { padding-left: 10px; }
-
- .site-footer .column {
- float: none;
- clear: both;
- width: auto;
- margin: 0 0 15px; }
-
-}
diff --git a/lib/site_template/css/main.scss b/lib/site_template/css/main.scss
new file mode 100644
index 0000000..f2e566e
--- /dev/null
+++ b/lib/site_template/css/main.scss
@@ -0,0 +1,53 @@
+---
+# Only the main Sass file needs front matter (the dashes are enough)
+---
+ at charset "utf-8";
+
+
+
+// Our variables
+$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+$base-font-size: 16px;
+$base-font-weight: 400;
+$small-font-size: $base-font-size * 0.875;
+$base-line-height: 1.5;
+
+$spacing-unit: 30px;
+
+$text-color: #111;
+$background-color: #fdfdfd;
+$brand-color: #2a7ae2;
+
+$grey-color: #828282;
+$grey-color-light: lighten($grey-color, 40%);
+$grey-color-dark: darken($grey-color, 25%);
+
+// Width of the content area
+$content-width: 800px;
+
+$on-palm: 600px;
+$on-laptop: 800px;
+
+
+
+// Use media queries like this:
+// @include media-query($on-palm) {
+// .wrapper {
+// padding-right: $spacing-unit / 2;
+// padding-left: $spacing-unit / 2;
+// }
+// }
+ at mixin media-query($device) {
+ @media screen and (max-width: $device) {
+ @content;
+ }
+}
+
+
+
+// Import partials from `sass_dir` (defaults to `_sass`)
+ at import
+ "base",
+ "layout",
+ "syntax-highlighting"
+;
diff --git a/lib/site_template/feed.xml b/lib/site_template/feed.xml
index 4d7f8a4..a6628bd 100644
--- a/lib/site_template/feed.xml
+++ b/lib/site_template/feed.xml
@@ -1,5 +1,5 @@
---
-layout: none
+layout: null
---
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
@@ -7,7 +7,7 @@ layout: none
<title>{{ site.title | xml_escape }}</title>
<description>{{ site.description | xml_escape }}</description>
<link>{{ site.url }}{{ site.baseurl }}/</link>
- <atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml" />
+ <atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml"/>
<pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
<lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
<generator>Jekyll v{{ jekyll.version }}</generator>
diff --git a/lib/site_template/index.html b/lib/site_template/index.html
index a9f5097..83d9398 100644
--- a/lib/site_template/index.html
+++ b/lib/site_template/index.html
@@ -4,13 +4,16 @@ layout: default
<div class="home">
- <h1>Posts</h1>
+ <h1 class="page-heading">Posts</h1>
- <ul class="posts">
+ <ul class="post-list">
{% for post in site.posts %}
<li>
- <span class="post-date">{{ post.date | date: "%b %-d, %Y" }}</span>
- <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
+ <span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>
+
+ <h2>
+ <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
+ </h2>
</li>
{% endfor %}
</ul>
diff --git a/metadata.yml b/metadata.yml
deleted file mode 100644
index 34220ef..0000000
--- a/metadata.yml
+++ /dev/null
@@ -1,957 +0,0 @@
---- !ruby/object:Gem::Specification
-name: jekyll
-version: !ruby/object:Gem::Version
- version: 2.2.0
-platform: ruby
-authors:
-- Tom Preston-Werner
-autorequire:
-bindir: bin
-cert_chain: []
-date: 2014-07-29 00:00:00.000000000 Z
-dependencies:
-- !ruby/object:Gem::Dependency
- name: liquid
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 2.6.1
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 2.6.1
-- !ruby/object:Gem::Dependency
- name: kramdown
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.3'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.3'
-- !ruby/object:Gem::Dependency
- name: mercenary
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.3.3
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.3.3
-- !ruby/object:Gem::Dependency
- name: safe_yaml
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
-- !ruby/object:Gem::Dependency
- name: colorator
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '0.1'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '0.1'
-- !ruby/object:Gem::Dependency
- name: classifier
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.3'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.3'
-- !ruby/object:Gem::Dependency
- name: pygments.rb
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.6.0
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.6.0
-- !ruby/object:Gem::Dependency
- name: redcarpet
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '3.1'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '3.1'
-- !ruby/object:Gem::Dependency
- name: toml
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.1.0
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.1.0
-- !ruby/object:Gem::Dependency
- name: jekyll-paginate
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
-- !ruby/object:Gem::Dependency
- name: jekyll-gist
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
-- !ruby/object:Gem::Dependency
- name: jekyll-coffeescript
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
-- !ruby/object:Gem::Dependency
- name: jekyll-sass-converter
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
-- !ruby/object:Gem::Dependency
- name: jekyll-watch
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
- type: :runtime
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.0'
-- !ruby/object:Gem::Dependency
- name: rake
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '10.1'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '10.1'
-- !ruby/object:Gem::Dependency
- name: rdoc
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '3.11'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '3.11'
-- !ruby/object:Gem::Dependency
- name: redgreen
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.2'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.2'
-- !ruby/object:Gem::Dependency
- name: shoulda
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '3.5'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '3.5'
-- !ruby/object:Gem::Dependency
- name: rr
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.1'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.1'
-- !ruby/object:Gem::Dependency
- name: cucumber
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - '='
- - !ruby/object:Gem::Version
- version: 1.3.11
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - '='
- - !ruby/object:Gem::Version
- version: 1.3.11
-- !ruby/object:Gem::Dependency
- name: RedCloth
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '4.2'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '4.2'
-- !ruby/object:Gem::Dependency
- name: maruku
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.7.0
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 0.7.0
-- !ruby/object:Gem::Dependency
- name: rdiscount
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.6'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.6'
-- !ruby/object:Gem::Dependency
- name: launchy
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '2.3'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '2.3'
-- !ruby/object:Gem::Dependency
- name: simplecov
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '0.7'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '0.7'
-- !ruby/object:Gem::Dependency
- name: simplecov-gem-adapter
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 1.0.1
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 1.0.1
-- !ruby/object:Gem::Dependency
- name: mime-types
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.5'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.5'
-- !ruby/object:Gem::Dependency
- name: activesupport
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 3.2.13
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: 3.2.13
-- !ruby/object:Gem::Dependency
- name: jekyll_test_plugin
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: jekyll_test_plugin_malicious
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: rouge
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.3'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - "~>"
- - !ruby/object:Gem::Version
- version: '1.3'
-description: Jekyll is a simple, blog aware, static site generator.
-email: tom at mojombo.com
-executables:
-- jekyll
-extensions: []
-extra_rdoc_files:
-- README.markdown
-- LICENSE
-files:
-- ".gitignore"
-- ".travis.yml"
-- CONTRIBUTING.markdown
-- Gemfile
-- History.markdown
-- LICENSE
-- README.markdown
-- Rakefile
-- bin/jekyll
-- cucumber.yml
-- docs/jp/CONTRIBUTING.jp.markdown
-- docs/jp/README.jp.markdown
-- features/collections.feature
-- features/create_sites.feature
-- features/data.feature
-- features/drafts.feature
-- features/embed_filters.feature
-- features/frontmatter_defaults.feature
-- features/include_tag.feature
-- features/markdown.feature
-- features/pagination.feature
-- features/permalinks.feature
-- features/post_data.feature
-- features/post_excerpts.feature
-- features/rendering.feature
-- features/site_configuration.feature
-- features/site_data.feature
-- features/step_definitions/jekyll_steps.rb
-- features/support/env.rb
-- jekyll.gemspec
-- lib/jekyll.rb
-- lib/jekyll/cleaner.rb
-- lib/jekyll/collection.rb
-- lib/jekyll/command.rb
-- lib/jekyll/commands/build.rb
-- lib/jekyll/commands/docs.rb
-- lib/jekyll/commands/doctor.rb
-- lib/jekyll/commands/new.rb
-- lib/jekyll/commands/serve.rb
-- lib/jekyll/configuration.rb
-- lib/jekyll/converter.rb
-- lib/jekyll/converters/identity.rb
-- lib/jekyll/converters/markdown.rb
-- lib/jekyll/converters/markdown/kramdown_parser.rb
-- lib/jekyll/converters/markdown/maruku_parser.rb
-- lib/jekyll/converters/markdown/rdiscount_parser.rb
-- lib/jekyll/converters/markdown/redcarpet_parser.rb
-- lib/jekyll/converters/textile.rb
-- lib/jekyll/convertible.rb
-- lib/jekyll/deprecator.rb
-- lib/jekyll/document.rb
-- lib/jekyll/draft.rb
-- lib/jekyll/entry_filter.rb
-- lib/jekyll/errors.rb
-- lib/jekyll/excerpt.rb
-- lib/jekyll/filters.rb
-- lib/jekyll/frontmatter_defaults.rb
-- lib/jekyll/generator.rb
-- lib/jekyll/layout.rb
-- lib/jekyll/layout_reader.rb
-- lib/jekyll/liquid_extensions.rb
-- lib/jekyll/log_adapter.rb
-- lib/jekyll/mime.types
-- lib/jekyll/page.rb
-- lib/jekyll/plugin.rb
-- lib/jekyll/plugin_manager.rb
-- lib/jekyll/post.rb
-- lib/jekyll/publisher.rb
-- lib/jekyll/related_posts.rb
-- lib/jekyll/renderer.rb
-- lib/jekyll/site.rb
-- lib/jekyll/static_file.rb
-- lib/jekyll/stevenson.rb
-- lib/jekyll/tags/highlight.rb
-- lib/jekyll/tags/include.rb
-- lib/jekyll/tags/post_url.rb
-- lib/jekyll/url.rb
-- lib/jekyll/utils.rb
-- lib/jekyll/version.rb
-- lib/site_template/.gitignore
-- lib/site_template/_config.yml
-- lib/site_template/_includes/footer.html
-- lib/site_template/_includes/head.html
-- lib/site_template/_includes/header.html
-- lib/site_template/_layouts/default.html
-- lib/site_template/_layouts/page.html
-- lib/site_template/_layouts/post.html
-- lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
-- lib/site_template/about.md
-- lib/site_template/css/main.css
-- lib/site_template/feed.xml
-- lib/site_template/index.html
-- script/bootstrap
-- script/branding
-- script/cibuild
-- script/console
-- script/proof
-- script/rebund
-- script/test
-- site/.gitignore
-- site/CNAME
-- site/README
-- site/_config.yml
-- site/_data/docs.yml
-- site/_includes/analytics.html
-- site/_includes/anchor_links.html
-- site/_includes/css/font-awesome.css
-- site/_includes/css/gridism.css
-- site/_includes/css/normalize.css
-- site/_includes/css/pygments.css
-- site/_includes/css/style.css
-- site/_includes/docs_contents.html
-- site/_includes/docs_contents_mobile.html
-- site/_includes/docs_option.html
-- site/_includes/docs_ul.html
-- site/_includes/footer.html
-- site/_includes/header.html
-- site/_includes/news_contents.html
-- site/_includes/news_contents_mobile.html
-- site/_includes/news_item.html
-- site/_includes/primary-nav-items.html
-- site/_includes/section_nav.html
-- site/_includes/top.html
-- site/_layouts/default.html
-- site/_layouts/docs.html
-- site/_layouts/news.html
-- site/_layouts/news_item.html
-- site/_posts/2013-05-06-jekyll-1-0-0-released.markdown
-- site/_posts/2013-05-08-jekyll-1-0-1-released.markdown
-- site/_posts/2013-05-12-jekyll-1-0-2-released.markdown
-- site/_posts/2013-06-07-jekyll-1-0-3-released.markdown
-- site/_posts/2013-07-14-jekyll-1-1-0-released.markdown
-- site/_posts/2013-07-24-jekyll-1-1-1-released.markdown
-- site/_posts/2013-07-25-jekyll-1-0-4-released.markdown
-- site/_posts/2013-07-25-jekyll-1-1-2-released.markdown
-- site/_posts/2013-09-06-jekyll-1-2-0-released.markdown
-- site/_posts/2013-09-14-jekyll-1-2-1-released.markdown
-- site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown
-- site/_posts/2013-11-04-jekyll-1-3-0-released.markdown
-- site/_posts/2013-11-26-jekyll-1-3-1-released.markdown
-- site/_posts/2013-12-07-jekyll-1-4-0-released.markdown
-- site/_posts/2013-12-09-jekyll-1-4-1-released.markdown
-- site/_posts/2013-12-16-jekyll-1-4-2-released.markdown
-- site/_posts/2014-01-13-jekyll-1-4-3-released.markdown
-- site/_posts/2014-03-24-jekyll-1-5-0-released.markdown
-- site/_posts/2014-03-27-jekyll-1-5-1-released.markdown
-- site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown
-- site/_posts/2014-05-08-jekyll-2-0-3-released.markdown
-- site/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown
-- site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown
-- site/_posts/2014-07-01-jekyll-2-1-1-released.markdown
-- site/_posts/2014-07-29-jekyll-2-2-0-released.markdown
-- site/css/screen.css
-- site/docs/assets.md
-- site/docs/collections.md
-- site/docs/configuration.md
-- site/docs/continuous-integration.md
-- site/docs/contributing.md
-- site/docs/datafiles.md
-- site/docs/deployment-methods.md
-- site/docs/drafts.md
-- site/docs/extras.md
-- site/docs/frontmatter.md
-- site/docs/github-pages.md
-- site/docs/history.md
-- site/docs/index.md
-- site/docs/installation.md
-- site/docs/migrations.md
-- site/docs/pages.md
-- site/docs/pagination.md
-- site/docs/permalinks.md
-- site/docs/plugins.md
-- site/docs/posts.md
-- site/docs/quickstart.md
-- site/docs/resources.md
-- site/docs/sites.md
-- site/docs/structure.md
-- site/docs/templates.md
-- site/docs/troubleshooting.md
-- site/docs/upgrading.md
-- site/docs/usage.md
-- site/docs/variables.md
-- site/docs/windows.md
-- site/favicon.ico
-- site/feed.xml
-- site/fonts/FontAwesome.otf
-- site/fonts/fontawesome-webfont.eot
-- site/fonts/fontawesome-webfont.svg
-- site/fonts/fontawesome-webfont.ttf
-- site/fonts/fontawesome-webfont.woff
-- site/freenode.txt
-- site/img/article-footer.png
-- site/img/footer-arrow.png
-- site/img/footer-logo.png
-- site/img/jekyll-sticker.jpg
-- site/img/logo-2x.png
-- site/img/logo-rss.png
-- site/img/octojekyll.png
-- site/index.html
-- site/js/html5shiv.min.js
-- site/js/respond.min.js
-- site/news/index.html
-- site/news/releases/index.html
-- test/fixtures/broken_front_matter1.erb
-- test/fixtures/broken_front_matter2.erb
-- test/fixtures/broken_front_matter3.erb
-- test/fixtures/exploit_front_matter.erb
-- test/fixtures/front_matter.erb
-- test/helper.rb
-- test/source/+/%# +.md
-- test/source/+/foo.md
-- test/source/.htaccess
-- test/source/_config.dev.toml
-- test/source/_data/categories/dairy.yaml
-- test/source/_data/languages.yml
-- test/source/_data/members.json
-- test/source/_data/members.yaml
-- test/source/_data/products.yml
-- test/source/_drafts/draft-properties.text
-- test/source/_includes/include.html
-- test/source/_includes/params.html
-- test/source/_includes/sig.markdown
-- test/source/_layouts/default.html
-- test/source/_layouts/post/simple.html
-- test/source/_layouts/simple.html
-- test/source/_methods/_do_not_read_me.md
-- test/source/_methods/configuration.md
-- test/source/_methods/sanitized_path.md
-- test/source/_methods/site/_dont_include_me_either.md
-- test/source/_methods/site/generate.md
-- test/source/_methods/site/initialize.md
-- test/source/_methods/um_hi.md
-- test/source/_plugins/dummy.rb
-- test/source/_posts/2008-02-02-not-published.textile
-- test/source/_posts/2008-02-02-published.textile
-- test/source/_posts/2008-10-18-foo-bar.textile
-- test/source/_posts/2008-11-21-complex.textile
-- test/source/_posts/2008-12-03-permalinked-post.textile
-- test/source/_posts/2008-12-13-include.markdown
-- test/source/_posts/2009-01-27-array-categories.textile
-- test/source/_posts/2009-01-27-categories.textile
-- test/source/_posts/2009-01-27-category.textile
-- test/source/_posts/2009-01-27-empty-categories.textile
-- test/source/_posts/2009-01-27-empty-category.textile
-- test/source/_posts/2009-01-27-no-category.textile
-- test/source/_posts/2009-03-12-hash-#1.markdown
-- test/source/_posts/2009-05-18-empty-tag.textile
-- test/source/_posts/2009-05-18-empty-tags.textile
-- test/source/_posts/2009-05-18-tag.textile
-- test/source/_posts/2009-05-18-tags.textile
-- test/source/_posts/2009-06-22-empty-yaml.textile
-- test/source/_posts/2009-06-22-no-yaml.textile
-- test/source/_posts/2010-01-08-triple-dash.markdown
-- test/source/_posts/2010-01-09-date-override.textile
-- test/source/_posts/2010-01-09-time-override.textile
-- test/source/_posts/2010-01-09-timezone-override.textile
-- test/source/_posts/2010-01-16-override-data.textile
-- test/source/_posts/2011-04-12-md-extension.md
-- test/source/_posts/2011-04-12-text-extension.text
-- test/source/_posts/2013-01-02-post-excerpt.markdown
-- test/source/_posts/2013-01-12-nil-layout.textile
-- test/source/_posts/2013-01-12-no-layout.textile
-- test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep
-- test/source/_posts/2013-04-11-custom-excerpt.markdown
-- test/source/_posts/2013-05-10-number-category.textile
-- test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
-- test/source/_posts/2013-08-01-mkdn-extension.mkdn
-- test/source/_posts/2013-12-17-include-variable-filters.markdown
-- test/source/_posts/2013-12-20-properties.text
-- test/source/_posts/2014-01-06-permalink-traversal.md
-- test/source/_posts/2014-03-03-yaml-with-dots.md
-- test/source/_posts/2014-03-22-escape-+ %20[].markdown
-- test/source/_posts/es/2008-11-21-nested.textile
-- test/source/_sass/_grid.scss
-- test/source/_slides/example-slide-1.html
-- test/source/_slides/example-slide-2.html
-- test/source/_slides/example-slide-3.html
-- test/source/_with.dots/all.dots/2.4.0.md
-- test/source/_with.dots/file.with.dots.md
-- test/source/about.html
-- test/source/category/_posts/2008-9-23-categories.textile
-- test/source/contacts.html
-- test/source/contacts/bar.html
-- test/source/contacts/index.html
-- test/source/css/main.scss
-- test/source/css/screen.css
-- test/source/deal.with.dots.html
-- test/source/environment.html
-- test/source/exploit.md
-- test/source/foo/_posts/bar/2008-12-12-topical-post.textile
-- test/source/index.html
-- test/source/js/coffeescript.coffee
-- test/source/pgp.key
-- test/source/products.yml
-- test/source/properties.html
-- test/source/sitemap.xml
-- test/source/static_files.html
-- test/source/symlink-test/symlinked-file
-- test/source/unpublished.html
-- test/source/win/_posts/2009-05-24-yaml-linebreak.markdown
-- test/source/z_category/_posts/2008-9-23-categories.textile
-- test/suite.rb
-- test/test_cleaner.rb
-- test/test_coffeescript.rb
-- test/test_collections.rb
-- test/test_command.rb
-- test/test_configuration.rb
-- test/test_convertible.rb
-- test/test_document.rb
-- test/test_draft.rb
-- test/test_entry_filter.rb
-- test/test_excerpt.rb
-- test/test_filters.rb
-- test/test_generated_site.rb
-- test/test_kramdown.rb
-- test/test_layout_reader.rb
-- test/test_liquid_extensions.rb
-- test/test_log_adapter.rb
-- test/test_new_command.rb
-- test/test_page.rb
-- test/test_path_sanitization.rb
-- test/test_post.rb
-- test/test_rdiscount.rb
-- test/test_redcarpet.rb
-- test/test_redcloth.rb
-- test/test_related_posts.rb
-- test/test_sass.rb
-- test/test_site.rb
-- test/test_tags.rb
-- test/test_url.rb
-- test/test_utils.rb
-homepage: https://github.com/jekyll/jekyll
-licenses:
-- MIT
-metadata: {}
-post_install_message:
-rdoc_options:
-- "--charset=UTF-8"
-require_paths:
-- lib
-required_ruby_version: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 1.9.3
-required_rubygems_version: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-requirements: []
-rubyforge_project:
-rubygems_version: 2.2.2
-signing_key:
-specification_version: 2
-summary: A simple, blog aware, static site generator.
-test_files:
-- features/collections.feature
-- features/create_sites.feature
-- features/data.feature
-- features/drafts.feature
-- features/embed_filters.feature
-- features/frontmatter_defaults.feature
-- features/include_tag.feature
-- features/markdown.feature
-- features/pagination.feature
-- features/permalinks.feature
-- features/post_data.feature
-- features/post_excerpts.feature
-- features/rendering.feature
-- features/site_configuration.feature
-- features/site_data.feature
-- features/step_definitions/jekyll_steps.rb
-- features/support/env.rb
-- test/fixtures/broken_front_matter1.erb
-- test/fixtures/broken_front_matter2.erb
-- test/fixtures/broken_front_matter3.erb
-- test/fixtures/exploit_front_matter.erb
-- test/fixtures/front_matter.erb
-- test/helper.rb
-- test/source/+/%# +.md
-- test/source/+/foo.md
-- test/source/.htaccess
-- test/source/_config.dev.toml
-- test/source/_data/categories/dairy.yaml
-- test/source/_data/languages.yml
-- test/source/_data/members.json
-- test/source/_data/members.yaml
-- test/source/_data/products.yml
-- test/source/_drafts/draft-properties.text
-- test/source/_includes/include.html
-- test/source/_includes/params.html
-- test/source/_includes/sig.markdown
-- test/source/_layouts/default.html
-- test/source/_layouts/post/simple.html
-- test/source/_layouts/simple.html
-- test/source/_methods/_do_not_read_me.md
-- test/source/_methods/configuration.md
-- test/source/_methods/sanitized_path.md
-- test/source/_methods/site/_dont_include_me_either.md
-- test/source/_methods/site/generate.md
-- test/source/_methods/site/initialize.md
-- test/source/_methods/um_hi.md
-- test/source/_plugins/dummy.rb
-- test/source/_posts/2008-02-02-not-published.textile
-- test/source/_posts/2008-02-02-published.textile
-- test/source/_posts/2008-10-18-foo-bar.textile
-- test/source/_posts/2008-11-21-complex.textile
-- test/source/_posts/2008-12-03-permalinked-post.textile
-- test/source/_posts/2008-12-13-include.markdown
-- test/source/_posts/2009-01-27-array-categories.textile
-- test/source/_posts/2009-01-27-categories.textile
-- test/source/_posts/2009-01-27-category.textile
-- test/source/_posts/2009-01-27-empty-categories.textile
-- test/source/_posts/2009-01-27-empty-category.textile
-- test/source/_posts/2009-01-27-no-category.textile
-- test/source/_posts/2009-03-12-hash-#1.markdown
-- test/source/_posts/2009-05-18-empty-tag.textile
-- test/source/_posts/2009-05-18-empty-tags.textile
-- test/source/_posts/2009-05-18-tag.textile
-- test/source/_posts/2009-05-18-tags.textile
-- test/source/_posts/2009-06-22-empty-yaml.textile
-- test/source/_posts/2009-06-22-no-yaml.textile
-- test/source/_posts/2010-01-08-triple-dash.markdown
-- test/source/_posts/2010-01-09-date-override.textile
-- test/source/_posts/2010-01-09-time-override.textile
-- test/source/_posts/2010-01-09-timezone-override.textile
-- test/source/_posts/2010-01-16-override-data.textile
-- test/source/_posts/2011-04-12-md-extension.md
-- test/source/_posts/2011-04-12-text-extension.text
-- test/source/_posts/2013-01-02-post-excerpt.markdown
-- test/source/_posts/2013-01-12-nil-layout.textile
-- test/source/_posts/2013-01-12-no-layout.textile
-- test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep
-- test/source/_posts/2013-04-11-custom-excerpt.markdown
-- test/source/_posts/2013-05-10-number-category.textile
-- test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
-- test/source/_posts/2013-08-01-mkdn-extension.mkdn
-- test/source/_posts/2013-12-17-include-variable-filters.markdown
-- test/source/_posts/2013-12-20-properties.text
-- test/source/_posts/2014-01-06-permalink-traversal.md
-- test/source/_posts/2014-03-03-yaml-with-dots.md
-- test/source/_posts/2014-03-22-escape-+ %20[].markdown
-- test/source/_posts/es/2008-11-21-nested.textile
-- test/source/_sass/_grid.scss
-- test/source/_slides/example-slide-1.html
-- test/source/_slides/example-slide-2.html
-- test/source/_slides/example-slide-3.html
-- test/source/_with.dots/all.dots/2.4.0.md
-- test/source/_with.dots/file.with.dots.md
-- test/source/about.html
-- test/source/category/_posts/2008-9-23-categories.textile
-- test/source/contacts.html
-- test/source/contacts/bar.html
-- test/source/contacts/index.html
-- test/source/css/main.scss
-- test/source/css/screen.css
-- test/source/deal.with.dots.html
-- test/source/environment.html
-- test/source/exploit.md
-- test/source/foo/_posts/bar/2008-12-12-topical-post.textile
-- test/source/index.html
-- test/source/js/coffeescript.coffee
-- test/source/pgp.key
-- test/source/products.yml
-- test/source/properties.html
-- test/source/sitemap.xml
-- test/source/static_files.html
-- test/source/symlink-test/symlinked-file
-- test/source/unpublished.html
-- test/source/win/_posts/2009-05-24-yaml-linebreak.markdown
-- test/source/z_category/_posts/2008-9-23-categories.textile
-- test/suite.rb
-- test/test_cleaner.rb
-- test/test_coffeescript.rb
-- test/test_collections.rb
-- test/test_command.rb
-- test/test_configuration.rb
-- test/test_convertible.rb
-- test/test_document.rb
-- test/test_draft.rb
-- test/test_entry_filter.rb
-- test/test_excerpt.rb
-- test/test_filters.rb
-- test/test_generated_site.rb
-- test/test_kramdown.rb
-- test/test_layout_reader.rb
-- test/test_liquid_extensions.rb
-- test/test_log_adapter.rb
-- test/test_new_command.rb
-- test/test_page.rb
-- test/test_path_sanitization.rb
-- test/test_post.rb
-- test/test_rdiscount.rb
-- test/test_redcarpet.rb
-- test/test_redcloth.rb
-- test/test_related_posts.rb
-- test/test_sass.rb
-- test/test_site.rb
-- test/test_tags.rb
-- test/test_url.rb
-- test/test_utils.rb
diff --git a/script/bootstrap b/script/bootstrap
index 097f3e2..054a2c2 100755
--- a/script/bootstrap
+++ b/script/bootstrap
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
script/branding
-bundle install
+bundle install -j8
diff --git a/script/branding b/script/branding
index 2df6c67..2708f4d 100755
--- a/script/branding
+++ b/script/branding
@@ -1,4 +1,4 @@
-#! /bin/bash
+#!/usr/bin/env bash
echo " ---------------------------------------------------------- "
echo " _ ______ _ __ __ __ _ _ "
diff --git a/script/cibuild b/script/cibuild
index acc4b70..afafd7d 100755
--- a/script/cibuild
+++ b/script/cibuild
@@ -1,7 +1,15 @@
-#! /bin/bash
-
-set -e
+#!/usr/bin/env bash
script/branding
-script/proof
-script/test
+
+if [[ -z "$TEST_SUITE" ]]
+then
+ script/test ci
+ script/cucumber
+elif [[ -x "script/$TEST_SUITE" ]]
+then
+ script/$TEST_SUITE
+else
+ echo "Unknown test suite."
+ exit 1
+fi
diff --git a/script/cucumber b/script/cucumber
new file mode 100755
index 0000000..13508c8
--- /dev/null
+++ b/script/cucumber
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+if ruby --version | grep -q "jruby"
+then
+ echo "Move along, we are not testing features on JRuby right now."
+ exit 0
+else
+ time ruby -S bundle exec cucumber \
+ -f Features::Support::Overview \
+ "$@"
+fi
diff --git a/script/proof b/script/proof
index f3dcd55..c8fff90 100755
--- a/script/proof
+++ b/script/proof
@@ -1,22 +1,34 @@
-#! /bin/bash
+#!/usr/bin/env bash
#
# Usage:
# script/proof
set -e
-git diff --name-only origin $(git log --pretty=format:"%h" -2 | tail -1) | grep '^site/' || {
- echo "No site files changed. We'll skip proofing."
- exit 0
+function msg {
+ printf "\e[0;37m==> $1\e[0m\n"
}
-echo "Some site files have been changed! Proofing..."
+INGORE_HREFS=$(ruby -e 'puts %w{
+ Chrononaut
+ twitter.com
+ nearlyfreespeech.net
+ eduardoboucas.com
+}.map{|h| "/#{h}/"}.join(",")')
+SOURCE="site"
+DESTINATION="_site"
-command -v htmlproof || {
- echo "Installing HTML::Proofer!"
- gem install html-proofer -- --use-system-libraries
-}
+export PROOF=true
+export NOKOGIRI_USE_SYSTEM_LIBRARIES=true
+
+# 1.
+msg "Installing..."
+bundle install -j8 > /dev/null || bundle install > /dev/null
+
+# 2.
+msg "Building..."
+bundle exec jekyll build -s $SOURCE -d $DESTINATION --full-rebuild --trace
-bundle exec jekyll build -s site -d _site --trace
-printf "\e[0;36mProofing begins now!\e[0m\n"
-htmlproof ./_site
+# 3.
+msg "Proofing..."
+time bundle exec htmlproof ./$DESTINATION --href-ignore $INGORE_HREFS
diff --git a/script/rebund b/script/rebund
index 2e8d3b1..d2ff790 100755
--- a/script/rebund
+++ b/script/rebund
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
#
# rebund(1)
#
diff --git a/script/rubyprof b/script/rubyprof
new file mode 100755
index 0000000..18c5777
--- /dev/null
+++ b/script/rubyprof
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+export BENCHMARK=1
+
+TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})"
+
+RUBY=$(cat <<RUBY
+ require 'ruby-prof'
+ result = RubyProf.profile{ ${TEST_SCRIPT} }
+ printer = RubyProf::CallTreePrinter.new(result)
+ filename = "tmp/ruby_prof_#{rand 10000}"
+ puts "Writing profile to #{filename}"
+ file = File.open(filename, "w")
+ printer.print(file, {})
+ file.close
+RUBY
+)
+
+bundle exec ruby -r ./lib/jekyll -e "${RUBY}"
diff --git a/script/stackprof b/script/stackprof
new file mode 100755
index 0000000..3399616
--- /dev/null
+++ b/script/stackprof
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+set -e
+
+export BENCHMARK=true
+command -v stackprof > /dev/null || script/bootstrap
+
+TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})"
+PROF_OUTPUT_FILE=tmp/stackprof-$(date +%Y%m%d%H%M).dump
+
+test -f "$PROF_OUTPUT_FILE" || {
+ bundle exec ruby -r./lib/jekyll -rstackprof \
+ -e "StackProf.run(mode: :cpu, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }"
+}
+
+bundle exec stackprof $PROF_OUTPUT_FILE $@
diff --git a/script/test b/script/test
index a97bd1c..5aab2f0 100755
--- a/script/test
+++ b/script/test
@@ -1,17 +1,56 @@
-#! /bin/bash
-#
+#!/usr/bin/env bash
+set -e
+
# Usage:
+# script/test <test_file>
+# script/test [ruby|jruby]
# script/test
-# script/test <hi>
-set -x
+if [ -d test/dest ]
+ then rm -r test/dest
+fi
+
+# -----------------------------------------------------------------------------
+# If you send us a ruby then we use that, if you do not then we test with
+# whatever we can detect, this way you can run both suites when you test out
+# your source, we expect full coverage now, not just MRI.
+# -----------------------------------------------------------------------------
-if [ -z "$1" ]; then
- TEST_FILES="test/test_*.rb"
+if [[ "$1" == "ci" ]]
+then
+ rubies=(
+ ruby
+ )
+
+ shift
+elif [[ "$1" == "ruby" ]] || [[ "$1" == "jruby" ]]
+then
+ rubies=(
+ $1
+ )
+
+ shift
else
- TEST_FILES="$@"
+ rubies=()
+ for r in jruby ruby; do
+ if which "$r"
+ then
+ rubies+=(
+ $r
+ )
+ fi
+ done
fi
-set -x
-
-bundle exec rake
+for ruby in $rubies; do
+ if [[ $# -lt 1 ]]
+ then
+ set -x
+ time $ruby -S bundle exec \
+ rake TESTOPTS='--profile' test
+ else
+ set -x
+ time $ruby -S bundle exec ruby -Itest \
+ "$@" --profile
+ fi
+done
diff --git a/script/vendor-mimes b/script/vendor-mimes
new file mode 100755
index 0000000..ea77923
--- /dev/null
+++ b/script/vendor-mimes
@@ -0,0 +1,35 @@
+#!/usr/bin/env ruby
+# Vendors the MIME type config from the mime-db list
+# usage: script/vendor-mimes
+
+require 'json'
+require 'open-uri'
+
+config = File.expand_path "../lib/jekyll/mime.types", File.dirname(__FILE__)
+
+# Create an array of vendored mimetype => [extensions]
+mimes = {}
+json = open('https://raw.githubusercontent.com/jshttp/mime-db/master/db.json').read
+data = JSON.parse(json)
+data.reject! { |mime, meta| meta["extensions"].nil? || meta["extensions"].empty? }
+data.each do |mime, meta|
+ # Normalize extensions and mime-types
+ mime = mime.downcase.strip
+ extensions = meta["extensions"].map { |e| e.downcase.strip }.compact
+
+ # If a given extension is listed multiple times, prefer the first one listed
+ extensions.reject! { |extension| mimes.values.flatten.include?(extension) }
+
+ next if extensions.empty?
+ mimes[mime] = [] if mimes[mime].nil?
+ mimes[mime].concat extensions
+end
+
+strlen = mimes.keys.max_by(&:length).length
+output = ""
+output << "# Woah there. Do not edit this file directly.\n"
+output << "# This file is generated automatically by script/vendor-mimes.\n\n"
+mimes = mimes.sort_by { |k,v| k }
+output << mimes.map { |mime,extensions| "#{mime.ljust(strlen)} #{extensions.join(" ")}" }.join("\n")
+
+File.write(config, output)
diff --git a/site/README b/site/README
deleted file mode 100644
index 60b411c..0000000
--- a/site/README
+++ /dev/null
@@ -1 +0,0 @@
-Jekyll's awesome website.
diff --git a/site/README.md b/site/README.md
new file mode 100644
index 0000000..27cd67c
--- /dev/null
+++ b/site/README.md
@@ -0,0 +1,16 @@
+# Jekyll docs site
+
+This directory contains the code for the Jekyll docs site, [jekyllrb.com](http://jekyllrb.com/).
+
+## Contributing
+
+For information about contributing, see the [Contributing page](http://jekyllrb.com/docs/contributing/).
+
+## Running locally
+
+You can preview your contributions before opening a pull request by running from within the directory:
+
+1. `bundle install`
+2. `bundle exec rake site:preview`
+
+It's just a jekyll site, afterall! :wink:
diff --git a/site/_config.yml b/site/_config.yml
index 44c2772..d1cd536 100644
--- a/site/_config.yml
+++ b/site/_config.yml
@@ -1,9 +1,21 @@
markdown: kramdown
highlighter: pygments
-relative_permalinks: false
-gauges_id: 503c5af6613f5d0f19000027
permalink: /news/:year/:month/:day/:title/
-excerpt_separator: noifniof3nioaniof3nioafafinoafnoif
+excerpt_separator: ""
+
+gauges_id: 503c5af6613f5d0f19000027
+google_analytics_id: UA-50755011-1
+
repository: https://github.com/jekyll/jekyll
help_url: https://github.com/jekyll/jekyll-help
-google_analytics_id: UA-50755011-1
+
+collections:
+ docs:
+ output: true
+
+name: Jekyll • Simple, blog-aware, static sites
+description: Transform your plain text into static websites and blogs
+url: http://jekyllrb.com
+
+gems:
+ - jekyll-feed
diff --git a/site/_data/docs.yml b/site/_data/docs.yml
index 474f73f..bcdf352 100644
--- a/site/_data/docs.yml
+++ b/site/_data/docs.yml
@@ -13,6 +13,7 @@
- posts
- drafts
- pages
+ - static-files
- variables
- collections
- datafiles
diff --git a/site/_docs/assets.md b/site/_docs/assets.md
new file mode 100644
index 0000000..202ade0
--- /dev/null
+++ b/site/_docs/assets.md
@@ -0,0 +1,93 @@
+---
+layout: docs
+title: Assets
+permalink: /docs/assets/
+---
+
+Jekyll provides built-in support for Sass and can work with CoffeeScript via
+a Ruby gem. In order to use them, you must first create a file with the
+proper extension name (one of `.sass`, `.scss`, or `.coffee`) and start the
+file with two lines of triple dashes, like this:
+
+{% highlight sass %}
+---
+---
+
+// start content
+.my-definition
+ font-size: 1.2em
+{% endhighlight %}
+
+Jekyll treats these files the same as a regular page, in that the output file
+will be placed in the same directory that it came from. For instance, if you
+have a file named `css/styles.scss` in your site's source folder, Jekyll
+will process it and put it in your site's destination folder under
+`css/styles.css`.
+
+<div class="note info">
+ <h5>Jekyll processes all Liquid filters and tags in asset files</h5>
+ <p>If you are using <a href="http://mustache.github.io">Mustache</a>
+ or another JavaScript templating language that conflicts with
+ the <a href="/docs/templates/">Liquid template syntax</a>, you
+ will need to place <code>{% raw %}</code> and
+ <code>{% endraw %}</code> tags around your code.</p>
+</div>
+
+## Sass/SCSS
+
+Jekyll allows you to customize your Sass conversion in certain ways.
+
+Place all your partials in your `sass_dir`, which defaults to
+`<source>/_sass`. Place your main SCSS or Sass files in the place you want
+them to be in the output file, such as `<source>/css`. For an example, take
+a look at [this example site using Sass support in Jekyll][example-sass].
+
+If you are using Sass `@import` statements, you'll need to ensure that your
+`sass_dir` is set to the base directory that contains your Sass files. You
+can do that thusly:
+
+{% highlight yaml %}
+sass:
+ sass_dir: _sass
+{% endhighlight %}
+
+The Sass converter will default the `sass_dir` configuration option to
+`_sass`.
+
+[example-sass]: https://github.com/jekyll/jekyll-sass-converter/tree/master/example
+
+<div class="note info">
+ <h5>The <code>sass_dir</code> is only used by Sass</h5>
+ <p>
+
+ Note that the <code>sass_dir</code> becomes the load path for Sass imports,
+ nothing more. This means that Jekyll does not know about these files
+ directly, so any files here should not contain the YAML Front Matter as
+ described above nor will they be transformed as described above. This
+ folder should only contain imports.
+
+ </p>
+</div>
+
+You may also specify the output style with the `style` option in your
+`_config.yml` file:
+
+{% highlight yaml %}
+sass:
+ style: compressed
+{% endhighlight %}
+
+These are passed to Sass, so any output style options Sass supports are valid
+here, too.
+
+
+## Coffeescript
+
+To enable Coffeescript in Jekyll 3.0 and up you must
+ * Install the `jekyll-coffeescript` gem
+ * Ensure that your `_config.yml` is up-to-date and includes the following
+
+{% highlight yaml %}
+gems:
+ - jekyll-coffeescript
+{% endhighlight %}
diff --git a/site/_docs/collections.md b/site/_docs/collections.md
new file mode 100644
index 0000000..ed0a87e
--- /dev/null
+++ b/site/_docs/collections.md
@@ -0,0 +1,380 @@
+---
+layout: docs
+title: Collections
+permalink: /docs/collections/
+---
+
+<div class="note warning">
+ <h5>Collections support is unstable and may change</h5>
+ <p>
+ This is an experimental feature and the API may change until the feature stabilizes.
+ </p>
+</div>
+
+Not everything is a post or a page. Maybe you want to document the various
+methods in your open source project, members of a team, or talks at a
+conference. Collections allow you to define a new type of document that behave
+like Pages or Posts do normally, but also have their own unique properties and
+namespace.
+
+## Using Collections
+
+### Step 1: Tell Jekyll to read in your collection
+
+Add the following to your site's `_config.yml` file, replacing `my_collection`
+with the name of your collection:
+
+{% highlight yaml %}
+collections:
+- my_collection
+{% endhighlight %}
+
+You can optionally specify metadata for your collection in the configuration:
+
+{% highlight yaml %}
+collections:
+ my_collection:
+ foo: bar
+{% endhighlight %}
+
+Default attributes can also be set for a collection:
+
+{% highlight yaml %}
+defaults:
+ - scope:
+ path: ""
+ type: my_collection
+ values:
+ layout: page
+{% endhighlight %}
+
+### Step 2: Add your content
+
+Create a corresponding folder (e.g. `<source>/_my_collection`) and add
+documents. YAML Front Matter is read in as data if it exists, and everything
+after it is stuck in the Document's `content` attribute. If no YAML Front
+Matter is provided, Jekyll will not generate the file in your collection.
+
+<div class="note info">
+ <h5>Be sure to name your directories correctly</h5>
+ <p>
+The folder must be named identically to the collection you defined in
+your <code>_config.yml</code> file, with the addition of the preceding <code>_</code> character.
+ </p>
+</div>
+
+### Step 3: Optionally render your collection's documents into independent files
+
+If you'd like Jekyll to create a public-facing, rendered version of each
+document in your collection, set the `output` key to `true` in your collection
+metadata in your `_config.yml`:
+
+{% highlight yaml %}
+collections:
+ my_collection:
+ output: true
+{% endhighlight %}
+
+This will produce a file for each document in the collection.
+For example, if you have `_my_collection/some_subdir/some_doc.md`,
+it will be rendered using Liquid and the Markdown converter of your
+choice and written out to `<dest>/my_collection/some_subdir/some_doc.html`.
+
+As for posts with [Permalinks](../permalinks/), the document
+URL can be customized by setting `permalink` metadata for the collection:
+
+{% highlight yaml %}
+collections:
+ my_collection:
+ output: true
+ permalink: /awesome/:path/
+{% endhighlight %}
+
+For example, if you have `_my_collection/some_subdir/some_doc.md`, it will be
+written out to `<dest>/awesome/some_subdir/some_doc/index.html`.
+
+<div class="note info">
+ <h5>Don't forget to add YAML for processing</h5>
+ <p>
+ Files in collections that do not have front matter are treated as
+ <a href="/docs/static-files">static files</a> and simply copied to their
+ output location without processing.
+ </p>
+</div>
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Variable</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p><code>collection</code></p>
+ </td>
+ <td>
+ <p>Label of the containing collection.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>path</code></p>
+ </td>
+ <td>
+ <p>Path to the document relative to the collection's directory.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>name</code></p>
+ </td>
+ <td>
+ <p>The document's base filename, with every sequence of spaces
+ and non-alphanumeric characters replaced by a hyphen.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>title</code></p>
+ </td>
+ <td>
+ <p>The document's lowercase title (as defined in its <a href="/docs/frontmatter/">front matter</a>), with every sequence of spaces and non-alphanumeric characters replaced by a hyphen. If the document does not define a title in its <a href="/docs/frontmatter/">front matter</a>, this is equivalent to <code>name</code>.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>output_ext</code></p>
+ </td>
+ <td>
+ <p>Extension of the output file.</p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+## Liquid Attributes
+
+### Collections
+
+Each collection is accessible via the `site` Liquid variable. For example, if
+you want to access the `albums` collection found in `_albums`, you'd use
+`site.albums`. Each collection is itself an array of documents
+(e.g. `site.albums` is an array of documents, much like `site.pages` and
+`site.posts`). See below for how to access attributes of those documents.
+
+The collections are also available under `site.collections`, with the metadata
+you specified in your `_config.yml` (if present) and the following information:
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Variable</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p><code>label</code></p>
+ </td>
+ <td>
+ <p>
+ The name of your collection, e.g. <code>my_collection</code>.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>docs</code></p>
+ </td>
+ <td>
+ <p>
+ An array of <a href="#documents">documents</a>.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>files</code></p>
+ </td>
+ <td>
+ <p>
+ An array of static files in the collection.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>relative_directory</code></p>
+ </td>
+ <td>
+ <p>
+ The path to the collection's source directory, relative to the site
+ source.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>directory</code></p>
+ </td>
+ <td>
+ <p>
+ The full path to the collections's source directory.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>output</code></p>
+ </td>
+ <td>
+ <p>
+ Whether the collection's documents will be output as individual
+ files.
+ </p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+
+### Documents
+
+In addition to any YAML Front Matter provided in the document's corresponding
+file, each document has the following attributes:
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Variable</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p><code>content</code></p>
+ </td>
+ <td>
+ <p>
+ The (unrendered) content of the document. If no YAML Front Matter is
+ provided, Jekyll will not generate the file in your collection. If
+ YAML Front Matter is used, then this is all the contents of the file
+ after the terminating
+ `---` of the front matter.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>output</code></p>
+ </td>
+ <td>
+ <p>
+ The rendered output of the document, based on the
+ <code>content</code>.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>path</code></p>
+ </td>
+ <td>
+ <p>
+ The full path to the document's source file.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>relative_path</code></p>
+ </td>
+ <td>
+ <p>
+ The path to the document's source file relative to the site source.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>url</code></p>
+ </td>
+ <td>
+ <p>
+ The URL of the rendered collection. The file is only written to the
+ destination when the name of the collection to which it belongs is
+ included in the <code>render</code> key in the site's configuration
+ file.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>collection</code></p>
+ </td>
+ <td>
+ <p>
+ The name of the document's collection.
+ </p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+## Accessing Collection Attributes
+
+Attributes from the YAML front matter can be accessed as data anywhere in the
+site. Using the above example for configuring a collection as `site.albums`,
+one might have front matter in an individual file structured as follows (which
+must use a supported markup format, and cannot be saved with a `.yaml`
+extension):
+
+{% highlight yaml %}
+title: "Josquin: Missa De beata virgine and Missa Ave maris stella"
+artist: "The Tallis Scholars"
+director: "Peter Phillips"
+works:
+ - title: "Missa De beata virgine"
+ composer: "Josquin des Prez"
+ tracks:
+ - title: "Kyrie"
+ duration: "4:25"
+ - title: "Gloria"
+ duration: "9:53"
+ - title: "Credo"
+ duration: "9:09"
+ - title: "Sanctus & Benedictus"
+ duration: "7:47"
+ - title: "Agnus Dei I, II & III"
+ duration: "6:49"
+{% endhighlight %}
+
+Every album in the collection could be listed on a single page with a template:
+
+{% highlight html %}
+{% raw %}
+{% for album in site.albums %}
+ <h2>{{ album.title }}</h2>
+ <p>Performed by {{ album.artist }}{% if album.director %}, directed by {{ album.director }}{% endif %}</p>
+ {% for work in album.works %}
+ <h3>{{ work.title }}</h3>
+ <p>Composed by {{ work.composer }}</p>
+ <ul>
+ {% for track in work.tracks %}
+ <li>{{ track.title }} ({{ track.duration }})</li>
+ {% endfor %}
+ </ul>
+ {% endfor %}
+{% endfor %}
+{% endraw %}
+{% endhighlight %}
diff --git a/site/docs/configuration.md b/site/_docs/configuration.md
similarity index 62%
rename from site/docs/configuration.md
rename to site/_docs/configuration.md
index 19c21ba..2bb65e8 100644
--- a/site/docs/configuration.md
+++ b/site/_docs/configuration.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Configuration
-prev_section: structure
-next_section: frontmatter
permalink: /docs/configuration/
---
@@ -89,6 +87,20 @@ class="flag">flags</code> (specified on the command-line) that control them.
</tr>
<tr class="setting">
<td>
+ <p class="name"><strong>Keep files</strong></p>
+ <p class="description">
+ When clobbering the site destination, keep the selected files.
+ Useful for files that are not generated by jekyll; e.g. files or
+ assets that are generated by your build tool.
+ The paths are relative to the <code>destination</code>.
+ </p>
+ </td>
+ <td class="align-center">
+ <p><code class="option">keep_files: [DIR, FILE, ...]</code></p>
+ </td>
+ </tr>
+ <tr class="setting">
+ <td>
<p class="name"><strong>Time Zone</strong></p>
<p class="description">
Set the time zone for site generation. This sets the <code>TZ</code>
@@ -125,18 +137,32 @@ class="flag">flags</code> (specified on the command-line) that control them.
<td>
<p class='name'><strong>Defaults</strong></p>
<p class='description'>
- Set defaults for <a href="../frontmatter/" title="YAML frontmatter">YAML frontmatter</a>
+ Set defaults for <a href="../frontmatter/" title="YAML Front Matter">YAML Front Matter</a>
variables.
</p>
</td>
<td class='align-center'>
- <p>see <a href="#frontmatter-defaults" title="details">below</a></p>
+ <p>see <a href="#front-matter-defaults" title="details">below</a></p>
</td>
</tr>
</tbody>
</table>
</div>
+<div class="note warning">
+ <h5>Destination folders are cleaned on site builds</h5>
+ <p>
+ The contents of <code><destination></code> are automatically
+ cleaned, by default, when the site is built. Files or folders that are not
+ created by your site will be removed. Some files could be retained
+ by specifying them within the <code><keep_files></code> configuration directive.
+ </p>
+ <p>
+ Do not use an important location for <code><destination></code>; instead, use it as
+ a staging area and copy files from there to your web server.
+ </p>
+</div>
+
### Build Command Options
<div class="mobile-side-scroller">
@@ -154,7 +180,7 @@ class="flag">flags</code> (specified on the command-line) that control them.
<p class="description">Enable auto-regeneration of the site when files are modified.</p>
</td>
<td class="align-center">
- <p><code class="flag">-w, --watch</code></p>
+ <p><code class="flag">-w, --[no-]watch</code></p>
</td>
</tr>
<tr class="setting">
@@ -177,6 +203,15 @@ class="flag">flags</code> (specified on the command-line) that control them.
</tr>
<tr class="setting">
<td>
+ <p class="name"><strong>Environment</strong></p>
+ <p class="description">Use a specific environment value in the build.</p>
+ </td>
+ <td class="align-center">
+ <p><code class="flag">JEKYLL_ENV=production</code></p>
+ </td>
+ </tr>
+ <tr class="setting">
+ <td>
<p class="name"><strong>Future</strong></p>
<p class="description">Publish posts with a future date.</p>
</td>
@@ -205,10 +240,54 @@ class="flag">flags</code> (specified on the command-line) that control them.
<p><code class="flag">--limit_posts NUM</code></p>
</td>
</tr>
+ <tr class="setting">
+ <td>
+ <p class="name"><strong>Force polling</strong></p>
+ <p class="description">Force watch to use polling.</p>
+ </td>
+ <td class="align-center">
+ <p><code class="flag">--force_polling</code></p>
+ </td>
+ </tr>
+ <tr class="setting">
+ <td>
+ <p class="name"><strong>Verbose output</strong></p>
+ <p class="description">Print verbose output.</p>
+ </td>
+ <td class="align-center">
+ <p><code class="flag">-V, --verbose</code></p>
+ </td>
+ </tr>
+ <tr class="setting">
+ <td>
+ <p class="name"><strong>Silence Output</strong></p>
+ <p class="description">Silence the normal output from Jekyll
+ during a build</p>
+ </td>
+ <td class="align-center">
+ <p><code class="flag">-q, --quiet</code></p>
+ </td>
+ </tr>
+ <tr class="setting">
+ <td>
+ <p class="name"><strong>Incremental build</strong></p>
+ <p class="description">
+ Enable the experimental incremental build feature. Incremental build only
+ re-builds posts and pages that have changed, resulting in significant performance
+ improvements for large sites, but may also break site generation in certain
+ cases.
+ </p>
+ </td>
+ <td class="align-center">
+ <p><code class="option">incremental: BOOL</code></p>
+ <p><code class="flag">-I, --incremental</code></p>
+ </td>
+ </tr>
</tbody>
</table>
</div>
+
### Serve Command Options
In addition to the options below, the `serve` sub-command can accept any of the options
@@ -264,6 +343,15 @@ before your site is served.
<p><code class="flag">-B, --detach</code></p>
</td>
</tr>
+ <tr class="setting">
+ <td>
+ <p class="name"><strong>Skips the initial site build.</strong></p>
+ <p class="description">Skips the initial site build which occurs before the server is started.</p>
+ </td>
+ <td class="align-center">
+ <p><code class="flag">--skip-initial-build</code></p>
+ </td>
+ </tr>
</tbody>
</table>
</div>
@@ -276,9 +364,37 @@ before your site is served.
</p>
</div>
-## Frontmatter defaults
+## Specifying a Jekyll environment at build time
+
+In the build (or serve) arguments, you can specify a Jekyll environment and value. The build will then apply this value in any conditional statements in your content.
-Using [YAML front-matter](../frontmatter/) is one way that you can specify configuration in the pages and posts for your site. Setting things like a default layout, or customizing the title, or specifying a more precise date/time for the post can all be added to your page or post front-matter.
+For example, suppose you set this conditional statement in your code:
+
+{% highlight liquid %}
+{% raw %}
+{% if jekyll.environment == "production" %}
+ {% include disqus.html %}
+{% endif %}
+{% endraw %}
+{% endhighlight %}
+
+When you build your Jekyll site, the content inside the `if` statement won't be run unless you also specify a `production` environment in the build command, like this:
+
+{% highlight sh %}
+JEKYLL_ENV=production jekyll build
+{% endhighlight %}
+
+Specifying an environment value allows you to make certain content available only within specific environments.
+
+The default value for `JEKYLL_ENV` is `development`. Therefore if you omit `JEKYLL_ENV` from the build arguments, the default value will be `JEKYLL_ENV=development`. Any content inside `{% raw %}{% if jekyll.environment == "development" %}{% endraw %}` tags will automatically appear in the build.
+
+Your environment values can be anything you want (not just `development` or `production`). Some elements you might want to hide in development environments include Disqus comment forms or Google Analytics. Conversely, you might want to expose an "Edit me in GitHub" button in a development environment but not include it in production environments.
+
+By specifying the option in the build command, you avoid having to change values in your configuration files when moving from one environment to another.
+
+## Front Matter defaults
+
+Using [YAML Front Matter](../frontmatter/) is one way that you can specify configuration in the pages and posts for your site. Setting things like a default layout, or customizing the title, or specifying a more precise date/time for the post can all be added to your page or post front matter.
Often times, you will find that you are repeating a lot of configuration options. Setting the same layout in each file, adding the same category - or categories - to a post, etc. You can even add custom variables like author names, which might be the same for the majority of posts on your blog.
@@ -304,13 +420,13 @@ defaults:
-
scope:
path: "" # an empty string here means all files in the project
- type: "post"
+ type: "posts" # previously `post` in Jekyll 2.2.
values:
layout: "default"
{% endhighlight %}
-Now, this will only set the layout for files where the type is `post`.
-The different types that are available to you are `page`, `post`, `draft` or any collection in your site. While `type` is optional, you must specify a value for `path` when creating a `scope/values` pair.
+Now, this will only set the layout for files where the type is `posts`.
+The different types that are available to you are `pages`, `posts`, `drafts` or any collection in your site. While `type` is optional, you must specify a value for `path` when creating a `scope/values` pair.
As mentioned earlier, you can set multiple scope/values pairs for `defaults`.
@@ -319,17 +435,16 @@ defaults:
-
scope:
path: ""
- type: "post"
+ type: "posts"
values:
layout: "my-site"
-
scope:
path: "projects"
- type: "page"
+ type: "pages" # previously `page` in Jekyll 2.2.
values:
layout: "project" # overrides previous default layout
author: "Mr. Hyde"
- category: "project"
{% endhighlight %}
With these defaults, all posts would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](../variables/) set to `Mr. Hyde` as well as have the category for the page set to `project`.
@@ -343,20 +458,20 @@ defaults:
-
scope:
path: ""
- type: "my_collection" # a collection in your site
+ type: "my_collection" # a collection in your site, in plural form
values:
layout: "default"
{% endhighlight %}
-In this example the `layout` is set to `default` inside the [collection](../collections) with the name `my_collection`.
+In this example the `layout` is set to `default` inside the [collection](../collections/) with the name `my_collection`.
### Precedence
Jekyll will apply all of the configuration settings you specify in the `defaults` section of your `_config.yml` file. However, you can choose to override settings from other scope/values pair by specifying a more specific path for the scope.
-You can see that in the last example above. First, we set the default layout to `my-site`. Then, using a more specific path, we set the default layout for files in the `projects/` path to `project`. This can be done with any value that you would set in the page or post front-matter.
+You can see that in the last example above. First, we set the default layout to `my-site`. Then, using a more specific path, we set the default layout for files in the `projects/` path to `project`. This can be done with any value that you would set in the page or post front matter.
-Finally, if you set defaults in the site configuration by adding a `defaults` section to your `_config.yml` file, you can override those settings in a post or page file. All you need to do is specify the settings in the post or page front-matter. For example:
+Finally, if you set defaults in the site configuration by adding a `defaults` section to your `_config.yml` file, you can override those settings in a post or page file. All you need to do is specify the settings in the post or page front matter. For example:
{% highlight yaml %}
# In _config.yml
@@ -365,7 +480,7 @@ defaults:
-
scope:
path: "projects"
- type: "page"
+ type: "pages"
values:
layout: "project"
author: "Mr. Hyde"
@@ -382,68 +497,75 @@ layout: "foobar"
The post text goes here...
{% endhighlight %}
-The `projects/foo_project.md` would have the `layout` set to `foobar` instead of `project` and the `author` set to `John Smith` instead of `Mr. Hyde` when the site is built.
+The `projects/foo_project.md` would have the `layout` set to `foobar` instead
+of `project` and the `author` set to `John Smith` instead of `Mr. Hyde` when
+the site is built.
## Default Configuration
-Jekyll runs with the following configuration options by default. Unless
-alternative settings for these options are explicitly specified in the
-configuration file or on the command-line, Jekyll will run using these options.
+Jekyll runs with the following configuration options by default. Alternative
+settings for these options can be explicitly specified in the configuration
+file or on the command-line.
<div class="note warning">
<h5>There are two unsupported kramdown options</h5>
<p>
Please note that both <code>remove_block_html_tags</code> and
- <code>remove_span_html_tags</code> are currently unsupported in Jekyll due to the
- fact that they are not included within the kramdown HTML converter.
+ <code>remove_span_html_tags</code> are currently unsupported in Jekyll due
+ to the fact that they are not included within the kramdown HTML converter.
</p>
</div>
{% highlight yaml %}
-source: .
-destination: ./_site
-plugins: ./_plugins
-layouts: ./_layouts
-include: ['.htaccess']
-exclude: []
-keep_files: ['.git','.svn']
-gems: []
-timezone: nil
-encoding: nil
-
-future: true
-show_drafts: false
+# Where things are
+source: .
+destination: ./_site
+plugins_dir: ./_plugins
+layouts_dir: ./_layouts
+data_dir: ./_data
+includes_dir: ./_includes
+collections: null
+
+# Handling Reading
+safe: false
+include: [".htaccess"]
+exclude: []
+keep_files: [".git", ".svn"]
+encoding: "utf-8"
+markdown_ext: "markdown,mkdown,mkdn,mkd,md"
+
+# Filtering Content
+show_drafts: null
limit_posts: 0
-highlighter: pygments
-
-relative_permalinks: true
+future: false
+unpublished: false
-permalink: date
-paginate_path: 'page:num'
-paginate: nil
-
-markdown: kramdown
-markdown_ext: markdown,mkdown,mkdn,mkd,md
-textile_ext: textile
+# Plugins
+whitelist: []
+gems: []
+# Conversion
+markdown: kramdown
+highlighter: rouge
+lsi: false
excerpt_separator: "\n\n"
+incremental: false
-safe: false
-watch: false # deprecated
-server: false # deprecated
-host: 0.0.0.0
-port: 4000
-baseurl: ""
-lsi: false
+# Serving
+detach: false
+port: 4000
+host: 127.0.0.1
+baseurl: "" # does not include hostname
+
+# Outputting
+permalink: date
+paginate_path: /page:num
+timezone: null
-maruku:
- use_tex: false
- use_divs: false
- png_engine: blahtex
- png_dir: images/latex
- png_url: /images/latex
- fenced_code_blocks: true
+quiet: false
+defaults: []
+# Markdown Processors
rdiscount:
extensions: []
@@ -451,57 +573,75 @@ redcarpet:
extensions: []
kramdown:
- auto_ids: true
- footnote_nr: 1
- entity_output: as_char
- toc_levels: 1..6
- smart_quotes: lsquo,rsquo,ldquo,rdquo
- use_coderay: false
+ auto_ids: true
+ footnote_nr: 1
+ entity_output: as_char
+ toc_levels: 1..6
+ smart_quotes: lsquo,rsquo,ldquo,rdquo
+ enable_coderay: false
coderay:
- coderay_wrap: div
- coderay_line_numbers: inline
- coderay_line_numbers_start: 1
- coderay_tab_width: 4
- coderay_bold_every: 10
- coderay_css: style
-
-redcloth:
- hard_breaks: true
+ coderay_wrap: div
+ coderay_line_numbers: inline
+ coderay_line_number_start: 1
+ coderay_tab_width: 4
+ coderay_bold_every: 10
+ coderay_css: style
{% endhighlight %}
## Markdown Options
-The various Markdown renderers supported by Jekyll sometimes have extra options available.
+The various Markdown renderers supported by Jekyll sometimes have extra options
+available.
### Redcarpet
-Redcarpet can be configured by providing an `extensions` sub-setting, whose value should be an array of strings. Each string should be the name of one of the `Redcarpet::Markdown` class's extensions; if present in the array, it will set the corresponding extension to `true`.
+Redcarpet can be configured by providing an `extensions` sub-setting, whose
+value should be an array of strings. Each string should be the name of one of
+the `Redcarpet::Markdown` class's extensions; if present in the array, it will
+set the corresponding extension to `true`.
Jekyll handles two special Redcarpet extensions:
-- `no_fenced_code_blocks` --- By default, Jekyll sets the `fenced_code_blocks` extension (for delimiting code blocks with triple tildes or triple backticks) to `true`, probably because GitHub's eager adoption of them is starting to make them inescapable. Redcarpet's normal `fenced_code_blocks` extension is inert when used with Jekyll; instead, you can use this inverted version of the extension for disabling fenced code.
+- `no_fenced_code_blocks` --- By default, Jekyll sets the `fenced_code_blocks`
+extension (for delimiting code blocks with triple tildes or triple backticks)
+to `true`, probably because GitHub's eager adoption of them is starting to make
+them inescapable. Redcarpet's normal `fenced_code_blocks` extension is inert
+when used with Jekyll; instead, you can use this inverted version of the
+extension for disabling fenced code.
- Note that you can also specify a language for highlighting after the first delimiter:
+Note that you can also specify a language for highlighting after the first
+delimiter:
```ruby
# ...ruby code
```
- With both fenced code blocks and highlighter enabled, this will statically highlight the code; without any syntax highlighter, it will add a `class="LANGUAGE"` attribute to the `<code>` element, which can be used as a hint by various JavaScript code highlighting libraries.
-- `smart` --- This pseudo-extension turns on SmartyPants, which converts straight quotes to curly quotes and runs of hyphens to em (`---`) and en (`--`) dashes.
+With both fenced code blocks and highlighter enabled, this will statically
+highlight the code; without any syntax highlighter, it will add a
+`class="LANGUAGE"` attribute to the `<code>` element, which can be used as a
+hint by various JavaScript code highlighting libraries.
+
+- `smart` --- This pseudo-extension turns on SmartyPants, which converts
+ straight quotes to curly quotes and runs of hyphens to em (`---`) and en (`--`) dashes.
-All other extensions retain their usual names from Redcarpet, and no renderer options aside from `smart` can be specified in Jekyll. [A list of available extensions can be found in the Redcarpet README file.][redcarpet_extensions] Make sure you're looking at the README for the right version of Redcarpet: Jekyll currently uses v2.2.x, and extensions like `footnotes` and `highlight` weren't added until after version 3.0.0. The most commonly used extensions are:
+All other extensions retain their usual names from Redcarpet, and no renderer
+options aside from `smart` can be specified in Jekyll. [A list of available
+extensions can be found in the Redcarpet README file.][redcarpet_extensions]
+Make sure you're looking at the README for the right version of
+Redcarpet: Jekyll currently uses v3.2.x. The most commonly used
+extensions are:
- `tables`
- `no_intra_emphasis`
- `autolink`
-[redcarpet_extensions]: https://github.com/vmg/redcarpet/blob/v2.2.2/README.markdown#and-its-like-really-simple-to-use
+[redcarpet_extensions]: https://github.com/vmg/redcarpet/blob/v3.2.2/README.markdown#and-its-like-really-simple-to-use
### Kramdown
-In addition to the defaults mentioned above, you can also turn on recognition of Github Flavored Markdown by passing an `input` option with a value of "GFM".
+In addition to the defaults mentioned above, you can also turn on recognition
+of Github Flavored Markdown by passing an `input` option with a value of "GFM".
For example, in your `_config.yml`:
@@ -529,7 +669,8 @@ class Jekyll::Converters::Markdown::MyCustomProcessor
end
{% endhighlight %}
-Once you've created your class and have it properly setup either as a plugin in the `_plugins` folder or as a gem, specify it in your `_config.yml`:
+Once you've created your class and have it properly setup either as a plugin in
+the `_plugins` folder or as a gem, specify it in your `_config.yml`:
{% highlight yaml %}
markdown: MyCustomProcessor
diff --git a/site/docs/continuous-integration.md b/site/_docs/continuous-integration.md
similarity index 66%
rename from site/docs/continuous-integration.md
rename to site/_docs/continuous-integration.md
index 2d2d798..b98de42 100644
--- a/site/docs/continuous-integration.md
+++ b/site/_docs/continuous-integration.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Continuous Integration
-prev_section: deployment-methods
-next_section: troubleshooting
permalink: /docs/continuous-integration/
---
@@ -22,7 +20,7 @@ Enabling Travis builds for your GitHub repository is pretty simple:
2. Find the repository for which you're interested in enabling builds.
3. Click the slider on the right so it says "ON" and is a dark grey.
4. Optionally configure the build by clicking on the wrench icon. Further
- configuration happens in you `.travis.yml` file. More details on that
+ configuration happens in your `.travis.yml` file. More details on that
below.
## 2. The Test Script
@@ -36,6 +34,8 @@ This tool checks your resulting site to ensure all links and images exist.
Utilize it either with the convenient `htmlproof` command-line executable,
or write a Ruby script which utilizes the gem.
+Save the commands you want to run and succeed in a file: `./script/cibuild`
+
### The HTML Proofer Executable
{% highlight bash %}
@@ -50,6 +50,12 @@ Some options can be specified via command-line switches. Check out the
`html-proofer` README for more information about these switches, or run
`htmlproof --help` locally.
+For example to avoid testing external sites, use this command:
+
+{% highlight bash %}
+$ bundle exec htmlproof ./_site --disable-external
+{% endhighlight %}
+
### The HTML Proofer Library
You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile):
@@ -62,7 +68,7 @@ HTML::Proofer.new("./_site").run
{% endhighlight %}
Options are given as a second argument to `.new`, and are encoded in a
-symbol-keyed Ruby Hash. More information about the configuration options,
+symbol-keyed Ruby Hash. For more information about the configuration options,
check out `html-proofer`'s README file.
[2]: https://github.com/gjtorikian/html-proofer
@@ -71,16 +77,33 @@ check out `html-proofer`'s README file.
This file is used to configure your Travis builds. Because Jekyll is built
with Ruby and requires RubyGems to install, we use the Ruby language build
-environment. Below is a sample `.travis.yml` file, and what follows that is
+environment. Below is a sample `.travis.yml` file, followed by
an explanation of each line.
+**Note:** You will need a Gemfile as well, [Travis will automatically install](http://docs.travis-ci.com/user/languages/ruby/#Dependency-Management) the dependencies based on the referenced gems:
+
+{% highlight ruby %}
+source "https://rubygems.org"
+
+gem "jekyll"
+gem "html-proofer"
+{% endhighlight %}
+
+Your `.travis.yml` file should look like this:
+
{% highlight yaml %}
language: ruby
rvm:
- 2.1
+
+before_script:
+ - chmod +x ./script/cibuild # or do this locally and commit
+
+# Assume bundler is being used, therefore
+# the `install` step will run `bundle install` by default.
script: ./script/cibuild
-# branch whitelist
+# branch whitelist, only for GitHub Pages
branches:
only:
- gh-pages # test the gh-pages branch
@@ -98,7 +121,7 @@ language: ruby
{% endhighlight %}
This line tells Travis to use a Ruby build container. It gives your script
-access to Bundler, RubyGems, and and Ruby runtime.
+access to Bundler, RubyGems, and a Ruby runtime.
{% highlight yaml %}
rvm:
@@ -110,6 +133,16 @@ directive tells Travis the Ruby version to use when running your test
script.
{% highlight yaml %}
+before_script:
+ - chmod +x ./script/cibuild
+{% endhighlight %}
+
+The build script file needs to have the *executable* attribute set or
+Travis will fail with a permission denied error. You can also run this
+locally and commit the permissions directly, thus rendering this step
+irrelevant.
+
+{% highlight yaml %}
script: ./script/cibuild
{% endhighlight %}
@@ -120,13 +153,14 @@ customizable. If your script won't change much, you can write your test
incantation here directly:
{% highlight yaml %}
+install: gem install jekyll html-proofer
script: jekyll build && htmlproof ./_site
{% endhighlight %}
The `script` directive can be absolutely any valid shell command.
{% highlight yaml %}
-# branch whitelist
+# branch whitelist, only for GitHub Pages
branches:
only:
- gh-pages # test the gh-pages branch
@@ -142,7 +176,8 @@ a pull request flow for proposing changes, you may wish to enforce a
convention for your builds such that all branches containing edits are
prefixed, exemplified above with the `/pages-(.*)/` regular expression.
-The `branches` directive is completely optional.
+The `branches` directive is completely optional. Travis will build from every
+push to any branch of your repo if leave it out.
{% highlight yaml %}
env:
@@ -153,25 +188,34 @@ env:
Using `html-proofer`? You'll want this environment variable. Nokogiri, used
to parse HTML files in your compiled site, comes bundled with libraries
which it must compile each time it is installed. Luckily, you can
-dramatically increase the install time of Nokogiri by setting the
+dramatically decrease the install time of Nokogiri by setting the
environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`.
-## 4. Gotchas
-
-### Exclude `vendor`
-
-Travis bundles all gems in the `vendor` directory on its build servers,
-which Jekyll will mistakenly read and explode on. To avoid this, exclude
-`vendor` in your `_config.yml`:
+<div class="note warning">
+ <h5>Be sure to exclude <code>vendor</code> from your
+ <code>_config.yml</code></h5>
+ <p>Travis bundles all gems in the <code>vendor</code> directory on its build
+ servers, which Jekyll will mistakenly read and explode on.</p>
+</div>
{% highlight yaml %}
exclude: [vendor]
{% endhighlight %}
+### Troubleshooting
+
+**Travis error:** *"You are trying to install in deployment mode after changing
+your Gemfile. Run bundle install elsewhere and add the updated Gemfile.lock
+to version control."*
+
+**Workaround:** Either run `bundle install` locally and commit your changes to
+`Gemfile.lock`, or remove the `Gemfile.lock` file from your repository and add
+an entry in the `.gitignore` file to avoid it from being checked in again.
+
### Questions?
This entire guide is open-source. Go ahead and [edit it][3] if you have a
fix or [ask for help][4] if you run into trouble and need some help.
-[3]: https://github.com/jekyll/jekyll/edit/master/site/docs/continuous-integration.md
-[4]: https://github.com/jekyll/jekyll-help#how-do-i-ask-a-question
+[3]: https://github.com/jekyll/jekyll/edit/master/site/_docs/continuous-integration.md
+[4]: http://jekyllrb.com/help/
diff --git a/site/docs/contributing.md b/site/_docs/contributing.md
similarity index 66%
rename from site/docs/contributing.md
rename to site/_docs/contributing.md
index bdf3641..1feec0d 100644
--- a/site/docs/contributing.md
+++ b/site/_docs/contributing.md
@@ -1,25 +1,25 @@
---
layout: docs
title: Contributing
-prev_section: upgrading
-next_section: history
permalink: /docs/contributing/
---
So you've got an awesome idea to throw into Jekyll. Great! Please keep the
following in mind:
+* **Use https://talk.jekyllrb.com for non-technical or indirect Jekyll questions that are not bugs.**
+* **Contributions will not be accepted without tests or necessary documentation updates.**
* If you're creating a small fix or patch to an existing feature, just a simple
test will do. Please stay in the confines of the current test suite and use
[Shoulda](https://github.com/thoughtbot/shoulda/tree/master) and
- [RR](https://github.com/btakita/rr/tree/master).
+ [RSpec-Mocks](https://github.com/rspec/rspec-mocks).
* If it's a brand new feature, make sure to create a new
[Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps
where appropriate. Also, whipping up some documentation in your fork's `site`
would be appreciated, and once merged it will be transferred over to the main
`site`, jekyllrb.com.
* If your contribution changes any Jekyll behavior, make sure to update the
- documentation. It lives in `site/docs`. If the docs are missing information,
+ documentation. It lives in `site/_docs`. If the docs are missing information,
please feel free to add it in. Great docs make a great project!
* Please follow the [GitHub Ruby Styleguide](https://github.com/styleguide/ruby)
when modifying Ruby code.
@@ -38,55 +38,45 @@ following in mind:
</p>
</div>
+
Test Dependencies
-----------------
To run the test suite and build the gem you'll need to install Jekyll's
-dependencies. Jekyll uses Bundler, so a quick run of the `bundle` command and
-you're all set!
+dependencies. Simply run this command to get all setup:
-{% highlight bash %}
-$ bundle
-{% endhighlight %}
+<figure class="highlight"><pre><code>$ script/bootstrap</code></pre></figure>
Before you start, run the tests and make sure that they pass (to confirm your
environment is configured properly):
-{% highlight bash %}
-$ bundle exec rake test
-$ bundle exec rake features
-{% endhighlight %}
+<figure class="highlight"><pre><code>$ script/cibuild</code></pre></figure>
-Workflow
---------
+If you are only updating a file in `test/`, you can use the command:
-Here's the most direct way to get your work merged into the project:
+<figure class="highlight"><pre><code>$ script/test test/blah_test.rb</code></pre></figure>
-* Fork the project.
-* Clone down your fork:
+If you are only updating a `.feature` file, you can use the command:
-{% highlight bash %}
-git clone git://github.com/<username>/jekyll.git
-{% endhighlight %}
+<figure class="highlight"><pre><code>$ script/cucumber features/blah.feature</code></pre></figure>
-* Create a topic branch to contain your change:
+Both `script/test` and `script/cucumber` can be run without arguments to
+run its entire respective suite.
-{% highlight bash %}
-git checkout -b my_awesome_feature
-{% endhighlight %}
+Workflow
+--------
+Here's the most direct way to get your work merged into the project:
+* Fork the project.
+* Clone down your fork ( `git clone git at github.com:[username]/jekyll.git` ).
+* Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ).
* Hack away, add tests. Not necessarily in that order.
-* Make sure everything still passes by running `rake`.
+* Make sure everything still passes by running `script/cibuild`.
* If necessary, rebase your commits into logical chunks, without errors.
-* Push the branch up:
-
-{% highlight bash %}
-git push origin my_awesome_feature
-{% endhighlight %}
-
-* Create a pull request against jekyll/jekyll:master and describe what your
- change does and the why you think it should be merged.
+* Push the branch up ( `git push origin my_awesome_feature` ).
+* Create a pull request against jekyll/jekyll and describe what your change
+ does and the why you think it should be merged.
Updating Documentation
----------------------
@@ -99,29 +89,30 @@ You can find the documentation for jekyllrb.com in the
[site]({{ site.repository }}/tree/master/site) directory of
Jekyll's repo on GitHub.com.
-All documentation pull requests should be directed at `master`. Pull
+All documentation pull requests should be directed at `master`. Pull
requests directed at another branch will not be accepted.
The [Jekyll wiki]({{ site.repository }}/wiki) on GitHub
-can be freely updated without a pull request as all
-GitHub users have access.
+can be freely updated without a pull request as all GitHub users have access.
If you want to add your plugin to the [list of plugins](/docs/plugins/#available-plugins),
please submit a pull request modifying the [plugins page source
-file]({{ site.repository }}/blob/master/site/docs/plugins.md) by adding a
+file]({{ site.repository }}/blob/master/site/_docs/plugins.md) by adding a
link to your plugin under the proper subheading depending upon its type.
Gotchas
-------
-* If you want to bump the gem version, please put that in a separate commit.
- This way, the maintainers can control when the gem gets released.
+* Please do not bump the gem version in your pull requests.
* Try to keep your patch(es) based from the latest commit on jekyll/jekyll.
The easier it is to apply your work, the less work the maintainers have to do,
which is always a good thing.
-* Please don't tag your GitHub issue with \[fix\], \[feature\], etc. The maintainers
+* Please don't tag your GitHub issue with [fix], [feature], etc. The maintainers
actively read the issues and will label it once they come across it.
+Finally...
+----------
+
<div class="note">
<h5>Let us know what could be better!</h5>
<p>
diff --git a/site/docs/datafiles.md b/site/_docs/datafiles.md
similarity index 60%
rename from site/docs/datafiles.md
rename to site/_docs/datafiles.md
index a8dd3bc..afa54b8 100644
--- a/site/docs/datafiles.md
+++ b/site/_docs/datafiles.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Data Files
-prev_section: collections
-next_section: assets
permalink: /docs/datafiles/
---
@@ -10,8 +8,9 @@ In addition to the [built-in variables](../variables/) available from Jekyll,
you can specify your own custom data that can be accessed via the [Liquid
templating system](https://wiki.github.com/shopify/liquid/liquid-for-designers).
-Jekyll supports loading data from [YAML](http://yaml.org/) and [JSON](http://www.json.org/) files located in the
-`_data` directory.
+Jekyll supports loading data from [YAML](http://yaml.org/), [JSON](http://www.json.org/),
+and [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) files located in the `_data` directory.
+Note that CSV files *must* contain a header row.
This powerful feature allows you to avoid repetition in your templates and to
set site specific options without changing `_config.yml`.
@@ -22,13 +21,14 @@ Plugins/themes can also leverage Data Files to set configuration variables.
As explained on the [directory structure](../structure/) page, the `_data`
folder is where you can store additional data for Jekyll to use when generating
-your site. These files must be YAML files (using either the `.yml`, `.yaml` or `.json`
-extension) and they will be accessible via `site.data`.
+your site. These files must be YAML files
+(using either the `.yml`, `.yaml`, `.json` or `csv` extension) and they will be
+accessible via `site.data`.
## Example: List of members
-Here is a basic example of using Data Files to avoid copy-pasting large chunks of
-code in your Jekyll templates:
+Here is a basic example of using Data Files to avoid copy-pasting large chunks
+of code in your Jekyll templates:
In `_data/members.yml`:
@@ -43,6 +43,15 @@ In `_data/members.yml`:
github: liufengyun
{% endhighlight %}
+Or `_data/members.csv`:
+
+{% highlight text %}
+name,github
+Tom Preston-Werner,mojombo
+Parker Moore,parkr
+Liu Fengyun,liufengyun
+{% endhighlight %}
+
This data can be accessed via `site.data.members` (notice that the filename
determines the variable name).
@@ -64,7 +73,10 @@ You can now render the list of members in a template:
## Example: Organizations
-Data files can also be placed in sub-folders of the `_data` folder. Each folder level will be added to a variable's namespace. The example bellow shows how GitHub organizations could be defined separately in a file under the `orgs` folder:
+Data files can also be placed in sub-folders of the `_data` folder. Each folder
+level will be added to a variable's namespace. The example below shows how
+GitHub organizations could be defined separately in a file under the `orgs`
+folder:
In `_data/orgs/jekyll.yml`:
@@ -89,7 +101,8 @@ members:
github: jdoe
{% endhighlight %}
-The organizations can then be accessed via `site.data.orgs`, followed by the file name:
+The organizations can then be accessed via `site.data.orgs`, followed by the
+file name:
{% highlight html %}
{% raw %}
@@ -106,3 +119,33 @@ The organizations can then be accessed via `site.data.orgs`, followed by the fil
</ul>
{% endraw %}
{% endhighlight %}
+
+## Example: Accessing a specific author
+
+Pages and posts can also access a specific data item. The example below shows how to access a specific item:
+
+`_data/people.yml`:
+{% highlight yaml %}
+dave:
+ name: David Smith
+ twitter: DavidSilvaSmith
+{% endhighlight %}
+
+The author can then be specified as a page variable in a post's frontmatter:
+
+{% highlight html %}
+{% raw %}
+---
+title: sample post
+author: dave
+---
+
+{% assign author = site.data.people[page.author] %}
+<a rel="author"
+ href="{{ author.twitter }}"
+ title="{{ author.name }}">
+ {{ author.name }}
+</a>
+
+{% endraw %}
+{% endhighlight %}
diff --git a/site/docs/deployment-methods.md b/site/_docs/deployment-methods.md
similarity index 59%
rename from site/docs/deployment-methods.md
rename to site/_docs/deployment-methods.md
index e1bab10..c1040b2 100644
--- a/site/docs/deployment-methods.md
+++ b/site/_docs/deployment-methods.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Deployment methods
-prev_section: github-pages
-next_section: troubleshooting
permalink: /docs/deployment-methods/
---
@@ -86,16 +84,82 @@ host your site directly on a CDN or file host like S3.
Setup steps are fully documented
[in the `jekyll-hook` repo](https://github.com/developmentseed/jekyll-hook).
+### Static Publisher
+
+[Static Publisher](https://github.com/static-publisher/static-publisher) is another automated deployment option with a server listening for webhook posts, though it's not tied to GitHub specifically. It has a one-click deploy to Heroku, it can watch multiple projects from one server, it has an easy to user admin interface and can publish to either S3 or to a git repository (e.g. gh-pages).
+
### Rake
Another way to deploy your Jekyll site is to use [Rake](https://github.com/jimweirich/rake), [HighLine](https://github.com/JEG2/highline), and
[Net::SSH](https://github.com/net-ssh/net-ssh). A more complex example of deploying Jekyll with Rake that deals with multiple branches can be found in [Git Ready](https://github.com/gitready/gitready/blob/cdfbc4ec5321ff8d18c3ce936e9c749dbbc4f190/Rakefile).
+
+### scp
+
+Once you’ve generated the `_site` directory, you can easily scp it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/script/deploy). You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run this script from within Textmate.
+
### rsync
-Once you’ve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/tasks/deploy). You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run
-this script from within Textmate.
+Once you’ve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/vitalyrepin/vrepinblog/blob/master/transfer.sh). You’d obviously need to change the values to reflect your site’s details.
+
+#### Step 1: Install rrsync to your home folder (server-side)
+
+We will use certificate-based authorization to simplify the publishing process. It makes sense to restrict rsync access only to the directory which it is supposed to sync.
+
+That's why rrsync wrapper shall be installed. If it is not already installed by your hoster you can do it yourself:
+
+- [download rrsync](http://ftp.samba.org/pub/unpacked/rsync/support/rrsync)
+- Put it to the bin subdirectory of your home folder (```~/bin```)
+- Make it executable (```chmod +x```)
+
+#### Step 2: Setup certificate-based ssh access (server side)
+
+[This process is described in a lot of places in the net](https://wiki.gentoo.org/wiki/SSH#Passwordless_Authentication). We will not cover it here. What is different from usual approach is to put the restriction to certificate-based authorization in ```~/.ssh/authorized_keys```). We will launch ```rrsync``` utility and supply it with the folder it shall have read-write access to:
+
+```
+command="$HOME/bin/rrsync <folder>",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa <cert>
+```
+
+```<folder>``` is the path to your site. E.g., ```~/public_html/you.org/blog-html/```.
+
+#### Step 3: Rsync! (client-side)
+
+Add the script ```deploy``` to the web site source folder:
+
+{% highlight bash %}
+#!/bin/sh
+
+rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded <folder> <user>@<site>:
+{% endhighlight %}
+
+Command line parameters are:
+
+- ```--rsh='ssh -p2222'``` It is needed if your hoster provides ssh access using ssh port different from default one (e.g., this is what hostgator is doing)
+- ```<folder>``` is the name of the local folder with generated web content. By default it is ```_site/``` for Jekyll
+- ```<user>``` — ssh user name for your hosting account
+- ```<site>``` — your hosting server
+
+Example command line is:
+
+{% highlight bash %}
+rsync -avr --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser at vrepin.org:
+{% endhighlight %}
+
+Don't forget column ':' after server name!
+
+#### Optional step 4: exclude transfer.sh from being copied to the output folder by Jekyll
+
+This step is recommended if you use this how-to to deploy Jekyll-based web site. If you put ```deploy``` script to the root folder of your project, Jekyll copies it to the output folder.
+This behavior can be changed in ```_config.yml```. Just add the following line there:
+
+{% highlight yaml %}
+# Do not copy these file to the output directory
+exclude: ["deploy"]
+{% endhighlight %}
+
+#### We are done!
+Now it's possible to publish your web site by launching ```deploy``` script. If your ssh certificate is [passphrase-protected](https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html), you are asked to enter the password.
## Rack-Jekyll
@@ -109,9 +173,10 @@ If you want to maintain Jekyll inside your existing Rails app, [Jekyll-Admin](ht
## Amazon S3
-If you want to host your site in Amazon S3, you can do so with
-[s3_website](https://github.com/laurilehmijoki/s3_website) application. It will
-push your site to Amazon S3 where it can be served like any web server,
+If you want to host your site in Amazon S3, you can do so by
+using the [s3_website](https://github.com/laurilehmijoki/s3_website)
+application. It will push your site to Amazon S3 where it can be served like
+any web server,
dynamically scaling to almost unlimited traffic. This approach has the
benefit of being about the cheapest hosting option available for
low-volume blogs as you only pay for what you use.
diff --git a/site/_docs/drafts.md b/site/_docs/drafts.md
new file mode 100644
index 0000000..e50af47
--- /dev/null
+++ b/site/_docs/drafts.md
@@ -0,0 +1,20 @@
+---
+layout: docs
+title: Working with drafts
+permalink: /docs/drafts/
+---
+
+Drafts are posts without a date. They're posts you're still working on and
+don't want to publish yet. To get up and running with drafts, create a
+`_drafts` folder in your site's root (as described in the [site structure](/docs/structure/) section) and create your
+first draft:
+
+{% highlight text %}
+|-- _drafts/
+| |-- a-draft-post.md
+{% endhighlight %}
+
+To preview your site with drafts, simply run `jekyll serve` or `jekyll build`
+with the `--drafts` switch. Each will be assigned the value modification time
+of the draft file for its date, and thus you will see currently edited drafts
+as the latest posts.
diff --git a/site/docs/extras.md b/site/_docs/extras.md
similarity index 94%
rename from site/docs/extras.md
rename to site/_docs/extras.md
index 5bdf2c7..2af6a30 100644
--- a/site/docs/extras.md
+++ b/site/_docs/extras.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Extras
-prev_section: plugins
-next_section: github-pages
permalink: /docs/extras/
---
diff --git a/site/docs/frontmatter.md b/site/_docs/frontmatter.md
similarity index 79%
rename from site/docs/frontmatter.md
rename to site/_docs/frontmatter.md
index 7f218ed..c9a0292 100644
--- a/site/docs/frontmatter.md
+++ b/site/_docs/frontmatter.md
@@ -1,12 +1,10 @@
---
layout: docs
-title: Front-matter
-prev_section: configuration
-next_section: posts
+title: Front Matter
permalink: /docs/frontmatter/
---
-The front-matter is where Jekyll starts to get really cool. Any file that
+The front matter is where Jekyll starts to get really cool. Any file that
contains a [YAML](http://yaml.org/) front matter block will be processed by
Jekyll as a special file. The front matter must be the first thing in the file
and must take the form of valid YAML set between triple-dashed lines. Here is a
@@ -38,17 +36,17 @@ relies on.
<div class="note">
<h5>ProTip™: Front Matter Variables Are Optional</h5>
<p>
- If you want to use <a href="../variables/">Liquid tags and variables</a> but
- don’t need anything in your front-matter, just leave it empty! The set of
- triple-dashed lines with nothing in between will still get Jekyll to process
- your file. (This is useful for things like CSS and RSS feeds!)
+ If you want to use <a href="../variables/">Liquid tags and variables</a>
+ but don’t need anything in your front matter, just leave it empty! The set
+ of triple-dashed lines with nothing in between will still get Jekyll to
+ process your file. (This is useful for things like CSS and RSS feeds!)
</p>
</div>
## Predefined Global Variables
There are a number of predefined global variables that you can set in the
-front-matter of a page or post.
+front matter of a page or post.
<div class="mobile-side-scroller">
<table>
@@ -81,7 +79,7 @@ front-matter of a page or post.
<p>
If you need your processed blog post URLs to be something other than
- the default <code>/year/month/day/title.html</code> then you can set
+ the site-wide style (default <code>/year/month/day/title.html</code>), then you can set
this variable and it will be used as the final URL.
</p>
@@ -111,7 +109,7 @@ front-matter of a page or post.
the post will act as though it had been set with these categories
normally. Categories (plural key) can be specified as a <a
href="http://en.wikipedia.org/wiki/YAML#Lists">YAML list</a> or a
- space-separated string.
+ comma-separated string.
</p>
</td>
@@ -124,8 +122,8 @@ front-matter of a page or post.
<p>
Similar to categories, one or multiple tags can be added to a post.
- Also like categories, tags can be specified as a YAML list or a space-
- separated string.
+ Also like categories, tags can be specified as a YAML list or a
+ comma-separated string.
</p>
</td>
@@ -154,7 +152,7 @@ title:
## Predefined Variables for Posts
-These are available out-of-the-box to be used in the front-matter for a post.
+These are available out-of-the-box to be used in the front matter for a post.
<div class="mobile-side-scroller">
<table>
@@ -172,7 +170,9 @@ These are available out-of-the-box to be used in the front-matter for a post.
<td>
<p>
A date here overrides the date from the name of the post. This can be
- used to ensure correct sorting of posts.
+ used to ensure correct sorting of posts. A date is specified in the
+ format <code>YYYY-MM-DD HH:MM:SS +/-TTTT</code>; hours, minutes, seconds, and timezone offset
+ are optional.
</p>
</td>
</tr>
@@ -183,9 +183,9 @@ These are available out-of-the-box to be used in the front-matter for a post.
<div class="note">
<h5>ProTip™: Don't repeat yourself</h5>
<p>
- If you don't want to repeat your frequently used front-matter variables over and over,
- just define <a href="../configuration/#frontmatter-defaults" title="frontmatter defaults">defaults</a>
- for them and only override them where necessary (or not at all). This works both for predefined
- and custom variables.
+ If you don't want to repeat your frequently used front matter variables
+ over and over, just define <a href="../configuration/#front-matter-defaults" title="Front Matter defaults">defaults</a>
+ for them and only override them where necessary (or not at all). This works
+ both for predefined and custom variables.
</p>
</div>
diff --git a/site/docs/github-pages.md b/site/_docs/github-pages.md
similarity index 68%
rename from site/docs/github-pages.md
rename to site/_docs/github-pages.md
index f126db0..c9a4644 100644
--- a/site/docs/github-pages.md
+++ b/site/_docs/github-pages.md
@@ -1,8 +1,6 @@
---
layout: docs
title: GitHub Pages
-prev_section: extras
-next_section: deployment-methods
permalink: /docs/github-pages/
---
@@ -19,6 +17,43 @@ There are two basic types available: user/organization pages and project pages.
The way to deploy these two types of sites are nearly identical, except for a
few minor details.
+<div class="note protip">
+ <h5>Use the <code>github-pages</code> gem</h5>
+ <p>
+ Our friends at GitHub have provided the
+ <a href="https://github.com/github/pages-gem">github-pages</a>
+ gem which is used to manage Jekyll and its dependencies on
+ GitHub Pages. Using it in your projects means that when you deploy
+ your site to GitHub Pages, you will not be caught by unexpected
+ differences between various versions of the gems. To use the
+ currently-deployed version of the gem in your project, add the
+ following to your <code>Gemfile</code>:
+
+{% highlight ruby %}
+source 'https://rubygems.org'
+
+require 'json'
+require 'open-uri'
+versions = JSON.parse(open('https://pages.github.com/versions.json').read)
+
+gem 'github-pages', versions['github-pages']
+{% endhighlight %}
+
+ This will ensure that when you run <code>bundle install</code>, you
+ have the correct version of the <code>github-pages</code> gem.
+
+ If that fails, simplify it:
+
+{% highlight ruby %}
+source 'https://rubygems.org'
+
+gem 'github-pages'
+{% endhighlight %}
+
+ And be sure to run <code>bundle update</code> often.
+ </p>
+</div>
+
### User and Organization Pages
User and organization pages live in a special GitHub repository dedicated to
@@ -54,6 +89,14 @@ actual software project for Jekyll, however the Jekyll website (that you’re
looking at right now) is contained in the [gh-pages
branch]({{ site.repository }}/tree/gh-pages) of the same repository.
+<div class="note warning">
+ <h5>Source Files Must be in the Root Directory</h5>
+ <p>
+Github Pages <a href="https://help.github.com/articles/troubleshooting-github-pages-build-failures#source-setting">overrides</a> the <a href="http://jekyllrb.com/docs/configuration/#global-configuration">“Site Source”</a> configuration value, so if you locate your files anywhere other than the root directory, your site may not build correctly.
+ </p>
+</div>
+
+
### Project Page URL Structure
Sometimes it's nice to preview your Jekyll site before you push your `gh-pages`
@@ -70,10 +113,10 @@ whilst maintaining the ability to preview your Jekyll site locally.
3. When doing permalinks or internal links, do it like this:
`{% raw %}{{ site.baseurl }}{{ post.url }}{% endraw %}` -- note that there
is **no** slash between the two variables.
-4. Finally, if you'd like to preview your site before committing/deploying using
- `jekyll serve`, be sure to pass an **empty string** to the `--baseurl` option,
- so that you can view everything at `localhost:4000` normally (without
- `/project-name` at the beginning): `jekyll serve --baseurl ''`
+4. Finally, if you'd like to preview your site before committing/deploying
+ using `jekyll serve`, be sure to pass an **empty string** to the `--baseurl`
+ option, so that you can view everything at `localhost:4000` normally
+ (without `/project-name` at the beginning): `jekyll serve --baseurl ''`
This way you can preview your site locally from the site root on localhost,
but when GitHub generates your pages from the gh-pages branch all the URLs
diff --git a/site/docs/history.md b/site/_docs/history.md
similarity index 65%
rename from site/docs/history.md
rename to site/_docs/history.md
index 35f1825..6a64040 100644
--- a/site/docs/history.md
+++ b/site/_docs/history.md
@@ -2,9 +2,599 @@
layout: docs
title: History
permalink: "/docs/history/"
-prev_section: contributing
---
+## 3.0.1 / 2015-11-17
+{: #v3-0-1}
+
+### Bug Fixes
+{: #bug-fixes-v3-0-1}
+
+- Document: only superdirectories of the collection are categories ([#4110]({{ site.repository }}/issues/4110))
+- `Convertible#render_liquid` should use `render!` to cause failure on bad Liquid ([#4077]({{ site.repository }}/issues/4077))
+- Don't generate `.jekyll-metadata` in non-incremental build ([#4079]({{ site.repository }}/issues/4079))
+- Set `highlighter` config val to `kramdown.syntax_highlighter` ([#4090]({{ site.repository }}/issues/4090))
+- Align hooks implementation with documentation ([#4104]({{ site.repository }}/issues/4104))
+- Fix the deprecation warning in the doctor command ([#4114]({{ site.repository }}/issues/4114))
+- Fix case in `:title` and add `:slug` which is downcased ([#4100]({{ site.repository }}/issues/4100))
+
+### Development Fixes
+{: #development-fixes-v3-0-1}
+
+- Fix test warnings when doing rake {test,spec} or script/test ([#4078]({{ site.repository }}/issues/4078))
+
+### Site Enhancements
+{: #site-enhancements-v3-0-1}
+
+- Update normalize.css to v3.0.3. ([#4085]({{ site.repository }}/issues/4085))
+- Update Font Awesome to v4.4.0. ([#4086]({{ site.repository }}/issues/4086))
+- Adds a note about installing the jekyll-gist gem to make gist tag work ([#4101]({{ site.repository }}/issues/4101))
+- Align hooks documentation with implementation ([#4104]({{ site.repository }}/issues/4104))
+- Add Jekyll Flickr Plugin to the list of third party plugins ([#4111]({{ site.repository }}/issues/4111))
+- Remove link to now-deleted blog post ([#4125]({{ site.repository }}/issues/4125))
+- Update the liquid syntax in the pagination docs ([#4130]({{ site.repository }}/issues/4130))
+- Add jekyll-language-plugin to plugins.md ([#4134]({{ site.repository }}/issues/4134))
+- Updated to reflect feedback in [#4129]({{ site.repository }}/issues/4129) ([#4137]({{ site.repository }}/issues/4137))
+- Clarify assets.md based on feedback of [#4129]({{ site.repository }}/issues/4129) ([#4142]({{ site.repository }}/issues/4142))
+- Re-correct the liquid syntax in the pagination docs ([#4140]({{ site.repository }}/issues/4140))
+
+
+## 3.0.0 / 2015-10-26
+{: #v3-0-0}
+
+### Major Enhancements
+{: #major-enhancements-v3-0-0}
+
+- Liquid profiler (i.e. know how fast or slow your templates render) ([#3762]({{ site.repository }}/issues/3762))
+- Incremental regeneration ([#3116]({{ site.repository }}/issues/3116))
+- Add Hooks: a new kind of plugin ([#3553]({{ site.repository }}/issues/3553))
+- Upgrade to Liquid 3.0.0 ([#3002]({{ site.repository }}/issues/3002))
+- `site.posts` is now a Collection instead of an Array ([#4055]({{ site.repository }}/issues/4055))
+- Add basic support for JRuby (commit: 0f4477)
+- Drop support for Ruby 1.9.3. ([#3235]({{ site.repository }}/issues/3235))
+- Support Ruby v2.2 ([#3234]({{ site.repository }}/issues/3234))
+- Support RDiscount 2 ([#2767]({{ site.repository }}/issues/2767))
+- Remove most runtime deps ([#3323]({{ site.repository }}/issues/3323))
+- Move to Rouge as default highlighter ([#3323]({{ site.repository }}/issues/3323))
+- Mimic GitHub Pages `.html` extension stripping behavior in WEBrick ([#3452]({{ site.repository }}/issues/3452))
+- Always include file extension on output files ([#3490]({{ site.repository }}/issues/3490))
+- Improved permalinks for pages and collections ([#3538]({{ site.repository }}/issues/3538))
+- Sunset (i.e. remove) Maruku ([#3655]({{ site.repository }}/issues/3655))
+- Remove support for relative permalinks ([#3679]({{ site.repository }}/issues/3679))
+- Iterate over `site.collections` as an array instead of a hash. ([#3670]({{ site.repository }}/issues/3670))
+- Adapt StaticFile for collections, config defaults ([#3823]({{ site.repository }}/issues/3823))
+- Add a Code of Conduct for the Jekyll project ([#3925]({{ site.repository }}/issues/3925))
+- Added permalink time variables ([#3990]({{ site.repository }}/issues/3990))
+- Add `--incremental` flag to enable incremental regen (disabled by default) ([#4059]({{ site.repository }}/issues/4059))
+
+### Minor Enhancements
+{: #minor-enhancements-v3-0-0}
+
+- Deprecate access to Document#data properties and Collection#docs methods ([#4058]({{ site.repository }}/issues/4058))
+- Sort static files just once, and call `site_payload` once for all collections ([#3204]({{ site.repository }}/issues/3204))
+- Separate `jekyll docs` and optimize external gem handling ([#3241]({{ site.repository }}/issues/3241))
+- Improve `Site#getConverterImpl` and call it `Site#find_converter_instance` ([#3240]({{ site.repository }}/issues/3240))
+- Use relative path for `path` Liquid variable in Documents for consistency ([#2908]({{ site.repository }}/issues/2908))
+- Generalize `Utils#slugify` for any scripts ([#3047]({{ site.repository }}/issues/3047))
+- Added basic microdata to post template in site template ([#3189]({{ site.repository }}/issues/3189))
+- Store log messages in an array of messages. ([#3244]({{ site.repository }}/issues/3244))
+- Allow collection documents to override `output` property in front matter ([#3172]({{ site.repository }}/issues/3172))
+- Keep file modification times between builds for static files ([#3220]({{ site.repository }}/issues/3220))
+- Only downcase mixed-case categories for the URL ([#2571]({{ site.repository }}/issues/2571))
+- Added per post `excerpt_separator` functionality ([#3274]({{ site.repository }}/issues/3274))
+- Allow collections YAML to end with three dots ([#3134]({{ site.repository }}/issues/3134))
+- Add mode parameter to `slugify` Liquid filter ([#2918]({{ site.repository }}/issues/2918))
+- Perf: `Markdown#matches` should avoid regexp ([#3321]({{ site.repository }}/issues/3321))
+- Perf: Use frozen regular expressions for `Utils#slugify` ([#3321]({{ site.repository }}/issues/3321))
+- Split off Textile support into jekyll-textile-converter ([#3319]({{ site.repository }}/issues/3319))
+- Improve the navigation menu alignment in the site template on small
+ screens ([#3331]({{ site.repository }}/issues/3331))
+- Show the regeneration time after the initial generation ([#3378]({{ site.repository }}/issues/3378))
+- Site template: Switch default font to Helvetica Neue ([#3376]({{ site.repository }}/issues/3376))
+- Make the `include` tag a teensy bit faster. ([#3391]({{ site.repository }}/issues/3391))
+- Add `pkill -f jekyll` to ways to kill. ([#3397]({{ site.repository }}/issues/3397))
+- Site template: collapsed, variable-driven font declaration ([#3360]({{ site.repository }}/issues/3360))
+- Site template: Don't always show the scrollbar in code blocks ([#3419]({{ site.repository }}/issues/3419))
+- Site template: Remove undefined `text` class from `p` element ([#3440]({{ site.repository }}/issues/3440))
+- Site template: Optimize text rendering for legibility ([#3382]({{ site.repository }}/issues/3382))
+- Add `draft?` method to identify if Post is a Draft & expose to Liquid ([#3456]({{ site.repository }}/issues/3456))
+- Write regeneration metadata even on full rebuild ([#3464]({{ site.repository }}/issues/3464))
+- Perf: Use `String#end_with?("/")` instead of regexp when checking paths ([#3516]({{ site.repository }}/issues/3516))
+- Docs: document 'ordinal' built-in permalink style ([#3532]({{ site.repository }}/issues/3532))
+- Upgrade liquid-c to 3.x ([#3531]({{ site.repository }}/issues/3531))
+- Use consistent syntax for deprecation warning ([#3535]({{ site.repository }}/issues/3535))
+- Added build --destination and --source flags ([#3418]({{ site.repository }}/issues/3418))
+- Site template: remove unused `page.meta` attribute ([#3537]({{ site.repository }}/issues/3537))
+- Improve the error message when sorting null objects ([#3520]({{ site.repository }}/issues/3520))
+- Added liquid-md5 plugin ([#3598]({{ site.repository }}/issues/3598))
+- Documentation: RR replaced with RSpec Mocks ([#3600]({{ site.repository }}/issues/3600))
+- Documentation: Fix subpath. ([#3599]({{ site.repository }}/issues/3599))
+- Create 'tmp' dir for test_tags if it doesn't exist ([#3609]({{ site.repository }}/issues/3609))
+- Extract reading of data from `Site` to reduce responsibilities. ([#3545]({{ site.repository }}/issues/3545))
+- Removed the word 'Jekyll' a few times from the comments ([#3617]({{ site.repository }}/issues/3617))
+- `bin/jekyll`: with no args, exit with exit code 1 ([#3619]({{ site.repository }}/issues/3619))
+- Incremental build if destination file missing ([#3614]({{ site.repository }}/issues/3614))
+- Static files `mtime` liquid should return a `Time` obj ([#3596]({{ site.repository }}/issues/3596))
+- Use `Jekyll::Post`s for both LSI indexing and lookup. ([#3629]({{ site.repository }}/issues/3629))
+- Add `charset=utf-8` for HTML and XML pages in WEBrick ([#3649]({{ site.repository }}/issues/3649))
+- Set log level to debug when verbose flag is set ([#3665]({{ site.repository }}/issues/3665))
+- Added a mention on the Gemfile to complete the instructions ([#3671]({{ site.repository }}/issues/3671))
+- Perf: Cache `Document#to_liquid` and invalidate where necessary ([#3693]({{ site.repository }}/issues/3693))
+- Perf: `Jekyll::Cleaner#existing_files`: Call `keep_file_regex` and
+ `keep_dirs` only once, not once per iteration ([#3696]({{ site.repository }}/issues/3696))
+- Omit jekyll/jekyll-help from list of resources. ([#3698]({{ site.repository }}/issues/3698))
+- Add basic `jekyll doctor` test to detect fsnotify (OSX) anomalies. ([#3704]({{ site.repository }}/issues/3704))
+- Added talk.jekyllrb.com to "Have questions?" ([#3694]({{ site.repository }}/issues/3694))
+- Performance: Sort files only once ([#3707]({{ site.repository }}/issues/3707))
+- Performance: Marshal metadata ([#3706]({{ site.repository }}/issues/3706))
+- Upgrade highlight wrapper from `div` to `figure` ([#3779]({{ site.repository }}/issues/3779))
+- Upgrade mime-types to `~> 2.6` ([#3795]({{ site.repository }}/issues/3795))
+- Update windows.md with Ruby version info ([#3818]({{ site.repository }}/issues/3818))
+- Make the directory for includes configurable ([#3782]({{ site.repository }}/issues/3782))
+- Rename directory configurations to match `*_dir` convention for consistency ([#3782]({{ site.repository }}/issues/3782))
+- Internal: trigger hooks by owner symbol ([#3871]({{ site.repository }}/issues/3871))
+- Update MIME types from mime-db ([#3933]({{ site.repository }}/issues/3933))
+- Add header to site template `_config.yml` for clarity & direction ([#3997]({{ site.repository }}/issues/3997))
+- Site template: add timezone offset to post date frontmatter ([#4001]({{ site.repository }}/issues/4001))
+- Make a constant for the regex to find hidden files ([#4032]({{ site.repository }}/issues/4032))
+- Site template: refactor github & twitter icons into includes ([#4049]({{ site.repository }}/issues/4049))
+- Site template: add background to Kramdown Rouge-ified backtick code blocks ([#4053]({{ site.repository }}/issues/4053))
+
+### Bug Fixes
+{: #bug-fixes-v3-0-0}
+
+- `post_url`: fix access deprecation warning & fix deprecation msg ([#4060]({{ site.repository }}/issues/4060))
+- Perform jekyll-paginate deprecation warning correctly. ([#3580]({{ site.repository }}/issues/3580))
+- Make permalink parsing consistent with pages ([#3014]({{ site.repository }}/issues/3014))
+- `time()`pre-filter method should accept a `Date` object ([#3299]({{ site.repository }}/issues/3299))
+- Remove unneeded end tag for `link` in site template ([#3236]({{ site.repository }}/issues/3236))
+- Kramdown: Use `enable_coderay` key instead of `use_coderay` ([#3237]({{ site.repository }}/issues/3237))
+- Unescape `Document` output path ([#2924]({{ site.repository }}/issues/2924))
+- Fix nav items alignment when on multiple rows ([#3264]({{ site.repository }}/issues/3264))
+- Highlight: Only Strip Newlines/Carriage Returns, not Spaces ([#3278]({{ site.repository }}/issues/3278))
+- Find variables in front matter defaults by searching with relative file path. ([#2774]({{ site.repository }}/issues/2774))
+- Allow variables (e.g `:categories`) in YAML front matter permalinks ([#3320]({{ site.repository }}/issues/3320))
+- Handle nil URL placeholders in permalinks ([#3325]({{ site.repository }}/issues/3325))
+- Template: Fix nav items alignment when in "burger" mode ([#3329]({{ site.repository }}/issues/3329))
+- Template: Remove `!important` from nav SCSS introduced in [#3329]({{ site.repository }}/issues/3329) ([#3375]({{ site.repository }}/issues/3375))
+- The `:title` URL placeholder for collections should be the filename slug. ([#3383]({{ site.repository }}/issues/3383))
+- Trim the generate time diff to just 3 places past the decimal place ([#3415]({{ site.repository }}/issues/3415))
+- The highlight tag should only clip the newlines before and after the *entire* block, not in between ([#3401]({{ site.repository }}/issues/3401))
+- highlight: fix problem with linenos and rouge. ([#3436]({{ site.repository }}/issues/3436))
+- `Site#read_data_file`: read CSV's with proper file encoding ([#3455]({{ site.repository }}/issues/3455))
+- Ignore `.jekyll-metadata` in site template ([#3496]({{ site.repository }}/issues/3496))
+- Template: Point documentation link to the documentation pages ([#3502]({{ site.repository }}/issues/3502))
+- Removed the trailing slash from the example `/blog` baseurl comment ([#3485]({{ site.repository }}/issues/3485))
+- Clear the regenerator cache every time we process ([#3592]({{ site.repository }}/issues/3592))
+- Readd (bring back) minitest-profile ([#3628]({{ site.repository }}/issues/3628))
+- Add WOFF2 font MIME type to Jekyll server MIME types ([#3647]({{ site.repository }}/issues/3647))
+- Be smarter about extracting the extname in `StaticFile` ([#3632]({{ site.repository }}/issues/3632))
+- Process metadata for all dependencies ([#3608]({{ site.repository }}/issues/3608))
+- Show error message if the YAML front matter on a page/post is invalid. ([#3643]({{ site.repository }}/issues/3643))
+- Upgrade redcarpet to 3.2 (Security fix: OSVDB-120415) ([#3652]({{ site.repository }}/issues/3652))
+- Create #mock_expects that goes directly to RSpec Mocks. ([#3658]({{ site.repository }}/issues/3658))
+- Open `.jekyll-metadata` in binary mode to read binary Marshal data ([#3713]({{ site.repository }}/issues/3713))
+- Incremental regeneration: handle deleted, renamed, and moved dependencies ([#3717]({{ site.repository }}/issues/3717))
+- Fix typo on line 19 of pagination.md ([#3760]({{ site.repository }}/issues/3760))
+- Fix it so that 'blog.html' matches 'blog.html' ([#3732]({{ site.repository }}/issues/3732))
+- Remove occasionally-problematic `ensure` in `LiquidRenderer` ([#3811]({{ site.repository }}/issues/3811))
+- Fixed an unclear code comment in site template SCSS ([#3837]({{ site.repository }}/issues/3837))
+- Fix reading of binary metadata file ([#3845]({{ site.repository }}/issues/3845))
+- Remove var collision with site template header menu iteration variable ([#3838]({{ site.repository }}/issues/3838))
+- Change non-existent `hl_linenos` to `hl_lines` to allow passthrough in safe mode ([#3787]({{ site.repository }}/issues/3787))
+- Add missing flag to disable the watcher ([#3820]({{ site.repository }}/issues/3820))
+- Update CI guide to include more direct explanations of the flow ([#3891]({{ site.repository }}/issues/3891))
+- Set `future` to `false` in the default config ([#3892]({{ site.repository }}/issues/3892))
+- filters: `where` should compare stringified versions of input & comparator ([#3935]({{ site.repository }}/issues/3935))
+- Read build options for `jekyll clean` command ([#3828]({{ site.repository }}/issues/3828))
+- Fix [#3970]({{ site.repository }}/issues/3970): Use Gem::Version to compare versions, not `>`.
+- Abort if no subcommand. Fixes confusing message. ([#3992]({{ site.repository }}/issues/3992))
+- Whole-post excerpts should match the post content ([#4004]({{ site.repository }}/issues/4004))
+- Change default font weight to 400 to fix bold/strong text issues ([#4050]({{ site.repository }}/issues/4050))
+- Document: Only auto-generate the excerpt if it's not overridden ([#4062]({{ site.repository }}/issues/4062))
+- Utils: `deep_merge_hashes` should also merge `default_proc` (45f69bb)
+- Defaults: compare paths in `applies_path?` as `String`s to avoid confusion (7b81f00)
+
+### Development Fixes
+{: #development-fixes-v3-0-0}
+
+- Remove loader.rb and "modernize" `script/test`. ([#3574]({{ site.repository }}/issues/3574))
+- Improve the grammar in the documentation ([#3233]({{ site.repository }}/issues/3233))
+- Update the LICENSE text to match the MIT license exactly ([#3253]({{ site.repository }}/issues/3253))
+- Update rake task `site:publish` to fix minor bugs. ([#3254]({{ site.repository }}/issues/3254))
+- Switch to shields.io for the README badges. ([#3255]({{ site.repository }}/issues/3255))
+- Use `FileList` instead of `Dir.glob` in `site:publish` rake task ([#3261]({{ site.repository }}/issues/3261))
+- Fix test script to be platform-independent ([#3279]({{ site.repository }}/issues/3279))
+- Instead of symlinking `/tmp`, create and symlink a local `tmp` in the tests ([#3258]({{ site.repository }}/issues/3258))
+- Fix some spacing ([#3312]({{ site.repository }}/issues/3312))
+- Fix comment typo in `lib/jekyll/frontmatter_defaults.rb` ([#3322]({{ site.repository }}/issues/3322))
+- Move all `regenerate?` checking to `Regenerator` ([#3326]({{ site.repository }}/issues/3326))
+- Factor out a `read_data_file` call to keep things clean ([#3380]({{ site.repository }}/issues/3380))
+- Proof the site with CircleCI. ([#3427]({{ site.repository }}/issues/3427))
+- Update LICENSE to 2015. ([#3477]({{ site.repository }}/issues/3477))
+- Upgrade tests to use Minitest ([#3492]({{ site.repository }}/issues/3492))
+- Remove trailing whitespace ([#3497]({{ site.repository }}/issues/3497))
+- Use `fixture_site` for Document tests ([#3511]({{ site.repository }}/issues/3511))
+- Remove adapters deprecation warning ([#3529]({{ site.repository }}/issues/3529))
+- Minor fixes to `url.rb` to follow GitHub style guide ([#3544]({{ site.repository }}/issues/3544))
+- Minor changes to resolve deprecation warnings ([#3547]({{ site.repository }}/issues/3547))
+- Convert remaining textile test documents to markdown ([#3528]({{ site.repository }}/issues/3528))
+- Migrate the tests to use rspec-mocks ([#3552]({{ site.repository }}/issues/3552))
+- Remove `activesupport` ([#3612]({{ site.repository }}/issues/3612))
+- Added tests for `Jekyll:StaticFile` ([#3633]({{ site.repository }}/issues/3633))
+- Force minitest version to 5.5.1 ([#3657]({{ site.repository }}/issues/3657))
+- Update the way cucumber accesses Minitest assertions ([#3678]({{ site.repository }}/issues/3678))
+- Add `script/rubyprof` to generate cachegrind callgraphs ([#3692]({{ site.repository }}/issues/3692))
+- Upgrade cucumber to 2.x ([#3795]({{ site.repository }}/issues/3795))
+- Update Kramdown. ([#3853]({{ site.repository }}/issues/3853))
+- Updated the scripts shebang for portability ([#3858]({{ site.repository }}/issues/3858))
+- Update JRuby testing to 9K ([3ab386f](https://github.com/jekyll/jekyll/commit/3ab386f1b096be25a24fe038fc70fd0fb08d545d))
+- Organize dependencies into dev and test groups. ([#3852]({{ site.repository }}/issues/3852))
+- Contributing.md should refer to `script/cucumber` ([#3894]({{ site.repository }}/issues/3894))
+- Update contributing documentation to reflect workflow updates ([#3895]({{ site.repository }}/issues/3895))
+- Add script to vendor mime types ([#3933]({{ site.repository }}/issues/3933))
+- Ignore .bundle dir in SimpleCov ([#4033]({{ site.repository }}/issues/4033))
+
+### Site Enhancements
+{: #site-enhancements-v3-0-0}
+
+- Add 'info' labels to certain notes in collections docs ([#3601]({{ site.repository }}/issues/3601))
+- Remove extra spaces, make the last sentence less awkward in permalink docs ([#3603]({{ site.repository }}/issues/3603))
+- Update the permalinks documentation to reflect the updates for 3.0 ([#3556]({{ site.repository }}/issues/3556))
+- Add blog post announcing Jekyll Help ([#3523]({{ site.repository }}/issues/3523))
+- Add Jekyll Talk to Help page on site ([#3518]({{ site.repository }}/issues/3518))
+- Change Ajax pagination resource link to use HTTPS ([#3570]({{ site.repository }}/issues/3570))
+- Fixing the default host on docs ([#3229]({{ site.repository }}/issues/3229))
+- Add `jekyll-thumbnail-filter` to list of third-party plugins ([#2790]({{ site.repository }}/issues/2790))
+- Add link to 'Adding Ajax pagination to Jekyll' to Resources page ([#3186]({{ site.repository }}/issues/3186))
+- Add a Resources link to tutorial on building dynamic navbars ([#3185]({{ site.repository }}/issues/3185))
+- Semantic structure improvements to the post and page layouts ([#3251]({{ site.repository }}/issues/3251))
+- Add new AsciiDoc plugin to list of third-party plugins. ([#3277]({{ site.repository }}/issues/3277))
+- Specify that all transformable collection documents must contain YAML front matter ([#3271]({{ site.repository }}/issues/3271))
+- Assorted accessibility fixes ([#3256]({{ site.repository }}/issues/3256))
+- Update configuration docs to mention `keep_files` for `destination` ([#3288]({{ site.repository }}/issues/3288), [#3296]({{ site.repository }}/issues/3296))
+- Break when we successfully generate nav link to save CPU cycles. ([#3291]({{ site.repository }}/issues/3291))
+- Update usage docs to mention `keep_files` and a warning about `destination` cleaning ([#3295]({{ site.repository }}/issues/3295))
+- Add logic to automatically generate the `next_section` and `prev_section` navigation items ([#3292]({{ site.repository }}/issues/3292))
+- Some small fixes for the Plugins TOC. ([#3306]({{ site.repository }}/issues/3306))
+- Added versioning comment to configuration file ([#3314]({{ site.repository }}/issues/3314))
+- Add `jekyll-minifier` to list of third-party plugins ([#3333]({{ site.repository }}/issues/3333))
+- Add blog post about the Jekyll meet-up ([#3332]({{ site.repository }}/issues/3332))
+- Use `highlight` Liquid tag instead of the four-space tabs for code ([#3336]({{ site.repository }}/issues/3336))
+- 3.0.0.beta1 release post ([#3346]({{ site.repository }}/issues/3346))
+- Add `twa` to the list of third-party plugins ([#3384]({{ site.repository }}/issues/3384))
+- Remove extra spaces ([#3388]({{ site.repository }}/issues/3388))
+- Fix small grammar errors on a couple pages ([#3396]({{ site.repository }}/issues/3396))
+- Fix typo on Templates docs page ([#3420]({{ site.repository }}/issues/3420))
+- s/three/four for plugin type list ([#3424]({{ site.repository }}/issues/3424))
+- Release jekyllrb.com as a locally-compiled site. ([#3426]({{ site.repository }}/issues/3426))
+- Add a jekyllrb.com/help page which elucidates places from which to get help ([#3428]({{ site.repository }}/issues/3428))
+- Remove extraneous dash on Plugins doc page which caused a formatting error ([#3431]({{ site.repository }}/issues/3431))
+- Fix broken link to Jordan Thornquest's website. ([#3438]({{ site.repository }}/issues/3438))
+- Change the link to an extension ([#3457]({{ site.repository }}/issues/3457))
+- Fix Twitter link on the help page ([#3466]({{ site.repository }}/issues/3466))
+- Fix wording in code snippet highlighting section ([#3475]({{ site.repository }}/issues/3475))
+- Add a `/` to `paginate_path` in the Pagination documentation ([#3479]({{ site.repository }}/issues/3479))
+- Add a link on all the docs pages to "Improve this page". ([#3510]({{ site.repository }}/issues/3510))
+- Add jekyll-auto-image generator to the list of third-party plugins ([#3489]({{ site.repository }}/issues/3489))
+- Replace link to the proposed `picture` element spec ([#3530]({{ site.repository }}/issues/3530))
+- Add frontmatter date formatting information ([#3469]({{ site.repository }}/issues/3469))
+- Improve consistency and clarity of plugins options note ([#3546]({{ site.repository }}/issues/3546))
+- Add permalink warning to pagination docs ([#3551]({{ site.repository }}/issues/3551))
+- Fix grammar in Collections docs API stability warning ([#3560]({{ site.repository }}/issues/3560))
+- Restructure `excerpt_separator` documentation for clarity ([#3550]({{ site.repository }}/issues/3550))
+- Fix accidental line break in collections docs ([#3585]({{ site.repository }}/issues/3585))
+- Add information about the `.jekyll-metadata` file ([#3597]({{ site.repository }}/issues/3597))
+- Document addition of variable parameters to an include ([#3581]({{ site.repository }}/issues/3581))
+- Add `jekyll-files` to the list of third-party plugins. ([#3586]({{ site.repository }}/issues/3586))
+- Define the `install` step in the CI example `.travis.yml` ([#3622]({{ site.repository }}/issues/3622))
+- Expand collections documentation. ([#3638]({{ site.repository }}/issues/3638))
+- Add the "warning" note label to excluding `vendor` in the CI docs page ([#3623]({{ site.repository }}/issues/3623))
+- Upgrade pieces of the Ugrading guide for Jekyll 3 ([#3607]({{ site.repository }}/issues/3607))
+- Showing how to access specific data items ([#3468]({{ site.repository }}/issues/3468))
+- Clarify pagination works from within HTML files ([#3467]({{ site.repository }}/issues/3467))
+- Add note to `excerpt_separator` documentation that it can be set globally ([#3667]({{ site.repository }}/issues/3667))
+- Fix some names on Troubleshooting page ([#3683]({{ site.repository }}/issues/3683))
+- Add `remote_file_content` tag plugin to list of third-party plugins ([#3691]({{ site.repository }}/issues/3691))
+- Update the Redcarpet version on the Configuration page. ([#3743]({{ site.repository }}/issues/3743))
+- Update the link in the welcome post to point to Jekyll Talk ([#3745]({{ site.repository }}/issues/3745))
+- Update link for navbars with data attributes tutorial ([#3728]({{ site.repository }}/issues/3728))
+- Add `jekyll-asciinema` to list of third-party plugins ([#3750]({{ site.repository }}/issues/3750))
+- Update pagination example to be agnostic to first pagination dir ([#3763]({{ site.repository }}/issues/3763))
+- Detailed instructions for rsync deployment method ([#3848]({{ site.repository }}/issues/3848))
+- Add Jekyll Portfolio Generator to list of plugins ([#3883]({{ site.repository }}/issues/3883))
+- Add `site.html_files` to variables docs ([#3880]({{ site.repository }}/issues/3880))
+- Add Static Publisher tool to list of deployment methods ([#3865]({{ site.repository }}/issues/3865))
+- Fix a few typos. ([#3897]({{ site.repository }}/issues/3897))
+- Add `jekyll-youtube` to the list of third-party plugins ([#3931]({{ site.repository }}/issues/3931))
+- Add Views Router plugin ([#3950]({{ site.repository }}/issues/3950))
+- Update install docs (Core dependencies, Windows reqs, etc) ([#3769]({{ site.repository }}/issues/3769))
+- Use Jekyll Feed for jekyllrb.com ([#3736]({{ site.repository }}/issues/3736))
+- Add jekyll-umlauts to plugins.md ($3966)
+- Troubleshooting: fix broken link, add other mac-specific info ([#3968]({{ site.repository }}/issues/3968))
+- Add a new site for learning purposes ([#3917]({{ site.repository }}/issues/3917))
+- Added documentation for Jekyll environment variables ([#3989]({{ site.repository }}/issues/3989))
+- Fix broken configuration documentation page ([#3994]({{ site.repository }}/issues/3994))
+- Add troubleshooting docs for installing on El Capitan ([#3999]({{ site.repository }}/issues/3999))
+- Add Lazy Tweet Embedding to the list of third-party plugins ([#4015]({{ site.repository }}/issues/4015))
+- Add installation instructions for 2 of 3 options for plugins ([#4013]({{ site.repository }}/issues/4013))
+- Add alternative jekyll gem installation instructions ([#4018]({{ site.repository }}/issues/4018))
+- Fix a few typos and formatting problems. ([#4022]({{ site.repository }}/issues/4022))
+- Fix pretty permalink example ([#4029]({{ site.repository }}/issues/4029))
+- Note that `_config.yml` is not reloaded during regeneration ([#4034]({{ site.repository }}/issues/4034))
+- Apply code block figure syntax to blocks in CONTRIBUTING ([#4046]({{ site.repository }}/issues/4046))
+- Add jekyll-smartify to the list of third-party plugins ([#3572]({{ site.repository }}/issues/3572))
+
+
+## 2.5.3 / 2014-12-22
+{: #v2-5-3}
+
+### Bug Fixes
+{: #bug-fixes-v2-5-3}
+
+- When checking a Markdown extname, include position of the `.` ([#3147]({{ site.repository }}/issues/3147))
+- Fix `jsonify` Liquid filter handling of boolean values ([#3154]({{ site.repository }}/issues/3154))
+- Add comma to value of `viewport` meta tag ([#3170]({{ site.repository }}/issues/3170))
+- Set the link type for the RSS feed to `application/rss+xml` ([#3176]({{ site.repository }}/issues/3176))
+- Refactor `#as_liquid` ([#3158]({{ site.repository }}/issues/3158))
+
+### Development Fixes
+{: #development-fixes-v2-5-3}
+
+- Exclude built-in bundles from being added to coverage report ([#3180]({{ site.repository }}/issues/3180))
+
+### Site Enhancements
+{: #site-enhancements-v2-5-3}
+
+- Add `[@alfredxing](https://github.com/alfredxing)` to the `[@jekyll](https://github.com/jekyll)/core` team. :tada: ([#3218]({{ site.repository }}/issues/3218))
+- Document the `-q` option for the `build` and `serve` commands ([#3149]({{ site.repository }}/issues/3149))
+- Fix some minor typos/flow fixes in documentation website content ([#3165]({{ site.repository }}/issues/3165))
+- Add `keep_files` to configuration documentation ([#3162]({{ site.repository }}/issues/3162))
+- Repeat warning about cleaning of the `destination` directory ([#3161]({{ site.repository }}/issues/3161))
+- Add jekyll-500px-embed to list of third-party plugins ([#3163]({{ site.repository }}/issues/3163))
+- Simplified platform detection in Gemfile example for Windows ([#3177]({{ site.repository }}/issues/3177))
+- Add the `jekyll-jalali` plugin added to the list of third-party plugins. ([#3198]({{ site.repository }}/issues/3198))
+- Add Table of Contents to Troubleshooting page ([#3196]({{ site.repository }}/issues/3196))
+- Add `inline_highlight` plugin to list of third-party plugins ([#3212]({{ site.repository }}/issues/3212))
+- Add `jekyll-mermaid` plugin to list of third-party plugins ([#3222]({{ site.repository }}/issues/3222))
+
+
+## 2.5.2 / 2014-11-17
+{: #v2-5-2}
+
+### Minor Enhancements
+{: #minor-enhancements-v2-5-2}
+
+- `post_url` should match `post.name` instead of slugs and dates ([#3058]({{ site.repository }}/issues/3058))
+
+### Bug Fixes
+{: #bug-fixes-v2-5-2}
+
+- Fix bundle require for `:jekyll_plugins` ([#3119]({{ site.repository }}/issues/3119))
+- Remove duplicate regexp phrase: `^\A` ([#3089]({{ site.repository }}/issues/3089))
+- Remove duplicate `Conversion error:` message in `Convertible` ([#3088]({{ site.repository }}/issues/3088))
+- Print full conversion error message in `Renderer#convert` ([#3090]({{ site.repository }}/issues/3090))
+
+### Site Enhancements
+{: #site-enhancements-v2-5-2}
+
+- Change variable names in Google Analytics script ([#3093]({{ site.repository }}/issues/3093))
+- Mention CSV files in the docs for data files ([#3101]({{ site.repository }}/issues/3101))
+- Add trailing slash to `paginate_path` example. ([#3091]({{ site.repository }}/issues/3091))
+- Get rid of noifniof (`excerpt_separator`) ([#3094]({{ site.repository }}/issues/3094))
+- Sass improvements, around nesting mostly. ([#3123]({{ site.repository }}/issues/3123))
+- Add webmentions.io plugin to the list of third-party plugins ([#3127]({{ site.repository }}/issues/3127))
+- Add Sass mixins and use them. ([#2904]({{ site.repository }}/issues/2904))
+- Slightly compress jekyll-sticker.jpg. ([#3133]({{ site.repository }}/issues/3133))
+- Update gridism and separate out related but custom styles. ([#3132]({{ site.repository }}/issues/3132))
+- Add remote-include plugin to list of third-party plugins ([#3136]({{ site.repository }}/issues/3136))
+
+
+## 2.5.1 / 2014-11-09
+{: #v2-5-1}
+
+### Bug Fixes
+{: #bug-fixes-v2-5-1}
+
+- Fix path sanitation bug related to Windows drive names ([#3077]({{ site.repository }}/issues/3077))
+
+### Development Fixes
+{: #development-fixes-v2-5-1}
+
+- Add development time dependencies on minitest and test-unit to gemspec for cygwin ([#3064]({{ site.repository }}/issues/3064))
+- Use Travis's built-in caching. ([#3075]({{ site.repository }}/issues/3075))
+
+
+## 2.5.0 / 2014-11-06
+{: #v2-5-0}
+
+### Minor Enhancements
+{: #minor-enhancements-v2-5-0}
+
+- Require gems in `:jekyll_plugins` Gemfile group unless `JEKYLL_NO_BUNDLER_REQUIRE` is specified in the environment. ([#2865]({{ site.repository }}/issues/2865))
+- Centralize path sanitation in the `Site` object ([#2882]({{ site.repository }}/issues/2882))
+- Allow placeholders in permalinks ([#3031]({{ site.repository }}/issues/3031))
+- Allow users to specify the log level via `JEKYLL_LOG_LEVEL`. ([#3067]({{ site.repository }}/issues/3067))
+- Fancy Indexing with WEBrick ([#3018]({{ site.repository }}/issues/3018))
+- Allow Enumerables to be used with `where` filter. ([#2986]({{ site.repository }}/issues/2986))
+- Meta descriptions in the site template now use `page.excerpt` if it's available ([#2964]({{ site.repository }}/issues/2964))
+- Change indentation in `head.html` of site template to 2 spaces from 4 ([#2973]({{ site.repository }}/issues/2973))
+- Use a `$content-width` variable instead of a fixed value in the site template CSS ([#2972]({{ site.repository }}/issues/2972))
+- Strip newlines in site template `<meta>` description. ([#2982]({{ site.repository }}/issues/2982))
+- Add link to atom feed in `head` of site template files ([#2996]({{ site.repository }}/issues/2996))
+- Performance optimizations ([#2994]({{ site.repository }}/issues/2994))
+- Use `Hash#each_key` instead of `Hash#keys.each` to speed up iteration
+ over hash keys. ([#3017]({{ site.repository }}/issues/3017))
+- Further minor performance enhancements. ([#3022]({{ site.repository }}/issues/3022))
+- Add 'b' and 's' aliases for build and serve, respectively ([#3065]({{ site.repository }}/issues/3065))
+
+### Bug Fixes
+{: #bug-fixes-v2-5-0}
+
+- Fix Rouge's RedCarpet plugin interface integration ([#2951]({{ site.repository }}/issues/2951))
+- Remove `--watch` from the site template blog post since it defaults
+ to watching in in 2.4.0 ([#2922]({{ site.repository }}/issues/2922))
+- Fix code for media query mixin in site template ([#2946]({{ site.repository }}/issues/2946))
+- Allow post URL's to have `.htm` extensions ([#2925]({{ site.repository }}/issues/2925))
+- `Utils.slugify`: Don't create new objects when gsubbing ([#2997]({{ site.repository }}/issues/2997))
+- The jsonify filter should deep-convert to Liquid when given an Array. ([#3032]({{ site.repository }}/issues/3032))
+- Apply `jsonify` filter to Hashes deeply and effectively ([#3063]({{ site.repository }}/issues/3063))
+- Use `127.0.0.1` as default host instead of `0.0.0.0` ([#3053]({{ site.repository }}/issues/3053))
+- In the case that a Gemfile does not exist, ensure Jekyll doesn't fail on requiring the Gemfile group ([#3066]({{ site.repository }}/issues/3066))
+
+### Development Fixes
+{: #development-fixes-v2-5-0}
+
+- Fix a typo in the doc block for `Jekyll::URL.escape_path` ([#3052]({{ site.repository }}/issues/3052))
+- Add integration test for `jekyll new --blank` in TestUnit ([#2913]({{ site.repository }}/issues/2913))
+- Add unit test for `jekyll new --force` logic ([#2929]({{ site.repository }}/issues/2929))
+- Update outdated comment for `Convertible#transform` ([#2957]({{ site.repository }}/issues/2957))
+- Add Hakiri badge to README. ([#2953]({{ site.repository }}/issues/2953))
+- Add some simple benchmarking tools. ([#2993]({{ site.repository }}/issues/2993))
+
+### Site Enhancements
+{: #site-enhancements-v2-5-0}
+
+- `NOKOGIRI_USE_SYSTEM_LIBRARIES=true` **decreases** installation time. ([#3040]({{ site.repository }}/issues/3040))
+- Add FormKeep to resources as Jekyll form backend ([#3010]({{ site.repository }}/issues/3010))
+- Fixing a mistake in the name of the new Liquid tag ([#2969]({{ site.repository }}/issues/2969))
+- Update Font Awesome to v4.2.0. ([#2898]({{ site.repository }}/issues/2898))
+- Fix link to [#2895]({{ site.repository }}/issues/2895) in 2.4.0 release post. ([#2899]({{ site.repository }}/issues/2899))
+- Add Big Footnotes for Kramdown plugin to list of third-party plugins ([#2916]({{ site.repository }}/issues/2916))
+- Remove warning regarding GHP use of singular types for front matter defaults ([#2919]({{ site.repository }}/issues/2919))
+- Fix quote character typo in site documentation for templates ([#2917]({{ site.repository }}/issues/2917))
+- Point Liquid links to Liquid’s Github wiki ([#2887]({{ site.repository }}/issues/2887))
+- Add HTTP Basic Auth (.htaccess) plugin to list of third-party plugins ([#2931]({{ site.repository }}/issues/2931))
+- (Minor) Grammar & `_config.yml` filename fixes ([#2911]({{ site.repository }}/issues/2911))
+- Added `mathml.rb` to the list of third-party plugins. ([#2937]({{ site.repository }}/issues/2937))
+- Add `--force_polling` to the list of configuration options ([#2943]({{ site.repository }}/issues/2943))
+- Escape unicode characters in site CSS ([#2906]({{ site.repository }}/issues/2906))
+- Add note about using the github-pages gem via pages.github.com/versions.json ([#2939]({{ site.repository }}/issues/2939))
+- Update usage documentation to reflect 2.4 auto-enabling of `--watch`. ([#2954]({{ site.repository }}/issues/2954))
+- Add `--skip-initial-build` to configuration docs ([#2949]({{ site.repository }}/issues/2949))
+- Fix a minor typo in Templates docs page ([#2959]({{ site.repository }}/issues/2959))
+- Add a ditaa-ditaa plugin under Other section on the Plugins page ([#2967]({{ site.repository }}/issues/2967))
+- Add `build/serve -V` option to configuration documentation ([#2948]({{ site.repository }}/issues/2948))
+- Add 'Jekyll Twitter Plugin' to list of third-party plugins ([#2979]({{ site.repository }}/issues/2979))
+- Docs: Update normalize.css to v3.0.2. ([#2981]({{ site.repository }}/issues/2981))
+- Fix typo in Continuous Integration documentation ([#2984]({{ site.repository }}/issues/2984))
+- Clarify behavior of `:categories` in permalinks ([#3011]({{ site.repository }}/issues/3011))
+
+
+## 2.4.0 / 2014-09-09
+{: #v2-4-0}
+
+### Minor Enhancements
+{: #minor-enhancements-v2-4-0}
+
+- Support a new `relative_include` tag ([#2870]({{ site.repository }}/issues/2870))
+- Auto-enable watch on 'serve' ([#2858]({{ site.repository }}/issues/2858))
+- Render Liquid in CoffeeScript files ([#2830]({{ site.repository }}/issues/2830))
+- Array Liquid filters: `push`, `pop`, `unshift`, `shift` ([#2895]({{ site.repository }}/issues/2895))
+- Add `:title` to collection URL template fillers ([#2864]({{ site.repository }}/issues/2864))
+- Add support for CSV files in the `_data` directory ([#2761]({{ site.repository }}/issues/2761))
+- Add the `name` variable to collection permalinks ([#2799]({{ site.repository }}/issues/2799))
+- Add `inspect` liquid filter. ([#2867]({{ site.repository }}/issues/2867))
+- Add a `slugify` Liquid filter ([#2880]({{ site.repository }}/issues/2880))
+
+### Bug Fixes
+{: #bug-fixes-v2-4-0}
+
+- Use `Jekyll.sanitized_path` when adding static files to Collections ([#2849]({{ site.repository }}/issues/2849))
+- Fix encoding of `main.scss` in site template ([#2771]({{ site.repository }}/issues/2771))
+- Fix orientation bugs in default site template ([#2862]({{ site.repository }}/issues/2862))
+
+### Development Fixes
+{: #development-fixes-v2-4-0}
+
+- Update simplecov gem to 0.9 ([#2748]({{ site.repository }}/issues/2748))
+- Remove `docs/` dir ([#2768]({{ site.repository }}/issues/2768))
+- add class `<< self` idiom to `New` command ([#2817]({{ site.repository }}/issues/2817))
+- Allow Travis to 'parallelize' our tests ([#2859]({{ site.repository }}/issues/2859))
+- Fix test for Liquid rendering in Sass ([#2856]({{ site.repository }}/issues/2856))
+- Fixing "vertycal" typo in site template's `_base.scss` ([#2889]({{ site.repository }}/issues/2889))
+
+### Site Enhancements
+{: #site-enhancements-v2-4-0}
+
+- Document the `name` variable for collection permalinks ([#2829]({{ site.repository }}/issues/2829))
+- Adds info about installing jekyll in current dir ([#2839]({{ site.repository }}/issues/2839))
+- Remove deprecated `jekyll-projectlist` plugin from list of third-party
+ plugins ([#2742]({{ site.repository }}/issues/2742))
+- Remove tag plugins that are built in to Jekyll ([#2751]({{ site.repository }}/issues/2751))
+- Add `markdown-writer` package for Atom Editor to list of third-party
+ plugins ([#2763]({{ site.repository }}/issues/2763))
+- Fix typo in site documentation for collections ([#2764]({{ site.repository }}/issues/2764))
+- Fix minor typo on plugins docs page ([#2765]({{ site.repository }}/issues/2765))
+- Replace markdown with HTML in `sass_dir` note on assets page ([#2791]({{ site.repository }}/issues/2791))
+- Fixed "bellow" typo in datafiles docs ([#2879]({{ site.repository }}/issues/2879))
+- Fix code/markdown issue in documentation for variables ([#2877]({{ site.repository }}/issues/2877))
+- Remove Good Include third-party plugin from plugins page ([#2881]({{ site.repository }}/issues/2881))
+- Add some more docs on `include_relative` ([#2884]({{ site.repository }}/issues/2884))
+
+
+## 2.3.0 / 2014-08-10
+{: #v2-3-0}
+
+### Minor Enhancements
+{: #minor-enhancements-v2-3-0}
+
+- Allow Convertibles to be converted by >= 1 converters ([#2704]({{ site.repository }}/issues/2704))
+- Allow Sass files to be rendered in Liquid, but never place them in layouts. ([#2733]({{ site.repository }}/issues/2733))
+- Add `jekyll help` command ([#2707]({{ site.repository }}/issues/2707))
+- Use `.scss` for `site_template` styles. ([#2667]({{ site.repository }}/issues/2667))
+- Don't require the `scope` key in front matter defaults ([#2659]({{ site.repository }}/issues/2659))
+- No longer set `permalink: pretty` in the `_config.yml` for the site template ([#2680]({{ site.repository }}/issues/2680))
+- Rework site template to utilize Sass ([#2687]({{ site.repository }}/issues/2687))
+- Notify the user when auto-regeneration is disabled. ([#2696]({{ site.repository }}/issues/2696))
+- Allow partial variables in include tag filename argument ([#2693]({{ site.repository }}/issues/2693))
+- Move instances of `Time.parse` into a Utils method ([#2682]({{ site.repository }}/issues/2682))
+- Ignore subfolders in the `_posts` folder ([#2705]({{ site.repository }}/issues/2705)) REVERTS ([#2633]({{ site.repository }}/issues/2633))
+- Front Matter default types should always be pluralized ([#2732]({{ site.repository }}/issues/2732))
+- Read in static files into `collection.files` as `StaticFile`s ([#2737]({{ site.repository }}/issues/2737))
+- Add `sassify` and `scssify` Liquid filters ([#2739]({{ site.repository }}/issues/2739))
+- Replace `classifier` gem with `classifier-reborn` ([#2721]({{ site.repository }}/issues/2721))
+
+### Bug Fixes
+{: #bug-fixes-v2-3-0}
+
+- Use only the last extname when multiple converters exist ([#2722]({{ site.repository }}/issues/2722))
+- Call `#to_liquid` before calling `#to_json` in jsonify filter ([#2729]({{ site.repository }}/issues/2729))
+- Use non padded config in `strftime` to avoid parse string twice ([#2673]({{ site.repository }}/issues/2673))
+- Replace deprecated Ruby methods with undeprecated ones ([#2664]({{ site.repository }}/issues/2664))
+- Catch errors when parsing Post `date` front matter value & produce nice error message ([#2649]({{ site.repository }}/issues/2649))
+- Allow static files in Collections ([#2615]({{ site.repository }}/issues/2615))
+- Fixed typo in `Deprecator#gracefully_require` error message ([#2694]({{ site.repository }}/issues/2694))
+- Remove preemptive loading of the 'classifier' gem. ([#2697]({{ site.repository }}/issues/2697))
+- Use case-insensitive checking for the file extensions when loading config files ([#2718]({{ site.repository }}/issues/2718))
+- When Reading Documents, Respect `encoding` Option ([#2720]({{ site.repository }}/issues/2720))
+- Refactor based on jekyll-watch clean-up. ([#2716]({{ site.repository }}/issues/2716))
+- `Document#to_s` should produce just the content of the document ([#2731]({{ site.repository }}/issues/2731))
+
+### Development Fixes
+{: #development-fixes-v2-3-0}
+
+- Only include lib files in the gem ([#2671]({{ site.repository }}/issues/2671))
+- Fix `git diff` command in `proof` script ([#2672]({{ site.repository }}/issues/2672))
+- Make default rake task a multitask so tests run in parallel ([#2735]({{ site.repository }}/issues/2735))
+
+### Site Enhancements
+{: #site-enhancements-v2-3-0}
+
+- Use Sass and a Docs Collection ([#2651]({{ site.repository }}/issues/2651))
+- Add `latest_version.txt` file to the site ([#2740]({{ site.repository }}/issues/2740))
+- Be more ambiguous about `page.content`. But more transparent. ([#2522]({{ site.repository }}/issues/2522))
+- Streamlining front matter wording (instead of front-matter/frontmatter) ([#2674]({{ site.repository }}/issues/2674))
+- Add note that source directory cannot be modified in GitHub Pages ([#2669]({{ site.repository }}/issues/2669))
+- Fix links from [#2669]({{ site.repository }}/issues/2669) to be actual HTML. Whoops. ([#2679]({{ site.repository }}/issues/2679))
+- Add link to `jekyll-slim` in list of third-party plugins ([#2689]({{ site.repository }}/issues/2689))
+- Add Barry Clark's Smashing Magazine tutorial to resources page ([#2688]({{ site.repository }}/issues/2688))
+- Reorganize and update default configuration settings ([#2456]({{ site.repository }}/issues/2456))
+- Fixing indentation in the configuration docs about Redcarpet exts ([#2717]({{ site.repository }}/issues/2717))
+- Use `null` in YAML instead of `nil` in default config list ([#2719]({{ site.repository }}/issues/2719))
+- Fix typo in Continuous Integration docs ([#2708]({{ site.repository }}/issues/2708))
+
+
## 2.2.0 / 2014-07-29
{: #v2-2-0}
@@ -87,7 +677,7 @@ prev_section: contributing
- Upgrade listen to `2.7.6 <= x < 3.0.0` ([#2492]({{ site.repository }}/issues/2492))
- Allow configuration of different Twitter and GitHub usernames in site template ([#2485]({{ site.repository }}/issues/2485))
- Bump Pygments to v0.6.0 ([#2504]({{ site.repository }}/issues/2504))
-- Front-matter defaults for documents in collections ([#2419]({{ site.repository }}/issues/2419))
+- Front matter defaults for documents in collections ([#2419]({{ site.repository }}/issues/2419))
- Include files with a url which ends in `/` in the `site.html_pages` list ([#2524]({{ site.repository }}/issues/2524))
- Make `highlight` tag use `language-` prefix in CSS class ([#2511]({{ site.repository }}/issues/2511))
- Lookup item property via `item#to_liquid` before `#data` or `#[]` in filters ([#2493]({{ site.repository }}/issues/2493))
@@ -106,7 +696,7 @@ prev_section: contributing
- Prevent code from overflowing container in site template ([#2429]({{ site.repository }}/issues/2429))
- Encode URLs in UTF-8 when escaping and unescaping ([#2420]({{ site.repository }}/issues/2420))
- No Layouts or Liquid for Asset Files ([#2431]({{ site.repository }}/issues/2431))
-- Allow front-matter defaults to set post categories ([#2373]({{ site.repository }}/issues/2373))
+- Allow front matter defaults to set post categories ([#2373]({{ site.repository }}/issues/2373))
- Fix command in subcommand deprecation warning ([#2457]({{ site.repository }}/issues/2457))
- Keep all parent directories of files/dirs in `keep_files` ([#2458]({{ site.repository }}/issues/2458))
- When using RedCarpet and Rouge without Rouge installed, fixed erroneous
@@ -141,7 +731,7 @@ prev_section: contributing
- Prevent table from extending parent width in permalink style table ([#2424]({{ site.repository }}/issues/2424))
- Add collections to info about pagination support ([#2389]({{ site.repository }}/issues/2389))
- Add `jekyll_github_sample` plugin to list of third-party plugins ([#2463]({{ site.repository }}/issues/2463))
-- Clarify documentation around front-matter defaults and add details
+- Clarify documentation around front matter defaults and add details
about defaults for collections. ([#2439]({{ site.repository }}/issues/2439))
- Add Jekyll Project Version Tag to list of third-party plugins ([#2468]({{ site.repository }}/issues/2468))
- Use `https` for GitHub links across whole site ([#2470]({{ site.repository }}/issues/2470))
@@ -180,7 +770,7 @@ prev_section: contributing
- Update docs to reflect new `baseurl` default ([#2341]({{ site.repository }}/issues/2341))
- Add links to headers who have an ID. ([#2342]({{ site.repository }}/issues/2342))
- Use symbol instead of HTML number in `upgrading.md` ([#2351]({{ site.repository }}/issues/2351))
-- Fix link to frontmatter defaults docs ([#2353]({{ site.repository }}/issues/2353))
+- Fix link to front matter defaults docs ([#2353]({{ site.repository }}/issues/2353))
- Fix for `History.markdown` in order to fix history page in docs ([#2363]({{ site.repository }}/issues/2363))
@@ -230,7 +820,7 @@ prev_section: contributing
- Expose `site.static_files` to Liquid ([#2075]({{ site.repository }}/issues/2075))
- Complete redesign of the template site generated by `jekyll new` ([#2050]({{ site.repository }}/issues/2050))
- Update Listen from 1.x to 2.x ([#2097]({{ site.repository }}/issues/2097))
-- Front-matter defaults ([#2205]({{ site.repository }}/issues/2205))
+- Front matter defaults ([#2205]({{ site.repository }}/issues/2205))
- Deprecate `relative_permalinks` configuration option (default to `false`) ([#2307]({{ site.repository }}/issues/2307))
- Exclude files based on prefix as well as `fnmatch?` ([#2303]({{ site.repository }}/issues/2303))
@@ -276,12 +866,12 @@ prev_section: contributing
- Permit YAML blocks to end with three dots to better conform with the
YAML spec ([#2110]({{ site.repository }}/issues/2110))
- Use `File.exist?` instead of deprecated `File.exists?` ([#2214]({{ site.repository }}/issues/2214))
-- Require newline after start of YAML front-matter header ([#2211]({{ site.repository }}/issues/2211))
+- Require newline after start of YAML Front Matter header ([#2211]({{ site.repository }}/issues/2211))
- Add the ability for pages to be marked as `published: false` ([#1492]({{ site.repository }}/issues/1492))
- Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy
looking up of variable values in a Liquid context. ([#2253]({{ site.repository }}/issues/2253))
- Remove literal lang name from class ([#2292]({{ site.repository }}/issues/2292))
-- Return `utf-8` encoding in header for webrick error page response ([#2289]({{ site.repository }}/issues/2289))
+- Return `utf-8` encoding in header for webrick error page response ([#2289]({{ site.repository }}/issues/2289))
- Make template site easier to customize ([#2268]({{ site.repository }}/issues/2268))
- Add two-digit year to permalink template option ([#2301]({{ site.repository }}/issues/2301))
- Add `site.documents` to Liquid payload (list of all docs) ([#2295]({{ site.repository }}/issues/2295))
@@ -1039,7 +1629,7 @@ prev_section: contributing
- Bullet-proof `limit_posts` option ([#1004]({{ site.repository }}/issues/1004))
- Read in YAML as UTF-8 to accept non-ASCII chars ([#836]({{ site.repository }}/issues/836))
- Fix the CLI option `--plugins` to actually accept dirs and files ([#993]({{ site.repository }}/issues/993))
-- Allow 'excerpt' in YAML Front-Matter to override the extracted excerpt ([#946]({{ site.repository }}/issues/946))
+- Allow 'excerpt' in YAML front matter to override the extracted excerpt ([#946]({{ site.repository }}/issues/946))
- Fix cascade problem with site.baseurl, site.port and site.host. ([#935]({{ site.repository }}/issues/935))
- Filter out directories with valid post names ([#875]({{ site.repository }}/issues/875))
- Fix symlinked static files not being correctly built in unsafe mode ([#909]({{ site.repository }}/issues/909))
@@ -1051,7 +1641,7 @@ prev_section: contributing
- Patch for multibyte URI problem with `jekyll serve` ([#723]({{ site.repository }}/issues/723))
- Order plugin execution by priority ([#864]({{ site.repository }}/issues/864))
- Fixed Page#dir and Page#url for edge cases ([#536]({{ site.repository }}/issues/536))
-- Fix broken `post_url` with posts with a time in their YAML Front-Matter ([#831]({{ site.repository }}/issues/831))
+- Fix broken `post_url` with posts with a time in their YAML front matter ([#831]({{ site.repository }}/issues/831))
- Look for plugins under the source directory ([#654]({{ site.repository }}/issues/654))
- Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long
post names ([#775]({{ site.repository }}/issues/775))
@@ -1118,7 +1708,7 @@ prev_section: contributing
- Fix error with `limit_posts` ([#442]({{ site.repository }}/issues/442))
- Properly select dotfile during directory scan ([#363]({{ site.repository }}/issues/363), [#431]({{ site.repository }}/issues/431), [#377]({{ site.repository }}/issues/377))
- Allow setting of Kramdown `smart_quotes` ([#482]({{ site.repository }}/issues/482))
-- Ensure front-matter is at start of file ([#562]({{ site.repository }}/issues/562))
+- Ensure front matter is at start of file ([#562]({{ site.repository }}/issues/562))
## 0.11.2 / 2011-12-27
@@ -1271,7 +1861,7 @@ prev_section: contributing
{: #v0-5-6}
- Bug Fixes
- Require redcloth >= 4.2.1 in tests ([#92]({{ site.repository }}/issues/92))
-- Don't break on triple dashes in yaml frontmatter ([#93]({{ site.repository }}/issues/93))
+- Don't break on triple dashes in yaml front matter ([#93]({{ site.repository }}/issues/93))
### Minor Enhancements
{: #minor-enhancements-v0-5-6}
@@ -1329,7 +1919,7 @@ prev_section: contributing
([@eugenebolshakov](https://github.com/eugenebolshakov))
- Bad markdown processor in config fails sooner and with better message
(@ gcnovus)
-- Allow CRLFs in yaml frontmatter ([@juretta](https://github.com/juretta))
+- Allow CRLFs in yaml front matter ([@juretta](https://github.com/juretta))
- Added Date#xmlschema for Ruby versions < 1.9
diff --git a/site/docs/index.md b/site/_docs/index.md
similarity index 88%
rename from site/docs/index.md
rename to site/_docs/index.md
index 46d0747..bbb1808 100644
--- a/site/docs/index.md
+++ b/site/_docs/index.md
@@ -1,7 +1,6 @@
---
layout: docs
title: Welcome
-next_section: quickstart
permalink: /docs/home/
---
@@ -15,10 +14,9 @@ development of Jekyll itself.
Jekyll is a simple, blog-aware, static site generator. It takes a template
directory containing raw text files in various formats, runs it through
-[Markdown](http://daringfireball.net/projects/markdown/) (or
-[Textile](http://redcloth.org/textile)) and
-[Liquid](http://wiki.shopify.com/Liquid)
-converters, and spits out a complete, ready-to-publish static website suitable
+a converter (like [Markdown](http://daringfireball.net/projects/markdown/))
+and our [Liquid](https://github.com/Shopify/liquid/wiki) renderer, and
+spits out a complete, ready-to-publish static website suitable
for serving with your favorite web server. Jekyll also happens to be the engine
behind [GitHub Pages](http://pages.github.com), which means you can use Jekyll
to host your project’s page, blog, or website from GitHub’s servers **for
diff --git a/site/docs/installation.md b/site/_docs/installation.md
similarity index 89%
rename from site/docs/installation.md
rename to site/_docs/installation.md
index 1435fdc..f0c091f 100644
--- a/site/docs/installation.md
+++ b/site/_docs/installation.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Installation
-prev_section: quickstart
-next_section: usage
permalink: /docs/installation/
---
@@ -13,14 +11,16 @@ describing the issue you encountered and how we might make the process easier.
### Requirements
-Installing Jekyll is easy and straight-forward, but there are a few requirements
-you’ll need to make sure your system has before you start.
+Installing Jekyll is easy and straight-forward, but there are a few
+requirements you’ll need to make sure your system has before you start.
-- [Ruby](http://www.ruby-lang.org/en/downloads/)
+- [Ruby](http://www.ruby-lang.org/en/downloads/) (including development
+ headers, v1.9.3 or above for Jekyll 2 and v2 or above for Jekyll 3)
- [RubyGems](http://rubygems.org/pages/download)
- Linux, Unix, or Mac OS X
-- [NodeJS](http://nodejs.org), or another JavaScript runtime (for
- CoffeeScript support).
+- [NodeJS](http://nodejs.org), or another JavaScript runtime (Jekyll 2 and
+earlier, for CoffeeScript support).
+- [Python 2.7](https://www.python.org/downloads/) (for Jekyll 2 and earlier)
<div class="note info">
<h5>Running Jekyll on Windows</h5>
diff --git a/site/docs/migrations.md b/site/_docs/migrations.md
similarity index 87%
rename from site/docs/migrations.md
rename to site/_docs/migrations.md
index a080c6c..0544341 100644
--- a/site/docs/migrations.md
+++ b/site/_docs/migrations.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Blog migrations
-prev_section: assets
-next_section: templates
permalink: /docs/migrations/
---
diff --git a/site/docs/pages.md b/site/_docs/pages.md
similarity index 86%
rename from site/docs/pages.md
rename to site/_docs/pages.md
index e7b837f..fa76a9f 100644
--- a/site/docs/pages.md
+++ b/site/_docs/pages.md
@@ -1,14 +1,12 @@
---
layout: docs
title: Creating pages
-prev_section: drafts
-next_section: variables
permalink: /docs/pages/
---
-In addition to [writing posts](../posts/), another thing you may want to do with
-your Jekyll site is create static pages. By taking advantage of the way Jekyll
-copies files and directories, this is easy to do.
+In addition to [writing posts](../posts/), another thing you may want to do
+with your Jekyll site is create static pages. By taking advantage of the way
+Jekyll copies files and directories, this is easy to do.
## Homepage
@@ -33,8 +31,8 @@ Where you put HTML files for pages depends on how you want the pages to work.
There are two main ways of creating pages:
- Place named HTML files for each page in your site's root folder.
-- Create a folder in the site's root for each page, and place an index.html file
- in each page folder.
+- Create a folder in the site's root for each page, and place an index.html
+file in each page folder.
Both methods work fine (and can be used in conjunction with each other),
with the only real difference being the resulting URLs.
@@ -60,13 +58,13 @@ and associated URLs might look like:
### Named folders containing index HTML files
-There is nothing wrong with the above method, however some people like to keep
+There is nothing wrong with the above method. However, some people like to keep
their URLs free from things like filename extensions. To achieve clean URLs for
pages using Jekyll, you simply need to create a folder for each top-level page
you want, and then place an `index.html` file in each page’s folder. This way
-the page URL ends up being the folder name, and the web server will serve up the
-respective `index.html` file. Here's an example of what this structure might
-look like:
+the page URL ends up being the folder name, and the web server will serve up
+the respective `index.html` file. Here's an example of what this structure
+might look like:
{% highlight bash %}
.
diff --git a/site/docs/pagination.md b/site/_docs/pagination.md
similarity index 78%
rename from site/docs/pagination.md
rename to site/_docs/pagination.md
index b0efad9..2c0ae2b 100644
--- a/site/docs/pagination.md
+++ b/site/_docs/pagination.md
@@ -1,22 +1,22 @@
---
layout: docs
title: Pagination
-prev_section: permalinks
-next_section: plugins
permalink: /docs/pagination/
---
With many websites—especially blogs—it’s very common to break the main listing
of posts up into smaller lists and display them over multiple pages. Jekyll has
-pagination built-in, so you can automatically generate the appropriate files and
-folders you need for paginated listings.
+pagination built-in, so you can automatically generate the appropriate files
+and folders you need for paginated listings.
<div class="note info">
<h5>Pagination only works within HTML files</h5>
<p>
- Pagination does not work with Markdown or Textile files in your Jekyll site.
- It will only work when used within HTML files. Since you’ll likely be using
- this for the list of Posts, this shouldn’t be an issue.
+ Pagination does not work from within Markdown or Textile files from
+ your Jekyll site. Pagination works when called from within the HTML
+ file, named <code>index.html</code>, which optionally may reside in and
+ produce pagination from within a subdirectory, via the
+ <code>paginate_path</code> configuration value.
</p>
</div>
@@ -29,20 +29,29 @@ specifies how many items should be displayed per page:
paginate: 5
{% endhighlight %}
-The number should be the maximum number of Posts you’d like to be displayed per-
-page in the generated site.
+The number should be the maximum number of Posts you’d like to be displayed
+per-page in the generated site.
-You may also specify where the destination of the pagination pages:
+You may also specify the destination of the pagination pages:
{% highlight yaml %}
-paginate_path: "blog/page:num"
+paginate_path: "/blog/page:num/"
{% endhighlight %}
-This will read in `blog/index.html`, send it each pagination page in Liquid as `paginator`
-and write the output to `blog/page:num`, where `:num` is the pagination page number,
-starting with `2`. If a site has 12 posts and specifies `paginate: 5`, Jekyll will write
-`blog/index.html` with the first 5 posts, `blog/page2/index.html` with the next 5 posts
-and `blog/page3/index.html` with the last 2 posts into the destination directory.
+This will read in `blog/index.html`, send it each pagination page in Liquid as
+`paginator` and write the output to `blog/page:num/`, where `:num` is the
+pagination page number, starting with `2`. If a site has 12 posts and specifies
+`paginate: 5`, Jekyll will write `blog/index.html` with the first 5 posts, `blog/page2/index.html` with the next 5 posts
+and `blog/page3/index.html` with the last 2 posts into the destination
+directory.
+
+<div class="note warning">
+ <h5>Don't set a permalink</h5>
+ <p>
+ Setting a permalink in the front matter of your blog page will cause
+ pagination to break. Just omit the permalink.
+ </p>
+</div>
## Liquid Attributes Available
@@ -130,9 +139,9 @@ attributes:
## Render the paginated Posts
The next thing you need to do is to actually display your posts in a list using
-the `paginator` variable that will now be available to you. You’ll probably want
-to do this in one of the main pages of your site. Here’s one example of a simple
-way of rendering paginated Posts in a HTML file:
+the `paginator` variable that will now be available to you. You’ll probably
+want to do this in one of the main pages of your site. Here’s one example of a
+simple way of rendering paginated Posts in a HTML file:
{% highlight html %}
{% raw %}
@@ -155,13 +164,13 @@ title: My Blog
<!-- Pagination links -->
<div class="pagination">
{% if paginator.previous_page %}
- <a href="/page{{ paginator.previous_page }}" class="previous">Previous</a>
+ <a href="{{ paginator.previous_page_path }}" class="previous">Previous</a>
{% else %}
<span class="previous">Previous</span>
{% endif %}
<span class="page_number ">Page: {{ paginator.page }} of {{ paginator.total_pages }}</span>
{% if paginator.next_page %}
- <a href="/page{{ paginator.next_page }}" class="next">Next</a>
+ <a href="{{ paginator.next_page_path }}" class="next">Next</a>
{% else %}
<span class="next ">Next</span>
{% endif %}
@@ -195,7 +204,7 @@ page with links to all but the current page.
{% if page == paginator.page %}
<em>{{ page }}</em>
{% elsif page == 1 %}
- <a href="{{ '/index.html' | prepend: site.baseurl | replace: '//', '/' }}">{{ page }}</a>
+ <a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">{{ page }}</a>
{% else %}
<a href="{{ site.paginate_path | prepend: site.baseurl | replace: '//', '/' | replace: ':num', page }}">{{ page }}</a>
{% endif %}
diff --git a/site/_docs/permalinks.md b/site/_docs/permalinks.md
new file mode 100644
index 0000000..5aa0449
--- /dev/null
+++ b/site/_docs/permalinks.md
@@ -0,0 +1,307 @@
+---
+layout: docs
+title: Permalinks
+permalink: /docs/permalinks/
+---
+
+Jekyll supports a flexible way to build your site’s URLs. You can specify the
+permalinks for your site through the [Configuration](../configuration/) or in
+the [YAML Front Matter](../frontmatter/) for each post. You’re free to choose
+one of the built-in styles to create your links or craft your own. The default
+style is `date`.
+
+Permalinks are constructed by creating a template URL where dynamic elements
+are represented by colon-prefixed keywords. For example, the default `date`
+permalink is defined according to the format `/:categories/:year/:month/:day/:title.html`.
+
+## Template variables
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Variable</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p><code>year</code></p>
+ </td>
+ <td>
+ <p>Year from the Post’s filename</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>month</code></p>
+ </td>
+ <td>
+ <p>Month from the Post’s filename</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>i_month</code></p>
+ </td>
+ <td>
+ <p>Month from the Post’s filename without leading zeros.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>day</code></p>
+ </td>
+ <td>
+ <p>Day from the Post’s filename</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>i_day</code></p>
+ </td>
+ <td>
+ <p>Day from the Post’s filename without leading zeros.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>short_year</code></p>
+ </td>
+ <td>
+ <p>Year from the Post’s filename without the century.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>hour</code></p>
+ </td>
+ <td>
+ <p>
+ Hour of the day, 24-hour clock, zero-padded from the Post’s filename. (00..23)
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>minute</code></p>
+ </td>
+ <td>
+ <p>
+ Minute of the hour from the Post’s filename. (00..59)
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>second</code></p>
+ </td>
+ <td>
+ <p>
+ Second of the minute from the Post’s filename. (00..60)
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>title</code></p>
+ </td>
+ <td>
+ <p>
+ Title from the document’s filename. May be overridden via
+ the document’s <code>slug</code> YAML front matter.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>slug</code></p>
+ </td>
+ <td>
+ <p>
+ Slugified title from the document’s filename ( any character
+ except numbers and letters is replaced as hyphen ). May be
+ overridden via the document’s <code>slug</code> YAML front matter.
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>categories</code></p>
+ </td>
+ <td>
+ <p>
+ The specified categories for this Post. If a post has multiple
+ categories, Jekyll will create a hierarchy (e.g. <code>/category1/category2</code>).
+ Also Jekyll automatically parses out double slashes in the URLs,
+ so if no categories are present, it will ignore this.
+ </p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+## Built-in permalink styles
+
+While you can specify a custom permalink style using [template variables](#template-variables),
+Jekyll also provides the following built-in styles for convenience.
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Permalink Style</th>
+ <th>URL Template</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p><code>date</code></p>
+ </td>
+ <td>
+ <p><code>/:categories/:year/:month/:day/:title.html</code></p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>pretty</code></p>
+ </td>
+ <td>
+ <p><code>/:categories/:year/:month/:day/:title/</code></p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>ordinal</code></p>
+ </td>
+ <td>
+ <p><code>/:categories/:year/:y_day/:title.html</code></p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>none</code></p>
+ </td>
+ <td>
+ <p><code>/:categories/:title.html</code></p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+## Pages and collections
+
+The `permalink` configuration setting specifies the permalink style used for
+posts. Pages and collections each have their own default permalink style; the
+default style for pages is `/:path/:basename` and the default for collections is
+`/:collection/:path`.
+
+These styles are modified to match the suffix style specified in the post
+permalink setting. For example, a permalink style of `pretty`, which contains a
+trailing slash, will update page permalinks to also contain a trailing slash:
+`/:path/:basename/`. A permalink style of `date`, which contains a trailing
+file extension, will update page permalinks to also contain a file extension:
+`/:path/:basename:output_ext`. The same is true for any custom permalink style.
+
+The permalink for an individual page or collection document can always be
+overridden in the [YAML Front Matter](../frontmatter/) for the page or document.
+Additionally, permalinks for a given collection can be customized [in the
+collections configuration](../collections/).
+
+## Permalink style examples
+
+Given a post named: `/2009-04-29-slap-chop.md`
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>URL Template</th>
+ <th>Resulting Permalink URL</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p>None specified, or <code>permalink: date</code></p>
+ </td>
+ <td>
+ <p><code>/2009/04/29/slap-chop.html</code></p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>pretty</code></p>
+ </td>
+ <td>
+ <p><code>/2009/04/29/slap-chop/</code></p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>/:month-:day-:year/:title.html</code></p>
+ </td>
+ <td>
+ <p><code>/04-29-2009/slap-chop.html</code></p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>/blog/:year/:month/:day/:title/</code></p>
+ </td>
+ <td>
+ <p><code>/blog/2009/04/29/slap-chop/</code></p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>/:year/:month/:title</code></p>
+ <p>See <a href="#extensionless-permalinks">extensionless permalinks</a> for details.</p>
+ </td>
+ <td>
+ <p><code>/2009/04/slap-chop</code></p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+## Extensionless permalinks
+
+Jekyll supports permalinks that contain neither a trailing slash nor a file
+extension, but this requires additional support from the web server to properly
+serve. When using extensionless permalinks, output files written to disk will
+still have the proper file extension (typically `.html`), so the web server
+must be able to map requests without file extensions to these files.
+
+Both [GitHub Pages](../github-pages/) and the Jekyll's built-in WEBrick server
+handle these requests properly without any additional work.
+
+### Apache
+
+The Apache web server has very extensive support for content negotiation and can
+handle extensionless URLs by setting the [multiviews][] option in your
+`httpd.conf` or `.htaccess` file:
+
+[multiviews]: https://httpd.apache.org/docs/current/content-negotiation.html#multiviews
+
+{% highlight apache %}
+Options +MultiViews
+{% endhighlight %}
+
+### Nginx
+
+The [try_files][] directive allows you to specify a list of files to search for
+to process a request. The following configuration will instruct nginx to search
+for a file with an `.html` extension if an exact match for the requested URI is
+not found.
+
+[try_files]: http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
+
+{% highlight nginx %}
+try_files $uri $uri.html $uri/ =404;
+{% endhighlight %}
diff --git a/site/docs/plugins.md b/site/_docs/plugins.md
similarity index 65%
rename from site/docs/plugins.md
rename to site/_docs/plugins.md
index b9ab4bb..7cd7c3f 100644
--- a/site/docs/plugins.md
+++ b/site/_docs/plugins.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Plugins
-prev_section: pagination
-next_section: extras
permalink: /docs/plugins/
---
@@ -13,8 +11,8 @@ having to modify the Jekyll source itself.
<div class="note info">
<h5>Plugins on GitHub Pages</h5>
<p>
- <a href="http://pages.github.com/">GitHub Pages</a> is powered by Jekyll,
- however all Pages sites are generated using the <code>--safe</code> option
+ <a href="http://pages.github.com/">GitHub Pages</a> is powered by Jekyll.
+ However, all Pages sites are generated using the <code>--safe</code> option
to disable custom plugins for security reasons. Unfortunately, this means
your plugins won’t work if you’re deploying to GitHub Pages.<br><br>
You can still use GitHub Pages to publish your site, but you’ll need to
@@ -25,33 +23,49 @@ having to modify the Jekyll source itself.
## Installing a plugin
-You have 2 options for installing plugins:
+You have 3 options for installing plugins:
+
+1. In your site source root, make a `_plugins` directory. Place your plugins
+here. Any file ending in `*.rb` inside this directory will be loaded before
+Jekyll generates your site.
+2. In your `_config.yml` file, add a new array with the key `gems` and the
+values of the gem names of the plugins you'd like to use. An example:
-1. In your site source root, make a `_plugins` directory. Place your plugins here.
- Any file ending in `*.rb` inside this directory will be loaded before Jekyll
- generates your site.
-2. In your `_config.yml` file, add a new array with the key `gems` and the values
- of the gem names of the plugins you'd like to use. An example:
gems: [jekyll-test-plugin, jekyll-jsonify, jekyll-assets]
# This will require each of these gems automatically.
+ Then install your plugins using `gem install jekyll-test-plugin jekyll-jsonify jekyll-assets`
+
+3. Add the relevant plugins to a Bundler group in your `Gemfile`. An
+ example:
+
+ group :jekyll_plugins do
+ gem "my-jekyll-plugin"
+ gem "another-jekyll-plugin"
+ end
+
+ Now you need to install all plugins from your Bundler group by running single command `bundle install`
+
+
<div class="note info">
<h5>
- <code>_plugins</code> and <code>gems</code>
+ <code>_plugins</code>, <code>_config.yml</code> and <code>Gemfile</code>
can be used simultaneously
</h5>
<p>
- You may use both of the aforementioned plugin options simultaneously in the
- same site if you so choose. Use of one does not restrict the use of the other
+ You may use any of the aforementioned plugin options simultaneously in the
+ same site if you so choose. Use of one does not restrict the use of the
+ others.
</p>
</div>
-In general, plugins you make will fall into one of three categories:
+In general, plugins you make will fall into one of four categories:
-1. Generators
-2. Converters
-3. Tags
+1. [Generators](#generators)
+2. [Converters](#converters)
+3. [Commands](#commands)
+4. [Tags](#tags)
## Generators
@@ -60,14 +74,11 @@ based on your own rules.
A generator is a subclass of `Jekyll::Generator` that defines a `generate`
method, which receives an instance of
-[`Jekyll::Site`]({{ site.repository }}/blob/master/lib/jekyll/site.rb).
-
-Generation is triggered for its side-effects, the return value of `generate` is
-ignored. Jekyll does not assume any particular side-effect to happen, it just
-runs the method.
+[`Jekyll::Site`]({{ site.repository }}/blob/master/lib/jekyll/site.rb). The
+return value of `generate` is ignored.
Generators run after Jekyll has made an inventory of the existing content, and
-before the site is generated. Pages with YAML front-matters are stored as
+before the site is generated. Pages with YAML Front Matters are stored as
instances of
[`Jekyll::Page`]({{ site.repository }}/blob/master/lib/jekyll/page.rb)
and are available via `site.pages`. Static files become instances of
@@ -122,7 +133,7 @@ module Jekyll
def generate(site)
if site.layouts.key? 'category_index'
dir = site.config['category_dir'] || 'categories'
- site.categories.keys.each do |category|
+ site.categories.each_key do |category|
site.pages << CategoryPage.new(site, site.source, File.join(dir, category), category)
end
end
@@ -162,11 +173,12 @@ Generators are only required to implement one method:
## Converters
If you have a new markup language you’d like to use with your site, you can
-include it by implementing your own converter. Both the Markdown and Textile
-markup languages are implemented using this method.
+include it by implementing your own converter. Both the Markdown and
+[Textile](https://github.com/jekyll/jekyll-textile-converter) markup
+languages are implemented using this method.
<div class="note info">
- <h5>Remember your YAML front-matter</h5>
+ <h5>Remember your YAML Front Matter</h5>
<p>
Jekyll will only convert files that have a YAML header at the top, even for
converters you add using a plugin.
@@ -234,7 +246,7 @@ Converters should implement at a minimum 3 methods:
</td>
<td><p>
Logic to do the content conversion. Takes one argument: the raw content
- of the file (without YAML front matter). Must return a String.
+ of the file (without YAML Front Matter). Must return a String.
</p></td>
</tr>
</tbody>
@@ -247,6 +259,67 @@ In our example, `UpcaseConverter#matches` checks if our filename extension is
simply uppercasing the entire content string. Finally, when it saves the page,
it will do so with a `.html` extension.
+## Commands
+
+As of version 2.5.0, Jekyll can be extended with plugins which provide
+subcommands for the `jekyll` executable. This is possible by including the
+relevant plugins in a `Gemfile` group called `:jekyll_plugins`:
+
+{% highlight ruby %}
+group :jekyll_plugins do
+ gem "my_fancy_jekyll_plugin"
+end
+{% endhighlight %}
+
+Each `Command` must be a subclass of the `Jekyll::Command` class and must
+contain one class method: `init_with_program`. An example:
+
+{% highlight ruby %}
+class MyNewCommand < Jekyll::Command
+ class << self
+ def init_with_program(prog)
+ prog.command(:new) do |c|
+ c.syntax "new [options]"
+ c.description 'Create a new Jekyll site.'
+
+ c.option 'dest', '-d DEST', 'Where the site should go.'
+
+ c.action do |args, options|
+ Jekyll::Site.new_site_at(options['dest'])
+ end
+ end
+ end
+ end
+end
+{% endhighlight %}
+
+Commands should implement this single class method:
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Method</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p><code>init_with_program</code></p>
+ </td>
+ <td><p>
+ This method accepts one parameter, the
+ <code><a href="http://github.com/jekyll/mercenary#readme">Mercenary::Program</a></code>
+ instance, which is the Jekyll program itself. Upon the program,
+ commands may be created using the above syntax. For more details,
+ visit the Mercenary repository on GitHub.com.
+ </p></td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
## Tags
If you’d like to include custom liquid tags in your site, you can do so by
@@ -319,10 +392,10 @@ And we would get something like this on the page:
### Liquid filters
-You can add your own filters to the Liquid template system much like you can add
-tags above. Filters are simply modules that export their methods to liquid. All
-methods will have to take at least one parameter which represents the input of
-the filter. The return value will be the output of the filter.
+You can add your own filters to the Liquid template system much like you can
+add tags above. Filters are simply modules that export their methods to liquid.
+All methods will have to take at least one parameter which represents the input
+of the filter. The return value will be the output of the filter.
{% highlight ruby %}
module Jekyll
@@ -369,7 +442,7 @@ There are two flags to be aware of when writing a plugin:
executed in an environment where arbitrary code execution is not
allowed. This is used by GitHub Pages to determine which core plugins
may be used, and which are unsafe to run. If your plugin does not
- allow for arbitrary code, execution, set this to <code>true</code>.
+ allow for arbitrary code execution, set this to <code>true</code>.
GitHub Pages still won’t load your plugin, but if you submit it for
inclusion in core, it’s best for this to be correct!
</p>
@@ -405,6 +478,234 @@ module Jekyll
end
{% endhighlight %}
+## Hooks
+
+Using hooks, your plugin can exercise fine-grained control over various aspects
+of the build process. If your plugin defines any hooks, Jekyll will call them
+at pre-defined points.
+
+Hooks are registered to a container and an event name. To register one, you
+call Jekyll::Hooks.register, and pass the container, event name, and code to
+call whenever the hook is triggered. For example, if you want to execute some
+custom functionality every time Jekyll renders a post, you could register a
+hook like this:
+
+{% highlight ruby %}
+Jekyll::Hooks.register :posts, :post_render do |post|
+ # code to call after Jekyll renders a post
+end
+{% endhighlight %}
+
+Jekyll provides hooks for <code>:site</code>, <code>:pages</code>,
+<code>:posts</code>, and <code>:documents</code>. In all cases, Jekyll calls your
+hooks with the container object as the first callback parameter. But in the
+case of <code>:pre_render</code>, your hook will also receive a payload hash as
+a second parameter which allows you full control over the variables that are
+available while rendering.
+
+The complete list of available hooks is below:
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Container</th>
+ <th>Event</th>
+ <th>Called</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>
+ <p><code>:site</code></p>
+ </td>
+ <td>
+ <p><code>:after_reset</code></p>
+ </td>
+ <td>
+ <p>Just after site reset</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:site</code></p>
+ </td>
+ <td>
+ <p><code>:post_read</code></p>
+ </td>
+ <td>
+ <p>After site data has been read and loaded from disk</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:site</code></p>
+ </td>
+ <td>
+ <p><code>:pre_render</code></p>
+ </td>
+ <td>
+ <p>Just before rendering the whole site</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:site</code></p>
+ </td>
+ <td>
+ <p><code>:post_render</code></p>
+ </td>
+ <td>
+ <p>After rendering the whole site, but before writing any files</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:site</code></p>
+ </td>
+ <td>
+ <p><code>:post_write</code></p>
+ </td>
+ <td>
+ <p>After writing the whole site to disk</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:pages</code></p>
+ </td>
+ <td>
+ <p><code>:post_init</code></p>
+ </td>
+ <td>
+ <p>Whenever a page is initialized</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:pages</code></p>
+ </td>
+ <td>
+ <p><code>:pre_render</code></p>
+ </td>
+ <td>
+ <p>Just before rendering a page</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:pages</code></p>
+ </td>
+ <td>
+ <p><code>:post_render</code></p>
+ </td>
+ <td>
+ <p>After rendering a page, but before writing it to disk</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:pages</code></p>
+ </td>
+ <td>
+ <p><code>:post_write</code></p>
+ </td>
+ <td>
+ <p>After writing a page to disk</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:posts</code></p>
+ </td>
+ <td>
+ <p><code>:post_init</code></p>
+ </td>
+ <td>
+ <p>Whenever a post is initialized</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:posts</code></p>
+ </td>
+ <td>
+ <p><code>:pre_render</code></p>
+ </td>
+ <td>
+ <p>Just before rendering a post</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:posts</code></p>
+ </td>
+ <td>
+ <p><code>:post_render</code></p>
+ </td>
+ <td>
+ <p>After rendering a post, but before writing it to disk</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:posts</code></p>
+ </td>
+ <td>
+ <p><code>:post_write</code></p>
+ </td>
+ <td>
+ <p>After writing a post to disk</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:documents</code></p>
+ </td>
+ <td>
+ <p><code>:post_init</code></p>
+ </td>
+ <td>
+ <p>Whenever a document is initialized</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:documents</code></p>
+ </td>
+ <td>
+ <p><code>:pre_render</code></p>
+ </td>
+ <td>
+ <p>Just before rendering a document</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:documents</code></p>
+ </td>
+ <td>
+ <p><code>:post_render</code></p>
+ </td>
+ <td>
+ <p>After rendering a document, but before writing it to disk</p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p><code>:documents</code></p>
+ </td>
+ <td>
+ <p><code>:post_write</code></p>
+ </td>
+ <td>
+ <p>After writing a document to disk</p>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
## Available Plugins
You can find a few useful plugins at the following locations:
@@ -412,13 +713,13 @@ You can find a few useful plugins at the following locations:
#### Generators
- [ArchiveGenerator by Ilkka Laukkanen](https://gist.github.com/707909): Uses [this archive page](https://gist.github.com/707020) to generate archives.
-- [LESS.js Generator by Andy Fowler](https://gist.github.com/642739): Renders LESS.js files during generation.
+- [LESS.js Generator by Andy Fowler](https://gist.github.com/642739): Renders
+LESS.js files during generation.
- [Version Reporter by Blake Smith](https://gist.github.com/449491): Creates a version.html file containing the Jekyll version.
- [Sitemap.xml Generator by Michael Levin](https://github.com/kinnetica/jekyll-plugins): Generates a sitemap.xml file by traversing all of the available posts and pages.
- [Full-text search by Pascal Widdershoven](https://github.com/PascalW/jekyll_indextank): Adds full-text search to your Jekyll site with a plugin and a bit of JavaScript.
- [AliasGenerator by Thomas Mango](https://github.com/tsmango/jekyll_alias_generator): Generates redirect pages for posts when an alias is specified in the YAML Front Matter.
- [Pageless Redirect Generator by Nick Quinlan](https://github.com/nquinlan/jekyll-pageless-redirects): Generates redirects based on files in the Jekyll root, with support for htaccess style redirects.
-- [Projectlist by Frederic Hemberger](https://github.com/fhemberger/jekyll-projectlist): Renders files in a directory as a single page instead of separate posts.
- [RssGenerator by Assaf Gelber](https://github.com/agelber/jekyll-rss): Automatically creates an RSS 2.0 feed from your posts.
- [Monthly archive generator by Shigeya Suzuki](https://github.com/shigeya/jekyll-monthly-archive-plugin): Generator and template which renders monthly archive like MovableType style, based on the work by Ilkka Laukkanen and others above.
- [Category archive generator by Shigeya Suzuki](https://github.com/shigeya/jekyll-category-archive-plugin): Generator and template which renders category archive like MovableType style, based on Monthly archive generator.
@@ -427,11 +728,19 @@ You can find a few useful plugins at the following locations:
- [Pages Directory by Ben Baker-Smith](https://github.com/bbakersmith/jekyll-pages-directory): Defines a `_pages` directory for page files which routes its output relative to the project root.
- [Page Collections by Jeff Kolesky](https://github.com/jeffkole/jekyll-page-collections): Generates collections of pages with functionality that resembles posts.
- [Windows 8.1 Live Tile Generation by Matt Sheehan](https://github.com/sheehamj13/jekyll-live-tiles): Generates Internet Explorer 11 config.xml file and Tile Templates for pinning your site to Windows 8.1.
+- [Typescript Generator by Matt Sheehan](https://github.com/sheehamj13/jekyll_ts): Generate Javascript on build from your Typescript.
- [Jekyll::AutolinkEmail by Ivan Tse](https://github.com/ivantsepp/jekyll-autolink_email): Autolink your emails.
- [Jekyll::GitMetadata by Ivan Tse](https://github.com/ivantsepp/jekyll-git_metadata): Expose Git metadata for your templates.
+- [Jekyll Http Basic Auth Plugin](https://gist.github.com/snrbrnjna/422a4b7e017192c284b3): Plugin to manage http basic auth for jekyll generated pages and directories.
+- [Jekyll Auto Image by Merlos](https://github.com/merlos/jekyll-auto-image): Gets the first image of a post. Useful to list your posts with images or to add [twitter cards](https://dev.twitter.com/cards/overview) to your site.
+- [Jekyll Portfolio Generator by Shannon Babincsak](https://github.com/codeinpink/jekyll-portfolio-generator): Generates project pages and computes related projects out of project data files.
+- [Jekyll-Umlauts by Arne Gockeln](https://github.com/webchef/jekyll-umlauts): This generator replaces all german umlauts (äöüß) case sensitive with html.
+- [Jekyll Flickr Plugin](https://github.com/lawmurray/indii-jekyll-flickr) by [Lawrence Murray](http://www.indii.org): Generates posts for photos uploaded to a Flickr photostream.
#### Converters
+- [Textile converter](https://github.com/jekyll/jekyll-textile-converter): Convert `.textile` files into HTML. Also includes the `textilize` Liquid filter.
+- [Slim plugin](https://github.com/slim-template/jekyll-slim): Slim converter and includes for Jekyll with support for Liquid tags.
- [Jade plugin by John Papandriopoulos](https://github.com/snappylabs/jade-jekyll-plugin): Jade converter for Jekyll.
- [HAML plugin by Sam Z](https://gist.github.com/517556): HAML converter for Jekyll.
- [HAML-Sass Converter by Adam Pearson](https://gist.github.com/481456): Simple HAML-Sass converter for Jekyll. [Fork](https://gist.github.com/528642) by Sam X.
@@ -448,24 +757,29 @@ You can find a few useful plugins at the following locations:
- [Transform Layouts](https://gist.github.com/1472645): Allows HAML layouts (you need a HAML Converter plugin for this to work).
- [Org-mode Converter](https://gist.github.com/abhiyerra/7377603): Org-mode converter for Jekyll.
- [Customized Kramdown Converter](https://github.com/mvdbos/kramdown-with-pygments): Enable Pygments syntax highlighting for Kramdown-parsed fenced code blocks.
+- [Bigfootnotes Plugin](https://github.com/TheFox/jekyll-bigfootnotes): Enables big footnotes for Kramdown.
+- [AsciiDoc Plugin](https://github.com/asciidoctor/jekyll-asciidoc): AsciiDoc convertor for Jekyll using [Asciidoctor](http://asciidoctor.org/).
+- [Lazy Tweet Embedding](https://github.com/takuti/jekyll-lazy-tweet-embedding): Automatically convert tweet urls into twitter cards.
#### Filters
- [Truncate HTML](https://github.com/MattHall/truncatehtml) by [Matt Hall](http://codebeef.com): A Jekyll filter that truncates HTML while preserving markup structure.
- [Domain Name Filter by Lawrence Woodman](https://github.com/LawrenceWoodman/domain_name-liquid_filter): Filters the input text so that just the domain name is left.
- [Summarize Filter by Mathieu Arnold](https://gist.github.com/731597): Remove markup after a `<div id="extended">` tag.
-- [URL encoding by James An](https://gist.github.com/919275): Percent encoding for URIs.
-- [JSON Filter](https://gist.github.com/1850654) by [joelverhagen](https://github.com/joelverhagen): Filter that takes input text and outputs it as JSON. Great for rendering JavaScript.
- [i18n_filter](https://github.com/gacha/gacha.id.lv/blob/master/_plugins/i18n_filter.rb): Liquid filter to use I18n localization.
- [Smilify](https://github.com/SaswatPadhi/jekyll_smilify) by [SaswatPadhi](https://github.com/SaswatPadhi): Convert text emoticons in your content to themeable smiley pics.
- [Read in X Minutes](https://gist.github.com/zachleat/5792681) by [zachleat](https://github.com/zachleat): Estimates the reading time of a string (for blog post content).
- [Jekyll-timeago](https://github.com/markets/jekyll-timeago): Converts a time value to the time ago in words.
-- [pluralize](https://github.com/bdesham/pluralize): Easily combine a number and a word into a gramatically-correct amount like “1 minute” or “2 minute**s**”.
+- [pluralize](https://github.com/bdesham/pluralize): Easily combine a number and a word into a grammatically-correct amount like “1 minute” or “2 minute**s**”.
- [reading_time](https://github.com/bdesham/reading_time): Count words and estimate reading time for a piece of text, ignoring HTML elements that are unlikely to contain running text.
- [Table of Content Generator](https://github.com/dafi/jekyll-toc-generator): Generate the HTML code containing a table of content (TOC), the TOC can be customized in many way, for example you can decide which pages can be without TOC.
- [jekyll-humanize](https://github.com/23maverick23/jekyll-humanize): This is a port of the Django app humanize which adds a "human touch" to data. Each method represents a Fluid type filter that can be used in your Jekyll site templates. Given that Jekyll produces static sites, some of the original methods do not make logical sense to port (e.g. naturaltime).
- [Jekyll-Ordinal](https://github.com/PatrickC8t/Jekyll-Ordinal): Jekyll liquid filter to output a date ordinal such as "st", "nd", "rd", or "th".
- [Deprecated articles keeper](https://github.com/kzykbys/JekyllPlugins) by [Kazuya Kobayashi](http://blog.kazuya.co/): A simple Jekyll filter which monitor how old an article is.
+- [Jekyll-jalali](https://github.com/mehdisadeghi/jekyll-jalali) by [Mehdi Sadeghi](http://mehdix.ir): A simple Gregorian to Jalali date converter filter.
+- [Jekyll Thumbnail Filter](https://github.com/matallo/jekyll-thumbnail-filter): Related posts thumbnail filter.
+- [Jekyll-Smartify](https://github.com/pathawks/jekyll-smartify): SmartyPants filter. Make "quotes" “curly”
+- [liquid-md5](https://github.com/pathawks/liquid-md5): Returns an MD5 hash. Helpful for generating Gravatars in templates.
#### Tags
@@ -478,12 +792,12 @@ You can find a few useful plugins at the following locations:
- [Non-JS Gist Tag by Brandon Tilley](https://gist.github.com/1027674) A Liquid tag that embeds Gists and shows code for non-JavaScript enabled browsers and readers.
- [Render Time Tag by Blake Smith](https://gist.github.com/449509): Displays the time a Jekyll page was generated.
- [Status.net/OStatus Tag by phaer](https://gist.github.com/912466): Displays the notices in a given status.net/ostatus feed.
-- [Raw Tag by phaer](https://gist.github.com/1020852): Keeps liquid from parsing text betweeen `raw` tags.
- [Embed.ly client by Robert Böhnke](https://github.com/robb/jekyll-embedly-client): Autogenerate embeds from URLs using oEmbed.
- [Logarithmic Tag Cloud](https://gist.github.com/2290195): Flexible. Logarithmic distribution. Documentation inline.
- [oEmbed Tag by Tammo van Lessen](https://gist.github.com/1455726): Enables easy content embedding (e.g. from YouTube, Flickr, Slideshare) via oEmbed.
- [FlickrSetTag by Thomas Mango](https://github.com/tsmango/jekyll_flickr_set_tag): Generates image galleries from Flickr sets.
- [Tweet Tag by Scott W. Bradley](https://github.com/scottwb/jekyll-tweet-tag): Liquid tag for [Embedded Tweets](https://dev.twitter.com/docs/embedded-tweets) using Twitter’s shortcodes.
+- [Jekyll Twitter Plugin](https://github.com/rob-murray/jekyll-twitter-plugin): A Liquid tag plugin that renders Tweets from Twitter API. Currently supports the [oEmbed](https://dev.twitter.com/rest/reference/get/statuses/oembed) API.
- [Jekyll-contentblocks](https://github.com/rustygeldmacher/jekyll-contentblocks): Lets you use Rails-like content_for tags in your templates, for passing content from your posts up to your layouts.
- [Generate YouTube Embed](https://gist.github.com/1805814) by [joelverhagen](https://github.com/joelverhagen): Jekyll plugin which allows you to embed a YouTube video in your page with the YouTube ID. Optionally specify width and height dimensions. Like “oEmbed Tag” but just for YouTube.
- [Jekyll-beastiepress](https://github.com/okeeblow/jekyll-beastiepress): FreeBSD utility tags for Jekyll sites.
@@ -492,15 +806,14 @@ You can find a few useful plugins at the following locations:
- [Jekyll-citation](https://github.com/archome/jekyll-citation): Render BibTeX-formatted bibliographies/citations included in posts and pages (pure Ruby).
- [Jekyll Dribbble Set Tag](https://github.com/ericdfields/Jekyll-Dribbble-Set-Tag): Builds Dribbble image galleries from any user.
- [Debbugs](https://gist.github.com/2218470): Allows posting links to Debian BTS easily.
-- [Refheap_tag](https://github.com/aburdette/refheap_tag): Liquid tag that allows embedding pastes from [refheap](https://refheap.com).
+- [Refheap_tag](https://github.com/aburdette/refheap_tag): Liquid tag that allows embedding pastes from [refheap](https://www.refheap.com/).
- [Jekyll-devonly_tag](https://gist.github.com/2403522): A block tag for including markup only during development.
- [JekyllGalleryTag](https://github.com/redwallhp/JekyllGalleryTag) by [redwallhp](https://github.com/redwallhp): Generates thumbnails from a directory of images and displays them in a grid.
- [Youku and Tudou Embed](https://gist.github.com/Yexiaoxing/5891929): Liquid plugin for embedding Youku and Tudou videos.
- [Jekyll-swfobject](https://github.com/sectore/jekyll-swfobject): Liquid plugin for embedding Adobe Flash files (.swf) using [SWFObject](http://code.google.com/p/swfobject/).
-- [Jekyll Picture Tag](https://github.com/robwierzbowski/jekyll-picture-tag): Easy responsive images for Jekyll. Based on the proposed [`<picture>`](http://picture.responsiveimages.org/) element, polyfilled with Scott Jehl’s [Picturefill](https://github.com/scottjehl/picturefill).
+- [Jekyll Picture Tag](https://github.com/robwierzbowski/jekyll-picture-tag): Easy responsive images for Jekyll. Based on the proposed [`<picture>`](https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element) element, polyfilled with Scott Jehl’s [Picturefill](https://github.com/scottjehl/picturefill).
- [Jekyll Image Tag](https://github.com/robwierzbowski/jekyll-image-tag): Better images for Jekyll. Save image presets, generate resized images, and add classes, alt text, and other attributes.
- [Ditaa Tag](https://github.com/matze/jekyll-ditaa) by [matze](https://github.com/matze): Renders ASCII diagram art into PNG images and inserts a figure tag.
-- [Good Include](https://github.com/penibelst/jekyll-good-include) by [Anatol Broder](http://penibelst.de/): Strips newlines and whitespaces from the end of include files before processing.
- [Jekyll Suggested Tweet](https://github.com/davidensinger/jekyll-suggested-tweet) by [David Ensinger](https://github.com/davidensinger/): A Liquid tag for Jekyll that allows for the embedding of suggested tweets via Twitter’s Web Intents API.
- [Jekyll Date Chart](https://github.com/GSI/jekyll_date_chart) by [GSI](https://github.com/GSI): Block that renders date line charts based on textile-formatted tables.
- [Jekyll Image Encode](https://github.com/GSI/jekyll_image_encode) by [GSI](https://github.com/GSI): Tag that renders base64 codes of images fetched from the web.
@@ -512,16 +825,28 @@ You can find a few useful plugins at the following locations:
- [Jekyll Github Sample Tag](https://github.com/bwillis/jekyll-github-sample): A liquid tag to include a sample of a github repo file in your Jekyll site.
- [Jekyll Project Version Tag](https://github.com/rob-murray/jekyll-version-plugin): A Liquid tag plugin that renders a version identifier for your Jekyll site sourced from the git repository containing your code.
- [Piwigo Gallery](https://github.com/AlessandroLorenzi/piwigo_gallery) by [Alessandro Lorenzi](http://www.alorenzi.eu/): Jekyll plugin to generate thumbnails from a Piwigo gallery and display them with a Liquid tag
+- [mathml.rb](https://github.com/tmthrgd/jekyll-plugins) by Tom Thorogood: A plugin to convert TeX mathematics into MathML for display.
+- [webmention_io.rb](https://github.com/aarongustafson/jekyll-webmention_io) by [Aaron Gustafson](http://aaron-gustafson.com/): A plugin to enable [webmention](http://indiewebcamp.com/webmention) integration using [Webmention.io](http://webmention.io). Includes an optional JavaScript for updating webmentions automatically between publishes and, if available, in realtime using WebSockets.
+- [Jekyll 500px Embed](https://github.com/lkorth/jekyll-500px-embed) by Luke Korth. A Liquid tag plugin that embeds [500px](https://500px.com/) photos.
+- [inline\_highlight](https://github.com/bdesham/inline_highlight): A tag for inline syntax highlighting.
+- [jekyll-mermaid](https://github.com/jasonbellamy/jekyll-mermaid): Simplify the creation of mermaid diagrams and flowcharts in your posts and pages.
+- [twa](https://github.com/Ezmyrelda/twa): Twemoji Awesome plugin for Jekyll. Liquid tag allowing you to use twitter emoji in your jekyll pages.
+- [jekyll-files](https://github.com/x43x61x69/jekyll-files) by [Zhi-Wei Cai](http://vox.vg/): Output relative path strings and other info regarding specific assets.
+- [Fetch remote file content](https://github.com/dimitri-koenig/jekyll-plugins) by [Dimitri König](https://www.dimitrikoenig.net/): Using `remote_file_content` tag you can fetch the content of a remote file and include it as if you would put the content right into your markdown file yourself. Very useful for including code from github repo's to always have a current repo version.
+- [jekyll-asciinema](https://github.com/mnuessler/jekyll-asciinema): A tag for embedding asciicasts recorded with [asciinema](https://asciinema.org) in your Jekyll pages.
+- [Jekyll-Youtube](https://github.com/dommmel/jekyll-youtube) A Liquid tag that embeds Youtube videos. The default emded markup is responsive but you can also specify your own by using an include/partial.
+- [Jekyll Flickr Plugin](https://github.com/lawmurray/indii-jekyll-flickr) by [Lawrence Murray](http://www.indii.org): Embeds Flickr photosets (albums) as a gallery of thumbnails, with lightbox links to larger images.
#### Collections
-- [Jekyll Plugins by Recursive Design](http://recursive-design.com/projects/jekyll-plugins/): Plugins to generate Project pages from GitHub readmes, a Category page, and a Sitemap generator.
+- [Jekyll Plugins by Recursive Design](https://github.com/recurser/jekyll-plugins): Plugins to generate Project pages from GitHub readmes, a Category page, and a Sitemap generator.
- [Company website and blog plugins](https://github.com/flatterline/jekyll-plugins) by Flatterline, a [Ruby on Rails development company](http://flatterline.com/): Portfolio/project page generator, team/individual page generator, an author bio liquid tag for use on posts, and a few other smaller plugins.
- [Jekyll plugins by Aucor](https://github.com/aucor/jekyll-plugins): Plugins for trimming unwanted newlines/whitespace and sorting pages by weight attribute.
#### Other
+- [ditaa-ditaa](https://github.com/tmthrgd/ditaa-ditaa) by Tom Thorogood: a drastic revision of jekyll-ditaa that renders diagrams drawn using ASCII art into PNG images.
- [Pygments Cache Path by Raimonds Simanovskis](https://github.com/rsim/blog.rayapps.com/blob/master/_plugins/pygments_cache_patch.rb): Plugin to cache syntax-highlighted code from Pygments.
- [Draft/Publish Plugin by Michael Ivey](https://gist.github.com/49630): Save posts as drafts.
- [Growl Notification Generator by Tate Johnson](https://gist.github.com/490101): Send Jekyll notifications to Growl.
@@ -542,14 +867,19 @@ You can find a few useful plugins at the following locations:
- [generator-jekyllrb](https://github.com/robwierzbowski/generator-jekyllrb): A generator that wraps Jekyll in [Yeoman](http://yeoman.io/), a tool collection and workflow for builing modern web apps.
- [grunt-jekyll](https://github.com/dannygarcia/grunt-jekyll): A straightforward [Grunt](http://gruntjs.com/) plugin for Jekyll.
- [jekyll-postfiles](https://github.com/indirect/jekyll-postfiles): Add `_postfiles` directory and {% raw %}`{{ postfile }}`{% endraw %} tag so the files a post refers to will always be right there inside your repo.
-- [A layout that compresses HTML](https://github.com/penibelst/jekyll-compress-html) by [Anatol Broder](http://penibelst.de/): Github Pages compatible, configurable way to compress HTML files on site build.
-- [Jekyll CO₂](https://github.com/wdenton/jekyll-co2): Generates HTML showing the monthly change in atmospheric CO₂ at the Mauna Loa observatory in Hawaii.
+- [A layout that compresses HTML](http://jch.penibelst.de/): Github Pages compatible, configurable way to compress HTML files on site build.
+- [Jekyll CO₂](https://github.com/wdenton/jekyll-co2): Generates HTML showing the monthly change in atmospheric CO₂ at the Mauna Loa observatory in Hawaii.
+- [remote-include](http://www.northfieldx.co.uk/remote-include/): Includes files using remote URLs
+- [jekyll-minifier](https://github.com/digitalsparky/jekyll-minifier): Minifies HTML, XML, CSS, and Javascript both inline and as separate files utilising yui-compressor and htmlcompressor.
+- [Jekyll views router](https://bitbucket.org/nyufac/jekyll-views-router): Simple router between generator plugins and templates.
+- [Jekyll Language Plugin](https://github.com/vwochnik/jekyll-language-plugin): Jekyll 3.0-compatible multi-language plugin for posts, pages and includes.
#### Editors
-- [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://sublime.wbond.net/packages/Jekyll).
+- [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://packagecontrol.io/packages/Jekyll).
- [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate
new posts and run `jekyll build` all without leaving vim.
+- [markdown-writer](https://atom.io/packages/markdown-writer): An Atom package for Jekyll. It can create new posts/drafts, manage tags/categories, insert link/images and add many useful key mappings.
<div class="note info">
<h5>Jekyll Plugins Wanted</h5>
diff --git a/site/docs/posts.md b/site/_docs/posts.md
similarity index 68%
rename from site/docs/posts.md
rename to site/_docs/posts.md
index 16846d9..ee02d06 100644
--- a/site/docs/posts.md
+++ b/site/_docs/posts.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Writing posts
-prev_section: frontmatter
-next_section: drafts
permalink: /docs/posts/
---
@@ -16,11 +14,12 @@ and web-based CMS systems, this will be a welcome change!
## The Posts Folder
As explained on the [directory structure](../structure/) page, the `_posts`
-folder is where your blog posts will live. These files can be either
-[Markdown](http://daringfireball.net/projects/markdown/) or
-[Textile](http://redcloth.org/textile) formatted text files, and as long as
-they have [YAML front-matter](../frontmatter/), they will be converted from their
-source format into an HTML page that is part of your static site.
+folder is where your blog posts will live. These files are generally
+[Markdown](http://daringfireball.net/projects/markdown/) or HTML, but can
+be other formats with the proper converter installed.
+All posts must have [YAML Front Matter](../frontmatter/), and they will be
+converted from their source format into an HTML page that is part of your
+static site.
### Creating Post Files
@@ -44,7 +43,7 @@ file. For example, the following are examples of valid post filenames:
<div class="note">
<h5>ProTip™: Link to other posts</h5>
<p>
- Use the <a href="../templates#post-url"><code>post_url</code></a>
+ Use the <a href="../templates/#post-url"><code>post_url</code></a>
tag to link to other posts without having to worry about the URL's
breaking when the site permalink style changes.
</p>
@@ -52,14 +51,14 @@ file. For example, the following are examples of valid post filenames:
### Content Formats
-All blog post files must begin with [YAML front-matter](../frontmatter/). After
+All blog post files must begin with [YAML Front Matter](../frontmatter/). After
that, it's simply a matter of deciding which format you prefer. Jekyll supports
-two popular content markup formats:
-[Markdown](http://daringfireball.net/projects/markdown/) and
-[Textile](http://redcloth.org/textile). These formats each have their own way
-of marking up different types of content within a post, so you should
-familiarize yourself with these formats and decide which one best suits your
-needs.
+[Markdown](http://daringfireball.net/projects/markdown/) out of the box,
+and has [myriad extensions for other formats as well](/docs/plugins/#converters-1),
+including the popular [Textile](http://redcloth.org/textile) format. These
+formats each have their own way of marking up different types of content
+within a post, so you should familiarize yourself with these formats and
+decide which one best suits your needs.
<div class="note info">
<h5>Be aware of character sets</h5>
@@ -77,17 +76,17 @@ needs.
Chances are, at some point, you'll want to include images, downloads, or other
digital assets along with your text content. While the syntax for linking to
-these resources differs between Markdown and Textile, the problem of working out
-where to store these files in your site is something everyone will face.
+these resources differs between Markdown and Textile, the problem of working
+out where to store these files in your site is something everyone will face.
-Because of Jekyll’s flexibility, there are many solutions to how to do this. One
-common solution is to create a folder in the root of the project directory
+Because of Jekyll’s flexibility, there are many solutions to how to do this.
+One common solution is to create a folder in the root of the project directory
called something like `assets` or `downloads`, into which any images, downloads
-or other resources are placed. Then, from within any post, they can be linked to
-using the site’s root as the path for the asset to include. Again, this will
-depend on the way your site’s (sub)domain and path are configured, but here some
-examples (in Markdown) of how you could do this using the `site.url` variable in
-a post.
+or other resources are placed. Then, from within any post, they can be linked
+to using the site’s root as the path for the asset to include. Again, this will
+depend on the way your site’s (sub)domain and path are configured, but here
+some examples (in Markdown) of how you could do this using the `site.url`
+variable in a post.
Including an image asset in a post:
@@ -117,8 +116,8 @@ Linking to a PDF for readers to download:
It’s all well and good to have posts in a folder, but a blog is no use unless
you have a list of posts somewhere. Creating an index of posts on another page
(or in a [template](../templates/)) is easy, thanks to the [Liquid template
-language](http://wiki.shopify.com/Liquid) and its tags. Here’s a basic example of how
-to create a list of links to your blog posts:
+language](http://wiki.shopify.com/Liquid) and its tags. Here’s a basic example
+of how to create a list of links to your blog posts:
{% highlight html %}
<ul>
@@ -134,13 +133,18 @@ Of course, you have full control over how (and where) you display your posts,
and how you structure your site. You should read more about [how templates
work](../templates/) with Jekyll if you want to know more.
+Note that the `post` variable only exists inside the `for` loop above. If
+you wish to access the currently-rendering page/posts's variables (the
+variables of the post/page that has the `for` loop in it), use the `page`
+variable instead.
+
## Post excerpts
-Each post automatically takes the first block of text, from the beginning of the content
-to the first occurrence of `excerpt_separator`, and sets it as the `post.excerpt`.
+Each post automatically takes the first block of text, from the beginning of
+the content to the first occurrence of `excerpt_separator`, and sets it as the `post.excerpt`.
Take the above example of an index of posts. Perhaps you want to include
-a little hint about the post's content by adding the first paragraph of each of your
-posts:
+a little hint about the post's content by adding the first paragraph of each of
+your posts:
{% highlight html %}
<ul>
@@ -153,24 +157,45 @@ posts:
</ul>
{% endhighlight %}
-Because Jekyll grabs the first paragraph you will not need to wrap the excerpt in `p` tags,
-which is already done for you. These tags can be removed with the following if you'd prefer:
+Because Jekyll grabs the first paragraph you will not need to wrap the excerpt
+in `p` tags, which is already done for you. These tags can be removed with the
+following if you'd prefer:
{% highlight html %}
{% raw %}{{ post.excerpt | remove: '<p>' | remove: '</p>' }}{% endraw %}
{% endhighlight %}
-If you don't like the automatically-generated post excerpt, it can be overridden by adding
-`excerpt` to your post's YAML front-matter. Completely disable it by setting
-your `excerpt_separator` to `""`.
+If you don't like the automatically-generated post excerpt, it can be
+explicitly overridden by adding an `excerpt` value to your post's YAML
+Front Matter. Alternatively, you can choose to define a custom
+`excerpt_separator` in the post's YAML front matter:
+
+{% highlight text %}
+---
+excerpt_separator: <!--more-->
+---
+
+Excerpt
+<!--more-->
+Out-of-excerpt
+{% endhighlight %}
+
+You can also set the `excerpt_separator` globally in your `_config.yml`
+configuration file.
+
+Completely disable excerpts by setting your `excerpt_separator` to `""`.
-Also, as with any output generated by Liquid tags, you can pass the `| strip_html` flag to remove any html tags in the output. This is particularly helpful if you wish to output a post excerpt as a `meta="description"` tag within the post `head`, or anywhere else having html tags along with the content is not desirable.
+Also, as with any output generated by Liquid tags, you can pass the
+`| strip_html` filter to remove any html tags in the output. This is
+particularly helpful if you wish to output a post excerpt as a
+`meta="description"` tag within the post `head`, or anywhere else having
+html tags along with the content is not desirable.
## Highlighting code snippets
Jekyll also has built-in support for syntax highlighting of code snippets using
-either Pygments or Rouge, and including a code snippet in any post is easy. Just
-use the dedicated Liquid tag as follows:
+either Pygments or Rouge, and including a code snippet in any post is easy.
+Just use the dedicated Liquid tag as follows:
{% highlight text %}
{% raw %}{% highlight ruby %}{% endraw %}
@@ -206,6 +231,7 @@ end
</div>
These basics should be enough to get you started writing your first posts. When
-you’re ready to dig into what else is possible, you might be interested in doing
-things like [customizing post permalinks](../permalinks/) or using [custom
-variables](../variables/) in your posts and elsewhere on your site.
+you’re ready to dig into what else is possible, you might be interested in
+doing things like [customizing post permalinks](../permalinks/) or
+using [custom variables](../variables/) in your posts and elsewhere on your
+site.
diff --git a/site/docs/quickstart.md b/site/_docs/quickstart.md
similarity index 74%
rename from site/docs/quickstart.md
rename to site/_docs/quickstart.md
index eedb976..d8ad551 100644
--- a/site/docs/quickstart.md
+++ b/site/_docs/quickstart.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Quick-start guide
-prev_section: home
-next_section: installation
permalink: /docs/quickstart/
---
@@ -16,8 +14,11 @@ For the impatient, here's how to get a boilerplate Jekyll site up and running.
# => Now browse to http://localhost:4000
{% endhighlight %}
+If you wish to install jekyll into the current directory, you can do so by
+alternatively running `jekyll new .` instead of a new directory name.
+
That's nothing, though. The real magic happens when you start creating blog
-posts, using the front-matter to control templates and layouts, and taking
+posts, using the front matter to control templates and layouts, and taking
advantage of all the awesome configuration options Jekyll makes available.
If you're running into problems, ensure you have all the [requirements
diff --git a/site/docs/resources.md b/site/_docs/resources.md
similarity index 76%
rename from site/docs/resources.md
rename to site/_docs/resources.md
index 36c66c4..8ede6a6 100644
--- a/site/docs/resources.md
+++ b/site/_docs/resources.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Resources
-prev_section: sites
-next_section: upgrading
permalink: /docs/resources/
---
@@ -14,6 +12,7 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext
Code example reuse, and keeping documentation up to date.
+- [Use FormKeep for Jekyll form backend and webhooks](https://formkeep.com/)
- [Use Simple Form to integrate a simple contact
form](http://getsimpleform.com/)
- [JekyllBootstrap.com](http://jekyllbootstrap.com)
@@ -35,9 +34,13 @@ Jekyll’s growing use is producing a wide variety of tutorials, frameworks, ext
> “Jekyll is a well-architected throwback to a time before WordPress, when men were men, and HTML was static. I like the ideas it espouses, and have made a few improvements to it’s core. Here, I’ll point out some highlights of my fork in the hopes that they see usage beyond this site.”
- [‘About this Website’, by Carter Allen](http://cartera.me/2010/08/12/about-this-website/)
> “Jekyll is everything that I ever wanted in a blogging engine. Really. It isn’t perfect, but what’s excellent about it is that if there’s something wrong, I know exactly how it works and how to fix it. It runs on the your machine only, and is essentially an added”build" step between you and the browser. I coded this entire site in TextMate using standard HTML5 and CSS3, and then at the end I added just a few little variables to the markup. Presto-chango, my site is built and I am at [...]
-- [Generating a Tag Cloud in Jekyll](http://www.justkez.com/generating-a-tag-cloud-in-jekyll/)
+- [‘Build A Blog With Jekyll And GitHub Pages’, by Barry Clark](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/)
+ > “I recently migrated my blog from WordPress to Jekyll, a fantastic website generator that’s designed for building minimal, static blogs to be hosted on GitHub Pages. The simplicity of Jekyll’s theming layer and writing workflow is fantastic; however, setting up my website took a lot longer than expected. In this article we'll walk through: the quickest way to set up a Jekyll powered blog, how to avoid common problems with using Jekyll, how to import your content from Wordpress, and more.”
+- [Generating a Tag Cloud in Jekyll](http://www.justkez.com/generating-a-tag-cloud-in-jekyll/)
A guide to implementing a tag cloud and per-tag content pages using Jekyll.
- A way to [extend Jekyll](https://github.com/rfelix/jekyll_ext) without forking and modifying the Jekyll gem codebase and some [portable Jekyll extensions](https://wiki.github.com/rfelix/jekyll_ext/extensions) that can be reused and shared.
- [Using your Rails layouts in Jekyll](http://numbers.brighterplanet.com/2010/08/09/sharing-rails-views-with-jekyll)
+
+- [Adding Ajax pagination to Jekyll](https://eduardoboucas.com/blog/2014/11/10/adding-ajax-pagination-to-jekyll.html)
diff --git a/site/docs/sites.md b/site/_docs/sites.md
similarity index 92%
rename from site/docs/sites.md
rename to site/_docs/sites.md
index 4e57aba..42d0492 100644
--- a/site/docs/sites.md
+++ b/site/_docs/sites.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Sites using Jekyll
-prev_section: troubleshooting
-next_section: resources
permalink: /docs/sites/
---
@@ -22,6 +20,8 @@ learning purposes.
([source](https://github.com/rsms/rsms.github.com))
- [Scott Chacon](http://schacon.github.com)
([source](https://github.com/schacon/schacon.github.com))
+- [Leonard Lamprecht](http://leo.im)
+ ([source](https://github.com/leo/leo.github.io))
If you would like to explore more examples, you can find a list of sites
and their sources on the ["Sites" page in the Jekyll wiki][jekyll-sites].
diff --git a/site/_docs/static_files.md b/site/_docs/static_files.md
new file mode 100644
index 0000000..00afbae
--- /dev/null
+++ b/site/_docs/static_files.md
@@ -0,0 +1,52 @@
+---
+layout: docs
+title: Static Files
+permalink: /docs/static-files/
+---
+
+In addition to renderable and convertible content, we also have **static
+files**.
+
+A static file is a file that does not contain any YAML front matter. These
+include images, PDFs, and other un-rendered content.
+
+They're accessible in Liquid via `site.static_files` and contain the
+following metadata:
+
+<div class="mobile-side-scroller">
+<table>
+ <thead>
+ <tr>
+ <th>Variable</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><p><code>file.path</code></p></td>
+ <td><p>
+
+ The relative path to the file.
+
+ </p></td>
+ </tr>
+ <tr>
+ <td><p><code>file.modified_time</code></p></td>
+ <td><p>
+
+ The `Time` the file was last modified.
+
+ </p></td>
+ </tr>
+ <tr>
+ <td><p><code>file.extname</code></p></td>
+ <td><p>
+
+ The extension name for the file, e.g.
+ <code>.jpg</code> for <code>image.jpg</code>
+
+ </p></td>
+ </tr>
+ </tbody>
+</table>
+</div>
diff --git a/site/docs/structure.md b/site/_docs/structure.md
similarity index 75%
rename from site/docs/structure.md
rename to site/_docs/structure.md
index 44bf27b..eb6a089 100644
--- a/site/docs/structure.md
+++ b/site/_docs/structure.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Directory structure
-prev_section: usage
-next_section: configuration
permalink: /docs/structure/
---
@@ -10,8 +8,8 @@ Jekyll is, at its core, a text transformation engine. The concept behind the
system is this: you give it text written in your favorite markup language, be
that Markdown, Textile, or just plain HTML, and it churns that through a layout
or series of layout files. Throughout that process you can tweak how you want
-the site URLs to look, what data gets displayed in the layout, and more. This is
-all done through editing text files, and the static web site is the final
+the site URLs to look, what data gets displayed in the layout, and more. This
+is all done through editing text files, and the static web site is the final
product.
A basic Jekyll site usually looks something like this:
@@ -34,6 +32,7 @@ A basic Jekyll site usually looks something like this:
├── _data
| └── members.yml
├── _site
+├── .jekyll-metadata
└── index.html
{% endhighlight %}
@@ -69,7 +68,9 @@ An overview of what each of these does:
<td>
<p>
- Drafts are unpublished posts. The format of these files is without a date: <code>title.MARKUP</code>. Learn how to <a href="../drafts/">work with drafts</a>.
+ Drafts are unpublished posts. The format of these files is without a
+ date: <code>title.MARKUP</code>. Learn how to <a href="../drafts/">
+ work with drafts</a>.
</p>
</td>
@@ -97,8 +98,9 @@ An overview of what each of these does:
<td>
<p>
- These are the templates that wrap posts. Layouts are chosen on a post-
- by-post basis in the <a href="../frontmatter/">YAML front matter</a>,
+ These are the templates that wrap posts. Layouts are chosen on a
+ post-by-post basis in the
+ <a href="../frontmatter/">YAML Front Matter</a>,
which is described in the next section. The liquid tag
<code>{% raw %}{{ content }}{% endraw %}</code>
is used to inject content into the web page.
@@ -113,12 +115,12 @@ An overview of what each of these does:
<td>
<p>
- Your dynamic content, so to speak. The naming convention of these files is
- important, and must follow the format:
+ Your dynamic content, so to speak. The naming convention of these
+ files is important, and must follow the format:
<code>YEAR-MONTH-DAY-title.MARKUP</code>.
- The <a href="../permalinks/">permalinks</a> can be customized for each
- post, but the date and markup language are determined solely by the
- file name.
+ The <a href="../permalinks/">permalinks</a> can be customized for
+ each post, but the date and markup language are determined solely by
+ the file name.
</p>
</td>
@@ -130,10 +132,13 @@ An overview of what each of these does:
<td>
<p>
- Well-formatted site data should be placed here. The jekyll engine will
- autoload all yaml files (ends with <code>.yml</code> or <code>.yaml</code>)
- in this directory. If there's a file <code>members.yml</code> under the directory,
- then you can access contents of the file through <code>site.data.members</code>.
+ Well-formatted site data should be placed here. The jekyll engine
+ will autoload all YAML files in this directory (using either the
+ <code>.yml</code>, <code>.yaml</code>, <code>.json</code> or
+ <code>.csv</code> formats and extensions) and they will be
+ accessible via `site.data`. If there's a file
+ <code>members.yml</code> under the directory, then you can access
+ contents of the file through <code>site.data.members</code>.
</p>
</td>
@@ -154,6 +159,22 @@ An overview of what each of these does:
</tr>
<tr>
<td>
+ <p><code>.jekyll-metadata</code></p>
+ </td>
+ <td>
+ <p>
+
+ This helps Jekyll keep track of which files have not been modified
+ since the site was last built, and which files will need to be
+ regenerated on the next build. This file will not be included in the
+ generated site. It’s probably a good idea to add this to your
+ <code>.gitignore</code> file.
+
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
<p><code>index.html</code> and other HTML, Markdown, Textile files</p>
</td>
<td>
diff --git a/site/docs/templates.md b/site/_docs/templates.md
similarity index 76%
rename from site/docs/templates.md
rename to site/_docs/templates.md
index 5ee7bb7..7a4ed04 100644
--- a/site/docs/templates.md
+++ b/site/_docs/templates.md
@@ -1,14 +1,12 @@
---
layout: docs
title: Templates
-prev_section: migrations
-next_section: permalinks
permalink: /docs/templates/
---
-Jekyll uses the [Liquid](http://wiki.shopify.com/Liquid) templating language to
-process templates. All of the standard Liquid [tags](http://wiki.shopify.com/Logic) and
-[filters](http://wiki.shopify.com/Filters) are
+Jekyll uses the [Liquid](https://github.com/Shopify/liquid/wiki) templating language to
+process templates. All of the standard Liquid [tags](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#tags) and
+[filters](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers#standard-filters) are
supported. Jekyll even adds a few handy filters and tags of its own to make
common tasks easier.
@@ -126,7 +124,7 @@ common tasks easier.
</td>
<td class="align-center">
<p>
- <code class="filter">{% raw %}{{ “foo,bar;baz?” | cgi_escape }}{% endraw %}</code>
+ <code class="filter">{% raw %}{{ "foo,bar;baz?" | cgi_escape }}{% endraw %}</code>
</p>
<p>
<code class="output">foo%2Cbar%3Bbaz%3F</code>
@@ -142,7 +140,7 @@ common tasks easier.
</td>
<td class="align-center">
<p>
- <code class="filter">{% raw %}{{ “'foo, bar \\baz?'” | uri_escape }}{% endraw %}</code>
+ <code class="filter">{% raw %}{{ "foo, bar \baz?" | uri_escape }}{% endraw %}</code>
</p>
<p>
<code class="output">foo,%20bar%20%5Cbaz?</code>
@@ -179,23 +177,44 @@ common tasks easier.
</tr>
<tr>
<td>
- <p class="name"><strong>Textilize</strong></p>
- <p>Convert a Textile-formatted string into HTML, formatted via RedCloth</p>
+ <p class="name"><strong>Markdownify</strong></p>
+ <p>Convert a Markdown-formatted string into HTML.</p>
</td>
<td class="align-center">
<p>
- <code class="filter">{% raw %}{{ page.excerpt | textilize }}{% endraw %}</code>
+ <code class="filter">{% raw %}{{ page.excerpt | markdownify }}{% endraw %}</code>
</p>
</td>
</tr>
<tr>
<td>
- <p class="name"><strong>Markdownify</strong></p>
- <p>Convert a Markdown-formatted string into HTML.</p>
+ <p class="name"><strong>Converting Sass/SCSS</strong></p>
+ <p>Convert a Sass- or SCSS-formatted string into CSS.</p>
</td>
<td class="align-center">
<p>
- <code class="filter">{% raw %}{{ page.excerpt | markdownify }}{% endraw %}</code>
+ <code class="filter">{% raw %}{{ some_scss | scssify }}{% endraw %}</code>
+ <code class="filter">{% raw %}{{ some_sass | sassify }}{% endraw %}</code>
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <p class="name"><strong>Slugify</strong></p>
+ <p>Convert a string into a lowercase URL "slug". See below for options.</p>
+ </td>
+ <td class="align-center">
+ <p>
+ <code class="filter">{% raw %}{{ "The _config.yml file" | slugify }}{% endraw %}</code>
+ </p>
+ <p>
+ <code class="output">the-config-yml-file</code>
+ </p>
+ <p>
+ <code class="filter">{% raw %}{{ "The _config.yml file" | slugify: 'pretty' }}{% endraw %}</code>
+ </p>
+ <p>
+ <code class="output">the-_config.yml-file</code>
</p>
</td>
</tr>
@@ -231,6 +250,16 @@ common tasks easier.
</table>
</div>
+### Options for the `slugify` filter
+
+The `slugify` filter accepts an option, each specifying what to filter.
+The default is `default`. They are as follows (with what they filter):
+
+- `none`: no characters
+- `raw`: spaces
+- `default`: spaces and non-alphanumeric characters
+- `pretty`: spaces and non-alphanumeric characters except for `._~!$&'()+,;=@`
+
## Tags
### Includes
@@ -257,10 +286,10 @@ root of your source directory. This will embed the contents of
</p>
</div>
-You can also pass parameters to an include:
+You can also pass parameters to an include. Omit the quotation marks to send a variable's value. Liquid curly brackets should not be used here:
{% highlight ruby %}
-{% raw %}{% include footer.html param="value" %}{% endraw %}
+{% raw %}{% include footer.html param="value" variable-param=page.variable %}{% endraw %}
{% endhighlight %}
These parameters are available via Liquid in the include:
@@ -269,6 +298,23 @@ These parameters are available via Liquid in the include:
{% raw %}{{ include.param }}{% endraw %}
{% endhighlight %}
+#### Including files relative to another file
+
+You can also choose to include file fragments relative to the current file:
+
+{% highlight ruby %}
+{% raw %}{% include_relative somedir/footer.html %}{% endraw %}
+{% endhighlight %}
+
+You won't need to place your included content within the `_includes` directory. Instead,
+the inclusion is specifically relative to the file where the tag is being used. For example,
+if `_posts/2014-09-03-my-file.markdown` uses the `include_relative` tag, the included file
+must be within the `_posts` directory, or one of its subdirectories. You cannot include
+files in other locations.
+
+All the other capabilities of the `include` tag are available to the `include_relative` tag,
+such as using variables.
+
### Code snippet highlighting
Jekyll has built in support for syntax highlighting of [over 100
@@ -278,9 +324,9 @@ on your system and set `highlighter` to `pygments` in your site's configuration
file.
Alternatively, you can use [Rouge](https://github.com/jayferd/rouge) to highlight
-your code snippets. It doesn't support as many languages as Pygments does but
-it should fit in most cases and it's written in pure Ruby ; you don't need Python
-on your system!
+your code snippets. It doesn't support as many languages as Pygments, however it
+should suit most use cases. Also, since [Rouge](https://github.com/jayferd/rouge)
+is written in pure Ruby, you don't need Python on your system!
To render a code block with syntax highlighting, surround your code as follows:
@@ -359,7 +405,8 @@ You can also use this tag to create a link to a post in Markdown as follows:
### Gist
-Use the `gist` tag to easily embed a GitHub Gist onto your site. This works with public or secret gists:
+Use the `gist` tag to easily embed a GitHub Gist onto your site. This works
+with public or secret gists:
{% highlight text %}
{% raw %}
@@ -374,3 +421,5 @@ You may also optionally specify the filename in the gist to display:
{% gist parkr/931c1c8d465a04042403 jekyll-private-gist.markdown %}
{% endraw %}
{% endhighlight %}
+
+To use the `gist` tag, you'll need to add the [jekyll-gist](https://github.com/jekyll/jekyll-gist) gem to your project.
diff --git a/site/_docs/troubleshooting.md b/site/_docs/troubleshooting.md
new file mode 100644
index 0000000..5d7b1ad
--- /dev/null
+++ b/site/_docs/troubleshooting.md
@@ -0,0 +1,207 @@
+---
+layout: docs
+title: Troubleshooting
+permalink: /docs/troubleshooting/
+---
+
+If you ever run into problems installing or using Jekyll, here are a few tips
+that might be of help. If the problem you’re experiencing isn’t covered below,
+**please [check out our other help resources](/help/)** as well.
+
+- [Installation Problems](#installation-problems)
+- [Problems running Jekyll](#problems-running-jekyll)
+- [Base-URL Problems](#base-url-problems)
+- [Configuration problems](#configuration-problems)
+- [Markup Problems](#markup-problems)
+
+## Installation Problems
+
+If you encounter errors during gem installation, you may need to install
+the header files for compiling extension modules for Ruby 2.0.0. This
+can be done on Ubuntu or Debian by running:
+
+{% highlight bash %}
+sudo apt-get install ruby2.0.0-dev
+{% endhighlight %}
+
+On Red Hat, CentOS, and Fedora systems you can do this by running:
+
+{% highlight bash %}
+sudo yum install ruby-devel
+{% endhighlight %}
+
+On [NearlyFreeSpeech](https://www.nearlyfreespeech.net/) you need to run the
+following commands before installing Jekyll:
+
+{% highlight bash %}
+export GEM_HOME=/home/private/gems
+export GEM_PATH=/home/private/gems:/usr/local/lib/ruby/gems/1.8/
+export PATH=$PATH:/home/private/gems/bin
+export RB_USER_INSTALL='true'
+{% endhighlight %}
+
+To install RubyGems on Gentoo:
+
+{% highlight bash %}
+sudo emerge -av dev-ruby/rubygems
+{% endhighlight %}
+
+On Windows, you may need to install [RubyInstaller
+DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit).
+
+On Mac OS X, you may need to update RubyGems (using `sudo` only if necessary):
+
+{% highlight bash %}
+sudo gem update --system
+{% endhighlight %}
+
+If you still have issues, you can download and install new Command Line
+Tools (such as `gcc`) using the command
+
+{% highlight bash %}
+xcode-select --install
+{% endhighlight %}
+
+which may allow you to install native gems using this command (again using
+`sudo` only if necessary):
+
+{% highlight bash %}
+sudo gem install jekyll
+{% endhighlight %}
+
+Note that upgrading Mac OS X does not automatically upgrade Xcode itself
+(that can be done separately via the App Store), and having an out-of-date
+Xcode.app can interfere with the command line tools downloaded above. If
+you run into this issue, upgrade Xcode and install the upgraded Command
+Line Tools.
+
+### Jekyll & Mac OS X 10.11
+
+With the introduction of System Integrity Protection, several directories
+that were previously writable are now considered system locations and are no
+longer available. Given these changes, there are a couple of simple ways to get
+up and running. One option is to change the location where the gem will be
+installed (again using `sudo` only if necessary):
+
+{% highlight bash %}
+sudo gem install -n /usr/local/bin jekyll
+{% endhighlight %}
+
+Alternatively, Homebrew can be installed and used to set up Ruby. This can be
+done as follows:
+
+{% highlight bash %}
+ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
+{% endhighlight %}
+
+Once Homebrew is installed, the second step is easy:
+
+{% highlight bash %}
+brew install ruby
+{% endhighlight %}
+
+Advanced users (with more complex needs) may find it helpful to choose one of a
+number of Ruby version managers ([RVM][], [rbenv][], [chruby][], [etc][].) in
+which to install Jekyll.
+
+[RVM]: https://rvm.io
+[rbenv]: http://rbenv.org
+[chruby]: https://github.com/postmodern/chruby
+[etc]: https://github.com/rvm/rvm/blob/master/docs/alt.md
+
+If you elect to use one of the above methods to install Ruby, it might be
+necessary to modify your `$PATH` variable using the following command:
+
+{% highlight bash %}
+export PATH=/usr/local/bin:$PATH
+{% endhighlight %}
+
+GUI apps can modify the `$PATH` as follows:
+
+{% highlight bash %}
+launchctl setenv PATH "/usr/local/bin:$PATH"
+{% endhighlight %}
+
+Either of these approaches are useful because `/usr/local` is considered a
+"safe" location on systems which have SIP enabled, they avoid potential
+conflicts with the version of Ruby included by Apple, and it keeps Jekyll and
+its dependencies in a sandboxed environment. This also has the added
+benefit of not requiring `sudo` when you want to add or remove a gem.
+
+### Could not find a JavaScript runtime. (ExecJS::RuntimeUnavailable)
+
+This error can occur during the installation of `jekyll-coffeescript` when
+you don't have a proper JavaScript runtime. To solve this, either install
+`execjs` and `therubyracer` gems, or install `nodejs`. Check out
+[issue #2327](https://github.com/jekyll/jekyll/issues/2327) for more info.
+
+## Problems running Jekyll
+
+On Debian or Ubuntu, you may need to add `/var/lib/gems/1.8/bin/` to your path
+in order to have the `jekyll` executable be available in your Terminal.
+
+## Base-URL Problems
+
+If you are using base-url option like:
+
+{% highlight bash %}
+jekyll serve --baseurl '/blog'
+{% endhighlight %}
+
+… then make sure that you access the site at:
+
+{% highlight bash %}
+http://localhost:4000/blog/index.html
+{% endhighlight %}
+
+It won’t work to just access:
+
+{% highlight bash %}
+http://localhost:4000/blog
+{% endhighlight %}
+
+## Configuration problems
+
+The order of precedence for conflicting [configuration settings](../configuration/)
+is as follows:
+
+1. Command-line flags
+2. Configuration file settings
+3. Defaults
+
+That is: defaults are overridden by options specified in `_config.yml`,
+and flags specified at the command-line will override all other settings
+specified elsewhere.
+
+## Markup Problems
+
+The various markup engines that Jekyll uses may have some issues. This
+page will document them to help others who may run into the same
+problems.
+
+### Liquid
+
+The latest version, version 2.0, seems to break the use of `{{ "{{" }}` in
+templates. Unlike previous versions, using `{{ "{{" }}` in 2.0 triggers the
+following error:
+
+{% highlight bash %}
+'{{ "{{" }}' was not properly terminated with regexp: /\}\}/ (Liquid::SyntaxError)
+{% endhighlight %}
+
+### Excerpts
+
+Since v1.0.0, Jekyll has had automatically-generated post excerpts. Since
+v1.1.0, Jekyll also passes these excerpts through Liquid, which can cause
+strange errors where references don't exist or a tag hasn't been closed. If you
+run into these errors, try setting `excerpt_separator: ""` in your
+`_config.yml`, or set it to some nonsense string.
+
+<div class="note">
+ <h5>Please report issues you encounter!</h5>
+ <p>
+ If you come across a bug, please <a href="{{ site.help_url }}/issues/new">create an issue</a>
+ on GitHub describing the problem and any work-arounds you find so we can
+ document it here for others.
+ </p>
+</div>
diff --git a/site/docs/upgrading.md b/site/_docs/upgrading.md
similarity index 65%
rename from site/docs/upgrading.md
rename to site/_docs/upgrading.md
index 3a3f167..51fe67a 100644
--- a/site/docs/upgrading.md
+++ b/site/_docs/upgrading.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Upgrading
-prev_section: resources
-next_section: contributing
permalink: /docs/upgrading/
---
@@ -26,35 +24,30 @@ $ gem update jekyll
For better clarity, Jekyll now accepts the commands `build` and `serve`.
Whereas before you might simply run the command `jekyll` to generate a site
-and `jekyll --server` to view it locally, now use the subcommands `jekyll build`
-and `jekyll serve` to do the same. And if you want Jekyll to automatically
-rebuild each time a file changes, just add the `--watch` flag at the end.
+and `jekyll --server` to view it locally, in v2.0 (and later) you should
+use the subcommands `jekyll build` and `jekyll serve` to build and preview
+your site.
<div class="note info">
<h5>Watching and Serving</h5>
<p markdown="1">With the new subcommands, the way sites are previewed locally
changed a bit. Instead of specifying `server: true` in the site's
- configuration file, use `jekyll serve`. The same hold's true for
+ configuration file, use `jekyll serve`. The same holds true for
`watch: true`. Instead, use the `--watch` flag with either `jekyll serve`
or `jekyll build`.</p>
</div>
### Absolute Permalinks
-In Jekyll v1.0, we introduced absolute permalinks for pages in subdirectories.
-Until v2.0, it is **opt-in**. Starting with v2.0, however, absolute permalinks
-will become **opt-out**, meaning Jekyll will default to using absolute permalinks
-instead of relative permalinks.
-
-* To use absolute permalinks, set `relative_permalinks: false` in your configuration file.
-* To continue using relative permalinks, set `relative_permalinks: true` in your configuration file.
+In Jekyll v1.0, we introduced absolute permalinks for pages in
+subdirectories. Starting with v2.0, absolute permalinks are opt-out,
+meaning Jekyll will default to using absolute permalinks instead of
+relative permalinks. Relative permalink backwards-compatibility was removed in v3.0.
<div class="note warning" id="absolute-permalinks-warning">
- <h5 markdown="1">Absolute permalinks will be default in v2.0 and on</h5>
+ <h5 markdown="1">Absolute permalinks will be required in v3.0 and on</h5>
<p markdown="1">
- Starting with Jekyll v2.0, `relative_permalinks` will default to `false`,
- meaning all pages will be built using the absolute permalink behaviour.
- The switch will still exist until v2.0.
+ Starting with Jekyll v3.0, relative permalinks functionality will be removed and thus unavailable for use.
</p>
</div>
@@ -77,16 +70,16 @@ and add a new markdown file to it. To preview your new post, simply run the
### Custom Config File
-Rather than passing individual flags via the command line, you can now pass an
-entire custom Jekyll config file. This helps to distinguish between
-environments, or lets you programmatically override user-specified defaults.
-Simply add the `--config` flag to the `jekyll` command, followed by the path
-to one or more config files (comma-delimited, no spaces).
+Rather than passing individual flags via the command line, you can now pass
+an entire custom Jekyll config file. This helps to distinguish between
+environments, or lets you programmatically override user-specified
+defaults. Simply add the `--config` flag to the `jekyll` command, followed
+by the path to one or more config files (comma-delimited, no spaces).
#### As a result, the following command line flags are now deprecated:
* `--no-server`
-* `--no-auto`
+* `--no-auto` (now `--no-watch`)
* `--auto` (now `--watch`)
* `--server`
* `--url=`
@@ -108,9 +101,9 @@ to one or more config files (comma-delimited, no spaces).
### New Config File Options
-Jekyll 1.0 introduced several new config file options. Before you upgrade, you
-should check to see if any of these are present in your pre-1.0 config file, and
-if so, make sure that you're using them properly:
+Jekyll 1.0 introduced several new config file options. Before you upgrade,
+you should check to see if any of these are present in your pre-1.0 config
+file, and if so, make sure that you're using them properly:
* `excerpt_separator`
* `host`
@@ -123,15 +116,16 @@ if so, make sure that you're using them properly:
### Baseurl
-Often, you'll want the ability to run a Jekyll site in multiple places, such as
-previewing locally before pushing to GitHub Pages. Jekyll 1.0 makes that
-easier with the new `--baseurl` flag. To take advantage of this feature, first
-add the production `baseurl` to your site's `_config.yml` file. Then,
-throughout the site, simply prefix relative URLs with `{% raw %}{{ site.baseurl }}{% endraw %}`.
-When you're ready to preview your site locally, pass along the `--baseurl` flag
-with your local baseurl (most likely `/`) to `jekyll serve` and Jekyll will
-swap in whatever you've passed along, ensuring all your links work as you'd
-expect in both environments.
+Often, you'll want the ability to run a Jekyll site in multiple places,
+such as previewing locally before pushing to GitHub Pages. Jekyll 1.0 makes
+that easier with the new `--baseurl` flag. To take advantage of this
+feature, first add the production `baseurl` to your site's `_config.yml`
+file. Then, throughout the site, simply prefix relative URLs
+with `{% raw %}{{ site.baseurl }}{% endraw %}`.
+When you're ready to preview your site locally, pass along the `--baseurl`
+flag with your local baseurl (most likely `/`) to `jekyll serve` and Jekyll
+will swap in whatever you've passed along, ensuring all your links work as
+you'd expect in both environments.
<div class="note warning">
diff --git a/site/docs/usage.md b/site/_docs/usage.md
similarity index 58%
rename from site/docs/usage.md
rename to site/_docs/usage.md
index 7538de0..28c4efb 100644
--- a/site/docs/usage.md
+++ b/site/_docs/usage.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Basic Usage
-prev_section: installation
-next_section: structure
permalink: /docs/usage/
---
@@ -24,14 +22,30 @@ $ jekyll build --watch
# watched for changes, and regenerated automatically.
{% endhighlight %}
+<div class="note info">
+ <h5>Changes to _config.yml are not included during automatic regeneration.</h5>
+ <p>
+ The <code>_config.yml</code> master configuration file contains global configurations
+ and variable definitions that are read once at execution time. Changes made to <code>_config.yml</code>
+ during automatic regeneration are not loaded until the next execution.
+ </p>
+ <p>
+ Note <a href="../datafiles">Data Files</a> are included and reloaded during automatic regeneration.
+ </p>
+</div>
+
<div class="note warning">
<h5>Destination folders are cleaned on site builds</h5>
<p>
The contents of <code><destination></code> are automatically
- cleaned when the site is built. Files or folders that are not
- created by your site will be removed. Do not use an important
- location for <code><destination></code>; instead, use it as
- a staging area and copy files from there to your web server.
+ cleaned, by default, when the site is built. Files or folders that are not
+ created by your site will be removed. Files and folders you wish to retain
+ in <code><destination></code> may be specified within the <code><keep_files></code>
+ configuration directive.
+ </p>
+ <p>
+ Do not use an important location for <code><destination></code>;
+ instead, use it as a staging area and copy files from there to your web server.
</p>
</div>
@@ -41,14 +55,24 @@ preview what the generated site will look like in your browser locally.
{% highlight bash %}
$ jekyll serve
# => A development server will run at http://localhost:4000/
+# Auto-regeneration: enabled. Use `--no-watch` to disable.
$ jekyll serve --detach
# => Same as `jekyll serve` but will detach from the current terminal.
# If you need to kill the server, you can `kill -9 1234` where "1234" is the PID.
# If you cannot find the PID, then do, `ps aux | grep jekyll` and kill the instance. [Read more](http://unixhelp.ed.ac.uk/shell/jobz5.html).
+{% endhighlight %}
-$ jekyll serve --watch
-# => Same as `jekyll serve`, but watch for changes and regenerate automatically.
+<div class="note info">
+ <h5>Be aware of default behavior</h5>
+ <p>
+ As of version 2.4, the <code>serve</code> command will watch for changes automatically. To disable this, you can use <code>jekyll serve --no-watch</code>, which preserves the old behavior.
+ </p>
+</div>
+
+{% highlight bash %}
+$ jekyll serve --no-watch
+# => Same as `jekyll serve` but will not watch for changes.
{% endhighlight %}
These are just a few of the available [configuration options](../configuration/).
@@ -72,3 +96,6 @@ $ jekyll build --source _source --destination _deploy
For more about the possible configuration options, see the
[configuration](../configuration/) page.
+
+If you're interested in browsing these docs on-the-go, install the
+`jekyll-docs` gem and run `jekyll docs` in your terminal.
diff --git a/site/docs/variables.md b/site/_docs/variables.md
similarity index 89%
rename from site/docs/variables.md
rename to site/_docs/variables.md
index a8b42c3..d4fb529 100644
--- a/site/docs/variables.md
+++ b/site/_docs/variables.md
@@ -1,15 +1,13 @@
---
layout: docs
title: Variables
-prev_section: pages
-next_section: collections
permalink: /docs/variables/
---
Jekyll traverses your site looking for files to process. Any files with [YAML
-Front Matter](../frontmatter/) are subject to processing. For each of these
+front matter](../frontmatter/) are subject to processing. For each of these
files, Jekyll makes a variety of data available via the [Liquid templating
-system](http://wiki.shopify.com/Liquid). The
+system](https://github.com/Shopify/liquid/wiki). The
following is a reference of the available data.
## Global Variables
@@ -36,8 +34,8 @@ following is a reference of the available data.
<td><p><code>page</code></p></td>
<td><p>
- Page specific information + the <a href="../frontmatter/">YAML Front
- Matter</a>. Custom variables set via the YAML front matter will be
+ Page specific information + the <a href="../frontmatter/">YAML front
+ matter</a>. Custom variables set via the YAML Front Matter will be
available here. See below for details.
</p></td>
@@ -105,10 +103,10 @@ following is a reference of the available data.
<td><p>
If the page being processed is a Post, this contains a list of up to ten
- related Posts. By default, these are low quality but fast to compute.
+ related Posts. By default, these are the ten most recent posts.
For high quality but slow to compute results, run the
<code>jekyll</code> command with the <code>--lsi</code> (latent semantic
- indexing) option.
+ indexing) option. Also note Github pages does not support the <code>lsi</code> option when generating sites.
</p></td>
</tr>
@@ -116,9 +114,10 @@ following is a reference of the available data.
<td><p><code>site.static_files</code></p></td>
<td><p>
- A list of all static files (i.e. files not processed by Jekyll's
- converters or the Liquid renderer). Each file has three properties:
- <code>path</code>, <code>modified_time</code> and <code>extname</code>.
+ A list of all <a href="/docs/static-files/">static files</a> (i.e.
+ files not processed by Jekyll's converters or the Liquid renderer).
+ Each file has three properties: <code>path</code>,
+ <code>modified_time</code> and <code>extname</code>.
</p></td>
</tr>
@@ -126,7 +125,15 @@ following is a reference of the available data.
<td><p><code>site.html_pages</code></p></td>
<td><p>
- A list of all HTML Pages.
+ A subset of `site.pages` listing those which end in `.html`.
+
+ </p></td>
+ </tr>
+ <tr>
+ <td><p><code>site.html_files</code></p></td>
+ <td><p>
+
+ A subset of `site.static_files` listing those which end in `.html`.
</p></td>
</tr>
@@ -203,7 +210,8 @@ following is a reference of the available data.
<td><p><code>page.content</code></p></td>
<td><p>
- The un-rendered content of the Page.
+ The content of the Page, rendered or un-rendered depending upon
+ what Liquid is being processed and what <code>page</code> is.
</p></td>
</tr>
@@ -309,7 +317,7 @@ following is a reference of the available data.
</div>
<div class="note">
- <h5>ProTip™: Use custom front-matter</h5>
+ <h5>ProTip™: Use Custom Front Matter</h5>
<p>
Any custom front matter that you specify will be available under
diff --git a/site/docs/windows.md b/site/_docs/windows.md
similarity index 85%
rename from site/docs/windows.md
rename to site/_docs/windows.md
index b87140b..a3e6b5f 100644
--- a/site/docs/windows.md
+++ b/site/_docs/windows.md
@@ -1,8 +1,6 @@
---
layout: docs
title: Jekyll on Windows
-prev_section: configuration
-next_section: posts
permalink: /docs/windows/
---
@@ -14,6 +12,8 @@ knowledge and lessons that have been unearthed by Windows users.
Julian Thilo has written up instructions to get
[Jekyll running on Windows][windows-installation] and it seems to work for most.
+The instructions were written for Ruby 2.0.0, but should work for later versions
+[prior to 2.2][hitimes-issue].
## Encoding
@@ -30,6 +30,7 @@ $ chcp 65001
{% endhighlight %}
[windows-installation]: http://jekyll-windows.juthilo.com/
+[hitimes-issue]: https://github.com/copiousfreetime/hitimes/issues/40
## Auto-regeneration
@@ -39,6 +40,5 @@ built-in support for UNIX systems, it requires an extra gem for compatibility
with Windows. Add the following to the Gemfile for your site:
{% highlight ruby %}
-require 'rbconfig'
-gem 'wdm', '~> 0.1.0' if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
+gem 'wdm', '~> 0.1.0' if Gem.win_platform?
{% endhighlight %}
diff --git a/site/_includes/analytics.html b/site/_includes/analytics.html
index 4ef9ea0..5bbfc88 100644
--- a/site/_includes/analytics.html
+++ b/site/_includes/analytics.html
@@ -18,10 +18,10 @@
{% if site.google_analytics_id %}
<!-- Google Analytics (http://google.com/analytics) -->
<script>
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ !function(j,e,k,y,l,L){j.GoogleAnalyticsObject=y,j[y]||(j[y]=function(){
+ (j[y].q=j[y].q||[]).push(arguments)}),j[y].l=+new Date,l=e.createElement(k),
+ L=e.getElementsByTagName(k)[0],l.src='//www.google-analytics.com/analytics.js',
+ L.parentNode.insertBefore(l,L)}(window,document,'script','ga');
ga('create', '{{ site.google_analytics_id }}', 'jekyllrb.com');
ga('send', 'pageview');
diff --git a/site/_includes/anchor_links.html b/site/_includes/anchor_links.html
index 08e37b5..c584ce5 100644
--- a/site/_includes/anchor_links.html
+++ b/site/_includes/anchor_links.html
@@ -3,7 +3,8 @@
var anchor = document.createElement("a");
anchor.className = "header-link";
anchor.href = "#" + id;
- anchor.innerHTML = "<i class=\"fa fa-link\"></i>";
+ anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
+ anchor.title = "Permalink";
return anchor;
};
diff --git a/site/_includes/css/font-awesome.css b/site/_includes/css/font-awesome.css
deleted file mode 100644
index 86435ec..0000000
--- a/site/_includes/css/font-awesome.css
+++ /dev/null
@@ -1,44 +0,0 @@
-/*!
- * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */
- at font-face {
- font-family: 'FontAwesome';
- src: url('../fonts/fontawesome-webfont.eot?v=4.1.0');
- src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-.fa {
- display: inline-block;
- font-family: FontAwesome;
- font-style: normal;
- font-weight: normal;
- line-height: 1;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-.fa-link:before {
- content: "\f0c1";
-}
-/*
- * This code is courtesy Ben Balter, modified by Parker Moore for jekyllrb.com
- * http://ben.balter.com/2014/03/13/pages-anchor-links/
- */
-.header-link {
- position: relative;
- left: 0.5em;
- opacity: 0;
- font-size: 0.8em;
-
- -webkit-transition: opacity 0.2s ease-in-out 0.1s;
- -moz-transition: opacity 0.2s ease-in-out 0.1s;
- -ms-transition: opacity 0.2s ease-in-out 0.1s;
-}
-h2:hover .header-link,
-h3:hover .header-link,
-h4:hover .header-link,
-h5:hover .header-link,
-h6:hover .header-link {
- opacity: 1;
-}
diff --git a/site/_includes/css/pygments.css b/site/_includes/css/pygments.css
deleted file mode 100644
index 5fe679f..0000000
--- a/site/_includes/css/pygments.css
+++ /dev/null
@@ -1,72 +0,0 @@
-/*.highlight { background: #333333; color: #ffffff}*/
-.highlight .hll { background-color: #ffffcc }
-.highlight .c { color: #87ceeb} /* Comment */
-.highlight .err { color: #ffffff} /* Error */
-.highlight .g { color: #ffffff} /* Generic */
-.highlight .k { color: #f0e68c} /* Keyword */
-.highlight .l { color: #ffffff} /* Literal */
-.highlight .n { color: #ffffff} /* Name */
-.highlight .o { color: #ffffff} /* Operator */
-.highlight .x { color: #ffffff} /* Other */
-.highlight .p { color: #ffffff} /* Punctuation */
-.highlight .cm { color: #87ceeb} /* Comment.Multiline */
-.highlight .cp { color: #cd5c5c} /* Comment.Preproc */
-.highlight .c1 { color: #87ceeb} /* Comment.Single */
-.highlight .cs { color: #87ceeb} /* Comment.Special */
-.highlight .gd { color: #0000c0; font-weight: bold; background-color: #008080 } /* Generic.Deleted */
-.highlight .ge { color: #c000c0; text-decoration: underline} /* Generic.Emph */
-.highlight .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */
-.highlight .gh { color: #cd5c5c} /* Generic.Heading */
-.highlight .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */
-.highlight span.go { color: #add8e6; font-weight: bold; background-color: #4d4d4d } /* Generic.Output, qualified with span to prevent applying this style to the Go language, see #1153. */
-.highlight .gp { color: #ffffff} /* Generic.Prompt */
-.highlight .gs { color: #ffffff} /* Generic.Strong */
-.highlight .gu { color: #cd5c5c} /* Generic.Subheading */
-.highlight .gt { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Traceback */
-.highlight .kc { color: #f0e68c} /* Keyword.Constant */
-.highlight .kd { color: #f0e68c} /* Keyword.Declaration */
-.highlight .kn { color: #f0e68c} /* Keyword.Namespace */
-.highlight .kp { color: #f0e68c} /* Keyword.Pseudo */
-.highlight .kr { color: #f0e68c} /* Keyword.Reserved */
-.highlight .kt { color: #bdb76b} /* Keyword.Type */
-.highlight .ld { color: #ffffff} /* Literal.Date */
-.highlight .m { color: #ffffff} /* Literal.Number */
-.highlight .s { color: #ffffff} /* Literal.String */
-.highlight .na { color: #ffffff} /* Name.Attribute */
-.highlight .nb { color: #ffffff} /* Name.Builtin */
-.highlight .nc { color: #ffffff} /* Name.Class */
-.highlight .no { color: #ffa0a0} /* Name.Constant */
-.highlight .nd { color: #ffffff} /* Name.Decorator */
-.highlight .ni { color: #ffdead} /* Name.Entity */
-.highlight .ne { color: #ffffff} /* Name.Exception */
-.highlight .nf { color: #ffffff} /* Name.Function */
-.highlight .nl { color: #ffffff} /* Name.Label */
-.highlight .nn { color: #ffffff} /* Name.Namespace */
-.highlight .nx { color: #ffffff} /* Name.Other */
-.highlight .py { color: #ffffff} /* Name.Property */
-.highlight .nt { color: #f0e68c} /* Name.Tag */
-.highlight .nv { color: #98fb98} /* Name.Variable */
-.highlight .ow { color: #ffffff} /* Operator.Word */
-.highlight .w { color: #ffffff} /* Text.Whitespace */
-.highlight .mf { color: #ffffff} /* Literal.Number.Float */
-.highlight .mh { color: #ffffff} /* Literal.Number.Hex */
-.highlight .mi { color: #ffffff} /* Literal.Number.Integer */
-.highlight .mo { color: #ffffff} /* Literal.Number.Oct */
-.highlight .sb { color: #ffffff} /* Literal.String.Backtick */
-.highlight .sc { color: #ffffff} /* Literal.String.Char */
-.highlight .sd { color: #ffffff} /* Literal.String.Doc */
-.highlight .s2 { color: #ffffff} /* Literal.String.Double */
-.highlight .se { color: #ffffff} /* Literal.String.Escape */
-.highlight .sh { color: #ffffff} /* Literal.String.Heredoc */
-.highlight .si { color: #ffffff} /* Literal.String.Interpol */
-.highlight .sx { color: #ffffff} /* Literal.String.Other */
-.highlight .sr { color: #ffffff} /* Literal.String.Regex */
-.highlight .s1 { color: #ffffff} /* Literal.String.Single */
-.highlight .ss { color: #ffffff} /* Literal.String.Symbol */
-.highlight .bp { color: #ffffff} /* Name.Builtin.Pseudo */
-.highlight .vc { color: #98fb98} /* Name.Variable.Class */
-.highlight .vg { color: #98fb98} /* Name.Variable.Global */
-.highlight .vi { color: #98fb98} /* Name.Variable.Instance */
-.highlight .il { color: #ffffff} /* Literal.Number.Integer.Long */
-
-.highlight .bash .nv {-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; }
diff --git a/site/_includes/css/style.css b/site/_includes/css/style.css
deleted file mode 100644
index 18bc833..0000000
--- a/site/_includes/css/style.css
+++ /dev/null
@@ -1,1045 +0,0 @@
-/* Base */
-
-* {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-body {
- font: 300 21px Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;
- color: #ddd;
- background-color: #333;
- border-top: 5px solid #fc0;
- -webkit-box-shadow: inset 0 3px 30px rgba(0,0,0,.3);
- -moz-box-shadow: inset 0 3px 30px rgba(0,0,0,.3);
- box-shadow: inset 0 3px 30px rgba(0,0,0,.3);
- text-shadow: 0 1px 3px rgba(0,0,0,.5);
-}
-
-.clear {
- display: block;
-}
-
-.clear:after {
- content: " ";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
-}
-
-/* Sections */
-
-header, section, footer {
- float: left;
- width: 100%;
- clear: both;
-}
-
-/* Header */
-
-header h1, header nav {
- display: inline-block;
-}
-
-header h1 span {
- display: none;
-}
-
-nav ul {
- padding: 0;
- margin: 0;
-}
-
-nav li {
- display: inline-block;
-}
-
-.main-nav {
- margin-top: 52px;
-}
-
-.main-nav li {
- margin-right: 10px;
-}
-
-.main-nav li a {
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- font-weight: 900;
- font-size: 14px;
- padding: 0.5em 1em;
- text-shadow: none;
- text-transform: uppercase;
- -webkit-transition: all .25s;
- -moz-transition: all .25s;
- -o-transition: all .25s;
- transition: all .25s;
-}
-
-.main-nav li a:hover {
- background-color: #252525;
- -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
- -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
- box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
- text-shadow: 0 1px 3px rgba(0,0,0,.5);
-}
-
-.main-nav li.current a {
- background-color: #fc0;
- color: #222;
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
- text-shadow: 0 1px 0 rgba(255,255,255,.3);
-}
-
-.mobile-nav ul {
- overflow: hidden;
- width: 100%;
- display: table;
-}
-
-.mobile-nav a {
- float: left;
- width: 100%;
- background-color: #333;
- color: #fc0;
- text-align: center;
- text-transform: uppercase;
- font-size: 14px;
- font-weight: 900;
- padding: 5px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.mobile-nav .current a {
- background-color: #fc0;
- color: #222;
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
- text-shadow: 0 1px 0 rgba(255,255,255,.3);
-}
-
-.mobile-nav li {
- display: table-cell;
- width: 20%;
- padding: 8px 2px;
-}
-
- at media (max-width: 768px) {
- .main-nav ul {
- text-align: right;
- }
-}
- at media (max-width: 830px) {
- .main-nav .show-on-mobiles {
- display: inline;
- }
- .main-nav .hide-on-mobiles {
- display: none;
- }
-}
-
-/* Footer */
-
-footer {
- background-color: #222;
- font-size: 16px;
- padding-bottom: 5px;
- color: #888;
- margin-top: 40px;
-}
-
-footer a {
- color: #fff;
-}
-
-footer .align-right p, footer img {
- display: inline-block;
-}
-
-footer img {
- position: relative;
- top: 8px;
- margin-left: 5px;
- opacity: .8;
- padding: 1px;
- -webkit-transition: opacity .2s;
- -moz-transition: opacity .2s;
- -o-transition: opacity .2s;
- transition: opacity .2s;
-}
-
-footer a:hover img {
- opacity: 1;
-}
-
- at media (max-width: 568px) {
- footer .one-third p {
- margin-bottom: 0;
- }
- footer .two-thirds p {
- margin-top: -20px;
- }
-}
-
-/* Intro */
-
-.intro .unit {
- padding: 10px 0 40px;
-}
-
-.intro p {
- font-size: 1.75em;
- line-height: 1em;
- margin: 0;
-}
-
- at media (min-width: 569px) {
- .intro p {
- font-size: 3.2em;
- }
-}
-
-/* Quickstart */
-
-.quickstart {
- background-color: #3F1F1F;
- color: #fff;
- margin: 60px 0;
- -webkit-box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
- -moz-box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
- box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
-}
-
-.quickstart .content {
- padding: 0;
-}
-
-.quickstart h4 {
- font-size: 24px;
- line-height: 24px;
- margin-top: 20px;
- text-shadow: 0 1px 3px rgba(0,0,0,.8);
-}
-
-.quickstart .code {
- font-size: 12px;
- display: block;
- margin: 0 0 -30px;
-}
-
- at media (min-width: 768px) {
- .quickstart .code {
- font-size: 18px;
- margin: -30px 0;
- float: right;
- }
- .quickstart h4 {
- margin: 50px 0 0;
- text-align: center;
- }
-}
-
-/* Code */
-
-.quickstart .code {
- display: block;
- padding: 0;
- font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
- line-height: 1.3em;
-}
-
-.quickstart .code .title {
- display: block;
- text-align: center;
- margin: 0 20px;
- padding: 5px 0;
- -webkit-border-radius: 5px 5px 0 0;
- -moz-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
- -webkit-box-shadow: 0 3px 10px rgba(0,0,0,.5);
- -moz-box-shadow: 0 3px 10px rgba(0,0,0,.5);
- box-shadow: 0 3px 10px rgba(0,0,0,.5);
- font: 400 16px/24px 'Helvetica Neue', Helvetica, Arial, sans-serif;
- color: #444;
- text-shadow: 0 1px 0 rgba(255,255,255,.5);
- background-color: #f7f7f7;
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjclIiBzdG [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f7f7), color-stop(7%, #cfcfcf), to(#aaaaaa));
- background-image: -webkit-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
- background-image: -moz-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
- background-image: -o-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
- background-image: linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#aaaaaa',GradientType=0 );
- border-bottom: 1px solid #111;
-}
-
-.quickstart .code .shell {
- padding: 20px;
- text-shadow: none;
- margin: 0 20px;
- background-color: #3d3d3d;
- -webkit-border-radius: 0 0 5px 5px;
- -moz-border-radius: 0 0 5px 5px;
- border-radius: 0 0 5px 5px;
- -webkit-box-shadow: 0 5px 30px rgba(0,0,0,.3);
- -moz-box-shadow: 0 5px 30px rgba(0,0,0,.3);
- box-shadow: 0 5px 30px rgba(0,0,0,.3);
-}
-
-.quickstart .code .line {
- display: block;
- margin: 0;
- padding: 0;
-}
-
-.quickstart .code .line span {
- display: inline-block;
-}
-
-.quickstart .code .path {
- color: #87ceeb;
- -webkit-user-select: none; /* Chrome all / Safari all */
- -moz-user-select: none; /* Firefox all */
- -ms-user-select: none; /* IE 10+ */
- -o-user-select: none;
- user-select: none;
-}
-
-.quickstart .code .prompt {
- color: #cd5c5c;
- -webkit-user-select: none; /* Chrome all / Safari all */
- -moz-user-select: none; /* Firefox all */
- -ms-user-select: none; /* IE 10+ */
- -o-user-select: none;
- user-select: none;
-}
-
-.quickstart .code .command {
- color: #f0e68c;
-}
-
-.quickstart .code .output {
- color: #888;
-}
-
-/* Free Hosting */
-
-.free-hosting .pane {
- background-color: #444;
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
- text-shadow: none;
- position: relative;
- padding: 0 20px 30px;
-}
-
-.free-hosting img {
- margin: -30px 0 0;
- width: 180px;
- height: 150px;
-}
-
-.free-hosting h2 {
- font-size: 28px;
-}
-
-.free-hosting p,
-.free-hosting a {
- font-size: 16px;
-}
-
-.free-hosting p {
- margin: .75em 0;
-}
-
- at media (min-width: 768px) {
- .free-hosting img {
- float: left;
- margin: -20px -30px -30px -50px;
- width: 300px;
- height: 251px;
- }
- .free-hosting .pane-content {
- margin-top: 35px;
- padding-right: 30px;
- }
- .free-hosting p,
- .free-hosting a {
- font-size: 18px;
- }
- .free-hosting .pane:after {
- content: " ";
- float: right;
- background: url(../img/footer-arrow.png) top left no-repeat;
- width: 73px;
- height: 186px;
- position: absolute;
- right: 0;
- bottom: -30px;
- }
-}
-
-/* Article - Used for both docs and news */
-
-
-article {
- background-color: #444;
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
- padding: 20px;
- margin: 0 10px;
- -webkit-box-shadow: 0 3px 10px rgba(0,0,0,.1);
- -moz-box-shadow: 0 3px 10px rgba(0,0,0,.1);
- box-shadow: 0 3px 10px rgba(0,0,0,.1);
- font-size: 16px;
-}
-
- at media (max-width: 480px) {
- article ul {
- padding-left: 20px;
- }
-}
-
- at media (max-width: 568px) {
- article {
- margin: 0;
- }
-}
-
- at media (min-width: 768px) {
- article {
- padding: 40px 40px 30px;
- font-size: 21px;
- }
-}
-
-/* Right-side nav - used by both docs and news */
-
-aside {
- padding-top: 30px;
-}
-
-aside h4 {
- text-transform: uppercase;
- font-size: 14px;
- font-weight: 700;
- padding: 0 0 10px 30px;
- margin-left: -30px;
- display: inline-block;
- border-bottom: 1px solid #c00;
-}
-
-aside ul {
- padding-left: 0;
-}
-
-aside ul:first-child {
- margin-top: 0;
-}
-
-aside li {
- list-style-type: none;
-}
-
-aside li a {
- font-size: 16px;
- position: relative
-}
-
-aside li.current a:before {
- content: "";
- border-color: transparent transparent transparent #444;
- border-style: solid;
- border-width: 10px;
- width: 0;
- height: 0;
- position: absolute;
- top: 0;
- left: -30px;
-}
-
-/* Documentation */
-
-.docs article {
- min-height: 800px;
-}
-
-.docs .content {
- padding: 0;
-}
-
-.section-nav {
- text-align: center;
- padding-top: 40px;
- position: relative;
- background: url(../img/article-footer.png) top center no-repeat;
- margin: 40px -20px 10px;
-}
-
-.section-nav > div {
- width: 49.5%;
-}
-
-.section-nav a, .section-nav span {
- color: #fff;
- font-size: 16px;
- text-transform: uppercase;
- font-weight: 700;
- padding: 8px 12px 10px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- /*border: 1px solid #333;*/
- -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
- -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
- box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
- background-color: #777;
-}
-
-.section-nav a:hover {
- color: #fff;
- background-color: #888;
-}
-
-.section-nav .next, .section-nav .prev {
- position: relative;
-}
-
-.section-nav .next:after, .section-nav .prev:before {
- font-size: 36px;
- color: #222;
- font-weight: 900;
- text-shadow: 0 1px 0 rgba(255,255,255,.4);
- position: absolute;
- top: -7px;
-}
-
-.section-nav .next:after {
- content: "›";
- right: 10px;
-}
-
-.section-nav .prev:before {
- content: "‹";
- left: 10px;
-}
-
-.section-nav .prev, .section-nav .prev:hover {
- /*float: left;*/
- padding-left: 30px;
-}
-
-.section-nav .next, .section-nav .next:hover {
- /*float: right;*/
- padding-right: 30px;
-}
-
-.section-nav .disabled {
- opacity: .5;
- /*filter: alpha*/
- cursor: default;
-}
-
-.docs-nav-mobile select {
- color: #000;
- width: 100%;
-}
-
-/* News */
-
-article h2:first-child {
- margin-top: 0;
-}
-
-.post-category,
-.post-meta {
- display: inline-block;
- vertical-align: middle;
- font-size: .8em;
-}
-
-.post-category {
- display: inline-block;
- margin-left: -30px;
- padding: 6px 10px 8px;
- padding-left: 50px;
- -webkit-border-radius: 0 5px 5px 0;
- -moz-border-radius: 0 5px 5px 0;
- border-radius: 0 5px 5px 0;
- position: relative;
- -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
- -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
- box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
- background-color: #9e2812;
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(#9e2812), to(#6f0d0d));
- background-image: -webkit-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
- background-image: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
- background-image: -o-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
- background-image: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
-}
-
-.post-content img {
- max-width: 100%
-}
-
-.label {
- float: left;
- text-transform: uppercase;
- font-weight: 700;
- text-shadow: 0 -1px 0 rgba(0,0,0,.5);
-}
-
- at media (max-width: 568px) {
- .post-category {
- padding-left: 30px;
- }
-}
-
- at media (min-width: 768px) {
- .post-category {
- margin-left: -50px;
- }
-}
-
-.post-category:before {
- content: "";
- position: absolute;
- top: -10px;
- left: 0;
- border-color: transparent #6f0d0d #6f0d0d transparent;
- border-style: solid;
- border-width: 5px;
- width: 0;
- height: 0;
-}
-
-.avatar {
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- display: inline-block;
- vertical-align: middle;
-}
-
-.post-meta {
- padding: 5px 0;
- color: #aaa;
- font-weight: 600;
- text-shadow: 0 -1px 0 #000;
-}
-
-.post-date,
-.post-author {
- margin-left: 10px;
-}
-
-.news article + article {
- margin-top: -10px;
- -webkit-border-radius: 0 0 10px 10px;
- -moz-border-radius: 0 0 10px 10px;
- border-radius: 0 0 10px 10px;
- border-top: 1px solid #555;
- -webkit-box-shadow: 0 -1px 0 #2f2f2f;
- -moz-box-shadow: 0 -1px 0 #2f2f2f;
- box-shadow: 0 -1px 0 #2f2f2f;
-}
-
-/* Code Highlighting */
-
-
-pre, code {
- white-space: pre;
- display: inline-block;
- margin: 0;
- font: 14px/1.8em Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
- padding: 0 0.5em;
-}
-
- at media (min-width: 768px) {
- pre, code {
- font-size: 16px;
- }
-}
-
-.highlight, p > pre, p > code, p > nobr > code, li > code, h5 > code, .note > code {
- background-color: #333;
- color: #fff;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- -webkit-box-shadow: inset 0 1px 10px rgba(0,0,0,.3),
- 0 1px 0 rgba(255,255,255,.1),
- 0 -1px 0 rgba(0,0,0,.5);
- -moz-box-shadow: inset 0 1px 10px rgba(0,0,0,.3),
- 0 1px 0 rgba(255,255,255,.1),
- 0 -1px 0 rgba(0,0,0,.5);
- box-shadow: inset 0 1px 10px rgba(0,0,0,.3),
- 0 1px 0 rgba(255,255,255,.1),
- 0 -1px 0 rgba(0,0,0,.5);
-}
-
-.note code {
- background-color: #333;
- background-color: rgba(0,0,0,0.2);
- margin-left: 2.5px;
- margin-right: 2.5px;
- font-size: 0.8em;
-}
-
-.highlight {
- margin: 1em 0;
- padding: 10px 0;
- width: 100%;
- overflow: auto;
-}
-
-/* HTML Elements */
-
-h1, h2, h3, h4, h5, h6 {
- margin: 0;
-}
-
-a {
- color: #fc0;
- text-decoration: none;
- -webkit-transition: all .25s;
- -moz-transition: all .25s;
- -o-transition: all .25s;
- transition: all .25s;
-}
-
-a:hover {
- color: #f90;
-}
-
-strong {
- font-weight: 700;
-}
-
-p {
- line-height: 1.5em;
-}
-
-.left { float: left; }
-.right { float: right; }
-.align-right { text-align: right; }
-.align-left { text-align: left; }
-.align-center { text-align: center; }
-
-/* Article HTML */
-
-article h2,
-article h3,
-article h4,
-article h5,
-article h6 {
- margin: 1em 0;
-}
-
-article h4 {
- color: #fff;
-}
-
-h5, h6 {
- font-size: 1em;
- font-style: italic;
-}
-
-article ul li p {
- margin: 0;
-}
-
-article ul li, article ol li {
- line-height: 1.5em;
- margin-bottom: 0.5em;
-}
-
-article ul li blockquote {
- margin: 10px 0;
-}
-
-blockquote {
- border-left: 2px solid #777;
- padding-left: 20px;
- font-style: italic;
- font-size: 18px;
- font-weight: 500;
-}
-
-
-/* Tables */
-
-table {
- width: 100%;
- background-color: #555;
- margin: .5em 0;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
- -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
- box-shadow: 0 1px 3px rgba(0,0,0,.3);
-}
-
-thead {
- -webkit-border-top-left-radius: 5px;
- -moz-border-radius-topleft: 5px;
- border-top-left-radius: 5px;
- -webkit-border-top-right-radius: 5px;
- -moz-border-radius-topright: 5px;
- border-top-right-radius: 5px;
- color: #fff;
- background-color: #3a3a3a;
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzNhM2EzYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(#3a3a3a), to(#1e1e1e));
- background-image: -webkit-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
- background-image: -moz-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
- background-image: -o-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
- background-image: linear-gradient(to bottom, #3a3a3a 0%,#1e1e1e 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3a3a3a', endColorstr='#1e1e1e',GradientType=0 );
-}
-
-thead th {
- position: relative;
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
-}
-
-thead th:first-child {
- -webkit-border-top-left-radius: 5px;
- -moz-border-radius-topleft: 5px;
- border-top-left-radius: 5px;
-}
-
-thead th:last-child {
- -webkit-border-top-right-radius: 5px;
- -moz-border-radius-topright: 5px;
- border-top-right-radius: 5px;
-}
-
-td {
- padding: .5em .75em;
-}
-
-td p {
- margin: 0;
-}
-
-th {
- text-transform: uppercase;
- font-size: 16px;
- padding: .5em .75em;
- text-shadow: 0 -1px 0 rgba(0,0,0,.9);
- color: #888;
-}
-
-tbody td {
- border-top: 1px solid #747474;
- border-top: 1px solid rgba(0,0,0,.1);
- -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
- -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
- box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
- background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3Rv [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,0.1)), to(rgba(255,255,255,0)));
- background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
- background-image: -moz-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
- background-image: -o-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
- background-image: linear-gradient(to bottom, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1affffff', endColorstr='#00ffffff',GradientType=0 );
-}
-
-td p {
- font-size: 16px;
-}
-
-td p code {
- font-size: 14px;
-}
-
-code.option, th .option, code.filter, th .filter {
- color: #50B600;
-}
-
-code.flag, th .flag, code.output, th .output {
- color: #049DCE;
-}
-
-code.option, code.flag, code.filter, code.output {
- margin-bottom: 2px;
-}
-
-/* Note types */
-
-.note {
- margin: 30px 0;
- margin-left: -30px;
- padding: 20px 20px 24px;
- padding-left: 50px;
- -webkit-border-radius: 0 5px 5px 0;
- -moz-border-radius: 0 5px 5px 0;
- border-radius: 0 5px 5px 0;
- position: relative;
- -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
- -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
- box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
- background-color: #7e6d42;
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdlNmQ0MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(#7e6d42), to(#5c4e35));
- background-image: -webkit-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
- background-image: -moz-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
- background-image: -o-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
- background-image: linear-gradient(to bottom, #7e6d42 0%,#5c4e35 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7e6d42', endColorstr='#5c4e35',GradientType=0 );
-}
-
- at media (max-width: 568px) {
- .note {
- margin-right: -30px;
- }
-}
-
- at media (min-width: 768px) {
- .note {
- margin-left: -50px;
- }
-}
-
-.note:before {
- content: "";
- position: absolute;
- top: -10px;
- left: 0;
- border-color: transparent #222 #222 transparent;
- border-style: solid;
- border-width: 5px;
- width: 0;
- height: 0;
-}
-
-.note h5, .note p {
- margin: 0;
- color: #fff;
-}
-
-.note h5 {
- line-height: 1.5em;
- font-weight: 900;
- font-style: normal;
-}
-
-.note p {
- font-weight: 400;
- font-size: .75em;
-}
-
-.info {
- background-color: #0389aa;
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAzODlhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(#0389aa), to(#00617f));
- background-image: -webkit-linear-gradient(top, #0389aa 0%, #00617f 100%);
- background-image: -moz-linear-gradient(top, #0389aa 0%, #00617f 100%);
- background-image: -o-linear-gradient(top, #0389aa 0%, #00617f 100%);
- background-image: linear-gradient(to bottom, #0389aa 0%,#00617f 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0389aa', endColorstr='#00617f',GradientType=0 );
-}
-
-.warning {
- background-color: #9e2812;
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(#9e2812), to(#6f0d0d));
- background-image: -webkit-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
- background-image: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
- background-image: -o-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
- background-image: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
-}
-
-.unreleased {
- background-color: #cd9239;
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2NkOTIzOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(205,146,57,1)), to(rgba(162,117,40,1)));
- background-image: -webkit-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
- background-image: -moz-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
- background-image: -o-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
- background-image: linear-gradient(to bottom, rgba(205,146,57,1) 0%,rgba(162,117,40,1) 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cd9239', endColorstr='#a27528',GradientType=0 );
-}
-
-.info:before {
- border-color: transparent #00617f #00617f transparent;
-}
-
-.warning:before {
- border-color: transparent #6f0d0d #6f0d0d transparent;
-}
-
-.unreleased:before {
- border-color: transparent #664719 #664719 transparent;
-}
-
-.note:after {
- content: "★";
- color: #fc0;
- position: absolute;
- top: 14px;
- left: 14px;
- font-size: 28px;
- font-weight: 700;
- text-shadow: 0 -1px 0 rgba(0,0,0,.5);
-}
-
-.info:after {
- content: "ⓘ";
- color: #fff;
- position: absolute;
- top: 15px;
- left: 15px;
- font-size: 28px;
- font-weight: 700;
- text-shadow: 0 -1px 0 rgba(0,0,0,.5);
-}
-
-.warning:after {
- content: "‼";
- color: #fc0;
- position: absolute;
- top: 15px;
- left: 15px;
- font-size: 32px;
- font-weight: 700;
- text-shadow: 0 -1px 0 rgba(0,0,0,.5);
-}
-
-.unreleased:after {
- content: "⚒";
- color: #2b2a12;
- position: absolute;
- top: 8px;
- left: 15px;
- font-size: 38px;
- font-weight: 700;
- text-shadow: 0 1px 0 rgba(255,255,255,.25);
-}
-
-/* Responsive tables */
-
- at media (max-width: 768px) {
- .mobile-side-scroller {
- overflow-x: scroll;
- margin: 0 -40px;
- padding: 0 10px;
- }
-}
diff --git a/site/_includes/docs_option.html b/site/_includes/docs_option.html
index 57b76e2..c259397 100644
--- a/site/_includes/docs_option.html
+++ b/site/_includes/docs_option.html
@@ -3,7 +3,7 @@
{% for item in items %}
{% assign item_url = item | prepend:"/docs/" | append:"/" %}
- {% for p in site.pages %}
+ {% for p in site.docs %}
{% if p.url == item_url %}
<option value="{{ site.url }}{{ p.url }}">{{ p.title }}</option>
{% endif %}
diff --git a/site/_includes/docs_ul.html b/site/_includes/docs_ul.html
index b778df1..7cc5417 100644
--- a/site/_includes/docs_ul.html
+++ b/site/_includes/docs_ul.html
@@ -10,9 +10,10 @@
{% assign c = "" %}
{% endif %}
- {% for p in site.pages %}
+ {% for p in site.docs %}
{% if p.url == item_url %}
<li class="{{ c }}"><a href="{{ site.url }}{{ p.url }}">{{ p.title }}</a></li>
+ {% break %}
{% endif %}
{% endfor %}
diff --git a/site/_includes/footer.html b/site/_includes/footer.html
index c42b1a4..09bab73 100644
--- a/site/_includes/footer.html
+++ b/site/_includes/footer.html
@@ -1,4 +1,4 @@
-<footer>
+<footer role="contentinfo">
<div class="grid">
<div class="unit one-third center-on-mobiles">
<p>The contents of this website are © {{ site.time | date: '%Y' }} <a href="http://tom.preston-werner.com/">Tom Preston-Werner</a> under the terms of the <a href="{{ site.repository }}/blob/master/LICENSE">MIT License</a>.</p>
diff --git a/site/_includes/header.html b/site/_includes/header.html
index f55cff3..5177767 100644
--- a/site/_includes/header.html
+++ b/site/_includes/header.html
@@ -1,4 +1,4 @@
-<header>
+<header role="banner">
<nav class="mobile-nav show-on-mobiles">
{% include primary-nav-items.html %}
</nav>
@@ -6,8 +6,8 @@
<div class="unit one-third center-on-mobiles">
<h1>
<a href="/">
- <span>Jekyll</span>
- <img src="/img/logo-2x.png" width="249" height="115" alt="Logo">
+ <span class="sr-only">Jekyll</span>
+ <img src="/img/logo-2x.png" width="249" height="115" alt="Jekyll Logo">
</a>
</h1>
</div>
diff --git a/site/_includes/news_item.html b/site/_includes/news_item.html
index 60245d6..aaf0521 100644
--- a/site/_includes/news_item.html
+++ b/site/_includes/news_item.html
@@ -14,7 +14,7 @@
{{ post.date | date_to_string }}
</span>
<a href="https://github.com/{{ post.author }}" class="post-author">
- <img src="https://github.com/{{ post.author }}.png" class="avatar" alt="{{ post.author }}" width="24" height="24">
+ <img src="https://github.com/{{ post.author }}.png" class="avatar" alt="{{ post.author }} avatar" width="24" height="24">
{{ post.author }}
</a>
</div>
diff --git a/site/_includes/primary-nav-items.html b/site/_includes/primary-nav-items.html
index f5628b7..df5b939 100644
--- a/site/_includes/primary-nav-items.html
+++ b/site/_includes/primary-nav-items.html
@@ -9,7 +9,7 @@
<a href="/news/">News</a>
</li>
<li>
- <a href="{{ site.help_url }}">Help</a>
+ <a href="/help/">Help</a>
</li>
<li>
<a href="{{ site.repository }}"><span class="hide-on-mobiles">View on </span>GitHub</a>
diff --git a/site/_includes/section_nav.html b/site/_includes/section_nav.html
index edba193..2016997 100644
--- a/site/_includes/section_nav.html
+++ b/site/_includes/section_nav.html
@@ -1,22 +1,39 @@
-<div class="section-nav">
- <div class="left align-right">
- {% if page.prev_section != null %}
- <a href="/docs/{{ page.prev_section }}/" class="prev">
- Back
- </a>
- {% else %}
- <span class="prev disabled">Back</span>
- {% endif %}
- </div>
- <div class="right align-left">
- {% if page.next_section != null %}
- <a href="/docs/{{ page.next_section }}/" class="next">
- Next
- </a>
- {% else %}
- <span class="next disabled">Next</span>
- {% endif %}
- </div>
- <div class="clear"></div>
-</div>
+{% comment %}
+Map grabs the doc sections, giving us an array of arrays. Join, flattens all
+the items to a comma delimited string. Split turns it into an array again.
+{% endcomment %}
+{% assign docs = site.data.docs | map: 'docs' | join: ',' | split: ',' %}
+{% comment %}
+Because this is built for every page, lets find where we are in the ordered
+document list by comparing url strings. Then if there's something previous or
+next, lets build a link to it.
+{% endcomment %}
+
+{% for document in docs %}
+ {% assign document_url = document | prepend:"/docs/" | append:"/" %}
+ {% if document_url == page.url %}
+ <div class="section-nav">
+ <div class="left align-right">
+ {% if forloop.first %}
+ <span class="prev disabled">Back</span>
+ {% else %}
+ {% assign previous = forloop.index0 | minus: 1 %}
+ {% assign previous_page = docs[previous] | prepend:"/docs/" | append:"/" %}
+ <a href="{{ previous_page }}" class="prev">Back</a>
+ {% endif %}
+ </div>
+ <div class="right align-left">
+ {% if forloop.last %}
+ <span class="next disabled">Next</span>
+ {% else %}
+ {% assign next = forloop.index0 | plus: 1 %}
+ {% assign next_page = docs[next] | prepend:"/docs/" | append:"/" %}
+ <a href="{{ next_page }}" class="next">Next</a>
+ {% endif %}
+ </div>
+ </div>
+ <div class="clear"></div>
+ {% break %}
+ {% endif %}
+{% endfor %}
\ No newline at end of file
diff --git a/site/_includes/top.html b/site/_includes/top.html
index 35ba2f2..2d12d1b 100644
--- a/site/_includes/top.html
+++ b/site/_includes/top.html
@@ -5,7 +5,7 @@
<title>{{ page.title }}</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Jekyll v{{ jekyll.version }}">
- <link rel="alternate" type="application/rss+xml" title="Jekyll • Simple, blog-aware, static sites - Feed" href="/feed.xml">
+ {% feed_meta %}
<link rel="alternate" type="application/atom+xml" title="Recent commits to Jekyll’s master branch" href="{{ site.repository }}/commits/master.atom">
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900">
<link rel="stylesheet" href="/css/screen.css">
diff --git a/site/_layouts/docs.html b/site/_layouts/docs.html
index a0a8a5c..0456c4c 100644
--- a/site/_layouts/docs.html
+++ b/site/_layouts/docs.html
@@ -9,6 +9,9 @@ layout: default
<div class="unit four-fifths">
<article>
+ <div class="improve right hide-on-mobiles">
+ <a href="https://github.com/jekyll/jekyll/edit/master/site/{{ page.path }}"><i class="fa fa-pencil"></i> Improve this page</a>
+ </div>
<h1>{{ page.title }}</h1>
{{ content }}
{% include section_nav.html %}
diff --git a/site/_layouts/news_item.html b/site/_layouts/news_item.html
index 6d27976..57ba622 100644
--- a/site/_layouts/news_item.html
+++ b/site/_layouts/news_item.html
@@ -17,7 +17,7 @@ layout: news
{{ page.date | date_to_string }}
</span>
<a href="https://github.com/{{ page.author }}" class="post-author">
- <img src="https://github.com/{{ page.author }}.png" class="avatar" alt="{{ page.author }}" width="24" height="24">
+ <img src="https://github.com/{{ page.author }}.png" class="avatar" alt="{{ page.author }} avatar" width="24" height="24">
{{ page.author }}
</a>
</div>
diff --git a/site/_layouts/page.html b/site/_layouts/page.html
new file mode 100644
index 0000000..bae31bb
--- /dev/null
+++ b/site/_layouts/page.html
@@ -0,0 +1,18 @@
+---
+layout: default
+---
+
+<section class="standalone">
+ <div class="grid">
+
+ <div class="unit whole">
+ <article>
+ <h1>{{ page.title }}</h1>
+ {{ content }}
+ </article>
+ </div>
+
+ <div class="clear"></div>
+
+ </div>
+</section>
diff --git a/site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown b/site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown
index 5a64cfc..1e3e44c 100644
--- a/site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown
+++ b/site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown
@@ -15,5 +15,3 @@ greatest code a spin without having to clone a repository from git.
Please take this prerelease for a spin and [let us
know](https://github.com/jekyll/jekyll/issues/new) if you run into any
issues!
-
-
diff --git a/site/_posts/2013-12-09-jekyll-1-4-1-released.markdown b/site/_posts/2013-12-09-jekyll-1-4-1-released.markdown
index 509571b..6340715 100644
--- a/site/_posts/2013-12-09-jekyll-1-4-1-released.markdown
+++ b/site/_posts/2013-12-09-jekyll-1-4-1-released.markdown
@@ -16,5 +16,3 @@ keep on writing without any problems.
As always, you can find the full list of fixes in this release in the
[change log](/docs/history/)!
-
-
diff --git a/site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown b/site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown
index 3dd9e57..8255551 100644
--- a/site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown
+++ b/site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown
@@ -13,7 +13,7 @@ Jam-packed with some [highly-requested features and bugfixes galore][changelog],
1. [Collections](/docs/collections/) - Collections allow you to define an unlimited number of custom document types (beyond just posts and pages) for different types of content you may want to author in Jekyll such as API documentation or a cookbook!
2. [Brand new site template](https://github.com/jekyll/jekyll/pull/2050#issuecomment-35938016) (thanks [@jglovier][]!) - Getting started with Jekyll just got a lot easier and a lot more beautiful. Just run `jekyll new <path>` and you're good to go.
3. [Native Sass & CoffeeScript support](/docs/assets/) - We love CSS and JavaScript as much as the next guy, but there will always be a special place in our hearts for Sass and CoffeeScript. We now offer native support for these file types — no more messing around with Rake or Grunt!
-4. [YAML Front-Matter defaults](/docs/configuration/#frontmatter-defaults) - If you've set `layout: post` more than once in your life, you'll love this new feature: set front-matter defaults for a given directory or type.
+4. [YAML Front Matter defaults](/docs/configuration/#front-matter-defaults) - If you've set `layout: post` more than once in your life, you'll love this new feature: set front matter defaults for a given directory or type.
5. [Custom markdown processors](/docs/configuration/#custom-markdown-processors) - Always wanted to use your favourite home-grown Markdown converter, but couldn't with Jekyll? Now you can. Simply specify `markdown: MyConverterClass` and you're on your way.
6. [Addition of `where` and `group_by` Liquid filters](/docs/templates/#filters) - Simplifying your Liquid templates one filter at a time. The `where` filter selects from an array all items within which have a given value for a property. The `group_by` filter groups all items in an array which have the same value for a given property.
7. [Switch from Maruku to Kramdown as default markdown converter](https://github.com/jekyll/jekyll/pull/1988) - Maruku is dead. We've replaced it with the converter which has the closest feature parity: Kramdown!
@@ -28,4 +28,4 @@ Happy developing!
[changelog]: /docs/history/
[@jglovier]: https://github.com/jglovier
-[jekyll-1]: /news/2013/05/06/jekyll-1-0-0-released/
+[jekyll-1]: {% post_url 2013-05-06-jekyll-1-0-0-released %}
diff --git a/site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown b/site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown
index ec6c357..0cfb31d 100644
--- a/site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown
+++ b/site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown
@@ -12,13 +12,13 @@ And he's done a lot of learning in the process! Here are some of the new
things to look forward to:
- Uses the latest Liquid version (2.6.1) (#2495)
-- Set front-matter defaults for collections (#2419)
+- Set front matter defaults for collections (#2419)
- Set a collection-specific URL template (#2418)
- `pygments.rb` 0.6.0! (#2504)
- `.json` files in `_data` (#2369)
- Allow subdirectories in `_data` (#2395)
- Add support for `hl_lines` in `highlight` tag (#2532)
-- Post categories now merge with directory, front-matter, and defaults (#2373)
+- Post categories now merge with directory, front matter, and defaults (#2373)
- New `--skip_initial_build` flag for `jekyll serve` (#2477)
- A bajilion bug fixes and site updates!
diff --git a/site/_posts/2014-07-29-jekyll-2-2-0-released.markdown b/site/_posts/2014-07-29-jekyll-2-2-0-released.markdown
index 9410df6..ca7aee4 100644
--- a/site/_posts/2014-07-29-jekyll-2-2-0-released.markdown
+++ b/site/_posts/2014-07-29-jekyll-2-2-0-released.markdown
@@ -16,4 +16,4 @@ Jekyll 2.2.0 contains a few key updates:
will now work properly).
As always, a full list of the updates are on the
-[history page](/docs/history#v2-2-0). Happy Jekylling!
+[history page](/docs/history/#v2-2-0). Happy Jekylling!
diff --git a/site/_posts/2014-08-10-jekyll-2-3-0-released.markdown b/site/_posts/2014-08-10-jekyll-2-3-0-released.markdown
new file mode 100644
index 0000000..63fe2b4
--- /dev/null
+++ b/site/_posts/2014-08-10-jekyll-2-3-0-released.markdown
@@ -0,0 +1,41 @@
+---
+layout: news_item
+title: 'Jekyll 2.3.0 Released'
+date: 2014-08-10 20:38:34 -0400
+author: parkr
+version: 2.3.0
+categories: [release]
+---
+
+This latest release of Jekyll includes a slew of enhancements and bug
+fixes. Some of the highlights:
+
+* Strange bug around spacing/indentation should be resolved. [It was a
+ curious bug indeed.](https://github.com/jekyll/jekyll/issues/2676)
+* Pages, Posts, and Drafts can now be converted by multiple converters.
+* Static files can now be safely included in collections. They'll be placed
+ in a `collection.files` array. `collection.docs` still holds exclusively
+ content with YAML front matter.
+* Sass files can once again be rendered by Liquid. However, neither Sass
+ nor CoffeeScript can ever have a layout. Bonus: `scssify` and `sassify`
+ Liquid filters.
+* Partial variables allowed now in the path argument of `include` calls
+* We added a `jekyll help` command. Pass it a subcommand to see more info
+ about that subcommand. Or don't, to see the help for `jekyll` itself.
+* Lots of fixes to the site template we use for `jekyll new`, including
+ converting the CSS into SCSS.
+* The `jsonify` filter will now call `#to_liquid` for you
+* Lots, lots more!
+
+One change deserves special note. In [#2633][], subfolders *inside* a
+`_posts` folder were processed and added as categories to the posts. It
+turns out, this behaviour was unwanted by a large number of individuals, as
+it is a handy way to organize posts. Ultimately, we decided to revert this
+change in [#2705][], because it was a change in behaviour that was already
+well-established (at least since Jekyll v0.7.0), and was convenient.
+
+[#2633]: {{ site.repository }}/issues/2633
+[#2705]: {{ site.repository }}/issues/2705
+
+For more excellent CHANGELOG reading material, check out the [History
+page](/docs/history/)! Happy Jekylling!
diff --git a/site/_posts/2014-09-09-jekyll-2-4-0-released.markdown b/site/_posts/2014-09-09-jekyll-2-4-0-released.markdown
new file mode 100644
index 0000000..e8dda67
--- /dev/null
+++ b/site/_posts/2014-09-09-jekyll-2-4-0-released.markdown
@@ -0,0 +1,25 @@
+---
+layout: news_item
+title: 'A Wild Jekyll 2.4.0 Appeared!'
+date: 2014-09-09 21:10:33 -0700
+author: parkr
+version: 2.4.0
+categories: [release]
+---
+
+Well, lookie here! A new release of Jekyll! v2.4.0 contains lots of goodies, including some brilliant new additions:
+
+- A new `relative_include` Liquid tag ([#2870]({{ site.repository }}/issues/2870))
+- Render Liquid in CoffeeScript files ([#2830]({{ site.repository }}/issues/2830))
+- Add 4 new array Liquid filters: `push`, `pop`, `shift`, and `unshift` ([#2895]({{ site.repository }}/pull/2895))
+- Auto-enable watch on 'serve' ([#2858]({{ site.repository }}/issues/2858)). No more `-w`!
+- Add `:title` and `:name` to collection URL template fillers ([#2864]({{ site.repository }}/issues/2864) & [#2799]({{ site.repository }}/issues/2799))
+- Add support for CSV files in the `_data` directory ([#2761]({{ site.repository }}/issues/2761))
+- Add `inspect` liquid filter ([#2867]({{ site.repository }}/issues/2867))
+- Add a `slugify` Liquid filter ([#2880]({{ site.repository }}/issues/2880))
+
+Some other wunderbar bug fixes in there as well. Check out the [full changelog](/docs/history/) for the whole scoop.
+
+As always, many thanks to our amazing contributors who made this release possible: Chris Frederick, Garen Torikian, James Smith, Ruslan Korolev, Joel Glovier, Michael Kühnel, Minn Soe, Pat Hawks, Peter deHaan, Shu Uesugi, TJ, Zhuochun, Alfred Xing, nitoyon, Anatol Broder, Faruk AYDIN, Frederic Hemberger, and Gordon Gao. Thank you!!
+
+Happy Jekylling!
diff --git a/site/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown b/site/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown
new file mode 100644
index 0000000..cc5de7c
--- /dev/null
+++ b/site/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown
@@ -0,0 +1,47 @@
+---
+layout: news_item
+title: "Jekyll's Mid-Life Crisis (Or, Jekyll turns 2.5.0)"
+date: 2014-11-05 10:48:22 -0800
+author: parkr
+version: 2.5.0
+categories: [release]
+---
+
+A new day, a new release! Jekyll just turned 2.5.0 and has gained a lot of
+wisdom along the way. This 2.5.0 release also comes just a few weeks after
+Jekyll turned 6 years old! In fashion, we're celebrating this huge
+milestone with a pretty big release. What's changed in 2.5.0? Here are some
+highlights:
+
+* Require plugins in the `:jekyll_plugins` Gemfile group (turned off with an environment variable)
+* YAML Front Matter permalinks can now contain placeholders like `:name`. Check out all the placeholders on the [Permalinks docs page](/docs/permalinks/).
+* The `jsonify` filter now deep-converts arrays to liquid.
+* Shorted `build` and `serve` commands with `b` and `s` aliases, respectively
+* WEBrick will now list your directory if it can't find an index file.
+* Any enumerable can be used with the `where` filter.
+* Performance optimizations thanks to @tmm1's [stackprof](https://github.com/tmm1/stackprof)
+* Fix for Rouge's Redcarpet interface
+* Security auditors will love this: path sanitation has now been centralized.
+* Specify a log level with `JEKYLL_LOG_LEVEL`: debug, info, warn, or error.
+
+...and a whole bunch of other fixes and enhancements you can read more
+about in [the changelog!](/docs/history/)
+
+As always, if you run into issues, please [check the issues]({{ site.repository }}/issues)
+and [create an issue if one doesn't exist for the bug you encountered]({{ site.repository }}/issues/new).
+If you just need some help, the extraordinary [jekyll help team is here for
+you!]({{ site.help_url }})
+
+*When was the [first commit to Jekyll](https://github.com/jekyll/jekyll/commit/d189e05d236769c1e5594af9db4d6eacb86fc16e)?
+All the way back on October 19, 2008. It features interesting historical
+tidbits, such as the old name for Jekyll was "autoblog", and was first
+released via Rubyforge. What a difference 6 years has made!*
+
+Thanks to the following contributors for making this release possible:
+
+Parker Moore, XhmikosR, Alfred Xing, Ruslan Korolev, Pat Hawks,
+chrisfinazzo, Mike Kruk, Tanguy Krotoff, Matt Hickford, Philipp Rudloff,
+Rob Murray, Sean Collins, Seth Warburton, Tom Thorogood, Vasily Vasinov,
+Veres Lajos, feivel, mitaa, nitoyon, snrbrnjna, tmthrgd, Bret Comnes,
+Charles Baynham, Christian Mayer, Dan Croak, Frederic Hemberger, Glauco
+Custódio, Igor Kapkov, and Kevin Ndung'u!
diff --git a/site/_posts/2014-11-08-jekyll-2-5-1-released.markdown b/site/_posts/2014-11-08-jekyll-2-5-1-released.markdown
new file mode 100644
index 0000000..3237e48
--- /dev/null
+++ b/site/_posts/2014-11-08-jekyll-2-5-1-released.markdown
@@ -0,0 +1,29 @@
+---
+layout: news_item
+title: 'Jekyll 2.5.1 Released'
+date: 2014-11-09 09:47:52 -0800
+author: parkr
+version: 2.5.1
+categories: [release]
+---
+
+Hot on the heels of v2.5.0, this release brings relief to our Windows
+users. It includes a fix for a 2.5.0 path sanitation change that has been
+confirmed to work on Windows.
+
+To our Windows users: while we don't officially support Windows, we don't
+wish to impede your normal use of Jekyll at all. Our lack of full support
+for Windows is due to our lack of a Windows machine for development testing
+(no one on the core team has a Windows machine upon which to test new
+release candidates), not due to any malice or willful oversight. If you
+come to us with an issue, we are more than happy to work through it with
+you to come to a solution that works for all platforms. Along those lines,
+we have created a [**Windows Test Force**][] (WTF) which is a group of Jekyll
+users dedicated to making sure all future releases work on Windows *before*
+they're released so we don't have this issue again. A special thanks goes
+out to the initial WTF team members, XhmikosR, Julian Thilo, Pedro Rogério,
+and Alfred Xing.
+
+Happy Jekylling!
+
+[**Windows Test Force**]: https://github.com/jekyll/jekyll/issues/3069
diff --git a/site/_posts/2014-11-12-jekyll-2-5-2-released.markdown b/site/_posts/2014-11-12-jekyll-2-5-2-released.markdown
new file mode 100644
index 0000000..3eab899
--- /dev/null
+++ b/site/_posts/2014-11-12-jekyll-2-5-2-released.markdown
@@ -0,0 +1,18 @@
+---
+layout: news_item
+title: 'Jekyll 2.5.2 Released'
+date: 2014-11-12 18:49:08 -0800
+author: parkr
+version: 2.5.2
+categories: [release]
+---
+
+A very minor release, 2.5.2 fixes a bug with path sanitation that 2.5.1
+introduced. It also improves the `post_url` tag such that it checks the
+posts' name (e.g. `2014-03-03-my-cool-post`) instead of a compiled time and
+name. This fixes issues where posts are created and the day changes based
+on timezone discrepancies.
+
+[Full history here.](/docs/history/)
+
+Happy Jekylling!
diff --git a/site/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md b/site/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md
new file mode 100644
index 0000000..6d62c65
--- /dev/null
+++ b/site/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md
@@ -0,0 +1,27 @@
+---
+layout: news_item
+title: 'Alfred Xing has joined the Jekyll core team'
+date: 2014-12-17 11:16:21 -0800
+author: parkr
+version: alfredxing
+categories: [team]
+---
+
+We're excited to announce that [@alfredxing][] has joined the @jekyll/core
+team!
+
+He hails from Vancouver, BC, Canada, where he is studying Economics and
+Computer Science at the [University of British Columbia][]. Alfred popped up in
+the issues a few months ago with terrific insights, focus, and humility.
+Performance buffs may be pleased to hear incremental regeneration will be
+released in a future version of Jekyll -- a significant piece of the
+feature written by Alfred.
+
+Please join me in welcoming Alfred to the Jekyll core team. We're excited
+he's agreed to lend his talents to this project. The future is an exciting
+place!
+
+Happy Jekylling!
+
+[@alfredxing]: https://github.com/alfredxing
+[University of British Columbia]: http://ubc.ca
diff --git a/site/_posts/2014-12-22-jekyll-2-5-3-released.markdown b/site/_posts/2014-12-22-jekyll-2-5-3-released.markdown
new file mode 100644
index 0000000..7743fd8
--- /dev/null
+++ b/site/_posts/2014-12-22-jekyll-2-5-3-released.markdown
@@ -0,0 +1,20 @@
+---
+layout: news_item
+title: 'Jekyll Release for the Holidays! v2.5.3 Out'
+date: 2014-12-22 09:03:30 -0500
+author: parkr
+version: 2.5.3
+categories: [release]
+---
+
+Happy Holidays, everyone.
+
+Jekyll v2.5.3 is a quick patch release, containing some minor fixes. See the
+[full history](/docs/history/) for more info. If you notice any problems,
+please [let us know]({{ site.help_url }}).
+
+This release also marks the start of Jekyll 3 development. I wrote about it
+over on my personal blog: [Jekyll 3 — The Road Ahead](https://byparker.com/blog/2014/jekyll-3-the-road-ahead/).
+Feel free to chime in over on GitHub.
+
+Happy Jekylling!
diff --git a/site/_posts/2015-01-20-jekyll-meet-and-greet.markdown b/site/_posts/2015-01-20-jekyll-meet-and-greet.markdown
new file mode 100644
index 0000000..ed273f9
--- /dev/null
+++ b/site/_posts/2015-01-20-jekyll-meet-and-greet.markdown
@@ -0,0 +1,20 @@
+---
+layout: news_item
+title: "Jekyll Meet & Greet at GitHub HQ"
+date: "2015-01-20 19:23:12 -0800"
+author: parkr
+categories: [meetup]
+---
+
+Hey! Our friends at GitHub have agreed to host a Jekyll meet & greet on
+**February 5, 2015 at 7pm**. The event will be hosted at
+[GitHub's Headquarters](https://goo.gl/maps/Bmy7i)
+here in San Francisco, CA. Pizza & beer will be available for those interested,
+and there will be much time to sit and chat about all things Jekyll. This would
+be an especially good time to get help with bugs you've encountered or to talk
+over a potential feature with the core team in attendance.
+
+A special thanks to [@gjtorikian](https://github.com/gjtorikian) for making this
+all possible! You rock.
+
+We look forward to meeting all you fine folks. Cheers!
diff --git a/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown b/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown
new file mode 100644
index 0000000..49b35b7
--- /dev/null
+++ b/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown
@@ -0,0 +1,40 @@
+---
+layout: news_item
+title: 'Jekyll 3.0.0.beta1 Released'
+date: 2015-01-24 00:42:31 -0800
+author: parkr
+version: 3.0.0.beta1
+categories: [release]
+---
+
+Hey!
+
+Exciting news! First beta for Jekyll 3 is out. Check out the [sizable
+changelog](https://github.com/jekyll/jekyll/blob/v3.0.0.beta1/History.markdown#head)
+to get a feel for what changes are afoot. Key features:
+
+1. **Speed.** Jekyll now features incremental regeneration and greatly
+ improved problematic code that caused slow-downs.
+2. Gobs of bugfixes and customization.
+3. Uniformity and sanity to Jekyll extensions of Liquid.
+
+To install just run:
+
+{% highlight bash %}
+$ gem install jekyll --pre
+{% endhighlight %}
+
+Future versions will include [some awesome new
+features](https://github.com/jekyll/jekyll/issues/3324) that we haven't
+built yet. If you see one you want to tackle, submit a PR & you'll be
+featured in the Jekyll 3.0 release post as a contributor to that epic
+release.
+
+Please file bugs as you encounter them, being sure to include your version
+of Ruby, the Jekyll version, and (if possible) a link to your site so we
+can reproduce.
+
+If you think there's room for improvement in the UX, also do let us know.
+We're always looking to make Jekyll easier to use!
+
+Happy Jekylling!
diff --git a/site/_posts/2015-02-26-introducing-jekyll-talk.markdown b/site/_posts/2015-02-26-introducing-jekyll-talk.markdown
new file mode 100644
index 0000000..90863c1
--- /dev/null
+++ b/site/_posts/2015-02-26-introducing-jekyll-talk.markdown
@@ -0,0 +1,15 @@
+---
+layout: news_item
+title: 'Join the Discussion at Jekyll Talk'
+date: 2015-02-26 21:06:51 -0800
+author: alfredxing
+categories: [community]
+---
+
+We're super excited to announce the launch of [Jekyll Talk](https://talk.jekyllrb.com), a Discourse forum for anything related to Jekyll!
+
+The forum was set up by [@envygeeks](https://github.com/envygeeks) to build a community more accessible to Jekyll users and more suitable for general discussion.
+
+There's already been a lot of interesting topics, including a [site showcase](https://talk.jekyllrb.com/t/showcase-sites-made-using-jekyll/18) and [a poll for Jekyll 3.0 priorities](https://talk.jekyllrb.com/t/poll-installation-priorities-for-3-0/106/9).
+
+Come join the fun!
\ No newline at end of file
diff --git a/site/_posts/2015-10-26-jekyll-3-0-released.markdown b/site/_posts/2015-10-26-jekyll-3-0-released.markdown
new file mode 100644
index 0000000..0d27a45
--- /dev/null
+++ b/site/_posts/2015-10-26-jekyll-3-0-released.markdown
@@ -0,0 +1,35 @@
+---
+layout: news_item
+title: 'Jekyll 3.0 Released'
+date: 2015-10-26 15:37:30 -0700
+author: parkr
+version: 3.0
+categories: [release]
+---
+
+The much-anticipated Jekyll 3.0 has been released! Key changes:
+
+- Incremental regeneration (experimental, enable with `--incremental`)
+- Liquid profiler (add `--profile` to a build or serve)
+- Hook plugin API (no more monkey-patching!)
+- Dependencies reduced from 14 to 8, none contain C extensions. We're hoping to reduce this even more in the future.
+- Changed version support: no support for Ruby 1.9.3, added basic JRuby support. Better Windows support.
+- Extension-less URLs
+- `site.collections` is an array of collections, thus:
+ - `collection[0]` becomes `collection.label`
+ - `collection[1]` becomes `collection`
+- Default highlighter is now Rouge instead of Pygments
+- Lots of performance improvements
+- ... and lots more!
+
+We also added a [Code of Conduct]({{ site.repository }}/blob/master/CONDUCT.md) to encourage a happier, nicer community where contributions and discussion is protected from negative behaviour.
+
+A huge shout-out to the amazing Jekyll Core Team members Jordon Bedwell, Alfred Xing, and Matt Rogers for all their hard work in making Jekyll 3 the best release yet.
+
+We also added [Jekyll Talk](https://talk.jekyllrb.com), managed solely by Jordon, which offers a modern forum experience for Jekyllers across the globe to talk and learn about Jekyll!
+
+As always, check out the [full history](/docs/history/#v3-0-0) for more details.
+
+Our contributors are the core of what makes Jekyll great! Many thanks to the 132 contributors who made this release possible (in alphabetical order): AJ Acevedo, Adam Richeimer, Alan Scherger, Alfred Xing, Anatol Broder, Andrew Dunning, Anna Debenham, Anton, Arne Gockeln, Arthur Hammer, Arthur Neves, BRAVO, Ben Balter, Bernardo Dias, BigBlueHat, Brandon Mathis, Bruce Smith, Cai⚡️, Carlos Matallín, ChaYoung You, Christian Vuerings, Cory Simmons, David Herman, David Silva Smith, David Smit [...]
+
+Happy Jekylling!
diff --git a/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown b/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown
new file mode 100644
index 0000000..71412c6
--- /dev/null
+++ b/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown
@@ -0,0 +1,25 @@
+---
+layout: news_item
+title: 'Jekyll 3.0.1 Released'
+date: 2015-11-17 22:04:39 -0800
+author: parkr
+version: 3.0.1
+categories: [release]
+---
+
+Hey, folks! Bunch of bug fixes here. Notables:
+
+* Only superdirectories of `_posts` will be categories.
+* `:title` in permalink templates are now properly cased as before
+* `.jekyll-metadata` being erroneously written when not using incremental build.
+* Failure in liquid will now always fail the `jekyll` process.
+* All hooks should now be properly registered & documented
+
+And a bunch more changes which you can see over in the
+[changelog](/docs/history).
+
+Thanks to the 17 developers who contributed code and documentation to this
+patch release: Alfred Xing, Christian Trosell, Jordan Thornquest, Jordon
+Bedwell, Larry Fox, Lawrence Murray, Lewis Cowles, Matt Rogers, Nicole
+White, Parker Moore, Paul Robert Lloyd, Sarah Kuehnle, Vincent Wochnik,
+Will Norris, XhmikosR, chrisfinazzo, and rebornix.
diff --git a/site/_sass/_font-awesome.scss b/site/_sass/_font-awesome.scss
new file mode 100644
index 0000000..681011e
--- /dev/null
+++ b/site/_sass/_font-awesome.scss
@@ -0,0 +1,25 @@
+/*!
+ * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+ at font-face {
+ font-family: 'FontAwesome';
+ src: url('../fonts/fontawesome-webfont.eot?v=4.4.0');
+ src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.fa-link:before {
+ content: "\f0c1";
+}
+.fa-pencil:before {
+ content: "\f040";
+}
diff --git a/site/_includes/css/gridism.css b/site/_sass/_gridism.scss
similarity index 78%
rename from site/_includes/css/gridism.css
rename to site/_sass/_gridism.scss
index cc7a43c..61698ef 100644
--- a/site/_includes/css/gridism.css
+++ b/site/_sass/_gridism.scss
@@ -53,8 +53,10 @@
.grid .half, .grid .w-1-2 { width: 50%; }
.grid .one-third, .grid .w-1-3 { width: 33.3332%; }
.grid .two-thirds, .grid .w-2-3 { width: 66.6665%; }
-.grid .one-quarter, .grid .w-1-4 { width: 25%; }
-.grid .three-quarters, .grid .w-3-4 { width: 75%; }
+.grid .one-quarter,
+.grid .one-fourth, .grid .w-1-4 { width: 25%; }
+.grid .three-quarters,
+.grid .three-fourths, .grid .w-3-4 { width: 75%; }
.grid .one-fifth, .grid .w-1-5 { width: 20%; }
.grid .two-fifths, .grid .w-2-5 { width: 40%; }
.grid .three-fifths, .grid .w-3-5 { width: 60%; }
@@ -62,6 +64,19 @@
.grid .golden-small, .grid .w-g-s { width: 38.2716%; } /* Golden section: smaller piece */
.grid .golden-large, .grid .w-g-l { width: 61.7283%; } /* Golden section: larger piece */
+/* Clearfix after every .grid */
+.grid {
+ *zoom: 1;
+}
+.grid:before, .grid:after {
+ display: table;
+ content: "";
+ line-height: 0;
+}
+.grid:after {
+ clear: both;
+}
+
/* Utility classes */
.align-center { text-align: center; }
.align-left { text-align: left; }
@@ -69,14 +84,18 @@
.pull-left { float: left; }
.pull-right { float: right; }
-.show-on-mobiles {
- display: none;
+/* A property for a better rendering of images in units: in
+ this way bigger pictures are just resized if the unit
+ becomes smaller */
+.unit img {
+ max-width: 100%;
}
/* Responsive Stuff */
@media screen and (max-width: 568px) {
- /* Stack anything that isn’t full-width on smaller screens */
- .grid .unit {
+ /* Stack anything that isn’t full-width on smaller screens
+ and doesn't provide the no-stacking-on-mobiles class */
+ .grid:not(.no-stacking-on-mobiles) > .unit {
width: 100% !important;
padding-left: 20px;
padding-right: 20px;
@@ -93,18 +112,13 @@
.hide-on-mobiles {
display: none !important;
}
- .show-on-mobiles {
- display: block !important;
- }
- a .show-on-mobiles {
- display: inline !important;
- }
}
/* Expand the wrap a bit further on larger screens */
-/*@media screen and (min-width: 1180px) {
- .wrap .grid {
+ at media screen and (min-width: 1180px) {
+ .wider .grid,
+ .grid.wider {
max-width: 1180px;
margin: 0 auto;
}
-}*/
+}
diff --git a/site/_sass/_mixins.scss b/site/_sass/_mixins.scss
new file mode 100644
index 0000000..5b9bb43
--- /dev/null
+++ b/site/_sass/_mixins.scss
@@ -0,0 +1,38 @@
+ at mixin box-shadow($shadow...) {
+ -webkit-box-shadow: $shadow;
+ -moz-box-shadow: $shadow;
+ box-shadow: $shadow;
+}
+
+ at mixin border-radius($radius...) {
+ -webkit-border-radius: $radius;
+ -moz-border-radius: $radius;
+ border-radius: $radius;
+}
+
+ at mixin border-top-left-radius($radius...) {
+ -webkit-border-top-left-radius: $radius;
+ -moz-border-radius-topleft: $radius;
+ border-top-left-radius: $radius;
+}
+
+ at mixin border-top-right-radius($radius...) {
+ -webkit-border-top-right-radius: $radius;
+ -moz-border-radius-topright: $radius;
+ border-top-right-radius: $radius;
+}
+
+ at mixin transition($transition...) {
+ -webkit-transition: $transition;
+ -moz-transition: $transition;
+ -o-transition: $transition;
+ transition: $transition;
+}
+
+ at mixin user-select($select...) {
+ -webkit-user-select: $select; /* Chrome all / Safari all */
+ -moz-user-select: $select; /* Firefox all */
+ -ms-user-select: $select; /* IE 10+ */
+ -o-user-select: $select;
+ user-select: $select;
+}
diff --git a/site/_sass/_pygments.scss b/site/_sass/_pygments.scss
new file mode 100644
index 0000000..2858bcd
--- /dev/null
+++ b/site/_sass/_pygments.scss
@@ -0,0 +1,78 @@
+.highlight {
+ .hll { background-color: #ffffcc }
+ .c { color: #87ceeb} /* Comment */
+ .err { color: #ffffff} /* Error */
+ .g { color: #ffffff} /* Generic */
+ .k { color: #f0e68c} /* Keyword */
+ .l { color: #ffffff} /* Literal */
+ .n { color: #ffffff} /* Name */
+ .o { color: #ffffff} /* Operator */
+ .x { color: #ffffff} /* Other */
+ .p { color: #ffffff} /* Punctuation */
+ .cm { color: #87ceeb} /* Comment.Multiline */
+ .cp { color: #cd5c5c} /* Comment.Preproc */
+ .c1 { color: #87ceeb} /* Comment.Single */
+ .cs { color: #87ceeb} /* Comment.Special */
+ .gd { color: #0000c0; font-weight: bold; background-color: #008080 } /* Generic.Deleted */
+ .ge { color: #c000c0; text-decoration: underline} /* Generic.Emph */
+ .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */
+ .gh { color: #cd5c5c} /* Generic.Heading */
+ .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */
+ span.go { color: #add8e6; font-weight: bold; background-color: #4d4d4d } /* Generic.Output, qualified with span to prevent applying this style to the Go language, see #1153. */
+ .gp { color: #ffffff} /* Generic.Prompt */
+ .gs { color: #ffffff} /* Generic.Strong */
+ .gu { color: #cd5c5c} /* Generic.Subheading */
+ .gt { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Traceback */
+ .kc { color: #f0e68c} /* Keyword.Constant */
+ .kd { color: #f0e68c} /* Keyword.Declaration */
+ .kn { color: #f0e68c} /* Keyword.Namespace */
+ .kp { color: #f0e68c} /* Keyword.Pseudo */
+ .kr { color: #f0e68c} /* Keyword.Reserved */
+ .kt { color: #bdb76b} /* Keyword.Type */
+ .ld { color: #ffffff} /* Literal.Date */
+ .m { color: #ffffff} /* Literal.Number */
+ .s { color: #ffffff} /* Literal.String */
+ .na { color: #ffffff} /* Name.Attribute */
+ .nb { color: #ffffff} /* Name.Builtin */
+ .nc { color: #ffffff} /* Name.Class */
+ .no { color: #ffa0a0} /* Name.Constant */
+ .nd { color: #ffffff} /* Name.Decorator */
+ .ni { color: #ffdead} /* Name.Entity */
+ .ne { color: #ffffff} /* Name.Exception */
+ .nf { color: #ffffff} /* Name.Function */
+ .nl { color: #ffffff} /* Name.Label */
+ .nn { color: #ffffff} /* Name.Namespace */
+ .nx { color: #ffffff} /* Name.Other */
+ .py { color: #ffffff} /* Name.Property */
+ .nt { color: #f0e68c} /* Name.Tag */
+ .nv { color: #98fb98} /* Name.Variable */
+ .ow { color: #ffffff} /* Operator.Word */
+ .w { color: #ffffff} /* Text.Whitespace */
+ .mf { color: #ffffff} /* Literal.Number.Float */
+ .mh { color: #ffffff} /* Literal.Number.Hex */
+ .mi { color: #ffffff} /* Literal.Number.Integer */
+ .mo { color: #ffffff} /* Literal.Number.Oct */
+ .sb { color: #ffffff} /* Literal.String.Backtick */
+ .sc { color: #ffffff} /* Literal.String.Char */
+ .sd { color: #ffffff} /* Literal.String.Doc */
+ .s2 { color: #ffffff} /* Literal.String.Double */
+ .se { color: #ffffff} /* Literal.String.Escape */
+ .sh { color: #ffffff} /* Literal.String.Heredoc */
+ .si { color: #ffffff} /* Literal.String.Interpol */
+ .sx { color: #ffffff} /* Literal.String.Other */
+ .sr { color: #ffffff} /* Literal.String.Regex */
+ .s1 { color: #ffffff} /* Literal.String.Single */
+ .ss { color: #ffffff} /* Literal.String.Symbol */
+ .bp { color: #ffffff} /* Name.Builtin.Pseudo */
+ .vc { color: #98fb98} /* Name.Variable.Class */
+ .vg { color: #98fb98} /* Name.Variable.Global */
+ .vi { color: #98fb98} /* Name.Variable.Instance */
+ .il { color: #ffffff} /* Literal.Number.Integer.Long */
+ .bash .nv {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+ }
+}
\ No newline at end of file
diff --git a/site/_sass/_style.scss b/site/_sass/_style.scss
new file mode 100644
index 0000000..5980d24
--- /dev/null
+++ b/site/_sass/_style.scss
@@ -0,0 +1,998 @@
+/* Base */
+
+* {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+body {
+ font: 300 21px Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ color: #ddd;
+ background-color: #333;
+ border-top: 5px solid #fc0;
+ @include box-shadow(inset 0 3px 30px rgba(0,0,0,.3));
+ text-shadow: 0 1px 3px rgba(0,0,0,.5);
+ -webkit-font-feature-settings: "kern" 1;
+ -moz-font-feature-settings: "kern" 1;
+ -o-font-feature-settings: "kern" 1;
+ font-feature-settings: "kern" 1;
+ font-kerning: normal;
+}
+
+.clear {
+ display: block;
+}
+
+.clear:after {
+ content: " ";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+
+/* Sections */
+
+header,
+section,
+footer {
+ float: left;
+ width: 100%;
+ clear: both;
+}
+
+/* Header */
+
+header {
+
+ h1,
+ nav { display: inline-block; }
+
+}
+
+nav {
+
+ ul {
+ padding: 0;
+ margin: 0;
+ }
+
+ li { display: inline-block; }
+}
+
+.main-nav {
+ margin-top: 52px;
+
+ li {
+ margin-right: 10px;
+
+ a {
+ @include border-radius(5px);
+ font-weight: 900;
+ font-size: 14px;
+ padding: 0.5em 1em;
+ text-shadow: none;
+ text-transform: uppercase;
+ @include transition(all .25s);
+
+ &:hover {
+ background-color: #252525;
+ @include box-shadow(inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1));
+ text-shadow: 0 1px 3px rgba(0,0,0,.5);
+ }
+ }
+
+ &.current {
+
+ a {
+ background-color: #fc0;
+ color: #222;
+ @include box-shadow(inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5));
+ text-shadow: 0 1px 0 rgba(255,255,255,.3);
+ }
+ }
+ }
+}
+
+.mobile-nav {
+
+ ul {
+ overflow: hidden;
+ width: 100%;
+ display: table;
+ }
+
+ a {
+ float: left;
+ width: 100%;
+ background-color: #333;
+ color: #fc0;
+ text-align: center;
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 900;
+ padding: 5px;
+ @include border-radius(5px);
+ }
+
+ li {
+ display: table-cell;
+ width: 20%;
+ padding: 8px 2px;
+ }
+
+ .current {
+
+ a {
+ background-color: #fc0;
+ color: #222;
+ @include box-shadow(inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5));
+ text-shadow: 0 1px 0 rgba(255,255,255,.3);
+ }
+ }
+}
+
+/*
+ * This code is courtesy Ben Balter, modified by Parker Moore for jekyllrb.com
+ * http://ben.balter.com/2014/03/13/pages-anchor-links/
+ */
+.header-link {
+ position: relative;
+ left: 0.5em;
+ opacity: 0;
+ font-size: 0.8em;
+ @include transition(opacity 0.2s ease-in-out 0.1s);
+}
+h2:hover .header-link,
+h3:hover .header-link,
+h4:hover .header-link,
+h5:hover .header-link,
+h6:hover .header-link {
+ opacity: 1;
+}
+
+ at media (max-width: 768px) {
+ .main-nav ul {
+ text-align: right;
+ }
+}
+ at media (max-width: 830px) {
+ .main-nav {
+ .show-on-mobiles { display: inline; }
+ .hide-on-mobiles { display: none; }
+ }
+}
+
+/* Footer */
+
+footer {
+ background-color: #212121;
+ font-size: 16px;
+ padding-bottom: 5px;
+ color: #c0c0c0;
+ margin-top: 40px;
+
+ a {
+ color: #fff;
+
+ &:hover {
+
+ img { opacity: 1; }
+ }
+ }
+
+ .align-right {
+
+ p { display: inline-block; }
+ }
+
+ img {
+ display: inline-block;
+ position: relative;
+ top: 8px;
+ margin-left: 5px;
+ opacity: .8;
+ padding: 1px;
+ @include transition(opacity .2s);
+ }
+}
+
+ at media (max-width: 568px) {
+ footer {
+ .one-third p { margin-bottom: 0; }
+ .two-thirds p { margin-top: -20px; }
+ }
+}
+
+/* Intro */
+
+.intro {
+
+ .unit { padding: 10px 0 40px; }
+
+ p {
+ font-size: 1.75em;
+ line-height: 1em;
+ margin: 0;
+ }
+}
+
+ at media (min-width: 569px) {
+ .intro p { font-size: 3.2em; }
+}
+
+/* Quickstart */
+
+.quickstart {
+ background-color: #3F1F1F;
+ color: #fff;
+ margin: 60px 0;
+ @include box-shadow(inset 0 3px 10px rgba(0,0,0,.4));
+
+ .content { padding: 0; }
+
+ h3 {
+ font-size: 24px;
+ line-height: 24px;
+ margin-top: 20px;
+ text-shadow: 0 1px 3px rgba(0,0,0,.8);
+ }
+
+ .code {
+ font-size: 12px;
+ display: block;
+ margin: 0 0 -30px;
+ }
+}
+
+ at media (min-width: 768px) {
+ .quickstart {
+
+ .code {
+ font-size: 18px;
+ margin: -30px 0;
+ float: right;
+ }
+
+ h3 {
+ margin: 50px 0 0;
+ text-align: center;
+ }
+ }
+}
+
+/* Code */
+
+.quickstart {
+
+ .code {
+ display: block;
+ padding: 0;
+ font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
+ line-height: 1.3em;
+
+ .title {
+ display: block;
+ text-align: center;
+ margin: 0 20px;
+ padding: 5px 0;
+ @include border-radius(5px 5px 0 0);
+ @include box-shadow(0 3px 10px rgba(0,0,0,.5));
+ font: 400 16px/24px 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ color: #444;
+ text-shadow: 0 1px 0 rgba(255,255,255,.5);
+ background-color: #f7f7f7;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjclIi [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f7f7), color-stop(7%, #cfcfcf), to(#aaaaaa));
+ background-image: -webkit-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
+ background-image: -moz-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
+ background-image: -o-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
+ background-image: linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#aaaaaa',GradientType=0 );
+ border-bottom: 1px solid #111;
+ }
+
+ .shell {
+ padding: 20px;
+ text-shadow: none;
+ margin: 0 20px;
+ background-color: #171717;
+ @include border-radius(0 0 5px 5px);
+ @include box-shadow(0 5px 30px rgba(0,0,0,.3));
+ }
+
+ .line {
+ display: block;
+ margin: 0;
+ padding: 0;
+
+ span { display: inline-block; }
+ }
+
+ .path {
+ color: #87ceeb;
+ @include user-select(none);
+ }
+
+ .prompt {
+ color: #cd5c5c;
+ -webkit-user-select: none; /* Chrome all / Safari all */
+ -moz-user-select: none; /* Firefox all */
+ -ms-user-select: none; /* IE 10+ */
+ -o-user-select: none;
+ user-select: none;
+ }
+
+ .command { color: #f0e68c; }
+
+ .output { color: #888; }
+ }
+}
+
+/* Free Hosting */
+
+.free-hosting {
+
+ .pane {
+ background-color: #3e3e3e;
+ @include border-radius(10px);
+ text-shadow: none;
+ position: relative;
+ padding: 0 20px 30px;
+ }
+
+ img {
+ margin: -30px 0 0;
+ width: 180px;
+ height: 150px;
+ }
+
+ h2 { font-size: 28px; }
+
+ p,
+ a { font-size: 16px; }
+
+ p { margin: .75em 0; }
+}
+
+ at media (min-width: 768px) {
+ .free-hosting {
+
+ img {
+ float: left;
+ margin: -20px -30px -30px -50px;
+ width: 300px;
+ height: 251px;
+ }
+
+ .pane-content {
+ margin-top: 35px;
+ padding-right: 30px;
+ }
+
+ p,
+ a { font-size: 18px; }
+
+ .pane:after {
+ content: " ";
+ float: right;
+ background: url(../img/footer-arrow.png) top left no-repeat;
+ width: 73px;
+ height: 186px;
+ position: absolute;
+ right: 0;
+ bottom: -30px;
+ }
+ }
+}
+
+/* Article - Used for both docs and news */
+
+
+article {
+ background-color: #444;
+ @include border-radius(10px);
+ padding: 20px;
+ margin: 0 10px;
+ @include box-shadow(0 3px 10px rgba(0,0,0,.1));
+ font-size: 16px;
+}
+
+ at media (max-width: 480px) {
+ article ul { padding-left: 20px; }
+}
+
+ at media (max-width: 568px) {
+ article { margin: 0; }
+}
+
+ at media (min-width: 768px) {
+ article {
+ padding: 40px 40px 30px;
+ font-size: 21px;
+ }
+}
+
+/* Right-side nav - used by both docs and news */
+
+aside {
+ padding-top: 30px;
+
+ h4 {
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 700;
+ padding: 0 0 10px 30px;
+ margin-left: -30px;
+ display: inline-block;
+ border-bottom: 1px solid #c00;
+ }
+
+ ul {
+ padding-left: 0;
+
+ &:first-child { margin-top: 0; }
+ }
+
+ li {
+ list-style-type: none;
+
+ a {
+ font-size: 16px;
+ position: relative
+ }
+
+ &.current a:before {
+ content: "";
+ border-color: transparent transparent transparent #444;
+ border-style: solid;
+ border-width: 10px;
+ width: 0;
+ height: 0;
+ position: absolute;
+ top: 0;
+ left: -30px;
+ }
+ }
+}
+
+/* Documentation */
+
+.docs {
+
+ article { min-height: 800px; }
+
+ .content { padding: 0; }
+}
+
+.section-nav {
+ text-align: center;
+ padding-top: 40px;
+ position: relative;
+ background: url(../img/article-footer.png) top center no-repeat;
+ margin: 40px -20px 10px;
+
+ > div { width: 49.5%; }
+
+ a,
+ span {
+ color: #fff;
+ font-size: 16px;
+ text-transform: uppercase;
+ font-weight: 700;
+ padding: 8px 12px 10px;
+ @include border-radius(5px);
+ /*border: 1px solid #333;*/
+ @include box-shadow(0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5));
+ background-color: #767676;
+ }
+
+ a:hover {
+ color: #fff;
+ background-color: #888;
+ }
+
+ .next,
+ .prev { position: relative; }
+
+ .next:after,
+ .prev:before {
+ font-size: 36px;
+ color: #222;
+ font-weight: 900;
+ text-shadow: 0 1px 0 rgba(255,255,255,.4);
+ position: absolute;
+ top: -7px;
+ }
+
+ .next:after {
+ content: '\203A';
+ right: 10px;
+ }
+
+ .prev:before {
+ content: '\2039';
+ left: 10px;
+ }
+
+ .prev,
+ .prev:hover { padding-left: 30px; }
+
+ .next,
+ .next:hover { padding-right: 30px; }
+
+ .disabled {
+ opacity: .5;
+ cursor: default;
+ }
+}
+
+.improve {
+ padding-top: 25px;
+ font-size: 16px;
+ a {
+ color: #999;
+ }
+}
+
+.docs-nav-mobile select {
+ color: #000;
+ width: 100%;
+}
+
+/* News */
+
+article h2:first-child { margin-top: 0; }
+
+.post-category,
+.post-meta {
+ display: inline-block;
+ vertical-align: middle;
+ font-size: .8em;
+}
+
+.post-category {
+ display: inline-block;
+ margin-left: -30px;
+ padding: 6px 10px 8px;
+ padding-left: 50px;
+ @include border-radius(0 5px 5px 0);
+ position: relative;
+ @include box-shadow(0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3));
+ background-color: #9e2812;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#9e2812), to(#6f0d0d));
+ background-image: -webkit-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
+ background-image: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
+ background-image: -o-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
+ background-image: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
+
+ &:before {
+ content: "";
+ position: absolute;
+ top: -10px;
+ left: 0;
+ border-color: transparent #6f0d0d #6f0d0d transparent;
+ border-style: solid;
+ border-width: 5px;
+ width: 0;
+ height: 0;
+ }
+}
+
+.post-content img { max-width: 100% }
+
+.label {
+ float: left;
+ text-transform: uppercase;
+ font-weight: 700;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.5);
+}
+
+ at media (max-width: 568px) {
+ .post-category { padding-left: 30px; }
+}
+
+ at media (min-width: 768px) {
+ .post-category { margin-left: -50px; }
+}
+
+.avatar {
+ @include border-radius(3px);
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.post-meta {
+ padding: 5px 0;
+ color: #c0c0c0;
+ font-weight: 600;
+ text-shadow: 0 -1px 0 #000;
+}
+
+.post-date,
+.post-author { margin-left: 10px; }
+
+.news article + article {
+ margin-top: -10px;
+ @include border-radius(0 0 10px 10px);
+ border-top: 1px solid #555;
+ @include box-shadow(0 -1px 0 #2f2f2f);
+}
+
+/* Code Highlighting */
+
+
+pre,
+code {
+ white-space: pre;
+ display: inline-block;
+ margin: 0;
+ font: 14px/1.8em Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
+ padding: 0 0.5em;
+}
+
+ at media (min-width: 768px) {
+ pre, code { font-size: 16px; }
+}
+
+.highlight,
+p > pre,
+p > code,
+p > nobr > code,
+li > code,
+h5 > code,
+.note > code {
+ background-color: #2b2b2b;
+ color: #fff;
+ @include border-radius(5px);
+ @include box-shadow(inset 0 1px 10px rgba(0,0,0,.3),
+ 0 1px 0 rgba(255,255,255,.1),
+ 0 -1px 0 rgba(0,0,0,.5));
+}
+
+.note code {
+ background-color: #333;
+ background-color: rgba(0,0,0,0.2);
+ margin-left: 2.5px;
+ margin-right: 2.5px;
+ font-size: 0.8em;
+}
+
+.highlight {
+ margin: 1em 0;
+ padding: 10px 0;
+ width: 100%;
+ overflow: auto;
+}
+
+/* HTML Elements */
+
+h1, h2, h3, h4, h5, h6 { margin: 0; }
+
+a {
+ color: #fc0;
+ text-decoration: none;
+ @include transition(all .25s);
+
+ &:hover { color: #f90; }
+}
+
+strong { font-weight: 700; }
+
+p { line-height: 1.5em; }
+
+.left { float: left; }
+.right { float: right; }
+.align-right { text-align: right; }
+.align-left { text-align: left; }
+.align-center { text-align: center; }
+
+/* Article HTML */
+
+article {
+
+ h2, h3, h4, h5, h6 { margin: 1em 0; }
+
+ h4 { color: #fff; }
+
+ ul li {
+
+ p { margin: 0; }
+
+ blockquote { margin: 10px 0; }
+ }
+
+ ul li,
+ ol li {
+ line-height: 1.5em;
+ margin-bottom: 0.5em;
+ }
+
+}
+
+h5, h6 {
+ font-size: 1em;
+ font-style: italic;
+}
+
+blockquote {
+ border-left: 2px solid #777;
+ padding-left: 20px;
+ font-style: italic;
+ font-size: 18px;
+ font-weight: 500;
+}
+
+
+/* Tables */
+
+table {
+ width: 100%;
+ background-color: #555;
+ margin: .5em 0;
+ @include border-radius(5px);
+ @include box-shadow(0 1px 3px rgba(0,0,0,.3));
+}
+
+thead {
+ @include border-top-left-radius(5px);
+ @include border-top-right-radius(5px);
+ color: #fff;
+ background-color: #3a3a3a;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzNhM2EzYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#3a3a3a), to(#1e1e1e));
+ background-image: -webkit-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
+ background-image: -moz-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
+ background-image: -o-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
+ background-image: linear-gradient(to bottom, #3a3a3a 0%,#1e1e1e 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3a3a3a', endColorstr='#1e1e1e',GradientType=0 );
+
+ th {
+ position: relative;
+ @include box-shadow(inset 0 1px 0 rgba(255,255,255,.1));
+
+ &:first-child {
+ @include border-top-left-radius(5px);
+ }
+
+ &:last-child {
+ @include border-top-right-radius(5px);
+ }
+ }
+}
+
+td { padding: .5em .75em; }
+
+td p { margin: 0; }
+
+th {
+ text-transform: uppercase;
+ font-size: 16px;
+ padding: .5em .75em;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.9);
+ color: #888;
+}
+
+tbody td {
+ border-top: 1px solid #747474;
+ border-top: 1px solid rgba(0,0,0,.1);
+ @include box-shadow(inset 0 1px 0 rgba(255,255,255,.1));
+ background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3Rv [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,0.1)), to(rgba(255,255,255,0)));
+ background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
+ background-image: -moz-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
+ background-image: -o-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
+ background-image: linear-gradient(to bottom, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1affffff', endColorstr='#00ffffff',GradientType=0 );
+
+ p {
+ font-size: 16px;
+
+ code { font-size: 14px; }
+ }
+}
+
+code.option,
+th .option,
+code.filter,
+th .filter {
+ color: #50B600;
+}
+
+code.flag,
+th .flag,
+code.output,
+th .output {
+ color: #049DCE;
+}
+
+code.option,
+code.flag,
+code.filter,
+code.output {
+ margin-bottom: 2px;
+}
+
+/* Note types */
+
+.note {
+ margin: 30px 0;
+ margin-left: -30px;
+ padding: 20px 20px 24px;
+ padding-left: 50px;
+ @include border-radius(0 5px 5px 0);
+ position: relative;
+ @include box-shadow(0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3));
+ background-color: #7e6d42;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdlNmQ0MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#7e6d42), to(#5c4e35));
+ background-image: -webkit-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
+ background-image: -moz-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
+ background-image: -o-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
+ background-image: linear-gradient(to bottom, #7e6d42 0%,#5c4e35 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7e6d42', endColorstr='#5c4e35',GradientType=0 );
+}
+
+ at media (max-width: 568px) {
+ .note { margin-right: -30px; }
+}
+
+ at media (min-width: 768px) {
+ .note { margin-left: -50px; }
+}
+
+.note {
+ &:before {
+ content: "";
+ position: absolute;
+ top: -10px;
+ left: 0;
+ border-color: transparent #222 #222 transparent;
+ border-style: solid;
+ border-width: 5px;
+ width: 0;
+ height: 0;
+ }
+
+ h5,
+ p {
+ margin: 0;
+ color: #fff;
+ }
+
+ h5 {
+ line-height: 1.5em;
+ font-weight: 900;
+ font-style: normal;
+ }
+
+ p {
+ font-weight: 400;
+ font-size: .75em;
+ }
+
+ &:after {
+ content: '\2605';
+ color: #fc0;
+ position: absolute;
+ top: 14px;
+ left: 14px;
+ font-size: 28px;
+ font-weight: 700;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.5);
+ }
+}
+
+.info {
+ background-color: #0389aa;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAzODlhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#0389aa), to(#00617f));
+ background-image: -webkit-linear-gradient(top, #0389aa 0%, #00617f 100%);
+ background-image: -moz-linear-gradient(top, #0389aa 0%, #00617f 100%);
+ background-image: -o-linear-gradient(top, #0389aa 0%, #00617f 100%);
+ background-image: linear-gradient(to bottom, #0389aa 0%,#00617f 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0389aa', endColorstr='#00617f',GradientType=0 );
+}
+
+.warning {
+ background-color: #9e2812;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#9e2812), to(#6f0d0d));
+ background-image: -webkit-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
+ background-image: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
+ background-image: -o-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
+ background-image: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
+}
+
+.unreleased {
+ background-color: #cd9239;
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2NkOTIzOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIH [...]
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(205,146,57,1)), to(rgba(162,117,40,1)));
+ background-image: -webkit-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
+ background-image: -moz-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
+ background-image: -o-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
+ background-image: linear-gradient(to bottom, rgba(205,146,57,1) 0%,rgba(162,117,40,1) 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cd9239', endColorstr='#a27528',GradientType=0 );
+}
+
+.info:before { border-color: transparent #00617f #00617f transparent; }
+
+.warning:before { border-color: transparent #6f0d0d #6f0d0d transparent; }
+
+.unreleased:before { border-color: transparent #664719 #664719 transparent; }
+
+.info:after {
+ content: '\24D8';
+ color: #fff;
+ position: absolute;
+ top: 15px;
+ left: 15px;
+ font-size: 28px;
+ font-weight: 700;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.5);
+}
+
+.warning:after {
+ content: '\203C';
+ color: #fc0;
+ position: absolute;
+ top: 15px;
+ left: 15px;
+ font-size: 32px;
+ font-weight: 700;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.5);
+}
+
+.unreleased:after {
+ content: '\2692';
+ color: #2b2a12;
+ position: absolute;
+ top: 8px;
+ left: 15px;
+ font-size: 38px;
+ font-weight: 700;
+ text-shadow: 0 1px 0 rgba(255,255,255,.25);
+}
+
+/* Responsive tables */
+
+ at media (max-width: 768px) {
+ .mobile-side-scroller {
+ overflow-x: scroll;
+ margin: 0 -40px;
+ padding: 0 10px;
+ }
+}
+
+
+.show-on-mobiles {
+ display: none;
+}
+
+ at media screen and (max-width: 568px) {
+ .show-on-mobiles {
+ display: block !important;
+ }
+ a .show-on-mobiles {
+ display: inline !important;
+ }
+}
+
+
+/* Helper class taken from Bootstrap.
+ Hides an element to all devices except screen readers.
+*/
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
diff --git a/site/css/screen.css b/site/css/screen.css
deleted file mode 100644
index c49c94a..0000000
--- a/site/css/screen.css
+++ /dev/null
@@ -1,31 +0,0 @@
----
----
-
-{% capture screen %}
-/* *\
- * $normalize.css *
-\* */
-{% include css/normalize.css %}
-/* *\
- * $gridism.css *
-\* */
-{% include css/gridism.css %}
-/* *\
- * $style.css *
-\* */
-{% include css/style.css %}
-/* *\
- * $pygments.css *
-\* */
-{% include css/pygments.css %}
-/* *\
- * $font-awesome.css *
-\* */
-{% include css/font-awesome.css %}
-{% endcapture %}
-
-{% if site.GH_ENV %}
- {{ screen | strip_newlines | remove: ' ' }}
-{% else %}
- {{ screen }}
-{% endif %}
diff --git a/site/css/screen.scss b/site/css/screen.scss
new file mode 100644
index 0000000..2eff7f8
--- /dev/null
+++ b/site/css/screen.scss
@@ -0,0 +1,9 @@
+---
+---
+
+ at import "mixins";
+ at import "normalize";
+ at import "gridism";
+ at import "pygments";
+ at import "font-awesome";
+ at import "style";
diff --git a/site/docs/assets.md b/site/docs/assets.md
deleted file mode 100644
index 41e8b92..0000000
--- a/site/docs/assets.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-layout: docs
-title: Assets
-prev_section: datafiles
-next_section: migrations
-permalink: /docs/assets/
----
-
-Jekyll provides built-in support for Sass and CoffeeScript. In order to use
-them, create a file with the proper extension name (one of `.sass`, `.scss`,
-or `.coffee`) and start the file with two lines of triple dashes, like this:
-
-{% highlight sass %}
----
----
-
-// start content
-.my-definition
- font-size: 1.2em
-{% endhighlight %}
-
-Jekyll treats these files the same as a regular page, in that the output file
-will be placed in the same directory that it came from. For instance, if you
-have a file named `css/styles.scss` in your site's source folder, Jekyll
-will process it and put it in your site's destination folder under
-`css/styles.css`.
-
-## Sass/SCSS
-
-Jekyll allows you to customize your Sass conversion in certain ways.
-
-If you are using Sass `@import` statements, you'll need to ensure that your
-`sass_dir` is set to the base directory that contains your Sass files. You
-can do that thusly:
-
-{% highlight yaml %}
-sass:
- sass_dir: _sass
-{% endhighlight %}
-
-The Sass converter will default the `sass_dir` configuration option to
-`_sass`.
-
-<div class="note info">
- <h5>The <code>sass_dir</code> is only used by Sass</h5>
- <p>
-
- Note that the `sass_dir` becomes the load path for Sass imports,
- nothing more. This means that Jekyll does not know about these files
- directly, so any files here should not contain the YAML front matter as
- described above nor will they be transformed as described above. This
- folder should only contain imports.
-
- </p>
-</div>
-
-You may also specify the output style with the `style` option in your
-`_config.yml` file:
-
-{% highlight yaml %}
-sass:
- style: :compressed
-{% endhighlight %}
-
-These are passed to Sass, so any output style options Sass supports are valid
-here, too.
diff --git a/site/docs/collections.md b/site/docs/collections.md
deleted file mode 100644
index 863347c..0000000
--- a/site/docs/collections.md
+++ /dev/null
@@ -1,259 +0,0 @@
----
-layout: docs
-title: Collections
-prev_section: variables
-next_section: datafiles
-permalink: /docs/collections/
----
-
-<div class="note warning">
- <h5>Collections support is unstable and may change</h5>
- <p>
- This is an experimental feature and that the API may likely change until the feature stabilizes.
- </p>
-</div>
-
-Not everything is a post or a page. Maybe you want to document the various methods in your open source project, members of a team, or talks at a conference. Collections allow you to define a new type of document that behave like Pages or Posts do normally, but also have their own unique properties and namespace.
-
-## Using Collections
-
-### Step 1: Tell Jekyll to read in your collection
-
-Add the following to your site's `_config.yml` file, replacing `my_collection` with the name of your collection:
-
-{% highlight yaml %}
-collections:
-- my_collection
-{% endhighlight %}
-
-You can optionally specify metadata for your collection in the configuration:
-
-{% highlight yaml %}
-collections:
- my_collection:
- foo: bar
-{% endhighlight %}
-
-### Step 2: Add your content
-
-Create a corresponding folder (e.g. `<source>/_my_collection`) and add documents.
-YAML front-matter is read in as data if it exists, if not, then everything is just stuck in the Document's `content` attribute.
-
-Note: the folder must be named identical to the collection you defined in you config.yml file, with the addition of the preceding `_` character.
-
-### Step 3: Optionally render your collection's documents into independent files
-
-If you'd like Jekyll to create a public-facing, rendered version of each document in your collection, set the `output` key to `true` in your collection metadata in your `_config.yml`:
-
-{% highlight yaml %}
-collections:
- my_collection:
- output: true
-{% endhighlight %}
-
-This will produce a file for each document in the collection.
-For example, if you have `_my_collection/some_subdir/some_doc.md`,
-it will be rendered using Liquid and the Markdown converter of your
-choice and written out to `<dest>/my_collection/some_subdir/some_doc.html`.
-
-As for posts with [Permalinks](../permalinks/), document URL can be customized by setting a `permalink` metadata to the collection:
-
-{% highlight yaml %}
-collections:
- my_collection:
- output: true
- permalink: /awesome/:path/
-{% endhighlight %}
-
-For example, if you have `_my_collection/some_subdir/some_doc.md`, it will be written out to `<dest>/awesome/some_subdir/some_doc/index.html`.
-
-<div class="mobile-side-scroller">
-<table>
- <thead>
- <tr>
- <th>Variable</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- <p><code>collection</code></p>
- </td>
- <td>
- <p>Label of the containing collection</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>path</code></p>
- </td>
- <td>
- <p>Path to the document relative to the collection's directory</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>output_ext</code></p>
- </td>
- <td>
- <p>Extension of the output file</p>
- </td>
- </tr>
- </tbody>
-</table>
-</div>
-
-## Liquid Attributes
-
-### Collections
-
-Each collection is accessible via the `site` Liquid variable. For example, if you want to access the `albums` collection found in `_albums`, you'd use `site.albums`. Each collection is itself an array of documents (e.g. `site.albums` is an array of documents, much like `site.pages` and `site.posts`). See below for how to access attributes of those documents.
-
-The collections are also available under `site.collections`, with the metadata you specified in your `_config.yml` (if present) and the following information:
-
-<div class="mobile-side-scroller">
-<table>
- <thead>
- <tr>
- <th>Variable</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- <p><code>label</code></p>
- </td>
- <td>
- <p>
- The name of your collection, e.g. <code>my_collection</code>.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>docs</code></p>
- </td>
- <td>
- <p>
- An array of <a href="#documents">documents</a>.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>relative_directory</code></p>
- </td>
- <td>
- <p>
- The path to the collections's source directory, relative to the site source.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>directory</code></p>
- </td>
- <td>
- <p>
- The full path to the collections's source directory.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>output</code></p>
- </td>
- <td>
- <p>
- Whether the collection's documents will be output as individual files.
- </p>
- </td>
- </tr>
- </tbody>
-</table>
-</div>
-
-
-### Documents
-
-In addition to any YAML front-matter provided in the document's corresponding file, each document has the following attributes:
-
-<div class="mobile-side-scroller">
-<table>
- <thead>
- <tr>
- <th>Variable</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- <p><code>content</code></p>
- </td>
- <td>
- <p>
- The (unrendered) content of the document. If no YAML front-matter is provided,
- this is the entirety of the file contents. If YAML front-matter
- is used, then this is all the contents of the file after the terminating
- `---` of the front-matter.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>output</code></p>
- </td>
- <td>
- <p>
- The rendered output of the document, based on the <code>content</code>.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>path</code></p>
- </td>
- <td>
- <p>
- The full path to the document's source file.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>relative_path</code></p>
- </td>
- <td>
- <p>
- The path to the document's source file relative to the site source.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>url</code></p>
- </td>
- <td>
- <p>
- The URL of the rendered collection. The file is only written to the
- destination when the name of the collection to which it belongs is
- included in the <code>render</code> key in the site's configuration file.
- </p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>collection</code></p>
- </td>
- <td>
- <p>
- The name of the document's collection.
- </p>
- </td>
- </tr>
- </tbody>
-</table>
-</div>
diff --git a/site/docs/drafts.md b/site/docs/drafts.md
deleted file mode 100644
index 959964d..0000000
--- a/site/docs/drafts.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-layout: docs
-title: Working with drafts
-prev_section: posts
-next_section: pages
-permalink: /docs/drafts/
----
-
-Drafts are posts without a date. They're posts you're still working on and don't want to
-publish yet. To get up and running with drafts, create a `_drafts` folder in your site's
-root (as described in the [site structure](/docs/structure/) section) and create your
-first draft:
-
-{% highlight text %}
-|-- _drafts/
-| |-- a-draft-post.md
-{% endhighlight %}
-
-To preview your site with drafts, simply run `jekyll serve` or `jekyll build` with
-the `--drafts` switch. Each will be assigned the value modification time of the draft file
-for its date, and thus you will see currently edited drafts as the latest posts.
diff --git a/site/docs/permalinks.md b/site/docs/permalinks.md
deleted file mode 100644
index 7a69e95..0000000
--- a/site/docs/permalinks.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-layout: docs
-title: Permalinks
-prev_section: templates
-next_section: pagination
-permalink: /docs/permalinks/
----
-
-Jekyll supports a flexible way to build your site’s URLs. You can specify the
-permalinks for your site through the [Configuration](../configuration/) or in the
-[YAML Front Matter](../frontmatter/) for each post. You’re free to choose one of
-the built-in styles to create your links or craft your own. The default style is
-`date`.
-
-Permalinks are constructed by creating a template URL where dynamic elements are
-represented by colon-prefixed keywords. For example, the default `date`
-permalink is defined as `/:categories/:year/:month/:day/:title.html`.
-
-## Template variables
-
-<div class="mobile-side-scroller">
-<table>
- <thead>
- <tr>
- <th>Variable</th>
- <th>Description</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- <p><code>year</code></p>
- </td>
- <td>
- <p>Year from the Post’s filename</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>month</code></p>
- </td>
- <td>
- <p>Month from the Post’s filename</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>i_month</code></p>
- </td>
- <td>
- <p>Month from the Post’s filename without leading zeros.</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>day</code></p>
- </td>
- <td>
- <p>Day from the Post’s filename</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>i_day</code></p>
- </td>
- <td>
- <p>Day from the Post’s filename without leading zeros.</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>short_year</code></p>
- </td>
- <td>
- <p>Year from the Post’s filename without the century.</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>title</code></p>
- </td>
- <td>
- <p>Title from the Post’s filename</p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>categories</code></p>
- </td>
- <td>
- <p>
- The specified categories for this Post. Jekyll automatically parses
- out double slashes in the URLs, so if no categories are present, it
- will ignore this.
- </p>
- </td>
- </tr>
- </tbody>
-</table>
-</div>
-
-## Built-in permalink styles
-
-<div class="mobile-side-scroller">
-<table>
- <thead>
- <tr>
- <th>Permalink Style</th>
- <th>URL Template</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- <p><code>date</code></p>
- </td>
- <td>
- <p><code>/:categories/:year/:month/:day/:title.html</code></p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>pretty</code></p>
- </td>
- <td>
- <p><code>/:categories/:year/:month/:day/:title/</code></p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>none</code></p>
- </td>
- <td>
- <p><code>/:categories/:title.html</code></p>
- </td>
- </tr>
- </tbody>
-</table>
-</div>
-
-## Permalink style examples
-
-Given a post named: `/2009-04-29-slap-chop.textile`
-
-<div class="mobile-side-scroller">
-<table>
- <thead>
- <tr>
- <th>URL Template</th>
- <th>Resulting Permalink URL</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>
- <p>None specified, or <code>permalink: date</code></p>
- </td>
- <td>
- <p><code>/2009/04/29/slap-chop.html</code></p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>pretty</code></p>
- </td>
- <td>
- <p><code>/2009/04/29/slap-chop/index.html</code></p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>/:month-:day-:year/:title.html</code></p>
- </td>
- <td>
- <p><code>/04-29-2009/slap-chop.html</code></p>
- </td>
- </tr>
- <tr>
- <td>
- <p><code>/blog/:year/:month/:day/:title</code></p>
- </td>
- <td>
- <p><code>/blog/2009/04/29/slap-chop/index.html</code></p>
- </td>
- </tr>
- </tbody>
-</table>
-</div>
diff --git a/site/docs/troubleshooting.md b/site/docs/troubleshooting.md
deleted file mode 100644
index c0cc9fe..0000000
--- a/site/docs/troubleshooting.md
+++ /dev/null
@@ -1,147 +0,0 @@
----
-layout: docs
-title: Troubleshooting
-prev_section: deployment-methods
-next_section: sites
-permalink: /docs/troubleshooting/
----
-
-If you ever run into problems installing or using Jekyll, here are a few tips
-that might be of help. If the problem you’re experiencing isn’t covered below,
-please [report an issue]({{site.help_url}}/issues/new) so the
-Jekyll community can make everyone’s experience better.
-
-## Installation Problems
-
-If you encounter errors during gem installation, you may need to install
-the header files for compiling extension modules for ruby 1.9.1. This
-can be done on Ubuntu or Debian by running:
-
-{% highlight bash %}
-sudo apt-get install ruby1.9.1-dev
-{% endhighlight %}
-
-On Red Hat, CentOS, and Fedora systems you can do this by running:
-
-{% highlight bash %}
-sudo yum install ruby-devel
-{% endhighlight %}
-
-On [NearlyFreeSpeech](http://nearlyfreespeech.net/) you need to run the
-following commands before installing Jekyll:
-
-{% highlight bash %}
-export GEM_HOME=/home/private/gems
-export GEM_PATH=/home/private/gems:/usr/local/lib/ruby/gems/1.8/
-export PATH=$PATH:/home/private/gems/bin
-export RB_USER_INSTALL='true'
-{% endhighlight %}
-
-On OSX, you may need to update RubyGems:
-
-{% highlight bash %}
-sudo gem update --system
-{% endhighlight %}
-
-If you still have issues, you may need to [use XCode to install Command Line
-Tools](http://www.zlu.me/ruby/os%20x/gem/mountain%20lion/2012/02/21/install-native-ruby-gem-in-mountain-lion-preview.html)
-that will allow you to install native gems using the following command:
-
-{% highlight bash %}
-sudo gem install jekyll
-{% endhighlight %}
-
-To install RubyGems on Gentoo:
-
-{% highlight bash %}
-sudo emerge -av dev-ruby/rubygems
-{% endhighlight %}
-
-On Windows, you may need to install [RubyInstaller
-DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit).
-
-## Problems running Jekyll
-
-On Debian or Ubuntu, you may need to add `/var/lib/gems/1.8/bin/` to your path
-in order to have the `jekyll` executable be available in your Terminal.
-
-## Base-URL Problems
-
-If you are using base-url option like:
-
-{% highlight bash %}
-jekyll serve --baseurl '/blog'
-{% endhighlight %}
-
-… then make sure that you access the site at:
-
-{% highlight bash %}
-http://localhost:4000/blog/index.html
-{% endhighlight %}
-
-It won’t work to just access:
-
-{% highlight bash %}
-http://localhost:4000/blog
-{% endhighlight %}
-
-## Configuration problems
-
-The order of precedence for conflicting [configuration settings](../configuration/)
-is as follows:
-
-1. Command-line flags
-2. Configuration file settings
-3. Defaults
-
-That is: defaults are overridden by options specified in `_config.yml`,
-and flags specified at the command-line will override all other settings
-specified elsewhere.
-
-## Markup Problems
-
-The various markup engines that Jekyll uses may have some issues. This
-page will document them to help others who may run into the same
-problems.
-
-### Maruku
-
-If your link has characters that need to be escaped, you need to use
-this syntax:
-
-{% highlight text %}
-![Alt text](http://yuml.me/diagram/class/[Project]->[Task])
-{% endhighlight %}
-
-If you have an empty tag, i.e. `<script src="js.js"></script>`, Maruku
-transforms this into `<script src="js.js" />`. This causes problems in
-Firefox and possibly other browsers and is [discouraged in
-XHTML.](http://www.w3.org/TR/xhtml1/#C_3) An easy fix is to put a space
-between the opening and closing tags.
-
-### Liquid
-
-The latest version, version 2.0, seems to break the use of `{{ "{{" }}` in
-templates. Unlike previous versions, using `{{ "{{" }}` in 2.0 triggers the
-following error:
-
-{% highlight bash %}
-'{{ "{{" }}' was not properly terminated with regexp: /\}\}/ (Liquid::SyntaxError)
-{% endhighlight %}
-
-### Excerpts
-
-Since v1.0.0, Jekyll has had automatically-generated post excerpts. Since
-v1.1.0, Jekyll also passes these excerpts through Liquid, which can cause
-strange errors where references don't exist or a tag hasn't been closed. If you
-run into these errors, try setting `excerpt_separator: ""` in your
-`_config.yml`, or set it to some nonsense string.
-
-<div class="note">
- <h5>Please report issues you encounter!</h5>
- <p>
- If you come across a bug, please <a href="{{ site.help_url }}/issues/new">create an issue</a>
- on GitHub describing the problem and any work-arounds you find so we can
- document it here for others.
- </p>
-</div>
diff --git a/site/feed.xml b/site/feed.xml
deleted file mode 100644
index 1a683be..0000000
--- a/site/feed.xml
+++ /dev/null
@@ -1,48 +0,0 @@
----
-permalink: /feed.xml
----
-
-<?xml version="1.0" encoding="utf-8"?>
-<rss version="2.0"
- xmlns:content="http://purl.org/rss/1.0/modules/content/"
- xmlns:wfw="http://wellformedweb.org/CommentAPI/"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
- xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
- >
- <channel>
- <title xml:lang="en">Jekyll • Simple, blog-aware, static sites</title>
- <atom:link type="application/atom+xml" href="http://jekyllrb.com/feed.xml" rel="self"/>
- <link>http://jekyllrb.com/</link>
- <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
- <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
- <language>en-US</language>
- <generator>Jekyll v{{ jekyll.version }}</generator>
- <description>Transform your plain text into static websites and blogs.</description>
- <image>
- <description>Transform your plain text into static websites and blogs.</description>
- <url>http://jekyllrb.com/img/logo-rss.png</url>
- <title>Jekyll • Simple, blog-aware, static sites</title>
- <link>http://jekyllrb.com/</link>
- <width>144</width>
- <height>73</height>
- </image>
- {% for post in site.posts %}
- <item>
- <title>{{ post.title | xml_escape}}</title>
- <link>http://jekyllrb.com{{ post.url }}</link>
- <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
- <dc:creator>{{ post.author }}</dc:creator>
- {% for tag in post.tags %}
- <category>{{ tag | xml_escape }}</category>
- {% endfor %}
- {% for cat in post.categories %}
- <category>{{ cat | xml_escape }}</category>
- {% endfor %}
- <guid isPermaLink="true">http://jekyllrb.com{{ post.url }}</guid>
- <description>{{ post.content | xml_escape }}</description>
- </item>
- {% endfor %}
- </channel>
-</rss>
diff --git a/site/fonts/FontAwesome.otf b/site/fonts/FontAwesome.otf
deleted file mode 100644
index 3461e3f..0000000
Binary files a/site/fonts/FontAwesome.otf and /dev/null differ
diff --git a/site/fonts/fontawesome-webfont.eot b/site/fonts/fontawesome-webfont.eot
index 6cfd566..a30335d 100755
Binary files a/site/fonts/fontawesome-webfont.eot and b/site/fonts/fontawesome-webfont.eot differ
diff --git a/site/fonts/fontawesome-webfont.svg b/site/fonts/fontawesome-webfont.svg
index a9f8469..6fd19ab 100755
--- a/site/fonts/fontawesome-webfont.svg
+++ b/site/fonts/fontawesome-webfont.svg
@@ -1,6 +1,6 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<metadata></metadata>
<defs>
<font id="fontawesomeregular" horiz-adv-x="1536" >
@@ -32,473 +32,609 @@
<glyph unicode="∞" horiz-adv-x="1792" />
<glyph unicode="≠" horiz-adv-x="1792" />
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
-<glyph unicode="" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
-<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -2 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h [...]
-<glyph unicode="" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 2 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 - [...]
-<glyph unicode="" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 - [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472 [...]
-<glyph unicode="" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-3 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
-<glyph unicode="" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
-<glyph unicode="" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
-<glyph unicode="" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-13 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 [...]
-<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
-<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t- [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 [...]
-<glyph unicode="" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
-<glyph unicode="" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 - [...]
-<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -2 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 [...]
+<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t [...]
+<glyph unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t2 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q4 [...]
+<glyph unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 2 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 [...]
+<glyph unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -1 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 [...]
+<glyph unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l7 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-4 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v [...]
<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q- [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 [...]
-<glyph unicode="" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22. [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
-<glyph unicode="" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t- [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256 [...]
-<glyph unicode="" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
-<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
-<glyph unicode="" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
-<glyph unicode="" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 - [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
-<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112. [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l- [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
-<glyph unicode="" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
-<glyph unicode="" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
-<glyph unicode="" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
-<glyph unicode="" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
-<glyph unicode="" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
-<glyph unicode="" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 1 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
-<glyph unicode="" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-2 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
-<glyph unicode="" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-1 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
-<glyph unicode="" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 - [...]
-<glyph unicode="" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 [...]
-<glyph unicode="" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -4 [...]
-<glyph unicode="" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v28 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
-<glyph unicode="" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 [...]
-<glyph unicode="" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0. [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t- [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 [...]
-<glyph unicode="" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 - [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-2 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
-<glyph unicode="" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
-<glyph unicode="" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 [...]
-<glyph unicode="" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 [...]
-<glyph unicode="" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q [...]
-<glyph unicode="" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -7 [...]
-<glyph unicode="" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 - [...]
-<glyph unicode="" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90zM256 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM768 960q0 185 131.5 316.5t316.5 131.5q58 0 121.5 -16.5 t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25q0 -39 -23 -106q-47 -134 -164.5 -217.5t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 64v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 576v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1088v256q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM640 640h1024v128h-1024v-128zM1024 128h640v128h-640v-128zM1280 1152h384v128h-384v-128z" />
-<glyph unicode="" horiz-adv-x="1408" d="M5 1241q17 39 59 39h1280q42 0 59 -39q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 160v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 736v384q0 66 47 113t113 47h352v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113v-384h-1792z M640 1280h512v128h-512v-128zM768 512v128h256v-128h-256z" />
-<glyph unicode="" d="M0 -64v448q0 42 40 59q39 17 69 -14l144 -144l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45 v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19l-144 144l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 671q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5zM128 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM256 3q0 53 3.5 103.5 t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 - [...]
-<glyph unicode="" horiz-adv-x="1664" d="M16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l206 -207q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204t-85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88 q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204zM208 1088q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 448q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M115.5 -64.5q-34.5 63.5 21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399l503 -793q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5zM476 384h712l-272 429l-20 31v37v399h-128v-399v-37 l-20 -31z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1 157q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148q4 -48 -10 -97q4 -1 12 -5 l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56l-507 -398l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 1 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 224v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68zM128 256h512v256q0 40 20 88t48 76l316 316v416h-384 v-416q0 -40 -28 -68t-68 -28h-416v-640zM213 1024h299v299zM768 -128h896v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640zM853 640h299v299z" />
-<glyph unicode="" horiz-adv-x="1408" d="M4 1023q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581 q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235q0 -117 -79 -19 [...]
-<glyph unicode="" d="M0 -32v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 0h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20 t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280zM384 0h768v384h-768v-384zM640 928q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t- [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5z" />
-<glyph unicode="" d="M0 64v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 576v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 1088v128q0 26 19 45t45 19h1408 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 128q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 640q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 1152q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM512 32v192 q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -2 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M15 438q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105v-159h-362q-6 36 -6 54zM19 -190 l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88q0 -80 -54.5 -126t-135. [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 544v64q0 14 9 23t23 9h1728q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23zM384 972q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6l-14 2q-50 149 -103 205 q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743q-28 35 -51 80q-48 97 -48 188zM414 154q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q3 [...]
-<glyph unicode="" d="M0 -32v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-1472q-14 0 -23 -9t-9 -23zM0 1405q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5 t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 160v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 544q0 -14 9 -23t23 -9h320 q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 160q0 -14 9 -23t23 -9h320q14 0 2 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M27 160q0 27 18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45t-18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45zM128 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM320 1216l196 60l60 196l60 -196l196 -60l-196 -60 l-60 -196l-60 196zM768 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM1083 1062l107 -107l293 293l-107 107zM1408 768l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98z" />
-<glyph unicode="" horiz-adv-x="1792" d="M64 192q0 26 19 45t45 19v320q0 8 -0.5 35t0 38t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45v-1024q0 -15 -4 -26.5t-13.5 -18.5t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5 q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5zM256 640h384v256h-158q-13 0 -22 -9l-195 -195 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63 q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -28 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5 q-104 0 -194.5 -28.5t-153 -76.5t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -16 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM276 309q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117 q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-1 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M32 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65 t-59.5 -61.5t-24.5 -66q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131zM218 228q0 -70 35 -123.5t [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 64v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45zM128 384q106 0 181 -75t75 -181h1152q0 106 75 181t181 75v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512zM640 640q0 70 21 142 t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142t-21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142zM762 791l77 -80q42 37 55 57h2v-288h-128v-96h384v96h-128v [...]
-<glyph unicode="" horiz-adv-x="1024" d="M0 832q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 320q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="640" d="M64 640q0 26 19 45l448 448q19 19 45 19t45 -19t19 -45v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="640" d="M0 192v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 32v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h608v1152h-640v-1120zM896 0h608q13 0 22.5 9.5t9.5 22.5v1120h-640v-1152z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45zM0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 32v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 1098q0 78 41.5 130t118.5 52h1472 q65 0 112.5 -47t47.5 -113q0 -79 -49 -151t-122 -123q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142. [...]
-<glyph unicode="" d="M0 1217q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122zM19 -80v991h330v-991h-330zM531 -80q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5v-568 h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329z" />
-<glyph unicode="" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M40 736q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18 q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28q-10 0 -18 1.5t- [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 384q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29q-141 221 -141 483zM128 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M320 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM710 241q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91l101 382q6 26 -7.5 48.5t [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5 t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281zM128 640q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104. [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM128 768q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 [...]
-<glyph unicode="" horiz-adv-x="896" d="M1 551l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 -32v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 681q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17 q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88v-672q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68zM256 1312q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5v64 q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64zM768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1280 640h299l-299 299v-299z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 960q0 99 44.5 184.5t117 142t164 89t186.5 32.5t186.5 -32.5t164 -89t117 -142t44.5 -184.5q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47q0 -46 -31.5 -71t-77.5 -25 q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268zM128 960q0 -101 68 -18 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 256q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22zM0 800v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23 t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 608q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 672q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 131q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89 q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 768v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48 q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136q0 -62 -35.5 -111t-92.5 -70 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h64v-1280h-64q-92 0 -158 66t-66 158zM384 -128v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128v-1280h-1024zM640 1152h512v128h-512v-128zM1504 -128v1280h64q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-64z " />
-<glyph unicode="" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM256 480v736q0 26 19 45t45 19h1152q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158zM1408 704h64q80 0 136 56t56 136 t-56 136t-136 56h-64v-384z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 832v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128 q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111zM768 416v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM384 160v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64 q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 416v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 672v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-70 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1536h-1152v-1536zM256 160v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 -192v1280q0 26 19 45t45 19h320v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1152h-256 v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152zM256 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M64 192q0 26 19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128 q-26 0 -45 19t-19 45zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM384 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM896 800q0 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h32v-1280h-32q-92 0 -158 66t-66 158zM352 -128v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160v-1280h-1088zM512 416q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192 q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM640 1152h512v128h-512v-128zM1536 -128v1280h32q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 512v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93l1 -3q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5 t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8z" />
-<glyph unicode="" horiz-adv-x="1664" d="M64 1152l32 128h480l32 128h960l32 -192l-64 -32v-800l128 -192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320zM384 768q0 -53 37.5 -90.5t90.5 -37.5h128v384h-256v-256z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 192q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128z" />
-<glyph unicode="" horiz-adv-x="1024" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM429 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23 l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="1024" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM397 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10 l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="1152" d="M77 224q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM77 608q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23 l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="1152" d="M77 672q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM77 1056q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10 l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="640" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="640" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="1152" d="M77 352q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="1152" d="M77 800q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 288v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113zM128 544q0 -13 9.5 -22.5 t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 96v96h160h1600h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68zM256 416v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113zM384 416q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5 t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM864 112q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16z" />
-<glyph unicode="" horiz-adv-x="1152" d="M0 160v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-832q-66 0 -113 47t-47 113zM128 288q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM512 128 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
-<glyph unicode="" horiz-adv-x="768" d="M0 128v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM96 288q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM288 1136 q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16zM304 128q0 -33 23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z M896 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 832v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136zM896 832v384 q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68 [...]
-<glyph unicode="" horiz-adv-x="1568" d="M0 640q0 66 47 113t113 47t113 -47t47 -113t-47 -113t-113 -47t-113 47t-47 113zM176 1088q0 73 51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5t-51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5zM208 192q0 60 42 102t102 42q59 0 101.5 -42t42.5 -102t-42.5 -102 t-101.5 -42q-60 0 -102 42t-42 102zM608 1280q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM672 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-9 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101 t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19l-512 512q-19 19 -19 45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 496q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218q0 -87 -27 -168q136 -160 136 -398q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86t-170 -47.5t-171.5 -22t-167 -4.5 q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331zM224 320q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5q0 120 -69 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158zM128 224q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64 q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960z" />
-<glyph unicode="" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158zM128 331l256 315q44 53 116 87.5 t140 34.5h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-853zM171 163q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39q0 35 -53 35h-1088q- [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q [...]
+<glyph unicode="" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q- [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 12 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 [...]
+<glyph unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 - [...]
+<glyph unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-38 [...]
+<glyph unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h [...]
+<glyph unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385. [...]
+<glyph unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 3 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150. [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h28 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -1 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t [...]
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 [...]
+<glyph unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 4 [...]
+<glyph unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h [...]
+<glyph unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -6 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t4 [...]
+<glyph unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q2 [...]
+<glyph unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -2 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 4 [...]
+<glyph unicode="" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 [...]
+<glyph unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t- [...]
+<glyph unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216. [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 - [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5 [...]
+<glyph unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q- [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 4 [...]
+<glyph unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-1 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32z [...]
+<glyph unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 - [...]
+<glyph unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -4 [...]
+<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -7 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3. [...]
+<glyph unicode="" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 [...]
+<glyph unicode="" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 [...]
+<glyph unicode="" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22. [...]
+<glyph unicode="" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t- [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -3 [...]
+<glyph unicode="" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -1 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -2 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 [...]
+<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11 [...]
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 - [...]
+<glyph unicode="" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 [...]
+<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t11 [...]
+<glyph unicode="" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q [...]
+<glyph unicode="" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h [...]
+<glyph unicode="" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 2 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t1 [...]
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 15 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-11 [...]
+<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM16 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 [...]
<glyph unicode="" horiz-adv-x="1792" />
<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 461q-8 25 4 48.5t3 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 307q37 121 138 195 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 448q0 26 19 45t45 19h640q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45zM384 896q0 53 37.5 90.5t90.5 37.5t9 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 512q0 212 150 362t362 150h896q212 0 362 -150t150 -362t-150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150t-150 362zM192 448q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23v128 q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128zM1152 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 128v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5zM128 128h1664v896h-1664v-896zM256 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM256 528v96 q0 16 16 16h224q16 0 16 -16v-96q0 -16 -16 -16h-224q-16 0 -16 16zM256 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM512 272v96q0 16 16 16h864q16 0 16 -16v-96q0 -16 -16 -16 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -1 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -1 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM640 32v64q0 14 9 23t23 9h960q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-960 q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1920" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM712 -52l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5 l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5zM1293 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -46 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45l397 -397v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45zM384 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221 q169 -173 169 -509q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 - [...]
-<glyph unicode="" horiz-adv-x="1664" d="M2 900.5q9 27.5 54 34.5l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5z M832 310l59 -31l318 -168l-60 355l-12 66l49 47l257 250l-356 52l-66 10l-30 60l-159 322v-963z" />
-<glyph unicode="" horiz-adv-x="1408" d="M2 561q-5 22 4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 928v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864 q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23zM512 301l595 595h-595v-595zM557 256h595v595z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 64q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136 q0 -52 -26 -96.5t-70 -69.5q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136zM96 64q0 -40 28 -68t68 -28t68 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 448q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23zM16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56l-239 -18l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68 l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204zM128 32q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23zM544 -96v320q0 14 9 23t23 9t23 -9 [...]
-<glyph unicode="" horiz-adv-x="1024" d="M96.5 986q-2.5 15 5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5t-10.5 37.5v45q0 83 65 156.5 t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25zM384 40v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28v-240q0 [...]
-<glyph unicode="" horiz-adv-x="640" d="M0 64v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM128 1152v192q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-192 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
-<glyph unicode="" horiz-adv-x="640" d="M98 1344q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45zM128 64v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1013 713q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h2 [...]
-<glyph unicode="" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1015 -183q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126v-206h [...]
-<glyph unicode="" horiz-adv-x="1920" d="M1.5 146.5q5.5 37.5 30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5zM128 128h768l336 384h-768z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 0v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5 q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143q0 -81 -44.5 -135t-123.5 -54q-41 0 -77 [...]
-<glyph unicode="" horiz-adv-x="1152" d="M0 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45 t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5zM256 704v512q0 132 94 226t226 94t226 -94t94 -226v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226z" />
-<glyph unicode="" horiz-adv-x="1408" d="M13 64q0 13 10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23t-10 -23l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5 t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23zM128 704v128q0 26 19 45t45 [...]
-<glyph unicode="" horiz-adv-x="1280" d="M0 576v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150t-33.5 170.5zM640 79 q119 63 213 137q235 184 235 360v640h-448v-1137z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h1408v1024h-1408v-1024z M384 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288zM1152 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288z" />
-<glyph unicode="" horiz-adv-x="1408" d="M3.5 940q-8.5 25 3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96 q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M36 464l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85 q-3 -1 -9 -1q-14 0 -23 9l-64 64q-17 19 -5 39zM1248 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM346 640q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l102 102q19 19 19 45t-19 45l-307 307l307 307 q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM506 288q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-454 454 q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 544q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19l102 102 q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 736q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-102 102 q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 1408h1408l-128 -1438l-578 -162l-574 162zM262 1114l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674l16 175h-884z" />
-<glyph unicode="" horiz-adv-x="1792" d="M12 75l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208l59 297h1505l-266 -1333l-804 -267z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 0v352q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q- [...]
-<glyph unicode="" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181v-320h736q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28 t-28 68z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM256 640q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362zM384 640q0 -159 112.5 -271.5t271.5 -11 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM512 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM1024 608v192q0 40 28 68t68 28h192 q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
-<glyph unicode="" horiz-adv-x="384" d="M0 96v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h192q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M256 575q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10t9 24q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128zM256 959q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 320q0 -37 32 -56q16 -8 32 -8q17 0 32 9l544 320q32 18 32 55t-32 55l-544 320q-31 19 -64 1 q-32 -19 -32 -56v-640z" />
-<glyph unicode="" horiz-adv-x="1792" d="M54 448.5q0 53.5 37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136t-136 56t-136 -56l-125 126q-37 37 -37 90.5z M342 512q0 -26 19 -45l362 -362q18 -18 45 -18t45 18l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45zM452 512l572 572l316 -316l-572 -572z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h896q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128 z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1024" d="M3 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18z" />
-<glyph unicode="" horiz-adv-x="1024" d="M3 1261q9 19 29 19h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 640q0 -26 19 -45l358 -358q19 -19 45 -19t45 19l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19 t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 128h288l544 544l-288 288l-544 -544v-288zM352 320v56l52 52l152 -152l-52 -52h-56v96h-96zM494 494 q-14 13 3 30l291 291q17 17 30 3q14 -13 -3 -30l-291 -291q-17 -17 -30 -3zM864 1024l288 -288l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM282 320q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59 v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 448q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5t224 23.5v-160 q0 -42 40 -59q12 -5 24 -5q26 0 45 19l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 241v542l512 256v-542zM640 448l256 128l-256 128v-256z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 861q17 35 57 35h640q40 0 57 -35q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 419q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66q-17 -35 -57 -35h-640q-40 0 -57 35z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -14 9 -23t23 -9h960q14 0 23 9t9 23v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960z M512 320v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52t-27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 514v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5 t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t [...]
-<glyph unicode="" horiz-adv-x="1024" d="M0 32v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215 h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1024" d="M52 171l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242 t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t- [...]
-<glyph unicode="" horiz-adv-x="898" d="M0 605v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171 q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22z" />
-<glyph unicode="" horiz-adv-x="1027" d="M4 1360q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103 q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9. [...]
-<glyph unicode="" horiz-adv-x="1280" d="M0 256v128q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315t-126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9 h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23zM487 747h320q106 0 171 62t65 162t-65 162t-171 62h-320v-448z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 672v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111 q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 [...]
-<glyph unicode="" horiz-adv-x="1280" d="M56 0l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89 t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200zM522 182q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30t24.5 40t9.5 51q0 36 -15 [...]
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM384 160q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 416q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 672q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
-<glyph unicode="" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 768v106h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106 h-287zM988 -166l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121v-233h-584v90zM1191 1128h [...]
-<glyph unicode="" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 -150h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287 v106zM988 768v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248v119h121v-233h-584zM1191 104h1 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 - [...]
-<glyph unicode="" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h256q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 - [...]
-<glyph unicode="" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 261q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 1351l192 185h123v-654h165v-114h- [...]
-<glyph unicode="" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 1285q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 327l192 185h123v-654h165v-114h- [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 64v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45zM128 192q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45zM480 64v641q0 25 18 43.5t43 20.5q24 2 76 59 t101 121q68 87 101 120q18 18 31 48t17.5 48.5t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -1 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 448q0 -26 19 -45t45 -19h288q26 0 45 19t19 45v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640zM128 960q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45zM480 447v641q0 26 19 44.5t45 19.5q35 1 158 44 q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76q55 -61 55 -149q-1 -78 -57.5 -135t-134.5 -57h-277q4 -14 8 -24 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 366q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73 q20 84 20 260q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5q-20 -87 -20 -260zM300 551v70h232v-70h-80v-423h-74v423h-78zM396 1313l24 -69t23 -69q35 -103 46 -158v-201h74v2 [...]
-<glyph unicode="" d="M27 260q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99q-26 112 -26 350zM138 509h105v-569h100v569h107v94h-312 v-94zM266 1536h106l71 -263l68 263h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187zM463 43q0 -49 8 -73q12 -37 58 -37q48 0 102 61v-54h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391zM6 [...]
-<glyph unicode="" horiz-adv-x="1408" d="M5 384q-10 17 0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45l164 -286q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17zM536 539q18 32 531 942q25 45 64 45h241q22 0 31 -15q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37 q-10 -15 -32 -15h-239q-42 0 -66 45z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM227 396q8 -13 24 -13h185q31 0 50 36l199 352q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29 l125 -216v-1l-196 -346q-9 -14 0 -28zM638 516q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1l409 723q8 16 0 28q-7 12 -24 12h-187q-30 0 -49 -35z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 96 1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150t-1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58 t-69.5 123q-14 65 -21.5 147.5t-8.5 136.5t-1 150zM640 320q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54t-30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640z" />
-<glyph unicode="" horiz-adv-x="1792" d="M64 558l338 271l494 -305l-342 -285zM64 1099l490 319l342 -285l-494 -304zM407 166v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284l147 96v-108l-490 -293v-1l-1 1l-1 -1v1zM896 524l494 305l338 -271l-489 -319zM896 1133l343 285l489 -319l-338 -270z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -255v736h121v-618h928v618h120v-701l-1 -35v-1h-1132l-35 1h-1zM221 -17v151l707 1v-151zM227 243l14 150l704 -65l-13 -150zM270 563l39 146l683 -183l-39 -146zM395 928l77 130l609 -360l-77 -130zM707 1303l125 86l398 -585l-124 -85zM1136 1510l149 26l121 -697 l-149 -26z" />
-<glyph unicode="" d="M0 69v1142q0 81 58 139t139 58h1142q81 0 139 -58t58 -139v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139zM171 110q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62 q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648zM461 643q0 -124 90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5t-90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5zM1050 1003q0 -29 20 -49t49 -20h174q29 0 49 20t [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM274 640q0 -88 62 -150t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150zM838 640q0 -88 62 -150 t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM309 384h94l104 160h522l104 -160h94l-459 691zM567 608l201 306l201 -306h-402z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 1222q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34 t-6 39.5t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158zM173 285l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -18 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM260 1060q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63 q24 13 39.5 23t31 29t19.5 40q48 267 80 473q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54zM385 384q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 [...]
-<glyph unicode="" horiz-adv-x="1024" d="M78 779v217q91 30 155 84q64 55 103 132q39 78 54 196h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM413 744h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49v181 q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163z" />
-<glyph unicode="" horiz-adv-x="768" d="M3 237q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19t-5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35z" />
-<glyph unicode="" horiz-adv-x="768" d="M3 1043q-8 19 5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19z" />
-<glyph unicode="" horiz-adv-x="1792" d="M64 637q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 544v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 634q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32 q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503zM683 1131q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 -27v557h682v-651zM0 614v565l682 94v-659h-682zM757 -131v661h907v-786zM757 614v669l907 125v-794h-907z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 337v430q0 42 30 72t73 30q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30t-73 30t-30 73zM241 886q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20l-71 -131q107 -55 171 -153.5t64 -215.5 h-925zM245 184v666h918v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78zM455 1092q [...]
-<glyph unicode="" d="M11 -115q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5 t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM112 640q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81t99.5 48l37 13 q4 1 13 3.5t13 4.5q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21zM126 775q302 0 606 80q-120 213 -244 378q-138 -65 -234 -186t-128 -272zM350 134q184 -150 418 -150q132 0 256 52q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-10 [...]
-<glyph unicode="" d="M0 1024q0 159 112.5 271.5t271.5 112.5q130 0 234 -80q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225 t-55.5 273.5q0 73 16 150q-80 104 -80 234zM376 399q0 -92 122 -157.5t291 -65.5q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16 [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 640q0 75 53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41l619 619l2 -3q53 -53 53 -128t-53 -128l-587 -587 q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128zM302 660q0 21 14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15q-4 0 -6 1q-18 2 [...]
-<glyph unicode="" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM160 192q0 -14 9 -23t23 -9h480q14 0 23 9t9 23v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024zM832 576q0 -14 9 -23t23 -9h480q14 0 23 9t9 23 v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640z" />
-<glyph unicode="" horiz-adv-x="1280" d="M0 480q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192 q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43q-40 0 -68 28t-28 68zM416 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 1 [...]
-<glyph unicode="" horiz-adv-x="1024" d="M0 416v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68z M288 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM399.5 766q8.5 -37 24.5 -59l349 -473l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5 t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85z" />
-<glyph unicode="" horiz-adv-x="1792" d="M44 363q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29q-4 -15 -20 -20 l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20zM320 640q0 -117 45.5 -223.5t123 -184t [...]
-<glyph unicode="" d="M0 640q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384z" />
-<glyph unicode="" horiz-adv-x="1792" d="M64 1088v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM128 -64v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM704 704q0 -26 19 -45t45 -19h256 q26 0 45 19t19 45t-19 45t-45 19h-256q-26 0 -45 -19t-19 -45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M32 576q0 26 19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19t19 -45t-19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19 t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M-1 1004q0 11 3 16l4 6q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24 q17 19 38 30q53 26 239 24q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 6 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 391q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5q0 -68 -37 -139.5 t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5zM181 320q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5q-9 96 -89 170t-208.5 109t-274.5 21q-223 [...]
-<glyph unicode="" d="M0 638q0 187 83.5 349.5t229.5 269.5t325 137v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495zM398 -34q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211q-171 -94 -368 -94q-196 0 -367 94zM898 909v485q179 -30 325 -137t229.5 -269.5 t83.5 -349.5q0 -280 -181 -495q-204 99 -330.5 306.5t-126.5 459.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 -211q0 19 13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23 t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 [...]
-<glyph unicode="" horiz-adv-x="1280" d="M21 217v66h1238v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5zM21 354v255h1238v-255h-1238zM21 682v255h1238v-255h-1238zM21 1010v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5v-67h-1238z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 544v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 640q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM448 640q0 33 27 52l448 320q17 12 37 12q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 320q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5zM416 1348q-2 16 6 42 q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455l198 99l58 -114l-256 -128q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42. [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 806q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5 q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237q104 139 172.5 292.5t82.5 226.5q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 1 [...]
-<glyph unicode="" horiz-adv-x="1152" d="M0 608v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31 l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26z" />
-<glyph unicode="" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-1 [...]
-<glyph unicode="" horiz-adv-x="2176" d="M0 576q0 12 38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113q-110 -64 -268 -64h-128v64 h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5zM323 336h29q157 0 273 64h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96zM [...]
-<glyph unicode="" horiz-adv-x="1664" d="M0 796q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5 t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 352q0 -40 28 -68t68 -28h832q40 0 68 28t28 68v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99 q-98 -69 -164 -69t-164 69q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436zM256 928q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13t21.5 -9.5t22.5 -7.5t20.5 -2.5t20. [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM41 640q0 -173 68 -331.5t182.5 -273t273 -182.5t331.5 -68t331.5 68t273 182.5t182.5 273t68 331.5 t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5zM127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM254 1062q105 160 274.5 253.5t367.5 93.5q147 0 280.5 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 455q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360l272 133v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5zM1134 860v172q277 -33 481 -157l140 79l37 -390l-525 114l147 83 q-119 70 -280 99z" />
-<glyph unicode="" horiz-adv-x="2048" d="M0 -128q0 26 20.5 45t48.5 19h1782q28 0 48.5 -19t20.5 -45v-128h-1920v128zM0 1024v128l960 384l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128zM128 0v64q0 26 20.5 45t48.5 19h59v768h256v-768h128v768h256v-768h128v768h256 v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664z" />
-<glyph unicode="" horiz-adv-x="2304" d="M0 1024q0 23 22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31t-22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433 q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31zM512 384l18 316l574 -181q22 -7 48 -7t48 7l574 181l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128z" />
-<glyph unicode="" d="M109 1536q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610l13 -707q-62 11 -105 11 q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287z" />
-<glyph unicode="" horiz-adv-x="1280" d="M111 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5t-59.5 -93 t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131zM297 228q0 -56 23.5 [...]
-<glyph unicode="" horiz-adv-x="1984" d="M0 722q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58 q94 0 160 -66t66 -160q0 -62 -31 -114t-83 -82q5 -33 5 -61q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 [...]
-<glyph unicode="" d="M0 193v894q0 133 94 227t226 94h896q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227zM155 709q0 -37 19.5 -67.5t52.5 -45.5q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54 q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 502q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14 q19 0 32.5 -14t13.5 -33v-54l60 -28l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122zM806 500q0 -80 58 -137t139 -57t138.5 57t57.5 139v122h-150v-126q0 -20 [...]
-<glyph unicode="" horiz-adv-x="1920" d="M0 336v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58l-131 61v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5zM1062 332 v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275h328v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM64 640h704v-704h480q93 0 158.5 65.5t65.5 158.5v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480z " />
-<glyph unicode="" horiz-adv-x="2048" d="M0 271v697h328v286h204v-983h-532zM205 435h123v369h-123v-369zM614 271h205v697h-205v-697zM614 1050h205v204h-205v-204zM901 26v163h328v82h-328v697h533v-942h-533zM1106 435h123v369h-123v-369zM1516 26v163h327v82h-327v697h532v-942h-532zM1720 435h123v369h-123 v-369z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM293 388l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229t-88.5 229t-213.5 95q-74 0 -141 -36h-186v-840z M504 804v277q28 17 70 17q53 0 91 -45t38 -109t-38 -109.5t-91 -45.5q-43 0 -70 15zM636 -39l211 41v206q51 -19 117 -19q125 0 213 95t88 229t-88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101v-636zM847 377 [...]
-<glyph unicode="" horiz-adv-x="2038" d="M41 455q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80 t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 [...]
-<glyph unicode="" d="M0 520q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5 t19.5 -177.5q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302zM333 256q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t [...]
-<glyph unicode="" d="M0 78q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160l151 -152l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5 t-60 145.5zM2 1202q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5t149.5 -87.5l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 [...]
-<glyph unicode="" d="M0 -16v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5q20 0 20 -21v-418l147 -47v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3zM39 15l694 232v1032l-694 -233v-1031zM147 293q6 4 82 92 q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 -96v1088q0 66 47 113t113 47h128q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113zM512 -96v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-163q58 -34 93 -93t35 -128v-768q0 -106 -75 -181 t-181 -75h-864q-66 0 -113 47t-47 113zM640 896h896v256h-160q-40 0 -68 28t-28 68v160h-640v-512zM736 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM736 256q0 [...]
-<glyph unicode="" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM256 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 [...]
-<glyph unicode="" horiz-adv-x="1280" d="M64 1056q0 40 28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68zM416 1152q0 93 65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M0 724q0 80 42 139.5t119 59.5q76 0 141.5 -55.5t100.5 -134t35 -152.5q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152zM256 19q0 86 56 191.5t139.5 192.5t187.5 146t193 59q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45 t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146zM333 1163q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5q0 -60 -19 -113.5t-63 -92.5t-105 [...]
-<glyph unicode="" horiz-adv-x="768" d="M64 1008q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 256v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65zM134 1026l698 -254l698 254l-698 254zM896 -93l640 349v636l-640 -233v-752z" />
-<glyph unicode="" horiz-adv-x="2304" d="M0 96v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70v-400l434 -186q36 -16 57 -48t21 -70v-416q0 -36 -19 -67t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4 l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67zM172 531l404 -173l404 173l-404 173zM640 -96l384 192v314l-384 -164v-342zM647 1219l441 -189l441 189l-441 189zM1152 651l384 165v266l [...]
-<glyph unicode="" horiz-adv-x="2048" d="M0 22v1260h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5 t45.5 113.5q0 144 -190 144h-260v-294zM1137 477q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658q0 -111 57.5 -171.5t166.5 -60.5q63 0 122 32t76 87h221q-100 -307 -427 - [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 254h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5t-56.5 60.5t-79 29.5 t-97 8.5h-371v-787zM301 388v217h189q124 0 124 -113q0 -104 -128 -104h-185zM301 723v184h163q119 0 119 -90q0 -94 -106 -94h-176zM838 538q0 -135 79 -217t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20q-68 0 -104 [...]
-<glyph unicode="" horiz-adv-x="2048" d="M0 764q0 86 61 146.5t146 60.5q73 0 130 -46t73 -117l783 -315q49 29 106 29q14 0 21 -1l173 248q1 114 82 194.5t195 80.5q115 0 196.5 -81t81.5 -196t-81.5 -196.5t-196.5 -81.5l-265 -194q-8 -80 -67.5 -133.5t-138.5 -53.5q-73 0 -130 46t-73 117l-783 315 q-51 -30 -106 -30q-85 0 -146 61t-61 147zM55 764q0 -64 44.5 -108.5t107.5 -44.5q11 0 33 4l-64 26q-33 14 -52.5 44.5t-19.5 66.5q0 50 35.5 85.5t85.5 35.5q20 0 41 -8v1l76 -31q-20 37 -56.5 59t-78.5 22q-63 0 -1 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 693q0 -53 38 -91t92 -38q36 0 66 18l489 -197q10 -44 45.5 -73t81.5 -29q50 0 86.5 34t41.5 83l167 122 q71 0 122 50.5t51 122.5t-51 123t-122 51q-72 0 -122.5 -50.5t-51.5 -121.5l-108 -155q-2 0 -6.5 0.5t-6.5 0.5q-35 0 -67 -19l-489 197q-10 44 -45.5 73t-80.5 29q-54 0 -92 -38t-38 -92zM162 693q0 40 28 68t68 28q27 0 49.5 -1 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M16 970l433 -17l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188zM270.5 158q-3.5 28 4 65t12 55t21.5 64t19 53q78 -12 509 -28l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5 q-11 27 -14.5 55zM294 1124l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5t36 -39.5t32 -35q-47 -63 -265 -435l-317 187zM782 1524l405 -1q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 - [...]
-<glyph unicode="" horiz-adv-x="1984" d="M0 160v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h704q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-928v-128q0 -80 -56 -136 t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23zM160 448q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 768h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-1 [...]
-<glyph unicode="" horiz-adv-x="1984" d="M0 32v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h64q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-64q0 -80 -56 -136t-136 -56 t-136 56t-56 136v64h-928v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23zM160 320q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 640h952l-89 357q [...]
-<glyph unicode="" d="M32 64q0 26 19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45t-19 -45t-45 -19 h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45z" />
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM237 886q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37q159 0 309.5 -34t253.5 -95q21 -12 40 -12 q29 0 50.5 20.5t21.5 51.5q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5zM289 637q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 [...]
-<glyph unicode="" d="M0 11v1258q0 58 40.5 98.5t98.5 40.5h1258q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5zM71 11q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258z M121 11v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 1 [...]
-<glyph unicode="" horiz-adv-x="2304" d="M0 405l17 128q2 9 9 9t9 -9l20 -128l-20 -126q-2 -9 -9 -9t-9 9zM79 405l23 207q0 9 9 9q8 0 10 -9l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10zM169 405l21 245q2 12 12 12q11 0 11 -12l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11zM259 405l21 252q0 13 13 13 q12 0 14 -13l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13zM350 405l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5zM401 159zM442 405l18 380q2 18 18 1 [...]
-<glyph unicode="" d="M0 0v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 384v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 768 v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 1152v128q0 69 103 128t280 93.5t385 34.5t385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-2 [...]
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM257 60q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4 q52 85 107 197q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 [...]
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM233 661h70l164 -661h159l128 485q7 20 10 46q2 16 2 24 h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 4 [...]
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM429 0h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4 h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107h-290v-107h68l189 -2 [...]
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM416 0h327v106h-93v167h137q76 0 118 15q67 23 106.5 87 t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92v-106zM650 386v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15h-119zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 0v192l192 192l128 -128l384 384l320 -320v-320 h-1024zM256 704q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536zM384 192q0 25 8 52q21 63 120 396 v128h128v-128h79q22 0 39 -13t23 -34l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5zM512 192q0 -26 37.5 -45t90.5 -19t90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45zM512 896h128v1 [...]
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 288v192q0 14 9 23t23 9h131l166 167q16 15 35 7 q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23zM762 206.5q1 -26.5 20 -44.5q20 -17 44 -17q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 [...]
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 256v384q0 52 38 90t90 38h384q52 0 90 -38t38 -90 v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90zM960 403v90l265 266q9 9 23 9q4 0 12 -2q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
-<glyph unicode="" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM254 429q-14 19 0 38l226 301q8 11 21 12.5t24 -6.5 l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5zM636 43l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5l-63 10 [...]
-<glyph unicode="" d="M39 1286h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132 t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-1 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 367v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64v-546q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64zM154 511l193 129l-193 129v-258zM216 367l603 -402v359l-334 223zM216 913l269 -180l334 223v359zM624 640 l272 -182l272 182l-272 182zM973 -35l603 402l-269 180l-334 -223v-359zM973 956l334 -223l269 180l-603 402v-359zM1445 640l193 -129v258z" />
-<glyph unicode="" horiz-adv-x="2048" d="M0 407q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5 h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 8 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM128 640q0 -190 90 -361l194 194q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361zM512 640 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM535 -38q171 -90 361 -90t361 90l-194 194q-82 -28 -167 -28t-167 28zM535 1318l194 -194q82 28 16 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348z" />
+<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-2 [...]
+<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248 [...]
+<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136. [...]
+<glyph unicode="" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -1 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16z [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -9 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q [...]
+<glyph unicode="" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 - [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 13 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239 [...]
+<glyph unicode="" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 [...]
+<glyph unicode="" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t- [...]
+<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t- [...]
+<glyph unicode="" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t [...]
+<glyph unicode="" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-2 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 [...]
+<glyph unicode="" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 2 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23z [...]
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 [...]
+<glyph unicode="" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 [...]
+<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-1 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0 [...]
+<glyph unicode="" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l- [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 [...]
+<glyph unicode="" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 [...]
+<glyph unicode="" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -4 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 [...]
+<glyph unicode="" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86 [...]
+<glyph unicode="" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-11 [...]
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q- [...]
+<glyph unicode="" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 4 [...]
+<glyph unicode="" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 [...]
+<glyph unicode="" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69 [...]
+<glyph unicode="" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q [...]
+<glyph unicode="" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 - [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 5 [...]
+<glyph unicode="" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65. [...]
+<glyph unicode="" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 2 [...]
+<glyph unicode="" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 [...]
+<glyph unicode="" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455 [...]
+<glyph unicode="" d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 20 [...]
+<glyph unicode="" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-2 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 - [...]
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q- [...]
+<glyph unicode="" d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42 [...]
+<glyph unicode="" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h- [...]
+<glyph unicode="" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 [...]
+<glyph unicode="" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 [...]
+<glyph unicode="" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 1 [...]
+<glyph unicode="" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q [...]
+<glyph unicode="" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 - [...]
+<glyph unicode="" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-6 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 [...]
+<glyph unicode="" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96 [...]
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -32 [...]
+<glyph unicode="" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 2 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 6 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 [...]
+<glyph unicode="" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t [...]
+<glyph unicode="" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+<glyph unicode="" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l [...]
+<glyph unicode="" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 [...]
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t13 [...]
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 - [...]
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q [...]
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137. [...]
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -1 [...]
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6 [...]
+<glyph unicode="" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 10 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-2 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
<glyph unicode="" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM44 640q0 -173 67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331 t-67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331zM87 640q0 205 98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212l-83 -28q22 -60 49 -112l-57 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 218q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5 t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85q0 -53 41 -77v-3q-113 -37 -113 -139zM382 225q0 64 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M68 7q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47q98 0 218 47v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58q0 -31 22.5 -51.5t58 -32 t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5zM272 18q0 -101 172 -101q151 0 151 105q0 100 -165 100q-158 0 -158 -104zM293 775q0 -135 [...]
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM368 1135l323 -589v-435h134v436l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3 q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150z" />
-<glyph unicode="" horiz-adv-x="1280" d="M57 953q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5t-78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153 t-153 102t-186 38t-186 -38t-153 -102t-102 -153t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265zM113.5 38.5q10.5 121.5 29.5 217t54 186t69 155.5t74 125q61 90 132 16 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M18 264q0 275 252 466q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5 t3.5 -5t2 -3.5q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35. [...]
-<glyph unicode="" horiz-adv-x="2048" d="M0 858q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490z M380 1075q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5t-25 66t-66 25q-43 0 -76 -25.5t-33 -65.5zM816 404q0 143 81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5q0 -117 -68.5 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 508q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55z" />
-<glyph unicode="" horiz-adv-x="1792" d="M0 508q-3 39 32 59l1664 960q35 21 68 -2q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55zM209 522l336 -137l863 639l-478 -797l492 -201 l221 1323z" />
-<glyph unicode="" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45zM512 4 [...]
-<glyph unicode="" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M62 1338q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -1 [...]
-<glyph unicode="" horiz-adv-x="1280" d="M24 926q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108 q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179q-64 117 -64 259z" />
-<glyph unicode="" d="M0 736v64q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM128 -96v672h256v-672q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM128 960v416q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-416h-256zM512 224v64q0 40 28 68 t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 64h256v-160q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v160zM640 448v928q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-928h-256zM1024 992v6 [...]
-<glyph unicode="" d="M0 640q0 133 93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86q133 0 226.5 -93.5t93.5 -226.5 t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5z" />
-<glyph unicode="" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 640q0 -88 62.5 -150.5t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5 t150.5 62.5t62.5 150.5t-62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 [...]
-<glyph unicode="" horiz-adv-x="1792" d="M0 448q0 143 55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68l243 244l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5 t-225 150t-150 225t-55.5 273.5zM170 615q10 -24 35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49t-34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49zM1376 1472q0 13 9 [...]
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241 [...]
+<glyph unicode="" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 10 [...]
+<glyph unicode="" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 - [...]
+<glyph unicode="" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -7 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 - [...]
+<glyph unicode="" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1 [...]
+<glyph unicode="" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q- [...]
+<glyph unicode="" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l13 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t [...]
+<glyph unicode="" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90. [...]
+<glyph unicode="" d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 3 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 - [...]
+<glyph unicode="" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24 [...]
+<glyph unicode="" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 [...]
+<glyph unicode="" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 [...]
+<glyph unicode="" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1 [...]
+<glyph unicode="" horiz-adv-x="2304" d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q [...]
+<glyph unicode="" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 - [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7 [...]
+<glyph unicode="" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v [...]
+<glyph unicode="" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 - [...]
+<glyph unicode="" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-3 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43. [...]
+<glyph unicode="" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -13 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 3 [...]
+<glyph unicode="" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 - [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65 [...]
+<glyph unicode="" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -8 [...]
+<glyph unicode="" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t [...]
+<glyph unicode="" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+<glyph unicode="" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-17 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 - [...]
+<glyph unicode="" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l10 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 - [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 [...]
+<glyph unicode="" horiz-adv-x="1664" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 4 [...]
+<glyph unicode="" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 [...]
+<glyph unicode="" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5 [...]
+<glyph unicode="" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -2 [...]
+<glyph unicode="" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 13 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -12 [...]
+<glyph unicode="" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -7 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q1 [...]
+<glyph unicode="" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 [...]
+<glyph unicode="" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131. [...]
+<glyph unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+<glyph unicode="" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 9 [...]
+<glyph unicode="" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+<glyph unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h [...]
+<glyph unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
+<glyph unicode="" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+<glyph unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+<glyph unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 204v-209h-642v209h134v926h-6l-314 -1135h-243l-310 1135h-8v-926h135v-209h-538v209h69q21 0 43 19.5t22 37.5v881q0 18 -22 40t-43 22h-69v209h672l221 -821h6l223 821h670v-209h-71q-19 0 -41 -22t-22 -40v-881q0 -18 21.5 -37.5t41.5 -19.5h71z" />
+<glyph unicode="" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+<glyph unicode="" horiz-adv-x="2296" d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5z [...]
+<glyph unicode="" horiz-adv-x="2304" d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 - [...]
+<glyph unicode="" horiz-adv-x="2304" d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="2304" d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="2304" d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="2304" d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
+<glyph unicode="" horiz-adv-x="1024" d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
+<glyph unicode="" horiz-adv-x="2304" d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v [...]
+<glyph unicode="" d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
+<glyph unicode="" d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-12 [...]
+<glyph unicode="" horiz-adv-x="2304" d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 - [...]
+<glyph unicode="" horiz-adv-x="2304" d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t2 [...]
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11 [...]
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -1 [...]
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11 [...]
+<glyph unicode="" d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 [...]
+<glyph unicode="" d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -17 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M816 1408q-48 0 -79.5 -34t-31.5 -82q0 -14 3 -28l150 -624h-26l-116 482q-9 38 -39.5 62t-69.5 24q-47 0 -79 -34t-32 -81q0 -11 4 -29q3 -13 39 -161t68 -282t32 -138v-227l-307 230q-34 26 -77 26q-52 0 -89.5 -36.5t-37.5 -88.5q0 -67 56 -110l507 -379 q34 -26 76 -26h694q33 0 59 20.5t34 52.5l100 401q8 30 10 88t9 86l116 478q3 12 3 26q0 46 -33 79t-80 33q-38 0 -69 -25.5t-40 -62.5l-99 -408h-26l132 547q3 14 3 28q0 47 -32 80t-80 33q-38 0 -68.5 -24t-39.5 -62l-1 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 [...]
+<glyph unicode="" d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 - [...]
+<glyph unicode="" horiz-adv-x="1973" d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q [...]
+<glyph unicode="" horiz-adv-x="2048" d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+<glyph unicode="" horiz-adv-x="1792" d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="" horiz-adv-x="2304" d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q [...]
+<glyph unicode="" horiz-adv-x="1280" d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 3 [...]
+<glyph unicode="" d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 [...]
+<glyph unicode="" horiz-adv-x="1720" d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 1 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31. [...]
+<glyph unicode="" d="M768 -92q77 0 139.5 63t100.5 166t59 234.5t21 268.5t-21 268.5t-59 234.5t-100.5 166t-139.5 63t-139.5 -63t-100.5 -166t-59 -234.5t-21 -268.5t21 -268.5t59 -234.5t100.5 -166t139.5 -63zM768 -256q-184 0 -333 77t-240 203t-141 287t-50 329t50 329t141 287t240 203 t333 77q148 0 274 -50t214.5 -136t151.5 -201t92.5 -244t29.5 -265t-29.5 -265t-92.5 -244t-151.5 -201t-214.5 -136t-274 -50z" />
+<glyph unicode="" horiz-adv-x="1792" d="M716 -69q-143 35 -261.5 114t-197.5 191q-139 -300 -17 -398q26 -21 85 -24.5t127.5 9.5t141 41.5t122.5 66.5zM693 762h452q0 108 -61.5 169t-168.5 61q-103 0 -162.5 -62.5t-59.5 -167.5zM1724 1137h-34q26 102 22.5 170t-25 110t-63.5 57t-93.5 11t-115 -26.5 t-128.5 -56.5t-134 -79q129 -37 238.5 -113.5t185 -179t110 -231.5t15.5 -262h-1005q0 -60 10 -106t34 -85t69.5 -60t112.5 -21q87 0 142.5 44t72.5 122h540q-71 -230 -281.5 -377t-477.5 -147q-83 0 -159 15q-35 -4 [...]
+<glyph unicode="" horiz-adv-x="2048" d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1792" d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 [...]
+<glyph unicode="" horiz-adv-x="2304" d="M1391 390v0l-1 1q-15 18 -34.5 37.5t-62.5 57.5t-93.5 62t-95.5 24q-48 0 -83 -21.5t-51 -54t-23 -59t-7 -47.5v0v0q0 -21 7 -48t23 -59t51 -53.5t83 -21.5q45 0 95.5 24t94 62.5t62 57t34.5 37.5zM2103 390q0 21 -7 47.5t-23 59t-51 54t-83 21.5q-45 0 -95.5 -24 t-94 -62.5t-62 -57t-34.5 -37.5l-1 -1v0v0l1 -1q15 -18 34.5 -37.5t62.5 -57.5t93.5 -62t95.5 -24q48 0 83 21.5t51 53.5t23 59t7 48zM2304 393q0 -69 -24 -137.5t-68 -126t-116 -93.5t-159 -36q-68 0 -134 24t-113 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 - [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 1 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -1 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 5 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
+<glyph unicode="" horiz-adv-x="1024" d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q61 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+<glyph unicode="" horiz-adv-x="1792" d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 [...]
+<glyph unicode="" horiz-adv-x="1792" d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171 [...]
+<glyph unicode="" horiz-adv-x="1024" d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
+<glyph unicode="" d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+<glyph unicode="" d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 [...]
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
<glyph unicode="" horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
-<glyph horiz-adv-x="1792" />
</font>
</defs></svg>
\ No newline at end of file
diff --git a/site/fonts/fontawesome-webfont.ttf b/site/fonts/fontawesome-webfont.ttf
index 5cd6cff..d7994e1 100755
Binary files a/site/fonts/fontawesome-webfont.ttf and b/site/fonts/fontawesome-webfont.ttf differ
diff --git a/site/fonts/fontawesome-webfont.woff b/site/fonts/fontawesome-webfont.woff
index 9eaecb3..6fd4ede 100755
Binary files a/site/fonts/fontawesome-webfont.woff and b/site/fonts/fontawesome-webfont.woff differ
diff --git a/site/fonts/fontawesome-webfont.woff2 b/site/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..5560193
Binary files /dev/null and b/site/fonts/fontawesome-webfont.woff2 differ
diff --git a/site/help/index.md b/site/help/index.md
new file mode 100644
index 0000000..5ce0846
--- /dev/null
+++ b/site/help/index.md
@@ -0,0 +1,36 @@
+---
+layout: page
+title: Getting Help
+---
+
+Need help with Jekyll? Try these resources.
+
+### [Google](https://google.com)
+
+Add **jekyll** to almost any query, and you'll find just what you need.
+
+### [Jekyll Talk](https://talk.jekyllrb.com/)
+
+Jekyll Talk is our official Discourse forum. Here, users and contributors
+can ask questions and discuss all aspects of Jekyll.
+
+### [Jekyll on StackOverflow](http://stackoverflow.com/questions/tagged/jekyll)
+
+StackOverflow is a staple of any developer's diet. Check out the Jekyll tag
+on StackOverflow for an answer to your question. Not there? Ask a new
+question!
+
+### [Jekyll IRC Channel](irc:irc.freenode.net/jekyll)
+
+Get live support at **#jekyll** on **irc.freenode.net**, the official
+Jekyll IRC channel.
+
+### [jekyll/jekyll](https://github.com/jekyll/jekyll/issues)
+
+Search through the issues on the main Jekyll development. Think you've
+found a bug? File a new issue.
+
+### [@jekyllrb on Twitter](https://twitter.com/jekyllrb)
+
+The official Jekyll Twitter account. It's not checked often, so try the
+above first.
diff --git a/site/img/jekyll-sticker.jpg b/site/img/jekyll-sticker.jpg
index 7feb97a..de3eb1b 100644
Binary files a/site/img/jekyll-sticker.jpg and b/site/img/jekyll-sticker.jpg differ
diff --git a/site/index.html b/site/index.html
index 429723c..a8bda74 100644
--- a/site/index.html
+++ b/site/index.html
@@ -22,7 +22,7 @@ overview: true
</div>
<div class="unit one-third">
<h2>Static</h2>
- <p><a href="http://daringfireball.net/projects/markdown/">Markdown</a> (or <a href="http://redcloth.org/textile">Textile</a>), <a href="http://wiki.shopify.com/Liquid">Liquid</a>, HTML <span class="amp">&</span> CSS go in. Static sites come out ready for deployment.</p>
+ <p><a href="http://daringfireball.net/projects/markdown/">Markdown</a> (or <a href="http://redcloth.org/textile">Textile</a>), <a href="https://github.com/Shopify/liquid/wiki">Liquid</a>, HTML <span class="amp">&</span> CSS go in. Static sites come out ready for deployment.</p>
<a href="/docs/templates/">Jekyll template guide →</a>
</div>
<div class="unit one-third">
@@ -38,7 +38,7 @@ overview: true
<section class="quickstart">
<div class="grid">
<div class="unit golden-small center-on-mobiles">
- <h4>Get up and running <em>in seconds</em>.</h4>
+ <h3>Get up and running <em>in seconds</em>.</h3>
</div>
<div class="unit golden-large code">
<p class="title">Quick-start Instructions</p>
diff --git a/site/latest_version.txt b/site/latest_version.txt
new file mode 100644
index 0000000..4a36342
--- /dev/null
+++ b/site/latest_version.txt
@@ -0,0 +1 @@
+3.0.0
diff --git a/test/fixtures/broken_front_matter3.erb b/test/fixtures/broken_front_matter3.erb
index 5fff53b..0672ae4 100644
--- a/test/fixtures/broken_front_matter3.erb
+++ b/test/fixtures/broken_front_matter3.erb
@@ -4,4 +4,3 @@ test: good
Real content starts here
������� �����
-
diff --git a/test/helper.rb b/test/helper.rb
index 97be56a..dc02176 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -1,39 +1,84 @@
-require 'simplecov'
-require 'simplecov-gem-adapter'
-SimpleCov.start('gem')
+def jruby?
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
+end
+
+unless ENV['TRAVIS']
+ require File.expand_path('../simplecov_custom_profile', __FILE__)
+ SimpleCov.start('gem') do
+ add_filter "/vendor/bundle"
+ add_filter "/vendor/gem"
+ add_filter ".bundle"
+ end
+end
require 'rubygems'
-require 'test/unit'
require 'ostruct'
-gem 'RedCloth', '>= 4.2.1'
+require 'minitest/autorun'
+require 'minitest/reporters'
+require 'minitest/profile'
+require 'rspec/mocks'
require 'jekyll'
-require 'RedCloth'
-require 'rdiscount'
-require 'kramdown'
-require 'redcarpet'
+Jekyll.logger = Logger.new(StringIO.new)
+unless jruby?
+ require 'rdiscount'
+ require 'redcarpet'
+end
+
+require 'kramdown'
require 'shoulda'
-require 'rr'
include Jekyll
-# Send STDERR into the void to suppress program output messages
-STDERR.reopen(test(?e, '/dev/null') ? '/dev/null' : 'NUL:')
+# FIXME: If we really need this we lost the game.
+# STDERR.reopen(test(?e, '/dev/null') ? '/dev/null' : 'NUL:')
+
+# Report with color.
+Minitest::Reporters.use! [
+ Minitest::Reporters::DefaultReporter.new(
+ :color => true
+ )
+]
+
+class JekyllUnitTest < Minitest::Test
+ include ::RSpec::Mocks::ExampleMethods
-class Test::Unit::TestCase
- include RR::Adapters::TestUnit
+ def mocks_expect(*args)
+ RSpec::Mocks::ExampleMethods::ExpectHost.instance_method(:expect).\
+ bind(self).call(*args)
+ end
+
+ def before_setup
+ ::RSpec::Mocks.setup
+ super
+ end
+
+ def after_teardown
+ super
+ ::RSpec::Mocks.verify
+ ensure
+ ::RSpec::Mocks.teardown
+ end
+
+ def fixture_site(overrides = {})
+ Jekyll::Site.new(site_configuration(overrides))
+ end
def build_configs(overrides, base_hash = Jekyll::Configuration::DEFAULTS)
Utils.deep_merge_hashes(base_hash, overrides)
+ .fix_common_issues.backwards_compatibilize.add_default_collections
end
def site_configuration(overrides = {})
+ full_overrides = build_configs(overrides, build_configs({
+ "destination" => dest_dir,
+ "incremental" => false
+ }))
build_configs({
- "source" => source_dir,
- "destination" => dest_dir
- }, build_configs(overrides))
+ "source" => source_dir
+ }, full_overrides)
end
def dest_dir(*subdirs)
@@ -46,6 +91,7 @@ class Test::Unit::TestCase
def clear_dest
FileUtils.rm_rf(dest_dir)
+ FileUtils.rm_rf(source_dir('.jekyll-metadata'))
end
def test_dir(*subdirs)
@@ -58,23 +104,20 @@ class Test::Unit::TestCase
File.open("#{path}/index.html", "w"){ |f| f.write("I was previously generated.") }
end
- def capture_stdout
- $old_stdout = $stdout
- $stdout = StringIO.new
+ def with_env(key, value)
+ old_value = ENV[key]
+ ENV[key] = value
yield
- $stdout.rewind
- return $stdout.string
- ensure
- $stdout = $old_stdout
+ ENV[key] = old_value
end
- def capture_stderr
- $old_stderr = $stderr
- $stderr = StringIO.new
+ def capture_output
+ stderr = StringIO.new
+ Jekyll.logger = Logger.new stderr
yield
- $stderr.rewind
- return $stderr.string
- ensure
- $stderr = $old_stderr
+ stderr.rewind
+ return stderr.string.to_s
end
+ alias_method :capture_stdout, :capture_output
+ alias_method :capture_stderr, :capture_output
end
diff --git a/test/simplecov_custom_profile.rb b/test/simplecov_custom_profile.rb
new file mode 100644
index 0000000..d7f4914
--- /dev/null
+++ b/test/simplecov_custom_profile.rb
@@ -0,0 +1,10 @@
+require 'simplecov'
+
+SimpleCov.profiles.define 'gem' do
+ add_filter '/test/'
+ add_filter '/features/'
+ add_filter '/autotest/'
+
+ add_group 'Binaries', '/bin/'
+ add_group 'Libraries', '/lib/'
+end
diff --git a/test/source/+/%# +.md b/test/source/+/%# +.md
index a850f4d..18e9ccc 100644
--- a/test/source/+/%# +.md
+++ b/test/source/+/%# +.md
@@ -1,6 +1,6 @@
---
layout: default
-title : Page name with non-alphabetic character
+title : Page name with non-alphabetic character
---
Line 1
{{ page.title }}
diff --git a/test/source/_data/products.yml b/test/source/_data/products.yml
deleted file mode 100644
index 21828a0..0000000
--- a/test/source/_data/products.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-- name: sugar
- price: 5.3
-- name: salt
- price: 2.5
diff --git a/test/source/_data/products.yml b/test/source/_data/products.yml
new file mode 120000
index 0000000..bc0c685
--- /dev/null
+++ b/test/source/_data/products.yml
@@ -0,0 +1 @@
+../products.yml
\ No newline at end of file
diff --git a/test/source/_includes/tmp b/test/source/_includes/tmp
new file mode 120000
index 0000000..a846f50
--- /dev/null
+++ b/test/source/_includes/tmp
@@ -0,0 +1 @@
+../../../tmp/
\ No newline at end of file
diff --git a/test/source/_includes_custom/custom.html b/test/source/_includes_custom/custom.html
new file mode 100644
index 0000000..cbf553c
--- /dev/null
+++ b/test/source/_includes_custom/custom.html
@@ -0,0 +1 @@
+custom_included
\ No newline at end of file
diff --git a/test/source/_methods/escape-+ #%20[].md b/test/source/_methods/escape-+ #%20[].md
new file mode 100644
index 0000000..528317a
--- /dev/null
+++ b/test/source/_methods/escape-+ #%20[].md
@@ -0,0 +1,5 @@
+---
+title: "Jekyll.escape"
+---
+
+Signs are nice
diff --git a/test/source/_methods/um_hi.md b/test/source/_methods/um_hi.md
deleted file mode 100644
index 1cab376..0000000
--- a/test/source/_methods/um_hi.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "Site#generate"
-layout: default
----
-
-Run your generators! {{ page.layout }}
diff --git a/test/source/_methods/um_hi.md b/test/source/_methods/um_hi.md
new file mode 120000
index 0000000..9ebb532
--- /dev/null
+++ b/test/source/_methods/um_hi.md
@@ -0,0 +1 @@
+./site/generate.md
\ No newline at end of file
diff --git a/test/source/_methods/yaml_with_dots.md b/test/source/_methods/yaml_with_dots.md
new file mode 100644
index 0000000..eb0b667
--- /dev/null
+++ b/test/source/_methods/yaml_with_dots.md
@@ -0,0 +1,8 @@
+---
+title: "YAML with Dots"
+whatever: foo.bar
+...
+
+Use `{{ page.title }}` to build a full configuration for use w/Jekyll.
+
+Whatever: {{ page.whatever }}
diff --git a/test/source/_posts/2008-02-02-not-published.textile b/test/source/_posts/2008-02-02-not-published.markdown
similarity index 100%
rename from test/source/_posts/2008-02-02-not-published.textile
rename to test/source/_posts/2008-02-02-not-published.markdown
diff --git a/test/source/_posts/2008-02-02-published.textile b/test/source/_posts/2008-02-02-published.markdown
similarity index 98%
rename from test/source/_posts/2008-02-02-published.textile
rename to test/source/_posts/2008-02-02-published.markdown
index 7865140..5b2428e 100644
--- a/test/source/_posts/2008-02-02-published.textile
+++ b/test/source/_posts/2008-02-02-published.markdown
@@ -5,4 +5,3 @@ category: publish_test
---
This should be published.
-
diff --git a/test/source/_posts/2008-10-18-foo-bar.textile b/test/source/_posts/2008-10-18-foo-bar.markdown
similarity index 52%
rename from test/source/_posts/2008-10-18-foo-bar.textile
rename to test/source/_posts/2008-10-18-foo-bar.markdown
index 0ed8573..3bc219a 100644
--- a/test/source/_posts/2008-10-18-foo-bar.textile
+++ b/test/source/_posts/2008-10-18-foo-bar.markdown
@@ -3,6 +3,6 @@ layout: default
title: Foo Bar
---
-h1. {{ page.title }}
+# {{ page.title }}
-Best *post* ever
\ No newline at end of file
+Best **post** ever
\ No newline at end of file
diff --git a/test/source/_posts/2008-11-21-complex.textile b/test/source/_posts/2008-11-21-complex.markdown
similarity index 100%
rename from test/source/_posts/2008-11-21-complex.textile
rename to test/source/_posts/2008-11-21-complex.markdown
diff --git a/test/source/_posts/2008-12-03-permalinked-post.textile b/test/source/_posts/2008-12-03-permalinked-post.markdown
similarity index 100%
rename from test/source/_posts/2008-12-03-permalinked-post.textile
rename to test/source/_posts/2008-12-03-permalinked-post.markdown
diff --git a/test/source/_posts/2008-12-13-include.markdown b/test/source/_posts/2008-12-13-include.markdown
index 1b02ba2..28a9353 100644
--- a/test/source/_posts/2008-12-13-include.markdown
+++ b/test/source/_posts/2008-12-13-include.markdown
@@ -5,4 +5,4 @@ title: Include
{% include sig.markdown %}
-This _is_ cool
\ No newline at end of file
+This _is_ cool
diff --git a/test/source/_posts/2009-01-27-array-categories.textile b/test/source/_posts/2009-01-27-array-categories.markdown
similarity index 100%
rename from test/source/_posts/2009-01-27-array-categories.textile
rename to test/source/_posts/2009-01-27-array-categories.markdown
diff --git a/test/source/_posts/2009-01-27-categories.textile b/test/source/_posts/2009-01-27-categories.markdown
similarity index 100%
rename from test/source/_posts/2009-01-27-categories.textile
rename to test/source/_posts/2009-01-27-categories.markdown
diff --git a/test/source/_posts/2009-01-27-category.textile b/test/source/_posts/2009-01-27-category.markdown
similarity index 100%
rename from test/source/_posts/2009-01-27-category.textile
rename to test/source/_posts/2009-01-27-category.markdown
diff --git a/test/source/_posts/2009-01-27-empty-categories.textile b/test/source/_posts/2009-01-27-empty-categories.markdown
similarity index 100%
rename from test/source/_posts/2009-01-27-empty-categories.textile
rename to test/source/_posts/2009-01-27-empty-categories.markdown
diff --git a/test/source/_posts/2009-01-27-empty-category.textile b/test/source/_posts/2009-01-27-empty-category.markdown
similarity index 100%
rename from test/source/_posts/2009-01-27-empty-category.textile
rename to test/source/_posts/2009-01-27-empty-category.markdown
diff --git a/test/source/_posts/2009-01-27-no-category.textile b/test/source/_posts/2009-01-27-no-category.markdown
similarity index 100%
rename from test/source/_posts/2009-01-27-no-category.textile
rename to test/source/_posts/2009-01-27-no-category.markdown
diff --git a/test/source/_posts/2009-05-18-empty-tag.textile b/test/source/_posts/2009-05-18-empty-tag.markdown
similarity index 100%
rename from test/source/_posts/2009-05-18-empty-tag.textile
rename to test/source/_posts/2009-05-18-empty-tag.markdown
diff --git a/test/source/_posts/2009-05-18-empty-tags.textile b/test/source/_posts/2009-05-18-empty-tags.markdown
similarity index 100%
rename from test/source/_posts/2009-05-18-empty-tags.textile
rename to test/source/_posts/2009-05-18-empty-tags.markdown
diff --git a/test/source/_posts/2009-05-18-tag.textile b/test/source/_posts/2009-05-18-tag.markdown
similarity index 100%
rename from test/source/_posts/2009-05-18-tag.textile
rename to test/source/_posts/2009-05-18-tag.markdown
diff --git a/test/source/_posts/2009-05-18-tags.textile b/test/source/_posts/2009-05-18-tags.markdown
similarity index 100%
rename from test/source/_posts/2009-05-18-tags.textile
rename to test/source/_posts/2009-05-18-tags.markdown
diff --git a/test/source/_posts/2009-06-22-empty-yaml.textile b/test/source/_posts/2009-06-22-empty-yaml.markdown
similarity index 100%
rename from test/source/_posts/2009-06-22-empty-yaml.textile
rename to test/source/_posts/2009-06-22-empty-yaml.markdown
diff --git a/test/source/_posts/2009-06-22-no-yaml.textile b/test/source/_posts/2009-06-22-no-yaml.markdown
similarity index 100%
rename from test/source/_posts/2009-06-22-no-yaml.textile
rename to test/source/_posts/2009-06-22-no-yaml.markdown
diff --git a/test/source/_posts/2010-01-09-date-override.textile b/test/source/_posts/2010-01-09-date-override.markdown
similarity index 100%
rename from test/source/_posts/2010-01-09-date-override.textile
rename to test/source/_posts/2010-01-09-date-override.markdown
diff --git a/test/source/_posts/2010-01-09-time-override.textile b/test/source/_posts/2010-01-09-time-override.markdown
similarity index 100%
rename from test/source/_posts/2010-01-09-time-override.textile
rename to test/source/_posts/2010-01-09-time-override.markdown
diff --git a/test/source/_posts/2010-01-09-timezone-override.textile b/test/source/_posts/2010-01-09-timezone-override.markdown
similarity index 100%
rename from test/source/_posts/2010-01-09-timezone-override.textile
rename to test/source/_posts/2010-01-09-timezone-override.markdown
diff --git a/test/source/_posts/2010-01-16-override-data.textile b/test/source/_posts/2010-01-16-override-data.markdown
similarity index 100%
rename from test/source/_posts/2010-01-16-override-data.textile
rename to test/source/_posts/2010-01-16-override-data.markdown
diff --git a/test/source/_posts/2013-01-12-nil-layout.textile b/test/source/_posts/2013-01-12-nil-layout.markdown
similarity index 100%
rename from test/source/_posts/2013-01-12-nil-layout.textile
rename to test/source/_posts/2013-01-12-nil-layout.markdown
diff --git a/test/source/_posts/2013-01-12-no-layout.textile b/test/source/_posts/2013-01-12-no-layout.markdown
similarity index 100%
rename from test/source/_posts/2013-01-12-no-layout.textile
rename to test/source/_posts/2013-01-12-no-layout.markdown
diff --git a/test/source/_posts/2013-05-10-number-category.textile b/test/source/_posts/2013-05-10-number-category.markdown
similarity index 100%
rename from test/source/_posts/2013-05-10-number-category.textile
rename to test/source/_posts/2013-05-10-number-category.markdown
diff --git a/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown b/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
index 07b0e5f..4958660 100644
--- a/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
+++ b/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
@@ -5,6 +5,7 @@ categories:
- bar
- baz
- z_category
+- MixedCase
tags:
- first
- second
diff --git a/test/source/_posts/2013-12-17-include-variable-filters.markdown b/test/source/_posts/2013-12-17-include-variable-filters.markdown
index 3d66e87..c3291c7 100644
--- a/test/source/_posts/2013-12-17-include-variable-filters.markdown
+++ b/test/source/_posts/2013-12-17-include-variable-filters.markdown
@@ -5,6 +5,7 @@ include1: include.html
include2: include
include3: INCLUDE
include4: params
+include5: clude
---
Liquid tests
@@ -19,3 +20,6 @@ Whitespace tests
Parameters test
- 7 {% include {{ page.include4 | append: '.html' }} var1='foo' var2='bar' %}
+
+Partial variable test
+- 8 {% include in{{ page.include5 }}.html %}
diff --git a/test/source/_posts/2013-12-20-properties.text b/test/source/_posts/2013-12-20-properties.text
index 94ded59..c0d72ce 100644
--- a/test/source/_posts/2013-12-20-properties.text
+++ b/test/source/_posts/2013-12-20-properties.text
@@ -1,5 +1,5 @@
---
-categories: foo bar baz
+categories: foo bar baz MixedCase
foo: bar
layout: default
tags: ay bee cee
diff --git a/test/source/_posts/2014-07-05-another-mixed-case-category.markdown b/test/source/_posts/2014-07-05-another-mixed-case-category.markdown
new file mode 100644
index 0000000..419ddab
--- /dev/null
+++ b/test/source/_posts/2014-07-05-another-mixed-case-category.markdown
@@ -0,0 +1,7 @@
+---
+layout: default
+title: Another Mixed Case Category in YAML
+category: Mixedcase
+---
+
+Best *post* ever
diff --git a/test/source/_posts/2014-07-05-mixed-case-category.markdown b/test/source/_posts/2014-07-05-mixed-case-category.markdown
new file mode 100644
index 0000000..92a6790
--- /dev/null
+++ b/test/source/_posts/2014-07-05-mixed-case-category.markdown
@@ -0,0 +1,7 @@
+---
+layout: default
+title: Mixed Case Category in YAML
+category: MixedCase
+---
+
+Best *post* ever
diff --git a/test/source/_posts/2014-09-02-relative-includes.markdown b/test/source/_posts/2014-09-02-relative-includes.markdown
new file mode 100644
index 0000000..ab451b6
--- /dev/null
+++ b/test/source/_posts/2014-09-02-relative-includes.markdown
@@ -0,0 +1,29 @@
+---
+title: Post
+layout: post
+include1: rel_include.html
+include2: include_relative/rel_include
+include3: rel_INCLUDE
+include4: params
+include5: clude
+---
+
+Liquid tests
+- 1 {% include_relative include_relative/{{ page.include1 }} %}
+- 2 {% include_relative {{ page.include2 | append: '.html' }} %}
+- 3 {% include_relative include_relative/{{ page.include3 | downcase | append: '.html' }} %}
+
+Whitespace tests
+- 4 {% include_relative include_relative/{{page.include1}} %}
+- 5 {% include_relative include_relative/{{ page.include1}} %}
+- 6 {% include_relative include_relative/{{ page.include3 | downcase | append: '.html'}} %}
+
+Parameters test
+- 7 {% include_relative include_relative/{{ page.include4 | append: '.html' }} var1='foo' var2='bar' %}
+
+Partial variable test
+- 8 {% include_relative include_relative/rel_in{{ page.include5 }}.html %}
+
+Relative to self test:
+
+- 9 {% include_relative 2014-03-03-yaml-with-dots.md %}
diff --git a/test/source/_with.dots/file.with.dots.md b/test/source/_posts/2014-11-24-Rmd-extension.Rmd
similarity index 100%
copy from test/source/_with.dots/file.with.dots.md
copy to test/source/_posts/2014-11-24-Rmd-extension.Rmd
diff --git a/test/source/_posts/2015-01-08-post-excerpt-separator.markdown b/test/source/_posts/2015-01-08-post-excerpt-separator.markdown
new file mode 100644
index 0000000..e8b7ddd
--- /dev/null
+++ b/test/source/_posts/2015-01-08-post-excerpt-separator.markdown
@@ -0,0 +1,15 @@
+---
+layout: ~
+title: Post Excerpt Separator
+excerpt_separator: "\n---\n"
+---
+
+First paragraph with [link ref][link].
+
+Second paragraph
+
+---
+
+Third paragraph
+
+[link]: http://www.jekyllrb.com/
diff --git a/test/source/_posts/2015-02-20-extensionless-permalink.markdown b/test/source/_posts/2015-02-20-extensionless-permalink.markdown
new file mode 100644
index 0000000..f92b21f
--- /dev/null
+++ b/test/source/_posts/2015-02-20-extensionless-permalink.markdown
@@ -0,0 +1,7 @@
+---
+layout: ~
+title: Extensionless Permalink
+permalink: /:title
+---
+
+{{ page.url }}
diff --git a/test/source/_posts/es/2008-11-21-nested.textile b/test/source/_posts/es/2008-11-21-nested.markdown
similarity index 100%
rename from test/source/_posts/es/2008-11-21-nested.textile
rename to test/source/_posts/es/2008-11-21-nested.markdown
diff --git a/test/source/_posts/include_relative/params.html b/test/source/_posts/include_relative/params.html
new file mode 100644
index 0000000..ae4c6cf
--- /dev/null
+++ b/test/source/_posts/include_relative/params.html
@@ -0,0 +1,7 @@
+<span id='include-param'>{{include.param}}</span>
+
+<ul id='param-list'>
+ {% for param in include %}
+ <li>{{param[0]}} = {{param[1]}}</li>
+ {% endfor %}
+</ul>
diff --git a/test/source/_posts/include_relative/rel_include.html b/test/source/_posts/include_relative/rel_include.html
new file mode 100644
index 0000000..5fb677b
--- /dev/null
+++ b/test/source/_posts/include_relative/rel_include.html
@@ -0,0 +1 @@
+relative_included
diff --git a/test/source/_slides/example-slide-1.html b/test/source/_slides/example-slide-1.html
index fcd89b3..52dd1ab 100644
--- a/test/source/_slides/example-slide-1.html
+++ b/test/source/_slides/example-slide-1.html
@@ -2,3 +2,5 @@
title: Example slide
layout: slide
---
+
+Wooot
diff --git a/test/source/_slides/example-slide-4.html b/test/source/_slides/example-slide-4.html
new file mode 100644
index 0000000..b4bdbe4
--- /dev/null
+++ b/test/source/_slides/example-slide-4.html
@@ -0,0 +1,15 @@
+---
+ slug: so-what-is-jekyll-exactly
+ layout: slide
+---
+
+Jekyll is a simple, blog-aware, static site generator. It takes a template
+directory containing raw text files in various formats, runs it through
+[Markdown](http://daringfireball.net/projects/markdown/) (or
+[Textile](http://redcloth.org/textile)) and
+[Liquid](http://wiki.shopify.com/Liquid)
+converters, and spits out a complete, ready-to-publish static website suitable
+for serving with your favorite web server. Jekyll also happens to be the engine
+behind [GitHub Pages](http://pages.github.com), which means you can use Jekyll
+to host your project’s page, blog, or website from GitHub’s servers **for
+free**.
diff --git a/test/source/_slides/example-slide-1.html b/test/source/_slides/example-slide-5.html
similarity index 51%
copy from test/source/_slides/example-slide-1.html
copy to test/source/_slides/example-slide-5.html
index fcd89b3..622df12 100644
--- a/test/source/_slides/example-slide-1.html
+++ b/test/source/_slides/example-slide-5.html
@@ -1,4 +1,5 @@
---
- title: Example slide
layout: slide
---
+
+Wooot
diff --git a/test/source/_slides/example-slide-6.html b/test/source/_slides/example-slide-6.html
new file mode 100644
index 0000000..defbb52
--- /dev/null
+++ b/test/source/_slides/example-slide-6.html
@@ -0,0 +1,15 @@
+---
+ slug: Well, so what is Jekyll, then?
+ layout: slide
+---
+
+Jekyll is a simple, blog-aware, static site generator. It takes a template
+directory containing raw text files in various formats, runs it through
+[Markdown](http://daringfireball.net/projects/markdown/) (or
+[Textile](http://redcloth.org/textile)) and
+[Liquid](http://wiki.shopify.com/Liquid)
+converters, and spits out a complete, ready-to-publish static website suitable
+for serving with your favorite web server. Jekyll also happens to be the engine
+behind [GitHub Pages](http://pages.github.com), which means you can use Jekyll
+to host your project’s page, blog, or website from GitHub’s servers **for
+free**.
diff --git a/test/source/_slides/example-slide-Upper-Cased.html b/test/source/_slides/example-slide-Upper-Cased.html
new file mode 100644
index 0000000..24aee8e
--- /dev/null
+++ b/test/source/_slides/example-slide-Upper-Cased.html
@@ -0,0 +1,6 @@
+---
+ title: Example Slide
+ layout: slide
+---
+
+Cased!
diff --git a/test/source/_slides/non-outputted-slide.html b/test/source/_slides/non-outputted-slide.html
new file mode 100644
index 0000000..5eca156
--- /dev/null
+++ b/test/source/_slides/non-outputted-slide.html
@@ -0,0 +1,7 @@
+---
+ title: Non outputted slide
+ layout: slide
+ published: false
+---
+
+This should not be output
diff --git a/test/source/_slides/octojekyll.png b/test/source/_slides/octojekyll.png
new file mode 100644
index 0000000..7c6d96d
Binary files /dev/null and b/test/source/_slides/octojekyll.png differ
diff --git a/test/source/_with.dots/file.with.dots.md b/test/source/_with.dots/file.with.dots.md
index e69de29..211dfb5 100644
--- a/test/source/_with.dots/file.with.dots.md
+++ b/test/source/_with.dots/file.with.dots.md
@@ -0,0 +1,4 @@
+---
+---
+
+I'm a file with dots.
diff --git a/test/source/category/_posts/2008-9-23-categories.textile b/test/source/category/_posts/2008-9-23-categories.markdown
similarity index 100%
rename from test/source/category/_posts/2008-9-23-categories.textile
rename to test/source/category/_posts/2008-9-23-categories.markdown
diff --git a/test/source/deal.with.dots.html b/test/source/deal.with.dots.html
index a69dac8..6c87d80 100644
--- a/test/source/deal.with.dots.html
+++ b/test/source/deal.with.dots.html
@@ -1,7 +1,6 @@
---
title: Deal with dots
-permalink: /deal.with.dots/
+permalink: /deal.with.dots
---
Let's test if jekyll deals properly with dots.
-
diff --git a/test/source/foo/_posts/bar/2008-12-12-topical-post.textile b/test/source/foo/_posts/bar/2008-12-12-topical-post.markdown
similarity index 100%
rename from test/source/foo/_posts/bar/2008-12-12-topical-post.textile
rename to test/source/foo/_posts/bar/2008-12-12-topical-post.markdown
diff --git a/test/source/js/coffeescript.coffee b/test/source/js/coffeescript.coffee
index e0e066b..9531a7c 100644
--- a/test/source/js/coffeescript.coffee
+++ b/test/source/js/coffeescript.coffee
@@ -1,4 +1,5 @@
---
+message: "I knew it!"
---
$ ->
@@ -7,4 +8,4 @@ $ ->
cube = (x) -> square(x) * x
cubes = (math.cube num for num in list)
- alert "I knew it!" if elvis?
+ alert "{{ page.message }}" if elvis?
diff --git a/test/source/static_files.html b/test/source/static_files.html
index 878b7eb..fb0786a 100644
--- a/test/source/static_files.html
+++ b/test/source/static_files.html
@@ -1,4 +1,4 @@
---
---
{% for file in site.static_files %}
-- {{ file.path }} last edited at {{ file.modified_time }} with extname {{ file.extname }}{% endfor %}
+- {{ file.path }} last edited at {{ file.modified_time | date:"%H:%m" }} with extname {{ file.extname }}{% endfor %}
diff --git a/test/source/symlink-test/_data b/test/source/symlink-test/_data
new file mode 120000
index 0000000..37fb8ff
--- /dev/null
+++ b/test/source/symlink-test/_data
@@ -0,0 +1 @@
+../_data
\ No newline at end of file
diff --git a/test/source/symlink-test/symlinked-dir b/test/source/symlink-test/symlinked-dir
new file mode 120000
index 0000000..d2d7c52
--- /dev/null
+++ b/test/source/symlink-test/symlinked-dir
@@ -0,0 +1 @@
+../css
\ No newline at end of file
diff --git a/test/source/symlink-test/symlinked-file b/test/source/symlink-test/symlinked-file
deleted file mode 100644
index 493fce7..0000000
--- a/test/source/symlink-test/symlinked-file
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: default
-title: Tom Preston-Werner
----
-
-h1. Welcome to my site
-
-h2. Please read our {{ site.posts | size }} Posts
-
-<ul>
- {% for post in site.posts %}
- <li>{{ post.date }} <a href="{{ post.url }}">{{ post.title }}</a></li>
- {% endfor %}
-</ul>
-
-{% assign first_post = site.posts.first %}
-<div id="first_post">
- <h1>{{ first_post.title }}</h1>
- <div>
- {{ first_post.content }}
- </div>
-</div>
diff --git a/test/source/symlink-test/symlinked-file b/test/source/symlink-test/symlinked-file
new file mode 120000
index 0000000..79c5d6f
--- /dev/null
+++ b/test/source/symlink-test/symlinked-file
@@ -0,0 +1 @@
+../index.html
\ No newline at end of file
diff --git a/test/source/z_category/_posts/2008-9-23-categories.textile b/test/source/z_category/_posts/2008-9-23-categories.markdown
similarity index 100%
rename from test/source/z_category/_posts/2008-9-23-categories.textile
rename to test/source/z_category/_posts/2008-9-23-categories.markdown
diff --git a/test/suite.rb b/test/suite.rb
deleted file mode 100644
index 81b6171..0000000
--- a/test/suite.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-require 'rubygems'
-gem 'test-unit'
-require 'test/unit'
-
-# for some reason these tests fail when run via TextMate
-# but succeed when run on the command line.
-
-tests = Dir[File.expand_path("#{File.dirname(__FILE__)}/test_*.rb")]
-tests.each do |file|
- require file
-end
diff --git a/test/test_cleaner.rb b/test/test_cleaner.rb
index e9bcc0f..819dbf5 100644
--- a/test/test_cleaner.rb
+++ b/test/test_cleaner.rb
@@ -1,21 +1,18 @@
require 'helper'
-class TestCleaner < Test::Unit::TestCase
+class TestCleaner < JekyllUnitTest
context "directory in keep_files" do
setup do
clear_dest
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
- end
FileUtils.mkdir_p(dest_dir('to_keep/child_dir'))
FileUtils.touch(File.join(dest_dir('to_keep'), 'index.html'))
FileUtils.touch(File.join(dest_dir('to_keep/child_dir'), 'index.html'))
- @site = Site.new(Jekyll.configuration)
+ @site = fixture_site
@site.keep_files = ['to_keep/child_dir']
- @cleaner = Site::Cleaner.new(@site)
+ @cleaner = Cleaner.new(@site)
@cleaner.cleanup!
end
@@ -43,17 +40,14 @@ class TestCleaner < Test::Unit::TestCase
context "directory containing no files and non-empty directories" do
setup do
clear_dest
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
- end
FileUtils.mkdir_p(source_dir('no_files_inside/child_dir'))
FileUtils.touch(File.join(source_dir('no_files_inside/child_dir'), 'index.html'))
- @site = Site.new(Jekyll.configuration)
+ @site = fixture_site
@site.process
- @cleaner = Site::Cleaner.new(@site)
+ @cleaner = Cleaner.new(@site)
@cleaner.cleanup!
end
diff --git a/test/test_coffeescript.rb b/test/test_coffeescript.rb
index 91fd623..68e19a5 100644
--- a/test/test_coffeescript.rb
+++ b/test/test_coffeescript.rb
@@ -1,12 +1,10 @@
require 'helper'
-class TestCoffeeScript < Test::Unit::TestCase
+class TestCoffeeScript < JekyllUnitTest
context "converting CoffeeScript" do
setup do
- @site = Jekyll::Site.new(Jekyll.configuration({
- "source" => source_dir,
- "destination" => dest_dir
- }))
+ External.require_with_graceful_fail('jekyll-coffeescript')
+ @site = fixture_site
@site.process
@test_coffeescript_file = dest_dir("js/coffeescript.js")
@js_output = <<-JS
@@ -21,16 +19,16 @@ class TestCoffeeScript < Test::Unit::TestCase
return square(x) * x;
};
cubes = (function() {
- var _i, _len, _results;
- _results = [];
- for (_i = 0, _len = list.length; _i < _len; _i++) {
- num = list[_i];
- _results.push(math.cube(num));
+ var i, len, results;
+ results = [];
+ for (i = 0, len = list.length; i < len; i++) {
+ num = list[i];
+ results.push(math.cube(num));
}
- return _results;
+ return results;
})();
- if (typeof elvis !== \"undefined\" && elvis !== null) {
- return alert(\"I knew it!\");
+ if (typeof elvis !== "undefined" && elvis !== null) {
+ return alert("I knew it!");
}
});
diff --git a/test/test_collections.rb b/test/test_collections.rb
index 97b891e..be3a932 100644
--- a/test/test_collections.rb
+++ b/test/test_collections.rb
@@ -1,16 +1,6 @@
require 'helper'
-class TestCollections < Test::Unit::TestCase
-
- def fixture_site(overrides = {})
- Jekyll::Site.new(Jekyll.configuration(
- overrides.merge({
- "source" => source_dir,
- "destination" => dest_dir
- })
- ))
- end
-
+class TestCollections < JekyllUnitTest
context "an evil collection" do
setup do
@collection = Jekyll::Collection.new(fixture_site, "../../etc/password")
@@ -90,8 +80,9 @@ class TestCollections < Test::Unit::TestCase
@site.process
end
- should "not contain any collections" do
- assert_equal Hash.new, @site.collections
+ should "contain only the defaul collections" do
+ refute_equal Hash.new, @site.collections
+ refute_nil @site.collections
end
end
@@ -124,7 +115,7 @@ class TestCollections < Test::Unit::TestCase
should "create a Hash on Site with the label mapped to the instance of the Collection" do
assert @site.collections.is_a?(Hash)
- assert_not_nil @site.collections["methods"]
+ refute_nil @site.collections["methods"]
assert @site.collections["methods"].is_a? Jekyll::Collection
end
@@ -132,27 +123,29 @@ class TestCollections < Test::Unit::TestCase
assert @site.collections["methods"].docs.is_a? Array
@site.collections["methods"].docs.each do |doc|
assert doc.is_a? Jekyll::Document
- assert_include %w[
+ assert_includes %w[
_methods/configuration.md
_methods/sanitized_path.md
_methods/site/generate.md
_methods/site/initialize.md
_methods/um_hi.md
+ _methods/escape-+\ #%20[].md
+ _methods/yaml_with_dots.md
], doc.relative_path
end
end
should "not include files which start with an underscore in the base collection directory" do
- assert_not_include @collection.filtered_entries, "_do_not_read_me.md"
+ refute_includes @collection.filtered_entries, "_do_not_read_me.md"
end
should "not include files which start with an underscore in a subdirectory" do
- assert_not_include @collection.filtered_entries, "site/_dont_include_me_either.md"
+ refute_includes @collection.filtered_entries, "site/_dont_include_me_either.md"
end
should "not include the underscored files in the list of docs" do
- assert_not_include @collection.docs.map(&:relative_path), "_methods/_do_not_read_me.md"
- assert_not_include @collection.docs.map(&:relative_path), "_methods/site/_dont_include_me_either.md"
+ refute_includes @collection.docs.map(&:relative_path), "_methods/_do_not_read_me.md"
+ refute_includes @collection.docs.map(&:relative_path), "_methods/site/_dont_include_me_either.md"
end
end
@@ -186,11 +179,12 @@ class TestCollections < Test::Unit::TestCase
end
should "not allow symlinks" do
- assert_not_include @collection.filtered_entries, "um_hi.md"
+ refute_includes @collection.filtered_entries, "um_hi.md"
+ refute_includes @collection.filtered_entries, "/um_hi.md"
end
should "not include the symlinked file in the list of docs" do
- assert_not_include @collection.docs.map(&:relative_path), "_methods/um_hi.md"
+ refute_includes @collection.docs.map(&:relative_path), "_methods/um_hi.md"
end
end
@@ -205,7 +199,7 @@ class TestCollections < Test::Unit::TestCase
end
should "exist" do
- assert_not_nil @collection
+ refute_nil @collection
end
should "contain one document" do
diff --git a/test/test_command.rb b/test/test_command.rb
index 8d1a751..7d1211e 100644
--- a/test/test_command.rb
+++ b/test/test_command.rb
@@ -1,52 +1,21 @@
require 'helper'
-class TestCommand < Test::Unit::TestCase
- context "when calling .ignore_paths" do
- context "when source is absolute" do
- setup { @source = source_dir }
- should "return an array with regex for destination" do
- absolute = source_dir('dest')
- relative = Pathname.new(source_dir('dest')).relative_path_from(Pathname.new('.').expand_path).to_s
- [absolute, relative].each do |dest|
- config = build_configs("source" => @source, "destination" => dest)
- assert Command.ignore_paths(config).include?(/dest/), "failed with destination: #{dest}"
- end
- end
- end
- context "when source is relative" do
- setup { @source = Pathname.new(source_dir).relative_path_from(Pathname.new('.').expand_path).to_s }
- should "return an array with regex for destination" do
- absolute = source_dir('dest')
- relative = Pathname.new(source_dir('dest')).relative_path_from(Pathname.new('.').expand_path).to_s
- [absolute, relative].each do |dest|
- config = build_configs("source" => @source, "destination" => dest)
- assert Command.ignore_paths(config).include?(/dest/), "failed with destination: #{dest}"
- end
- end
- end
- context "multiple config files" do
- should "return an array with regex for config files" do
- config = build_configs("config"=> ["_config.yaml", "_config2.yml"])
- ignore_paths = Command.ignore_paths(config)
- assert ignore_paths.include?(/_config\.yaml/), 'did not include _config.yaml'
- assert ignore_paths.include?(/_config2\.yml/), 'did not include _config2.yml'
- end
- end
- end
+class TestCommand < JekyllUnitTest
context "when calling .add_build_options" do
should "add common options" do
cmd = Object.new
- mock(cmd).option.with_any_args.at_least(1)
+ mocks_expect(cmd).to receive(:option).at_least(:once)
Command.add_build_options(cmd)
end
end
+
context "when calling .process_site" do
context "when fatal error occurs" do
should "exit with non-zero error code" do
site = Object.new
- stub(site).process { raise Jekyll::Errors::FatalException }
- error = assert_raise(SystemExit) { Command.process_site(site) }
- assert_not_equal 0, error.status
+ def site.process; raise Jekyll::Errors::FatalException; end
+ error = assert_raises(SystemExit) { Command.process_site(site) }
+ refute_equal 0, error.status
end
end
end
diff --git a/test/test_configuration.rb b/test/test_configuration.rb
index bdb4dc8..553dfda 100644
--- a/test/test_configuration.rb
+++ b/test/test_configuration.rb
@@ -1,6 +1,8 @@
require 'helper'
-class TestConfiguration < Test::Unit::TestCase
+class TestConfiguration < JekyllUnitTest
+ @@defaults = Jekyll::Configuration::DEFAULTS.add_default_collections.freeze
+
context "#stringify_keys" do
setup do
@mixed_keys = Configuration[{
@@ -42,12 +44,12 @@ class TestConfiguration < Test::Unit::TestCase
assert_equal [source_dir("_config.yml")], @config.config_files(@no_override)
end
should "return .yaml if it exists but .yml does not" do
- mock(File).exists?(source_dir("_config.yml")) { false }
- mock(File).exists?(source_dir("_config.yaml")) { true }
+ allow(File).to receive(:exist?).with(source_dir("_config.yml")).and_return(false)
+ allow(File).to receive(:exist?).with(source_dir("_config.yaml")).and_return(true)
assert_equal [source_dir("_config.yaml")], @config.config_files(@no_override)
end
should "return .yml if both .yml and .yaml exist" do
- mock(File).exists?(source_dir("_config.yml")) { true }
+ allow(File).to receive(:exist?).with(source_dir("_config.yml")).and_return(true)
assert_equal [source_dir("_config.yml")], @config.config_files(@no_override)
end
should "return the config if given one config file" do
@@ -66,33 +68,47 @@ class TestConfiguration < Test::Unit::TestCase
"exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown",
"include" => "STOP_THE_PRESSES.txt,.heloses, .git",
"pygments" => true,
+ "plugins" => true,
+ "layouts" => true,
+ "data_source" => true,
}]
end
should "unset 'auto' and 'watch'" do
- assert @config.has_key?("auto")
- assert @config.has_key?("watch")
- assert !@config.backwards_compatibilize.has_key?("auto")
- assert !@config.backwards_compatibilize.has_key?("watch")
+ assert @config.key?("auto")
+ assert @config.key?("watch")
+ assert !@config.backwards_compatibilize.key?("auto")
+ assert !@config.backwards_compatibilize.key?("watch")
end
should "unset 'server'" do
- assert @config.has_key?("server")
- assert !@config.backwards_compatibilize.has_key?("server")
+ assert @config.key?("server")
+ assert !@config.backwards_compatibilize.key?("server")
end
should "transform string exclude into an array" do
- assert @config.has_key?("exclude")
- assert @config.backwards_compatibilize.has_key?("exclude")
+ assert @config.key?("exclude")
+ assert @config.backwards_compatibilize.key?("exclude")
assert_equal @config.backwards_compatibilize["exclude"], %w[READ-ME.md Gemfile CONTRIBUTING.hello.markdown]
end
should "transform string include into an array" do
- assert @config.has_key?("include")
- assert @config.backwards_compatibilize.has_key?("include")
+ assert @config.key?("include")
+ assert @config.backwards_compatibilize.key?("include")
assert_equal @config.backwards_compatibilize["include"], %w[STOP_THE_PRESSES.txt .heloses .git]
end
should "set highlighter to pygments" do
- assert @config.has_key?("pygments")
- assert !@config.backwards_compatibilize.has_key?("pygments")
+ assert @config.key?("pygments")
+ assert !@config.backwards_compatibilize.key?("pygments")
assert_equal @config.backwards_compatibilize["highlighter"], "pygments"
end
+ should "adjust directory names" do
+ assert @config.key?("plugins")
+ assert !@config.backwards_compatibilize.key?("plugins")
+ assert @config.backwards_compatibilize["plugins_dir"]
+ assert @config.key?("layouts")
+ assert !@config.backwards_compatibilize.key?("layouts")
+ assert @config.backwards_compatibilize["layouts_dir"]
+ assert @config.key?("data_source")
+ assert !@config.backwards_compatibilize.key?("data_source")
+ assert @config.backwards_compatibilize["data_dir"]
+ end
end
context "#fix_common_issues" do
setup do
@@ -115,27 +131,27 @@ class TestConfiguration < Test::Unit::TestCase
end
should "fire warning with no _config.yml" do
- mock(SafeYAML).load_file(@path) { raise SystemCallError, "No such file or directory - #{@path}" }
- mock($stderr).puts("Configuration file: none".yellow)
- assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
+ allow(SafeYAML).to receive(:load_file).with(@path) { raise SystemCallError, "No such file or directory - #{@path}" }
+ allow($stderr).to receive(:puts).with("Configuration file: none".yellow)
+ assert_equal @@defaults, Jekyll.configuration({})
end
should "load configuration as hash" do
- mock(SafeYAML).load_file(@path) { Hash.new }
- mock($stdout).puts("Configuration file: #{@path}")
- assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
+ allow(SafeYAML).to receive(:load_file).with(@path).and_return(Hash.new)
+ allow($stdout).to receive(:puts).with("Configuration file: #{@path}")
+ assert_equal @@defaults, Jekyll.configuration({})
end
should "fire warning with bad config" do
- mock(SafeYAML).load_file(@path) { Array.new }
- mock($stderr).puts(("WARNING: ".rjust(20) + "Error reading configuration. Using defaults (and options).").yellow)
- mock($stderr).puts("Configuration file: (INVALID) #{@path}".yellow)
- assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
+ allow(SafeYAML).to receive(:load_file).with(@path).and_return(Array.new)
+ allow($stderr).to receive(:puts).and_return(("WARNING: ".rjust(20) + "Error reading configuration. Using defaults (and options).").yellow)
+ allow($stderr).to receive(:puts).and_return("Configuration file: (INVALID) #{@path}".yellow)
+ assert_equal @@defaults, Jekyll.configuration({})
end
should "fire warning when user-specified config file isn't there" do
- mock(SafeYAML).load_file(@user_config) { raise SystemCallError, "No such file or directory - #{@user_config}" }
- mock($stderr).puts(("Fatal: ".rjust(20) + "The configuration file '#{@user_config}' could not be found.").red)
+ allow(SafeYAML).to receive(:load_file).with(@user_config) { raise SystemCallError, "No such file or directory - #{@user_config}" }
+ allow($stderr).to receive(:puts).with(("Fatal: ".rjust(20) + "The configuration file '#{@user_config}' could not be found.").red)
assert_raises LoadError do
Jekyll.configuration({'config' => [@user_config]})
end
@@ -156,46 +172,48 @@ class TestConfiguration < Test::Unit::TestCase
}
end
- should "load default config if no config_file is set" do
- mock(SafeYAML).load_file(@paths[:default]) { Hash.new }
- mock($stdout).puts("Configuration file: #{@paths[:default]}")
- assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
+ should "load default plus posts config if no config_file is set" do
+ allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({})
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}")
+ assert_equal @@defaults, Jekyll.configuration({})
end
should "load different config if specified" do
- mock(SafeYAML).load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} }
- mock($stdout).puts("Configuration file: #{@paths[:other]}")
- assert_equal Utils.deep_merge_hashes(Jekyll::Configuration::DEFAULTS, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] })
+ allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({"baseurl" => "http://wahoo.dev"})
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}")
+ assert_equal Utils.deep_merge_hashes(@@defaults, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] })
end
should "load default config if path passed is empty" do
- mock(SafeYAML).load_file(@paths[:default]) { Hash.new }
- mock($stdout).puts("Configuration file: #{@paths[:default]}")
- assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] })
+ allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({})
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}")
+ assert_equal @@defaults, Jekyll.configuration({ "config" => @paths[:empty] })
end
should "successfully load a TOML file" do
Jekyll.logger.log_level = :warn
- assert_equal Jekyll::Configuration::DEFAULTS.merge({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration({ "config" => [@paths[:toml]] })
+ assert_equal @@defaults.clone.merge({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration({ "config" => [@paths[:toml]] })
Jekyll.logger.log_level = :info
end
should "load multiple config files" do
- mock(SafeYAML).load_file(@paths[:default]) { Hash.new }
- mock(SafeYAML).load_file(@paths[:other]) { Hash.new }
- mock(TOML).load_file(@paths[:toml]) { Hash.new }
- mock($stdout).puts("Configuration file: #{@paths[:default]}")
- mock($stdout).puts("Configuration file: #{@paths[:other]}")
- mock($stdout).puts("Configuration file: #{@paths[:toml]}")
- assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] })
+ External.require_with_graceful_fail('toml')
+
+ allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return(Hash.new)
+ allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return(Hash.new)
+ allow(TOML).to receive(:load_file).with(@paths[:toml]).and_return(Hash.new)
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}")
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}")
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:toml]}")
+ assert_equal @@defaults, Jekyll.configuration({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] })
end
should "load multiple config files and last config should win" do
- mock(SafeYAML).load_file(@paths[:default]) { {"baseurl" => "http://example.dev"} }
- mock(SafeYAML).load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} }
- mock($stdout).puts("Configuration file: #{@paths[:default]}")
- mock($stdout).puts("Configuration file: #{@paths[:other]}")
- assert_equal Utils.deep_merge_hashes(Jekyll::Configuration::DEFAULTS, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] })
+ allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({"baseurl" => "http://example.dev"})
+ allow(SafeYAML).to receive(:load_file).with(@paths[:other]).and_return({"baseurl" => "http://wahoo.dev"})
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}")
+ allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:other]}")
+ assert_equal Utils.deep_merge_hashes(@@defaults, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] })
end
end
end
diff --git a/test/test_convertible.rb b/test/test_convertible.rb
index 28f9995..09c6973 100644
--- a/test/test_convertible.rb
+++ b/test/test_convertible.rb
@@ -1,10 +1,14 @@
require 'helper'
require 'ostruct'
-class TestConvertible < Test::Unit::TestCase
+class TestConvertible < JekyllUnitTest
context "yaml front-matter" do
setup do
- @convertible = OpenStruct.new
+ @convertible = OpenStruct.new(
+ "site" => Site.new(Jekyll.configuration(
+ "source" => File.expand_path('../fixtures', __FILE__)
+ ))
+ )
@convertible.extend Jekyll::Convertible
@base = File.expand_path('../fixtures', __FILE__)
end
@@ -33,7 +37,7 @@ class TestConvertible < Test::Unit::TestCase
out = capture_stderr do
@convertible.read_yaml(@base, 'exploit_front_matter.erb')
end
- assert_no_match /undefined class\/module DoesNotExist/, out
+ refute_match /undefined class\/module DoesNotExist/, out
end
should "not parse if there is encoding error in file" do
diff --git a/test/test_document.rb b/test/test_document.rb
index 330a184..6689e50 100644
--- a/test/test_document.rb
+++ b/test/test_document.rb
@@ -1,18 +1,24 @@
require 'helper'
-class TestDocument < Test::Unit::TestCase
+class TestDocument < JekyllUnitTest
+
+ def assert_equal_value(key, one, other)
+ assert_equal(one[key], other[key])
+ end
context "a document in a collection" do
setup do
- @site = Site.new(Jekyll.configuration({
- "collections" => ["methods"],
- "source" => source_dir,
- "destination" => dest_dir
- }))
+ @site = fixture_site({
+ "collections" => ["methods"]
+ })
@site.process
@document = @site.collections["methods"].docs.first
end
+ should "exist" do
+ assert !@document.nil?
+ end
+
should "know its relative path" do
assert_equal "_methods/configuration.md", @document.relative_path
end
@@ -25,8 +31,8 @@ class TestDocument < Test::Unit::TestCase
assert_equal "configuration.md", @document.basename
end
- should "allow the suffix to be specified for the basename" do
- assert_equal "configuration", @document.basename(".*")
+ should "know its basename without extname" do
+ assert_equal "configuration", @document.basename_without_ext
end
should "know whether its a yaml file" do
@@ -34,24 +40,40 @@ class TestDocument < Test::Unit::TestCase
end
should "know its data" do
- assert_equal({
- "title" => "Jekyll.configuration",
- "whatever" => "foo.bar"
- }, @document.data)
+ assert_equal "Jekyll.configuration", @document.data["title"]
+ assert_equal "foo.bar", @document.data["whatever"]
+ end
+
+ context "with YAML ending in three dots" do
+
+ setup do
+ @site = fixture_site({
+ "collections" => ["methods"],
+ })
+ @site.process
+ @document = @site.collections["methods"].docs.last
+ end
+
+ should "know its data" do
+ assert_equal "YAML with Dots", @document.data["title"]
+ assert_equal "foo.bar", @document.data["whatever"]
+ end
end
should "output the collection name in the #to_liquid method" do
assert_equal @document.to_liquid['collection'], "methods"
end
+ should "output its relative path as path in Liquid" do
+ assert_equal @document.to_liquid['path'], "_methods/configuration.md"
+ end
+
end
context "a document as part of a collection with frontmatter defaults" do
setup do
- @site = Site.new(Jekyll.configuration({
+ @site = fixture_site({
"collections" => ["slides"],
- "source" => source_dir,
- "destination" => dest_dir,
"defaults" => [{
"scope"=> {"path"=>"", "type"=>"slides"},
"values"=> {
@@ -60,28 +82,22 @@ class TestDocument < Test::Unit::TestCase
}
}
}]
- }))
+ })
@site.process
- @document = @site.collections["slides"].docs.first
+ @document = @site.collections["slides"].docs.select{|d| d.is_a?(Document) }.first
end
should "know the frontmatter defaults" do
- assert_equal({
- "title"=>"Example slide",
- "layout"=>"slide",
- "nested"=> {
- "key"=>"myval"
- }
- }, @document.data)
+ assert_equal "Example slide", @document.data["title"]
+ assert_equal "slide", @document.data["layout"]
+ assert_equal({"key"=>"myval"}, @document.data["nested"])
end
end
context "a document as part of a collection with overriden default values" do
setup do
- @site = Site.new(Jekyll.configuration({
+ @site = fixture_site({
"collections" => ["slides"],
- "source" => source_dir,
- "destination" => dest_dir,
"defaults" => [{
"scope"=> {"path"=>"", "type"=>"slides"},
"values"=> {
@@ -91,29 +107,22 @@ class TestDocument < Test::Unit::TestCase
}
}
}]
- }))
+ })
@site.process
@document = @site.collections["slides"].docs[1]
end
should "override default values in the document frontmatter" do
- assert_equal({
- "title"=>"Override title",
- "layout"=>"slide",
- "nested"=> {
- "test1"=>"override1",
- "test2"=>"override2"
- }
- }, @document.data)
+ assert_equal "Override title", @document.data["title"]
+ assert_equal "slide", @document.data["layout"]
+ assert_equal({"test1"=>"override1","test2"=>"override2"}, @document.data["nested"])
end
end
context "a document as part of a collection with valid path" do
setup do
- @site = Site.new(Jekyll.configuration({
+ @site = fixture_site({
"collections" => ["slides"],
- "source" => source_dir,
- "destination" => dest_dir,
"defaults" => [{
"scope"=> {"path"=>"slides", "type"=>"slides"},
"values"=> {
@@ -122,28 +131,22 @@ class TestDocument < Test::Unit::TestCase
}
}
}]
- }))
+ })
@site.process
@document = @site.collections["slides"].docs.first
end
should "know the frontmatter defaults" do
- assert_equal({
- "title"=>"Example slide",
- "layout"=>"slide",
- "nested"=> {
- "key"=>"value123"
- }
- }, @document.data)
+ assert_equal "Example slide", @document.data["title"]
+ assert_equal "slide", @document.data["layout"]
+ assert_equal({"key"=>"value123"}, @document.data["nested"])
end
end
context "a document as part of a collection with invalid path" do
setup do
- @site = Site.new(Jekyll.configuration({
+ @site = fixture_site({
"collections" => ["slides"],
- "source" => source_dir,
- "destination" => dest_dir,
"defaults" => [{
"scope"=> {"path"=>"somepath", "type"=>"slides"},
"values"=> {
@@ -152,26 +155,23 @@ class TestDocument < Test::Unit::TestCase
}
}
}]
- }))
+ })
@site.process
@document = @site.collections["slides"].docs.first
end
should "not know the specified frontmatter defaults" do
- assert_equal({
- "title"=>"Example slide",
- "layout"=>"slide"
- }, @document.data)
+ assert_equal "Example slide", @document.data["title"]
+ assert_equal "slide", @document.data["layout"]
+ assert_equal nil, @document.data["nested"]
end
end
context "a document in a collection with a custom permalink" do
setup do
- @site = Site.new(Jekyll.configuration({
- "collections" => ["slides"],
- "source" => source_dir,
- "destination" => dest_dir
- }))
+ @site = fixture_site({
+ "collections" => ["slides"]
+ })
@site.process
@document = @site.collections["slides"].docs[2]
@dest_file = dest_dir("slide/3/index.html")
@@ -186,8 +186,198 @@ class TestDocument < Test::Unit::TestCase
end
end
+ context "a document in a collection with custom filename permalinks" do
+ setup do
+ @site = fixture_site({
+ "collections" => {
+ "slides" => {
+ "output" => true,
+ "permalink" => "/slides/test/:name"
+ }
+ },
+ })
+ @site.process
+ @document = @site.collections["slides"].docs[0]
+ @dest_file = dest_dir("slides/test/example-slide-1.html")
+ end
+
+ should "produce the right URL" do
+ assert_equal "/slides/test/example-slide-1", @document.url
+ end
+
+ should "produce the right destination file" do
+ assert_equal @dest_file, @document.destination(dest_dir)
+ end
+ end
+
+ context "a document in a collection with pretty permalink style" do
+ setup do
+ @site = fixture_site({
+ "collections" => {
+ "slides" => {
+ "output" => true,
+ }
+ },
+ })
+ @site.permalink_style = :pretty
+ @site.process
+ @document = @site.collections["slides"].docs[0]
+ @dest_file = dest_dir("slides/example-slide-1/index.html")
+ end
+
+ should "produce the right URL" do
+ assert_equal "/slides/example-slide-1/", @document.url
+ end
+
+ should "produce the right destination file" do
+ assert_equal @dest_file, @document.destination(dest_dir)
+ end
+ end
+
+ context "a document in a collection with cased file name" do
+ setup do
+ @site = fixture_site({
+ "collections" => {
+ "slides" => {
+ "output" => true,
+ }
+ },
+ })
+ @site.permalink_style = :pretty
+ @site.process
+ @document = @site.collections["slides"].docs[6]
+ @dest_file = dest_dir("slides/example-slide-Upper-Cased/index.html")
+ end
+
+ should "produce the right cased URL" do
+ assert_equal "/slides/example-slide-Upper-Cased/", @document.url
+ end
+ end
+
+ context "documents in a collection with custom title permalinks" do
+ setup do
+ @site = fixture_site({
+ "collections" => {
+ "slides" => {
+ "output" => true,
+ "permalink" => "/slides/:title"
+ }
+ },
+ })
+ @site.process
+ @document = @site.collections["slides"].docs[3]
+ @document_without_slug = @site.collections["slides"].docs[4]
+ @document_with_strange_slug = @site.collections["slides"].docs[5]
+ end
+
+ should "produce the right URL if they have a slug" do
+ assert_equal "/slides/so-what-is-jekyll-exactly", @document.url
+ end
+ should "produce the right destination file if they have a slug" do
+ dest_file = dest_dir("slides/so-what-is-jekyll-exactly.html")
+ assert_equal dest_file, @document.destination(dest_dir)
+ end
+
+ should "produce the right URL if they don't have a slug" do
+ assert_equal "/slides/example-slide-5", @document_without_slug.url
+ end
+ should "produce the right destination file if they don't have a slug" do
+ dest_file = dest_dir("slides/example-slide-5.html")
+ assert_equal dest_file, @document_without_slug.destination(dest_dir)
+ end
+
+ should "produce the right URL if they have a wild slug" do
+ assert_equal "/slides/Well,-so-what-is-Jekyll,-then", @document_with_strange_slug.url
+ end
+ should "produce the right destination file if they have a wild slug" do
+ dest_file = dest_dir("/slides/Well,-so-what-is-Jekyll,-then.html")
+ assert_equal dest_file, @document_with_strange_slug.destination(dest_dir)
+ end
+ end
+
+ context "documents in a collection" do
+ setup do
+ @site = fixture_site({
+ "collections" => {
+ "slides" => {
+ "output" => true
+ }
+ },
+ })
+ @site.process
+ @files = @site.collections["slides"].docs
+ end
+
+ context "without output overrides" do
+ should "be output according to collection defaults" do
+ refute_nil @files.find { |doc| doc.relative_path == "_slides/example-slide-4.html" }
+ end
+ end
+
+ context "with output overrides" do
+ should "be output according its front matter" do
+ assert_nil @files.find { |doc| doc.relative_path == "_slides/non-outputted-slide.html" }
+ end
+ end
+ end
+
+ context "a static file in a collection" do
+ setup do
+ @site = fixture_site({
+ "collections" => {
+ "slides" => {
+ "output" => true
+ }
+ }
+ })
+ @site.process
+ @document = @site.collections["slides"].files.find { |doc| doc.relative_path == "_slides/octojekyll.png" }
+ @dest_file = dest_dir("slides/octojekyll.png")
+ end
+
+ should "be a static file" do
+ assert_equal true, @document.is_a?(StaticFile)
+ end
+
+ should "be set to write" do
+ assert @document.write?
+ end
+
+ should "be in the list of docs_to_write" do
+ assert @site.docs_to_write.include?(@document)
+ end
+
+ should "be output in the correct place" do
+ assert File.file?(@dest_file)
+ end
+ end
+
+ context "a document in a collection with non-alphabetic file name" do
+ setup do
+ @site = fixture_site({
+ "collections" => {
+ "methods" => {
+ "output" => true
+ }
+ },
+ })
+ @site.process
+ @document = @site.collections["methods"].docs.find { |doc| doc.relative_path == "_methods/escape-+ #%20[].md" }
+ @dest_file = dest_dir("methods/escape-+ #%20[].html")
+ end
+
+ should "produce the right URL" do
+ assert_equal "/methods/escape-+%20%23%2520%5B%5D.html", @document.url
+ end
+
+ should "produce the right destination" do
+ assert_equal @dest_file, @document.destination(dest_dir)
+ end
+
+ should "be output in the correct place" do
+ assert_equal true, File.file?(@dest_file)
+ end
- context " a document part of a rendered collection" do
end
end
diff --git a/test/test_draft.rb b/test/test_draft.rb
deleted file mode 100644
index b1b3d08..0000000
--- a/test/test_draft.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-require 'helper'
-
-class TestDraft < Test::Unit::TestCase
- def setup_draft(file)
- Draft.new(@site, source_dir, '', file)
- end
-
- context "A Draft" do
- setup do
- clear_dest
- stub(Jekyll).configuration { Jekyll::Configuration::DEFAULTS }
- @site = Site.new(Jekyll.configuration)
- end
-
- should "ensure valid drafts are valid" do
- assert Draft.valid?("2008-09-09-foo-bar.textile")
- assert Draft.valid?("foo/bar/2008-09-09-foo-bar.textile")
- assert Draft.valid?("lol2008-09-09-foo-bar.textile")
-
- assert !Draft.valid?("blah")
- end
-
- should "make properties accessible through #[]" do
- draft = setup_draft('draft-properties.text')
- # ! need to touch the file! Or get its timestamp
- date = File.mtime(File.join(source_dir, '_drafts', 'draft-properties.text'))
- ymd = date.strftime("%Y/%m/%d")
-
- attrs = {
- categories: %w(foo bar baz),
- content: "All the properties.\n\nPlus an excerpt.\n",
- date: date,
- dir: "/foo/bar/baz/#{ymd}",
- excerpt: "All the properties.\n\n",
- foo: 'bar',
- id: "/foo/bar/baz/#{ymd}/draft-properties",
- layout: 'default',
- name: nil,
- path: "_drafts/draft-properties.text",
- permalink: nil,
- published: nil,
- tags: %w(ay bee cee),
- title: 'Properties Draft',
- url: "/foo/bar/baz/#{ymd}/draft-properties.html"
- }
-
- attrs.each do |attr, val|
- attr_str = attr.to_s
- result = draft[attr_str]
- assert_equal val, result, "For <draft[\"#{attr_str}\"]>:"
- end
- end
-
- end
-
-end
diff --git a/test/test_entry_filter.rb b/test/test_entry_filter.rb
index e562277..c0ce59b 100644
--- a/test/test_entry_filter.rb
+++ b/test/test_entry_filter.rb
@@ -1,12 +1,9 @@
require 'helper'
-class TestEntryFilter < Test::Unit::TestCase
+class TestEntryFilter < JekyllUnitTest
context "Filtering entries" do
setup do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
- end
- @site = Site.new(Jekyll.configuration)
+ @site = Site.new(site_configuration)
end
should "filter entries" do
@@ -22,7 +19,7 @@ class TestEntryFilter < Test::Unit::TestCase
files = %w[index.html site.css .htaccess vendor]
@site.exclude = excludes + ["exclude*"]
- assert_equal files, @site.filter_entries(excludes + files + ["excludeA"])
+ assert_equal files, @site.reader.filter_entries(excludes + files + ["excludeA"])
end
should "filter entries with exclude relative to site source" do
@@ -30,7 +27,7 @@ class TestEntryFilter < Test::Unit::TestCase
files = %w[index.html vendor/css .htaccess]
@site.exclude = excludes
- assert_equal files, @site.filter_entries(excludes + files + ["css"])
+ assert_equal files, @site.reader.filter_entries(excludes + files + ["css"])
end
should "filter excluded directory and contained files" do
@@ -38,7 +35,7 @@ class TestEntryFilter < Test::Unit::TestCase
files = %w[index.html .htaccess]
@site.exclude = excludes
- assert_equal files, @site.filter_entries(excludes + files + ["css", "css/main.css", "css/vendor.css"])
+ assert_equal files, @site.reader.filter_entries(excludes + files + ["css", "css/main.css", "css/vendor.css"])
end
should "not filter entries within include" do
@@ -46,54 +43,42 @@ class TestEntryFilter < Test::Unit::TestCase
files = %w[index.html _index.html .htaccess includeA]
@site.include = includes
- assert_equal files, @site.filter_entries(files)
+ assert_equal files, @site.reader.filter_entries(files)
end
should "filter symlink entries when safe mode enabled" do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => true})
- end
- site = Site.new(Jekyll.configuration)
- stub(File).symlink?('symlink.js') {true}
+ site = Site.new(site_configuration('safe' => true))
+ allow(File).to receive(:symlink?).with('symlink.js').and_return(true)
files = %w[symlink.js]
- assert_equal [], site.filter_entries(files)
+ assert_equal [], site.reader.filter_entries(files)
end
should "not filter symlink entries when safe mode disabled" do
- stub(File).symlink?('symlink.js') {true}
+ allow(File).to receive(:symlink?).with('symlink.js').and_return(true)
files = %w[symlink.js]
- assert_equal files, @site.filter_entries(files)
+ assert_equal files, @site.reader.filter_entries(files)
end
should "not include symlinks in safe mode" do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => true})
- end
- site = Site.new(Jekyll.configuration)
+ site = Site.new(site_configuration('safe' => true))
- site.read_directories("symlink-test")
+ site.reader.read_directories("symlink-test")
assert_equal [], site.pages
assert_equal [], site.static_files
end
should "include symlinks in unsafe mode" do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => false})
- end
- site = Site.new(Jekyll.configuration)
-
- site.read_directories("symlink-test")
- assert_not_equal [], site.pages
- assert_not_equal [], site.static_files
+ site = Site.new(site_configuration)
+
+ site.reader.read_directories("symlink-test")
+ refute_equal [], site.pages
+ refute_equal [], site.static_files
end
end
context "#glob_include?" do
setup do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
- end
- @site = Site.new(Jekyll.configuration)
+ @site = Site.new(site_configuration)
@filter = EntryFilter.new(@site)
end
diff --git a/test/test_excerpt.rb b/test/test_excerpt.rb
index b6300fd..322ba3c 100644
--- a/test/test_excerpt.rb
+++ b/test/test_excerpt.rb
@@ -1,38 +1,37 @@
require 'helper'
-class TestExcerpt < Test::Unit::TestCase
+class TestExcerpt < JekyllUnitTest
def setup_post(file)
- Post.new(@site, source_dir, '', file)
+ Document.new(@site.in_source_dir(File.join('_posts', file)), {
+ site: @site,
+ collection: @site.posts
+ }).tap(&:read)
end
- def do_render(post)
- layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")}
- post.render(layouts, {"site" => {"posts" => []}})
+ def do_render(document)
+ @site.layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")}
+ payload = {"site" => {"posts" => []}}
+ document.output = Jekyll::Renderer.new(@site, document, payload).run
end
context "With extraction disabled" do
setup do
clear_dest
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'excerpt_separator' => ''})
- end
- @site = Site.new(Jekyll.configuration)
+ @site = fixture_site('excerpt_separator' => '')
@post = setup_post("2013-07-22-post-excerpt-with-layout.markdown")
end
should "not be generated" do
- excerpt = @post.send(:extract_excerpt)
- assert_equal true, excerpt.empty?
+ refute @post.generate_excerpt?
end
end
context "An extracted excerpt" do
setup do
clear_dest
- stub(Jekyll).configuration { Jekyll::Configuration::DEFAULTS }
- @site = Site.new(Jekyll.configuration)
+ @site = fixture_site
@post = setup_post("2013-07-22-post-excerpt-with-layout.markdown")
- @excerpt = @post.send :extract_excerpt
+ @excerpt = @post.data['excerpt']
end
context "#include(string)" do
@@ -49,7 +48,7 @@ class TestExcerpt < Test::Unit::TestCase
context "#id" do
should "contain the UID for the post" do
- assert_equal @excerpt.id, "#{@post.id}/#excerpt"
+ assert_equal @excerpt.id, "#{@post.id}#excerpt"
end
should "return a string" do
assert_same @post.id.class, String
@@ -57,8 +56,8 @@ class TestExcerpt < Test::Unit::TestCase
end
context "#to_s" do
- should "return its content if no output present" do
- assert_equal @excerpt.content, @excerpt.to_s
+ should "return rendered output" do
+ assert_equal @excerpt.output, @excerpt.to_s
end
should "return its output if output present" do
@@ -80,23 +79,12 @@ class TestExcerpt < Test::Unit::TestCase
context "#to_liquid" do
should "contain the proper page data to mimick the post liquid" do
assert_equal "Post Excerpt with Layout", @excerpt.to_liquid["title"]
- assert_equal "/bar/baz/z_category/2013/07/22/post-excerpt-with-layout.html", @excerpt.to_liquid["url"]
+ assert_equal "/bar/baz/z_category/mixedcase/2013/07/22/post-excerpt-with-layout.html", @excerpt.to_liquid["url"]
assert_equal Time.parse("2013-07-22"), @excerpt.to_liquid["date"]
- assert_equal %w[bar baz z_category], @excerpt.to_liquid["categories"]
+ assert_equal %w[bar baz z_category MixedCase], @excerpt.to_liquid["categories"]
assert_equal %w[first second third jekyllrb.com], @excerpt.to_liquid["tags"]
assert_equal "_posts/2013-07-22-post-excerpt-with-layout.markdown", @excerpt.to_liquid["path"]
end
-
- should "consider inheritance" do
- klass = Class.new(Jekyll::Post)
- assert_gets_called = false
- klass.send(:define_method, :assert_gets_called) { assert_gets_called = true }
- klass.const_set(:EXCERPT_ATTRIBUTES_FOR_LIQUID, Jekyll::Post::EXCERPT_ATTRIBUTES_FOR_LIQUID + ['assert_gets_called'])
- post = klass.new(@site, source_dir, '', "2008-02-02-published.textile")
- Jekyll::Excerpt.new(post).to_liquid
-
- assert assert_gets_called, 'assert_gets_called did not get called on post.'
- end
end
context "#content" do
@@ -115,11 +103,11 @@ class TestExcerpt < Test::Unit::TestCase
setup do
@rendered_post = @post.dup
do_render(@rendered_post)
- @extracted_excerpt = @rendered_post.send :extracted_excerpt
+ @extracted_excerpt = @rendered_post.data['excerpt']
end
should "be the first paragraph of the page" do
- assert_equal "<p>First paragraph with <a href=\"http://www.jekyllrb.com/\">link ref</a>.</p>\n\n", @extracted_excerpt.content
+ assert_equal "<p>First paragraph with <a href=\"http://www.jekyllrb.com/\">link ref</a>.</p>\n\n", @extracted_excerpt.output
end
should "link properly" do
@@ -128,4 +116,23 @@ class TestExcerpt < Test::Unit::TestCase
end
end
end
+
+ context "A whole-post excerpt" do
+ setup do
+ clear_dest
+ @site = fixture_site
+ @post = setup_post("2008-02-02-published.markdown")
+ @excerpt = @post.data['excerpt']
+ end
+
+ should "be generated" do
+ assert_equal true, @excerpt.is_a?(Jekyll::Excerpt)
+ end
+
+ context "#content" do
+ should "match the post content" do
+ assert_equal @post.content, @excerpt.content
+ end
+ end
+ end
end
diff --git a/test/test_filters.rb b/test/test_filters.rb
index f248026..cf4db89 100644
--- a/test/test_filters.rb
+++ b/test/test_filters.rb
@@ -2,13 +2,13 @@
require 'helper'
-class TestFilters < Test::Unit::TestCase
+class TestFilters < JekyllUnitTest
class JekyllFilter
include Jekyll::Filters
attr_accessor :site, :context
def initialize(opts = {})
- @site = Jekyll::Site.new(Jekyll.configuration(opts))
+ @site = Jekyll::Site.new(Jekyll.configuration(opts.merge('skip_config_files' => true)))
@context = Liquid::Context.new({}, {}, { :site => @site })
end
end
@@ -17,6 +17,7 @@ class TestFilters < Test::Unit::TestCase
setup do
@filter = JekyllFilter.new({"source" => source_dir, "destination" => dest_dir, "timezone" => "UTC"})
@sample_time = Time.utc(2013, 03, 27, 11, 22, 33)
+ @sample_date = Date.parse("2013-03-27")
@time_as_string = "September 11, 2001 12:46:30 -0000"
@time_as_numeric = 1399680607
@array_of_objects = [
@@ -26,14 +27,18 @@ class TestFilters < Test::Unit::TestCase
]
end
- should "textilize with simple string" do
- assert_equal "<p>something <strong>really</strong> simple</p>", @filter.textilize("something *really* simple")
- end
-
should "markdownify with simple string" do
assert_equal "<p>something <strong>really</strong> simple</p>\n", @filter.markdownify("something **really** simple")
end
+ should "sassify with simple string" do
+ assert_equal "p {\n color: #123456; }\n", @filter.sassify("$blue:#123456\np\n color: $blue")
+ end
+
+ should "scssify with simple string" do
+ assert_equal "p {\n color: #123456; }\n", @filter.scssify("$blue:#123456; p{color: $blue}")
+ end
+
should "convert array to sentence string with no args" do
assert_equal "", @filter.array_to_sentence_string([])
end
@@ -64,11 +69,29 @@ class TestFilters < Test::Unit::TestCase
end
should "format a time with xmlschema" do
- assert_equal "2013-03-27T11:22:33Z", @filter.date_to_xmlschema(@sample_time)
+ assert_equal "2013-03-27T11:22:33+00:00", @filter.date_to_xmlschema(@sample_time)
end
should "format a time according to RFC-822" do
- assert_equal "Wed, 27 Mar 2013 11:22:33 -0000", @filter.date_to_rfc822(@sample_time)
+ assert_equal "Wed, 27 Mar 2013 11:22:33 +0000", @filter.date_to_rfc822(@sample_time)
+ end
+ end
+
+ context "with Date object" do
+ should "format a date with short format" do
+ assert_equal "27 Mar 2013", @filter.date_to_string(@sample_date)
+ end
+
+ should "format a date with long format" do
+ assert_equal "27 March 2013", @filter.date_to_long_string(@sample_date)
+ end
+
+ should "format a time with xmlschema" do
+ assert_equal "2013-03-27T00:00:00+00:00", @filter.date_to_xmlschema(@sample_date)
+ end
+
+ should "format a time according to RFC-822" do
+ assert_equal "Wed, 27 Mar 2013 00:00:00 +0000", @filter.date_to_rfc822(@sample_date)
end
end
@@ -82,11 +105,11 @@ class TestFilters < Test::Unit::TestCase
end
should "format a time with xmlschema" do
- assert_equal "2001-09-11T12:46:30Z", @filter.date_to_xmlschema(@time_as_string)
+ assert_equal "2001-09-11T12:46:30+00:00", @filter.date_to_xmlschema(@time_as_string)
end
should "format a time according to RFC-822" do
- assert_equal "Tue, 11 Sep 2001 12:46:30 -0000", @filter.date_to_rfc822(@time_as_string)
+ assert_equal "Tue, 11 Sep 2001 12:46:30 +0000", @filter.date_to_rfc822(@time_as_string)
end
end
@@ -139,6 +162,84 @@ class TestFilters < Test::Unit::TestCase
assert_equal "[1,2]", @filter.jsonify([1, 2])
assert_equal "[{\"name\":\"Jack\"},{\"name\":\"Smith\"}]", @filter.jsonify([{:name => 'Jack'}, {:name => 'Smith'}])
end
+
+ class M < Struct.new(:message)
+ def to_liquid
+ [message]
+ end
+ end
+ class T < Struct.new(:name)
+ def to_liquid
+ { "name" => name, :v => 1, :thing => M.new({:kay => "jewelers"}), :stuff => true }
+ end
+ end
+
+ should "call #to_liquid " do
+ expected = [
+ {
+ "name" => "Jeremiah",
+ "v" => 1,
+ "thing" => [
+ {
+ "kay" => "jewelers"
+ }
+ ],
+ "stuff" => true
+ },
+ {
+ "name" => "Smathers",
+ "v" => 1,
+ "thing" => [
+ {
+ "kay" => "jewelers"
+ }
+ ],
+ "stuff" => true
+ }
+ ]
+ result = @filter.jsonify([T.new("Jeremiah"), T.new("Smathers")])
+ assert_equal expected, JSON.parse(result)
+ end
+
+ should "handle hashes with all sorts of weird keys and values" do
+ my_hash = { "posts" => Array.new(3) { |i| T.new(i) } }
+ expected = {
+ "posts" => [
+ {
+ "name" => 0,
+ "v" => 1,
+ "thing" => [
+ {
+ "kay" => "jewelers"
+ }
+ ],
+ "stuff" => true
+ },
+ {
+ "name" => 1,
+ "v" => 1,
+ "thing" => [
+ {
+ "kay" => "jewelers"
+ }
+ ],
+ "stuff" => true
+ },
+ {
+ "name" => 2,
+ "v" => 1,
+ "thing" => [
+ {
+ "kay" => "jewelers"
+ }
+ ],
+ "stuff" => true
+ }
+ ]
+ }
+ result = @filter.jsonify(my_hash)
+ assert_equal expected, JSON.parse(result)
+ end
end
context "group_by filter" do
@@ -164,16 +265,44 @@ class TestFilters < Test::Unit::TestCase
context "where filter" do
should "return any input that is not an array" do
- assert_equal Hash.new, @filter.where(Hash.new, nil, nil)
assert_equal "some string", @filter.where("some string", "la", "le")
end
+ should "filter objects in a hash appropriately" do
+ hash = {"a"=>{"color"=>"red"}, "b"=>{"color"=>"blue"}}
+ assert_equal 1, @filter.where(hash, "color", "red").length
+ assert_equal [{"color"=>"red"}], @filter.where(hash, "color", "red")
+ end
+
should "filter objects appropriately" do
assert_equal 2, @filter.where(@array_of_objects, "color", "red").length
end
+
+ should "stringify during comparison for compatibility with liquid parsing" do
+ hash = {
+ "The Words" => {"rating" => 1.2, "featured" => false},
+ "Limitless" => {"rating" => 9.2, "featured" => true},
+ "Hustle" => {"rating" => 4.7, "featured" => true},
+ }
+
+ results = @filter.where(hash, "featured", "true")
+ assert_equal 2, results.length
+ assert_equal 9.2, results[0]["rating"]
+ assert_equal 4.7, results[1]["rating"]
+
+ results = @filter.where(hash, "rating", 4.7)
+ assert_equal 1, results.length
+ assert_equal 4.7, results[0]["rating"]
+ end
end
context "sort filter" do
+ should "raise Exception when input is nil" do
+ err = assert_raises ArgumentError do
+ @filter.sort(nil)
+ end
+ assert_equal "Cannot sort a null object.", err.message
+ end
should "return sorted numbers" do
assert_equal [1, 2, 2.2, 3], @filter.sort([3, 2.2, 2, 1])
end
@@ -203,5 +332,61 @@ class TestFilters < Test::Unit::TestCase
end
end
+ context "inspect filter" do
+ should "return a HTML-escaped string representation of an object" do
+ assert_equal "{"<a>"=>1}", @filter.inspect({ "<a>" => 1 })
+ end
+ end
+
+ context "slugify filter" do
+ should "return a slugified string" do
+ assert_equal "q-bert-says", @filter.slugify(" Q*bert says @!#?@!")
+ end
+
+ should "return a slugified string with mode" do
+ assert_equal "q-bert-says-@!-@!", @filter.slugify(" Q*bert says @!#?@!", "pretty")
+ end
+ end
+
+ context "push filter" do
+ should "return a new array with the element pushed to the end" do
+ assert_equal %w{hi there bernie}, @filter.push(%w{hi there}, "bernie")
+ end
+ end
+
+ context "pop filter" do
+ should "return a new array with the last element popped" do
+ assert_equal %w{hi there}, @filter.pop(%w{hi there bernie})
+ end
+
+ should "allow multiple els to be popped" do
+ assert_equal %w{hi there bert}, @filter.pop(%w{hi there bert and ernie}, 2)
+ end
+
+ should "cast string inputs for # into nums" do
+ assert_equal %w{hi there bert}, @filter.pop(%w{hi there bert and ernie}, "2")
+ end
+ end
+
+ context "shift filter" do
+ should "return a new array with the element removed from the front" do
+ assert_equal %w{a friendly greeting}, @filter.shift(%w{just a friendly greeting})
+ end
+
+ should "allow multiple els to be shifted" do
+ assert_equal %w{bert and ernie}, @filter.shift(%w{hi there bert and ernie}, 2)
+ end
+
+ should "cast string inputs for # into nums" do
+ assert_equal %w{bert and ernie}, @filter.shift(%w{hi there bert and ernie}, "2")
+ end
+ end
+
+ context "unshift filter" do
+ should "return a new array with the element put at the front" do
+ assert_equal %w{aloha there bernie}, @filter.unshift(%w{there bernie}, "aloha")
+ end
+ end
+
end
end
diff --git a/test/test_front_matter_defaults.rb b/test/test_front_matter_defaults.rb
new file mode 100644
index 0000000..99efede
--- /dev/null
+++ b/test/test_front_matter_defaults.rb
@@ -0,0 +1,178 @@
+require 'helper'
+
+class TestFrontMatterDefaults < JekyllUnitTest
+
+ context "A site with full front matter defaults" do
+ setup do
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "defaults" => [{
+ "scope" => {
+ "path" => "contacts",
+ "type" => "page"
+ },
+ "values" => {
+ "key" => "val"
+ }
+ }]
+ }))
+ @site.process
+ @affected = @site.pages.find { |page| page.relative_path == "/contacts/bar.html" }
+ @not_affected = @site.pages.find { |page| page.relative_path == "about.html" }
+ end
+
+ should "affect only the specified path and type" do
+ assert_equal @affected.data["key"], "val"
+ assert_equal @not_affected.data["key"], nil
+ end
+ end
+
+ context "A site with front matter type pages and an extension" do
+ setup do
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "defaults" => [{
+ "scope" => {
+ "path" => "index.html"
+ },
+ "values" => {
+ "key" => "val"
+ }
+ }]
+ }))
+
+ @site.process
+ @affected = @site.pages.find { |page| page.relative_path == "index.html" }
+ @not_affected = @site.pages.find { |page| page.relative_path == "about.html" }
+ end
+
+ should "affect only the specified path" do
+ assert_equal @affected.data["key"], "val"
+ assert_equal @not_affected.data["key"], nil
+ end
+ end
+
+ context "A site with front matter defaults with no type" do
+ setup do
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "defaults" => [{
+ "scope" => {
+ "path" => "win"
+ },
+ "values" => {
+ "key" => "val"
+ }
+ }]
+ }))
+ @site.process
+ @affected = @site.posts.docs.find { |page| page.relative_path =~ /win\// }
+ @not_affected = @site.pages.find { |page| page.relative_path == "about.html" }
+ end
+
+ should "affect only the specified path and all types" do
+ assert_equal @affected.data["key"], "val"
+ assert_equal @not_affected.data["key"], nil
+ end
+ end
+
+ context "A site with front matter defaults with no path and a deprecated type" do
+ setup do
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "defaults" => [{
+ "scope" => {
+ "type" => "page"
+ },
+ "values" => {
+ "key" => "val"
+ }
+ }]
+ }))
+ @site.process
+ @affected = @site.pages
+ @not_affected = @site.posts.docs
+ end
+
+ should "affect only the specified type and all paths" do
+ assert_equal @affected.reject { |page| page.data["key"] == "val" }, []
+ assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, @not_affected
+ end
+ end
+
+ context "A site with front matter defaults with no path" do
+ setup do
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "defaults" => [{
+ "scope" => {
+ "type" => "pages"
+ },
+ "values" => {
+ "key" => "val"
+ }
+ }]
+ }))
+ @site.process
+ @affected = @site.pages
+ @not_affected = @site.posts.docs
+ end
+
+ should "affect only the specified type and all paths" do
+ assert_equal @affected.reject { |page| page.data["key"] == "val" }, []
+ assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, @not_affected
+ end
+ end
+
+ context "A site with front matter defaults with no path or type" do
+ setup do
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "defaults" => [{
+ "scope" => {
+ },
+ "values" => {
+ "key" => "val"
+ }
+ }]
+ }))
+ @site.process
+ @affected = @site.pages
+ @not_affected = @site.posts
+ end
+
+ should "affect all types and paths" do
+ assert_equal @affected.reject { |page| page.data["key"] == "val" }, []
+ assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, []
+ end
+ end
+
+ context "A site with front matter defaults with no scope" do
+ setup do
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "defaults" => [{
+ "values" => {
+ "key" => "val"
+ }
+ }]
+ }))
+ @site.process
+ @affected = @site.pages
+ @not_affected = @site.posts
+ end
+
+ should "affect all types and paths" do
+ assert_equal @affected.reject { |page| page.data["key"] == "val" }, []
+ assert_equal @not_affected.reject { |page| page.data["key"] == "val" }, []
+ end
+ end
+
+end
diff --git a/test/test_generated_site.rb b/test/test_generated_site.rb
index ca3124c..88e0fe9 100644
--- a/test/test_generated_site.rb
+++ b/test/test_generated_site.rb
@@ -1,20 +1,18 @@
require 'helper'
-class TestGeneratedSite < Test::Unit::TestCase
+class TestGeneratedSite < JekyllUnitTest
context "generated sites" do
setup do
clear_dest
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
- end
+ config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
- @site = Site.new(Jekyll.configuration)
+ @site = fixture_site config
@site.process
@index = File.read(dest_dir('index.html'))
end
should "ensure post count is as expected" do
- assert_equal 42, @site.posts.size
+ assert_equal 48, @site.posts.size
end
should "insert site.posts into the index" do
@@ -46,11 +44,12 @@ class TestGeneratedSite < Test::Unit::TestCase
end
should "print a nice list of static files" do
+ time_regexp = "\\d+:\\d+"
expected_output = Regexp.new <<-OUTPUT
-- /css/screen.css last edited at \\d+ with extname .css
-- /pgp.key last edited at \\d+ with extname .key
-- /products.yml last edited at \\d+ with extname .yml
-- /symlink-test/symlinked-dir/screen.css last edited at \\d+ with extname .css
+- /css/screen.css last edited at #{time_regexp} with extname .css
+- /pgp.key last edited at #{time_regexp} with extname .key
+- /products.yml last edited at #{time_regexp} with extname .yml
+- /symlink-test/symlinked-dir/screen.css last edited at #{time_regexp} with extname .css
OUTPUT
assert_match expected_output, File.read(dest_dir('static_files.html'))
end
@@ -59,11 +58,8 @@ OUTPUT
context "generating limited posts" do
setup do
clear_dest
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => 5})
- end
-
- @site = Site.new(Jekyll.configuration)
+ config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => 5})
+ @site = fixture_site config
@site.process
@index = File.read(dest_dir('index.html'))
end
@@ -73,25 +69,19 @@ OUTPUT
end
should "ensure limit posts is 0 or more" do
- assert_raise ArgumentError do
+ assert_raises ArgumentError do
clear_dest
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => -1})
- end
+ config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => -1})
- @site = Site.new(Jekyll.configuration)
+ @site = fixture_site config
end
end
should "acceptable limit post is 0" do
- assert_nothing_raised ArgumentError do
- clear_dest
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => 0})
- end
+ clear_dest
+ config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'limit_posts' => 0})
- @site = Site.new(Jekyll.configuration)
- end
+ assert Site.new(config), "Couldn't create a site with the given limit_posts."
end
end
end
diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb
index f2bd8a0..b7f4492 100644
--- a/test/test_kramdown.rb
+++ b/test/test_kramdown.rb
@@ -2,7 +2,7 @@
require 'helper'
-class TestKramdown < Test::Unit::TestCase
+class TestKramdown < JekyllUnitTest
context "kramdown" do
setup do
@config = {
@@ -14,7 +14,7 @@ class TestKramdown < Test::Unit::TestCase
'toc_levels' => '1..6',
'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo',
- 'use_coderay' => true,
+ 'enable_coderay' => true,
'coderay_bold_every'=> 12,
'coderay' => {
'coderay_css' => :style,
@@ -39,6 +39,16 @@ class TestKramdown < Test::Unit::TestCase
assert_match /<p>(«|«)Pit(›|›)hy(»|»)<\/p>/, markdown.convert(%{"Pit'hy"}).strip
end
+ should "render fenced code blocks with syntax highlighting" do
+ assert_equal "<div class=\"highlighter-rouge\"><pre class=\"highlight\"><code><span class=\"nb\">puts</span> <span class=\"s2\">\"Hello world\"</span>\n</code></pre>\n</div>", @markdown.convert(
+ <<-EOS
+~~~ruby
+puts "Hello world"
+~~~
+ EOS
+ ).strip
+ end
+
context "moving up nested coderay options" do
setup do
@markdown.convert('some markup')
diff --git a/test/test_layout_reader.rb b/test/test_layout_reader.rb
index ff979c2..88f3522 100644
--- a/test/test_layout_reader.rb
+++ b/test/test_layout_reader.rb
@@ -1,12 +1,10 @@
require 'helper'
-class TestLayoutReader < Test::Unit::TestCase
+class TestLayoutReader < JekyllUnitTest
context "reading layouts" do
setup do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
- end
- @site = Site.new(Jekyll.configuration)
+ config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
+ @site = fixture_site config
end
should "read layouts" do
@@ -22,8 +20,8 @@ class TestLayoutReader < Test::Unit::TestCase
context "when a _layouts directory exists in CWD" do
setup do
- stub(File).directory? { true }
- stub(Dir).pwd { source_dir("blah") }
+ allow(File).to receive(:directory?).and_return(true)
+ allow(Dir).to receive(:pwd).and_return(source_dir("blah"))
end
should "know to use the layout directory relative to CWD" do
diff --git a/test/test_liquid_extensions.rb b/test/test_liquid_extensions.rb
index 2395a8d..0ab95e9 100644
--- a/test/test_liquid_extensions.rb
+++ b/test/test_liquid_extensions.rb
@@ -1,6 +1,6 @@
require 'helper'
-class TestLiquidExtensions < Test::Unit::TestCase
+class TestLiquidExtensions < JekyllUnitTest
context "looking up a variable in a Liquid context" do
class SayHi < Liquid::Tag
diff --git a/test/test_liquid_renderer.rb b/test/test_liquid_renderer.rb
new file mode 100644
index 0000000..d727fac
--- /dev/null
+++ b/test/test_liquid_renderer.rb
@@ -0,0 +1,26 @@
+require 'helper'
+
+class TestLiquidRenderer < JekyllUnitTest
+ context "profiler" do
+ setup do
+ @site = Site.new(site_configuration)
+ @renderer = @site.liquid_renderer
+ end
+
+ should "return a table with profiling results" do
+ @site.process
+
+ output = @renderer.stats_table
+
+ expected = [
+ /^Filename\s+|\s+Count\s+|\s+Bytes\s+|\s+Time$/,
+ /^-+\++-+\++-+\++-+$/,
+ /^_posts\/2010-01-09-date-override\.markdown\s+|\s+\d+\s+|\s+\d+\.\d{2}K\s+|\s+\d+\.\d{3}$/,
+ ]
+
+ expected.each do |regexp|
+ assert_match regexp, output
+ end
+ end
+ end
+end
diff --git a/test/test_log_adapter.rb b/test/test_log_adapter.rb
index 3dd3465..0160d82 100644
--- a/test/test_log_adapter.rb
+++ b/test/test_log_adapter.rb
@@ -1,8 +1,13 @@
require 'helper'
-class TestLogAdapter < Test::Unit::TestCase
+class TestLogAdapter < JekyllUnitTest
class LoggerDouble
attr_accessor :level
+
+ def debug(*); end
+ def info(*); end
+ def warn(*); end
+ def error(*); end
end
context "#log_level=" do
@@ -13,11 +18,47 @@ class TestLogAdapter < Test::Unit::TestCase
end
end
+ context "#adjust_verbosity" do
+ should "set the writers logging level to error when quiet" do
+ subject = Jekyll::LogAdapter.new(LoggerDouble.new)
+ subject.adjust_verbosity(:quiet => true)
+ assert_equal Jekyll::LogAdapter::LOG_LEVELS[:error], subject.writer.level
+ end
+
+ should "set the writers logging level to debug when verbose" do
+ subject = Jekyll::LogAdapter.new(LoggerDouble.new)
+ subject.adjust_verbosity(:verbose => true)
+ assert_equal Jekyll::LogAdapter::LOG_LEVELS[:debug], subject.writer.level
+ end
+
+ should "set the writers logging level to error when quiet and verbose are both set" do
+ subject = Jekyll::LogAdapter.new(LoggerDouble.new)
+ subject.adjust_verbosity(:quiet => true, :verbose => true)
+ assert_equal Jekyll::LogAdapter::LOG_LEVELS[:error], subject.writer.level
+ end
+
+ should "not change the writer's logging level when neither verbose or quiet" do
+ subject = Jekyll::LogAdapter.new(LoggerDouble.new)
+ original_level = subject.writer.level
+ refute_equal Jekyll::LogAdapter::LOG_LEVELS[:error], subject.writer.level
+ refute_equal Jekyll::LogAdapter::LOG_LEVELS[:debug], subject.writer.level
+ subject.adjust_verbosity(:quiet => false, :verbose => false)
+ assert_equal original_level, subject.writer.level
+ end
+
+ should "call #debug on writer return true" do
+ writer = LoggerDouble.new
+ logger = Jekyll::LogAdapter.new(writer)
+ allow(writer).to receive(:debug).and_return(true)
+ assert logger.adjust_verbosity
+ end
+ end
+
context "#debug" do
should "call #debug on writer return true" do
writer = LoggerDouble.new
logger = Jekyll::LogAdapter.new(writer)
- stub(writer).debug('topic '.rjust(20) + 'log message') { true }
+ allow(writer).to receive(:debug).with('topic '.rjust(20) + 'log message').and_return(true)
assert logger.debug('topic', 'log message')
end
end
@@ -26,7 +67,7 @@ class TestLogAdapter < Test::Unit::TestCase
should "call #info on writer return true" do
writer = LoggerDouble.new
logger = Jekyll::LogAdapter.new(writer)
- stub(writer).info('topic '.rjust(20) + 'log message') { true }
+ allow(writer).to receive(:info).with('topic '.rjust(20) + 'log message').and_return(true)
assert logger.info('topic', 'log message')
end
end
@@ -35,7 +76,7 @@ class TestLogAdapter < Test::Unit::TestCase
should "call #warn on writer return true" do
writer = LoggerDouble.new
logger = Jekyll::LogAdapter.new(writer)
- stub(writer).warn('topic '.rjust(20) + 'log message') { true }
+ allow(writer).to receive(:warn).with('topic '.rjust(20) + 'log message').and_return(true)
assert logger.warn('topic', 'log message')
end
end
@@ -44,7 +85,7 @@ class TestLogAdapter < Test::Unit::TestCase
should "call #error on writer return true" do
writer = LoggerDouble.new
logger = Jekyll::LogAdapter.new(writer)
- stub(writer).error('topic '.rjust(20) + 'log message') { true }
+ allow(writer).to receive(:error).with('topic '.rjust(20) + 'log message').and_return(true)
assert logger.error('topic', 'log message')
end
end
@@ -52,8 +93,24 @@ class TestLogAdapter < Test::Unit::TestCase
context "#abort_with" do
should "call #error and abort" do
logger = Jekyll::LogAdapter.new(LoggerDouble.new)
- stub(logger).error('topic', 'log message') { true }
- assert_raise(SystemExit) { logger.abort_with('topic', 'log message') }
+ allow(logger).to receive(:error).with('topic', 'log message').and_return(true)
+ assert_raises(SystemExit) { logger.abort_with('topic', 'log message') }
+ end
+ end
+
+ context "#messages" do
+ should "return an array" do
+ assert_equal [], Jekyll::LogAdapter.new(LoggerDouble.new).messages
+ end
+
+ should "store each log value in the array" do
+ logger = Jekyll::LogAdapter.new(LoggerDouble.new)
+ values = %w{one two three four}
+ logger.debug(values[0])
+ logger.info(values[1])
+ logger.warn(values[2])
+ logger.error(values[3])
+ assert_equal values.map { |value| "#{value} ".rjust(20) }, logger.messages
end
end
end
diff --git a/test/test_new_command.rb b/test/test_new_command.rb
index bc58bd2..33bd104 100644
--- a/test/test_new_command.rb
+++ b/test/test_new_command.rb
@@ -1,7 +1,7 @@
require 'helper'
require 'jekyll/commands/new'
-class TestNewCommand < Test::Unit::TestCase
+class TestNewCommand < JekyllUnitTest
def dir_contents(path)
Dir["#{path}/**/*"].each do |file|
file.gsub! path, ''
@@ -25,14 +25,15 @@ class TestNewCommand < Test::Unit::TestCase
should 'create a new directory' do
assert !File.exist?(@full_path)
- capture_stdout { Jekyll::Commands::New.process(@args) }
+ Jekyll::Commands::New.process(@args)
assert File.exist?(@full_path)
end
should 'display a success message' do
- output = capture_stdout { Jekyll::Commands::New.process(@args) }
- success_message = "New jekyll site installed in #{@full_path}. \n"
- assert_equal success_message, output
+ Jekyll::Commands::New.process(@args)
+ output = Jekyll.logger.messages.last
+ success_message = "New jekyll site installed in #{@full_path}."
+ assert_includes output, success_message
end
should 'copy the static files in site template to the new directory' do
@@ -55,7 +56,7 @@ class TestNewCommand < Test::Unit::TestCase
end
stubbed_date = '2013-01-01'
- stub.instance_of(Time).strftime { stubbed_date }
+ allow_any_instance_of(Time).to receive(:strftime) { stubbed_date }
erb_template_files.each do |f|
f.chomp! '.erb'
@@ -70,6 +71,18 @@ class TestNewCommand < Test::Unit::TestCase
assert_same_elements erb_template_files, new_site_files
end
+
+ should 'create blank project' do
+ blank_contents = %w(/_drafts /_layouts /_posts /index.html)
+ capture_stdout { Jekyll::Commands::New.process(@args, '--blank') }
+ assert_same_elements blank_contents, dir_contents(@full_path)
+ end
+
+ should 'force created folder' do
+ capture_stdout { Jekyll::Commands::New.process(@args) }
+ output = capture_stdout { Jekyll::Commands::New.process(@args, '--force') }
+ assert_match /New jekyll site installed in/, output
+ end
end
context 'when multiple args are given' do
@@ -95,7 +108,7 @@ class TestNewCommand < Test::Unit::TestCase
end
should 'raise an ArgumentError' do
- exception = assert_raise ArgumentError do
+ exception = assert_raises ArgumentError do
Jekyll::Commands::New.process(@empty_args)
end
assert_equal 'You must specify a path.', exception.message
diff --git a/test/test_page.rb b/test/test_page.rb
index b34b511..1e4d3da 100644
--- a/test/test_page.rb
+++ b/test/test_page.rb
@@ -1,6 +1,6 @@
require 'helper'
-class TestPage < Test::Unit::TestCase
+class TestPage < JekyllUnitTest
def setup_page(*args)
dir, file = args
dir, file = ['', dir] if file.nil?
@@ -15,8 +15,11 @@ class TestPage < Test::Unit::TestCase
context "A Page" do
setup do
clear_dest
- stub(Jekyll).configuration { Jekyll::Configuration::DEFAULTS }
- @site = Site.new(Jekyll.configuration)
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "skip_config_files" => true
+ }))
end
context "processing pages" do
@@ -43,7 +46,7 @@ class TestPage < Test::Unit::TestCase
should "create index url based on filename" do
@page = setup_page('/contacts', 'index.html')
- assert_equal "/contacts/index.html", @page.url
+ assert_equal "/contacts/", @page.url
end
end
@@ -54,7 +57,11 @@ class TestPage < Test::Unit::TestCase
should "deal properly with dots" do
@page = setup_page('deal.with.dots.html')
+ @dest_file = dest_dir("deal.with.dots.html")
+
assert_equal "deal.with.dots", @page.basename
+ assert_equal "/deal.with.dots", @page.url
+ assert_equal @dest_file, @page.destination(dest_dir)
end
should "make properties accessible through #[]" do
@@ -80,14 +87,18 @@ class TestPage < Test::Unit::TestCase
end
end
- context "with pretty url style" do
+ context "with pretty permalink style" do
setup do
@site.permalink_style = :pretty
end
- should "return dir correctly" do
+ should "return dir, url, and destination correctly" do
@page = setup_page('contacts.html')
+ @dest_file = dest_dir("contacts/index.html")
+
assert_equal '/contacts/', @page.dir
+ assert_equal '/contacts/', @page.url
+ assert_equal @dest_file, @page.destination(dest_dir)
end
should "return dir correctly for index page" do
@@ -118,7 +129,59 @@ class TestPage < Test::Unit::TestCase
end
end
- context "with any other url style" do
+ context "with date permalink style" do
+ setup do
+ @site.permalink_style = :date
+ end
+
+ should "return url and destination correctly" do
+ @page = setup_page('contacts.html')
+ @dest_file = dest_dir("contacts.html")
+ assert_equal '/contacts.html', @page.url
+ assert_equal @dest_file, @page.destination(dest_dir)
+ end
+ end
+
+ context "with custom permalink style with trailing slash" do
+ setup do
+ @site.permalink_style = "/:title/"
+ end
+
+ should "return url and destination correctly" do
+ @page = setup_page('contacts.html')
+ @dest_file = dest_dir("contacts/index.html")
+ assert_equal '/contacts/', @page.url
+ assert_equal @dest_file, @page.destination(dest_dir)
+ end
+ end
+
+ context "with custom permalink style with file extension" do
+ setup do
+ @site.permalink_style = "/:title:output_ext"
+ end
+
+ should "return url and destination correctly" do
+ @page = setup_page('contacts.html')
+ @dest_file = dest_dir("contacts.html")
+ assert_equal '/contacts.html', @page.url
+ assert_equal @dest_file, @page.destination(dest_dir)
+ end
+ end
+
+ context "with custom permalink style with no extension" do
+ setup do
+ @site.permalink_style = "/:title"
+ end
+
+ should "return url and destination correctly" do
+ @page = setup_page('contacts.html')
+ @dest_file = dest_dir("contacts.html")
+ assert_equal '/contacts', @page.url
+ assert_equal @dest_file, @page.destination(dest_dir)
+ end
+ end
+
+ context "with any other permalink style" do
should "return dir correctly" do
@site.permalink_style = nil
@page = setup_page('contacts.html')
@@ -176,7 +239,7 @@ class TestPage < Test::Unit::TestCase
page.write(dest_dir)
assert File.directory?(dest_dir)
- assert File.exist?(File.join(dest_dir, '+', 'plus+in+url'))
+ assert File.exist?(File.join(dest_dir, '+', 'plus+in+url.html'))
end
should "write even when permalink has '%# +'" do
diff --git a/test/test_path_sanitization.rb b/test/test_path_sanitization.rb
index fa10e87..b04a2ba 100644
--- a/test/test_path_sanitization.rb
+++ b/test/test_path_sanitization.rb
@@ -1,11 +1,11 @@
require 'helper'
-class TestPathSanitization < Test::Unit::TestCase
+class TestPathSanitization < JekyllUnitTest
context "on Windows with absolute source" do
setup do
@source = "C:/Users/xmr/Desktop/mpc-hc.org"
@dest = "./_site/"
- stub(Dir).pwd { "C:/Users/xmr/Desktop/mpc-hc.org" }
+ allow(Dir).to receive(:pwd).and_return("C:/Users/xmr/Desktop/mpc-hc.org")
end
should "strip drive name from path" do
assert_equal "C:/Users/xmr/Desktop/mpc-hc.org/_site", Jekyll.sanitized_path(@source, @dest)
diff --git a/test/test_plugin_manager.rb b/test/test_plugin_manager.rb
new file mode 100644
index 0000000..9cdb45d
--- /dev/null
+++ b/test/test_plugin_manager.rb
@@ -0,0 +1,33 @@
+require 'helper'
+
+class TestPluginManager < JekyllUnitTest
+ def with_no_gemfile
+ FileUtils.mv "Gemfile", "Gemfile.old"
+ yield
+ ensure
+ FileUtils.mv "Gemfile.old", "Gemfile"
+ end
+
+ def test_requiring_from_bundler
+ with_env("JEKYLL_NO_BUNDLER_REQUIRE", nil) do
+ assert Jekyll::PluginManager.require_from_bundler, 'require_from_bundler should return true.'
+ assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"], 'Gemfile plugins were not required.'
+ end
+ end
+
+ def test_blocking_requiring_from_bundler
+ with_env("JEKYLL_NO_BUNDLER_REQUIRE", "true") do
+ assert_equal false, Jekyll::PluginManager.require_from_bundler, "Gemfile plugins were required but shouldn't have been"
+ assert ENV["JEKYLL_NO_BUNDLER_REQUIRE"]
+ end
+ end
+
+ def test_no_gemfile
+ with_env("JEKYLL_NO_BUNDLER_REQUIRE", nil) do
+ with_no_gemfile do
+ assert_equal false, Jekyll::PluginManager.require_from_bundler, "Gemfile plugins were required but shouldn't have been"
+ assert_nil ENV["JEKYLL_NO_BUNDLER_REQUIRE"]
+ end
+ end
+ end
+end
diff --git a/test/test_post.rb b/test/test_post.rb
deleted file mode 100644
index bf9b741..0000000
--- a/test/test_post.rb
+++ /dev/null
@@ -1,741 +0,0 @@
-# encoding: utf-8
-
-require 'helper'
-
-class TestPost < Test::Unit::TestCase
- def setup_post(file)
- Post.new(@site, source_dir, '', file)
- end
-
- def do_render(post)
- layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")}
- post.render(layouts, {"site" => {"posts" => []}})
- end
-
- context "A Post" do
- setup do
- clear_dest
- stub(Jekyll).configuration { Jekyll::Configuration::DEFAULTS }
- @site = Site.new(Jekyll.configuration)
- end
-
- should "ensure valid posts are valid" do
- assert Post.valid?("2008-09-09-foo-bar.textile")
- assert Post.valid?("foo/bar/2008-09-09-foo-bar.textile")
-
- assert !Post.valid?("lol2008-09-09-foo-bar.textile")
- assert !Post.valid?("blah")
- end
-
- should "make properties accessible through #[]" do
- post = setup_post('2013-12-20-properties.text')
-
- attrs = {
- categories: %w(foo bar baz),
- content: "All the properties.\n\nPlus an excerpt.\n",
- date: Time.new(2013, 12, 20),
- dir: "/foo/bar/baz/2013/12/20",
- excerpt: "All the properties.\n\n",
- foo: 'bar',
- id: "/foo/bar/baz/2013/12/20/properties",
- layout: 'default',
- name: nil,
- path: "_posts/2013-12-20-properties.text",
- permalink: nil,
- published: nil,
- tags: %w(ay bee cee),
- title: 'Properties Post',
- url: "/foo/bar/baz/2013/12/20/properties.html"
- }
-
- attrs.each do |attr, val|
- attr_str = attr.to_s
- result = post[attr_str]
- assert_equal val, result, "For <post[\"#{attr_str}\"]>:"
- end
- end
-
- context "processing posts" do
- setup do
- @post = Post.allocate
- @post.site = @site
-
- @real_file = "2008-10-18-foo-bar.textile"
- @fake_file = "2008-09-09-foo-bar.textile"
- @source = source_dir('_posts')
- end
-
- should "keep date, title, and markup type" do
- @post.categories = []
- @post.process(@fake_file)
-
- assert_equal Time.parse("2008-09-09"), @post.date
- assert_equal "foo-bar", @post.slug
- assert_equal ".textile", @post.ext
- assert_equal "/2008/09/09", @post.dir
- assert_equal "/2008/09/09/foo-bar", @post.id
- end
-
- should "keep categories" do
- post = Post.allocate
- post.site = @site
- post.process("cat1/2008-09-09-foo-bar.textile")
- assert_equal 1, post.categories.size
- assert_equal "cat1", post.categories[0]
-
- post = Post.allocate
- post.site = @site
- post.process("cat2/CAT3/2008-09-09-foo-bar.textile")
- assert_equal 2, post.categories.size
- assert_equal "cat2", post.categories[0]
- assert_equal "cat3", post.categories[1]
- end
-
- should "create url based on date and title" do
- @post.categories = []
- @post.process(@fake_file)
- assert_equal "/2008/09/09/foo-bar.html", @post.url
- end
-
- should "raise a good error on invalid post date" do
- assert_raise Jekyll::Errors::FatalException do
- @post.process("2009-27-03-foo-bar.textile")
- end
- end
-
- should "escape urls" do
- @post.categories = []
- @post.process("2009-03-12-hash-#1.markdown")
- assert_equal "/2009/03/12/hash-%231.html", @post.url
- assert_equal "/2009/03/12/hash-#1", @post.id
- end
-
- should "escape urls with non-alphabetic characters" do
- @post.categories = []
- @post.process("2014-03-22-escape-+ %20[].markdown")
- assert_equal "/2014/03/22/escape-+%20%2520%5B%5D.html", @post.url
- assert_equal "/2014/03/22/escape-+ %20[]", @post.id
- end
-
- should "return a UTF-8 escaped string" do
- assert_equal Encoding::UTF_8, URL.escape_path("/rails笔记/2014/04/20/escaped/").encoding
- end
-
- should "return a UTF-8 unescaped string" do
- assert_equal Encoding::UTF_8, URL.unescape_path("/rails%E7%AC%94%E8%AE%B0/2014/04/20/escaped/".encode(Encoding::ASCII)).encoding
- end
-
- should "respect permalink in yaml front matter" do
- file = "2008-12-03-permalinked-post.textile"
- @post.process(file)
- @post.read_yaml(@source, file)
-
- assert_equal "my_category/permalinked-post", @post.permalink
- assert_equal "/my_category", @post.dir
- assert_equal "/my_category/permalinked-post", @post.url
- end
-
- should "not be writable outside of destination" do
- unexpected = File.expand_path("../../../baddie.html", dest_dir)
- File.delete unexpected if File.exist?(unexpected)
- post = setup_post("2014-01-06-permalink-traversal.md")
- do_render(post)
- post.write(dest_dir)
-
- assert !File.exist?(unexpected)
- assert File.exist?(File.expand_path("baddie.html", dest_dir))
- end
-
- context "with CRLF linebreaks" do
- setup do
- @real_file = "2009-05-24-yaml-linebreak.markdown"
- @source = source_dir('win/_posts')
- end
- should "read yaml front-matter" do
- @post.read_yaml(@source, @real_file)
-
- assert_equal({"title" => "Test title", "layout" => "post", "tag" => "Ruby"}, @post.data)
- assert_equal "This is the content", @post.content
- end
- end
-
- context "with three dots ending YAML header" do
- setup do
- @real_file = "2014-03-03-yaml-with-dots.md"
- end
- should "should read the YAML header" do
- @post.read_yaml(@source, @real_file)
-
- assert_equal({"title" => "Test Post Where YAML Ends in Dots"},
- @post.data)
- end
- end
-
- context "with embedded triple dash" do
- setup do
- @real_file = "2010-01-08-triple-dash.markdown"
- end
- should "consume the embedded dashes" do
- @post.read_yaml(@source, @real_file)
-
- assert_equal({"title" => "Foo --- Bar"}, @post.data)
- assert_equal "Triple the fun!", @post.content
- end
- end
-
- context "with site wide permalink" do
- setup do
- @post.categories = []
- end
-
- context "with unspecified (date) style" do
- setup do
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
- assert_equal "/2008/09/09/foo-bar.html", @post.url
- end
- end
-
- context "with unspecified (date) style and a category" do
- setup do
- @post.categories << "beer"
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
- assert_equal "/beer/2008/09/09/foo-bar.html", @post.url
- end
- end
-
- context "with unspecified (date) style and a numeric category" do
- setup do
- @post.categories << 2013
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
- assert_equal "/2013/2008/09/09/foo-bar.html", @post.url
- end
- end
-
- context "with specified layout of nil" do
- setup do
- file = '2013-01-12-nil-layout.textile'
- @post = setup_post(file)
- @post.process(file)
- end
-
- should "layout of nil is respected" do
- assert_equal "nil", @post.data["layout"]
- end
- end
-
- context "with unspecified (date) style and categories" do
- setup do
- @post.categories << "food"
- @post.categories << "beer"
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
- assert_equal "/food/beer/2008/09/09/foo-bar.html", @post.url
- end
- end
-
- context "with space (categories)" do
- setup do
- @post.categories << "French cuisine"
- @post.categories << "Belgian beer"
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
- assert_equal "/French%20cuisine/Belgian%20beer/2008/09/09/foo-bar.html", @post.url
- end
- end
-
- context "with none style" do
- setup do
- @post.site.permalink_style = :none
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:title.html", @post.template
- assert_equal "/foo-bar.html", @post.url
- end
- end
-
- context "with pretty style" do
- setup do
- @post.site.permalink_style = :pretty
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:year/:month/:day/:title/", @post.template
- assert_equal "/2008/09/09/foo-bar/", @post.url
- end
- end
-
- context "with ordinal style" do
- setup do
- @post.site.permalink_style = :ordinal
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/:categories/:year/:y_day/:title.html", @post.template
- assert_equal "/2008/253/foo-bar.html", @post.url
- end
- end
-
- context "with custom date permalink" do
- setup do
- @post.site.permalink_style = '/:categories/:year/:i_month/:i_day/:title/'
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/2008/9/9/foo-bar/", @post.url
- end
- end
-
- context "with custom abbreviated month date permalink" do
- setup do
- @post.site.permalink_style = '/:categories/:year/:short_month/:day/:title/'
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/2008/Sep/09/foo-bar/", @post.url
- end
- end
-
- context "with prefix style and no extension" do
- setup do
- @post.site.permalink_style = "/prefix/:title"
- @post.process(@fake_file)
- end
-
- should "process the url correctly" do
- assert_equal "/prefix/:title", @post.template
- assert_equal "/prefix/foo-bar", @post.url
- end
- end
- end
-
- should "read yaml front-matter" do
- @post.read_yaml(@source, @real_file)
-
- assert_equal({"title" => "Foo Bar", "layout" => "default"}, @post.data)
- assert_equal "h1. {{ page.title }}\n\nBest *post* ever", @post.content
- end
-
- should "transform textile" do
- @post.process(@real_file)
- @post.read_yaml(@source, @real_file)
- @post.transform
-
- assert_equal "<h1>{{ page.title }}</h1>\n<p>Best <strong>post</strong> ever</p>", @post.content
- end
-
- context "#excerpt" do
- setup do
- file = "2013-01-02-post-excerpt.markdown"
- @post = setup_post(file)
- @post.process(file)
- @post.read_yaml(@source, file)
- do_render(@post)
- end
-
- should "return first paragraph by default" do
- assert @post.excerpt.include?("First paragraph"), "contains first paragraph"
- assert !@post.excerpt.include?("Second paragraph"), "does not contains second paragraph"
- assert !@post.excerpt.include?("Third paragraph"), "does not contains third paragraph"
- end
-
- should "correctly resolve link references" do
- assert @post.excerpt.include?("www.jekyllrb.com"), "contains referenced link URL"
- end
-
- should "return rendered HTML" do
- assert_equal "<p>First paragraph with <a href=\"http://www.jekyllrb.com/\">link ref</a>.</p>\n\n",
- @post.excerpt
- end
-
- context "with excerpt_separator setting" do
- setup do
- file = "2013-01-02-post-excerpt.markdown"
-
- @post.site.config['excerpt_separator'] = "\n---\n"
-
- @post.process(file)
- @post.read_yaml(@source, file)
- @post.transform
- end
-
- should "respect given separator" do
- assert @post.excerpt.include?("First paragraph"), "contains first paragraph"
- assert @post.excerpt.include?("Second paragraph"), "contains second paragraph"
- assert !@post.excerpt.include?("Third paragraph"), "does not contains third paragraph"
- end
-
- should "replace separator with new-lines" do
- assert !@post.excerpt.include?("---"), "does not contains separator"
- end
- end
-
- context "with custom excerpt" do
- setup do
- file = "2013-04-11-custom-excerpt.markdown"
- @post = setup_post(file)
- do_render(@post)
- end
-
- should "use custom excerpt" do
- assert_equal("I can set a custom excerpt", @post.excerpt)
- end
-
- should "expose custom excerpt to liquid" do
- assert @post.content.include?("I can use the excerpt: <quote>I can set a custom excerpt</quote>"), "Exposes incorrect excerpt to liquid."
- end
-
- end
-
- end
- end
-
- context "when in a site" do
- setup do
- clear_dest
- stub(Jekyll).configuration { Jekyll::Configuration::DEFAULTS }
- @site = Site.new(Jekyll.configuration)
- @site.posts = [setup_post('2008-02-02-published.textile'),
- setup_post('2009-01-27-categories.textile')]
- end
-
- should "have next post" do
- assert_equal(@site.posts.last, @site.posts.first.next)
- end
-
- should "have previous post" do
- assert_equal(@site.posts.first, @site.posts.last.previous)
- end
-
- should "not have previous post if first" do
- assert_equal(nil, @site.posts.first.previous)
- end
-
- should "not have next post if last" do
- assert_equal(nil, @site.posts.last.next)
- end
- end
-
- context "initializing posts" do
- should "recognize date in yaml" do
- post = setup_post("2010-01-09-date-override.textile")
- do_render(post)
- assert_equal Time, post.date.class
- assert_equal Time, post.to_liquid["date"].class
- assert_equal "/2010/01/10/date-override.html", post.url
- assert_equal "<p>Post with a front matter date</p>\n<p>10 Jan 2010</p>", post.output
- end
-
- should "recognize time in yaml" do
- post = setup_post("2010-01-09-time-override.textile")
- do_render(post)
- assert_equal Time, post.date.class
- assert_equal Time, post.to_liquid["date"].class
- assert_equal "/2010/01/10/time-override.html", post.url
- assert_equal "<p>Post with a front matter time</p>\n<p>10 Jan 2010</p>", post.output
- end
-
- should "recognize time with timezone in yaml" do
- post = setup_post("2010-01-09-timezone-override.textile")
- do_render(post)
- assert_equal Time, post.date.class
- assert_equal Time, post.to_liquid["date"].class
- assert_equal "/2010/01/10/timezone-override.html", post.url
- assert_equal "<p>Post with a front matter time with timezone</p>\n<p>10 Jan 2010</p>", post.output
- end
-
- should "to_liquid prioritizes post attributes over data" do
- post = setup_post("2010-01-16-override-data.textile")
- assert_equal Array, post.tags.class
- assert_equal Array, post.to_liquid["tags"].class
- assert_equal Time, post.date.class
- assert_equal Time, post.to_liquid["date"].class
- end
-
- should "to_liquid should consider inheritance" do
- klass = Class.new(Jekyll::Post)
- assert_gets_called = false
- klass.send(:define_method, :assert_gets_called) { assert_gets_called = true }
- klass.const_set(:EXCERPT_ATTRIBUTES_FOR_LIQUID, Jekyll::Post::EXCERPT_ATTRIBUTES_FOR_LIQUID + ['assert_gets_called'])
- post = klass.new(@site, source_dir, '', "2008-02-02-published.textile")
- do_render(post)
-
- assert assert_gets_called, 'assert_gets_called did not get called on post.'
- end
-
- should "recognize category in yaml" do
- post = setup_post("2009-01-27-category.textile")
- assert post.categories.include?('foo')
- end
-
- should "recognize several categories in yaml" do
- post = setup_post("2009-01-27-categories.textile")
- assert post.categories.include?('foo')
- assert post.categories.include?('bar')
- assert post.categories.include?('baz')
- end
-
- should "recognize empty category in yaml" do
- post = setup_post("2009-01-27-empty-category.textile")
- assert_equal [], post.categories
- end
-
- should "recognize empty categories in yaml" do
- post = setup_post("2009-01-27-empty-categories.textile")
- assert_equal [], post.categories
- end
-
- should "recognize number category in yaml" do
- post = setup_post("2013-05-10-number-category.textile")
- assert post.categories.include?('2013')
- assert !post.categories.include?(2013)
- end
-
- should "recognize tag in yaml" do
- post = setup_post("2009-05-18-tag.textile")
- assert post.tags.include?('code')
- end
-
- should "recognize tags in yaml" do
- post = setup_post("2009-05-18-tags.textile")
- assert post.tags.include?('food')
- assert post.tags.include?('cooking')
- assert post.tags.include?('pizza')
- end
-
- should "recognize empty tag in yaml" do
- post = setup_post("2009-05-18-empty-tag.textile")
- assert_equal [], post.tags
- end
-
- should "recognize empty tags in yaml" do
- post = setup_post("2009-05-18-empty-tags.textile")
- assert_equal [], post.tags
- end
-
- should "allow no yaml" do
- post = setup_post("2009-06-22-no-yaml.textile")
- assert_equal "No YAML.", post.content
- end
-
- should "allow empty yaml" do
- post = setup_post("2009-06-22-empty-yaml.textile")
- assert_equal "Empty YAML.", post.content
- end
-
- context "rendering" do
- setup do
- clear_dest
- end
-
- should "render properly" do
- post = setup_post("2008-10-18-foo-bar.textile")
- do_render(post)
- assert_equal "<<< <h1>Foo Bar</h1>\n<p>Best <strong>post</strong> ever</p> >>>", post.output
- end
-
- should "write properly" do
- post = setup_post("2008-10-18-foo-bar.textile")
- do_render(post)
- post.write(dest_dir)
-
- assert File.directory?(dest_dir)
- assert File.exist?(File.join(dest_dir, '2008', '10', '18', 'foo-bar.html'))
- end
-
- should "write properly when url has hash" do
- post = setup_post("2009-03-12-hash-#1.markdown")
- do_render(post)
- post.write(dest_dir)
-
- assert File.directory?(dest_dir)
- assert File.exist?(File.join(dest_dir, '2009', '03', '12',
- 'hash-#1.html'))
- end
-
- should "write properly when url has space" do
- post = setup_post("2014-03-22-escape-+ %20[].markdown")
- do_render(post)
- post.write(dest_dir)
-
- assert File.directory?(dest_dir)
- assert File.exist?(File.join(dest_dir, '2014', '03', '22',
- 'escape-+ %20[].html'))
- end
-
- should "write properly without html extension" do
- post = setup_post("2008-10-18-foo-bar.textile")
- post.site.permalink_style = ":title"
- do_render(post)
- post.write(dest_dir)
-
- assert File.directory?(dest_dir)
- assert File.exist?(File.join(dest_dir, 'foo-bar', 'index.html'))
- end
-
- should "insert data" do
- post = setup_post("2008-11-21-complex.textile")
- do_render(post)
-
- assert_equal "<<< <p>url: /2008/11/21/complex.html<br />\ndate: #{Time.parse("2008-11-21")}<br />\nid: /2008/11/21/complex</p> >>>", post.output
- end
-
- should "include templates" do
- post = setup_post("2008-12-13-include.markdown")
- post.site.source = File.join(File.dirname(__FILE__), 'source')
- do_render(post)
-
- assert_equal "<<< <hr />\n<p>Tom Preston-Werner\ngithub.com/mojombo</p>\n\n<p>This <em>is</em> cool</p>\n >>>", post.output
- end
-
- should "render date specified in front matter properly" do
- post = setup_post("2010-01-09-date-override.textile")
- do_render(post)
-
- assert_equal "<p>Post with a front matter date</p>\n<p>10 Jan 2010</p>", post.output
- end
-
- should "render time specified in front matter properly" do
- post = setup_post("2010-01-09-time-override.textile")
- do_render(post)
-
- assert_equal "<p>Post with a front matter time</p>\n<p>10 Jan 2010</p>", post.output
- end
-
- end
- end
-
- should "generate categories and topics" do
- post = Post.new(@site, File.join(File.dirname(__FILE__), *%w[source]), 'foo', 'bar/2008-12-12-topical-post.textile')
- assert_equal ['foo', 'bar'], post.categories
- end
- end
-
- context "converter file extension settings" do
- setup do
- stub(Jekyll).configuration { Jekyll::Configuration::DEFAULTS }
- @site = Site.new(Jekyll.configuration)
- end
-
- should "process .md as markdown under default configuration" do
- post = setup_post '2011-04-12-md-extension.md'
- conv = post.converter
- assert conv.kind_of? Jekyll::Converters::Markdown
- end
-
- should "process .text as identity under default configuration" do
- post = setup_post '2011-04-12-text-extension.text'
- conv = post.converter
- assert conv.kind_of? Jekyll::Converters::Identity
- end
-
- should "process .text as markdown under alternate configuration" do
- @site.config['markdown_ext'] = 'markdown,mdw,mdwn,md,text'
- post = setup_post '2011-04-12-text-extension.text'
- conv = post.converter
- assert conv.kind_of? Jekyll::Converters::Markdown
- end
-
- should "process .md as markdown under alternate configuration" do
- @site.config['markdown_ext'] = 'markdown,mkd,mkdn,md,text'
- post = setup_post '2011-04-12-text-extension.text'
- conv = post.converter
- assert conv.kind_of? Jekyll::Converters::Markdown
- end
-
- should "process .mkdn under text if it is not in the markdown config" do
- @site.config['markdown_ext'] = 'markdown,mkd,md,text'
- post = setup_post '2013-08-01-mkdn-extension.mkdn'
- conv = post.converter
- assert conv.kind_of? Jekyll::Converters::Identity
- end
-
- should "process .text as textile under alternate configuration" do
- @site.config['textile_ext'] = 'textile,text'
- post = setup_post '2011-04-12-text-extension.text'
- conv = post.converter
- assert conv.kind_of? Jekyll::Converters::Textile
- end
-
- end
-
- context "site config with category" do
- setup do
- config = Jekyll::Configuration::DEFAULTS.merge({
- 'defaults' => [
- 'scope' => {
- 'path' => ''
- },
- 'values' => {
- 'category' => 'article'
- }
- ]
- })
- @site = Site.new(config)
- end
-
- should "return category if post does not specify category" do
- post = setup_post("2009-01-27-no-category.textile")
- assert post.categories.include?('article'), "Expected post.categories to include 'article' but did not."
- end
-
- should "override site category if set on post" do
- post = setup_post("2009-01-27-category.textile")
- assert post.categories.include?('foo'), "Expected post.categories to include 'foo' but did not."
- assert !post.categories.include?('article'), "Did not expect post.categories to include 'article' but it did."
- end
- end
-
- context "site config with categories" do
- setup do
- config = Jekyll::Configuration::DEFAULTS.merge({
- 'defaults' => [
- 'scope' => {
- 'path' => ''
- },
- 'values' => {
- 'categories' => ['article']
- }
- ]
- })
- @site = Site.new(config)
- end
-
- should "return categories if post does not specify categories" do
- post = setup_post("2009-01-27-no-category.textile")
- assert post.categories.include?('article'), "Expected post.categories to include 'article' but did not."
- end
-
- should "override site categories if set on post" do
- post = setup_post("2009-01-27-categories.textile")
- ['foo', 'bar', 'baz'].each do |category|
- assert post.categories.include?(category), "Expected post.categories to include '#{category}' but did not."
- end
- assert !post.categories.include?('article'), "Did not expect post.categories to include 'article' but it did."
- end
- end
-
-end
diff --git a/test/test_rdiscount.rb b/test/test_rdiscount.rb
index ed2c6f9..9644640 100644
--- a/test/test_rdiscount.rb
+++ b/test/test_rdiscount.rb
@@ -1,13 +1,25 @@
require 'helper'
-class TestRdiscount < Test::Unit::TestCase
+class TestRdiscount < JekyllUnitTest
context "rdiscount" do
setup do
+ if jruby?
+ then skip(
+ "JRuby does not perform well with CExt, test disabled."
+ )
+ end
+
config = {
'markdown' => 'rdiscount',
- 'rdiscount' => { 'extensions' => ['smart', 'generate_toc'], 'toc_token' => '{:toc}' }
+ 'rdiscount' => {
+ 'toc_token' => '{:toc}',
+ 'extensions' => [
+ 'smart', 'generate_toc'
+ ],
+ }
}
+
@markdown = Converters::Markdown.new config
end
@@ -16,7 +28,24 @@ class TestRdiscount < Test::Unit::TestCase
end
should "render toc" do
- assert_equal "<h1 id=\"Header+1\">Header 1</h1>\n\n<h2 id=\"Header+2\">Header 2</h2>\n\n<p>\n <ul>\n <li><a href=\"#Header+1\">Header 1</a>\n <ul>\n <li><a href=\"#Header+2\">Header 2</a> </li>\n </ul>\n </li>\n </ul>\n\n</p>", @markdown.convert("# Header 1\n\n## Header 2\n\n{:toc}").strip
+ toc = <<-TOC
+<a name="Header.1"></a>
+<h1>Header 1</h1>
+
+<a name="Header.2"></a>
+<h2>Header 2</h2>
+
+<p><ul>
+ <li><a href="#Header.1">Header 1</a>
+ <ul>
+ <li><a href="#Header.2">Header 2</a></li>
+ </ul>
+ </li>
+</ul>
+
+</p>
+TOC
+ assert_equal toc.strip, @markdown.convert("# Header 1\n\n## Header 2\n\n{:toc}").strip
end
end
end
diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb
index ebf3b18..528bc8a 100644
--- a/test/test_redcarpet.rb
+++ b/test/test_redcarpet.rb
@@ -1,12 +1,23 @@
require 'helper'
-class TestRedcarpet < Test::Unit::TestCase
+class TestRedcarpet < JekyllUnitTest
context "redcarpet" do
setup do
+ if jruby?
+ then skip(
+ "JRuby does not perform well with CExt, test disabled."
+ )
+ end
+
@config = {
- 'redcarpet' => { 'extensions' => ['smart', 'strikethrough', 'filter_html'] },
- 'markdown' => 'redcarpet'
+ 'markdown' => 'redcarpet',
+ 'redcarpet' => {
+ 'extensions' => [
+ 'smart', 'strikethrough', 'filter_html'
+ ]
+ }
}
+
@markdown = Converters::Markdown.new @config
end
@@ -64,7 +75,7 @@ puts "Hello world"
end
should "render fenced code blocks without syntax highlighting" do
- assert_equal "<div class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\">puts "Hello world"\n</code></pre></div>", @markdown.convert(
+ assert_equal "<figure class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\">puts "Hello world"\n</code></pre></figure>", @markdown.convert(
<<-EOS
```ruby
puts "Hello world"
diff --git a/test/test_redcloth.rb b/test/test_redcloth.rb
deleted file mode 100644
index 964591b..0000000
--- a/test/test_redcloth.rb
+++ /dev/null
@@ -1,86 +0,0 @@
-require File.dirname(__FILE__) + '/helper'
-
-class TestRedCloth < Test::Unit::TestCase
-
- context "RedCloth default (no explicit config) hard_breaks enabled" do
- setup do
- @textile = Converters::Textile.new
- end
-
- should "preserve single line breaks in HTML output" do
- assert_equal "<p>line1<br />\nline2</p>", @textile.convert("p. line1\nline2").strip
- end
- end
-
- context "Default hard_breaks enabled w/ redcloth section, no hard_breaks value" do
- setup do
- config = {
- 'redcloth' => {}
- }
- @textile = Converters::Textile.new config
- end
-
- should "preserve single line breaks in HTML output" do
- assert_equal "<p>line1<br />\nline2</p>", @textile.convert("p. line1\nline2").strip
- end
- end
-
- context "RedCloth with hard_breaks enabled" do
- setup do
- config = {
- 'redcloth' => {
- 'hard_breaks' => true # default
- }
- }
- @textile = Converters::Textile.new config
- end
-
- should "preserve single line breaks in HTML output" do
- assert_equal "<p>line1<br />\nline2</p>", @textile.convert("p. line1\nline2").strip
- end
- end
-
- context "RedCloth with hard_breaks disabled" do
- setup do
- config = {
- 'redcloth' => {
- 'hard_breaks' => false
- }
- }
- @textile = Converters::Textile.new config
- end
-
- should "not generate break tags in HTML output" do
- assert_equal "<p>line1\nline2</p>", @textile.convert("p. line1\nline2").strip
- end
- end
-
- context "RedCloth w/no_span_caps set to false" do
- setup do
- config = {
- 'redcloth' => {
- 'no_span_caps' => false
- }
- }
- @textile = Converters::Textile.new config
- end
- should "generate span tags around capitalized words" do
- assert_equal "<p><span class=\"caps\">NSC</span></p>", @textile.convert("NSC").strip
- end
- end
-
- context "RedCloth w/no_span_caps set to true" do
- setup do
- config = {
- 'redcloth' => {
- 'no_span_caps' => true
- }
- }
- @textile = Converters::Textile.new config
- end
-
- should "not generate span tags around capitalized words" do
- assert_equal "<p>NSC</p>", @textile.convert("NSC").strip
- end
- end
-end
diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb
new file mode 100644
index 0000000..c9dfb57
--- /dev/null
+++ b/test/test_regenerator.rb
@@ -0,0 +1,327 @@
+require 'helper'
+
+class TestRegenerator < JekyllUnitTest
+ context "The site regenerator" do
+ setup do
+ FileUtils.rm_rf(source_dir(".jekyll-metadata"))
+
+ @site = fixture_site({
+ "collections" => {
+ "methods" => {
+ "output" => true
+ }
+ },
+ "incremental" => true
+ })
+
+ @site.read
+ @page = @site.pages.first
+ @post = @site.posts.first
+ @document = @site.docs_to_write.first
+ @asset_file = @site.pages.find(&:asset_file?)
+ @regenerator = @site.regenerator
+ end
+
+ should "regenerate documents and assets if changed or not in metadata" do
+ assert @regenerator.regenerate?(@page)
+ assert @regenerator.regenerate?(@post)
+ assert @regenerator.regenerate?(@document)
+ assert @regenerator.regenerate?(@asset_file)
+ end
+
+ should "not regenerate if not changed" do
+ # Process files
+ @regenerator.regenerate?(@page)
+ @regenerator.regenerate?(@post)
+ @regenerator.regenerate?(@document)
+ @regenerator.regenerate?(@asset_file)
+
+ # we need to create the destinations for these files,
+ # because regenerate? checks if the destination exists
+ [@page, @post, @document, @asset_file].each do |item|
+ if item.respond_to?(:destination)
+ dest = item.destination(@site.dest)
+ FileUtils.mkdir_p(File.dirname(dest))
+ FileUtils.touch(dest)
+ end
+ end
+ @regenerator.write_metadata
+ @regenerator = Regenerator.new(@site)
+
+ # these should pass, since nothing has changed, and the
+ # loop above made sure the designations exist
+ assert !@regenerator.regenerate?(@page)
+ assert !@regenerator.regenerate?(@post)
+ assert !@regenerator.regenerate?(@document)
+ end
+
+ should "regenerate if destination missing" do
+ # Process files
+ @regenerator.regenerate?(@page)
+ @regenerator.regenerate?(@post)
+ @regenerator.regenerate?(@document)
+ @regenerator.regenerate?(@asset_file)
+
+ @regenerator.write_metadata
+ @regenerator = Regenerator.new(@site)
+
+ # make sure the files don't actually exist
+ [@page, @post, @document, @asset_file].each do |item|
+ if item.respond_to?(:destination)
+ dest = item.destination(@site.dest)
+ File.unlink(dest) unless !File.exist?(dest)
+ end
+ end
+
+ # while nothing has changed, the output files were not
+ # generated, so they still need to be regenerated
+ assert @regenerator.regenerate?(@page)
+ assert @regenerator.regenerate?(@post)
+ assert @regenerator.regenerate?(@document)
+ end
+
+ should "always regenerate asset files" do
+ assert @regenerator.regenerate?(@asset_file)
+ end
+
+ should "always regenerate objects that don't respond to :path" do
+ assert @regenerator.regenerate?(Object.new)
+ end
+ end
+
+ context "The site regenerator" do
+ setup do
+ FileUtils.rm_rf(source_dir(".jekyll-metadata"))
+ @site = fixture_site({
+ "incremental" => true
+ })
+
+ @site.read
+ @post = @site.posts.first
+ @regenerator = @site.regenerator
+ @regenerator.regenerate?(@post)
+
+ @layout_path = source_dir("_layouts/default.html")
+ end
+
+ teardown do
+ File.rename(@layout_path + ".tmp", @layout_path)
+ end
+
+ should "handle deleted/nonexistent dependencies" do
+ assert_equal 1, @regenerator.metadata.size
+ path = @regenerator.metadata.keys[0]
+
+ assert File.exist?(@layout_path)
+ @regenerator.add_dependency(path, @layout_path)
+
+ File.rename(@layout_path, @layout_path + ".tmp")
+ refute File.exist?(@layout_path)
+
+ @regenerator.clear_cache
+ assert @regenerator.regenerate?(@post)
+ end
+ end
+
+ context "The site metadata" do
+ setup do
+ FileUtils.rm_rf(source_dir(".jekyll-metadata"))
+
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "incremental" => true
+ }))
+
+ @site.process
+ @path = @site.in_source_dir(@site.pages.first.path)
+ @regenerator = @site.regenerator
+ end
+
+ should "store modification times" do
+ assert_equal File.mtime(@path), @regenerator.metadata[@path]["mtime"]
+ end
+
+ should "cache processed entries" do
+ assert @regenerator.cache[@path]
+ end
+
+ should "clear the cache on clear_cache" do
+ # @path will be in the cache because the
+ # site will have processed it
+ assert @regenerator.cache[@path]
+
+ @regenerator.clear_cache
+ assert_equal @regenerator.cache, {}
+ end
+
+ should "write to the metadata file" do
+ @regenerator.clear
+ @regenerator.add(@path)
+ @regenerator.write_metadata
+ assert File.file?(source_dir(".jekyll-metadata"))
+ end
+
+ should "read from the metadata file" do
+ @regenerator = Regenerator.new(@site)
+ assert_equal File.mtime(@path), @regenerator.metadata[@path]["mtime"]
+ end
+
+ should "read legacy yaml metadata" do
+ metadata_file = source_dir(".jekyll-metadata")
+ @regenerator = Regenerator.new(@site)
+
+ File.open(metadata_file, 'w') do |f|
+ f.write(@regenerator.metadata.to_yaml)
+ end
+
+ @regenerator = Regenerator.new(@site)
+ assert_equal File.mtime(@path), @regenerator.metadata[@path]["mtime"]
+ end
+
+ should "not crash when reading corrupted marshal file" do
+ metadata_file = source_dir(".jekyll-metadata")
+ File.open(metadata_file, "w") do |file|
+ file.puts Marshal.dump({ foo: 'bar' })[0,5]
+ end
+
+ @regenerator = Regenerator.new(@site)
+ assert_equal({}, @regenerator.metadata)
+ end
+
+ # Methods
+
+ should "be able to add a path to the metadata" do
+ @regenerator.clear
+ @regenerator.add(@path)
+ assert_equal File.mtime(@path), @regenerator.metadata[@path]["mtime"]
+ assert_equal [], @regenerator.metadata[@path]["deps"]
+ assert @regenerator.cache[@path]
+ end
+
+ should "return true on nonexistent path" do
+ @regenerator.clear
+ assert @regenerator.add("/bogus/path.md")
+ assert @regenerator.modified?("/bogus/path.md")
+ end
+
+ should "be able to force a path to regenerate" do
+ @regenerator.clear
+ @regenerator.force(@path)
+ assert @regenerator.cache[@path]
+ assert @regenerator.modified?(@path)
+ end
+
+ should "be able to clear metadata and cache" do
+ @regenerator.clear
+ @regenerator.add(@path)
+ assert_equal 1, @regenerator.metadata.length
+ assert_equal 1, @regenerator.cache.length
+ @regenerator.clear
+ assert_equal 0, @regenerator.metadata.length
+ assert_equal 0, @regenerator.cache.length
+ end
+
+ should "not regenerate a path if it is not modified" do
+ @regenerator.clear
+ @regenerator.add(@path)
+ @regenerator.write_metadata
+ @regenerator = Regenerator.new(@site)
+
+ assert !@regenerator.modified?(@path)
+ end
+
+ should "not regenerate if path in cache is false" do
+ @regenerator.clear
+ @regenerator.add(@path)
+ @regenerator.write_metadata
+ @regenerator = Regenerator.new(@site)
+
+ assert !@regenerator.modified?(@path)
+ assert !@regenerator.cache[@path]
+ assert !@regenerator.modified?(@path)
+ end
+
+ should "regenerate if path in not in metadata" do
+ @regenerator.clear
+ @regenerator.add(@path)
+
+ assert @regenerator.modified?(@path)
+ end
+
+ should "regenerate if path in cache is true" do
+ @regenerator.clear
+ @regenerator.add(@path)
+
+ assert @regenerator.modified?(@path)
+ assert @regenerator.cache[@path]
+ assert @regenerator.modified?(@path)
+ end
+
+ should "regenerate if file is modified" do
+ @regenerator.clear
+ @regenerator.add(@path)
+ @regenerator.metadata[@path]["mtime"] = Time.at(0)
+ @regenerator.write_metadata
+ @regenerator = Regenerator.new(@site)
+
+ refute_same File.mtime(@path), @regenerator.metadata[@path]["mtime"]
+ assert @regenerator.modified?(@path)
+ end
+
+ should "regenerate if dependency is modified" do
+ @regenerator.clear
+ @regenerator.add(@path)
+ @regenerator.write_metadata
+ @regenerator = Regenerator.new(@site)
+
+ @regenerator.add_dependency(@path, "new.dependency")
+ assert_equal ["new.dependency"], @regenerator.metadata[@path]["deps"]
+ assert @regenerator.modified?("new.dependency")
+ assert @regenerator.modified?(@path)
+ end
+
+ should "not regenerate again if multiple dependencies" do
+ multi_deps = @regenerator.metadata.select {|k,v| v['deps'].length > 2}
+ multi_dep_path = multi_deps.keys.first
+
+ assert @regenerator.metadata[multi_dep_path]["deps"].length > 2
+
+ assert @regenerator.modified?(multi_dep_path)
+
+ @site.process
+ @regenerator.clear_cache
+
+ refute @regenerator.modified?(multi_dep_path)
+ end
+
+ should "regenerate everything if metadata is disabled" do
+ @site.config["incremental"] = false
+ @regenerator.clear
+ @regenerator.add(@path)
+ @regenerator.write_metadata
+ @regenerator = Regenerator.new(@site)
+
+ assert @regenerator.modified?(@path)
+ end
+ end
+
+ context "when incremental regen is disabled" do
+ setup do
+ FileUtils.rm_rf(source_dir(".jekyll-metadata"))
+ @site = Site.new(Jekyll.configuration({
+ "source" => source_dir,
+ "destination" => dest_dir,
+ "incremental" => false
+ }))
+
+ @site.process
+ @path = @site.in_source_dir(@site.pages.first.path)
+ @regenerator = @site.regenerator
+ end
+
+ should "not create .jekyll-metadata" do
+ refute File.file?(source_dir(".jekyll-metadata"))
+ end
+ end
+end
diff --git a/test/test_related_posts.rb b/test/test_related_posts.rb
index 79409f8..cd114c0 100644
--- a/test/test_related_posts.rb
+++ b/test/test_related_posts.rb
@@ -1,13 +1,9 @@
require 'helper'
-class TestRelatedPosts < Test::Unit::TestCase
+class TestRelatedPosts < JekyllUnitTest
context "building related posts without lsi" do
setup do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir,
- 'destination' => dest_dir})
- end
- @site = Site.new(Jekyll.configuration)
+ @site = fixture_site
end
should "use the most recent posts for related posts" do
@@ -17,30 +13,48 @@ class TestRelatedPosts < Test::Unit::TestCase
last_post = @site.posts.last
related_posts = Jekyll::RelatedPosts.new(last_post).build
- last_10_recent_posts = (@site.posts.reverse - [last_post]).first(10)
+ last_10_recent_posts = (@site.posts.docs.reverse - [last_post]).first(10)
assert_equal last_10_recent_posts, related_posts
end
end
context "building related posts with lsi" do
setup do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir,
- 'destination' => dest_dir,
- 'lsi' => true})
+ if jruby?
+ skip(
+ "JRuby does not perform well with CExt, test disabled."
+ )
end
- any_instance_of(Jekyll::RelatedPosts) { |i| stub(i).display }
- @site = Site.new(Jekyll.configuration)
- end
- should "use lsi for the related posts" do
+ allow_any_instance_of(Jekyll::RelatedPosts).to receive(:display)
+ @site = fixture_site({
+ "lsi" => true
+ })
+
@site.reset
@site.read
- require 'classifier'
- any_instance_of(::Classifier::LSI) do |c|
- stub(c).find_related { @site.posts[-1..-9] }
- stub(c).build_index
- end
+ require 'classifier-reborn'
+ Jekyll::RelatedPosts.lsi = nil
+ end
+
+ should "index Jekyll::Post objects" do
+ @site.posts.docs = @site.posts.docs.first(1)
+ expect_any_instance_of(::ClassifierReborn::LSI).to receive(:add_item).with(kind_of(Jekyll::Document))
+ Jekyll::RelatedPosts.new(@site.posts.last).build_index
+ end
+
+ should "find related Jekyll::Post objects, given a Jekyll::Post object" do
+ post = @site.posts.last
+ allow_any_instance_of(::ClassifierReborn::LSI).to receive(:build_index)
+ expect_any_instance_of(::ClassifierReborn::LSI).to receive(:find_related).with(post, 11).and_return(@site.posts[-1..-9])
+
+ Jekyll::RelatedPosts.new(post).build
+ end
+
+ should "use lsi for the related posts" do
+ allow_any_instance_of(::ClassifierReborn::LSI).to receive(:find_related).and_return(@site.posts[-1..-9])
+ allow_any_instance_of(::ClassifierReborn::LSI).to receive(:build_index)
+
assert_equal @site.posts[-1..-9], Jekyll::RelatedPosts.new(@site.posts.last).build
end
end
diff --git a/test/test_sass.rb b/test/test_sass.rb
index 102815a..153c339 100644
--- a/test/test_sass.rb
+++ b/test/test_sass.rb
@@ -1,6 +1,6 @@
require 'helper'
-class TestSass < Test::Unit::TestCase
+class TestSass < JekyllUnitTest
context "importing partials" do
setup do
@site = Jekyll::Site.new(Jekyll.configuration({
@@ -16,11 +16,11 @@ class TestSass < Test::Unit::TestCase
end
should "register the SCSS converter" do
- assert !!@site.getConverterImpl(Jekyll::Converters::Scss), "SCSS converter implementation should exist."
+ assert !!@site.find_converter_instance(Jekyll::Converters::Scss), "SCSS converter implementation should exist."
end
should "register the Sass converter" do
- assert !!@site.getConverterImpl(Jekyll::Converters::Sass), "Sass converter implementation should exist."
+ assert !!@site.find_converter_instance(Jekyll::Converters::Sass), "Sass converter implementation should exist."
end
end
end
diff --git a/test/test_site.rb b/test/test_site.rb
index 0ca9093..a638a34 100644
--- a/test/test_site.rb
+++ b/test/test_site.rb
@@ -1,6 +1,6 @@
require 'helper'
-class TestSite < Test::Unit::TestCase
+class TestSite < JekyllUnitTest
context "configuring sites" do
should "have an array for plugins by default" do
site = Site.new(Jekyll::Configuration::DEFAULTS)
@@ -8,27 +8,27 @@ class TestSite < Test::Unit::TestCase
end
should "look for plugins under the site directory by default" do
- site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'source' => File.expand_path(source_dir)}))
+ site = Site.new(site_configuration)
assert_equal [File.join(source_dir, '_plugins')], site.plugins
end
should "have an array for plugins if passed as a string" do
- site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins' => '/tmp/plugins'}))
+ site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => '/tmp/plugins'}))
assert_equal ['/tmp/plugins'], site.plugins
end
should "have an array for plugins if passed as an array" do
- site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins' => ['/tmp/plugins', '/tmp/otherplugins']}))
+ site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => ['/tmp/plugins', '/tmp/otherplugins']}))
assert_equal ['/tmp/plugins', '/tmp/otherplugins'], site.plugins
end
should "have an empty array for plugins if nothing is passed" do
- site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins' => []}))
+ site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => []}))
assert_equal [], site.plugins
end
should "have an empty array for plugins if nil is passed" do
- site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins' => nil}))
+ site = Site.new(Jekyll::Configuration::DEFAULTS.merge({'plugins_dir' => nil}))
assert_equal [], site.plugins
end
@@ -44,11 +44,14 @@ class TestSite < Test::Unit::TestCase
end
context "creating sites" do
setup do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
+ @site = Site.new(site_configuration)
+ @num_invalid_posts = 4
+ end
+
+ teardown do
+ if defined?(MyGenerator)
+ self.class.send(:remove_const, :MyGenerator)
end
- @site = Site.new(Jekyll.configuration)
- @num_invalid_posts = 2
end
should "have an empty tag hash by default" do
@@ -56,18 +59,20 @@ class TestSite < Test::Unit::TestCase
end
should "give site with parsed pages and posts to generators" do
- @site.reset
- @site.read
class MyGenerator < Generator
def generate(site)
site.pages.dup.each do |page|
raise "#{page} isn't a page" unless page.is_a?(Page)
raise "#{page} doesn't respond to :name" unless page.respond_to?(:name)
end
+ site.file_read_opts[:secret_message] = 'hi'
end
end
+ @site = Site.new(site_configuration)
+ @site.read
@site.generate
- assert_not_equal 0, @site.pages.size
+ refute_equal 0, @site.pages.size
+ assert_equal 'hi', @site.file_read_opts[:secret_message]
end
should "reset data before processing" do
@@ -94,6 +99,7 @@ class TestSite < Test::Unit::TestCase
should "write only modified static files" do
clear_dest
StaticFile.reset_cache
+ @site.regenerator.clear
@site.process
some_static_file = @site.static_files[0].path
@@ -112,7 +118,7 @@ class TestSite < Test::Unit::TestCase
sleep 1
@site.process
mtime3 = File.stat(dest).mtime.to_i
- assert_not_equal mtime2, mtime3 # must be regenerated!
+ refute_equal mtime2, mtime3 # must be regenerated!
sleep 1
@site.process
@@ -123,9 +129,9 @@ class TestSite < Test::Unit::TestCase
should "write static files if not modified but missing in destination" do
clear_dest
StaticFile.reset_cache
+ @site.regenerator.clear
@site.process
- some_static_file = @site.static_files[0].path
dest = File.expand_path(@site.static_files[0].destination(@site.dest))
mtime1 = File.stat(dest).mtime.to_i # first run must generate dest file
@@ -137,16 +143,17 @@ class TestSite < Test::Unit::TestCase
# simulate destination file deletion
File.unlink dest
+ refute File.exist?(dest)
sleep 1
@site.process
mtime3 = File.stat(dest).mtime.to_i
- assert_not_equal mtime2, mtime3 # must be regenerated and differ!
+ assert_equal mtime2, mtime3 # must be regenerated and with original mtime!
sleep 1
@site.process
mtime4 = File.stat(dest).mtime.to_i
- assert_equal mtime3, mtime4 # no modifications, so must be the same
+ assert_equal mtime3, mtime4 # no modifications, so remain the same
end
should "setup plugins in priority order" do
@@ -155,7 +162,8 @@ class TestSite < Test::Unit::TestCase
end
should "sort pages alphabetically" do
- stub.proxy(Dir).entries { |entries| entries.reverse }
+ method = Dir.method(:entries)
+ allow(Dir).to receive(:entries) { |*args, &block| method.call(*args, &block).reverse }
@site.process
# files in symlinked directories may appear twice
sorted_pages = %w(
@@ -182,20 +190,20 @@ class TestSite < Test::Unit::TestCase
end
should "read posts" do
- @site.read_posts('')
+ @site.posts.docs.concat(PostReader.new(@site).read_posts(''))
posts = Dir[source_dir('_posts', '**', '*')]
- posts.delete_if { |post| File.directory?(post) && !Post.valid?(post) }
+ posts.delete_if { |post| File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) }
assert_equal posts.size - @num_invalid_posts, @site.posts.size
end
should "read pages with yaml front matter" do
abs_path = File.expand_path("about.html", @site.source)
- assert_equal true, @site.send(:has_yaml_header?, abs_path)
+ assert_equal true, Utils.has_yaml_header?(abs_path)
end
should "enforce a strict 3-dash limit on the start of the YAML front-matter" do
abs_path = File.expand_path("pgp.key", @site.source)
- assert_equal false, @site.send(:has_yaml_header?, abs_path)
+ assert_equal false, Utils.has_yaml_header?(abs_path)
end
should "expose jekyll version to site payload" do
@@ -211,8 +219,8 @@ class TestSite < Test::Unit::TestCase
@site.process
posts = Dir[source_dir("**", "_posts", "**", "*")]
- posts.delete_if { |post| File.directory?(post) && !Post.valid?(post) }
- categories = %w(2013 bar baz category es foo z_category publish_test win).sort
+ posts.delete_if { |post| File.directory?(post) && !(post =~ Document::DATE_FILENAME_MATCHER) }
+ categories = %w(2013 bar baz category foo z_category MixedCase Mixedcase publish_test win).sort
assert_equal posts.size - @num_invalid_posts, @site.posts.size
assert_equal categories, @site.categories.keys.sort
@@ -221,22 +229,14 @@ class TestSite < Test::Unit::TestCase
context 'error handling' do
should "raise if destination is included in source" do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => source_dir})
- end
-
- assert_raise Jekyll::Errors::FatalException do
- site = Site.new(Jekyll.configuration)
+ assert_raises Jekyll::Errors::FatalException do
+ site = Site.new(site_configuration('destination' => source_dir))
end
end
should "raise if destination is source" do
- stub(Jekyll).configuration do
- Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => File.join(source_dir, "..")})
- end
-
- assert_raise Jekyll::Errors::FatalException do
- site = Site.new(Jekyll.configuration)
+ assert_raises Jekyll::Errors::FatalException do
+ site = Site.new(site_configuration('destination' => File.join(source_dir, "..")))
end
end
end
@@ -244,6 +244,7 @@ class TestSite < Test::Unit::TestCase
context 'with orphaned files in destination' do
setup do
clear_dest
+ @site.regenerator.clear
@site.process
# generate some orphaned files:
# single file
@@ -281,7 +282,7 @@ class TestSite < Test::Unit::TestCase
end
should 'remove orphaned files in destination - keep_files .svn' do
- config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'keep_files' => ['.svn']})
+ config = site_configuration('keep_files' => %w{.svn})
@site = Site.new(config)
@site.process
assert !File.exist?(dest_dir('.htpasswd'))
@@ -308,10 +309,8 @@ class TestSite < Test::Unit::TestCase
end
custom_processor = "CustomMarkdown"
- s = Site.new(Jekyll.configuration.merge({ 'markdown' => custom_processor }))
- assert_nothing_raised do
- s.process
- end
+ s = Site.new(site_configuration('markdown' => custom_processor))
+ s.process
# Do some cleanup, we don't like straggling stuff's.
Jekyll::Converters::Markdown.send(:remove_const, :CustomMarkdown)
@@ -331,8 +330,8 @@ class TestSite < Test::Unit::TestCase
end
bad_processor = "Custom::Markdown"
- s = Site.new(Jekyll.configuration.merge({ 'markdown' => bad_processor }))
- assert_raise Jekyll::Errors::FatalException do
+ s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false))
+ assert_raises Jekyll::Errors::FatalException do
s.process
end
@@ -344,15 +343,13 @@ class TestSite < Test::Unit::TestCase
context 'with an invalid markdown processor in the configuration' do
should 'not throw an error at initialization time' do
bad_processor = 'not a processor name'
- assert_nothing_raised do
- Site.new(Jekyll.configuration.merge({ 'markdown' => bad_processor }))
- end
+ assert Site.new(site_configuration('markdown' => bad_processor))
end
should 'throw FatalException at process time' do
bad_processor = 'not a processor name'
- s = Site.new(Jekyll.configuration.merge({ 'markdown' => bad_processor }))
- assert_raise Jekyll::Errors::FatalException do
+ s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false))
+ assert_raises Jekyll::Errors::FatalException do
s.process
end
end
@@ -360,7 +357,7 @@ class TestSite < Test::Unit::TestCase
context 'data directory' do
should 'auto load yaml files' do
- site = Site.new(Jekyll.configuration)
+ site = Site.new(site_configuration)
site.process
file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.yaml'))
@@ -369,8 +366,18 @@ class TestSite < Test::Unit::TestCase
assert_equal site.site_payload['site']['data']['members'], file_content
end
+ should 'load yaml files from extracted method' do
+ site = Site.new(site_configuration)
+ site.process
+
+ file_content = DataReader.new(site).read_data_file(source_dir('_data', 'members.yaml'))
+
+ assert_equal site.data['members'], file_content
+ assert_equal site.site_payload['site']['data']['members'], file_content
+ end
+
should 'auto load yml files' do
- site = Site.new(Jekyll.configuration)
+ site = Site.new(site_configuration)
site.process
file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'languages.yml'))
@@ -380,7 +387,7 @@ class TestSite < Test::Unit::TestCase
end
should 'auto load json files' do
- site = Site.new(Jekyll.configuration)
+ site = Site.new(site_configuration)
site.process
file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.json'))
@@ -390,7 +397,7 @@ class TestSite < Test::Unit::TestCase
end
should 'auto load yaml files in subdirectory' do
- site = Site.new(Jekyll.configuration)
+ site = Site.new(site_configuration)
site.process
file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'categories', 'dairy.yaml'))
@@ -400,7 +407,7 @@ class TestSite < Test::Unit::TestCase
end
should "load symlink files in unsafe mode" do
- site = Site.new(Jekyll.configuration.merge({'safe' => false}))
+ site = Site.new(site_configuration('safe' => false))
site.process
file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'products.yml'))
@@ -410,7 +417,7 @@ class TestSite < Test::Unit::TestCase
end
should "not load symlink files in safe mode" do
- site = Site.new(Jekyll.configuration.merge({'safe' => true}))
+ site = Site.new(site_configuration('safe' => true))
site.process
assert_nil site.data['products']
@@ -421,7 +428,9 @@ class TestSite < Test::Unit::TestCase
context "manipulating the Jekyll environment" do
setup do
- @site = Site.new(site_configuration)
+ @site = Site.new(site_configuration({
+ 'incremental' => false
+ }))
@site.process
@page = @site.pages.find { |p| p.name == "environment.html" }
end
@@ -433,7 +442,9 @@ class TestSite < Test::Unit::TestCase
context "in production" do
setup do
ENV["JEKYLL_ENV"] = "production"
- @site = Site.new(site_configuration)
+ @site = Site.new(site_configuration({
+ 'incremental' => false
+ }))
@site.process
@page = @site.pages.find { |p| p.name == "environment.html" }
end
@@ -448,5 +459,73 @@ class TestSite < Test::Unit::TestCase
end
end
+ context "with liquid profiling" do
+ setup do
+ @site = Site.new(site_configuration('profile' => true))
+ end
+
+ should "print profile table" do
+ expect(@site.liquid_renderer).to receive(:stats_table)
+ @site.process
+ end
+ end
+
+ context "incremental build" do
+ setup do
+ @site = Site.new(site_configuration({
+ 'incremental' => true
+ }))
+ @site.read
+ end
+
+ should "build incrementally" do
+ contacts_html = @site.pages.find { |p| p.name == "contacts.html" }
+ @site.process
+
+ source = @site.in_source_dir(contacts_html.path)
+ dest = File.expand_path(contacts_html.destination(@site.dest))
+ mtime1 = File.stat(dest).mtime.to_i # first run must generate dest file
+
+ # need to sleep because filesystem timestamps have best resolution in seconds
+ sleep 1
+ @site.process
+ mtime2 = File.stat(dest).mtime.to_i
+ assert_equal mtime1, mtime2 # no modifications, so remain the same
+
+ # simulate file modification by user
+ FileUtils.touch source
+
+ sleep 1
+ @site.process
+ mtime3 = File.stat(dest).mtime.to_i
+ refute_equal mtime2, mtime3 # must be regenerated
+
+ sleep 1
+ @site.process
+ mtime4 = File.stat(dest).mtime.to_i
+ assert_equal mtime3, mtime4 # no modifications, so remain the same
+ end
+
+ should "regnerate files that have had their destination deleted" do
+ contacts_html = @site.pages.find { |p| p.name == "contacts.html" }
+ @site.process
+
+ source = @site.in_source_dir(contacts_html.path)
+ dest = File.expand_path(contacts_html.destination(@site.dest))
+ mtime1 = File.stat(dest).mtime.to_i # first run must generate dest file
+
+ # simulate file modification by user
+ File.unlink dest
+ refute File.file?(dest)
+
+ sleep 1 # sleep for 1 second, since mtimes have 1s resolution
+ @site.process
+ assert File.file?(dest)
+ mtime2 = File.stat(dest).mtime.to_i
+ refute_equal mtime1, mtime2 # must be regenerated
+ end
+
+ end
+
end
end
diff --git a/test/test_static_file.rb b/test/test_static_file.rb
new file mode 100644
index 0000000..3af7a1f
--- /dev/null
+++ b/test/test_static_file.rb
@@ -0,0 +1,133 @@
+require 'helper'
+
+class TestStaticFile < JekyllUnitTest
+ def make_dummy_file(filename)
+ File.write(source_dir(filename), "some content")
+ end
+
+ def modify_dummy_file(filename)
+ offset = "some content".size
+ File.write(source_dir(filename), "more content", offset)
+ end
+
+ def remove_dummy_file(filename)
+ File.delete(source_dir(filename))
+ end
+
+ def setup_static_file(base, dir, name)
+ StaticFile.new(@site, base, dir, name)
+ end
+
+ def setup_static_file_with_collection(base, dir, name, label, metadata)
+ site = fixture_site 'collections' => {label => metadata}
+ StaticFile.new(site, base, dir, name, site.collections[label])
+ end
+
+ def setup_static_file_with_defaults(base, dir, name, defaults)
+ site = fixture_site 'defaults' => defaults
+ StaticFile.new(site, base, dir, name)
+ end
+
+ context "A StaticFile" do
+ setup do
+ clear_dest
+ @old_pwd = Dir.pwd
+ Dir.chdir source_dir
+ @site = fixture_site
+ @filename = "static_file.txt"
+ make_dummy_file(@filename)
+ @static_file = setup_static_file(nil, nil, @filename)
+ end
+
+ teardown do
+ remove_dummy_file(@filename) if File.exist?(source_dir(@filename))
+ Dir.chdir @old_pwd
+ end
+
+ should "have a source file path" do
+ static_file = setup_static_file("root", "dir", @filename)
+ assert_equal "root/dir/#{@filename}", static_file.path
+ end
+
+ should "ignore a nil base or dir" do
+ assert_equal "dir/#{@filename}", setup_static_file(nil, "dir", @filename).path
+ assert_equal "base/#{@filename}", setup_static_file("base", nil, @filename).path
+ end
+
+ should "have a destination relative directory without a collection" do
+ static_file = setup_static_file("root", "dir/subdir", "file.html")
+ assert_equal nil, static_file.type
+ assert_equal "dir/subdir/file.html", static_file.url
+ assert_equal "dir/subdir", static_file.destination_rel_dir
+ end
+
+ should "have a destination relative directory with a collection" do
+ static_file = setup_static_file_with_collection(
+ "root", "_foo/dir/subdir", "file.html", "foo", {"output" => true})
+ assert_equal :foo, static_file.type
+ assert_equal "/foo/dir/subdir/file.html", static_file.url
+ assert_equal "/foo/dir/subdir", static_file.destination_rel_dir
+ end
+
+ should "use its collection's permalink template for the destination relative directory" do
+ static_file = setup_static_file_with_collection(
+ "root", "_foo/dir/subdir", "file.html", "foo",
+ {"output" => true, "permalink" => "/:path/"})
+ assert_equal :foo, static_file.type
+ assert_equal "/dir/subdir/file.html", static_file.url
+ assert_equal "/dir/subdir", static_file.destination_rel_dir
+ end
+
+ should "be writable by default" do
+ static_file = setup_static_file("root", "dir/subdir", "file.html")
+ assert(static_file.write?,
+ "static_file.write? should return true by default")
+ end
+
+ should "use the _config.yml defaults to determine writability" do
+ defaults = [{
+ "scope" => {"path" => "private"},
+ "values" => {"published" => false}
+ }]
+ static_file = setup_static_file_with_defaults(
+ "root", "private/dir/subdir", "file.html", defaults)
+ assert(!static_file.write?,
+ "static_file.write? should return false when _config.yml sets " +
+ "`published: false`")
+ end
+
+ should "know its last modification time" do
+ assert_equal Time.new.to_i, @static_file.mtime
+ end
+
+ should "known if the source path is modified, when it is" do
+ sleep 1
+ modify_dummy_file(@filename)
+ assert @static_file.modified?
+ end
+
+ should "known if the source path is modified, when its not" do
+ @static_file.write(dest_dir)
+ sleep 1 # wait, else the times are still the same
+ assert !@static_file.modified?
+ end
+
+ should "known whether to write the file to the filesystem" do
+ assert @static_file.write?, "always true, with current implementation"
+ end
+
+ should "be able to write itself to the desitination direcotry" do
+ assert @static_file.write(dest_dir)
+ end
+
+ should "be able to convert to liquid" do
+ expected = {
+ "extname" => ".txt",
+ "modified_time" => @static_file.modified_time,
+ "path" => "/static_file.txt",
+ }
+ assert_equal expected, @static_file.to_liquid
+ end
+ end
+end
+
diff --git a/test/test_tags.rb b/test/test_tags.rb
index 942b28c..2276b20 100644
--- a/test/test_tags.rb
+++ b/test/test_tags.rb
@@ -2,18 +2,17 @@
require 'helper'
-class TestTags < Test::Unit::TestCase
+class TestTags < JekyllUnitTest
+
+ def setup
+ FileUtils.mkdir_p("tmp")
+ end
def create_post(content, override = {}, converter_class = Jekyll::Converters::Markdown)
- stub(Jekyll).configuration do
- site_configuration({
- "highlighter" => "pygments"
- }.merge(override))
- end
- site = Site.new(Jekyll.configuration)
+ site = fixture_site({"highlighter" => "rouge"}.merge(override))
if override['read_posts']
- site.read_posts('')
+ site.posts.docs.concat(PostReader.new(site).read_posts(''))
end
info = { :filters => [Jekyll::Filters], :registers => { :site => site } }
@@ -31,7 +30,7 @@ class TestTags < Test::Unit::TestCase
title: This is a test
---
-This document results in a markdown error with maruku
+This document has some highlighted code in it.
{% highlight text %}
#{code}
@@ -43,6 +42,10 @@ CONTENT
create_post(content, override)
end
+ def highlight_block_with_opts(options_string)
+ Jekyll::Tags::HighlightBlock.parse('highlight', options_string, ["test", "{% endhighlight %}", "\n"], {})
+ end
+
context "language name" do
should "match only the required set of chars" do
r = Jekyll::Tags::HighlightBlock::SYNTAX
@@ -52,44 +55,58 @@ CONTENT
assert_match r, "x.y"
assert_match r, "coffee-script"
- assert_no_match r, "blah^"
+ refute_match r, "blah^"
assert_match r, "ruby key=val"
assert_match r, "ruby a=b c=d"
end
end
- context "initialized tag" do
- should "set the correct options" do
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby ', ["test", "{% endhighlight %}", "\n"])
+ context "highlight tag in unsafe mode" do
+ should "set the no options with just a language name" do
+ tag = highlight_block_with_opts('ruby ')
assert_equal({}, tag.instance_variable_get(:@options))
+ end
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos ', ["test", "{% endhighlight %}", "\n"])
+ should "set the linenos option as 'inline' if no linenos value" do
+ tag = highlight_block_with_opts('ruby linenos ')
assert_equal({ :linenos => 'inline' }, tag.instance_variable_get(:@options))
+ end
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table ', ["test", "{% endhighlight %}", "\n"])
+ should "set the linenos option to 'table' if the linenos key is given the table value" do
+ tag = highlight_block_with_opts('ruby linenos=table ')
assert_equal({ :linenos => 'table' }, tag.instance_variable_get(:@options))
+ end
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table nowrap', ["test", "{% endhighlight %}", "\n"])
+ should "recognize nowrap option with linenos set" do
+ tag = highlight_block_with_opts('ruby linenos=table nowrap ')
assert_equal({ :linenos => 'table', :nowrap => true }, tag.instance_variable_get(:@options))
+ end
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl', ["test", "{% endhighlight %}", "\n"])
+ should "recognize the cssclass option" do
+ tag = highlight_block_with_opts('ruby linenos=table cssclass=hl ')
assert_equal({ :cssclass => 'hl', :linenos => 'table' }, tag.instance_variable_get(:@options))
+ end
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl hl_linenos=3', ["test", "{% endhighlight %}", "\n"])
+ should "recognize the hl_linenos option and its value" do
+ tag = highlight_block_with_opts('ruby linenos=table cssclass=hl hl_linenos=3 ')
assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => '3' }, tag.instance_variable_get(:@options))
+ end
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl hl_linenos="3 5 6"', ["test", "{% endhighlight %}", "\n"])
+ should "recognize multiple values of hl_linenos" do
+ tag = highlight_block_with_opts('ruby linenos=table cssclass=hl hl_linenos="3 5 6" ')
assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => ['3', '5', '6'] }, tag.instance_variable_get(:@options))
+ end
- tag = Jekyll::Tags::HighlightBlock.new('highlight', 'Ruby ', ["test", "{% endhighlight %}", "\n"])
+ should "treat language name as case insensitive" do
+ tag = highlight_block_with_opts('Ruby ')
assert_equal "ruby", tag.instance_variable_get(:@lang), "lexers should be case insensitive"
end
end
context "in safe mode" do
setup do
- @tag = Jekyll::Tags::HighlightBlock.new('highlight', 'text ', ["test", "{% endhighlight %}", "\n"])
+ @tag = highlight_block_with_opts('text ')
end
should "allow linenos" do
@@ -97,9 +114,9 @@ CONTENT
assert_equal true, sanitized[:linenos]
end
- should "allow hl_linenos" do
- sanitized = @tag.sanitized_opts({:hl_linenos => %w[1 2 3 4]}, true)
- assert_equal %w[1 2 3 4], sanitized[:hl_linenos]
+ should "allow hl_lines" do
+ sanitized = @tag.sanitized_opts({:hl_lines => %w[1 2 3 4]}, true)
+ assert_equal %w[1 2 3 4], sanitized[:hl_lines]
end
should "allow cssclass" do
@@ -118,86 +135,241 @@ CONTENT
end
end
- context "post content has highlight tag" do
+ context "with the pygments highlighter" do
setup do
- fill_post("test")
+ if jruby?
+ then skip(
+ "JRuby does not support Pygments."
+ )
+ end
end
- should "not cause a markdown error" do
- assert_no_match /markdown\-html\-error/, @result
+ context "post content has highlight tag" do
+ setup do
+ fill_post("test", {'highlighter' => 'pygments'})
+ end
+
+ should "not cause a markdown error" do
+ refute_match /markdown\-html\-error/, @result
+ end
+
+ should "render markdown with pygments" do
+ assert_match %{<pre><code class="language-text" data-lang="text">test</code></pre>}, @result
+ end
+
+ should "render markdown with pygments with line numbers" do
+ assert_match %{<pre><code class="language-text" data-lang="text"><span class="lineno">1</span> test</code></pre>}, @result
+ end
end
- should "render markdown with pygments" do
- assert_match %{<pre><code class="language-text" data-lang="text">test</code></pre>}, @result
+ context "post content has highlight with file reference" do
+ setup do
+ fill_post("./jekyll.gemspec", {'highlighter' => 'pygments'})
+ end
+
+ should "not embed the file" do
+ assert_match %{<pre><code class="language-text" data-lang="text">./jekyll.gemspec</code></pre>}, @result
+ end
end
- should "render markdown with pygments with line numbers" do
- assert_match %{<pre><code class="language-text" data-lang="text"><span class="lineno">1</span> test</code></pre>}, @result
+ context "post content has highlight tag with UTF character" do
+ setup do
+ fill_post("Æ", {'highlighter' => 'pygments'})
+ end
+
+ should "render markdown with pygments line handling" do
+ assert_match %{<pre><code class="language-text" data-lang="text">Æ</code></pre>}, @result
+ end
end
- end
- context "post content has highlight with file reference" do
- setup do
- fill_post("./jekyll.gemspec")
+ context "post content has highlight tag with preceding spaces & lines" do
+ setup do
+ code = <<-EOS
+
+
+ [,1] [,2]
+[1,] FALSE TRUE
+[2,] FALSE TRUE
+EOS
+ fill_post(code, {'highlighter' => 'pygments'})
+ end
+
+ should "only strip the preceding newlines" do
+ assert_match %{<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]}, @result
+ end
end
- should "not embed the file" do
- assert_match %{<pre><code class="language-text" data-lang="text">./jekyll.gemspec</code></pre>}, @result
+ context "post content has highlight tag with preceding spaces & lines in several places" do
+ setup do
+ code = <<-EOS
+
+
+ [,1] [,2]
+
+
+[1,] FALSE TRUE
+[2,] FALSE TRUE
+
+
+EOS
+ fill_post(code, {'highlighter' => 'pygments'})
+ end
+
+ should "only strip the newlines which precede and succeed the entire block" do
+ assert_match "<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE</code></pre>", @result
+ end
end
- end
- context "post content has highlight tag with UTF character" do
- setup do
- fill_post("Æ")
+ context "post content has highlight tag with preceding spaces & Windows-style newlines" do
+ setup do
+ fill_post "\r\n\r\n\r\n [,1] [,2]", {'highlighter' => 'pygments'}
+ end
+
+ should "only strip the preceding newlines" do
+ assert_match %{<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]}, @result
+ end
end
- should "render markdown with pygments line handling" do
- assert_match %{<pre><code class="language-text" data-lang="text">Æ</code></pre>}, @result
+ context "post content has highlight tag with only preceding spaces" do
+ setup do
+ code = <<-EOS
+ [,1] [,2]
+[1,] FALSE TRUE
+[2,] FALSE TRUE
+EOS
+ fill_post(code, {'highlighter' => 'pygments'})
+ end
+
+ should "only strip the preceding newlines" do
+ assert_match %{<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]}, @result
+ end
end
end
- context "simple post with markdown and pre tags" do
- setup do
- @content = <<CONTENT
----
-title: Maruku vs. RDiscount
----
+ context "with the rouge highlighter" do
+ context "post content has highlight tag" do
+ setup do
+ fill_post("test")
+ end
-_FIGHT!_
+ should "render markdown with rouge" do
+ assert_match %{<pre><code class="language-text" data-lang="text">test</code></pre>}, @result
+ end
-{% highlight ruby %}
-puts "3..2..1.."
-{% endhighlight %}
+ should "render markdown with rouge with line numbers" do
+ assert_match %{<table style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td class="code"><pre>test<span class="w">\n</span></pre></td></tr></tbody></table>}, @result
+ end
+ end
-*FINISH HIM*
-CONTENT
+ context "post content has highlight with file reference" do
+ setup do
+ fill_post("./jekyll.gemspec")
+ end
+
+ should "not embed the file" do
+ assert_match %{<pre><code class="language-text" data-lang="text">./jekyll.gemspec</code></pre>}, @result
+ end
end
- context "using Textile" do
+ context "post content has highlight tag with UTF character" do
setup do
- create_post(@content, {}, Jekyll::Converters::Textile)
+ fill_post("Æ")
end
- # Broken in RedCloth 4.1.9
- should "not textilize highlight block" do
- assert_no_match %r{3\.\.2\.\.1\.\."</span><br />}, @result
+ should "render markdown with pygments line handling" do
+ assert_match %{<pre><code class="language-text" data-lang="text">Æ</code></pre>}, @result
end
end
- context "using Maruku" do
+ context "post content has highlight tag with preceding spaces & lines" do
setup do
- create_post(@content)
+ fill_post <<-EOS
+
+
+ [,1] [,2]
+[1,] FALSE TRUE
+[2,] FALSE TRUE
+EOS
end
- should "parse correctly" do
- assert_match %r{<em>FIGHT!</em>}, @result
- assert_match %r{<em>FINISH HIM</em>}, @result
+ should "only strip the preceding newlines" do
+ assert_match %{<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]}, @result
+ end
+ end
+
+ context "post content has highlight tag with preceding spaces & lines in several places" do
+ setup do
+ fill_post <<-EOS
+
+
+ [,1] [,2]
+
+
+[1,] FALSE TRUE
+[2,] FALSE TRUE
+
+
+EOS
+ end
+
+ should "only strip the newlines which precede and succeed the entire block" do
+ assert_match "<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE</code></pre>", @result
end
end
+ context "post content has highlight tag with preceding spaces & Windows-style newlines" do
+ setup do
+ fill_post "\r\n\r\n\r\n [,1] [,2]"
+ end
+
+ should "only strip the preceding newlines" do
+ assert_match %{<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]}, @result
+ end
+ end
+
+ context "post content has highlight tag with only preceding spaces" do
+ setup do
+ fill_post <<-EOS
+ [,1] [,2]
+[1,] FALSE TRUE
+[2,] FALSE TRUE
+EOS
+ end
+
+ should "only strip the preceding newlines" do
+ assert_match %{<pre><code class=\"language-text\" data-lang=\"text\"> [,1] [,2]}, @result
+ end
+ end
+ end
+
+ context "simple post with markdown and pre tags" do
+ setup do
+ @content = <<CONTENT
+---
+title: Kramdown vs. RDiscount vs. Redcarpet
+---
+
+_FIGHT!_
+
+{% highlight ruby %}
+puts "3..2..1.."
+{% endhighlight %}
+
+*FINISH HIM*
+CONTENT
+ end
+
context "using RDiscount" do
setup do
- create_post(@content, 'markdown' => 'rdiscount')
+ if jruby?
+ then skip(
+ "JRuby does not perform well with CExt, test disabled."
+ )
+ end
+
+ create_post(@content, {
+ 'markdown' => 'rdiscount'
+ })
end
should "parse correctly" do
@@ -219,7 +391,15 @@ CONTENT
context "using Redcarpet" do
setup do
- create_post(@content, 'markdown' => 'redcarpet')
+ if jruby?
+ skip(
+ "JRuby does not perform well with CExt, test disabled."
+ )
+ end
+
+ create_post(@content, {
+ 'markdown' => 'redcarpet'
+ })
end
should "parse correctly" do
@@ -242,7 +422,7 @@ CONTENT
end
should "not cause an error" do
- assert_no_match /markdown\-html\-error/, @result
+ refute_match /markdown\-html\-error/, @result
end
should "have the url to the \"complex\" post from 2008-11-21" do
@@ -266,7 +446,7 @@ CONTENT
end
should "not cause an error" do
- assert_no_match /markdown\-html\-error/, @result
+ refute_match /markdown\-html\-error/, @result
end
should "have the url to the \"complex\" post from 2008-11-21" do
@@ -275,8 +455,8 @@ CONTENT
end
should "have the url to the \"nested\" post from 2008-11-21" do
- assert_match %r{3\s/es/2008/11/21/nested/}, @result
- assert_match %r{4\s/es/2008/11/21/nested/}, @result
+ assert_match %r{3\s/2008/11/21/nested/}, @result
+ assert_match %r{4\s/2008/11/21/nested/}, @result
end
end
@@ -290,7 +470,7 @@ title: Invalid post name linking
{% post_url abc2008-11-21-complex %}
CONTENT
- assert_raise ArgumentError do
+ assert_raises ArgumentError do
create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
end
end
@@ -301,8 +481,8 @@ CONTENT
context "with symlink'd include" do
should "not allow symlink includes" do
- File.open("/tmp/pages-test", 'w') { |file| file.write("SYMLINK TEST") }
- assert_raise IOError do
+ File.open("tmp/pages-test", 'w') { |file| file.write("SYMLINK TEST") }
+ assert_raises IOError do
content = <<CONTENT
---
title: Include symlink
@@ -313,11 +493,11 @@ title: Include symlink
CONTENT
create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true, 'safe' => true })
end
- assert_no_match /SYMLINK TEST/, @result
+ refute_match /SYMLINK TEST/, @result
end
should "not expose the existence of symlinked files" do
- ex = assert_raise IOError do
+ ex = assert_raises IOError do
content = <<CONTENT
---
title: Include symlink
@@ -364,7 +544,7 @@ title: Invalid parameter syntax
{% include params.html param s="value" %}
CONTENT
- assert_raise ArgumentError, 'Did not raise exception on invalid "include" syntax' do
+ assert_raises ArgumentError, 'Did not raise exception on invalid "include" syntax' do
create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
end
@@ -375,7 +555,7 @@ title: Invalid parameter syntax
{% include params.html params="value %}
CONTENT
- assert_raise ArgumentError, 'Did not raise exception on invalid "include" syntax' do
+ assert_raises ArgumentError, 'Did not raise exception on invalid "include" syntax' do
create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
end
end
@@ -420,39 +600,37 @@ CONTENT
end
end
- context "without parameters within if statement" do
+ context "with custom includes directory" do
setup do
content = <<CONTENT
---
-title: without parameters within if statement
+title: custom includes directory
---
-{% if true %}{% include params.html %}{% endif %}
+{% include custom.html %}
CONTENT
- create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
+ create_post(content, {'includes_dir' => '_includes_custom', 'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
end
- should "include file with empty parameters within if statement" do
- assert_match "<span id=\"include-param\"></span>", @result
+ should "include file from custom directory" do
+ assert_match "custom_included", @result
end
end
- context "with fenced code blocks with backticks" do
-
+ context "without parameters within if statement" do
setup do
content = <<CONTENT
-```ruby
-puts "Hello world"
-```
+---
+title: without parameters within if statement
+---
+
+{% if true %}{% include params.html %}{% endif %}
CONTENT
- create_post(content, {
- 'markdown' => 'maruku',
- 'maruku' => {'fenced_code_blocks' => true}}
- )
+ create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
end
- should "render fenced code blocks" do
- assert_match %r{<pre class=\"ruby\"><code class=\"ruby\">puts "Hello world"</code></pre>}, @result.strip
+ should "include file with empty parameters within if statement" do
+ assert_match "<span id=\"include-param\"></span>", @result
end
end
@@ -468,7 +646,7 @@ CONTENT
end
should "raise error relative to source directory" do
- exception = assert_raise IOError do
+ exception = assert_raises IOError do
create_post(@content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
end
assert_equal 'Included file \'_includes/missing.html\' not found', exception.message
@@ -477,15 +655,9 @@ CONTENT
context "include tag with variable and liquid filters" do
setup do
- stub(Jekyll).configuration do
- site_configuration({'pygments' => true})
- end
-
- site = Site.new(Jekyll.configuration)
- post = Post.new(site, source_dir, '', "2013-12-17-include-variable-filters.markdown")
- layouts = { "default" => Layout.new(site, source_dir('_layouts'), "simple.html")}
- post.render(layouts, {"site" => {"posts" => []}})
- @content = post.content
+ site = fixture_site({'pygments' => true}).tap(&:read).tap(&:render)
+ post = site.posts.docs.find {|p| p.basename.eql? "2013-12-17-include-variable-filters.markdown" }
+ @content = post.output
end
should "include file as variable with liquid filters" do
@@ -504,6 +676,117 @@ CONTENT
assert_match '<li>var1 = foo</li>', @content
assert_match '<li>var2 = bar</li>', @content
end
+
+ should "include file as partial variable" do
+ assert_match %r{8 included}, @content
+ end
+ end
+ end
+
+ context "relative include tag with variable and liquid filters" do
+ setup do
+ site = fixture_site({'pygments' => true}).tap(&:read).tap(&:render)
+ post = site.posts.docs.find {|p| p.basename.eql? "2014-09-02-relative-includes.markdown" }
+ @content = post.output
+ end
+
+ should "include file as variable with liquid filters" do
+ assert_match %r{1 relative_include}, @content
+ assert_match %r{2 relative_include}, @content
+ assert_match %r{3 relative_include}, @content
+ end
+
+ should "include file as variable and liquid filters with arbitrary whitespace" do
+ assert_match %r{4 relative_include}, @content
+ assert_match %r{5 relative_include}, @content
+ assert_match %r{6 relative_include}, @content
+ end
+
+ should "include file as variable and filters with additional parameters" do
+ assert_match '<li>var1 = foo</li>', @content
+ assert_match '<li>var2 = bar</li>', @content
+ end
+
+ should "include file as partial variable" do
+ assert_match %r{8 relative_include}, @content
+ end
+
+ should "include files relative to self" do
+ assert_match %r{9 —\ntitle: Test Post Where YAML}, @content
+ end
+
+ context "trying to do bad stuff" do
+ context "include missing file" do
+ setup do
+ @content = <<CONTENT
+---
+title: missing file
+---
+
+{% include_relative missing.html %}
+CONTENT
+ end
+
+ should "raise error relative to source directory" do
+ exception = assert_raises IOError do
+ create_post(@content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
+ end
+ assert_equal 'Included file \'./missing.html\' not found', exception.message
+ end
+ end
+
+ context "include existing file above you" do
+ setup do
+ @content = <<CONTENT
+---
+title: higher file
+---
+
+{% include_relative ../README.markdown %}
+CONTENT
+ end
+
+ should "raise error relative to source directory" do
+ exception = assert_raises ArgumentError do
+ create_post(@content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
+ end
+ assert_equal "Invalid syntax for include tag. File contains invalid characters or sequences:\n\n ../README.markdown\n\nValid syntax:\n\n {% include_relative file.ext param='value' param2='value' %}\n\n", exception.message
+ end
+ end
+ end
+
+ context "with symlink'd include" do
+
+ should "not allow symlink includes" do
+ File.open("tmp/pages-test", 'w') { |file| file.write("SYMLINK TEST") }
+ assert_raises IOError do
+ content = <<CONTENT
+---
+title: Include symlink
+---
+
+{% include_relative tmp/pages-test %}
+
+CONTENT
+ create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true, 'safe' => true })
+ end
+ refute_match /SYMLINK TEST/, @result
+ end
+
+ should "not expose the existence of symlinked files" do
+ ex = assert_raises IOError do
+ content = <<CONTENT
+---
+title: Include symlink
+---
+
+{% include_relative tmp/pages-test-does-not-exist %}
+
+CONTENT
+ create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true, 'safe' => true })
+ end
+ assert_match /should exist and should not be a symlink/, ex.message
+ end
end
end
end
diff --git a/test/test_url.rb b/test/test_url.rb
index 0576eda..e4529be 100644
--- a/test/test_url.rb
+++ b/test/test_url.rb
@@ -1,6 +1,6 @@
require 'helper'
-class TestURL < Test::Unit::TestCase
+class TestURL < JekyllUnitTest
context "The URL class" do
should "throw an exception if neither permalink or template is specified" do
@@ -16,7 +16,14 @@ class TestURL < Test::Unit::TestCase
).to_s
end
- should "return permalink if given" do
+ should "handle multiple of the same key in the template" do
+ assert_equal '/foo/bar/foo/', URL.new(
+ :template => "/:x/:y/:x/",
+ :placeholders => {:x => "foo", :y => "bar"}
+ ).to_s
+ end
+
+ should "use permalink if given" do
assert_equal "/le/perma/link", URL.new(
:template => "/:x/:y",
:placeholders => {:x => "foo", :y => "bar"},
@@ -24,5 +31,28 @@ class TestURL < Test::Unit::TestCase
).to_s
end
+ should "replace placeholders in permalinks" do
+ assert_equal "/foo/bar", URL.new(
+ :template => "/baz",
+ :permalink => "/:x/:y",
+ :placeholders => {:x => "foo", :y => "bar"}
+ ).to_s
+ end
+
+ should "handle multiple of the same key in the permalink" do
+ assert_equal '/foo/bar/foo/', URL.new(
+ :template => "/baz",
+ :permalink => "/:x/:y/:x/",
+ :placeholders => {:x => "foo", :y => "bar"}
+ ).to_s
+ end
+
+ should "handle nil values for keys in the template" do
+ assert_equal '/foo/bar/', URL.new(
+ :template => "/:x/:y/:z/",
+ :placeholders => {:x => "foo", :y => "bar", :z => nil}
+ ).to_s
+ end
+
end
end
diff --git a/test/test_utils.rb b/test/test_utils.rb
index de1ebba..d1ec2ec 100644
--- a/test/test_utils.rb
+++ b/test/test_utils.rb
@@ -1,6 +1,6 @@
require 'helper'
-class TestUtils < Test::Unit::TestCase
+class TestUtils < JekyllUnitTest
context "hash" do
context "pluralized_array" do
@@ -64,4 +64,135 @@ class TestUtils < Test::Unit::TestCase
end
+ context "The \`Utils.parse_date\` method" do
+ should "parse a properly formatted date" do
+ assert Utils.parse_date("2014-08-02 14:43:06 PDT").is_a? Time
+ end
+
+ should "throw an error if the input contains no date data" do
+ assert_raises Jekyll::Errors::FatalException do
+ Utils.parse_date("Blah")
+ end
+ end
+
+ should "throw an error if the input is out of range" do
+ assert_raises Jekyll::Errors::FatalException do
+ Utils.parse_date("9999-99-99")
+ end
+ end
+
+ should "throw an error with the default message if no message is passed in" do
+ date = "Blah this is invalid"
+ assert_raises Jekyll::Errors::FatalException, "Invalid date '#{date}': Input could not be parsed." do
+ Utils.parse_date(date)
+ end
+ end
+
+ should "throw an error with the provided message if a message is passed in" do
+ date = "Blah this is invalid"
+ message = "Aaaah, the world has exploded!"
+ assert_raises Jekyll::Errors::FatalException, "Invalid date '#{date}': #{message}" do
+ Utils.parse_date(date, message)
+ end
+ end
+ end
+
+ context "The \`Utils.slugify\` method" do
+ should "return nil if passed nil" do
+ begin
+ assert Utils.slugify(nil).nil?
+ rescue NoMethodError
+ assert false, "Threw NoMethodError"
+ end
+ end
+
+ should "replace whitespace with hyphens" do
+ assert_equal "working-with-drafts", Utils.slugify("Working with drafts")
+ end
+
+ should "replace consecutive whitespace with a single hyphen" do
+ assert_equal "basic-usage", Utils.slugify("Basic Usage")
+ end
+
+ should "trim leading and trailing whitespace" do
+ assert_equal "working-with-drafts", Utils.slugify(" Working with drafts ")
+ end
+
+ should "drop trailing punctuation" do
+ assert_equal "so-what-is-jekyll-exactly", Utils.slugify("So what is Jekyll, exactly?")
+ assert_equal "كيف-حالك", Utils.slugify("كيف حالك؟")
+ end
+
+ should "ignore hyphens" do
+ assert_equal "pre-releases", Utils.slugify("Pre-releases")
+ end
+
+ should "replace underscores with hyphens" do
+ assert_equal "the-config-yml-file", Utils.slugify("The _config.yml file")
+ end
+
+ should "combine adjacent hyphens and spaces" do
+ assert_equal "customizing-git-git-hooks", Utils.slugify("Customizing Git - Git Hooks")
+ end
+
+ should "replace punctuation in any scripts by hyphens" do
+ assert_equal "5時-6時-三-一四", Utils.slugify("5時〜6時 三・一四")
+ end
+
+ should "not modify the original string" do
+ title = "Quick-start guide"
+ Utils.slugify(title)
+ assert_equal "Quick-start guide", title
+ end
+
+ should "not change behaviour if mode is default" do
+ assert_equal "the-config-yml-file", Utils.slugify("The _config.yml file?", mode: "default")
+ end
+
+ should "not change behaviour if mode is nil" do
+ assert_equal "the-config-yml-file", Utils.slugify("The _config.yml file?")
+ end
+
+ should "not replace period and underscore if mode is pretty" do
+ assert_equal "the-_config.yml-file", Utils.slugify("The _config.yml file?", mode: "pretty")
+ end
+
+ should "only replace whitespace if mode is raw" do
+ assert_equal "the-_config.yml-file?", Utils.slugify("The _config.yml file?", mode: "raw")
+ end
+
+ should "return the given string if mode is none" do
+ assert_equal "the _config.yml file?", Utils.slugify("The _config.yml file?", mode: "none")
+ end
+
+ should "Keep all uppercase letters if cased is true" do
+ assert_equal "Working-with-drafts", Utils.slugify("Working with drafts", cased: true)
+ assert_equal "Basic-Usage", Utils.slugify("Basic Usage", cased: true)
+ assert_equal "Working-with-drafts", Utils.slugify(" Working with drafts ", cased: true)
+ assert_equal "So-what-is-Jekyll-exactly", Utils.slugify("So what is Jekyll, exactly?", cased: true)
+ assert_equal "Pre-releases", Utils.slugify("Pre-releases", cased: true)
+ assert_equal "The-config-yml-file", Utils.slugify("The _config.yml file", cased: true)
+ assert_equal "Customizing-Git-Git-Hooks", Utils.slugify("Customizing Git - Git Hooks", cased: true)
+ assert_equal "The-config-yml-file", Utils.slugify("The _config.yml file?", mode: "default", cased: true)
+ assert_equal "The-config-yml-file", Utils.slugify("The _config.yml file?", cased: true)
+ assert_equal "The-_config.yml-file", Utils.slugify("The _config.yml file?", mode: "pretty", cased: true)
+ assert_equal "The-_config.yml-file?", Utils.slugify("The _config.yml file?", mode: "raw", cased: true)
+ assert_equal "The _config.yml file?", Utils.slugify("The _config.yml file?", mode: "none", cased: true)
+ end
+ end
+
+ context "The \`Utils.add_permalink_suffix\` method" do
+ should "handle built-in permalink styles" do
+ assert_equal "/:basename/", Utils.add_permalink_suffix("/:basename", :pretty)
+ assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", :date)
+ assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", :ordinal)
+ assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", :none)
+ end
+
+ should "handle custom permalink styles" do
+ assert_equal "/:basename/", Utils.add_permalink_suffix("/:basename", "/:title/")
+ assert_equal "/:basename:output_ext", Utils.add_permalink_suffix("/:basename", "/:title:output_ext")
+ assert_equal "/:basename", Utils.add_permalink_suffix("/:basename", "/:title")
+ end
+ end
end
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/jekyll.git
More information about the Pkg-ruby-extras-commits
mailing list