jekyll-3.1.6/000077500000000000000000000000001271741406300130205ustar00rootroot00000000000000jekyll-3.1.6/.codeclimate.yml000066400000000000000000000010141271741406300160660ustar00rootroot00000000000000engines: rubocop: { enabled: true } fixme: { enabled: false } exclude_paths: - .rubocop.yml - .codeclimate.yml - .travis.yml - .gitignore - .rspec - Gemfile.lock - CHANGELOG.{md,markdown,txt,textile} - CONTRIBUTING.{md,markdown,txt,textile} - readme.{md,markdown,txt,textile} - README.{md,markdown,txt,textile} - Readme.{md,markdown,txt,textile} - ReadMe.{md,markdown,txt,textile} - COPYING - LICENSE - site/**/* - test/**/* - vendor/**/* - features/**/* - script/**/* - spec/**/* ratings: paths: - lib/**/*.rb jekyll-3.1.6/.gitignore000066400000000000000000000003451271741406300150120ustar00rootroot00000000000000*.gem *.swp *~ .DS_Store .analysis .bundle/ .byebug_history .jekyll-metadata .ruby-gemset .ruby-version .sass-cache /test/source/file_name.txt /vendor Gemfile.lock _site/ bbin/ coverage gh-pages/ pkg/ site/_site/ test/dest tmp/* jekyll-3.1.6/.jrubyrc000066400000000000000000000000751271741406300145030ustar00rootroot00000000000000backtrace.mask=true backtrace.color=true backtrace.style=mri jekyll-3.1.6/.rubocop.yml000066400000000000000000000052241271741406300152750ustar00rootroot00000000000000Metrics/MethodLength: { Max: 24 } Metrics/ClassLength: { Max: 240 } Metrics/ModuleLength: { Max: 240 } Metrics/LineLength: { Max: 112 } Metrics/CyclomaticComplexity: { Max: 8 } Metrics/PerceivedComplexity: { Max: 8 } Metrics/ParameterLists: { Max: 4 } Metrics/MethodLength: { Max: 24 } Metrics/AbcSize: { Max: 20 } Style/IndentHash: { EnforcedStyle: consistent } Style/HashSyntax: { EnforcedStyle: hash_rockets } Style/SignalException: { EnforcedStyle: only_raise } Style/AlignParameters: { EnforcedStyle: with_fixed_indentation } Style/StringLiteralsInInterpolation: { EnforcedStyle: double_quotes } Style/MultilineMethodCallIndentation: { EnforcedStyle: indented } Style/MultilineOperationIndentation: { EnforcedStyle: indented } Style/FirstParameterIndentation: { EnforcedStyle: consistent } Style/StringLiterals: { EnforcedStyle: double_quotes } Style/RegexpLiteral: { EnforcedStyle: slashes } Style/IndentArray: { EnforcedStyle: consistent } Style/ExtraSpacing: { AllowForAlignment: true } Style/PercentLiteralDelimiters: PreferredDelimiters: '%q': '{}' '%Q': '{}' '%r': '!!' '%s': '()' '%w': '()' '%W': '()' '%x': '()' Style/AlignArray: { Enabled: false } Style/StringLiterals: { Enabled: false } Style/Documentation: { Enabled: false } Style/DoubleNegation: { Enabled: false } Style/UnneededCapitalW: { Enabled: false } Style/EmptyLinesAroundModuleBody: { Enabled: false } Style/EmptyLinesAroundAccessModifier: { Enabled: false } Style/BracesAroundHashParameters: { Enabled: false } Style/SpaceInsideBrackets: { Enabled: false } Style/IfUnlessModifier: { Enabled: false } Style/ModuleFunction: { Enabled: false } Style/RescueModifier: { Enabled: false } Style/GuardClause: { Enabled: false } Style/FileName: { Enabled: false } Lint/UselessAccessModifier: { Enabled: false } Style/SpaceAroundOperators: { Enabled: false } Style/RedundantReturn: { Enabled: false } Style/SingleLineMethods: { Enabled: false } AllCops: TargetRubyVersion: 2.0 Include: - lib/**/*.rb Exclude: - .rubocop.yml - .codeclimate.yml - .travis.yml - .gitignore - .rspec - Gemfile.lock - CHANGELOG.{md,markdown,txt,textile} - CONTRIBUTING.{md,markdown,txt,textile} - readme.{md,markdown,txt,textile} - README.{md,markdown,txt,textile} - Readme.{md,markdown,txt,textile} - ReadMe.{md,markdown,txt,textile} - COPYING - LICENSE - site/**/* - test/**/* - vendor/**/* - features/**/* - script/**/* - spec/**/* jekyll-3.1.6/.travis.yml000066400000000000000000000021241271741406300151300ustar00rootroot00000000000000before_script: bundle update bundler_args: --without benchmark:site:development script: script/cibuild cache: bundler language: ruby sudo: false rvm: - &ruby1 2.3.0 - &ruby2 2.2.4 - &ruby3 2.1.8 - &ruby4 2.0.0-p648 - &jruby jruby-9.0.4.0 - &rhead ruby-head matrix: fast_finish: true allow_failures: - rvm: *jruby - rvm: *rhead env: matrix: - TEST_SUITE=test - TEST_SUITE=cucumber notifications: irc: template: "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}" channels: irc.freenode.org#jekyll email: recipients: - jordon@envygeeks.io slack: secure: "\ dNdKk6nahNURIUbO3ULhA09/vTEQjK0fNbgjVjeYPEvROHgQBP1cIP3AJy8aWs8rl5Yyow4Y\ GEilNRzKPz18AsFptVXofpwyqcBxaCfmHP809NX5PHBaadydveLm+TNVao2XeLXSWu+HUNAY\ O1AanCUbJSEyJTju347xCBGzESU=\ " addons: code_climate: repo_token: secure: "\ mAuvDu+nrzB8dOaLqsublDGt423mGRyZYM3vsrXh4Tf1sT+L1PxsRzU4gLmcV27HtX2Oq9\ DA4vsRURfABU0fIhwYkQuZqEcA3d8TL36BZcGEshG6MQ2AmnYsmFiTcxqV5bmlElHEqQuT\ 5SUFXLafgZPBnL0qDwujQcHukID41sE=\ " jekyll-3.1.6/CONDUCT.markdown000066400000000000000000000045221271741406300156660ustar00rootroot00000000000000# 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, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 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 a project maintainer. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at [http://contributor-covenant.org/version/1/3/0/][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/3/0/ jekyll-3.1.6/CONTRIBUTING.markdown000066400000000000000000000105571271741406300165030ustar00rootroot00000000000000Contribute ========== 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 [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, 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. * Please do your best to submit **small pull requests**. The easier the proposed change is to review, the more likely it will be merged. * When submitting a pull request, please make judicious use of the pull request body. A description of what changes were made, the motivations behind the changes and [any tasks completed or left to complete](http://git.io/gfm-tasks) will also speed up review time. Test Dependencies ----------------- To run the test suite and build the gem you'll need to install Jekyll's dependencies. Simply run this command to get all setup: $ script/bootstrap Before you start, run the tests and make sure that they pass (to confirm your environment is configured properly): $ 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 -------- Here's the most direct way to get your work merged into the project: * Fork the project. * Clone down your fork ( `git clone git@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 `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 does and the why you think it should be merged. Updating Documentation ---------------------- We want the Jekyll documentation to be the best it can be. We've open-sourced our docs and we welcome any pull requests if you find it lacking. 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 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 ------- * 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 actively read the issues and will label it once they come across it. Finally... ---------- Thanks! Hacking on Jekyll should be fun. If you find any of this hard to figure out, let us know so we can improve our process or documentation! jekyll-3.1.6/Gemfile000066400000000000000000000030321271741406300143110ustar00rootroot00000000000000source "https://rubygems.org" gemspec :name => "jekyll" gem "rake", "~> 10.1" group :development do gem "launchy", "~> 2.3" gem "rubocop", "~> 0.40" gem "pry" unless RUBY_ENGINE == "jruby" gem "pry-byebug" end end # group :test do gem "cucumber", "~> 2.1" gem "jekyll_test_plugin" gem "jekyll_test_plugin_malicious" gem "codeclimate-test-reporter" gem "rspec-mocks" gem "nokogiri" gem "rspec" end # group :test_legacy do if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") gem 'test-unit' end gem "redgreen" gem "simplecov" gem "minitest-reporters" gem "minitest-profile" gem "minitest" gem "shoulda" end # group :benchmark do if ENV["BENCHMARK"] gem "ruby-prof" gem "benchmark-ips" gem "stackprof" gem "rbtrace" end end # group :jekyll_optional_dependencies do gem "toml", "~> 0.1.0" gem "coderay", "~> 1.1.0" gem "jekyll-docs", path: '../docs' if Dir.exist?('../docs') && ENV["JEKYLL_VERSION"] gem "jekyll-gist", "~> 1.0" gem "jekyll-feed", "~> 0.1.3" gem "jekyll-coffeescript", "~> 1.0" gem "jekyll-redirect-from", "~> 0.9.1" gem "jekyll-paginate", "~> 1.0" gem "mime-types", "~> 3.0" gem "kramdown", "~> 1.9" gem "rdoc", "~> 4.2" 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 end # group :site do if ENV["PROOF"] gem "html-proofer", "~> 2.0" end gem "jemoji" end jekyll-3.1.6/History.markdown000066400000000000000000002711271271741406300162370ustar00rootroot00000000000000## 3.1.6 / 2016-05-19 ### Bug Fixes * Add ability to `jsonify` Drops such that, e.g. `site | jsonify`, works. (#4914) ## 3.1.5 / 2016-05-18 ### Bug Fixes * Sort the results of the `require_all` glob (affects Linux only). (#4912) ## 3.1.4 / 2016-05-18 ### Bug Fixes * Add `ExcerptDrop` and remove excerpt's ability to refer to itself in Liquid (#4907) * Configuration permalink fix where `collections.posts.permalink` inherits properly from `permalink` only when it doesn't exist (#4910) * Add `Configuration.from` to make it easier to build configs from just a hash * Sorting `site.collections` in Liquid by label (#4910) * Fix bug where `layout` in Liquid would inherit from previously-rendered layouts' metadatas (#4909) * Fix bug where `layout` in Liquid would override in the wrong direction (more-specific layouts' data were overwritten by their parent layouts' data; this has now been reversed) (#4909) ## 3.1.2 / 2016-02-19 ### Minor Enhancements * Include `.rubocop.yml` in Gem (#4437) * `LiquidRenderer#parse`: parse with line numbers. (#4452) * Add consistency to the no-subcommand deprecation message (#4505) ### Bug Fixes * Fix syntax highlighting in kramdown by making `@config` accessible in the Markdown converter. (#4428) * `Jekyll.sanitized_path`: sanitizing a questionable path should handle tildes (#4492) * Fix `titleize` so already capitalized words are not dropped (#4525) * Permalinks which end in a slash should always output HTML (#4546) ### Development Fixes * Require at least cucumber version 2.1.0 (#4514) ### Site Enhancements * Add jekyll-toc plugin (#4429) * Docs: Quickstart - added documentation about the `--force` option (#4410) * Fix broken links to the Code of Conduct (#4436) * Upgrade notes: mention trailing slash in permalink; fixes #4440 (#4455) * Add hooks to the plugin categories toc (#4463) * [add note] Jekyll 3 requires newer version of Ruby. (#4461) * Fix typo in upgrading docs (#4473) * Add note about upgrading documentation on jekyllrb.com/help/ (#4484) * Update Rake link (#4496) * Update & prune the short list of example sites (#4374) * Added amp-jekyll plugin to plugins docs (#4517) * A few grammar fixes (#4512) * Correct a couple mistakes in structure.md (#4522) ## 3.1.1 / 2016-01-29 ### Meta * Update the Code of Conduct to the latest version (#4402) ### Bug Fixes * `Page#dir`: ensure it ends in a slash (#4403) * Add `Utils.merged_file_read_opts` to unify reading & strip the BOM (#4404) * `Renderer#output_ext`: honor folders when looking for ext (#4401) ### Development Fixes * Suppress stdout in liquid profiling test (#4409) ## 3.1.0 / 2016-01-23 ### Minor Enhancements * Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` (#4277) * Add 'sample' Liquid filter Equivalent to Array#sample functionality (#4223) * Cache parsed include file to save liquid parsing time. (#4120) * Slightly speed up url sanitization and handle multiples of ///. (#4168) * Print debug message when a document is skipped from reading (#4180) * Include tag should accept multiple variables in the include name (#4183) * Add `-o` option to serve command which opens server URL (#4144) * Add CodeClimate platform for better code quality. (#4220) * General improvements for WEBrick via jekyll serve such as SSL & custom headers (#4224, #4228) * Add a default charset to content-type on webrick. (#4231) * Switch `PluginManager` to use `require_with_graceful_fail` for better UX (#4233) * Allow quoted date in front matter defaults (#4184) * Add a Jekyll doctor warning for URLs that only differ by case (#3171) * drops: create one base Drop class which can be set as mutable or not (#4285) * drops: provide `#to_h` to allow for hash introspection (#4281) * Shim subcommands with indication of gem possibly required so users know how to use them (#4254) * Add smartify Liquid filter for SmartyPants (#4323) * Raise error on empty permalink (#4361) * Refactor Page#permalink method (#4389) ### Bug Fixes * Pass build options into `clean` command (#4177) * Allow users to use .htm and .xhtml (XHTML5.) (#4160) * Prevent Shell Injection. (#4200) * Convertible should make layout data accessible via `layout` instead of `page` (#4205) * Avoid using `Dir.glob` with absolute path to allow special characters in the path (#4150) * Handle empty config files (#4052) * Rename `@options` so that it does not impact Liquid. (#4173) * utils/drops: update Drop to support `Utils.deep_merge_hashes` (#4289) * Make sure jekyll/drops/drop is loaded first. (#4292) * Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility (#4311) * Drop: fix hash setter precendence (#4312) * utils: `has_yaml_header?` should accept files with extraneous spaces (#4290) * Escape html from site.title and page.title in site template (#4307) * Allow custom file extensions if defined in `permalink` YAML front matter (#4314) * Fix deep_merge_hashes! handling of drops and hashes (#4359) * Page should respect output extension of its permalink (#4373) * Disable auto-regeneration when running server detached (#4376) * Drop#[]: only use public_send for keys in the content_methods array (#4388) * Extract title from filename successfully when no date. (#4195) ### Development Fixes * `jekyll-docs` should be easily release-able (#4152) * Allow use of Cucumber 2.1 or greater (#4181) * Modernize Kramdown for Markdown converter. (#4109) * Change TestDoctorCommand to JekyllUnitTest... (#4263) * Create namespaced rake tasks in separate `.rake` files under `lib/tasks` (#4282) * markdown: refactor for greater readability & efficiency (#3771) * Fix many Rubocop style errors (#4301) * Fix spelling of "GitHub" in docs and history (#4322) * Reorganize and cleanup the Gemfile, shorten required depends. (#4318) * Remove script/rebund. (#4341) * Implement codeclimate platform (#4340) * Remove ObectSpace dumping and start using inherited, it's faster. (#4342) * Add script/travis so all people can play with Travis-CI images. (#4338) * Move Cucumber to using RSpec-Expections and furthering JRuby support. (#4343) * Rearrange Cucumber and add some flair. (#4347) * Remove old FIXME (#4349) * Clean up the Gemfile (and keep all the necessary dependencies) (#4350) ### Site Enhancements * Add three plugins to directory (#4163) * Add upgrading docs from 2.x to 3.x (#4157) * Add `protect_email` to the plugins index. (#4169) * Add `jekyll-deploy` to list of third-party plugins (#4179) * Clarify plugin docs (#4154) * Add Kickster to deployment methods in documentation (#4190) * Add DavidBurela's tutorial for Windows to Windows docs page (#4210) * Change GitHub code block to highlight tag to avoid it overlaps parent div (#4121) * Update FormKeep link to be something more specific to Jekyll (#4243) * Remove example Roger Chapman site, as the domain doesn't exist (#4249) * Added configuration options for `draft_posts` to configuration docs (#4251) * Fix checklist in `_assets.md` (#4259) * Add Markdown examples to Pages docs (#4275) * Add jekyll-paginate-category to list of third-party plugins (#4273) * Add `jekyll-responsive_image` to list of third-party plugins (#4286) * Add `jekyll-commonmark` to list of third-party plugins (#4299) * Add documentation for incremental regeneration (#4293) * Add note about removal of relative permalink support in upgrading docs (#4303) * Add Pro Tip to use front matter variable to create clean URLs (#4296) * Fix grammar in the documentation for posts. (#4330) * Add documentation for smartify Liquid filter (#4333) * Fixed broken link to blog on using mathjax with jekyll (#4344) * Documentation: correct reference in Precedence section of Configuration docs (#4355) * Add @jmcglone's guide to github-pages doc page (#4364) * Added the Wordpress2Jekyll Wordpress plugin (#4377) * Add Contentful Extension to list of third-party plugins (#4390) * Correct Minor spelling error (#4394) ## 3.0.3 / 2016-02-08 ### Bug Fixes * Fix extension weirdness with folders (#4493) * EntryFilter: only include 'excluded' log on excluded files (#4479) * `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path (#4468) * `LiquidRenderer#parse`: parse with line numbers (#4453) * `Document#<=>`: protect against nil comparison in dates. (#4446) ## 3.0.2 / 2016-01-20 ### Bug Fixes * Document: throw a useful error when an invalid date is given (#4378) ## 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 `` 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 * Throw a warning if the specified layout does not exist (#2620) * Whitelist Pygments options in safe mode (#2642) ### Bug Fixes * Remove unnecessary `Jekyll::Tags::IncludeTag#blank?` method (#2625) * Categories in the path are ignored (#2633) ### Development Fixes * Refactoring Errors & Requires of Third-Party stuff (#2591) * Add further tests for categories (#2584) * Proof site with html-proofer on change (#2605) * Fix up bug in #2605 which caused proofing the site not to function (#2608) * Use `bundle exec` in `script/proof` (#2610) ### Site Enhancements * Update Kramdown urls (#2588) * Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of third-party plugins (#2596) * Fix a bunch of broken links in the site (#2601) * Replace dead links with working links (#2611) * Add jekyll-hook to deployment methods (#2617) * Added kramdown-with-pygments plugin to the list of third-party plugins (#2623) * Update outdated "Extras" page and remove duplicate documentation (#2622) * Add co2 plugin to list of third-party plugins (#2639) * Attempt to clarify the way Sass imports happen (#2642) ## 2.1.1 / 2014-07-01 ### Bug Fixes * Patch read vulnerabilities for data & confirm none for layouts (#2563) * Update Maruku dependency to allow use of the latest version (#2576) * Remove conditional assignment from document URL to prevent stale urls (#2575) ### Site Enhancements * Add vertical margin to `highlight` to separate code blocks (#2558) * Add `html_pages` to Variables docs (#2567) * Fixed broken link to Permalinks page (#2572) * Update link to Windows installation guide (#2578) ## 2.1.0 / 2014-06-28 ### Minor Enhancements * Bump to the latest Liquid version, 2.6.1 (#2495) * Add support for JSON files in the `_data` directory (#2369) * Allow subclasses to override `EXCERPT_ATTRIBUTES_FOR_LIQUID` (#2408) * Add `Jekyll.env` and `jekyll.environment` (the Liquid var) (#2417) * Use `_config.yaml` or `_config.yml` (`.yml` takes precedence) (#2406) * Override collection url template (#2418) * Allow subdirectories in `_data` (#2395) * Extract Pagination Generator into gem: `jekyll-paginate` (#2455) * Utilize `date_to_rfc822` filter in site template (#2437) * Add categories, last build datetime, and generator to site template feed (#2438) * Configurable, replaceable Logger-compliant logger (#2444) * Extract `gist` tag into a separate gem (#2469) * Add `collection` attribute to `Document#to_liquid` to access the document's collection label. (#2436) * 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) * 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) * Skip initial build of site on serve with flag (#2477) * Add support for `hl_lines` in `highlight` tag (#2532) * Spike out `--watch` flag into a separate gem (#2550) ### Bug Fixes * Liquid `sort` filter should sort even if one of the values is `nil` (#2345) * Remove padding on `pre code` in the site template CSS (#2383) * Set `log_level` earlier to silence info level configuration output (#2393) * Only list pages which have `title` in site template (#2411) * Accept `Numeric` values for dates, not `Number` values (#2377) * 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) * 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 error which stated that redcarpet was missing, not rouge. (#2464) * Ignore *all* directories and files that merit it on auto-generation (#2459) * Before copying file, explicitly remove the old one (#2535) * Merge file system categories with categories from YAML. (#2531) * Deep merge front matter defaults (#2490) * Ensure exclude and include arrays are arrays of strings (#2542) * Allow collections to have dots in their filenames (#2552) * Collections shouldn't try to read in directories as files (#2552) * Be quiet very quickly. (#2520) ### Development Fixes * Test Ruby 2.1.2 instead of 2.1.1 (#2374) * Add test for sorting UTF-8 characters (#2384) * Use `https` for GitHub links in documentation (#2470) * Remove coverage reporting with Coveralls (#2494) * Fix a bit of missing TomDoc to `Jekyll::Commands::Build#build` (#2554) ### Site Enhancements * Set `timezone` to `America/Los_Angeles` (#2394) * Improve JavaScript in `anchor_links.html` (#2368) * Remove note on Quickstart page about default markdown converter (#2387) * Remove broken link in extras.md to a Maruku fork (#2401) * Update Font Awesome to v4.1.0. (#2410) * Fix broken link on Installation page to Templates page (#2421) * 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 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) * Add StickerMule + Jekyll post (#2476) * Add Jekyll Asset Pipeline Reborn to list of third-party plugins (#2479) * Add link to jekyll-compress-html to list of third-party plugins (#2514) * Add Piwigo Gallery to list of third-party plugins (#2526) * Set `show_drafts` to `false` in default configuration listing (#2536) * Provide an updated link for Windows installation instructions (#2544) * Remove `url` from configuration docs (#2547) * Documentation for Continuous Integration for your Jekyll Site (#2432) ## 2.0.3 / 2014-05-08 ### Bug Fixes * Properly prefix links in site template with URL or baseurl depending upon need. (#2319) * Update gist tag comments and error message to require username (#2326) * Fix `permalink` setting in site template (#2331) * Don't fail if any of the path objects are nil (#2325) * Instantiate all descendants for converters and generators, not just direct subclasses (#2334) * Replace all instances of `site.name` with `site.title` in site template (#2324) * `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form (#2339) * Use `item_property` for `where` filter so it doesn't break on collections (#2359) * Rescue errors thrown so `--watch` doesn't fail (#2364) ### Site Enhancements * Add missing "as" to assets docs page (#2337) * 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 front matter defaults docs (#2353) * Fix for `History.markdown` in order to fix history page in docs (#2363) ## 2.0.2 / 2014-05-07 ### Bug Fixes * Correct use of `url` and `baseurl` in the site template. (#2317) * Default `baseurl` to `""` (#2317) ### Site Enhancements * Correct docs for the `gist` plugin so it always includes the username. (#2314) * Clarify new (defaults, `where` filter) features in docs (#2316) ## 2.0.1 / 2014-05-06 ### Bug Fixes * Require `kramdown` gem instead of `maruku` gem ## 2.0.0 / 2014-05-06 ### Major Enhancements * Add "Collections" feature (#2199) * Add gem-based plugin whitelist to safe mode (#1657) * Replace the commander command line parser with a more robust solution for our needs called `mercenary` (#1706) * Remove support for Ruby 1.8.x (#1780) * Move to jekyll/jekyll from mojombo/jekyll (#1817) * Allow custom markdown processors (#1872) * Provide support for the Rouge syntax highlighter (#1859) * Provide support for Sass (#1932) * Provide a 300% improvement when generating sites that use `Post#next` or `Post#previous` (#1983) * Provide support for CoffeeScript (#1991) * Replace Maruku with Kramdown as Default Markdown Processor (#1988) * 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) * Deprecate `relative_permalinks` configuration option (default to `false`) (#2307) * Exclude files based on prefix as well as `fnmatch?` (#2303) ### Minor Enhancements * Move the EntryFilter class into the Jekyll module to avoid polluting the global namespace (#1800) * Add `group_by` Liquid filter create lists of items grouped by a common property's value (#1788) * Add support for Maruku's `fenced_code_blocks` option (#1799) * Update Redcarpet dependency to ~> 3.0 (#1815) * Automatically sort all pages by name (#1848) * Better error message when time is not parseable (#1847) * Allow `include` tag variable arguments to use filters (#1841) * `post_url` tag should raise `ArgumentError` for invalid name (#1825) * Bump dependency `mercenary` to `~> 0.2.0` (#1879) * Bump dependency `safe_yaml` to `~> 1.0` (#1886) * Allow sorting of content by custom properties (#1849) * Add `--quiet` flag to silence output during build and serve (#1898) * Add a `where` filter to filter arrays based on a key/value pair (#1875) * Route 404 errors to a custom 404 page in development (#1899) * Excludes are now relative to the site source (#1916) * Bring MIME Types file for `jekyll serve` to complete parity with GH Pages servers (#1993) * Adding Breakpoint to make new site template more responsive (#2038) * Default to using the UTF-8 encoding when reading files. (#2031) * Update Redcarpet dependency to ~> 3.1 (#2044) * Remove support for Ruby 1.9.2 (#2045) * Add `.mkdown` as valid Markdown extension (#2048) * Add `index.xml` to the list of WEBrick directory index files (#2041) * Make the `layouts` config key relative to CWD or to source (#2058) * Update Kramdown to `~> 1.3` (#1894) * Remove unnecessary references to `self` (#2090) * Update to Mercenary v0.3.x (#2085) * Ship Sass support as a separate gem (#2098) * Extract core extensions into a Utils module (#2112) * Refactor CLI & Commands For Greater Happiness (#2143) * Provide useful error when Pygments returns `nil` and error out (#2148) * Add support for unpublished drafts (#2164) * Add `force_polling` option to the `serve` command (#2165) * Clean up the `` in the site template (#2186) * 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) * 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) * 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) * Take into account missing values in the Liquid sort filter (#2299) ### Bug Fixes * Don't allow nil entries when loading posts (#1796) * Remove the scrollbar that's always displayed in new sites generated from the site template (#1805) * Add `#path` to required methods in `Jekyll::Convertible` (#1866) * Default Maruku fenced code blocks to ON for 2.0.0-dev (#1831) * Change short opts for host and port for `jekyll docs` to be consistent with other subcommands (#1877) * Fix typos (#1910) * Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 (#1958) * Fixes full path leak to source directory when using include tag (#1951) * Don't generate pages that aren't being published (#1931) * Use `SafeYAML.load` to avoid conflicts with other projects (#1982) * Relative posts should never fail to build (#1976) * Remove executable bits of non executable files (#2056) * `#path` for a draft is now `_drafts` instead of `_posts` (#2042) * Patch a couple show-stopping security vulnerabilities (#1946) * Sanitize paths uniformly, in a Windows-friendly way (#2065, #2109) * Update gem build steps to work correctly on Windows (#2118) * Remove obsolete `normalize_options` method call from `bin/jekyll` (#2121). * Remove `+` characters from Pygments lexer names when adding as a CSS class (#994) * Remove some code that caused Ruby interpreter warnings (#2178) * Only strip the drive name if it begins the string (#2175) * Remove default post with invalid date from site template (#2200) * Fix `Post#url` and `Page#url` escape (#1568) * Strip newlines from the `{% highlight %}` block content (#1823) * Load in `rouge` only when it's been requested as the highlighter (#2189) * Convert input to string before XML escaping (`xml_escape` liquid filter) (#2244) * Modify configuration key for Collections and reset properly. (#2238) * Avoid duplicated output using `highlight` tag (#2264) * Only use Jekyll.logger for output (#2307) * Close the file descriptor in `has_yaml_header?` (#2310) * Add `output` to `Document` liquid output hash (#2309) ### Development Fixes * Add a link to the site in the README.md file (#1795) * Add in History and site changes from `v1-stable` branch (#1836) * Testing additions on the Excerpt class (#1893) * Fix the `highlight` tag feature (#1859) * Test Jekyll under Ruby 2.1.0 (#1900) * Add script/cibuild for fun and profit (#1912) * Use `Forwardable` for delegation between `Excerpt` and `Post` (#1927) * Rename `read_things` to `read_content` (#1928) * Add `script/branding` script for ASCII art lovin' (#1936) * Update the README to reflect the repo move (#1943) * Add the project vision to the README (#1935) * Speed up Travis CI builds by using Rebund (#1985) * Use Yarp as a Gem proxy for Travis CI (#1984) * Remove Yarp as a Gem proxy for Travis CI (#2004) * Move the reading of layouts into its own class (#2020) * Test Sass import (#2009) * Switch Maruku and Kramdown in lists of Runtime vs. Development dependencies (#2049) * Clean up the gemspec for the project (#2095) * Add Japanese translation of README and CONTRIBUTING docs. (#2081) * Re-align the tables in Cucumber (#2108) * Trim trailing spaces and convert tabs to spaces (#2122) * Fix the failing Travis scenarios due to Cucumber issues (#2155) * Wrap `bundle install` in `travis_retry` to retry when RubyGems fails (#2160) * Refactor tags and categories (#1639) * Extract plugin management into its own class (#2197) * Add missing tests for `Command` (#2216) * Update `rr` link in CONTRIBUTING doc (#2247) * Streamline Cucumber execution of `jekyll` subcommands (#2258) * Refactor `Commands::Serve`. (#2269) * Refactor `highlight` tag (#2154) * Update `Util` hash functions with latest from Rails (#2273) * Workaround for Travis bug (#2290) ### Site Enhancements * Document Kramdown's GFM parser option (#1791) * Move CSS to includes & update normalize.css to v2.1.3 (#1787) * Minify CSS only in production (#1803) * Fix broken link to installation of Ruby on Mountain Lion blog post on Troubleshooting docs page (#1797) * Fix issues with 1.4.1 release blog post (#1804) * Add note about deploying to OpenShift (#1812) * Collect all Windows-related docs onto one page (#1818) * Fixed typo in datafiles doc page (#1854) * Clarify how to access `site` in docs (#1864) * Add closing `` tag to `context.registers[:site]` note (#1867) * Fix link to @mojombo's site source (#1897) * Add `paginate: nil` to default configuration in docs (#1896) * Add link to our License in the site footer (#1889) * Add a charset note in "Writing Posts" doc page (#1902) * Disallow selection of path and prompt in bash examples * Add jekyll-compass to the plugin list (#1923) * Add note in Posts docs about stripping `

` tags from excerpt (#1933) * Add additional info about the new exclude behavior (#1938) * Linkify 'awesome contributors' to point to the contributors graph on GitHub (#1940) * Update `docs/sites.md` link to GitHub Training materials (#1949) * Update `master` with the release info from 1.4.3 (#1947) * Define docs nav in datafile (#1953) * Clarify the docs around the naming convention for posts (#1971) * Add missing `next` and `previous` docs for post layouts and templates (#1970) * Add note to `Writing posts` page about how to strip html from excerpt (#1962) * Add `jekyll-humanize` plugin to plugin list (#1998) * Add `jekyll-font-awesome` plugin to plugin list (#1999) * Add `sublime-jekyll` to list of Editor plugins (#2001) * Add `vim-jekyll` to the list of Editor plugins (#2005) * Fix non-semantic nesting of `p` tags in `news_item` layout (#2013) * Document destination folder cleaning (#2016) * Updated instructions for NearlyFreeSpeech.NET installation (#2015) * Update link to rack-jekyll on "Deployment Methods" page (#2047) * Fix typo in /docs/configuration (#2073) * Fix count in docs for `site.static_files` (#2077) * Update configuration docs to indicate utf-8 is the default for 2.0.0 and ASCII for 1.9.3 (#2074) * Add info about unreleased feature to the site (#2061) * Add whitespace to liquid example in GitHub Pages docs (#2084) * Clarify the way Sass and CoffeeScript files are read in and output (#2067) * Add lyche gallery tag plugin link to list of plugins (#2094) * Add Jekyll Pages Directory plugin to list of plugins (#2096) * Update Configuration docs page with new markdown extension (#2102) * Add `jekyll-image-set` to the list of third-party plugins (#2105) * Losslessly compress images (#2128) * Update normalize.css to 3.0.0 (#2126) * Update modernizr to v2.7.1 (#2129) * Add `jekyll-ordinal` to list of third-party plugins (#2150) * Add `jekyll_figure` to list of third-party plugins (#2158) * Clarify the documentation for safe mode (#2163) * Some HTML tidying (#2130) * Remove modernizr and use html5shiv.js directly for IE less than v9 (#2131) * Remove unused images (#2187) * Use `array_to_sentence_string` filter when outputting news item categories (#2191) * Add link to Help repo in primary navigation bar (#2177) * Switch to using an ico file for the shortcut icon (#2193) * Use numbers to specify font weights and only bring in font weights used (#2185) * Add a link to the list of all tz database time zones (#1824) * Clean-up and improve documentation `feed.xml` (#2192) * Remove duplicate entry in list of third-party plugins (#2206) * Reduce the whitespace in the favicon. (#2213) * Add `jekyll-page-collections` to list of third-party plugins (#2215) * Add a cross-reference about `post_url` (#2243) * Add `jekyll-live-tiles` to list of third-party plugins (#2250) * Fixed broken link to GitHub training material site source (#2257) * Update link to help repo, now called `jekyll-help` (#2277) * Fix capitalization of 'Jekyll' on Deployment Methods page (#2291) * Include plugins by sonnym in list of third-party plugins (#2297) * Add deprecated articles keeper filter to list of third-party plugins (#2300) * Simplify and improve our CSS. (#2127) * Use black text color for the mobile navbar (#2306) * Use the built in date filter and `site.time` for the copyright year. (#2305) * Update html5shiv to v3.7.2 (#2304) * Add 2.0.0 release post (#2298) * Add docs for custom markdown processors (#2298) * Add docs for `where` and `group_by` Liquid filters (#2298) * Remove notes in docs for unreleased features (#2309) ## 1.5.1 / 2014-03-27 ### Bug Fixes * Only strip the drive name if it begins the string (#2176) ## 1.5.0 / 2014-03-24 ### Minor Enhancements * Loosen `safe_yaml` dependency to `~> 1.0` (#2167) * Bump `safe_yaml` dependency to `~> 1.0.0` (#1942) ### Bug Fixes * Fix issue where filesystem traversal restriction broke Windows (#2167) * Lock `maruku` at `0.7.0` (#2167) ### Development Fixes * Lock `cucumber` at `1.3.11` (#2167) ## 1.4.3 / 2014-01-13 ### Bug Fixes * Patch show-stopping security vulnerabilities (#1944) ## 1.4.2 / 2013-12-16 ### Bug Fixes * Turn on Maruku fenced code blocks by default (#1830) ## 1.4.1 / 2013-12-09 ### Bug Fixes * Don't allow nil entries when loading posts (#1796) ## 1.4.0 / 2013-12-07 ### Major Enhancements * Add support for TOML config files (#1765) ### Minor Enhancements * Sort plugins as a way to establish a load order (#1682) * Update Maruku to 0.7.0 (#1775) ### Bug Fixes * Add a space between two words in a Pagination warning message (#1769) * Upgrade `toml` gem to `v0.1.0` to maintain compat with Ruby 1.8.7 (#1778) ### Development Fixes * Remove some whitespace in the code (#1755) * Remove some duplication in the reading of posts and drafts (#1779) ### Site Enhancements * Fixed case of a word in the Jekyll v1.3.0 release post (#1762) * Fixed the mime type for the favicon (#1772) ## 1.3.1 / 2013-11-26 ### Minor Enhancements * Add a `--prefix` option to passthrough for the importers (#1669) * Push the paginator plugin lower in the plugin priority order so other plugins run before it (#1759) ### Bug Fixes * Fix the include tag when ran in a loop (#1726) * Fix errors when using `--watch` on 1.8.7 (#1730) * Specify where the include is called from if an included file is missing (#1746) ### Development Fixes * Extract `Site#filter_entries` into its own object (#1697) * Enable Travis' bundle caching (#1734) * Remove trailing whitespace in some files (#1736) * Fix a duplicate test name (#1754) ### Site Enhancements * Update link to example Rakefile to point to specific commit (#1741) * Fix drafts docs to indicate that draft time is based on file modification time, not `Time.now` (#1695) * Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to list of third-party plugins (#1693) * Add `jekyll-asset-path-plugin` to list of third-party plugins (#1670) * Add `emoji-for-jekyll` to list of third-part plugins (#1708) * Fix previous section link on plugins page to point to pagination page (#1707) * Add `org-mode` converter plugin to third-party plugins (#1711) * Point "Blog migrations" page to http://import.jekyllrb.com (#1732) * Add docs for `post_url` when posts are in subdirectories (#1718) * Update the docs to point to `example.com` (#1448) ## 1.3.0 / 2013-11-04 ### Major Enhancements * Add support for adding data as YAML files under a site's `_data` directory (#1003) * Allow variables to be used with `include` tags (#1495) * Allow using gems for plugin management (#1557) ### Minor Enhancements * Decrease the specificity in the site template CSS (#1574) * Add `encoding` configuration option (#1449) * Provide better error handling for Jekyll's custom Liquid tags (#1514) * If an included file causes a Liquid error, add the path to the include file that caused the error to the error message (#1596) * If a layout causes a Liquid error, change the error message so that we know it comes from the layout (#1601) * Update Kramdown dependency to `~> 1.2` (#1610) * Update `safe_yaml` dependency to `~> 0.9.7` (#1602) * Allow layouts to be in subfolders like includes (#1622) * Switch to listen for site watching while serving (#1589) * Add a `json` liquid filter to be used in sites (#1651) * Point people to the migration docs when the `jekyll-import` gem is missing (#1662) ### Bug Fixes * Fix up matching against source and destination when the two locations are similar (#1556) * Fix the missing `pathname` require in certain cases (#1255) * Use `+` instead of `Array#concat` when building `Post` attribute list (#1571) * Print server address when launching a server (#1586) * Downgrade to Maruku `~> 0.6.0` in order to avoid changes in rendering (#1598) * Fix error with failing include tag when variable was file name (#1613) * Downcase lexers before passing them to pygments (#1615) * Capitalize the short verbose switch because it conflicts with the built-in Commander switch (#1660) * Fix compatibility with 1.8.x (#1665) * Fix an error with the new file watching code due to library version incompatibilities (#1687) ### Development Fixes * Add coverage reporting with Coveralls (#1539) * Refactor the Liquid `include` tag (#1490) * Update launchy dependency to `~> 2.3` (#1608) * Update rr dependency to `~> 1.1` (#1604) * Update cucumber dependency to `~> 1.3` (#1607) * Update coveralls dependency to `~> 0.7.0` (#1606) * Update rake dependency to `~> 10.1` (#1603) * Clean up `site.rb` comments to be more concise/uniform (#1616) * Use the master branch for the build badge in the readme (#1636) * Refactor Site#render (#1638) * Remove duplication in command line options (#1637) * Add tests for all the coderay options (#1543) * Improve some of the Cucumber test code (#1493) * Improve comparisons of timestamps by ignoring the seconds (#1582) ### Site Enhancements * Fix params for `JekyllImport::WordPress.process` arguments (#1554) * Add `jekyll-suggested-tweet` to list of third-party plugins (#1555) * Link to Liquid's docs for tags and filters (#1553) * Add note about installing Xcode on the Mac in the Installation docs (#1561) * Simplify/generalize pagination docs (#1577) * Add documentation for the new data sources feature (#1503) * Add more information on how to create generators (#1590, #1592) * Improve the instructions for mimicking GitHub Flavored Markdown (#1614) * Add `jekyll-import` warning note of missing dependencies (#1626) * Fix grammar in the Usage section (#1635) * Add documentation for the use of gems as plugins (#1656) * Document the existence of a few additional plugins (#1405) * Document that the `date_to_string` always returns a two digit day (#1663) * Fix navigation in the "Working with Drafts" page (#1667) * Fix an error with the data documentation (#1691) ## 1.2.1 / 2013-09-14 ### Minor Enhancements * Print better messages for detached server. Mute output on detach. (#1518) * Disable reverse lookup when running `jekyll serve` (#1363) * Upgrade RedCarpet dependency to `~> 2.3.0` (#1515) * Upgrade to Liquid `>= 2.5.2, < 2.6` (#1536) ### Bug Fixes * Fix file discrepancy in gemspec (#1522) * Force rendering of Include tag (#1525) ### Development Fixes * Add a rake task to generate a new release post (#1404) * Mute LSI output in tests (#1531) * Update contributor documentation (#1537) ### Site Enhancements * Fix a couple of validation errors on the site (#1511) * Make navigation menus reusable (#1507) * Fix link to History page from Release v1.2.0 notes post. * Fix markup in History file for command line options (#1512) * Expand 1.2 release post title to 1.2.0 (#1516) ## 1.2.0 / 2013-09-06 ### Major Enhancements * Disable automatically-generated excerpts when `excerpt_separator` is `""`. (#1386) * Add checking for URL conflicts when running `jekyll doctor` (#1389) ### Minor Enhancements * Catch and fix invalid `paginate` values (#1390) * Remove superfluous `div.container` from the default html template for `jekyll new` (#1315) * Add `-D` short-form switch for the drafts option (#1394) * Update the links in the site template for Twitter and GitHub (#1400) * Update dummy email address to example.com domain (#1408) * Update normalize.css to v2.1.2 and minify; add rake task to update normalize.css with greater ease. (#1430) * Add the ability to detach the server ran by `jekyll serve` from it's controlling terminal (#1443) * Improve permalink generation for URLs with special characters (#944) * Expose the current Jekyll version to posts and pages via a new `jekyll.version` variable (#1481) ### Bug Fixes * Markdown extension matching matches only exact matches (#1382) * Fixed NoMethodError when message passed to `Stevenson#message` is nil (#1388) * Use binary mode when writing file (#1364) * Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and Kramdown > 0.14.0 (#1397) * Do not force the permalink to be a dir if it ends on .html (#963) * When a Liquid Exception is caught, show the full path rel. to site source (#1415) * Properly read in the config options when serving the docs locally (#1444) * Fixed `--layouts` option for `build` and `serve` commands (#1458) * Remove kramdown as a runtime dependency since it's optional (#1498) * Provide proper error handling for invalid file names in the include tag (#1494) ### Development Fixes * Remove redundant argument to Jekyll::Commands::New#scaffold_post_content (#1356) * Add new dependencies to the README (#1360) * Fix link to contributing page in README (#1424) * Update TomDoc in Pager#initialize to match params (#1441) * Refactor `Site#cleanup` into `Jekyll::Site::Cleaner` class (#1429) * Several other small minor refactorings (#1341) * Ignore `_site` in jekyllrb.com deploy (#1480) * Add Gem version and dependency badge to README (#1497) ### Site Enhancements * Add info about new releases (#1353) * Update plugin list with jekyll-rss plugin (#1354) * Update the site list page with Ruby's official site (#1358) * Add `jekyll-ditaa` to list of third-party plugins (#1370) * Add `postfiles` to list of third-party plugins (#1373) * For internal links, use full path including trailing `/` (#1411) * Use curly apostrophes in the docs (#1419) * Update the docs for Redcarpet in Jekyll (#1418) * Add `pluralize` and `reading_time` filters to docs (#1439) * Fix markup for the Kramdown options (#1445) * Fix typos in the History file (#1454) * Add trailing slash to site's post URL (#1462) * Clarify that `--config` will take multiple files (#1474) * Fix docs/templates.md private gist example (#1477) * Use `site.repository` for Jekyll's GitHub URL (#1463) * Add `jekyll-pageless-redirects` to list of third-party plugins (#1486) * Clarify that `date_to_xmlschema` returns an ISO 8601 string (#1488) * Add `jekyll-good-include` to list of third-party plugins (#1491) * XML escape the blog post title in our feed (#1501) * Add `jekyll-toc-generator` to list of third-party plugins (#1506) ## 1.1.2 / 2013-07-25 ### Bug Fixes * Require Liquid 2.5.1 (#1349) ## 1.1.1 / 2013-07-24 ### Minor Enhancements * Remove superfluous `table` selector from main.css in `jekyll new` template (#1328) * Abort with non-zero exit codes (#1338) ### Bug Fixes * Fix up the rendering of excerpts (#1339) ### Site Enhancements * Add Jekyll Image Tag to the plugins list (#1306) * Remove erroneous statement that `site.pages` are sorted alphabetically. * Add info about the `_drafts` directory to the directory structure docs (#1320) * Improve the layout of the plugin listing by organizing it into categories (#1310) * Add generator-jekyllrb and grunt-jekyll to plugins page (#1330) * Mention Kramdown as option for markdown parser on Extras page (#1318) * Update Quick-Start page to include reminder that all requirements must be installed (#1327) * Change filename in `include` example to an HTML file so as not to indicate that Jekyll will automatically convert them. (#1303) * Add an RSS feed for commits to Jekyll (#1343) ## 1.1.0 / 2013-07-14 ### Major Enhancements * Add `docs` subcommand to read Jekyll's docs when offline. (#1046) * Support passing parameters to templates in `include` tag (#1204) * Add support for Liquid tags to post excerpts (#1302) ### Minor Enhancements * Search the hierarchy of pagination path up to site root to determine template page for pagination. (#1198) * Add the ability to generate a new Jekyll site without a template (#1171) * Use redcarpet as the default markdown engine in newly generated sites (#1245, #1247) * Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new sites. (#1247) * In the generated site, remove files that will be replaced by a directory (#1118) * Fail loudly if a user-specified configuration file doesn't exist (#1098) * Allow for all options for Kramdown HTML Converter (#1201) ### Bug Fixes * Fix pagination in subdirectories. (#1198) * Fix an issue with directories and permalinks that have a plus sign (+) in them (#1215) * Provide better error reporting when generating sites (#1253) * Latest posts first in non-LSI `related_posts` (#1271) ### Development Fixes * Merge the theme and layout Cucumber steps into one step (#1151) * Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2` * Include/exclude deprecation handling simplification (#1284) * Convert README to Markdown. (#1267) * Refactor Jekyll::Site (#1144) ### Site Enhancements * Add "News" section for release notes, along with an RSS feed (#1093, #1285, #1286) * Add "History" page. * Restructured docs sections to include "Meta" section. * Add message to "Templates" page that specifies that Python must be installed in order to use Pygments. (#1182) * Update link to the official Maruku repo (#1175) * Add documentation about `paginate_path` to "Templates" page in docs (#1129) * Give the quick-start guide its own page (#1191) * Update ProTip on Installation page in docs to point to all the info about Pygments and the 'highlight' tag. (#1196) * Run `site/img` through ImageOptim (thanks @qrush!) (#1208) * Added Jade Converter to `site/docs/plugins` (#1210) * Fix location of docs pages in Contributing pages (#1214) * Add ReadInXMinutes plugin to the plugin list (#1222) * Remove plugins from the plugin list that have equivalents in Jekyll proper (#1223) * Add jekyll-assets to the plugin list (#1225) * Add jekyll-pandoc-mulitple-formats to the plugin list (#1229) * Remove dead link to "Using Git to maintain your blog" (#1227) * Tidy up the third-party plugins listing (#1228) * Update contributor information (#1192) * Update URL of article about Blogger migration (#1242) * Specify that RedCarpet is the default for new Jekyll sites on Quickstart page (#1247) * Added `site.pages` to Variables page in docs (#1251) * Add Youku and Tudou Embed link on Plugins page. (#1250) * Add note that `gist` tag supports private gists. (#1248) * Add `jekyll-timeago` to list of third-party plugins. (#1260) * Add `jekyll-swfobject` to list of third-party plugins. (#1263) * Add `jekyll-picture-tag` to list of third-party plugins. (#1280) * Update the GitHub Pages documentation regarding relative URLs (#1291) * Update the S3 deployment documentation (#1294) * Add suggestion for Xcode CLT install to troubleshooting page in docs (#1296) * Add 'Working with drafts' page to docs (#1289) * Add information about time zones to the documentation for a page's date (#1304) ## 1.0.3 / 2013-06-07 ### Minor Enhancements * Add support to gist tag for private gists. (#1189) * Fail loudly when Maruku errors out (#1190) * Move the building of related posts into their own class (#1057) * Removed trailing spaces in several places throughout the code (#1116) * Add a `--force` option to `jekyll new` (#1115) * Convert IDs in the site template to classes (#1170) ### Bug Fixes * Fix typo in Stevenson constant "ERROR". (#1166) * Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue (#1106) * Exit with a non-zero exit code when dealing with a Liquid error (#1121) * Make the `exclude` and `include` options backwards compatible with versions of Jekyll prior to 1.0 (#1114) * Fix pagination on Windows (#1063) * Fix the application of Pygments' Generic Output style to Go code (#1156) ### Site Enhancements * Add a Pro Tip to docs about front matter variables being optional (#1147) * Add changelog to site as History page in /docs/ (#1065) * Add note to Upgrading page about new config options in 1.0.x (#1146) * Documentation for `date_to_rfc822` and `uri_escape` (#1142) * Documentation highlight boxes shouldn't show scrollbars if not necessary (#1123) * Add link to jekyll-minibundle in the doc's plugins list (#1035) * Quick patch for importers documentation * Fix prefix for WordpressDotCom importer in docs (#1107) * Add jekyll-contentblocks plugin to docs (#1068) * Make code bits in notes look more natural, more readable (#1089) * Fix logic for `relative_permalinks` instructions on Upgrading page (#1101) * Add docs for post excerpt (#1072) * Add docs for gist tag (#1072) * Add docs indicating that Pygments does not need to be installed separately (#1099, #1119) * Update the migrator docs to be current (#1136) * Add the Jekyll Gallery Plugin to the plugin list (#1143) ### Development Fixes * Use Jekyll.logger instead of Jekyll::Stevenson to log things (#1149) * Fix pesky Cucumber infinite loop (#1139) * Do not write posts with timezones in Cucumber tests (#1124) * Use ISO formatted dates in Cucumber features (#1150) ## 1.0.2 / 2013-05-12 ### Major Enhancements * Add `jekyll doctor` command to check site for any known compatibility problems (#1081) * Backwards-compatibilize relative permalinks (#1081) ### Minor Enhancements * Add a `data-lang=""` attribute to Redcarpet code blocks (#1066) * Deprecate old config `server_port`, match to `port` if `port` isn't set (#1084) * Update pygments.rb version to 0.5.0 (#1061) * Update Kramdown version to 1.0.2 (#1067) ### Bug Fixes * Fix issue when categories are numbers (#1078) * Catching that Redcarpet gem isn't installed (#1059) ### Site Enhancements * Add documentation about `relative_permalinks` (#1081) * Remove pygments-installation instructions, as pygments.rb is bundled with it (#1079) * Move pages to be Pages for realz (#985) * Updated links to Liquid documentation (#1073) ## 1.0.1 / 2013-05-08 ### Minor Enhancements * Do not force use of `toc_token` when using `generate_tok` in RDiscount (#1048) * Add newer `language-` class name prefix to code blocks (#1037) * Commander error message now preferred over process abort with incorrect args (#1040) ### Bug Fixes * Make Redcarpet respect the pygments configuration option (#1053) * Fix the index build with LSI (#1045) * Don't print deprecation warning when no arguments are specified. (#1041) * Add missing `` to site template used by `new` subcommand, fixed typos in code (#1032) ### Site Enhancements * Changed https to http in the GitHub Pages link (#1051) * Remove CSS cruft, fix typos, fix HTML errors (#1028) * Removing manual install of Pip and Distribute (#1025) * Updated URL for Markdown references plugin (#1022) ### Development Fixes * Markdownify history file (#1027) * Update links on README to point to new jekyllrb.com (#1018) ## 1.0.0 / 2013-05-06 ### Major Enhancements * Add `jekyll new` subcommand: generate a Jekyll scaffold (#764) * Refactored Jekyll commands into subcommands: build, serve, and migrate. (#690) * Removed importers/migrators from main project, migrated to jekyll-import sub-gem (#793) * Added ability to render drafts in `_drafts` folder via command line (#833) * Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) (#928) ### Minor Enhancements * Site template HTML5-ified (#964) * Use post's directory path when matching for the `post_url` tag (#998) * Loosen dependency on Pygments so it's only required when it's needed (#1015) * Parse strings into Time objects for date-related Liquid filters (#1014) * Tell the user if there is no subcommand specified (#1008) * Freak out if the destination of `jekyll new` exists and is non-empty (#981) * Add `timezone` configuration option for compilation (#957) * Add deprecation messages for pre-1.0 CLI options (#959) * Refactor and colorize logging (#959) * Refactor Markdown parsing (#955) * Added application/vnd.apple.pkpass to mime.types served by WEBrick (#907) * Move template site to default markdown renderer (#961) * Expose new attribute to Liquid via `page`: `page.path` (#951) * Accept multiple config files from command line (#945) * Add page variable to liquid custom tags and blocks (#413) * Add `paginator.previous_page_path` and `paginator.next_page_path` (#942) * Backwards compatibility for 'auto' (#821, #934) * Added date_to_rfc822 used on RSS feeds (#892) * Upgrade version of pygments.rb to 0.4.2 (#927) * Added short month (e.g. "Sep") to permalink style options for posts (#890) * Expose site.baseurl to Liquid templates (#869) * Adds excerpt attribute to posts which contains first paragraph of content (#837) * Accept custom configuration file via CLI (#863) * Load in GitHub Pages MIME Types on `jekyll serve` (#847, #871) * Improve debugability of error message for a malformed highlight tag (#785) * Allow symlinked files in unsafe mode (#824) * Add 'gist' Liquid tag to core (#822, #861) * New format of Jekyll output (#795) * Reinstate `--limit_posts` and `--future` switches (#788) * Remove ambiguity from command descriptions (#815) * Fix SafeYAML Warnings (#807) * Relaxed Kramdown version to 0.14 (#808) * Aliased `jekyll server` to `jekyll serve`. (#792) * Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. (#744) * Refactored Jekyll subcommands into Jekyll::Commands submodule, which now contains them (#768) * Rescue from import errors in Wordpress.com migrator (#671) * Massively accelerate LSI performance (#664) * Truncate post slugs when importing from Tumblr (#496) * Add glob support to include, exclude option (#743) * Layout of Page or Post defaults to 'page' or 'post', respectively (#580) REPEALED by (#977) * "Keep files" feature (#685) * Output full path & name for files that don't parse (#745) * Add source and destination directory protection (#535) * Better YAML error message (#718) * Bug Fixes * Paginate in subdirectories properly (#1016) * Ensure post and page URLs have a leading slash (#992) * Catch all exceptions, not just StandardError descendents (#1007) * 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) * 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) * Fix integration with directory_watcher 1.4.x (#916) * Accepting strings as arguments to jekyll-import command (#910) * Force usage of older directory_watcher gem as 1.5 is broken (#883) * Ensure all Post categories are downcase (#842, #872) * Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors (#555) * 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) * Look for plugins under the source directory (#654) * Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long post names (#775) * Force Categories to be Strings (#767) * Safe YAML plugin to prevent vulnerability (#777) * Add SVG support to Jekyll/WEBrick. (#407, #406) * Prevent custom destination from causing continuous regen on watch (#528, #820, #862) ### Site Enhancements * Responsify (#860) * Fix spelling, punctuation and phrasal errors (#989) * Update quickstart instructions with `new` command (#966) * Add docs for page.excerpt (#956) * Add docs for page.path (#951) * Clean up site docs to prepare for 1.0 release (#918) * Bring site into master branch with better preview/deploy (#709) * Redesigned site (#583) ### Development Fixes * Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 (#938) * Added "features:html" rake task for debugging purposes, cleaned up Cucumber profiles (#832) * Explicitly require HTTPS rubygems source in Gemfile (#826) * Changed Ruby version for development to 1.9.3-p374 from p362 (#801) * Including a link to the GitHub Ruby style guide in CONTRIBUTING.md (#806) * Added script/bootstrap (#776) * Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version of greater than 1.9 (#771) * Switch to Simplecov for coverage report (#765) ## 0.12.1 / 2013-02-19 ### Minor Enhancements * Update Kramdown version to 0.14.1 (#744) * Test Enhancements * Update Rake version to 10.0.3 (#744) * Update Shoulda version to 3.3.2 (#744) * Update Redcarpet version to 2.2.2 (#744) ## 0.12.0 / 2012-12-22 ### Minor Enhancements * Add ability to explicitly specify included files (#261) * Add `--default-mimetype` option (#279) * Allow setting of RedCloth options (#284) * Add `post_url` Liquid tag for internal post linking (#369) * Allow multiple plugin dirs to be specified (#438) * Inline TOC token support for RDiscount (#333) * Add the option to specify the paginated url format (#342) * Swap out albino for pygments.rb (#569) * Support Redcarpet 2 and fenced code blocks (#619) * Better reporting of Liquid errors (#624) * Bug Fixes * Allow some special characters in highlight names * URL escape category names in URL generation (#360) * 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) ## 0.11.2 / 2011-12-27 * Bug Fixes * Fix gemspec ## 0.11.1 / 2011-12-27 * Bug Fixes * Fix extra blank line in highlight blocks (#409) * Update dependencies ## 0.11.0 / 2011-07-10 ### Major Enhancements * Add command line importer functionality (#253) * Add Redcarpet Markdown support (#318) * Make markdown/textile extensions configurable (#312) * Add `markdownify` filter ### Minor Enhancements * Switch to Albino gem * Bundler support * Use English library to avoid hoops (#292) * Add Posterous importer (#254) * Fixes for Wordpress importer (#274, #252, #271) * Better error message for invalid post date (#291) * Print formatted fatal exceptions to stdout on build failure * Add Tumblr importer (#323) * Add Enki importer (#320) * Bug Fixes * Secure additional path exploits ## 0.10.0 / 2010-12-16 * Bug Fixes * Add `--no-server` option. ## 0.9.0 / 2010-12-15 ### Minor Enhancements * Use OptionParser's `[no-]` functionality for better boolean parsing. * Add Drupal migrator (#245) * Complain about YAML and Liquid errors (#249) * Remove orphaned files during regeneration (#247) * Add Marley migrator (#28) ## 0.8.0 / 2010-11-22 ### Minor Enhancements * Add wordpress.com importer (#207) * Add `--limit-posts` cli option (#212) * Add `uri_escape` filter (#234) * Add `--base-url` cli option (#235) * Improve MT migrator (#238) * Add kramdown support (#239) * Bug Fixes * Fixed filename basename generation (#208) * Set mode to UTF8 on Sequel connections (#237) * Prevent `_includes` dir from being a symlink ## 0.7.0 / 2010-08-24 ### Minor Enhancements * Add support for rdiscount extensions (#173) * Bug Fixes * Highlight should not be able to render local files * The site configuration may not always provide a 'time' setting (#184) ## 0.6.2 / 2010-06-25 * Bug Fixes * Fix Rakefile 'release' task (tag pushing was missing origin) * Ensure that RedCloth is loaded when textilize filter is used (#183) * Expand source, destination, and plugin paths (#180) * Fix `page.url` to include full relative path (#181) ## 0.6.1 / 2010-06-24 * Bug Fixes * Fix Markdown Pygments prefix and suffix (#178) ## 0.6.0 / 2010-06-23 ### Major Enhancements * Proper plugin system (#19, #100) * Add safe mode so unsafe converters/generators can be added * Maruku is now the only processor dependency installed by default. Other processors will be lazy-loaded when necessary (and prompt the user to install them when necessary) (#57) ### Minor Enhancements * Inclusion/exclusion of future dated posts (#59) * Generation for a specific time (#59) * Allocate `site.time` on render not per site_payload invocation (#59) * Pages now present in the site payload and can be used through the `site.pages` and `site.html_pages` variables * Generate phase added to site#process and pagination is now a generator * Switch to RakeGem for build/test process * Only regenerate static files when they have changed (#142) * Allow arbitrary options to Pygments (#31) * Allow URL to be set via command line option (#147) * Bug Fixes * Render highlighted code for non markdown/textile pages (#116) * Fix highlighting on Ruby 1.9 (#65) * Fix extension munging when pretty permalinks are enabled (#64) * Stop sorting categories (#33) * Preserve generated attributes over front matter (#119) * Fix source directory binding using `Dir.pwd` (#75) ## 0.5.7 / 2010-01-12 ### Minor Enhancements * Allow overriding of post date in the front matter (#62, #38) * Bug Fixes * Categories isn't always an array (#73) * Empty tags causes error in read_posts (#84) * Fix pagination to adhere to read/render/write paradigm * Test Enhancement * Cucumber features no longer use site.posts.first where a better alternative is available ## 0.5.6 / 2010-01-08 * Bug Fixes * Require redcloth >= 4.2.1 in tests (#92) * Don't break on triple dashes in yaml front matter (#93) ### Minor Enhancements * Allow .mkd as markdown extension * Use $stdout/err instead of constants (#99) * Properly wrap code blocks (#91) * Add javascript mime type for webrick (#98) ## 0.5.5 / 2010-01-08 * Bug Fixes * Fix pagination % 0 bug (#78) * Ensure all posts are processed first (#71) ## NOTE * After this point I will no longer be giving credit in the history; that is what the commit log is for. ## 0.5.4 / 2009-08-23 * Bug Fixes * Do not allow symlinks (security vulnerability) ## 0.5.3 / 2009-07-14 * Bug Fixes * Solving the permalink bug where non-html files wouldn't work (@jeffrydegrande) ## 0.5.2 / 2009-06-24 * Enhancements * Added --paginate option to the executable along with a paginator object for the payload (@calavera) * Upgraded RedCloth to 4.2.1, which makes `` tags work once again. * Configuration options set in config.yml are now available through the site payload (@vilcans) * Posts can now have an empty YAML front matter or none at all (@ bahuvrihi) * Bug Fixes * Fixing Ruby 1.9 issue that requires `#to_s` on the err object (@Chrononaut) * Fixes for pagination and ordering posts on the same day (@ujh) * Made pages respect permalinks style and permalinks in yml front matter (@eugenebolshakov) * Index.html file should always have index.html permalink (@eugenebolshakov) * Added trailing slash to pretty permalink style so Apache is happy (@eugenebolshakov) * Bad markdown processor in config fails sooner and with better message (@ gcnovus) * Allow CRLFs in yaml front matter (@juretta) * Added Date#xmlschema for Ruby versions < 1.9 ## 0.5.1 / 2009-05-06 ### Major Enhancements * Next/previous posts in site payload (@pantulis, @tomo) * Permalink templating system * Moved most of the README out to the GitHub wiki * Exclude option in configuration so specified files won't be brought over with generated site (@duritong) * Bug Fixes * Making sure config.yaml references are all gone, using only config.yml * Fixed syntax highlighting breaking for UTF-8 code (@henrik) * Worked around RDiscount bug that prevents Markdown from getting parsed after highlight (@henrik) * CGI escaped post titles (@Chrononaut) ## 0.5.0 / 2009-04-07 ### Minor Enhancements * Ability to set post categories via YAML (@qrush) * Ability to set prevent a post from publishing via YAML (@qrush) * Add textilize filter (@willcodeforfoo) * Add 'pretty' permalink style for wordpress-like urls (@dysinger) * Made it possible to enter categories from YAML as an array (@Chrononaut) * Ignore Emacs autosave files (@Chrononaut) * Bug Fixes * Use block syntax of popen4 to ensure that subprocesses are properly disposed (@jqr) * Close open4 streams to prevent zombies (@rtomayko) * Only query required fields from the WP Database (@ariejan) * Prevent `_posts` from being copied to the destination directory (@bdimcheff) * Refactors * Factored the filtering code into a method (@Chrononaut) * Fix tests and convert to Shoulda (@qrush, @technicalpickles) * Add Cucumber acceptance test suite (@qrush, @technicalpickles) ## 0.4.1 ### Minor Enhancements * Changed date format on wordpress converter (zeropadding) (@dysinger) * Bug Fixes * Add Jekyll binary as executable to gemspec (@dysinger) ## 0.4.0 / 2009-02-03 ### Major Enhancements * Switch to Jeweler for packaging tasks ### Minor Enhancements * Type importer (@codeslinger) * `site.topics` accessor (@baz) * Add `array_to_sentence_string` filter (@mchung) * Add a converter for textpattern (@PerfectlyNormal) * Add a working Mephisto / MySQL converter (@ivey) * Allowing .htaccess files to be copied over into the generated site (@briandoll) * Add option to not put file date in permalink URL (@mreid) * Add line number capabilities to highlight blocks (@jcon) * Bug Fixes * Fix permalink behavior (@cavalle) * Fixed an issue with pygments, markdown, and newlines (@zpinter) * Ampersands need to be escaped (@pufuwozu, @ap) * Test and fix the site.categories hash (@zzot) * Fix site payload available to files (@matrix9180) ## 0.3.0 / 2008-12-24 ### Major Enhancements * Added `--server` option to start a simple WEBrick server on destination directory (@johnreilly and @mchung) ### Minor Enhancements * Added post categories based on directories containing `_posts` (@mreid) * Added post topics based on directories underneath `_posts` * Added new date filter that shows the full month name (@mreid) * Merge Post's YAML front matter into its to_liquid payload (@remi) * Restrict includes to regular files underneath `_includes` * Bug Fixes * Change YAML delimiter matcher so as to not chew up 2nd level markdown headers (@mreid) * Fix bug that meant page data (such as the date) was not available in templates (@mreid) * Properly reject directories in `_layouts` ## 0.2.1 / 2008-12-15 * Major Changes * Use Maruku (pure Ruby) for Markdown by default (@mreid) * Allow use of RDiscount with `--rdiscount` flag ### Minor Enhancements * Don't load directory_watcher unless it's needed (@pjhyett) ## 0.2.0 / 2008-12-14 * Major Changes * related_posts is now found in `site.related_posts` ## 0.1.6 / 2008-12-13 * Major Features * Include files in `_includes` with `{% include x.textile %}` ## 0.1.5 / 2008-12-12 ### Major Enhancements * Code highlighting with Pygments if `--pygments` is specified * Disable true LSI by default, enable with `--lsi` ### Minor Enhancements * Output informative message if RDiscount is not available (@JackDanger) * Bug Fixes * Prevent Jekyll from picking up the output directory as a source (@JackDanger) * Skip `related_posts` when there is only one post (@JackDanger) ## 0.1.4 / 2008-12-08 * Bug Fixes * DATA does not work properly with rubygems ## 0.1.3 / 2008-12-06 * Major Features * Markdown support (@vanpelt) * Mephisto and CSV converters (@vanpelt) * Code hilighting (@vanpelt) * Autobuild * Bug Fixes * Accept both `\r\n` and `\n` in YAML header (@vanpelt) ## 0.1.2 / 2008-11-22 * Major Features * Add a real "related posts" implementation using Classifier * Command Line Changes * Allow cli to be called with 0, 1, or 2 args intuiting dir paths if they are omitted ## 0.1.1 / 2008-11-22 * Minor Additions * Posts now support introspectional data e.g. `{{ page.url }}` ## 0.1.0 / 2008-11-05 * First release * Converts posts written in Textile * Converts regular site pages * Simple copy of binary files ## 0.0.0 / 2008-10-19 * Birthday! jekyll-3.1.6/ISSUE_TEMPLATE.md000066400000000000000000000004761271741406300155340ustar00rootroot00000000000000###### What version of Jekyll are you using (`jekyll -v`)? ###### What operating system are you using? ###### What did you do? (Please include the content causing the issue, any relevant configuration settings, and the command you ran) ###### What did you expect to see? ###### What did you see instead? jekyll-3.1.6/LICENSE000066400000000000000000000021021271741406300140200ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2008-2016 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 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 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 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 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. jekyll-3.1.6/README.markdown000066400000000000000000000065571271741406300155360ustar00rootroot00000000000000# [Jekyll](http://jekyllrb.com/) [![Gem Version](https://img.shields.io/gem/v/jekyll.svg)][ruby-gems] [![Build Status](https://travis-ci.org/jekyll/jekyll.svg?branch=master)][travis] [![Test Coverage](https://codeclimate.com/github/jekyll/jekyll/badges/coverage.svg)][coverage] [![Code Climate](https://codeclimate.com/github/jekyll/jekyll/badges/gpa.svg)][codeclimate] [![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)][gemnasium] [![Security](https://hakiri.io/github/jekyll/jekyll/master.svg)][hakiri] [ruby-gems]: https://rubygems.org/gems/jekyll [gemnasium]: https://gemnasium.com/jekyll/jekyll [codeclimate]: https://codeclimate.com/github/jekyll/jekyll [coverage]: https://codeclimate.com/github/jekyll/jekyll/coverage [hakiri]: https://hakiri.io/github/jekyll/jekyll/master [travis]: https://travis-ci.org/jekyll/jekyll 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. ## Philosophy 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 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.markdown) 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 * [Migrate](http://import.jekyllrb.com/docs/home/) from your previous system * Learn how the [YAML Front Matter](http://jekyllrb.com/docs/frontmatter/) works * Put information on your site with [Variables](http://jekyllrb.com/docs/variables/) * Customize the [Permalinks](http://jekyllrb.com/docs/permalinks/) your posts are generated with * Use the built-in [Liquid Extensions](http://jekyllrb.com/docs/templates/) to make your life easier * Use custom [Plugins](http://jekyllrb.com/docs/plugins/) to generate content specific to your site ## License See [LICENSE](https://github.com/jekyll/jekyll/blob/master/LICENSE). jekyll-3.1.6/Rakefile000066400000000000000000000060461271741406300144730ustar00rootroot00000000000000require 'rubygems' require 'rake' require 'rdoc' require 'date' require 'yaml' $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib])) require 'jekyll/version' Dir.glob('rake/**.rake').each { |f| import f } ############################################################################# # # Helper functions # ############################################################################# def name "jekyll" end def version Jekyll::VERSION end def docs_name "#{name}-docs" end def gemspec_file "#{name}.gemspec" end def gem_file "#{name}-#{Gem::Version.new(version).to_s}.gem" end def normalize_bullets(markdown) markdown.gsub(/\n\s{2}\*{1}/, "\n-") end def linkify_prs(markdown) markdown.gsub(/#(\d+)/) do |word| "[#{word}]({{ site.repository }}/issues/#{word.delete("#")})" end end def linkify_users(markdown) markdown.gsub(/(@\w+)/) do |username| "[#{username}](https://github.com/#{username.delete("@")})" end end def linkify(markdown) linkify_users(linkify_prs(markdown)) end def liquid_escape(markdown) markdown.gsub(/(`{[{%].+[}%]}`)/, "{% raw %}\\1{% endraw %}") end def custom_release_header_anchors(markdown) header_regexp = /^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}/ section_regexp = /^### \w+ \w+$/ markdown.split(/^##\s/).map do |release_notes| _, major, minor, patch = *release_notes.match(header_regexp) release_notes .gsub(header_regexp, "\\0\n{: #v\\1-\\2-\\3}") .gsub(section_regexp) { |section| "#{section}\n{: ##{sluffigy(section)}-v#{major}-#{minor}-#{patch}}" } end.join("\n## ") end def sluffigy(header) header.gsub(/#/, '').strip.downcase.gsub(/\s+/, '-') end def remove_head_from_history(markdown) index = markdown =~ /^##\s+\d+\.\d+\.\d+/ markdown[index..-1] end def converted_history(markdown) remove_head_from_history( custom_release_header_anchors( liquid_escape( linkify( normalize_bullets(markdown))))) end ############################################################################# # # Standard tasks # ############################################################################# multitask :default => [:test, :features] task :spec => :test require 'rake/testtask' Rake::TestTask.new(:test) do |test| test.libs << 'lib' << 'test' test.pattern = 'test/**/test_*.rb' test.verbose = true end require 'rdoc/task' Rake::RDocTask.new do |rdoc| rdoc.rdoc_dir = 'rdoc' rdoc.title = "#{name} #{version}" rdoc.rdoc_files.include('README*') rdoc.rdoc_files.include('lib/**/*.rb') end begin require 'cucumber/rake/task' Cucumber::Rake::Task.new(:features) do |t| t.profile = "travis" end Cucumber::Rake::Task.new(:"features:html", "Run Cucumber features and produce HTML output") do |t| t.profile = "html_report" end rescue LoadError desc 'Cucumber rake task not available' task :features do abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin' end end desc "Open an irb session preloaded with this library" task :console do sh "irb -rubygems -r ./lib/#{name}.rb" end jekyll-3.1.6/benchmark/000077500000000000000000000000001271741406300147525ustar00rootroot00000000000000jekyll-3.1.6/benchmark/end-with-vs-regexp000066400000000000000000000012261271741406300203330ustar00rootroot00000000000000require '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?("/") } x.report('no slash [-1, 1]') { path_without_ending_slash[-1, 1] == "/" } 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?("/") } x.report('slash [-1, 1]') { path_with_ending_slash[-1, 1] == "/" } end jekyll-3.1.6/benchmark/file-dir-ensure-trailing-slash000066400000000000000000000024021271741406300226040ustar00rootroot00000000000000#!/usr/bin/env ruby require 'benchmark/ips' # For this pull request, which changes Page#dir # https://github.com/jekyll/jekyll/pull/4403 FORWARD_SLASH = '/'.freeze def pre_pr(url) url[-1, 1] == FORWARD_SLASH ? url : File.dirname(url) end def pr(url) if url.end_with?(FORWARD_SLASH) url else url_dir = File.dirname(url) url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/" end end def envygeeks(url) return url if url.end_with?(FORWARD_SLASH) || url == FORWARD_SLASH url = File.dirname(url) url == FORWARD_SLASH ? url : "#{url}/" end # Just a slash Benchmark.ips do |x| path = '/' x.report("pre_pr:#{path}") { pre_pr(path) } x.report("pr:#{path}") { pr(path) } x.report("envygeeks:#{path}") { pr(path) } x.compare! end # No trailing slash Benchmark.ips do |x| path = '/some/very/very/long/path/to/a/file/i/like' x.report("pre_pr:#{path}") { pre_pr(path) } x.report("pr:#{path}") { pr(path) } x.report("envygeeks:#{path}") { pr(path) } x.compare! end # No trailing slash Benchmark.ips do |x| path = '/some/very/very/long/path/to/a/file/i/like/' x.report("pre_pr:#{path}") { pre_pr(path) } x.report("pr:#{path}") { pr(path) } x.report("envygeeks:#{path}") { pr(path) } x.compare! end jekyll-3.1.6/benchmark/flat-map000066400000000000000000000007571271741406300164070ustar00rootroot00000000000000require '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 jekyll-3.1.6/benchmark/hash-fetch000066400000000000000000000004231271741406300167060ustar00rootroot00000000000000require '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 jekyll-3.1.6/benchmark/jekyll-sanitize-path000066400000000000000000000030371271741406300207500ustar00rootroot00000000000000#!/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 jekyll-3.1.6/benchmark/proc-call-vs-yield000066400000000000000000000003121271741406300202770ustar00rootroot00000000000000require '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 jekyll-3.1.6/benchmark/sequential-assignment000066400000000000000000000002561271741406300212200ustar00rootroot00000000000000require '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 jekyll-3.1.6/benchmark/string-concat000066400000000000000000000002171271741406300174500ustar00rootroot00000000000000require 'benchmark/ips' url = "http://jekyllrb.com" Benchmark.ips do |x| x.report('+=') { url += '/' } x.report('<<') { url << '/' } end jekyll-3.1.6/benchmark/string-replacement000066400000000000000000000005561271741406300205060ustar00rootroot00000000000000require '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 jekyll-3.1.6/benchmark/symbol-to-proc000066400000000000000000000002251271741406300175620ustar00rootroot00000000000000require '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 jekyll-3.1.6/bin/000077500000000000000000000000001271741406300135705ustar00rootroot00000000000000jekyll-3.1.6/bin/jekyll000077500000000000000000000033431271741406300150130ustar00rootroot00000000000000#!/usr/bin/env ruby STDOUT.sync = true $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w( .. lib )) require 'jekyll' require 'mercenary' Jekyll::PluginManager.require_from_bundler Jekyll::Deprecator.process(ARGV) Mercenary.program(:jekyll) do |p| p.version Jekyll::VERSION p.description 'Jekyll is a blog-aware, static site generator in Ruby' p.syntax 'jekyll [options]' 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_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::External.require_if_present(Jekyll::External.blessed_gems) do |g| cmd = g.split('-').last p.command(cmd.to_sym) do |c| c.syntax cmd c.action do Jekyll.logger.abort_with "You must install the '#{g}' gem to use the 'jekyll #{cmd}' command." end end end Jekyll::Command.subclasses.each { |c| c.init_with_program(p) } p.action do |args, _| if args.empty? Jekyll.logger.error "A subcommand is required." puts p abort else subcommand = args.first unless p.has_command? subcommand Jekyll.logger.abort_with "fatal: 'jekyll #{args.first}' could not" \ " be found. You may need to install the jekyll-#{args.first} gem" \ " or a related gem to be able to use this subcommand." end end end end jekyll-3.1.6/features/000077500000000000000000000000001271741406300146365ustar00rootroot00000000000000jekyll-3.1.6/features/collections.feature000066400000000000000000000202551271741406300205350ustar00rootroot00000000000000Feature: Collections As a hacker who likes to structure content I want to be able to create collections of similar information And render them Scenario: Unrendered collection Given I have an "index.html" page that contains "Collections: {{ site.methods }}" And I have fixture collections And I have a configuration file with "collections" set to "['methods']" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Collections:

Use Jekyll.configuration to build a full configuration for use w/Jekyll.

\n\n

Whatever: foo.bar

\n

Signs are nice

\n

Jekyll.sanitized_path is used to make sure your path is in your source.

\n

Run your generators! default

\n

Page without title.

\n

Run your generators! default

" 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: output => {{ site.collections[0].output }} label => {{ site.collections[0].label }}" 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: """ collections: methods: output: true foo: bar """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 "

Whatever: foo.bar

" in "_site/methods/configuration.html" Scenario: Rendered collection at a custom URL Given I have an "index.html" page that contains "Collections: {{ site.collections }}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: methods: output: true permalink: /:collection/:path/ """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "

Whatever: foo.bar

" in "_site/methods/configuration/index.html" Scenario: Rendered document in a layout Given I have an "index.html" page that contains "Collections: output => {{ site.collections[0].output }} label => {{ site.collections[0].label }} foo => {{ site.collections[0].foo }}" And I have a default layout that contains "
Tom Preston-Werner
{{content}}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: methods: output: true foo: bar """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 "foo => bar" in "_site/index.html" And I should see "

Run your generators! default

" in "_site/methods/site/generate.html" And I should see "
Tom Preston-Werner
" in "_site/methods/site/generate.html" Scenario: Collections specified as an array Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: - methods """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 %}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: - methods """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 %}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: - methods """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 }}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: - methods """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "First document's output:

Use Jekyll.configuration to build a full configuration for use w/Jekyll.

\n\n

Whatever: foo.bar

" 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 }}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: - methods """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 }}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: - methods """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "1. of 7:

Page without title.

" 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 %}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: - methods """ When I run jekyll build Then I should get a zero exit status Then the _site directory should exist And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, Initialize, Site#generate, YAML with Dots," in "_site/index.html" Scenario: Rendered collection with date/dateless filename Given I have an "index.html" page that contains "Collections: {% for method in site.thanksgiving %}{{ method.title }} {% endfor %}" And I have fixture collections And I have a "_config.yml" file with content: """ collections: thanksgiving: output: true """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Thanksgiving Black Friday" in "_site/index.html" And I should see "Happy Thanksgiving" in "_site/thanksgiving/2015-11-26-thanksgiving.html" And I should see "Black Friday" in "_site/thanksgiving/black-friday.html" jekyll-3.1.6/features/create_sites.feature000066400000000000000000000223621271741406300206720ustar00rootroot00000000000000Feature: Create sites As a hacker who likes to blog I want to be able to make a static site In order to share my awesome ideas with the interwebs Scenario: Blank site Given I do not have a "test_blank" directory When I run jekyll new test_blank --blank Then the test_blank/_layouts directory should exist And the test_blank/_posts directory should exist And the "test_blank/index.html" file should exist Scenario: Basic site Given I have an "index.html" file that contains "Basic Site" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Basic Site" in "_site/index.html" Scenario: Basic site with a post Given I have a _posts directory And I have the following post: | title | date | content | | Hackers | 2009-03-27 | My First Exploit | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "My First Exploit" in "_site/2009/03/27/hackers.html" Scenario: Basic site with layout and a page 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 Then I should get a zero exit status And the _site directory should exist And I should see "Page Layout: Basic Site with Layout" in "_site/index.html" Scenario: Basic site with layout and a post 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 Then I should get a zero exit status And the _site directory should exist And I should see "Post Layout:

The only winning move is not to play.

" in "_site/2009/03/27/wargames.html" Scenario: Basic site with layout inside a subfolder and a post 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 | post/simple | The only winning move is not to play. | And I have a post/simple layout that contains "Post Layout: {{ content }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post Layout:

The only winning move is not to play.

" in "_site/2009/03/27/wargames.html" Scenario: Basic site with layouts, pages, posts and files Given I have a _layouts directory And I have a page layout that contains "Page {{ page.title }}: {{ content }}" And I have a post layout that contains "Post {{ page.title }}: {{ content }}" And I have an "index.html" page with layout "page" that contains "Site contains {{ site.pages.size }} pages and {{ site.posts.size }} posts" And I have a blog directory And I have a "blog/index.html" page with layout "page" that contains "blog category index page" And I have an "about.html" file that contains "No replacement {{ site.posts.size }}" And I have an "another_file" file that contains "" And I have a _posts directory And I have the following posts: | title | date | layout | content | | entry1 | 2009-03-27 | post | content for entry1. | | entry2 | 2009-04-27 | post | content for entry2. | And I have a category/_posts directory And I have the following posts in "category": | title | date | layout | content | | entry3 | 2009-05-27 | post | content for entry3. | | entry4 | 2009-06-27 | post | content for entry4. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Page : Site contains 2 pages and 4 posts" in "_site/index.html" And I should see "No replacement \{\{ site.posts.size \}\}" in "_site/about.html" And I should see "" in "_site/another_file" And I should see "Page : blog category index page" in "_site/blog/index.html" And I should see "Post entry1:

content for entry1.

" in "_site/2009/03/27/entry1.html" And I should see "Post entry2:

content for entry2.

" in "_site/2009/04/27/entry2.html" And I should see "Post entry3:

content for entry3.

" in "_site/category/2009/05/27/entry3.html" And I should see "Post entry4:

content for entry4.

" in "_site/category/2009/06/27/entry4.html" Scenario: Basic site with include tag 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 Then I should get a zero exit status And the _site directory should exist And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html" Scenario: Basic site with subdir include tag Given I have a _includes directory And I have an "_includes/about.textile" file that contains "Generated by Jekyll" And I have an info directory And I have an "info/index.html" page that contains "Basic Site with subdir include tag: {% include about.textile %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Basic Site with subdir include tag: Generated by Jekyll" in "_site/info/index.html" Scenario: Basic site with nested include tag Given I have a _includes directory And I have an "_includes/about.textile" file that contains "Generated by {% include jekyll.textile %}" And I have an "_includes/jekyll.textile" file that contains "Jekyll" And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 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 | 2008-01-01 | post | content for entry2. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "SomeDirective" in "_site/.htaccess" Scenario: File was replaced by a directory Given I have a "test" file that contains "some stuff" When I run jekyll build Then I should get a zero exit status And the _site directory should exist When I delete the file "test" Given I have a test directory And I have a "test/index.html" file that contains "some other stuff" When I run jekyll build Then the _site/test directory should exist And I should see "some other stuff" in "_site/test/index.html" Scenario: Basic site with unpublished page Given I have an "index.html" page with title "index" that contains "Published page" And I have a "public.html" page with published "true" that contains "Explicitly published page" And I have a "secret.html" page with published "false" that contains "Unpublished page" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And the "_site/index.html" file should exist And the "_site/public.html" file should exist But the "_site/secret.html" file should not exist When I run jekyll build --unpublished Then I should get a zero exit status And the _site directory should exist 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 I should get a zero exit status And 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 I should get a zero exit status And the _site directory should exist And the "_site/2020/12/31/entry1.html" file should exist jekyll-3.1.6/features/data.feature000066400000000000000000000105121271741406300171230ustar00rootroot00000000000000Feature: Data In order to use well-formatted data in my blog As a blog's user I want to use _data directory in my site Scenario: autoload *.yaml files in _data directory Given I have a _data directory And I have a "_data/products.yaml" file with content: """ - name: sugar price: 5.3 - name: salt price: 2.5 """ And I have an "index.html" page that contains "{% for product in site.data.products %}{{product.name}}{% endfor %}" When I run jekyll build Then the "_site/index.html" file should exist And I should see "sugar" in "_site/index.html" And I should see "salt" in "_site/index.html" Scenario: autoload *.yml files in _data directory Given I have a _data directory And I have a "_data/members.yml" file with content: """ - name: Jack age: 28 - name: Leon age: 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 *.json files in _data directory Given I have a _data directory And I have a "_data/members.json" file with content: """ [{"name": "Jack", "age": 28},{"name": "Leon", "age": 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 *.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: """ - name: Jack age: 28 - name: Leon age: 34 """ And I have an "index.html" page that contains "{% for member in site.data.team_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 *.yaml files in subdirectories in _data directory Given I have a _data directory And I have a _data/categories directory And I have a "_data/categories/dairy.yaml" file with content: """ name: Dairy Products """ And I have an "index.html" page that contains "{{ site.data.categories.dairy.name }}" When I run jekyll build Then the "_site/index.html" file should exist And I should see "Dairy Products" in "_site/index.html" Scenario: folders should have precedence over files with the same name Given I have a _data directory And I have a _data/categories directory And I have a "_data/categories/dairy.yaml" file with content: """ name: Dairy Products """ And I have a "_data/categories.yaml" file with content: """ dairy: name: Should not display this """ And I have an "index.html" page that contains "{{ site.data.categories.dairy.name }}" When I run jekyll build Then the "_site/index.html" file should exist And I should see "Dairy Products" in "_site/index.html" Scenario: should be backward compatible with site.data in _config.yml Given I have a "_config.yml" file with content: """ data: - name: Jack age: 28 - name: Leon age: 34 """ And I have an "index.html" page that contains "{% for member in site.data %}{{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" jekyll-3.1.6/features/drafts.feature000066400000000000000000000042601271741406300175000ustar00rootroot00000000000000Feature: Draft Posts As a hacker who likes to blog I want to be able to preview drafts locally In order to see if they look alright before publishing Scenario: Preview a draft Given I have a configuration file with "permalink" set to "none" And I have a _drafts directory And I have the following draft: | title | date | layout | content | | Recipe | 2009-03-27 | default | Not baked yet. | When I run jekyll build --drafts Then I should get a zero exit status And the _site directory should exist And I should see "Not baked yet." in "_site/recipe.html" Scenario: Don't preview a draft Given I have a configuration file with "permalink" set to "none" And I have an "index.html" page that contains "Totally index" And I have a _drafts directory And I have the following draft: | title | date | layout | content | | Recipe | 2009-03-27 | default | Not baked yet. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And the "_site/recipe.html" file should not exist Scenario: Don't preview a draft that is not published Given I have a configuration file with "permalink" set to "none" And I have an "index.html" page that contains "Totally index" And I have a _drafts directory And I have the following draft: | title | date | layout | published | content | | Recipe | 2009-03-27 | default | false | Not baked yet. | When I run jekyll build --drafts Then I should get a zero exit status And the _site directory should exist And the "_site/recipe.html" file should not exist Scenario: Use page.path variable Given I have a configuration file with "permalink" set to "none" And I have a _drafts directory And I have the following draft: | title | date | layout | content | | Recipe | 2009-03-27 | simple | Post path: {{ page.path }} | When I run jekyll build --drafts Then I should get a zero exit status And the _site directory should exist And I should see "Post path: _drafts/recipe.markdown" in "_site/recipe.html" jekyll-3.1.6/features/embed_filters.feature000066400000000000000000000124011271741406300210150ustar00rootroot00000000000000Feature: Embed filters As a hacker who likes to blog I want to be able to transform text inside a post or page In order to perform cool stuff in my posts Scenario: Convert date to XML schema 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 "{{ site.time | date_to_xmlschema }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see today's date in "_site/2009/03/27/star-wars.html" Scenario: Escape text for XML 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 "{{ page.title | xml_escape }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Star & Wars" in "_site/2009/03/27/star-wars.html" Scenario: Calculate number of words 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 "{{ content | number_of_words }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "7" in "_site/2009/03/27/star-wars.html" Scenario: Convert an array into a sentence Given I have a _posts directory And I have a _layouts directory And I have the following post: | title | date | layout | tags | content | | Star Wars | 2009-03-27 | default | [scifi, movies, force] | These aren't the droids you're looking for. | And I have a default layout that contains "{{ page.tags | array_to_sentence_string }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html" 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_' | markdownify }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "By

Obi-wan

" in "_site/2009/03/27/star-wars.html" Scenario: Sort by an arbitrary variable Given I have a _layouts directory And I have the following page: | title | layout | value | content | | Page-1 | default | 8 | Something | And I have the following page: | title | layout | value | content | | Page-2 | default | 6 | Something | And I have a default layout that contains "{{ site.pages | sort:'value' | map:'title' | join:', ' }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see exactly "Page-2, Page-1" in "_site/page-1.html" And I should see exactly "Page-2, Page-1" in "_site/page-2.html" Scenario: Sort pages by the title Given I have a _layouts directory And I have the following pages: | title | layout | content | | Dog | default | Run | | Bird | default | Fly | And I have the following page: | layout | content | | default | Jump | And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see exactly "The rule of 3: Jump, Fly, Run," in "_site/bird.html" Scenario: Sort pages by the title ordering pages without title last Given I have a _layouts directory And I have the following pages: | title | layout | content | | Dog | default | Run | | Bird | default | Fly | And I have the following page: | layout | content | | default | Jump | And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title', 'last' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see exactly "The rule of 3: Fly, Run, Jump," in "_site/bird.html" jekyll-3.1.6/features/frontmatter_defaults.feature000066400000000000000000000225501271741406300224530ustar00rootroot00000000000000Feature: frontmatter defaults Scenario: Use default for frontmatter variables internally Given I have a _layouts directory And I have a pretty layout that contains "THIS IS THE LAYOUT: {{content}}" And I have a _posts directory And I have the following post: | title | date | content | | default layout | 2013-09-11 | just some post | And I have an "index.html" page with title "some title" that contains "just some page" And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {layout: "pretty"}}]" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "THIS IS THE LAYOUT:

just some post

" in "_site/2013/09/11/default-layout.html" And I should see "THIS IS THE LAYOUT: just some page" in "_site/index.html" Scenario: Use default for frontmatter variables in Liquid Given I have a _posts directory And I have the following post: | title | date | content | | default data | 2013-09-11 |

{{page.custom}}

{{page.author}}
| And I have an "index.html" page that contains "just {{page.custom}} by {{page.author}}" 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 I should get a zero exit status And the _site directory should exist And I should see "

some special data

\n
Ben
" 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 Given I have a _layouts directory And I have a root layout that contains "root: {{ content }}" And I have a subfolder layout that contains "subfolder: {{ content }}" And I have a _posts directory And I have the following post: | title | date | content | | about | 2013-10-14 | info on {{page.description}} | And I have a special/_posts directory And I have the following post in "special": | title | date | path | content | | about | 2013-10-14 | local | info on {{page.description}} | And I have an "index.html" page with title "overview" that contains "Overview for {{page.description}}" And I have an "special/index.html" page with title "section overview" that contains "Overview for {{page.description}}" And I have a configuration file with "defaults" set to "[{scope: {path: "special"}, values: {layout: "subfolder", description: "the special section"}}, {scope: {path: ""}, values: {layout: "root", description: "the webpage"}}]" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "root:

info on the webpage

" in "_site/2013/10/14/about.html" And I should see "subfolder:

info on the special section

" in "_site/special/2013/10/14/about.html" 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 I should get a zero exit status And the _site directory should exist And I should see "main:

content of site/2013/10/14/about.html

" in "_site/2013/10/14/about.html" And I should see "main:

content of site/special/2013/10/14/about1.html

" in "_site/special/2013/10/14/about1.html" And I should see "main:

content of site/special/2013/10/14/about2.html

" in "_site/special/2013/10/14/about2.html" Scenario: Use frontmatter scopes for subdirectories Given I have a _layouts directory And I have a main layout that contains "main: {{ content }}" And I have a _posts/en directory And I have the following post under "en": | title | date | content | | helloworld | 2014-09-01 | {{page.lang}} is the current language | And I have a _posts/de directory And I have the following post under "de": | title | date | content | | hallowelt | 2014-09-01 | {{page.lang}} is the current language | And I have a configuration file with "defaults" set to "[{scope: {path: "_posts/en"}, values: {layout: "main", lang: "en"}}, {scope: {path: "_posts/de"}, values: {layout: "main", lang: "de"}}]" When I run jekyll build Then the _site directory should exist And I should see "main:

en is the current language

" in "_site/2014/09/01/helloworld.html" And I should see "main:

de is the current language

" in "_site/2014/09/01/hallowelt.html" Scenario: Override frontmatter defaults by type Given I have a _posts directory And I have the following post: | title | date | content | | this is a post | 2013-10-14 | blabla | And I have an "index.html" page that contains "interesting stuff" And I have a configuration file with "defaults" set to "[{scope: {path: "", type: "post"}, values: {permalink: "/post.html"}}, {scope: {path: "", type: "page"}, values: {permalink: "/page.html"}}, {scope: {path: ""}, values: {permalink: "/perma.html"}}]" When I run jekyll build Then I should see "blabla" in "_site/post.html" And I should see "interesting stuff" in "_site/page.html" But the "_site/perma.html" file should not exist Scenario: Actual frontmatter overrides defaults Given I have a _posts directory And I have the following post: | title | date | permalink | author | content | | override | 2013-10-14 | /frontmatter.html | some guy | a blog by {{page.author}} | And I have an "index.html" page with permalink "override.html" that contains "nothing" And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {permalink: "/perma.html", author: "Chris"}}]" When I run jekyll build Then I should see "a blog by some guy" in "_site/frontmatter.html" 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: """ --- --- Value: {{ page.myval }} """ And I have a "_config.yml" file with content: """ collections: slides: output: true defaults: - scope: path: "" type: slides values: myval: "Test" """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Value: Test" in "_site/slides/slide1.html" 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: """ --- myval: Override --- Value: {{ page.myval }} """ And I have a "_config.yml" file with content: """ collections: slides: output: true defaults: - scope: path: "" type: slides values: myval: "Test" """ When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Value: Override" in "_site/slides/slide2.html" Scenario: Deep merge frontmatter defaults Given I have an "index.html" page with fruit "{orange: 1}" that contains "Fruits: {{ page.fruit.orange | plus: page.fruit.apple }}" And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {fruit: {apple: 2}}}]" When I run jekyll build Then I should see "Fruits: 3" in "_site/index.html" jekyll-3.1.6/features/hooks.feature000066400000000000000000000274011271741406300173420ustar00rootroot00000000000000Feature: 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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['page']['myparam'] = 'special' if page.name == 'page1.html' end """ And I have a "page1.html" page that contains "{{ page.myparam }}" And I have a "page2.html" page that contains "{{ page.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 I should get a zero exit status And 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 "{{{{{

entry one

}}}}}" 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 I should get a zero exit status And 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! /

/, '

' 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 I should get a zero exit status And the _site directory should exist And I should see "

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 I should get a zero exit status And the _site directory should exist And I should see "Wrote document 0" in "_site/document-build.log" jekyll-3.1.6/features/include_tag.feature000066400000000000000000000157771271741406300205120ustar00rootroot00000000000000Feature: Include tags In order to share their content across several pages As a hacker who likes to blog I want to be able to include files in my blog posts Scenario: Include a file with parameters Given I have an _includes directory And I have an "_includes/header.html" file that contains "

My awesome blog header: {{include.param}}
" And I have an "_includes/params.html" file that contains "Parameters:" And I have an "_includes/ignore.html" file that contains "" And I have a _posts directory 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 I should get a zero exit status And the _site directory should exist And I should see "
My awesome blog header: myparam
" in "_site/2013/03/21/include-files.html" And I should not see "myparam" in "_site/2013/03/21/ignore-params-if-unused.html" And I should see "
  • date = today
  • " in "_site/2013/03/21/list-multiple-parameters.html" And I should see "
  • start = tomorrow
  • " in "_site/2013/03/21/list-multiple-parameters.html" And I should not see "
    My awesome blog header: myparam
    " in "_site/2013/03/21/dont-keep-parameters.html" But I should see "
    My awesome blog header:
    " in "_site/2013/03/21/dont-keep-parameters.html" And I should see "
  • cool = param with spaces
  • " in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" And I should see "
  • super = \"quoted\"
  • " in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" And I should see "
  • single = has \"quotes\"
  • " in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" And I should see "
  • escaped = 'single' quotes
  • " in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" And I should see "
  • param1_or_2 = value
  • " in "_site/2013/04/12/parameter-syntax.html" And I should see "
  • local = some text
  • " in "_site/2013/06/22/pass-a-variable.html" And I should see "
  • title = Pass a variable
  • " in "_site/2013/06/22/pass-a-variable.html" Scenario: Include a file from a variable Given I have an _includes directory And I have an "_includes/snippet.html" file that contains "a snippet" And I have an "_includes/parametrized.html" file that contains "works with {{include.what}}" And I have a configuration file with: | key | value | | include_file1 | snippet.html | | include_file2 | parametrized.html | And I have an "index.html" page that contains "{% include {{site.include_file1}} %} that {% include {{site.include_file2}} what='parameters' %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "a snippet that works with parameters" in "_site/index.html" Scenario: Include a variable file in a loop Given I have an _includes directory And I have an "_includes/one.html" file that contains "one" And I have an "_includes/two.html" file that contains "two" And I have an "index.html" page with files "[one.html, two.html]" that contains "{% for file in page.files %}{% include {{file}} %} {% endfor %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "one two" in "_site/index.html" Scenario: Include a file with variables and filters 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 | append: '.html' }} %}" When I run jekyll build Then I should get a zero exit status And 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 I should get a zero exit status And the _site directory should exist And I should see "one included" in "_site/index.html" Scenario: Include a file and rebuild when include content is changed Given I have an _includes directory And I have an "_includes/one.html" file that contains "include" And I have an "index.html" page that contains "{% include one.html %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "include" in "_site/index.html" When I wait 1 second Then I have an "_includes/one.html" file that contains "include content changed" When I run jekyll build Then I should see "include content changed" in "_site/index.html" Scenario: Include a file with multiple variables Given I have an _includes directory And I have an "_includes/header-en.html" file that contains "include" And I have an "index.html" page that contains "{% assign name = 'header' %}{% assign locale = 'en' %}{% include {{name}}-{{locale}}.html %}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "include" in "_site/index.html" jekyll-3.1.6/features/incremental_rebuild.feature000066400000000000000000000063341271741406300222300ustar00rootroot00000000000000Feature: 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 I should get a zero exit status And the _site directory should exist And I should see "Post Layout:

    The only winning move is not to play.

    " in "_site/2009/03/27/wargames.html" When I run jekyll build -I Then I should get a zero exit status And the _site directory should exist And I should see "Post Layout:

    The only winning move is not to play.

    " 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And the _site directory should exist And I should see "Basic Site with include tag: Regenerated by Jekyll" in "_site/index.html" jekyll-3.1.6/features/layout_data.feature000066400000000000000000000044351271741406300205270ustar00rootroot00000000000000Feature: Layout data As a hacker who likes to avoid repetition I want to be able to embed data into my layouts In order to make the layouts slightly dynamic Scenario: Use custom layout data Given I have a _layouts directory And I have a "_layouts/custom.html" file with content: """ --- foo: my custom data --- {{ content }} foo: {{ layout.foo }} """ And I have an "index.html" page with layout "custom" that contains "page content" When I run jekyll build Then the "_site/index.html" file should exist And I should see "page content\n foo: my custom data" in "_site/index.html" Scenario: Inherit custom layout data Given I have a _layouts directory And I have a "_layouts/custom.html" file with content: """ --- layout: base foo: my custom data --- {{ content }} """ And I have a "_layouts/base.html" file with content: """ {{ content }} foo: {{ layout.foo }} """ And I have an "index.html" page with layout "custom" that contains "page content" When I run jekyll build Then the "_site/index.html" file should exist And I should see "page content\n foo: my custom data" in "_site/index.html" Scenario: Inherit custom layout data and clear when not present Given I have a _layouts directory And I have a "_layouts/default.html" file with content: """ --- bar: i'm default --- {{ content }} foo: '{{ layout.foo }}' bar: '{{ layout.bar }}' """ And I have a "_layouts/special.html" file with content: """ --- layout: default foo: my special data bar: im special --- {{ content }} """ And I have a "_layouts/page.html" file with content: """ --- layout: default bar: im page --- {{ content }} """ And I have an "index.html" page with layout "special" that contains "page content" And I have an "jekyll.html" page with layout "page" that contains "page content" When I run jekyll build Then the "_site/index.html" file should exist And I should see "page content\n foo: 'my special data' bar: 'im special'" in "_site/index.html" And I should see "page content\n foo: '' bar: 'im page'" in "_site/jekyll.html" jekyll-3.1.6/features/markdown.feature000066400000000000000000000031431271741406300200360ustar00rootroot00000000000000Feature: Markdown As a hacker who likes to blog I want to be able to make a static site In order to share my awesome ideas with the interwebs Scenario: Markdown in list on index Given I have a configuration file with "paginate" set to "5" And I have an "index.html" page that contains "Index - {% for post in site.posts %} {{ post.content }} {% endfor %}" And I have a _posts directory And I have the following post: | title | date | content | type | | Hackers | 2009-03-27 | # My Title | markdown | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Index" in "_site/index.html" And I should see "

    My Title

    " in "_site/2009/03/27/hackers.html" And I should see "

    My Title

    " in "_site/index.html" Scenario: Markdown in pagination on index 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: | title | date | content | type | | Hackers | 2009-03-27 | # My Title | markdown | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Index" in "_site/index.html" And I should see "

    My Title

    " in "_site/index.html" jekyll-3.1.6/features/pagination.feature000066400000000000000000000104451271741406300203500ustar00rootroot00000000000000Feature: Site pagination In order to paginate my blog As a blog's user I want divide the posts in several pages Scenario Outline: Paginate with N posts per page Given I have a configuration file with: | key | value | | paginate | | | 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 And I have the following posts: | title | date | layout | content | | Wargames | 2009-03-27 | default | The only winning move is not to play. | | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. | | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. | | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. | When I run jekyll build Then the _site/page directory should exist And the "_site/page/index.html" file should exist And I should see "" in "_site/page/index.html" And the "_site/page/index.html" file should not exist Examples: | num | exist | posts | not_exist | | 1 | 4 | 1 | 5 | | 2 | 2 | 2 | 3 | | 3 | 2 | 1 | 3 | Scenario Outline: Setting a custom pagination path Given I have a configuration file with: | key | value | | 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 And I have the following posts: | title | date | layout | content | | Wargames | 2009-03-27 | default | The only winning move is not to play. | | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. | | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. | | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. | When I run jekyll build Then the _site/blog/page- directory should exist And the "_site/blog/page-/index.html" file should exist And I should see "" in "_site/blog/page-/index.html" And the "_site/blog/page-/index.html" file should not exist Examples: | exist | posts | not_exist | | 2 | 1 | 5 | | 3 | 1 | 6 | | 4 | 1 | 7 | Scenario Outline: Setting a custom pagination path without an index.html in it Given I have a configuration file with: | key | value | | 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!" 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. | | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. | | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. | | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. | When I run jekyll build Then the _site/blog/page/ directory should exist And the "_site/blog/page//index.html" file should exist And I should see "" in "_site/blog/page//index.html" And the "_site/blog/page//index.html" file should not exist Examples: | exist | posts | not_exist | | 2 | 1 | 5 | | 3 | 1 | 6 | | 4 | 1 | 7 | jekyll-3.1.6/features/permalinks.feature000066400000000000000000000157701271741406300203720ustar00rootroot00000000000000Feature: Fancy permalinks As a hacker who likes to blog I want to be able to set permalinks In order to make my blog URLs awesome Scenario: Use none permalink schema Given I have a _posts directory And I have the following post: | title | date | content | | None Permalink Schema | 2009-03-27 | Totally nothing. | And I have a configuration file with "permalink" set to "none" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Totally nothing." in "_site/none-permalink-schema.html" Scenario: Use pretty permalink schema Given I have a _posts directory And I have the following post: | title | date | content | | Pretty Permalink Schema | 2009-03-27 | Totally wordpress. | And I have a configuration file with "permalink" set to "pretty" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Totally wordpress." in "_site/2009/03/27/pretty-permalink-schema/index.html" Scenario: Use pretty permalink schema for pages Given I have an "index.html" page that contains "Totally index" And I have an "awesome.html" page that contains "Totally awesome" And I have an "sitemap.xml" page that contains "Totally uhm, sitemap" And I have a configuration file with "permalink" set to "pretty" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Totally index" in "_site/index.html" And I should see "Totally awesome" in "_site/awesome/index.html" And I should see "Totally uhm, sitemap" in "_site/sitemap.xml" Scenario: Use custom permalink schema with prefix Given I have a _posts directory 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/" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html" Scenario: Use custom permalink schema with category Given I have a _posts directory 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 "/:categories/:title.html" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Totally custom." in "_site/stuff/custom-permalink-schema.html" Scenario: Use custom permalink schema with squished date Given I have a _posts directory 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 "/:month-:day-:year/:title.html" When I run jekyll build Then I should get a zero exit status And 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 I should get a zero exit status And 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 | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And the _site/custom/posts/1 directory should exist And I should see "bla bla" in "_site/custom/posts/1/index.html" Scenario: Use per-post ending in .html Given I have a _posts directory And I have the following post: | title | date | permalink | content | | Some post | 2013-04-14 | /custom/posts/some.html | bla bla | When I run jekyll build Then I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And the _site directory should exist And I should see "Totally awesome" in "_site/2009/03/27/Custom_Schema/index.html" Scenario: Use a non-HTML file extension in the permalink Given I have a _posts directory And I have an "_posts/2016-01-18-i-am-php.md" page with permalink "/2016/i-am-php.php" that contains "I am PHP" And I have a "i-am-also-php.md" page with permalink "/i-am-also-php.php" that contains "I am also PHP" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "I am PHP" in "_site/2016/i-am-php.php" And I should see "I am also PHP" in "_site/i-am-also-php.php" jekyll-3.1.6/features/plugins.feature000066400000000000000000000032471271741406300177020ustar00rootroot00000000000000Feature: 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 I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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" jekyll-3.1.6/features/post_data.feature000066400000000000000000000411461271741406300201770ustar00rootroot00000000000000Feature: Post data As a hacker who likes to blog I want to be able to embed data into my posts In order to make the posts slightly dynamic Scenario: Use post.title variable 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 | simple | Luke, I am your father. | And I have a simple layout that contains "Post title: {{ page.title }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post title: Star Wars" in "_site/2009/03/27/star-wars.html" Scenario: Use post.url variable 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 | simple | Luke, I am your father. | And I have a simple layout that contains "Post url: {{ page.url }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post url: /2009/03/27/star-wars.html" in "_site/2009/03/27/star-wars.html" Scenario: Use post.date variable 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 | simple | Luke, I am your father. | And I have a simple layout that contains "Post date: {{ page.date | date_to_string }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post date: 27 Mar 2009" in "_site/2009/03/27/star-wars.html" Scenario: Use post.date variable with invalid Given I have a _posts directory And I have a "_posts/2016-01-01-test.md" page with date "tuesday" that contains "I have a bad date." When I run jekyll build Then the _site directory should not exist And I should see "Document '_posts/2016-01-01-test.md' does not have a valid date in the YAML front matter." in the build output Scenario: Invalid date in filename Given I have a _posts directory And I have a "_posts/2016-22-01-test.md" page that contains "I have a bad date." When I run jekyll build Then the _site directory should not exist And I should see "Document '_posts/2016-22-01-test.md' does not have a valid date in the filename." in the build output Scenario: Use post.id variable 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 | simple | Luke, I am your father. | And I have a simple layout that contains "Post id: {{ page.id }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post id: /2009/03/27/star-wars" in "_site/2009/03/27/star-wars.html" Scenario: Use post.content variable 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 | simple | Luke, I am your father. | And I have a simple layout that contains "Post content: {{ content }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post content:

    Luke, I am your father.

    " in "_site/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in a folder Given I have a movies directory And I have a movies/_posts directory And I have a _layouts directory And I have the following post in "movies": | title | date | layout | content | | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then I should get a zero exit status And 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 category is in a folder and has category in YAML Given I have a movies directory And I have a movies/_posts directory And I have a _layouts directory And I have the following post in "movies": | title | date | layout | category | content | | Star Wars | 2009-03-27 | simple | film | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post category: movies" in "_site/movies/film/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in a folder and has categories in YAML Given I have a movies directory And I have a movies/_posts directory And I have a _layouts directory And I have the following post in "movies": | title | date | layout | categories | content | | Star Wars | 2009-03-27 | simple | [film, scifi] | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post category: movies" in "_site/movies/film/scifi/2009/03/27/star-wars.html" Scenario: Use post.categories variable when category is in a folder and duplicated category is in YAML Given I have a movies directory And I have a movies/_posts directory And I have a _layouts directory And I have the following post in "movies": | title | date | layout | category | content | | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" Scenario: Use post.tags variable Given I have a _posts directory And I have a _layouts directory And I have the following post: | title | date | layout | tag | content | | Star Wars | 2009-05-18 | simple | twist | Luke, I am your father. | And I have a simple layout that contains "Post tags: {{ page.tags }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post tags: twist" in "_site/2009/05/18/star-wars.html" Scenario: Use post.categories variable when categories are in folders Given I have a scifi directory And I have a scifi/movies directory And I have a scifi/movies/_posts directory And I have a _layouts directory And I have the following post in "scifi/movies": | title | date | layout | content | | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 categories are in folders with mixed case Given I have a scifi directory And I have a scifi/Movies directory And I have a scifi/Movies/_posts directory And I have a _layouts directory And I have the following post in "scifi/Movies": | title | date | layout | content | | Star Wars | 2009-03-27 | simple | Luke, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 And I have a _layouts directory And I have the following post: | title | date | layout | category | content | | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then I should get a zero exit status And 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 category is in YAML and is mixed-case Given I have a _posts directory And I have a _layouts directory And I have the following post: | title | date | layout | category | content | | Star Wars | 2009-03-27 | simple | Movies | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then I should get a zero exit status And 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 Given I have a _posts directory And I have a _layouts directory And I have the following post: | title | date | layout | categories | content | | Star Wars | 2009-03-27 | simple | ['scifi', 'movies'] | Luke, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist 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 categories are in YAML and are duplicated Given I have a _posts directory And I have a _layouts directory And I have the following post: | title | date | layout | categories | content | | Star Wars | 2009-03-27 | simple | ['movies', 'movies'] | Luke, I am your father. | And I have a simple layout that contains "Post category: {{ page.categories }}" When I run jekyll build Then I should get a zero exit status And 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 I should get a zero exit status And 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 I should get a zero exit status And 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 And I have the following posts: | title | date | layout | categories | content | | Star Wars | 2009-03-27 | simple | ['scifi', 'Movies'] | Luke, I am your father. | | Star Trek | 2013-03-17 | simple | ['SciFi', 'movies'] | Jean Luc, I am your father. | And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" When I run jekyll build Then I should get a zero exit status And 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" Scenario Outline: Use page.path variable Given I have a /_posts directory And I have the following post in "": | title | type | date | content | | my-post | html | 2013-04-12 | Source path: {{ page.path }} | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Source path: _posts/2013-04-12-my-post.html" in "_site//2013/04/12/my-post.html" Examples: | dir | path_prefix | | . | | | dir | dir/ | | dir/nested | dir/nested/ | Scenario: Cannot override page.path variable Given I have a _posts directory And I have the following post: | title | date | path | content | | override | 2013-04-12 | override-path.html | Non-custom path: {{ page.path }} | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Non-custom path: _posts/2013-04-12-override.markdown" in "_site/2013/04/12/override.html" Scenario: Disable a post from being published Given I have a _posts directory And I have an "index.html" file that contains "Published!" And I have the following post: | title | date | layout | published | content | | Star Wars | 2009-03-27 | simple | false | Luke, I am your father. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And the "_site/2009/03/27/star-wars.html" file should not exist And I should see "Published!" in "_site/index.html" Scenario: Use a custom variable Given I have a _posts directory And I have a _layouts directory And I have the following post: | title | date | layout | author | content | | Star Wars | 2009-03-27 | simple | Darth Vader | Luke, I am your father. | And I have a simple layout that contains "Post author: {{ page.author }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Post author: Darth Vader" in "_site/2009/03/27/star-wars.html" Scenario: Use a variable which is a reserved keyword in Ruby Given I have a _posts directory And I have a _layouts directory And I have the following post: | title | date | layout | class | content | | My post | 2016-01-21 | simple | kewl-post | Luke, I am your father. | And I have a simple layout that contains "{{page.title}} has class {{page.class}}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "My post has class kewl-post" in "_site/2016/01/21/my-post.html" Scenario: Previous and next posts title Given I have a _posts directory And I have a _layouts directory And I have the following posts: | title | date | layout | author | content | | Star Wars | 2009-03-27 | ordered | Darth Vader | Luke, I am your father. | | Some like it hot | 2009-04-27 | ordered | Osgood | Nobody is perfect. | | Terminator | 2009-05-27 | ordered | Arnold | Sayonara, baby | And I have a ordered layout that contains "Previous post: {{ page.previous.title }} and next post: {{ page.next.title }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "next post: Some like it hot" in "_site/2009/03/27/star-wars.html" And I should see "Previous post: Some like it hot" in "_site/2009/05/27/terminator.html" jekyll-3.1.6/features/post_excerpts.feature000066400000000000000000000052641271741406300211240ustar00rootroot00000000000000Feature: Post excerpts As a hacker who likes to blog I want to be able to make a static site In order to share my awesome ideas with the interwebs But some people can only focus for a few moments So just give them a taste Scenario: An excerpt without a layout Given I have an "index.html" page that contains "{% for post in site.posts %}{{ post.excerpt }}{% endfor %}" And I have a _posts directory And I have the following posts: | title | date | layout | content | | entry1 | 2007-12-31 | post | content for entry1. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see exactly "

    content for entry1.

    " in "_site/index.html" Scenario: An excerpt from a post with a layout Given I have an "index.html" page that contains "{% for post in site.posts %}{{ post.excerpt }}{% endfor %}" And I have a _posts directory And I have a _layouts directory And I have a post layout that contains "{{ page.excerpt }}" And I have the following posts: | title | date | layout | content | | entry1 | 2007-12-31 | post | content for entry1. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And the _site/2007 directory should exist 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 "

    content for entry1.

    " in "_site/2007/12/31/entry1.html" And I should see exactly "

    content for entry1.

    " in "_site/index.html" Scenario: An excerpt from a post with a layout which has context Given I have an "index.html" page that contains "{% for post in site.posts %}{{ post.excerpt }}{% endfor %}" And I have a _posts directory And I have a _layouts directory And I have a post layout that contains "{{ page.excerpt }}" And I have the following posts: | title | date | layout | content | | entry1 | 2007-12-31 | post | content for entry1. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And the _site/2007 directory should exist 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 "

    content for entry1.

    " in "_site/index.html" And I should see "

    content for entry1.

    \n" in "_site/2007/12/31/entry1.html" jekyll-3.1.6/features/rendering.feature000066400000000000000000000053541271741406300201770ustar00rootroot00000000000000Feature: Rendering As a hacker who likes to blog I want to be able to make a static site In order to share my awesome ideas with the interwebs 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!" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Hi there, Jekyll development!\nAhoy, indeed" in "_site/index.html" 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 I should get a zero exit status And 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: 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 I should get a zero exit status And 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 I should get a zero exit status And the _site directory should exist And the "_site/index.js" file should not exist 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 I should get a zero exit status And the _site directory should exist And I should see "hey = 'for cicada';" in "_site/index.js" jekyll-3.1.6/features/site_configuration.feature000066400000000000000000000320711271741406300221110ustar00rootroot00000000000000Feature: Site configuration As a hacker who likes to blog I want to be able to configure jekyll In order to make setting up a site easier Scenario: Change source directory Given I have a blank site in "_sourcedir" And I have an "_sourcedir/index.html" file that contains "Changing source directory" And I have a configuration file with "source" set to "_sourcedir" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Changing source directory" in "_site/index.html" Scenario: Change destination directory Given I have an "index.html" file that contains "Changing destination directory" And I have a configuration file with "destination" set to "_mysite" When I run jekyll build Then the _mysite directory should exist And I should see "Changing destination directory" in "_mysite/index.html" Scenario Outline: Similarly named source and destination Given I have a blank site in "" And I have an "/index.md" page that contains "markdown" And I have a configuration file with: | key | value | | source | | | destination | | When I run jekyll build Then the directory should exist And the "/index.html" file should exist And I should see "markdown" in "/index.md" Examples: | source | dest | file_exist | | mysite_source | mysite | | | mysite | mysite_dest | | | mysite/ | mysite | not | | mysite | ./mysite | not | | mysite/source | mysite | not | | mysite | mysite/dest | | Scenario: Exclude files inline Given I have an "Rakefile" file that contains "I want to be excluded" And I have an "README" file that contains "I want to be excluded" And I have an "index.html" file that contains "I want to be included" And I have a configuration file with "exclude" set to "['Rakefile', 'README']" When I run jekyll build Then I should see "I want to be included" in "_site/index.html" And the "_site/Rakefile" file should not exist And the "_site/README" file should not exist Scenario: Exclude files with YAML array Given I have an "Rakefile" file that contains "I want to be excluded" And I have an "README" file that contains "I want to be excluded" And I have an "index.html" file that contains "I want to be included" And I have a configuration file with "exclude" set to: | value | | README | | Rakefile | When I run jekyll build Then I should see "I want to be included" in "_site/index.html" And the "_site/Rakefile" file should not exist And the "_site/README" file should not exist Scenario: Use RDiscount 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 "rdiscount" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Google" in "_site/index.html" Scenario: Use Kramdown 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 "kramdown" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Google" in "_site/index.html" Scenario: Use Redcarpet 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 "redcarpet" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Google" 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 Then I should get a zero exit status And the _site directory should exist And I should see "Hello world!" in "_site/index.html" And I should see "class=\"highlight\"" in "_site/index.html" Scenario: Highlight code with rouge Given I have an "index.html" page that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}" And I have a configuration file with "highlighter" set to "rouge" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Hello world!" in "_site/index.html" And I should see "class=\"highlight\"" in "_site/index.html" Scenario: Rouge renders code block once Given I have a configuration file with "highlighter" set to "rouge" And I have a _posts directory And I have the following post: | title | date | layout | content | | foo | 2014-04-27 11:34 | default | {% highlight text %} test {% endhighlight %} | When I run jekyll build Then I should not see "highlight(.*)highlight" in "_site/2014/04/27/foo.html" Scenario: Set time and no future dated posts Given I have a _layouts directory And I have a page layout that contains "Page Layout: {{ site.posts.size }} on {{ site.time | date: "%Y-%m-%d" }}" And I have a post layout that contains "Post Layout: {{ content }}" And I have an "index.html" page with layout "page" that contains "site index page" And I have a configuration file with: | key | value | | time | 2010-01-01 | | future | false | 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. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Page Layout: 1 on 2010-01-01" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    " in "_site/2007/12/31/entry1.html" And the "_site/2020/01/31/entry2.html" file should not exist Scenario: Set time and future dated posts allowed Given I have a _layouts directory And I have a page layout that contains "Page Layout: {{ site.posts.size }} on {{ site.time | date: "%Y-%m-%d" }}" And I have a post layout that contains "Post Layout: {{ content }}" And I have an "index.html" page with layout "page" that contains "site index page" And I have a configuration file with: | key | value | | time | 2010-01-01 | | future | true | 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. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    " in "_site/2007/12/31/entry1.html" And I should see "Post Layout:

    content for entry2.

    " in "_site/2020/01/31/entry2.html" Scenario: Generate proper dates with explicitly set timezone (same as posts' time) Given I have a _layouts directory And I have a page layout that contains "Page Layout: {{ site.posts.size }}" And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}" 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 | America/New_York | 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. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Page Layout: 2" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    \n built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html" And I should see "Post Layout:

    content for entry2.

    \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 And I have a page layout that contains "Page Layout: {{ site.posts.size }}" And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}" 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 | 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. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Page Layout: 2" in "_site/index.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:

    content for entry1.

    \n built at 2013-04-09T09:22:00-10:00" in "_site/2013/04/09/entry1.html" And I should see "Post Layout:

    content for entry2.

    \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 And I have a configuration file with: | key | value | | limit_posts | 2 | And I have the following posts: | title | date | content | | Apples | 2009-03-27 | An article about apples | | Oranges | 2009-04-01 | An article about oranges | | Bananas | 2009-04-05 | An article about bananas | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And the "_site/2009/04/05/bananas.html" file should exist And the "_site/2009/04/01/oranges.html" file should exist And the "_site/2009/03/27/apples.html" file should not exist Scenario: Copy over normally excluded files when they are explicitly included Given I have a ".gitignore" file that contains ".DS_Store" And I have an ".htaccess" file that contains "SomeDirective" And I have a configuration file with "include" set to: | value | | .gitignore | | .foo | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see ".DS_Store" in "_site/.gitignore" And the "_site/.htaccess" file should not exist Scenario: Using a different layouts directory Given I have a _theme directory And I have a page theme that contains "Page Layout: {{ site.posts.size }} on {{ site.time | date: "%Y-%m-%d" }}" And I have a post theme that contains "Post Layout: {{ content }}" And I have an "index.html" page with layout "page" that contains "site index page" And I have a configuration file with: | key | value | | time | 2010-01-01 | | future | true | | layouts_dir | _theme | 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. | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html" And I should see "Post Layout:

    content for entry1.

    " in "_site/2007/12/31/entry1.html" And I should see "Post Layout:

    content for entry2.

    " in "_site/2020/01/31/entry2.html" 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'" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "FOO" in "_site/index.html" And I should not see " " in "_site/index.html" jekyll-3.1.6/features/site_data.feature000066400000000000000000000123771271741406300201620ustar00rootroot00000000000000Feature: Site data As a hacker who likes to blog I want to be able to embed data into my site In order to make the site slightly dynamic Scenario: Use page variable in a page Given I have an "contact.html" page with title "Contact" that contains "{{ page.title }}: email@example.com" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Contact: email@example.com" in "_site/contact.html" Scenario Outline: Use page.path variable in a page Given I have a directory And I have a "" page that contains "Source path: {{ page.path }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Source path: " in "_site/" Examples: | dir | path | | . | index.html | | dir | dir/about.html | | dir/nested | dir/nested/page.html | Scenario: Override page.path Given I have an "override.html" page with path "custom-override.html" that contains "Custom path: {{ page.path }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Custom path: custom-override.html" in "_site/override.html" Scenario: Use site.time variable Given I have an "index.html" page that contains "{{ site.time }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see today's time in "_site/index.html" Scenario: Use site.posts variable for latest post Given I have a _posts directory And I have an "index.html" page that contains "{{ site.posts.first.title }}: {{ site.posts.first.url }}" And I have the following posts: | title | date | content | | First Post | 2009-03-25 | My First Post | | Second Post | 2009-03-26 | My Second Post | | Third Post | 2009-03-27 | My Third Post | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Third Post: /2009/03/27/third-post.html" in "_site/index.html" Scenario: Use site.posts variable in a loop Given I have a _posts directory And I have an "index.html" page that contains "{% for post in site.posts %} {{ post.title }} {% endfor %}" And I have the following posts: | title | date | content | | First Post | 2009-03-25 | My First Post | | Second Post | 2009-03-26 | My Second Post | | Third Post | 2009-03-27 | My Third Post | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Third Post Second Post First Post" in "_site/index.html" Scenario: Use site.categories.code variable Given I have a _posts directory And I have an "index.html" page that contains "{% for post in site.categories.code %} {{ post.title }} {% endfor %}" And I have the following posts: | title | date | category | content | | Awesome Hack | 2009-03-26 | code | puts 'Hello World' | | Delicious Beer | 2009-03-26 | food | 1) Yuengling | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Awesome Hack" in "_site/index.html" Scenario: Use site.tags variable Given I have a _posts directory And I have an "index.html" page that contains "{% for post in site.tags.beer %} {{ post.content }} {% endfor %}" And I have the following posts: | title | date | tag | content | | Delicious Beer | 2009-03-26 | beer | 1) Yuengling | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "Yuengling" in "_site/index.html" Scenario: Order Posts by name when on the same date Given I have a _posts directory And I have an "index.html" page that contains "{% for post in site.posts %}{{ post.title }}:{{ post.previous.title}},{{ post.next.title}} {% endfor %}" And I have the following posts: | title | date | content | | first | 2009-02-26 | first | | A | 2009-03-26 | A | | B | 2009-03-26 | B | | C | 2009-03-26 | C | | last | 2009-04-26 | last | When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "last:C, C:B,last B:A,C A:first,B first:,A" in "_site/index.html" Scenario: Use configuration date in site payload Given I have an "index.html" page that contains "{{ site.url }}" And I have a configuration file with "url" set to "http://example.com" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "http://example.com" in "_site/index.html" Scenario: Access Jekyll version via jekyll.version Given I have an "index.html" page that contains "{{ jekyll.version }}" When I run jekyll build Then I should get a zero exit status And the _site directory should exist And I should see "\d+\.\d+\.\d+" in "_site/index.html" jekyll-3.1.6/features/step_definitions.rb000066400000000000000000000127261271741406300205410ustar00rootroot00000000000000Before do FileUtils.mkdir_p(Paths.test_dir) unless Paths.test_dir.directory? Dir.chdir(Paths.test_dir) end # After do Paths.test_dir.rmtree if Paths.test_dir.exist? Paths.output_file.delete if Paths.output_file.exist? Paths.status_file.delete if Paths.status_file.exist? Dir.chdir(Paths.test_dir.parent) end # Given %r{^I have a blank site in "(.*)"$} do |path| if !File.exist?(path) then FileUtils.mkdir_p(path) end end # Given %r{^I do not have a "(.*)" directory$} do |path| Paths.test_dir.join(path).directory? end # Given %r{^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$} do |file, key, value, text| File.write(file, Jekyll::Utils.strip_heredoc(<<-DATA)) --- #{key || 'layout'}: #{value || 'nil'} --- #{text} DATA end # Given %r{^I have an? "(.*)" file that contains "(.*)"$} do |file, text| File.write(file, text) end # Given %r{^I have an? (.*) (layout|theme) that contains "(.*)"$} do |name, type, text| folder = type == "layout" ? "_layouts" : "_theme" destination_file = Pathname.new(File.join(folder, "#{name}.html")) FileUtils.mkdir_p(destination_file.parent) unless destination_file.parent.directory? File.write(destination_file, text) end # Given %r{^I have an? "(.*)" file with content:$} do |file, text| File.write(file, text) end # Given %r{^I have an? (.*) directory$} do |dir| if !File.directory?(dir) then FileUtils.mkdir_p(dir) end end # Given %r{^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"] || "markdown" filename = filename = "#{title}.#{ext}" if %w(draft page).include?(status) before, after = location(folder, direction) dest_folder = "_drafts" if status == "draft" dest_folder = "_posts" if status == "post" dest_folder = "" if status == "page" if status == "post" parsed_date = Time.xmlschema(input_hash['date']) rescue Time.parse(input_hash['date']) filename = "#{parsed_date.strftime('%Y-%m-%d')}-#{title}.#{ext}" end path = File.join(before, dest_folder, after, filename) File.write(path, file_content_from_hash(input_hash)) end end # Given %r{^I have a configuration file with "(.*)" set to "(.*)"$} do |key, value| config = if source_dir.join("_config.yml").exist? SafeYAML.load_file(source_dir.join("_config.yml")) else {} end config[key] = YAML.load(value) File.write("_config.yml", YAML.dump(config)) end # Given %r{^I have a configuration file with:$} do |table| table.hashes.each do |row| step %(I have a configuration file with "#{row["key"]}" set to "#{row["value"]}") end end # Given %r{^I have a configuration file with "([^\"]*)" set to:$} do |key, table| File.open("_config.yml", "w") do |f| f.write("#{key}:\n") table.hashes.each do |row| f.write("- #{row["value"]}\n") end end end # Given %r{^I have fixture collections$} do FileUtils.cp_r Paths.source_dir.join("test", "source", "_methods"), source_dir FileUtils.cp_r Paths.source_dir.join("test", "source", "_thanksgiving"), source_dir end # Given %r{^I wait (\d+) second(s?)$} do |time, plural| sleep(time.to_f) end # When %r{^I run jekyll(.*)$} do |args| run_jekyll(args) if args.include?("--verbose") || ENV["DEBUG"] $stderr.puts "\n#{jekyll_run_output}\n" end end # When %r{^I run bundle(.*)$} do |args| run_bundle(args) if args.include?("--verbose") || ENV['DEBUG'] $stderr.puts "\n#{jekyll_run_output}\n" end end # When %r{^I change "(.*)" to contain "(.*)"$} do |file, text| File.open(file, "a") do |f| f.write(text) end end # When %r{^I delete the file "(.*)"$} do |file| File.delete(file) end # Then %r{^the (.*) directory should +(not )?exist$} do |dir, negative| if negative.nil? expect(Pathname.new(dir)).to exist else expect(Pathname.new(dir)).to_not exist end end # Then %r{^I should (not )?see "(.*)" in "(.*)"$} do |negative, text, file| step %(the "#{file}" file should exist) regexp = Regexp.new(text, Regexp::MULTILINE) if negative.nil? || negative.empty? expect(file_contents(file)).to match regexp else expect(file_contents(file)).not_to match regexp end end # Then %r{^I should see exactly "(.*)" in "(.*)"$} do |text, file| step %(the "#{file}" file should exist) expect(file_contents(file).strip).to eq text end # Then %r{^I should see escaped "(.*)" in "(.*)"$} do |text, file| step %(I should see "#{Regexp.escape(text)}" in "#{file}") end # Then %r{^the "(.*)" file should +(not )?exist$} do |file, negative| if negative.nil? expect(Pathname.new(file)).to exist else expect(Pathname.new(file)).to_not exist end end # Then %r{^I should see today's time in "(.*)"$} do |file| step %(I should see "#{seconds_agnostic_time(Time.now)}" in "#{file}") end # Then %r{^I should see today's date in "(.*)"$} do |file| step %(I should see "#{Date.today.to_s}" in "#{file}") end # Then %r{^I should (not )?see "(.*)" in the build output$} do |negative, text| if negative.nil? || negative.empty? expect(jekyll_run_output).to match Regexp.new(text) else expect(jekyll_run_output).not_to match Regexp.new(text) end end # Then %r{^I should get a zero exit(?:\-| )status$} do step %(I should see "EXIT STATUS: 0" in the build output) end # Then %r{^I should get a non-zero exit(?:\-| )status$} do step %(I should not see "EXIT STATUS: 0" in the build output) end jekyll-3.1.6/features/support/000077500000000000000000000000001271741406300163525ustar00rootroot00000000000000jekyll-3.1.6/features/support/formatter.rb000066400000000000000000000071461271741406300207120ustar00rootroot00000000000000require 'fileutils' require 'colorator' require 'cucumber/formatter/console' require 'cucumber/formatter/io' module Jekyll module Cucumber class Formatter attr_accessor :indent, :runtime include ::Cucumber::Formatter::Console include ::Cucumber::Formatter::Io include FileUtils CHARS = { :failed => "\u2718".red, :pending => "\u203D".yellow, :undefined => "\u2718".red, :passed => "\u2714".green, :skipped => "\u203D".blue } # def initialize(runtime, path_or_io, options) @runtime = runtime @snippets_input = [] @io = ensure_io(path_or_io) @prefixes = options[:prefixes] || {} @delayed_messages = [] @options = options @exceptions = [] @indent = 0 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 tag_name(tag_name); end def comment_line(comment_line); end def after_feature_element(feature_element); end def after_tags(tags); end # def before_feature_element(feature_element) @indent = 2 @scenario_indent = 2 end # def before_background(background) @scenario_indent = 2 @in_background = true @indent = 2 end # def after_background(background) @in_background = nil end # def background_name(keyword, name, source_line, indend) print_feature_element_name( keyword, name, source_line, indend ) end # def scenario_name(keyword, name, source_line, indent) print_feature_element_name( keyword, name, source_line, 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 # def step_name(keyword, step_match, status, source_indent, background, file_colon_line) @io.print CHARS[status] @io.print " " end # def exception(exception, status) return if @hide_this_step @io.puts print_exception(exception, status, @indent) @io.flush end # def after_test_step(test_step, result) collect_snippet_data( test_step, result ) end # private def print_feature_element_name(keyword, name, source_line, indent) @io.puts names = name.empty? ? [name] : name.each_line.to_a line = " #{keyword}: #{names[0]}" @io.print(source_line) if @options[:source] @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 jekyll-3.1.6/features/support/helpers.rb000066400000000000000000000054761271741406300203550ustar00rootroot00000000000000require "fileutils" require "jekyll/utils" require "open3" require "time" require "safe_yaml/load" class Paths SOURCE_DIR = Pathname.new(File.expand_path("../..", __dir__)) def self.test_dir; source_dir.join("tmp", "jekyll"); end def self.output_file; test_dir.join("jekyll_output.txt"); end def self.status_file; test_dir.join("jekyll_status.txt"); end def self.jekyll_bin; source_dir.join("bin", "jekyll"); end def self.source_dir; SOURCE_DIR; end end # def file_content_from_hash(input_hash) matter_hash = input_hash.reject { |k, v| k == "content" } matter = matter_hash.map do |k, v| "#{k}: #{v}\n" end matter = matter.join.chomp content = \ if !input_hash['input'] || !input_hash['filter'] then input_hash['content'] else "{{ #{input_hash['input']} | " \ "#{input_hash['filter']} }}" end Jekyll::Utils.strip_heredoc(<<-EOF) --- #{matter.gsub( /\n/, "\n " )} --- #{content} EOF end # def source_dir(*files) return Paths.test_dir(*files) end # def all_steps_to_path(path) source = source_dir dest = Pathname.new(path).expand_path paths = [] dest.ascend do |f| break if f == source paths.unshift f.to_s end paths end # def jekyll_run_output if Paths.output_file.file? then return Paths.output_file.read end end # def jekyll_run_status if Paths.status_file.file? then return Paths.status_file.read end end # def run_bundle(args) run_in_shell("bundle", *args.strip.split(' ')) end # def run_jekyll(args) args = args.strip.split(" ") # Shellwords? process = run_in_shell(Paths.jekyll_bin.to_s, *args, "--trace") process.exitstatus == 0 end # def run_in_shell(*args) i, o, e, p = Open3.popen3(*args) out = o.read.strip err = e.read.strip [i, o, e].each do |m| m.close end File.write(Paths.status_file, p.value.exitstatus) File.open(Paths.output_file, "wb") do |f| f.puts "$ " << args.join(" ") f.puts out f.puts err f.puts "EXIT STATUS: #{p.value.exitstatus}" end p.value end # def slug(title = nil) if !title then Time.now.strftime("%s%9N") # nanoseconds since the Epoch else title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-') end end # def location(folder, direction) if folder before = folder if direction == "in" after = folder if direction == "under" end [before || '.', after || '.'] end # def file_contents(path) return Pathname.new(path).read end # def seconds_agnostic_datetime(datetime = Time.now) date, time, zone = datetime.to_s.split(" ") time = seconds_agnostic_time(time) [ Regexp.escape(date), "#{time}:\\d{2}", Regexp.escape(zone) ] \ .join("\\ ") end # def seconds_agnostic_time(time) time = time.strftime("%H:%M:%S") if time.is_a?(Time) hour, minutes, _ = time.split(":") "#{hour}:#{minutes}" end jekyll-3.1.6/jekyll.gemspec000066400000000000000000000027571271741406300156720ustar00rootroot00000000000000# coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 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.rubygems_version = '2.2.2' s.required_ruby_version = '>= 2.0.0' 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.authors = ['Tom Preston-Werner'] s.email = 'tom@mojombo.com' s.homepage = 'https://github.com/jekyll/jekyll' all_files = `git ls-files -z`.split("\x0") s.files = all_files.grep(%r{^(bin|lib)/|^.rubocop.yml$}) s.executables = all_files.grep(%r{^bin/}) { |f| File.basename(f) } s.require_paths = ['lib'] s.rdoc_options = ['--charset=UTF-8'] s.extra_rdoc_files = %w[README.markdown LICENSE] 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.1') end jekyll-3.1.6/lib/000077500000000000000000000000001271741406300135665ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll.rb000066400000000000000000000137521271741406300154150ustar00rootroot00000000000000$LOAD_PATH.unshift File.dirname(__FILE__) # For use/testing when no gem is installed # Require all of the Ruby files in the given directory. # # path - The String relative path from here to the directory. # # Returns nothing. def require_all(path) glob = File.join(File.dirname(__FILE__), path, '*.rb') Dir[glob].sort.each do |f| require f end end # rubygems require 'rubygems' # stdlib require 'forwardable' require 'fileutils' require 'time' require 'English' require 'pathname' require 'logger' require 'set' # 3rd party require 'safe_yaml/load' require 'liquid' require 'kramdown' require 'colorator' SafeYAML::OPTIONS[:suppress_warnings] = true module Jekyll # internal requires autoload :Cleaner, 'jekyll/cleaner' autoload :Collection, 'jekyll/collection' autoload :Configuration, 'jekyll/configuration' autoload :Convertible, 'jekyll/convertible' autoload :Deprecator, 'jekyll/deprecator' autoload :Document, 'jekyll/document' autoload :Draft, 'jekyll/draft' 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 :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 :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' autoload :URL, 'jekyll/url' autoload :Utils, 'jekyll/utils' autoload :VERSION, 'jekyll/version' # extensions require 'jekyll/plugin' require 'jekyll/converter' require 'jekyll/generator' require 'jekyll/command' require 'jekyll/liquid_extensions' 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 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 configuration(override = Hash.new) config = Configuration.new unless override.delete('skip_config_files') config = config.read_config_files(config.config_files(override)) end # Merge DEFAULTS < _config.yml < override Configuration.from(Utils.deep_merge_hashes(config, override)).tap do |config| set_timezone(config['timezone']) if config['timezone'] end 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 # 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 # 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: An array of sites # # Returns the Jekyll sites created. def sites @sites ||= [] end # 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) questionable_path.insert(0, '/') if questionable_path.start_with?('~') clean_path = File.expand_path(questionable_path, "/") clean_path.sub!(/\A\w\:\//, '/') if clean_path.start_with?(base_directory.sub(/\A\w\:\//, '/')) clean_path else File.join(base_directory, clean_path) end end # Conditional optimizations Jekyll::External.require_if_present('liquid-c') end end require "jekyll/drops/drop" require "jekyll/drops/document_drop" require_all 'jekyll/commands' require_all 'jekyll/converters' require_all 'jekyll/converters/markdown' require_all 'jekyll/drops' require_all 'jekyll/generators' require_all 'jekyll/tags' require 'jekyll-sass-converter' jekyll-3.1.6/lib/jekyll/000077500000000000000000000000001271741406300150605ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/cleaner.rb000066400000000000000000000056621271741406300170270ustar00rootroot00000000000000require 'set' module Jekyll # 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 # Cleans up the site's destination directory def cleanup! FileUtils.rm_rf(obsolete_files) FileUtils.rm_rf(metadata_file) unless @site.incremental? end 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 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 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 Utils.safe_glob(site.in_dest_dir, ["**", "*"], File::FNM_DOTMATCH).each do |file| next if file =~ HIDDEN_FILE_REGEX || file =~ regex || dirs.include?(file) files << file end files 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 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: 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 jekyll-3.1.6/lib/jekyll/collection.rb000066400000000000000000000144401271741406300175430ustar00rootroot00000000000000module Jekyll class Collection attr_reader :site, :label, :metadata attr_writer :docs # Create a new Collection. # # site - the site to which this collection belongs. # label - the name of the collection # # Returns nothing. def initialize(site, label) @site = site @label = sanitize_label(label) @metadata = extract_metadata end # Fetch the Documents in this collection. # Defaults to an empty array if no documents have been read in. # # Returns an array of Jekyll::Document objects. def docs @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:", "#{label}.#{method} should be changed to #{label}.docs.#{method}." 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| 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 if site.publisher.publish?(doc) || !write? docs << doc else Jekyll.logger.debug "Skipped From Publishing:", doc.relative_path end 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 # All the entries in this collection. # # Returns an Array of file paths to the documents in this collection # relative to the collection's directory def entries return [] unless exists? @entries ||= Utils.safe_glob(collection_dir, ["**", "*.*"]).map do |entry| entry["#{collection_dir}/"] = '' entry end end # Filtered version of the entries in this collection. # See `Jekyll::EntryFilter#filter` for more information. # # Returns a list of filtered entry paths. def filtered_entries return [] unless exists? @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. # # Returns a String containing the directory name where the collection # is stored on the filesystem. def relative_directory @relative_directory ||= "_#{label}" end # 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 @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. # The directory must exist on the filesystem and must not be a symlink # if in safe mode. # # Returns false if the directory doesn't exist or if it's a symlink # and we're in safe mode. def exists? File.directory?(directory) && !(File.symlink?(directory) && site.safe) end # The entry filter for this collection. # Creates an instance of Jekyll::EntryFilter. # # Returns the instance of Jekyll::EntryFilter for this collection. def entry_filter @entry_filter ||= Jekyll::EntryFilter.new(site, relative_directory) end # An inspect string. # # Returns the inspect string def inspect "#" end # Produce a sanitized label name # Label names may not contain anything but alphanumeric characters, # underscores, and hyphens. # # label - the possibly-unsafe label # # Returns a sanitized version of the label. def sanitize_label(label) label.gsub(/[^a-z0-9_\-\.]/i, '') end # Produce a representation of this Collection for use in Liquid. # Exposes two attributes: # - label # - docs # # Returns a representation of this collection for use in Liquid. def to_liquid Drops::CollectionDrop.new self end # Whether the collection's documents ought to be written as individual # files in the output. # # Returns true if the 'write' metadata is true, false otherwise. def write? !!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 @url_template ||= metadata.fetch('permalink') do Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) end end # Extract options for this collection from the site configuration. # # Returns the metadata for this collection def extract_metadata if site.config['collections'].is_a?(Hash) site.config['collections'][label] || {} else {} end end end end jekyll-3.1.6/lib/jekyll/command.rb000066400000000000000000000046771271741406300170410ustar00rootroot00000000000000module Jekyll class Command class << self # A list of subclasses of Jekyll::Command def subclasses @subclasses ||= [] end # Keep a list of subclasses of Jekyll::Command every time it's inherited # Called automatically. # # base - the subclass # # Returns nothing def inherited(base) subclasses << base super(base) end # Run Site#process and catch errors # # site - the Jekyll::Site object # # Returns nothing def process_site(site) site.process rescue Jekyll::Errors::FatalException => e Jekyll.logger.error "ERROR:", "YOUR SITE COULD NOT BE BUILT:" Jekyll.logger.error "", "------------------------------------" Jekyll.logger.error "", e.message exit(1) end # Create a full Jekyll configuration with the options passed in as overrides # # options - the configuration overrides # # Returns a full Jekyll configuration def configuration_from_options(options) Jekyll.configuration(options) end # Add common options to a command for building configuration # # c - the Jekyll::Command to add these options to # # 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', '--[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 end end jekyll-3.1.6/lib/jekyll/commands/000077500000000000000000000000001271741406300166615ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/commands/build.rb000066400000000000000000000051151271741406300203070ustar00rootroot00000000000000module Jekyll module Commands class Build < Command class << self # Create the Mercenary command for the Jekyll CLI for this Command def init_with_program(prog) prog.command(:build) do |c| c.syntax 'build [options]' c.description 'Build your site' c.alias :b add_build_options(c) c.action do |_, options| options["serving"] = false Jekyll::Commands::Build.process(options) end end end # Build your jekyll site # Continuously watch if `watch` is set to true in the config. def process(options) # Adjust verbosity quickly Jekyll.logger.adjust_verbosity(options) options = configuration_from_options(options) site = Jekyll::Site.new(options) if options.fetch('skip_initial_build', false) Jekyll.logger.warn "Build Warning:", "Skipping the initial build. This may result in an out-of-date site." else build(site, options) end if options.fetch('detach', false) Jekyll.logger.info "Auto-regeneration:", "disabled when running server detached." elsif options.fetch('watch', false) watch(site, options) else Jekyll.logger.info "Auto-regeneration:", "disabled. Use --watch to enable." end end # Build your Jekyll site. # # site - the Jekyll::Site instance to build # options - A Hash of options passed to the command # # 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 in #{(Time.now - t).round(3)} seconds." end # Private: Watch for file changes and rebuild the site. # # site - A Jekyll::Site instance # options - A Hash of options passed to the command # # Returns nothing. def watch(_site, options) External.require_with_graceful_fail 'jekyll-watch' Jekyll::Watcher.watch(options) end end # end of class << self end end end jekyll-3.1.6/lib/jekyll/commands/clean.rb000066400000000000000000000023771271741406300203010ustar00rootroot00000000000000module 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 |_, options| Jekyll::Commands::Clean.process(options) 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 jekyll-3.1.6/lib/jekyll/commands/doctor.rb000066400000000000000000000072301271741406300205020ustar00rootroot00000000000000module Jekyll module Commands class Doctor < Command class << self def init_with_program(prog) prog.command(:doctor) do |c| c.syntax 'doctor' c.description 'Search site and print specific deprecation warnings' c.alias(:hyde) c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file' c.action do |_, options| Jekyll::Commands::Doctor.process(options) end end end def process(options) site = Jekyll::Site.new(configuration_from_options(options)) site.read if healthy?(site) Jekyll.logger.info "Your test results", "are in. Everything looks fine." else abort end end def healthy?(site) [ fsnotify_buggy?(site), !deprecated_relative_permalinks(site), !conflicting_urls(site), !urls_only_differ_by_case(site) ].all? end def deprecated_relative_permalinks(site) 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 end def conflicting_urls(site) conflicting_urls = false urls = {} urls = collect_urls(urls, site.pages, site.dest) urls = collect_urls(urls, site.posts.docs, site.dest) urls.each do |url, paths| next unless paths.size > 1 conflicting_urls = true Jekyll.logger.warn "Conflict:", "The URL '#{url}' is the destination" \ " for the following pages: #{paths.join(", ")}" end conflicting_urls end def fsnotify_buggy?(_site) return true unless 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 def urls_only_differ_by_case(site) urls_only_differ_by_case = false urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest) urls.each do |case_insensitive_url, real_urls| next unless real_urls.uniq.size > 1 urls_only_differ_by_case = true Jekyll.logger.warn "Warning:", "The following URLs only differ" \ " by case. On a case-insensitive file system one of the URLs" \ " will be overwritten by the other: #{real_urls.join(", ")}" end urls_only_differ_by_case end private def collect_urls(urls, things, destination) things.each do |thing| dest = thing.destination(destination) if urls[dest] urls[dest] << thing.path else urls[dest] = [thing.path] end end urls end def case_insensitive_urls(things, destination) things.inject({}) do |memo, thing| dest = thing.destination(destination) (memo[dest.downcase] ||= []) << dest memo end end end end end end jekyll-3.1.6/lib/jekyll/commands/help.rb000066400000000000000000000015731271741406300201440ustar00rootroot00000000000000module 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 jekyll-3.1.6/lib/jekyll/commands/new.rb000066400000000000000000000047171271741406300200100ustar00rootroot00000000000000require 'erb' module Jekyll module Commands class New < Command 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 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 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) end end Jekyll.logger.info "New jekyll site installed in #{new_blog_path}." end def create_blank_site(path) Dir.chdir(path) do FileUtils.mkdir(%w(_layouts _posts _drafts)) FileUtils.touch("index.html") end 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 initialized_post_name "_posts/#{Time.now.strftime('%Y-%m-%d')}-welcome-to-jekyll.markdown" end private def preserve_source_location?(path, options) !options["force"] && !Dir["#{path}/**/*"].empty? end def create_sample_files(path) FileUtils.cp_r site_template + '/.', path FileUtils.rm File.expand_path(scaffold_path, path) end def site_template File.expand_path("../../site_template", File.dirname(__FILE__)) end def scaffold_path "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" end end end end end jekyll-3.1.6/lib/jekyll/commands/serve.rb000066400000000000000000000151711271741406300203370ustar00rootroot00000000000000module Jekyll module Commands class Serve < Command class << self COMMAND_OPTIONS = { "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."], "host" => ["host", "-H", "--host [HOST]", "Host to bind to"], "open_url" => ["-o", "--open-url", "Launch your browser with your site."], "detach" => ["-B", "--detach", "Run the server in the background (detach)"], "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."], "port" => ["-P", "--port [PORT]", "Port to listen on"], "baseurl" => ["-b", "--baseurl [URL]", "Base URL"], "skip_initial_build" => ["skip_initial_build", "--skip-initial-build", "Skips the initial site build which occurs before the server is started."] } # def init_with_program(prog) prog.command(:serve) do |cmd| cmd.description "Serve your site locally" cmd.syntax "serve [options]" cmd.alias :server cmd.alias :s add_build_options(cmd) COMMAND_OPTIONS.each do |key, val| cmd.option key, *val end cmd.action do |_, opts| opts["serving"] = true opts["watch" ] = true unless opts.key?("watch") Build.process(opts) Serve.process(opts) end end end # def process(opts) opts = configuration_from_options(opts) destination = opts["destination"] setup(destination) server = WEBrick::HTTPServer.new(webrick_opts(opts)).tap { |o| o.unmount("") } server.mount(opts["baseurl"], Servlet, destination, file_handler_opts) Jekyll.logger.info "Server address:", server_address(server, opts) launch_browser server, opts if opts["open_url"] boot_or_detach server, opts end # Do a base pre-setup of WEBRick so that everything is in place # when we get ready to party, checking for an setting up an error page # and making sure our destination exists. private def setup(destination) require_relative "serve/servlet" FileUtils.mkdir_p(destination) if File.exist?(File.join(destination, "404.html")) WEBrick::HTTPResponse.class_eval do def create_error_page @header["Content-Type"] = "text/html; charset=UTF-8" @body = IO.read(File.join(@config[:DocumentRoot], "404.html")) end end end end # private def webrick_opts(opts) opts = { :JekyllOptions => opts, :DoNotReverseLookup => true, :MimeTypes => mime_types, :DocumentRoot => opts["destination"], :StartCallback => start_callback(opts["detach"]), :BindAddress => opts["host"], :Port => opts["port"], :DirectoryIndex => %W( index.htm index.html index.rhtml index.cgi index.xml ) } enable_ssl(opts) enable_logging(opts) opts end # Recreate NondisclosureName under utf-8 circumstance private def file_handler_opts WEBrick::Config::FileHandler.merge({ :FancyIndexing => true, :NondisclosureName => [ '.ht*', '~*' ] }) end # private def server_address(server, opts) "%{prefix}://%{address}:%{port}%{baseurl}" % { :prefix => server.config[:SSLEnable] ? "https" : "http", :baseurl => opts["baseurl"] ? "#{opts["baseurl"]}/" : "", :address => server.config[:BindAddress], :port => server.config[:Port] } end # private def launch_browser(server, opts) command = if Utils::Platforms.windows? "start" elsif Utils::Platforms.osx? "open" else "xdg-open" end system command, server_address(server, opts) end # Keep in our area with a thread or detach the server as requested # by the user. This method determines what we do based on what you # ask us to do. private def boot_or_detach(server, opts) if opts["detach"] pid = Process.fork do server.start end Process.detach(pid) Jekyll.logger.info "Server detached with pid '#{pid}'.", \ "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server." else t = Thread.new { server.start } trap("INT") { server.shutdown } t.join end end # Make the stack verbose if the user requests it. private def enable_logging(opts) opts[:AccessLog] = [] level = WEBrick::Log.const_get(opts[:JekyllOptions]["verbose"] ? :DEBUG : :WARN) opts[:Logger] = WEBrick::Log.new($stdout, level) end # Add SSL to the stack if the user triggers --enable-ssl and they # provide both types of certificates commonly needed. Raise if they # forget to add one of the certificates. private def enable_ssl(opts) return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"] if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"] raise RuntimeError, "--ssl-cert or --ssl-key missing." end require "openssl" require "webrick/https" source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_key" ]) source_certificate = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], opts[:JekyllOptions]["ssl_cert"]) opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read(source_certificate)) opts[:SSLPrivateKey ] = OpenSSL::PKey::RSA.new(File.read(source_key)) opts[:SSLEnable] = true end private def start_callback(detached) unless detached proc do Jekyll.logger.info("Server running...", "press ctrl-c to stop.") end end end private def mime_types file = File.expand_path('../mime.types', File.dirname(__FILE__)) WEBrick::HTTPUtils.load_mime_types(file) end end end end end jekyll-3.1.6/lib/jekyll/commands/serve/000077500000000000000000000000001271741406300200055ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/commands/serve/servlet.rb000066400000000000000000000031701271741406300220170ustar00rootroot00000000000000require "webrick" module Jekyll module Commands class Serve class Servlet < WEBrick::HTTPServlet::FileHandler DEFAULTS = { "Cache-Control" => "private, max-age=0, proxy-revalidate, " \ "no-store, no-cache, must-revalidate" } def initialize(server, root, callbacks) # So we can access them easily. @jekyll_opts = server.config[:JekyllOptions] set_defaults super end # Add the ability to tap file.html the same way that Nginx does on our # Docker images (or on GitHub Pages.) The difference is that we might end # up with a different preference on which comes first. def search_file(req, res, basename) # /file.* > /file/index.html > /file.html super || super(req, res, "#{basename}.html") end # def do_GET(req, res) rtn = super validate_and_ensure_charset(req, res) res.header.merge!(@headers) rtn end # private def validate_and_ensure_charset(_req, res) key = res.header.keys.grep(/content-type/i).first typ = res.header[key] unless typ =~ /;\s*charset=/ res.header[key] = "#{typ}; charset=#{@jekyll_opts["encoding"]}" end end # private def set_defaults hash_ = @jekyll_opts.fetch("webrick", {}).fetch("headers", {}) DEFAULTS.each_with_object(@headers = hash_) do |(key, val), hash| hash[key] = val unless hash.key?(key) end end end end end end jekyll-3.1.6/lib/jekyll/configuration.rb000066400000000000000000000271761271741406300202710ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll class Configuration < Hash # Default options. Overridden by values in _config.yml. # Strings rather than symbols are used for compatibility with YAML. DEFAULTS = Configuration[{ # Where things are 'source' => Dir.pwd, 'destination' => File.join(Dir.pwd, '_site'), 'plugins_dir' => '_plugins', 'layouts_dir' => '_layouts', 'data_dir' => '_data', 'includes_dir' => '_includes', 'collections' => {}, # 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' => nil, 'limit_posts' => 0, 'future' => false, 'unpublished' => false, # Plugins 'whitelist' => [], 'gems' => [], # Conversion 'markdown' => 'kramdown', 'highlighter' => 'rouge', 'lsi' => false, 'excerpt_separator' => "\n\n", 'incremental' => false, # Serving 'detach' => false, # default to not detaching the server 'port' => '4000', 'host' => '127.0.0.1', 'baseurl' => '', # Output Configuration 'permalink' => 'date', 'paginate_path' => '/page:num', 'timezone' => nil, # use the local timezone 'quiet' => false, 'verbose' => false, 'defaults' => [], 'rdiscount' => { 'extensions' => [] }, 'redcarpet' => { 'extensions' => [] }, 'kramdown' => { 'auto_ids' => true, 'toc_levels' => '1..6', 'entity_output' => 'as_char', 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', 'input' => "GFM", 'hard_wrap' => false, 'footnote_nr' => 1 } }.map { |k, v| [k, v.freeze] }].freeze class << self # Static: Produce a Configuration ready for use in a Site. # It takes the input, fills in the defaults where values do not # exist, and patches common issues including migrating options for # backwards compatiblity. Except where a key or value is being fixed, # the user configuration will override the defaults. # # user_config - a Hash or Configuration of overrides. # # Returns a Configuration filled with defaults and fixed for common # problems and backwards-compatibility. def from(user_config) Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys). fix_common_issues.add_default_collections end end # Public: Turn all keys into string # # Return a copy of the hash where all its keys are strings def stringify_keys 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) get_config_value_with_override('source', override) end 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/i Jekyll::External.require_with_graceful_fail('toml') unless defined?(TOML) TOML.load_file(filename) 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." end end # Public: Generate list of configuration files from the override # # override - the command-line options hash # # Returns an Array of config files def config_files(override) # Adjust verbosity quickly Jekyll.logger.adjust_verbosity(:quiet => quiet?(override), :verbose => verbose?(override)) # Get configuration from /_config.yml or / config_files = override.delete('config') if config_files.to_s.empty? default = %w(yml yaml).find(-> { 'yml' }) do |ext| File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) end config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") @default_config_file = true end config_files = [config_files] unless config_files.is_a? Array config_files end # Public: Read configuration and return merged Hash # # file - the path to the YAML file to be read in # # Returns this configuration, overridden by the values in the file def read_config_file(file) next_config = safe_load_file(file) check_config_is_hash!(next_config, file) Jekyll.logger.info "Configuration file:", file next_config rescue SystemCallError if @default_config_file Jekyll.logger.warn "Configuration file:", "none" {} else Jekyll.logger.error "Fatal:", "The configuration file '#{file}' could not be found." raise LoadError, "The Configuration file '#{file}' could not be found." end end # Public: Read in a list of configuration files and merge with this hash # # files - the list of configuration file paths # # Returns the full configuration, with the defaults overridden by the values in the # configuration files def read_config_files(files) configuration = clone begin files.each do |config_file| next if config_file.nil? or config_file.empty? new_config = read_config_file(config_file) configuration = Utils.deep_merge_hashes(configuration, new_config) end rescue ArgumentError => err Jekyll.logger.warn "WARNING:", "Error reading configuration. " \ "Using defaults (and options)." $stderr.puts "#{err}" end configuration.fix_common_issues.backwards_compatibilize.add_default_collections end # Public: Split a CSV string into an array containing its values # # csv - the string of comma-separated values # # Returns an array of the values contained in the CSV def csv_to_array(csv) csv.split(",").map(&:strip) end # Public: Ensure the proper options are set in the configuration to allow for # backwards-compatibility with Jekyll pre-1.0 # # Returns the backwards-compatible configuration def backwards_compatibilize config = clone # Provide backwards-compatibility 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"\ " --[no-]watch/-w command-line option instead." config.delete('auto') config.delete('watch') end 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 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.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." config['highlighter'] = 'pygments' if config['pygments'] config.delete('pygments') end %w(include exclude).each do |option| if config[option].is_a?(String) 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." config[option] = csv_to_array(config[option]) end config[option].map!(&:to_s) if config[option] 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.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.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 end config end def add_default_collections config = clone # It defaults to `{}`, so this is only if someone sets it to null manually. return config if config['collections'].nil? # Ensure we have a hash. if config['collections'].is_a?(Array) config['collections'] = Hash[config['collections'].map { |c| [c, {}] }] end config['collections'] = Utils.deep_merge_hashes( { 'posts' => {} }, config['collections'] ).tap do |collections| collections['posts']['output'] = true if config['permalink'] collections['posts']['permalink'] ||= style_to_permalink(config['permalink']) end end config end def renamed_key(old, new, config, _ = 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:output_ext" when :date "/:categories/:year/:month/:day/:title:output_ext" when :ordinal "/:categories/:year/:y_day/:title:output_ext" else permalink_style.to_s end end # Private: Checks if a given config is a hash # # extracted_config - the value to check # file - the file from which the config was extracted # # Raises an ArgumentError if given config is not a hash def check_config_is_hash!(extracted_config, file) unless extracted_config.is_a?(Hash) raise ArgumentError.new("Configuration file: (INVALID) #{file}".yellow) end end end end jekyll-3.1.6/lib/jekyll/converter.rb000066400000000000000000000025461271741406300174230ustar00rootroot00000000000000module Jekyll class Converter < Plugin # Public: Get or set the highlighter prefix. When an argument is specified, # the prefix will be set. If no argument is specified, the current prefix # will be returned. # # highlighter_prefix - The String prefix (default: nil). # # Returns the String prefix. def self.highlighter_prefix(highlighter_prefix = nil) @highlighter_prefix = highlighter_prefix if highlighter_prefix @highlighter_prefix end # Public: Get or set the highlighter suffix. When an argument is specified, # the suffix will be set. If no argument is specified, the current suffix # will be returned. # # highlighter_suffix - The String suffix (default: nil). # # Returns the String suffix. def self.highlighter_suffix(highlighter_suffix = nil) @highlighter_suffix = highlighter_suffix if highlighter_suffix @highlighter_suffix end # Initialize the converter. # # Returns an initialized Converter. def initialize(config = {}) @config = config end # Get the highlighter prefix. # # Returns the String prefix. def highlighter_prefix self.class.highlighter_prefix end # Get the highlighter suffix. # # Returns the String suffix. def highlighter_suffix self.class.highlighter_suffix end end end jekyll-3.1.6/lib/jekyll/converters/000077500000000000000000000000001271741406300172525ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/converters/identity.rb000066400000000000000000000004221271741406300214260ustar00rootroot00000000000000module Jekyll module Converters class Identity < Converter safe true priority :lowest def matches(_ext) true end def output_ext(ext) ext end def convert(content) content end end end end jekyll-3.1.6/lib/jekyll/converters/markdown.rb000066400000000000000000000052371271741406300214300ustar00rootroot00000000000000module Jekyll module Converters class Markdown < Converter highlighter_prefix "\n" highlighter_suffix "\n" safe true def setup return if @setup unless (@parser = get_processor) Jekyll.logger.error "Invalid Markdown processor given:", @config["markdown"] Jekyll.logger.info "", "Custom processors are not loaded in safe mode" if @config["safe"] Jekyll.logger.error "", "Available processors are: #{valid_processors.join(", ")}" raise Errors::FatalException, "Bailing out; invalid Markdown processor." end @setup = true end def get_processor case @config["markdown"].downcase when "redcarpet" then return RedcarpetParser.new(@config) when "kramdown" then return KramdownParser.new(@config) when "rdiscount" then return RDiscountParser.new(@config) else get_custom_processor end end # Public: Provides you with a list of processors, the ones we # support internally and the ones that you have provided to us (if you # are not in safe mode.) def valid_processors %W(rdiscount kramdown redcarpet) + third_party_processors end # Public: A list of processors that you provide via plugins. # This is really only available if you are not in safe mode, if you are # in safe mode (re: GitHub) then there will be none. def third_party_processors self.class.constants - \ %w(KramdownParser RDiscountParser RedcarpetParser PRIORITIES).map( &:to_sym ) end def extname_list @extname_list ||= @config['markdown_ext'].split(',').map do |e| ".#{e.downcase}" end end def matches(ext) extname_list.include?(ext.downcase) end def output_ext(_ext) ".html" end def convert(content) setup @parser.convert(content) end private def get_custom_processor converter_name = @config["markdown"] if custom_class_allowed?(converter_name) self.class.const_get(converter_name).new(@config) end end # Private: Determine whether a class name is an allowed custom # markdown class name. # # parser_name - the name of the parser class # # Returns true if the parser name contains only alphanumeric # characters and is defined within Jekyll::Converters::Markdown private def custom_class_allowed?(parser_name) parser_name !~ /[^A-Za-z0-9_]/ && self.class.constants.include?( parser_name.to_sym ) end end end end jekyll-3.1.6/lib/jekyll/converters/markdown/000077500000000000000000000000001271741406300210745ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/converters/markdown/kramdown_parser.rb000066400000000000000000000071561271741406300246300ustar00rootroot00000000000000# Frozen-string-literal: true # Encoding: utf-8 module Jekyll module Converters class Markdown class KramdownParser CODERAY_DEFAULTS = { "css" => "style", "bold_every" => 10, "line_numbers" => "inline", "line_number_start" => 1, "tab_width" => 4, "wrap" => "div" }.freeze def initialize(config) Jekyll::External.require_with_graceful_fail "kramdown" @main_fallback_highlighter = config["highlighter"] || "rouge" @config = config["kramdown"] || {} setup end # Setup and normalize the configuration: # * Create Kramdown if it doesn't exist. # * Set syntax_highlighter, detecting enable_coderay and merging highlighter if none. # * Merge kramdown[coderay] into syntax_highlighter_opts stripping coderay_. # * Make sure `syntax_highlighter_opts` exists. def setup @config["syntax_highlighter"] ||= highlighter @config["syntax_highlighter_opts"] ||= {} @config["coderay"] ||= {} # XXX: Legacy. modernize_coderay_config make_accessible end def convert(content) Kramdown::Document.new(content, @config).to_html end private def make_accessible(hash = @config) proc_ = proc { |hash_, key| hash_[key.to_s] if key.is_a?(Symbol) } hash.default_proc = proc_ hash.each do |_, val| make_accessible val if val.is_a?( Hash ) end end # config[kramdown][syntax_higlighter] > config[kramdown][enable_coderay] > config[highlighter] # Where `enable_coderay` is now deprecated because Kramdown # supports Rouge now too. private def highlighter return @highlighter if @highlighter if @config["syntax_highlighter"] return @highlighter = @config[ "syntax_highlighter" ] end @highlighter = begin if @config.key?("enable_coderay") && @config["enable_coderay"] Jekyll::Deprecator.deprecation_message "You are using 'enable_coderay', " \ "use syntax_highlighter: coderay in your configuration file." "coderay" else @main_fallback_highlighter end end end private def strip_coderay_prefix(hash) hash.each_with_object({}) do |(key, val), hsh| cleaned_key = key.gsub(/\Acoderay_/, "") if key != cleaned_key Jekyll::Deprecator.deprecation_message( "You are using '#{key}'. Normalizing to #{cleaned_key}." ) end hsh[cleaned_key] = val end end # If our highlighter is CodeRay we go in to merge the CodeRay defaults # with your "coderay" key if it's there, deprecating it in the # process of you using it. private def modernize_coderay_config if highlighter == "coderay" Jekyll::Deprecator.deprecation_message "You are using 'kramdown.coderay' in your configuration, " \ "please use 'syntax_highlighter_opts' instead." @config["syntax_highlighter_opts"] = begin strip_coderay_prefix( @config["syntax_highlighter_opts"] \ .merge(CODERAY_DEFAULTS) \ .merge(@config["coderay"]) ) end end end end end end end jekyll-3.1.6/lib/jekyll/converters/markdown/rdiscount_parser.rb000066400000000000000000000017201271741406300250070ustar00rootroot00000000000000module Jekyll module Converters class Markdown class RDiscountParser def initialize(config) Jekyll::External.require_with_graceful_fail "rdiscount" @config = config @rdiscount_extensions = @config['rdiscount']['extensions'].map(&:to_sym) end def convert(content) rd = RDiscount.new(content, *@rdiscount_extensions) html = rd.to_html if @config['rdiscount']['toc_token'] html = replace_generated_toc(rd, html, @config['rdiscount']['toc_token']) end html end private def replace_generated_toc(rd, html, toc_token) if rd.generate_toc && html.include?(toc_token) utf8_toc = rd.toc_content utf8_toc.force_encoding('utf-8') if utf8_toc.respond_to?(:force_encoding) html.gsub(toc_token, utf8_toc) else html end end end end end end jekyll-3.1.6/lib/jekyll/converters/markdown/redcarpet_parser.rb000066400000000000000000000062141271741406300247510ustar00rootroot00000000000000module Jekyll module Converters class Markdown class RedcarpetParser module CommonMethods def add_code_tags(code, lang) code = code.to_s code = code.sub(/
    /, "
    ")
                code = code.sub(/<\/pre>/, "
    ") code end end module WithPygments include CommonMethods def block_code(code, lang) 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' }), lang ) end end module WithoutHighlighting require 'cgi' include CommonMethods def code_wrap(code) "
    #{CGI::escapeHTML(code)}
    " end def block_code(code, lang) lang = lang && lang.split.first || "text" add_code_tags(code_wrap(code), lang) end end module WithRouge def block_code(code, lang) code = "
    #{super}
    " output = "
    " output << add_code_tags(code, lang) output << "
    " end protected def rouge_formatter(_lexer) Rouge::Formatters::HTML.new(:wrap => false) end end def initialize(config) External.require_with_graceful_fail("redcarpet") @config = config @redcarpet_extensions = {} @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } @renderer ||= class_with_proper_highlighter(@config['highlighter']) end def class_with_proper_highlighter(highlighter) case highlighter when "pygments" Class.new(Redcarpet::Render::HTML) do include WithPygments end when "rouge" Class.new(Redcarpet::Render::HTML) do Jekyll::External.require_with_graceful_fail(%w( rouge rouge/plugins/redcarpet )) 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 include Rouge::Plugins::Redcarpet include CommonMethods include WithRouge end else Class.new(Redcarpet::Render::HTML) do include WithoutHighlighting end end end def convert(content) @redcarpet_extensions[:fenced_code_blocks] = !@redcarpet_extensions[:no_fenced_code_blocks] @renderer.send :include, Redcarpet::Render::SmartyPants if @redcarpet_extensions[:smart] markdown = Redcarpet::Markdown.new(@renderer.new(@redcarpet_extensions), @redcarpet_extensions) markdown.render(content) end end end end end jekyll-3.1.6/lib/jekyll/converters/smartypants.rb000066400000000000000000000013461271741406300221700ustar00rootroot00000000000000class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown def initialize(source, options) super @block_parsers = [:block_html] @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] end end module Jekyll module Converters class SmartyPants < Converter safe true priority :low def initialize(config) Jekyll::External.require_with_graceful_fail "kramdown" @config = config["kramdown"].dup || {} @config[:input] = :SmartyPants end def matches(_) false end def output_ext(_) nil end def convert(content) Kramdown::Document.new(content, @config).to_html.chomp end end end end jekyll-3.1.6/lib/jekyll/convertible.rb000066400000000000000000000216401271741406300177240ustar00rootroot00000000000000# encoding: UTF-8 require 'set' # Convertible provides methods for converting a pagelike item # from a certain type of markup into actual content # # Requires # self.site -> Jekyll::Site # self.content # self.content= # self.data= # self.ext= # self.output= # self.name # self.path # self.type -> :page, :post or :draft module Jekyll module Convertible # Returns the contents as a String. def to_s content || '' end # Whether the file is published or not, as indicated in YAML front-matter def published? !(data.key?('published') && data['published'] == false) end # Read the YAML frontmatter. # # base - The String path to the dir containing the file. # name - The String filename of the file. # opts - optional parameter to File.read, default at site configs # # Returns nothing. def read_yaml(base, name, opts = {}) filename = File.join(base, name) begin self.content = File.read(site.in_source_dir(base, name), Utils.merged_file_read_opts(site, opts)) if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m self.content = $POSTMATCH self.data = SafeYAML.load(Regexp.last_match(1)) end rescue SyntaxError => e Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" rescue Exception => e Jekyll.logger.warn "Error reading file #{filename}: #{e.message}" end self.data ||= {} validate_data! filename validate_permalink! filename self.data end def validate_data!(filename) unless self.data.is_a?(Hash) raise Errors::InvalidYAMLFrontMatterError, "Invalid YAML front matter in #{filename}" end end def validate_permalink!(filename) if self.data['permalink'] && self.data['permalink'].size == 0 raise Errors::InvalidPermalinkError, "Invalid permalink in #{filename}" end end # Transform the contents based on the content type. # # Returns the transformed contents. def transform 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. # # Returns the String extension for the output file. # e.g. ".html" for an HTML output file. def output_ext Jekyll::Renderer.new(site, self).output_ext end # Determine which converter to use based on this convertible's # extension. # # Returns the Converter instance. def converters @converters ||= site.converters.select { |c| c.matches(ext) }.sort end # Render Liquid in the content # # content - the raw Liquid content to render # payload - the payload for Liquid # info - the info for Liquid # # Returns the converted content 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 rescue Exception => e Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{path || self.path}" raise e end # Convert this Convertible's data to a Hash suitable for use by Liquid. # # Returns the Hash representation of this Convertible. def to_liquid(attrs = nil) further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map do |attribute| [attribute, send(attribute)] end] defaults = site.frontmatter_defaults.all(relative_path, type) Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data) end # The type of a document, # i.e., its classname downcase'd and to_sym'd. # # Returns the type of self. def type if is_a?(Page) :pages end end # returns the owner symbol for hook triggering def hook_owner if is_a?(Page) :pages end end # Determine whether the document is an asset file. # Asset files include CoffeeScript files and Sass/SCSS files. # # Returns true if the extname belongs to the set of extensions # that asset files use. def asset_file? 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. # # Always returns true. def render_with_liquid? true end # Determine whether the file should be placed into layouts. # # Returns false if the document is an asset file. def place_in_layout? !asset_file? end # Checks if the layout specified in the document actually exists # # layout - the layout to check # # Returns true if the layout is invalid, false if otherwise def invalid_layout?(layout) !data["layout"].nil? && layout.nil? && !(self.is_a? Jekyll::Excerpt) end # Recursively render layouts # # layouts - a list of the layouts # payload - the payload for Liquid # info - the info for Liquid # # Returns nothing def render_all_layouts(layouts, payload, info) # recursively render layouts layout = layouts[data["layout"]] Jekyll.logger.warn("Build Warning:", "Layout '#{data["layout"]}' requested in #{path} does not exist.") if invalid_layout? layout used = Set.new([layout]) # Reset the payload layout data to ensure it starts fresh for each page. payload["layout"] = nil while layout Jekyll.logger.debug "Rendering Layout:", path payload["content"] = output payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) self.output = render_liquid(layout.content, payload, info, 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) layout = nil # avoid recursive chain else used << layout end end end end # Add any necessary layouts to this convertible document. # # payload - The site payload Drop or Hash. # layouts - A Hash of {"name" => "layout"}. # # 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"] = converters.first.highlighter_prefix payload["highlighter_suffix"] = converters.first.highlighter_suffix 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. # # dest - The String path to the destination dir. # # Returns nothing. def write(dest) path = destination(dest) FileUtils.mkdir_p(File.dirname(path)) 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. # # property - The String name of the property to retrieve. # # Returns the String value or nil if the property isn't included. def [](property) if self.class::ATTRIBUTES_FOR_LIQUID.include?(property) send(property) else data[property] end end end end jekyll-3.1.6/lib/jekyll/deprecator.rb000066400000000000000000000035661271741406300175470ustar00rootroot00000000000000module Jekyll module Deprecator 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'." arg_is_present? args, "--no-auto", "To disable auto-replication, simply leave off \ the '--watch' switch." arg_is_present? args, "--pygments", "The 'pygments'settings has been removed in \ favour of 'highlighter'." 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 no_subcommand(args) if args.size > 0 && args.first =~ /^--/ && !%w(--help --version).include?(args.first) deprecation_message "Jekyll now uses subcommands instead of just switches. Run `jekyll help` to find out more." abort end end def arg_is_present?(args, deprecated_argument, message) if args.include?(deprecated_argument) deprecation_message(message) end end def deprecation_message(message) Jekyll.logger.error "Deprecation:", message 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 jekyll-3.1.6/lib/jekyll/document.rb000066400000000000000000000325351271741406300172330ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll class Document include Comparable attr_reader :path, :site, :extname, :collection attr_accessor :content, :output YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m DATELESS_FILENAME_MATCHER = /^(.+\/)*(.*)(\.[^.]+)$/ DATE_FILENAME_MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ # Create a new Document. # # path - the path to the file # relations - a hash with keys :site and :collection, the values of which # are the Jekyll::Site and Jekyll::Collection to which this # Document belong. # # Returns nothing. def initialize(path, relations = {}) @site = relations[:site] @path = path @extname = File.extname(path) @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 |_, key| site.frontmatter_defaults.find(relative_path, collection.label, key) end trigger_hooks(:post_init) end # Fetch the Document's data. # # Returns a Hash containing the data. An empty hash is returned if # no data was read. def data @data ||= {} end # Merge some data in with this document's data. # # Returns the merged data. def merge_data!(other, source: "YAML front matter") 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 #{source}." ) 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 @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s end # The output extension of the document. # # Returns the output extension def output_ext Jekyll::Renderer.new(site, self).output_ext end # The base filename of the document, without the file extname. # # Returns the basename without the file extname. def basename_without_ext @basename_without_ext ||= File.basename(path, '.*') end # The base filename of the document. # # Returns the base filename of the document. def basename @basename ||= File.basename(path) end # Produces a "cleaned" relative path. # The "cleaned" relative path is the relative path without the extname # and with the collection's directory removed as well. # This method is useful when building the URL of the document. # # Examples: # When relative_path is "_methods/site/generate.md": # cleaned_relative_path # # => "/site/generate" # # Returns the cleaned relative path of the document. def cleaned_relative_path @cleaned_relative_path ||= relative_path[0..-extname.length - 1].sub(collection.relative_directory, "") end # Determine whether the document is a YAML file. # # Returns true if the extname is either .yml or .yaml, false otherwise. def yaml_file? %w(.yaml .yml).include?(extname) end # Determine whether the document is an asset file. # Asset files include CoffeeScript files and Sass/SCSS files. # # Returns true if the extname belongs to the set of extensions # that asset files use. def asset_file? 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. # # Returns false if the document is either an asset file or a yaml file, # true otherwise. def render_with_liquid? !(coffeescript_file? || yaml_file?) 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. def place_in_layout? !(asset_file? || yaml_file?) end # The URL template where the document would be accessible. # # Returns the URL template for the document. def url_template collection.url_template end # Construct a Hash of key-value pairs which contain a mapping between # a key in the URL template and the corresponding value for this document. # # Returns the Hash of key-value pairs for replacement in the URL. def url_placeholders @url_placeholders ||= Drops::UrlDrop.new(self) end # The permalink for this Document. # Permalink is set via the data Hash. # # Returns the permalink or nil if no permalink was set in the data. def permalink data && data.is_a?(Hash) && data['permalink'] end # The computed URL for the document. See `Jekyll::URL#to_s` for more details. # # Returns the computed URL for the document. def url @url = URL.new({ :template => url_template, :placeholders => url_placeholders, :permalink => permalink }).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) dest = site.in_dest_dir(base_directory) path = site.in_dest_dir(dest, URL.unescape_path(url)) if url.end_with? "/" path = File.join(path, "index.html") else path << output_ext unless path.end_with? output_ext end path end # Write the generated Document file to the destination directory. # # dest - The String path to the destination dir. # # Returns nothing. def write(dest) path = destination(dest) FileUtils.mkdir_p(File.dirname(path)) File.open(path, 'wb') do |f| f.write(output) end trigger_hooks(:post_write) end # Whether the file is published or not, as indicated in YAML front-matter # # Returns true if the 'published' key is specified in the YAML front-matter and not `false`. def published? !(data.key?('published') && data['published'] == false) end # Read in the file and assign the content and data based on the file contents. # Merge the frontmatter of the file with the frontmatter default # values # # Returns nothing. def read(opts = {}) Jekyll.logger.debug "Reading:", relative_path if yaml_file? @data = SafeYAML.load_file(path) else begin defaults = @site.frontmatter_defaults.all(relative_path, collection.label.to_sym) merge_data!(defaults, source: "front matter defaults") unless defaults.empty? self.content = File.read(path, Utils.merged_file_read_opts(site, opts)) if content =~ YAML_FRONT_MATTER_REGEXP self.content = $POSTMATCH data_file = SafeYAML.load(Regexp.last_match(1)) merge_data!(data_file, source: "YAML front matter") if data_file end post_read rescue SyntaxError => e Jekyll.logger.error "Error:", "YAML Exception reading #{path}: #{e.message}" rescue Exception => e if e.is_a? Jekyll::Errors::FatalException raise e end Jekyll.logger.error "Error:", "could not read file #{path}: #{e.message}" end end end def post_read if relative_path =~ DATE_FILENAME_MATCHER date, slug, ext = $2, $3, $4 if !data['date'] || data['date'].to_i == site.time.to_i merge_data!({"date" => date}, source: "filename") end elsif relative_path =~ DATELESS_FILENAME_MATCHER slug, ext = $2, $3 end # Try to ensure the user gets a title. data["title"] ||= Utils.titleize_slug(slug) # Only overwrite slug & ext if they aren't specified. data['slug'] ||= slug data['ext'] ||= ext populate_categories populate_tags generate_excerpt 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 }, source: "file path") end def populate_categories merge_data!({ 'categories' => ( Array(data['categories']) + Utils.pluralized_array_from_hash(data, 'category', 'categories') ).map(&: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 @to_liquid ||= Drops::DocumentDrop.new(self) end # The inspect string for this document. # Includes the relative path and the collection label. # # Returns the inspect string for this document. def inspect "#" end # The string representation for this document. # # Returns the content of the document def to_s output || content || 'NO CONTENT' end # Compare this document against another document. # Comparison is a comparison between the 2 paths of the documents. # # 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 <=>(other) return nil unless other.respond_to?(:data) cmp = data['date'] <=> other.data['date'] cmp = path <=> other.path if cmp.nil? || cmp == 0 cmp end # Determine whether this document should be written. # Based on the Collection to which it belongs. # # True if the document has a collection and if that collection's #write? # method returns true, otherwise false. def write? 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 private # :nodoc: def generate_excerpt if generate_excerpt? data["excerpt"] ||= Jekyll::Excerpt.new(self) end end end end jekyll-3.1.6/lib/jekyll/drops/000077500000000000000000000000001271741406300162075ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/drops/collection_drop.rb000066400000000000000000000006341271741406300217160ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class CollectionDrop < Drop extend Forwardable mutable false def_delegator :@obj, :write?, :output def_delegators :@obj, :label, :docs, :files, :directory, :relative_directory def to_s docs.to_s end private def_delegator :@obj, :metadata, :fallback_data end end end jekyll-3.1.6/lib/jekyll/drops/document_drop.rb000066400000000000000000000030601271741406300213750ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class DocumentDrop < Drop extend Forwardable NESTED_OBJECT_FIELD_BLACKLIST = %w{ content output excerpt next previous }.freeze mutable false def_delegator :@obj, :relative_path, :path def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url def collection @obj.collection.label end def excerpt fallback_data['excerpt'].to_s end def previous @obj.previous_doc.to_liquid end def next @obj.next_doc.to_liquid end # Generate a Hash for use in generating JSON. # This is useful if fields need to be cleared before the JSON can generate. # # Returns a Hash ready for JSON generation. def hash_for_json(state = nil) to_h.tap do |hash| if state && state.depth >= 2 hash["previous"] = collapse_document(hash["previous"]) if hash["previous"] hash["next"] = collapse_document(hash["next"]) if hash["next"] end end end # Generate a Hash which breaks the recursive chain. # Certain fields which are normally available are omitted. # # Returns a Hash with only non-recursive fields present. def collapse_document(doc) doc.keys.each_with_object({}) do |(key, _), result| result[key] = doc[key] unless NESTED_OBJECT_FIELD_BLACKLIST.include?(key) end end private def_delegator :@obj, :data, :fallback_data end end end jekyll-3.1.6/lib/jekyll/drops/drop.rb000066400000000000000000000135651271741406300175120ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class Drop < Liquid::Drop include Enumerable NON_CONTENT_METHODS = [:fallback_data, :collapse_document].freeze # Get or set whether the drop class is mutable. # Mutability determines whether or not pre-defined fields may be # overwritten. # # is_mutable - Boolean set mutability of the class (default: nil) # # Returns the mutability of the class def self.mutable(is_mutable = nil) if is_mutable @is_mutable = is_mutable else @is_mutable = false end end def self.mutable? @is_mutable end # Create a new Drop # # obj - the Jekyll Site, Collection, or Document required by the # drop. # # Returns nothing def initialize(obj) @obj = obj @mutations = {} # only if mutable: true end # Access a method in the Drop or a field in the underlying hash data. # If mutable, checks the mutations first. Then checks the methods, # and finally check the underlying hash (e.g. document front matter) # if all the previous places didn't match. # # key - the string key whose value to fetch # # Returns the value for the given key, or nil if none exists def [](key) if self.class.mutable? && @mutations.key?(key) @mutations[key] elsif self.class.invokable? key public_send key else fallback_data[key] end end # Set a field in the Drop. If mutable, sets in the mutations and # returns. If not mutable, checks first if it's trying to override a # Drop method and raises a DropMutationException if so. If not # mutable and the key is not a method on the Drop, then it sets the # key to the value in the underlying hash (e.g. document front # matter) # # key - the String key whose value to set # val - the Object to set the key's value to # # Returns the value the key was set to unless the Drop is not mutable # and the key matches a method in which case it raises a # DropMutationException. def []=(key, val) if respond_to?("#{key}=") public_send("#{key}=", val) elsif respond_to? key if self.class.mutable? @mutations[key] = val else raise Errors::DropMutationException, "Key #{key} cannot be set in the drop." end else fallback_data[key] = val end end # Generates a list of strings which correspond to content getter # methods. # # Returns an Array of strings which represent method-specific keys. def content_methods @content_methods ||= ( self.class.instance_methods - Jekyll::Drops::Drop.instance_methods - NON_CONTENT_METHODS ).map(&:to_s).reject do |method| method.end_with?("=") end end # Check if key exists in Drop # # key - the string key whose value to fetch # # Returns true if the given key is present def key?(key) if self.class.mutable && @mutations.key?(key) true else respond_to?(key) || fallback_data.key?(key) end end # Generates a list of keys with user content as their values. # This gathers up the Drop methods and keys of the mutations and # underlying data hashes and performs a set union to ensure a list # of unique keys for the Drop. # # Returns an Array of unique keys for content for the Drop. def keys (content_methods | @mutations.keys | fallback_data.keys).flatten end # Generate a Hash representation of the Drop by resolving each key's # value. It includes Drop methods, mutations, and the underlying object's # data. See the documentation for Drop#keys for more. # # Returns a Hash with all the keys and values resolved. def to_h keys.each_with_object({}) do |(key, _), result| result[key] = self[key] end end alias_method :to_hash, :to_h # Inspect the drop's keys and values through a JSON representation # of its keys and values. # # Returns a pretty generation of the hash representation of the Drop. def inspect require 'json' JSON.pretty_generate to_h end # Generate a Hash for use in generating JSON. # This is useful if fields need to be cleared before the JSON can generate. # # Returns a Hash ready for JSON generation. def hash_for_json(state = nil) to_h end # Generate a JSON representation of the Drop. # # Returns a JSON representation of the Drop in a String. def to_json(state = nil) require 'json' JSON.generate(hash_for_json(state), state) end # Collects all the keys and passes each to the block in turn. # # block - a block which accepts one argument, the key # # Returns nothing. def each_key(&block) keys.each(&block) end def each(&block) each_key.each do |key| yield key, self[key] end end def merge(other, &block) self.dup.tap do |me| if block.nil? me.merge!(other) else me.merge!(other, block) end end end def merge!(other) other.each_key do |key| if block_given? self[key] = yield key, self[key], other[key] else if Utils.mergable?(self[key]) && Utils.mergable?(other[key]) self[key] = Utils.deep_merge_hashes(self[key], other[key]) next end self[key] = other[key] unless other[key].nil? end end end end end end jekyll-3.1.6/lib/jekyll/drops/excerpt_drop.rb000066400000000000000000000003131271741406300212270ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class ExcerptDrop < DocumentDrop def layout @obj.doc.data['layout'] end def excerpt nil end end end end jekyll-3.1.6/lib/jekyll/drops/jekyll_drop.rb000066400000000000000000000010241271741406300210470ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class JekyllDrop < Liquid::Drop class << self def global @global ||= JekyllDrop.new end end def version Jekyll::VERSION end def environment Jekyll.env end def to_h @to_h ||= { "version" => version, "environment" => environment } end def to_json(state = nil) require 'json' JSON.generate(to_h, state) end end end end jekyll-3.1.6/lib/jekyll/drops/site_drop.rb000066400000000000000000000015541271741406300205310ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class SiteDrop < Drop extend Forwardable mutable false def_delegator :@obj, :site_data, :data def_delegators :@obj, :time, :pages, :static_files, :documents, :tags, :categories def [](key) if @obj.collections.key?(key) && key != "posts" @obj.collections[key].docs else super(key) end end def posts @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a } end def html_pages @site_html_pages ||= @obj.pages.select { |page| page.html? || page.url.end_with?("/") } end def collections @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid) end private def_delegator :@obj, :config, :fallback_data end end end jekyll-3.1.6/lib/jekyll/drops/unified_payload_drop.rb000066400000000000000000000006711271741406300227200ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class UnifiedPayloadDrop < Drop mutable true attr_accessor :page, :layout, :content, :paginator attr_accessor :highlighter_prefix, :highlighter_suffix def jekyll JekyllDrop.global end def site @site_drop ||= SiteDrop.new(@obj) end private def fallback_data @fallback_data ||= {} end end end end jekyll-3.1.6/lib/jekyll/drops/url_drop.rb000066400000000000000000000030521271741406300203620ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Drops class UrlDrop < Drop extend Forwardable mutable false def_delegator :@obj, :cleaned_relative_path, :path def_delegator :@obj, :output_ext, :output_ext def collection @obj.collection.label end def name Utils.slugify(@obj.basename_without_ext) end def title Utils.slugify(@obj.data['slug'], :mode => "pretty", :cased => true) || Utils.slugify(@obj.basename_without_ext, :mode => "pretty", :cased => true) end def slug Utils.slugify(@obj.data['slug']) || Utils.slugify(@obj.basename_without_ext) end def categories category_set = Set.new Array(@obj.data['categories']).each do |category| category_set << category.to_s.downcase end category_set.to_a.join('/') end def year @obj.date.strftime("%Y") end def month @obj.date.strftime("%m") end def day @obj.date.strftime("%d") end def hour @obj.date.strftime("%H") end def minute @obj.date.strftime("%M") end def second @obj.date.strftime("%S") end def i_day @obj.date.strftime("%-d") end def i_month @obj.date.strftime("%-m") end def short_month @obj.date.strftime("%b") end def short_year @obj.date.strftime("%y") end def y_day @obj.date.strftime("%j") end end end end jekyll-3.1.6/lib/jekyll/entry_filter.rb000066400000000000000000000033561271741406300201220ustar00rootroot00000000000000module Jekyll class EntryFilter SPECIAL_LEADING_CHARACTERS = ['.', '_', '#'].freeze attr_reader :site def initialize(site, base_directory = nil) @site = site @base_directory = derive_base_directory(@site, base_directory.to_s.dup) end def base_directory @base_directory.to_s end def derive_base_directory(site, base_dir) if base_dir.start_with?(site.source) base_dir[site.source] = "" end base_dir end def relative_to_source(entry) File.join(base_directory, entry) end def filter(entries) entries.reject do |e| unless included?(e) special?(e) || backup?(e) || excluded?(e) || symlink?(e) end end end def included?(entry) glob_include?(site.include, entry) end def special?(entry) SPECIAL_LEADING_CHARACTERS.include?(entry[0..0]) || SPECIAL_LEADING_CHARACTERS.include?(File.basename(entry)[0..0]) end def backup?(entry) entry[-1..-1] == '~' end def excluded?(entry) excluded = glob_include?(site.exclude, relative_to_source(entry)) Jekyll.logger.debug "EntryFilter:", "excluded #{relative_to_source(entry)}" if excluded excluded end def symlink?(entry) File.symlink?(entry) && site.safe end def ensure_leading_slash(path) path[0..0] == "/" ? path : "/#{path}" end # Returns true if path matches against any glob pattern. # Look for more detail about glob pattern in method File::fnmatch. def glob_include?(enum, e) entry = ensure_leading_slash(e) enum.any? do |exp| item = ensure_leading_slash(exp) File.fnmatch?(item, entry) || entry.start_with?(item) end end end end jekyll-3.1.6/lib/jekyll/errors.rb000066400000000000000000000005101271741406300167150ustar00rootroot00000000000000module Jekyll module Errors FatalException = Class.new(::RuntimeError) DropMutationException = Class.new(FatalException) InvalidPermalinkError = Class.new(FatalException) InvalidYAMLFrontMatterError = Class.new(FatalException) MissingDependencyException = Class.new(FatalException) end end jekyll-3.1.6/lib/jekyll/excerpt.rb000066400000000000000000000060161271741406300170620ustar00rootroot00000000000000module Jekyll class Excerpt extend Forwardable attr_accessor :doc attr_accessor :content, :ext attr_writer :output def_delegators :@doc, :site, :name, :ext, :relative_path, :extname, :render_with_liquid?, :collection, :related_posts, :url # Initialize this Excerpt instance. # # doc - The Document. # # Returns the new Excerpt. def initialize(doc) self.doc = doc self.content = extract_excerpt(doc.content) end # Fetch YAML front-matter data from related doc, without layout key # # Returns Hash of doc data def data @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 doc this excerpt belongs to with #excerpt appended def path File.join(doc.path, "#excerpt") end # Check if excerpt includes a string # # Returns true if the string passed in def include?(something) (output && output.include?(something)) || content.include?(something) end # The UID for this doc (useful in feeds). # e.g. /2008/11/05/my-awesome-doc # # Returns the String UID. def id "#{doc.id}#excerpt" end def to_s output || content end def to_liquid Jekyll::Drops::ExcerptDrop.new(self) end # Returns the shorthand String identifier of this doc. def inspect "" 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 doc: everything before # the first two new lines: # # --- # title: Example # --- # # First paragraph with [link][1]. # # Second paragraph. # # [1]: http://example.com/ # # This is fairly good option for Markdown and Textile files. But might cause # 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 docs: # # # file: _config.yml # excerpt_separator: "" # # Notice that all markdown-style link references will be appended to the # excerpt. So the example doc above will have this excerpt source: # # First paragraph with [link][1]. # # [1]: http://example.com/ # # Excerpts are rendered same time as content is rendered. # # Returns excerpt String def extract_excerpt(doc_content) head, _, tail = doc_content.to_s.partition(doc.excerpt_separator) if tail.empty? head else "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n") end end end end jekyll-3.1.6/lib/jekyll/external.rb000066400000000000000000000032251271741406300172310ustar00rootroot00000000000000module 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, &block) Array(names).each do |name| begin require name rescue LoadError Jekyll.logger.debug "Couldn't load #{name}. Skipping." block.call(name) if block 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 Jekyll.logger.debug "Requiring:", "#{name}" 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 jekyll-3.1.6/lib/jekyll/filters.rb000066400000000000000000000220061271741406300170550ustar00rootroot00000000000000require 'uri' require 'json' require 'date' module Jekyll module Filters # Convert a Markdown string into HTML output. # # input - The Markdown String to convert. # # Returns the HTML formatted String. def markdownify(input) site = @context.registers[:site] converter = site.find_converter_instance(Jekyll::Converters::Markdown) converter.convert(input) end # Convert a Markdown string into HTML output. # # input - The Markdown String to convert. # # Returns the HTML formatted String. def smartify(input) site = @context.registers[:site] converter = site.find_converter_instance(Jekyll::Converters::SmartyPants) converter.convert(input) end # Convert a Sass string into CSS output. # # input - The Sass String to convert. # # 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.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. # # Returns the formatting String. def date_to_string(date) time(date).strftime("%d %b %Y") end # Format a date in long format e.g. "27 January 2011". # # date - The Time to format. # # Returns the formatted String. def date_to_long_string(date) time(date).strftime("%d %B %Y") end # Format a date for use in XML. # # date - The Time to format. # # Examples # # date_to_xmlschema(Time.now) # # => "2011-04-24T20:34:46+08:00" # # Returns the formatted String. def date_to_xmlschema(date) time(date).xmlschema end # Format a date according to RFC-822 # # date - The Time to format. # # Examples # # date_to_rfc822(Time.now) # # => "Sun, 24 Apr 2011 12:34:46 +0000" # # Returns the formatted String. def date_to_rfc822(date) time(date).rfc822 end # XML escape a string for use. Replaces any special characters with # appropriate HTML entity replacements. # # input - The String to escape. # # Examples # # xml_escape('foo "bar" ') # # => "foo "bar" <baz>" # # Returns the escaped String. def xml_escape(input) CGI.escapeHTML(input.to_s) end # CGI escape a string for use in a URL. Replaces any special characters # with appropriate %XX replacements. # # input - The String to escape. # # Examples # # cgi_escape('foo,bar;baz?') # # => "foo%2Cbar%3Bbaz%3F" # # Returns the escaped String. def cgi_escape(input) CGI::escape(input) end # URI escape a string. # # input - The String to escape. # # Examples # # uri_escape('foo, bar \\baz?') # # => "foo,%20bar%20%5Cbaz?" # # Returns the escaped String. def uri_escape(input) URI.escape(input) end # Count the number of words in the input string. # # input - The String on which to operate. # # Returns the Integer word count. def number_of_words(input) input.split.length end # Join an array of things into a string by separating with commas and the # word "and" for the last one. # # array - The Array of Strings to join. # # Examples # # array_to_sentence_string(["apples", "oranges", "grapes"]) # # => "apples, oranges, and grapes" # # Returns the formatted String. def array_to_sentence_string(array) connector = "and" case array.length when 0 "" when 1 array[0].to_s when 2 "#{array[0]} #{connector} #{array[1]}" else "#{array[0...-1].join(', ')}, #{connector} #{array[-1]}" end end # Convert the input into json string # # input - The Array or Hash to be converted # # Returns the converted json string def jsonify(input) as_liquid(input).to_json end # Group an array of items by a property # # input - the inputted Enumerable # property - the property # # Returns an array of Hashes, each looking something like this: # {"name" => "larry" # "items" => [...] } # all the items where `property` == "larry" def group_by(input, property) if groupable?(input) input.group_by do |item| item_property(item, property).to_s end.inject([]) do |memo, i| memo << { "name" => i.first, "items" => i.last } end else input end end # Filter an array of objects # # input - the object array # 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?(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 # # input - the object array # property - property within each object to filter by # nils ('first' | 'last') - nils appear before or after non-nil values # # 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 case when nils == "first" order = - 1 when nils == "last" order = + 1 else raise ArgumentError.new("Invalid nils order: " \ "'#{nils}' is not a valid nils order. It must be 'first' or 'last'.") end input.sort do |apple, orange| apple_property = item_property(apple, property) orange_property = item_property(orange, property) if !apple_property.nil? && orange_property.nil? - order elsif apple_property.nil? && !orange_property.nil? + order else apple_property <=> orange_property end end 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 def sample(input, num = 1) return input unless input.respond_to?(:sample) n = num.to_i rescue 1 if n == 1 input.sample else input.sample(n) end 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 Time.at(input) else Jekyll.logger.error "Invalid Date:", "'#{input}' is not a valid datetime." exit(1) end.localtime end def groupable?(element) element.respond_to?(:group_by) end def item_property(item, property) if item.respond_to?(:to_liquid) item.to_liquid[property.to_s] elsif item.respond_to?(:data) item.data[property.to_s] else 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 jekyll-3.1.6/lib/jekyll/frontmatter_defaults.rb000066400000000000000000000133751271741406300216520ustar00rootroot00000000000000module Jekyll # This class handles custom defaults for YAML frontmatter settings. # These are set in _config.yml and apply both to internal use (e.g. layout) # and the data available to liquid. # # It is exposed via the frontmatter_defaults method on the site class. class FrontmatterDefaults # Initializes a new instance. def initialize(site) @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 def ensure_time!(set) return set unless set.key?('values') && set['values'].key?('date') return set if set['values']['date'].is_a?(Time) set['values']['date'] = Utils.parse_date(set['values']['date'], "An invalid date format was found in a front-matter default set: #{set}") 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 # type - a symbol indicating whether a :page, a :post or a :draft calls this method # # Returns the default value or nil if none was found def find(path, type, setting) value = nil old_scope = nil matching_sets(path, type).each do |set| if set['values'].key?(setting) && has_precedence?(old_scope, set['scope']) value = set['values'][setting] old_scope = set['scope'] end end value end # Collects a hash with all default values for a page or post # # path - the relative path of the page or post # type - a symbol indicating the type (:post, :page or :draft) # # Returns a hash with all default values (an empty hash if there are none) def all(path, type) defaults = {} old_scope = nil matching_sets(path, type).each do |set| if has_precedence?(old_scope, set['scope']) defaults = Utils.deep_merge_hashes(defaults, set['values']) old_scope = set['scope'] else defaults = Utils.deep_merge_hashes(set['values'], defaults) end end defaults end private # Checks if a given default setting scope matches the given path and type # # scope - the hash indicating the scope, as defined in _config.yml # path - the path to check for # type - the type (:post, :page or :draft) to check for # # Returns true if the scope applies to the given path and type def applies?(scope, path, type) applies_path?(scope, path) && applies_type?(scope, type) end def applies_path?(scope, path) return true if !scope.key?('path') || scope['path'].empty? scope_path = Pathname.new(scope['path']) Pathname.new(sanitize_path(path)).ascend do |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.key?('type') || scope['type'].eql?(type.to_s) end # Checks if a given set of default values is valid # # set - the default value hash, as defined in _config.yml # # Returns true if the set is valid and can be used in this class def valid?(set) set.is_a?(Hash) && set['values'].is_a?(Hash) end # Determines if a new scope has precedence over an old one # # old_scope - the old scope hash, or nil if there's none # new_scope - the new scope hash # # Returns true if the new scope has precedence over the older def has_precedence?(old_scope, new_scope) return true if old_scope.nil? new_path = sanitize_path(new_scope['path']) old_path = sanitize_path(old_scope['path']) if new_path.length != old_path.length new_path.length >= old_path.length elsif new_scope.key? 'type' true else !old_scope.key? 'type' end end # Collects a list of sets that match the given path and type # # Returns an array of hashes def matching_sets(path, type) valid_sets.select do |set| !set.key?('scope') || applies?(set['scope'], path, type) end end # Returns a list of valid sets # # This is not cached to allow plugins to modify the configuration # and have their changes take effect # # Returns an array of hashes def valid_sets sets = @site.config['defaults'] return [] unless sets.is_a?(Array) sets.map do |set| if valid?(set) ensure_time!(update_deprecated_types(set)) else Jekyll.logger.warn "Defaults:", "An invalid front-matter default set was found:" Jekyll.logger.warn "#{set}" nil end end.compact end # 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') end end end end jekyll-3.1.6/lib/jekyll/generator.rb000066400000000000000000000000621271741406300173710ustar00rootroot00000000000000module Jekyll Generator = Class.new(Plugin) end jekyll-3.1.6/lib/jekyll/hooks.rb000066400000000000000000000051771271741406300165420ustar00rootroot00000000000000module 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 jekyll-3.1.6/lib/jekyll/layout.rb000066400000000000000000000020261271741406300167220ustar00rootroot00000000000000module Jekyll class Layout include Convertible # Gets the Site object. attr_reader :site # 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 # Gets/Sets the Hash that holds the metadata for this layout. attr_accessor :data # Gets/Sets the content of this layout. attr_accessor :content # Initialize a new Layout. # # site - The Site. # base - The String path to the source. # name - The String filename of the post file. def initialize(site, base, name) @site = site @base = base @name = name @path = site.in_source_dir(base, name) self.data = {} process(name) read_yaml(base, name) end # Extract information from the layout filename. # # name - The String filename of the layout file. # # Returns nothing. def process(name) self.ext = File.extname(name) end end end jekyll-3.1.6/lib/jekyll/liquid_extensions.rb000066400000000000000000000007611271741406300211570ustar00rootroot00000000000000module Jekyll module LiquidExtensions # Lookup a Liquid variable in the given context. # # context - the Liquid context in question. # variable - the variable name, as a string. # # Returns the value of the variable in the context # or the variable name if not found. def lookup_variable(context, variable) lookup = context variable.split(".").each do |value| lookup = lookup[value] end lookup || variable end end end jekyll-3.1.6/lib/jekyll/liquid_renderer.rb000066400000000000000000000015411271741406300205630ustar00rootroot00000000000000require '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 @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 jekyll-3.1.6/lib/jekyll/liquid_renderer/000077500000000000000000000000001271741406300202355ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/liquid_renderer/file.rb000066400000000000000000000016771271741406300215140ustar00rootroot00000000000000module 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, line_numbers: true) 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 jekyll-3.1.6/lib/jekyll/liquid_renderer/table.rb000066400000000000000000000036641271741406300216620ustar00rootroot00000000000000module 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 { |_, file_stats| -file_stats[:time] } sorted = sorted.slice(0, n) table = [%w(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 jekyll-3.1.6/lib/jekyll/log_adapter.rb000066400000000000000000000057361271741406300177010ustar00rootroot00000000000000module Jekyll class LogAdapter attr_reader :writer, :messages LOG_LEVELS = { :debug => ::Logger::DEBUG, :info => ::Logger::INFO, :warn => ::Logger::WARN, :error => ::Logger::ERROR } # 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 # Public: Set the log level on the writer # # level - (symbol) the log level # # Returns nothing def log_level=(level) writer.level = LOG_LEVELS.fetch(level) end 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 # # Returns nothing def debug(topic, message = nil) writer.debug(message(topic, message)) end # Public: Print a message # # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. # message - the message detail # # Returns nothing def info(topic, message = nil) writer.info(message(topic, message)) end # Public: Print a message # # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. # message - the message detail # # Returns nothing def warn(topic, message = nil) writer.warn(message(topic, message)) end # Public: Print an error message # # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. # message - the message detail # # Returns nothing def error(topic, message = nil) writer.error(message(topic, message)) end # 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) # # Returns nothing def abort_with(topic, message = nil) error(topic, message) abort end # 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) msg = formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ') messages << msg msg end # Internal: Format the topic # # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc. # # Returns the formatted topic statement def formatted_topic(topic) "#{topic} ".rjust(20) end end end jekyll-3.1.6/lib/jekyll/mime.types000066400000000000000000001743221271741406300171060ustar00rootroot00000000000000# Woah there. Do not edit this file directly. # This file is generated automatically by script/vendor-mimes. 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 icejekyll-3.1.6/lib/jekyll/page.rb000066400000000000000000000106051271741406300163230ustar00rootroot00000000000000module Jekyll class Page include Convertible attr_writer :dir attr_accessor :site, :pager attr_accessor :name, :ext, :basename attr_accessor :data, :content, :output alias_method :extname, :ext FORWARD_SLASH = '/'.freeze # Attributes for Liquid templates ATTRIBUTES_FOR_LIQUID = %w( content dir name path url ) # A set of extensions that are considered HTML or HTML-like so we # should not alter them, this includes .xhtml through XHTM5. HTML_EXTENSIONS = %W( .html .xhtml .htm ) # Initialize a new Page. # # site - The Site object. # base - The String path to the source. # dir - The String path between the source and the file. # name - The String filename of the file. def initialize(site, base, dir, name) @site = site @base = base @dir = dir @name = name process(name) read_yaml(File.join(base, dir), name) data.default_proc = proc do |_, 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 # upon generation. This is derived from the permalink or, if # permalink is absent, we be '/' # # Returns the String destination directory. def dir if url.end_with?(FORWARD_SLASH) url else url_dir = File.dirname(url) url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/" end end # The full path and filename of the post. Defined in the YAML of the post # body. # # Returns the String permalink or nil if none has been set. def permalink data.nil? ? nil : data['permalink'] end # The template of the permalink. # # Returns the template String. def template if !html? "/:path/:basename:output_ext" elsif index? "/:path/" else Utils.add_permalink_suffix("/:path/:basename", site.permalink_style) end end # The generated relative url of this page. e.g. /about.html. # # 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 { :path => @dir, :basename => basename, :output_ext => output_ext } end # Extract information from the page filename. # # name - The String filename of the page file. # # Returns nothing. def process(name) self.ext = File.extname(name) self.basename = name[0..-ext.length - 1] end # Add any necessary layouts to this post # # layouts - The Hash of {"name" => "layout"}. # site_payload - The site payload Hash. # # Returns nothing. def render(layouts, site_payload) site_payload["page"] = to_liquid site_payload["paginator"] = pager.to_liquid do_layout(site_payload, layouts) end # The path to the source file # # Returns the path to the source file def path data.fetch('path') { relative_path.sub(/\A\//, '') } end # The path to the page source file, relative to the site source def relative_path File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)) end # Obtain destination path. # # dest - The String path to the destination dir. # # Returns the destination file path String. def destination(dest) path = site.in_dest_dir(dest, URL.unescape_path(url)) path = File.join(path, "index") if url.end_with?("/") path << output_ext unless path.end_with? output_ext path end # Returns the object as a debug String. def inspect "#" end # Returns the Boolean of whether this Page is HTML or not. def html? HTML_EXTENSIONS.include?(output_ext) end # Returns the Boolean of whether this Page is an index file or not. def index? basename == 'index' end def trigger_hooks(hook_name, *args) Jekyll::Hooks.trigger :pages, hook_name, self, *args end def write? true end end end jekyll-3.1.6/lib/jekyll/plugin.rb000066400000000000000000000042761271741406300167140ustar00rootroot00000000000000module Jekyll class Plugin PRIORITIES = { :low => -10, :highest => 100, :lowest => -100, :normal => 0, :high => 10 } # def self.inherited(const) return catch_inheritance(const) do |const_| catch_inheritance(const_) end end # def self.catch_inheritance(const) const.define_singleton_method :inherited do |const_| (@children ||= Set.new).add const_ if block_given? yield const_ end end end # def self.descendants @children ||= Set.new out = @children.map(&:descendants) out << self unless superclass == Plugin Set.new(out).flatten end # Get or set the priority of this plugin. When called without an # argument it returns the priority. When an argument is given, it will # set the priority. # # priority - The Symbol priority (default: nil). Valid options are: # :lowest, :low, :normal, :high, :highest # # Returns the Symbol priority. def self.priority(priority = nil) @priority ||= nil if priority && PRIORITIES.key?(priority) @priority = priority end @priority || :normal end # Get or set the safety of this plugin. When called without an argument # it returns the safety. When an argument is given, it will set the # safety. # # safe - The Boolean safety (default: nil). # # Returns the safety Boolean. def self.safe(safe = nil) if safe @safe = safe end @safe || false end # Spaceship is priority [higher -> lower] # # other - The class to be compared. # # Returns -1, 0, 1. def self.<=>(other) 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. # # Returns a new instance. def initialize(config = {}) # no-op for default end end end jekyll-3.1.6/lib/jekyll/plugin_manager.rb000066400000000000000000000056131271741406300204020ustar00rootroot00000000000000module Jekyll class PluginManager attr_reader :site # Create an instance of this class. # # site - the instance of Jekyll::Site we're concerned with # # Returns nothing def initialize(site) @site = site end # Require all the plugins which are allowed. # # Returns nothing def conscientious_require require_plugin_files require_gems deprecation_checks end # Require each of the gem plugins specified. # # Returns nothing. def require_gems Jekyll::External.require_with_graceful_fail(site.gems.select { |gem| plugin_allowed?(gem) }) 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 # # Returns true if the gem name is in the whitelist or if the site is not # in safe mode. def plugin_allowed?(gem_name) !site.safe || whitelist.include?(gem_name) end # Build an array of allowed plugin gem names. # # Returns an array of strings, each string being the name of a gem name # that is allowed to be used. def whitelist @whitelist ||= Array[site.config['whitelist']].flatten end # Require all .rb files if safe mode is off # # Returns nothing. def require_plugin_files unless site.safe plugins_path.each do |plugin_search_path| plugin_files = Utils.safe_glob(plugin_search_path, File.join("**", "*.rb")) Jekyll::External.require_with_graceful_fail(plugin_files) end end end # Public: Setup the plugin search path # # Returns an Array of plugin search paths def plugins_path if site.config['plugins_dir'].eql? Jekyll::Configuration::DEFAULTS['plugins_dir'] [site.in_source_dir(site.config['plugins_dir'])] else 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 end end jekyll-3.1.6/lib/jekyll/publisher.rb000066400000000000000000000006701271741406300174050ustar00rootroot00000000000000module Jekyll class Publisher def initialize(site) @site = site end def publish?(thing) can_be_published?(thing) && !hidden_in_the_future?(thing) end private def can_be_published?(thing) thing.data.fetch('published', true) || @site.unpublished end def hidden_in_the_future?(thing) thing.respond_to?(:date) && !@site.future && thing.date.to_i > @site.time.to_i end end end jekyll-3.1.6/lib/jekyll/reader.rb000066400000000000000000000105361271741406300166540ustar00rootroot00000000000000# 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 do |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 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 jekyll-3.1.6/lib/jekyll/readers/000077500000000000000000000000001271741406300165055ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/readers/collection_reader.rb000066400000000000000000000007011271741406300225050ustar00rootroot00000000000000module 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 jekyll-3.1.6/lib/jekyll/readers/data_reader.rb000066400000000000000000000035071271741406300212720ustar00rootroot00000000000000module Jekyll class DataReader attr_reader :site, :content def initialize(site) @site = site @content = {} end # Read all the files in //_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 and add them to the # 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 jekyll-3.1.6/lib/jekyll/readers/layout_reader.rb000066400000000000000000000021021271741406300216640ustar00rootroot00000000000000module Jekyll class LayoutReader attr_reader :site def initialize(site) @site = site @layouts = {} end def read layout_entries.each do |f| @layouts[layout_name(f)] = Layout.new(site, layout_directory, f) end @layouts end def layout_directory @layout_directory ||= (layout_directory_in_cwd || layout_directory_inside_source) end private def layout_entries entries = [] within(layout_directory) do entries = EntryFilter.new(site).filter(Dir['**/*.*']) end entries end def layout_name(file) file.split(".")[0..-2].join(".") end def within(directory) return unless File.exist?(directory) Dir.chdir(directory) { yield } end def layout_directory_inside_source site.in_source_dir(site.config['layouts_dir']) end def layout_directory_in_cwd dir = Jekyll.sanitized_path(Dir.pwd, site.config['layouts_dir']) if File.directory?(dir) && !site.safe dir else nil end end end end jekyll-3.1.6/lib/jekyll/readers/page_reader.rb000066400000000000000000000011511271741406300212660ustar00rootroot00000000000000module Jekyll class PageReader attr_reader :site, :dir, :unfiltered_content def initialize(site, dir) @site = site @dir = dir @unfiltered_content = [] end # Read all the files in // 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 jekyll-3.1.6/lib/jekyll/readers/post_reader.rb000066400000000000000000000036151271741406300213460ustar00rootroot00000000000000module Jekyll class PostReader attr_reader :site, :unfiltered_content def initialize(site) @site = site end # Read all the files in //_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 //_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 // 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 //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 , # 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 jekyll-3.1.6/lib/jekyll/readers/static_file_reader.rb000066400000000000000000000011051271741406300226370ustar00rootroot00000000000000module Jekyll class StaticFileReader attr_reader :site, :dir, :unfiltered_content def initialize(site, dir) @site = site @dir = dir @unfiltered_content = [] end # Read all the files in // 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 jekyll-3.1.6/lib/jekyll/regenerator.rb000066400000000000000000000103631271741406300177250ustar00rootroot00000000000000module 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 && !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.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 unless 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 jekyll-3.1.6/lib/jekyll/related_posts.rb000066400000000000000000000021611271741406300202550ustar00rootroot00000000000000module Jekyll class RelatedPosts class << self attr_accessor :lsi end attr_reader :post, :site def initialize(post) @post = post @site = post.site Jekyll::External.require_with_graceful_fail('classifier-reborn') if site.lsi end def build return [] unless site.posts.docs.size > 1 if site.lsi build_index lsi_related_posts else most_recent_posts end end def build_index self.class.lsi ||= begin lsi = ClassifierReborn::LSI.new(:auto_rebuild => false) display("Populating LSI...") site.posts.docs.each do |x| lsi.add_item(x) end display("Rebuilding index...") lsi.build_index display("") lsi end end def lsi_related_posts self.class.lsi.find_related(post, 11) end def most_recent_posts @most_recent_posts ||= (site.posts.docs.reverse - [post]).first(10) end def display(output) $stdout.print("\n") $stdout.print(Jekyll.logger.formatted_topic(output)) $stdout.flush end end end jekyll-3.1.6/lib/jekyll/renderer.rb000066400000000000000000000131161271741406300172150ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll class Renderer attr_reader :document, :site, :payload def initialize(site, document, site_payload = nil) @site = site @document = document @payload = site_payload || site.site_payload end # Determine which converters to use based on this document's # extension. # # Returns an array of Converter instances. def converters @converters ||= site.converters.select { |c| c.matches(document.extname) } end # Determine the extname the outputted file should have # # Returns the output extname including the leading period. def output_ext @output_ext ||= (permalink_ext || converter_output_ext) end ###################### ## DAT RENDER THO ###################### def run Jekyll.logger.debug "Rendering:", document.relative_path payload["page"] = document.to_liquid if document.respond_to? :pager payload["paginator"] = document.pager.to_liquid end if document.is_a?(Document) && document.collection.label == 'posts' payload['site']['related_posts'] = document.related_posts end # render and transform content (this becomes the final content of the object) payload['highlighter_prefix'] = converters.first.highlighter_prefix payload['highlighter_suffix'] = converters.first.highlighter_suffix Jekyll.logger.debug "Pre-Render Hooks:", document.relative_path document.trigger_hooks(:pre_render, payload) info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload['page'] } } output = document.content if document.render_with_liquid? 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( output, payload, info ) else output end end # Convert the given content using the converters which match this renderer's document. # # content - the raw, unconverted content # # Returns the converted content. def convert(content) converters.reduce(content) do |output, converter| begin converter.convert output rescue => e 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 end # Render the given content with the payload and info # # content - # payload - # info - # path - (optional) the path to the file, for use in ex # # Returns the content, rendered by Liquid. def render_liquid(content, payload, info, path = nil) 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 rescue Exception => e Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{path || document.relative_path}" raise e end # Checks if the layout specified in the document actually exists # # layout - the layout to check # # Returns true if the layout is invalid, false if otherwise def invalid_layout?(layout) !document.data["layout"].nil? && layout.nil? end # Render layouts and place given content inside. # # content - the content to be placed in the layout # # # Returns the content placed in the Liquid-rendered layouts def place_in_layouts(content, payload, info) output = content.dup layout = site.layouts[document.data["layout"]] Jekyll.logger.warn("Build Warning:", "Layout '#{document.data["layout"]}' requested in #{document.relative_path} does not exist.") if invalid_layout? layout used = Set.new([layout]) # Reset the payload layout data to ensure it starts fresh for each page. payload["layout"] = nil while layout payload['content'] = output payload['page'] = document.to_liquid payload['layout'] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {}) output = render_liquid( layout.content, payload, info, 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 else used << layout end end end output end private def permalink_ext if document.permalink && !document.permalink.end_with?("/") permalink_ext = File.extname(document.permalink) permalink_ext unless permalink_ext.empty? end end def converter_output_ext if output_exts.size == 1 output_exts.last else output_exts[-2] end end def output_exts @output_exts ||= converters.map do |c| c.output_ext(document.extname) end.compact end end end jekyll-3.1.6/lib/jekyll/site.rb000066400000000000000000000270651271741406300163630ustar00rootroot00000000000000# encoding: UTF-8 require 'csv' module Jekyll class Site 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, :reader attr_reader :regenerator, :liquid_renderer # Public: Initialize a new Site. # # config - A Hash containing site configuration details. def initialize(config) @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 # 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 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 # Public: Read, process, and write this Site to output. # # Returns nothing. def process reset read generate 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'] ? Utils.parse_date(config['time'].to_s, "Invalid time in _config.yml.") : Time.now) self.layouts = {} 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. # # Returns nothing. def setup ensure_not_in_dest plugin_manager.conscientious_require self.converters = instantiate_subclasses(Jekyll::Converter) self.generators = instantiate_subclasses(Jekyll::Generator) end # Check that the destination dir isn't the source dir or a directory # parent to the source dir. def ensure_not_in_dest dest_pathname = Pathname.new(dest) Pathname.new(source).ascend do |path| if path == dest_pathname raise Errors::FatalException.new "Destination directory cannot be or contain the Source directory." end end end # The list of collections and their corresponding Jekyll::Collection instances. # If config['collections'] is set, a new instance is created for each item in the collection. # If config['collections'] is not set, a new hash is returned. # # Returns a Hash containing collection name-to-instance pairs. def collections @collections ||= Hash[collection_names.map { |coll| [coll, Jekyll::Collection.new(self, coll)] } ] end # The list of collection names. # # Returns an array of collection names from the configuration, # or an empty array if the `collections` key is not set. def collection_names case config['collections'] when Hash config['collections'].keys when Array config['collections'] when nil [] else raise ArgumentError, "Your `collections` key must be a hash or an array." end end # Read Site data from disk and load it into internal data structures. # # Returns nothing. def read reader.read limit_posts! Jekyll::Hooks.trigger :site, :post_read, self end # Run each of the Generators. # # Returns nothing. def generate generators.each do |generator| generator.generate(self) end end # Render the site to the destination. # # Returns nothing. def render relative_permalinks_are_deprecated payload = site_payload Jekyll::Hooks.trigger :site, :pre_render, self, payload collections.each do |_, collection| collection.docs.each do |document| if regenerator.regenerate?(document) document.output = Jekyll::Renderer.new(self, document, payload).run document.trigger_hooks(:post_render) end end end pages.flatten.each do |page| if regenerator.regenerate?(page) page.output = Jekyll::Renderer.new(self, page, payload).run page.trigger_hooks(:post_render) end end Jekyll::Hooks.trigger :site, :post_render, self, payload rescue Errno::ENOENT # ignore missing layout dir end # Remove orphaned files and empty directories in destination. # # Returns nothing. def cleanup site_cleaner.cleanup! end # Write static files, pages, and posts. # # Returns nothing. def write each_site_file do |item| item.write(dest) if regenerator.regenerate?(item) end 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. # # post_attr - The String name of the Post attribute. # # Examples # # post_attr_hash('categories') # # => { 'tech' => [, ], # # 'ruby' => [] } # # Returns the Hash: { attr => posts } where # attr - One of the values for the requested attribute. # posts - The Array of Posts with the given attr value. def post_attr_hash(post_attr) # 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.docs.each { |p| p.data[post_attr].each { |t| hash[t] << p } if p.data[post_attr] } hash.values.each { |posts| posts.sort!.reverse! } hash end def tags post_attr_hash('tags') end def categories post_attr_hash('categories') end # Prepare site data for site payload. The method maintains backward compatibility # if the key 'data' is already used in _config.yml. # # Returns the Hash to be hooked to site.data. def site_data config['data'] || data end # The Hash payload containing site-wide data. # # Returns the Hash: { "site" => data } where data is a Hash with keys: # "time" - The Time as specified in the configuration or the # current time if none was specified. # "posts" - The Array of Posts, sorted chronologically by post date # and then title. # "pages" - The Array of all Pages. # "html_pages" - The Array of HTML Pages. # "categories" - The Hash of category values and Posts. # See Site#post_attr_hash for type info. # "tags" - The Hash of tag values and Posts. # See Site#post_attr_hash for type info. def site_payload Drops::UnifiedPayloadDrop.new self end alias_method :to_liquid, :site_payload # Get the implementation class for the given Converter. # Returns the Converter instance implementing the given Converter. # klass - The Class of the Converter to fetch. def find_converter_instance(klass) converters.find { |klass_| klass_.instance_of?(klass) } || \ raise("No Converters found for #{klass}") end # klass - class or module containing the subclasses. # Returns array of instances of subclasses of parameter. # Create array of instances of the subclasses of the class or module # passed in as argument. def instantiate_subclasses(klass) klass.descendants.select { |c| !safe || c.safe }.sort.map do |c| c.new(config) end end # Warns the user if permanent links are relative to the parent # directory. As this is a deprecated function of Jekyll. # # 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 + collection.docs + collection.files end.to_a end def each_site_file %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 # 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 # Returns the publisher or creates a new publisher if it doesn't # already exist. # # Returns The Publisher def publisher @publisher ||= Publisher.new(self) end # 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 # 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 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 # 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 jekyll-3.1.6/lib/jekyll/static_file.rb000066400000000000000000000071771271741406300177070ustar00rootroot00000000000000module Jekyll class StaticFile # The cache of last modification times [path] -> mtime. @@mtimes = {} attr_reader :relative_path, :extname # Initialize a new StaticFile. # # site - The Site. # base - The String path to the . # dir - The String path between and the file. # name - The String filename of the file. 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. def path File.join(*[@base, @dir, @name].compact) end # Obtain destination path. # # dest - The String path to the destination dir. # # Returns destination file path. def destination(dest) @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 modified_time.to_i end # Is source path modified? # # Returns true if modified since last write. def modified? @@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. # # Returns false if the file was not modified since last time (no-op). def write(dest) dest_path = destination(dest) return false if File.exist?(dest_path) && !modified? @@mtimes[path] = mtime 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 # Reset the mtimes cache (for testing purposes). # # Returns nothing. def self.reset_cache @@mtimes = {} nil end def to_liquid { "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 jekyll-3.1.6/lib/jekyll/stevenson.rb000066400000000000000000000022551271741406300174350ustar00rootroot00000000000000module Jekyll class Stevenson < ::Logger def initialize @progname = nil @level = DEBUG @default_formatter = Formatter.new @logdev = $stdout @formatter = proc do |_, _, _, msg| "#{msg}" end end def add(severity, message = nil, progname = nil, &block) severity ||= UNKNOWN @logdev = set_logdevice(severity) if @logdev.nil? || severity < @level return true end progname ||= @progname if message.nil? if block_given? message = yield else message = progname progname = @progname end end @logdev.puts( format_message(format_severity(severity), Time.now, progname, message)) true end # Log a +WARN+ message def warn(progname = nil, &block) add(WARN, nil, progname.yellow, &block) end # Log an +ERROR+ message def error(progname = nil, &block) add(ERROR, nil, progname.red, &block) end def close # No LogDevice in use end private def set_logdevice(severity) if severity > INFO $stderr else $stdout end end end end jekyll-3.1.6/lib/jekyll/tags/000077500000000000000000000000001271741406300160165ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/tags/highlight.rb000066400000000000000000000103211271741406300203070ustar00rootroot00000000000000module Jekyll module Tags class HighlightBlock < Liquid::Block include Liquid::StandardFilters # The regular expression syntax checker. Start with the language specifier. # Follow that by zero or more space separated options that take one of three # forms: name, name=value, or name="" # # is a space-separated list of numbers SYNTAX = /^([a-zA-Z0-9.+#-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$/ def initialize(tag_name, markup, tokens) super if markup.strip =~ SYNTAX @lang = Regexp.last_match(1).downcase @highlight_options = {} if defined?(Regexp.last_match(2)) && Regexp.last_match(2) != '' # Split along 3 possible forms -- key="", key=value, or key Regexp.last_match(2).scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| key, value = opt.split('=') # If a quoted list, convert to array if value && value.include?("\"") value.delete!('"') value = value.split end @highlight_options[key.to_sym] = value || true end end @highlight_options[:linenos] = "inline" if @highlight_options.key?(:linenos) && @highlight_options[:linenos] == true else raise SyntaxError.new <<-eos Syntax Error in tag 'highlight' while parsing the following markup: #{markup} Valid syntax: highlight [linenos] eos end end def render(context) prefix = context["highlighter_prefix"] || "" suffix = context["highlighter_suffix"] || "" 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 rendered_output = add_code_tag(output) prefix + rendered_output + suffix end def sanitized_opts(opts, is_safe) if is_safe Hash[[ [:startinline, opts.fetch(:startinline, nil)], [:hl_lines, opts.fetch(:hl_lines, nil)], [:linenos, opts.fetch(:linenos, nil)], [:encoding, opts.fetch(:encoding, 'utf-8')], [:cssclass, opts.fetch(:cssclass, nil)] ].reject { |f| f.last.nil? }] else opts end end def render_pygments(code, is_safe) Jekyll::External.require_with_graceful_fail('pygments') highlighted_code = Pygments.highlight( code, :lexer => @lang, :options => sanitized_opts(@highlight_options, is_safe) ) if highlighted_code.nil? Jekyll.logger.error "There was an error highlighting your code:" puts Jekyll.logger.error code puts Jekyll.logger.error "While attempting to convert the above code, Pygments.rb" \ " returned an unacceptable value." Jekyll.logger.error "This is usually a timeout problem solved by running `jekyll build` again." raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.") end highlighted_code.sub('
    ', '').sub('
    ', '') end def render_rouge(code) Jekyll::External.require_with_graceful_fail('rouge') formatter = Rouge::Formatters::HTML.new(:line_numbers => @highlight_options[:linenos], :wrap => false) lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText formatter.format(lexer.lex(code)) end def render_codehighlighter(code) h(code).strip end def add_code_tag(code) code_attributes = [ "class=\"language-#{@lang.to_s.tr('+', '-')}\"", "data-lang=\"#{@lang}\"" ].join(" ") "
    #{code.chomp}
    " end end end end Liquid::Template.register_tag('highlight', Jekyll::Tags::HighlightBlock) jekyll-3.1.6/lib/jekyll/tags/include.rb000066400000000000000000000123311271741406300177660ustar00rootroot00000000000000# encoding: UTF-8 module Jekyll module Tags class IncludeTagError < StandardError attr_accessor :path def initialize(msg, path) super(msg) @path = path end end class IncludeTag < Liquid::Tag attr_reader :includes_dir VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/ VARIABLE_SYNTAX = /(?[^{]*(\{\{\s*[\w\-\.]+\s*(\|.*)?\}\}[^\s{}]*)+)(?.*)/ def initialize(tag_name, markup, tokens) super matched = markup.strip.match(VARIABLE_SYNTAX) if matched @file = matched['variable'].strip @params = matched['params'].strip else @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) params = {} markup = @params while match = VALID_SYNTAX.match(markup) do markup = markup[match.end(0)..-1] value = if match[2] match[2].gsub(/\\"/, '"') elsif match[3] match[3].gsub(/\\'/, "'") elsif match[4] context[match[4]] end params[match[1]] = value end params end def validate_file_name(file) if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./ raise ArgumentError.new <<-eos Invalid syntax for include tag. File contains invalid characters or sequences: #{file} Valid syntax: #{syntax_example} eos end end def validate_params full_valid_syntax = Regexp.compile('\A\s*(?:' + VALID_SYNTAX.to_s + '(?=\s|\z)\s*)*\z') unless @params =~ full_valid_syntax raise ArgumentError.new <<-eos Invalid syntax for include tag: #{@params} Valid syntax: #{syntax_example} eos end end # Grab file read opts in the context def file_read_opts(context) context.registers[:site].file_read_opts end # Render the variable if required def render_variable(context) if @file.match(VARIABLE_SYNTAX) 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) 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, site.safe) # Add include to dependency tree if context.registers[:page] && context.registers[:page].key?("path") site.regenerator.add_dependency( site.in_source_dir(context.registers[:page]["path"]), path ) end begin partial = load_cached_partial(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) end end def load_cached_partial(path, context) context.registers[:cached_partials] ||= {} cached_partial = context.registers[:cached_partials] if cached_partial.key?(path) cached_partial[path] else cached_partial[path] = context.registers[:site].liquid_renderer.file(path).parse(read_file(path, context)) 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" elsif !File.exist?(path) raise IOError.new "Included file '#{path_relative_to_source(dir, path)}' not found" end end def path_relative_to_source(dir, path) File.join(@includes_dir, path.sub(Regexp.new("^#{dir}"), "")) end def realpath_prefixed_with?(path, dir) File.exist?(path) && File.realpath(path).start_with?(dir) end # This method allows to modify the file content by inheriting from the class. 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) jekyll-3.1.6/lib/jekyll/tags/post_url.rb000066400000000000000000000050241271741406300202130ustar00rootroot00000000000000module Jekyll module Tags class PostComparer MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)$/ attr_reader :path, :date, :slug, :name def initialize(name) @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 && date.day == other.date.day end private # Construct the directory-aware post slug for a Jekyll::Post # # other - the Jekyll::Post # # Returns the post slug with the subdirectory (relative to _posts) def post_slug(other) path = other.basename.split("/")[0...-1].join("/") if path.nil? || path == "" other.data['slug'] else path + '/' + other.data['slug'] end end end class PostUrl < Liquid::Tag def initialize(tag_name, post, tokens) super @orig_post = post.strip begin @post = PostComparer.new(@orig_post) rescue raise ArgumentError.new <<-eos Could not parse name of post "#{@orig_post}" in tag 'post_url'. Make sure the post exists and the name is correct. eos end end def render(context) site = context.registers[:site] site.posts.docs.each do |p| return p.url if @post == p end # New matching method did not match, fall back to old method # with deprecation warning if this matches site.posts.docs.each do |p| next unless @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 raise ArgumentError.new <<-eos Could not find post "#{@orig_post}" in tag 'post_url'. Make sure the post exists and the name is correct. eos end end end end Liquid::Template.register_tag('post_url', Jekyll::Tags::PostUrl) jekyll-3.1.6/lib/jekyll/url.rb000066400000000000000000000105461271741406300162150ustar00rootroot00000000000000require 'uri' # Public: Methods that generate a URL for a resource such as a Post or a Page. # # Examples # # URL.new({ # :template => /:categories/:title.html", # :placeholders => {:categories => "ruby", :title => "something"} # }).to_s # module Jekyll class URL # options - One of :permalink or :template must be supplied. # :template - The String used as template for URL generation, # for example "/:path/:basename:output_ext", where # a placeholder is prefixed with a colon. # :placeholders - A hash containing the placeholders which will be # replaced when used inside the template. E.g. # { "year" => Time.now.strftime("%Y") } would replace # the placeholder ":year" with the current year. # :permalink - If supplied, no URL will be generated from the # template. Instead, the given permalink will be # used as URL. def initialize(options) @template = options[:template] @placeholders = options[:placeholders] || {} @permalink = options[:permalink] if (@template || @permalink).nil? raise ArgumentError, "One of :template or :permalink must be supplied." end end # The generated relative URL of the resource # # Returns the String URL def to_s 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 in the given template # # Returns the unsanitized String URL def generate_url(template) if @placeholders.is_a? Drops::UrlDrop generate_url_from_drop(template) else generate_url_from_hash(template) end end def generate_url_from_hash(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 def generate_url_from_drop(template) template.gsub(/:([a-z_]+)/.freeze) do |match| replacement = @placeholders.public_send(match.sub(':'.freeze, ''.freeze)) if replacement.nil? ''.freeze else self.class.escape_path(replacement) end end.gsub(/\/\//.freeze, '/'.freeze) end # Returns a sanitized String URL, stripping "../../" and multiples of "/", # as well as the beginning "/" so we can enforce and ensure it. def sanitize_url(str) "/" + str.gsub(/\/{2,}/, "/").gsub(/\.+\/|\A\/+/, "") end # Escapes a path to be a valid URL path segment # # path - The path to be escaped. # # Examples: # # URL.escape_path("/a b") # # => "/a%20b" # # Returns the escaped path. def self.escape_path(path) # 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: # segment = *pchar # pchar = unreserved / pct-encoded / sub-delims / ":" / "@" # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" # pct-encoded = "%" HEXDIG HEXDIG # sub-delims = "!" / "$" / "&" / "'" / "(" / ")" # / "*" / "+" / "," / ";" / "=" URI.escape(path, /[^a-zA-Z\d\-._~!$&'()*+,;=:@\/]/).encode('utf-8') end # Unescapes a URL path segment # # path - The path to be unescaped. # # Examples: # # URL.unescape_path("/a%20b") # # => "/a b" # # Returns the unescaped path. def self.unescape_path(path) URI.unescape(path.encode('utf-8')) end end end jekyll-3.1.6/lib/jekyll/utils.rb000066400000000000000000000223011271741406300165430ustar00rootroot00000000000000module Jekyll module Utils extend self autoload :Platforms, 'jekyll/utils/platforms' autoload :Ansi, "jekyll/utils/ansi" # 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 # Takes an indented string and removes the preceding spaces on each line def strip_heredoc(str) str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") end # Takes a slug and turns it into a simple title. def titleize_slug(slug) slug.split("-").map! do |val| val.capitalize end.join(" ") end # 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) target.merge!(overwrite) do |key, old_val, new_val| if new_val.nil? old_val else mergable?(old_val) && mergable?(new_val) ? deep_merge_hashes(old_val, new_val) : new_val end end if target.respond_to?(:default_proc) && overwrite.respond_to?(:default_proc) && target.default_proc.nil? target.default_proc = overwrite.default_proc end target.each do |key, val| target[key] = val.dup if val.frozen? && duplicable?(val) end target end def mergable?(value) value.is_a?(Hash) || value.is_a?(Drops::Drop) end def duplicable?(obj) case obj when nil, false, true, Symbol, Numeric false else true end 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 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 } 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.readline } =~ /\A---\s*\r?\n/) rescue EOFError false 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 # 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 # Strip according to the mode slug = string.gsub(re, '-') # Remove leading/trailing hyphen slug.gsub!(/^\-|\-$/i, '') slug.downcase! unless cased slug 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 # Work the same way as Dir.glob but seperating the input into two parts # ('dir' + '/' + 'pattern') to make sure the first part('dir') does not act # as a pattern. # # For example, Dir.glob("path[/*") always returns an empty array, # because the method fails to find the closing pattern to '[' which is ']' # # Examples: # safe_glob("path[", "*") # # => ["path[/file1", "path[/file2"] # # safe_glob("path", "*", File::FNM_DOTMATCH) # # => ["path/.", "path/..", "path/file1"] # # safe_glob("path", ["**", "*"]) # # => ["path[/file1", "path[/folder/file2"] # # dir - the dir where glob will be executed under # (the dir will be included to each result) # patterns - the patterns (or the pattern) which will be applied under the dir # flags - the flags which will be applied to the pattern # # Returns matched pathes def safe_glob(dir, patterns, flags = 0) return [] unless Dir.exist?(dir) pattern = File.join(Array patterns) return [dir] if pattern.empty? Dir.chdir(dir) do Dir.glob(pattern, flags).map { |f| File.join(dir, f) } end end # Returns merged option hash for File.read of self.site (if exists) # and a given param def merged_file_read_opts(site, opts) merged = (site ? site.file_read_opts : {}).merge(opts) if merged["encoding"] && !merged["encoding"].start_with?("bom|") merged["encoding"].insert(0, "bom|") end merged end end end jekyll-3.1.6/lib/jekyll/utils/000077500000000000000000000000001271741406300162205ustar00rootroot00000000000000jekyll-3.1.6/lib/jekyll/utils/ansi.rb000066400000000000000000000030501271741406300174750ustar00rootroot00000000000000# Frozen-string-literal: true # Copyright: 2015 Jekyll - MIT License # Encoding: utf-8 module Jekyll module Utils module Ansi extend self ESCAPE = format("%c", 27) MATCH = /#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m/ix.freeze COLORS = { :red => 31, :green => 32, :black => 30, :magenta => 35, :yellow => 33, :white => 37, :blue => 34, :cyan => 36 } # Strip ANSI from the current string. It also strips cursor stuff, # well some of it, and it also strips some other stuff that a lot of # the other ANSI strippers don't. def strip(str) str.gsub MATCH, "" end # def has?(str) !!(str =~ MATCH) end # Reset the color back to the default color so that you do not leak any # colors when you move onto the next line. This is probably normally # used as part of a wrapper so that we don't leak colors. def reset(str = "") @ansi_reset ||= format("%c[0m", 27) "#{@ansi_reset}#{str}" end # SEE: `self::COLORS` for a list of methods. They are mostly # standard base colors supported by pretty much any xterm-color, we do # not need more than the base colors so we do not include them. # Actually... if I'm honest we don't even need most of the # base colors. COLORS.each do |color, num| define_method color do |str| "#{format("%c", 27)}[#{num}m#{str}#{reset}" end end end end end jekyll-3.1.6/lib/jekyll/utils/platforms.rb000066400000000000000000000016151271741406300205570ustar00rootroot00000000000000module 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 jekyll-3.1.6/lib/jekyll/version.rb000066400000000000000000000000461271741406300170720ustar00rootroot00000000000000module Jekyll VERSION = '3.1.6' end jekyll-3.1.6/lib/site_template/000077500000000000000000000000001271741406300164255ustar00rootroot00000000000000jekyll-3.1.6/lib/site_template/.gitignore000066400000000000000000000000431271741406300204120ustar00rootroot00000000000000_site .sass-cache .jekyll-metadata jekyll-3.1.6/lib/site_template/_config.yml000066400000000000000000000015731271741406300205620ustar00rootroot00000000000000# 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@domain.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 jekyll-3.1.6/lib/site_template/_includes/000077500000000000000000000000001271741406300203725ustar00rootroot00000000000000jekyll-3.1.6/lib/site_template/_includes/footer.html000066400000000000000000000016501271741406300225600ustar00rootroot00000000000000
    jekyll-3.1.6/lib/site_template/_includes/head.html000066400000000000000000000014221271741406300221600ustar00rootroot00000000000000 {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} jekyll-3.1.6/lib/site_template/_includes/header.html000066400000000000000000000021401271741406300225050ustar00rootroot00000000000000 jekyll-3.1.6/lib/site_template/_includes/icon-github.html000066400000000000000000000002611271741406300234670ustar00rootroot00000000000000{% include icon-github.svg %}{{ include.username }} jekyll-3.1.6/lib/site_template/_includes/icon-github.svg000066400000000000000000000016361271741406300233310ustar00rootroot00000000000000 jekyll-3.1.6/lib/site_template/_includes/icon-twitter.html000066400000000000000000000002641271741406300237120ustar00rootroot00000000000000{{ include.username }} jekyll-3.1.6/lib/site_template/_includes/icon-twitter.svg000066400000000000000000000014231271741406300235430ustar00rootroot00000000000000 jekyll-3.1.6/lib/site_template/_layouts/000077500000000000000000000000001271741406300202645ustar00rootroot00000000000000jekyll-3.1.6/lib/site_template/_layouts/default.html000066400000000000000000000003701271741406300225760ustar00rootroot00000000000000 {% include head.html %} {% include header.html %}
    {{ content }}
    {% include footer.html %} jekyll-3.1.6/lib/site_template/_layouts/page.html000066400000000000000000000003211271741406300220620ustar00rootroot00000000000000--- layout: default ---

    {{ page.title }}

    {{ content }}
    jekyll-3.1.6/lib/site_template/_layouts/post.html000066400000000000000000000011521271741406300221360ustar00rootroot00000000000000--- layout: default ---

    {{ page.title }}

    {{ content }}
    jekyll-3.1.6/lib/site_template/_posts/000077500000000000000000000000001271741406300177345ustar00rootroot00000000000000jekyll-3.1.6/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb000066400000000000000000000023151271741406300266220ustar00rootroot00000000000000--- layout: post title: "Welcome to Jekyll!" 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. 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: {% highlight ruby %} def print_hi(name) puts "Hi, #{name}" end print_hi('Tom') #=> prints 'Hi, Tom' to STDOUT. {% endhighlight %} 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-docs]: http://jekyllrb.com/docs/home [jekyll-gh]: https://github.com/jekyll/jekyll [jekyll-talk]: https://talk.jekyllrb.com/ jekyll-3.1.6/lib/site_template/_sass/000077500000000000000000000000001271741406300175355ustar00rootroot00000000000000jekyll-3.1.6/lib/site_template/_sass/_base.scss000066400000000000000000000055351271741406300215130ustar00rootroot00000000000000/** * 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; } } } jekyll-3.1.6/lib/site_template/_sass/_layout.scss000066400000000000000000000103131271741406300221040ustar00rootroot00000000000000/** * 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)); } @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)); } } @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; } } } jekyll-3.1.6/lib/site_template/_sass/_syntax-highlighting.scss000066400000000000000000000064331271741406300245700ustar00rootroot00000000000000/** * 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 } jekyll-3.1.6/lib/site_template/about.md000066400000000000000000000010301271741406300200530ustar00rootroot00000000000000--- layout: page title: About 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: {% include icon-github.html username="jglovier" %} / [jekyll-new](https://github.com/jglovier/jekyll-new) You can find the source code for Jekyll at {% include icon-github.html username="jekyll" %} / [jekyll](https://github.com/jekyll/jekyll) jekyll-3.1.6/lib/site_template/css/000077500000000000000000000000001271741406300172155ustar00rootroot00000000000000jekyll-3.1.6/lib/site_template/css/main.scss000066400000000000000000000020471271741406300210410ustar00rootroot00000000000000--- # Only the main Sass file needs front matter (the dashes are enough) --- @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; // } // } @mixin media-query($device) { @media screen and (max-width: $device) { @content; } } // Import partials from `sass_dir` (defaults to `_sass`) @import "base", "layout", "syntax-highlighting" ; jekyll-3.1.6/lib/site_template/feed.xml000066400000000000000000000024131271741406300200520ustar00rootroot00000000000000--- layout: null --- {{ site.title | xml_escape }} {{ site.description | xml_escape }} {{ site.url }}{{ site.baseurl }}/ {{ site.time | date_to_rfc822 }} {{ site.time | date_to_rfc822 }} Jekyll v{{ jekyll.version }} {% for post in site.posts limit:10 %} {{ post.title | xml_escape }} {{ post.content | xml_escape }} {{ post.date | date_to_rfc822 }} {{ post.url | prepend: site.baseurl | prepend: site.url }} {{ post.url | prepend: site.baseurl | prepend: site.url }} {% for tag in post.tags %} {{ tag | xml_escape }} {% endfor %} {% for cat in post.categories %} {{ cat | xml_escape }} {% endfor %} {% endfor %} jekyll-3.1.6/lib/site_template/index.html000066400000000000000000000007721271741406300204300ustar00rootroot00000000000000--- layout: default ---

    Posts

      {% for post in site.posts %}
    • {{ post.title }}

    • {% endfor %}

    subscribe via RSS

    jekyll-3.1.6/rake/000077500000000000000000000000001271741406300137425ustar00rootroot00000000000000jekyll-3.1.6/rake/docs.rake000066400000000000000000000012001271741406300155270ustar00rootroot00000000000000############################################################################# # # Packaging tasks for jekyll-docs # ############################################################################# namespace :docs do desc "Release #{docs_name} v#{version}" task :release => :build do unless `git branch` =~ /^\* master$/ puts "You must be on the master branch to release!" exit! end sh "gem push pkg/#{docs_name}-#{version}.gem" end desc "Build #{docs_name} v#{version} into pkg/" task :build do mkdir_p "pkg" sh "gem build #{docs_name}.gemspec" sh "mv #{docs_name}-#{version}.gem pkg" end end jekyll-3.1.6/rake/release.rake000066400000000000000000000012701271741406300162260ustar00rootroot00000000000000############################################################################# # # Packaging tasks # ############################################################################# desc "Release #{name} v#{version}" task :release => :build do unless `git branch` =~ /^\* 3\.1-stable$/ puts "You must be on the master branch to release!" exit! end 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}" sh "gem push pkg/#{name}-#{version}.gem" end desc "Build #{name} v#{version} into pkg/" task :build do mkdir_p "pkg" sh "gem build #{gemspec_file}" sh "mv #{gem_file} pkg" end jekyll-3.1.6/rake/site.rake000066400000000000000000000125531271741406300155600ustar00rootroot00000000000000############################################################################# # # Site tasks - http://jekyllrb.com # ############################################################################# namespace :site do task :generated_pages => [:history, :version_file, :conduct] desc "Generate and view the site locally" task :preview => :generated_pages 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. Thread.new do sleep 4 puts "Opening in browser..." Launchy.open("http://localhost:4000") end # Generate the site in server mode. puts "Running Jekyll..." 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 => :generated_pages do require "jekyll" Jekyll::Commands::Build.process({ "source" => File.expand_path("site"), "destination" => File.expand_path("site/_site") }) end task :build => :generate desc "Update normalize.css library to the latest version and minify" task :update_normalize_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.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 => :generated_pages 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 "Creating gh-pages dir..." sh "git clone git@github.com:jekyll/jekyll gh-pages" end # Ensure latest gh-pages branch history. Dir.chdir('gh-pages') do sh "git checkout gh-pages" sh "git pull origin gh-pages" end # 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 rev-parse HEAD`.strip Dir.chdir('gh-pages') do sh "git add ." sh "git commit --allow-empty -m 'Updating to #{sha}.'" sh "git push origin gh-pages" end puts 'Done.' end desc "Create a nicely formatted history page for the jekyll site based on the repo history." task :history do if File.exist?("History.markdown") history_file = File.read("History.markdown") front_matter = { "layout" => "docs", "title" => "History", "permalink" => "/docs/history/" } 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)) end end else abort "You seem to have misplaced your History.markdown file. I can haz?" end end desc "Copy the Code of Conduct" task :conduct do code_of_conduct = File.read("CONDUCT.markdown") header, _, body = code_of_conduct.partition("\n\n") front_matter = { "layout" => "docs", "title" => header.sub('# Contributor ', ''), "permalink" => "/docs/conduct/", "redirect_from" => "/conduct/index.html", "editable" => false } Dir.chdir('site/_docs') do File.open("conduct.md", "w") do |file| file.write("#{front_matter.to_yaml}---\n\n") file.write(body) end 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| raise "Specify a version: rake site:releases:new['1.2.3']" unless args.version today = Time.new.strftime('%Y-%m-%d') release = args.version.to_s filename = "site/_posts/#{today}-jekyll-#{release.split('.').join('-')}-released.markdown" File.open(filename, "wb") do |post| post.puts("---") post.puts("layout: news_item") post.puts("title: 'Jekyll #{release} Released'") post.puts("date: #{Time.new.strftime('%Y-%m-%d %H:%M:%S %z')}") post.puts("author: ") post.puts("version: #{release}") post.puts("categories: [release]") post.puts("---") post.puts post.puts end puts "Created #{filename}" end end end jekyll-3.1.6/script/000077500000000000000000000000001271741406300143245ustar00rootroot00000000000000jekyll-3.1.6/script/bootstrap000077500000000000000000000000701271741406300162640ustar00rootroot00000000000000#!/usr/bin/env bash script/branding bundle install -j8 jekyll-3.1.6/script/branding000077500000000000000000000011711271741406300160360ustar00rootroot00000000000000#!/usr/bin/env bash echo " ---------------------------------------------------------- " echo " _ ______ _ __ __ __ _ _ " echo " | | | ____| | |/ / \ \ / / | | | | " echo " | | | |__ | ' / \ \_/ / | | | | " echo " _ | | | __| | < \ / | | | | " echo " | |__| | | |____ | . \ | | | |____ | |____ " echo " \____/ |______| |_|\_\ |_| |______| |______| " echo " " echo " ---------------------------------------------------------- " jekyll-3.1.6/script/cibuild000077500000000000000000000003341271741406300156650ustar00rootroot00000000000000#!/usr/bin/env bash script/branding set -e 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 jekyll-3.1.6/script/console000077500000000000000000000014261271741406300157170ustar00rootroot00000000000000#!/usr/bin/env ruby require 'pry' $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) require 'jekyll' TEST_DIR = File.expand_path(File.join(File.dirname(__FILE__), *%w{ .. test })) def fixture_site(overrides = {}) Jekyll::Site.new(site_configuration(overrides)) end def build_configs(overrides, base_hash = Jekyll::Configuration::DEFAULTS) Jekyll::Utils.deep_merge_hashes(base_hash, overrides) end def site_configuration(overrides = {}) build_configs({ "source" => source_dir, "destination" => dest_dir }, build_configs(overrides)) end def dest_dir(*subdirs) test_dir('dest', *subdirs) end def source_dir(*subdirs) test_dir('source', *subdirs) end def test_dir(*subdirs) File.join(TEST_DIR, *subdirs) end module Jekyll binding.pry end jekyll-3.1.6/script/cucumber000077500000000000000000000001371271741406300160600ustar00rootroot00000000000000#!/usr/bin/env bash time ruby -S bundle exec cucumber \ -f Jekyll::Cucumber::Formatter "$@" jekyll-3.1.6/script/proof000077500000000000000000000011321271741406300153740ustar00rootroot00000000000000#!/usr/bin/env bash # # Usage: # script/proof set -e function msg { printf "\e[0;37m==> $1\e[0m\n" } INGORE_HREFS=$(ruby -e 'puts %w{ Chrononaut twitter.com nearlyfreespeech.net eduardoboucas.com }.map{|h| "/#{h}/"}.join(",")') SOURCE="site" DESTINATION="_site" 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 --trace # 3. msg "Proofing..." time bundle exec htmlproof ./$DESTINATION --href-ignore $INGORE_HREFS jekyll-3.1.6/script/rubyprof000077500000000000000000000007101271741406300161200ustar00rootroot00000000000000#!/usr/bin/env bash export BENCHMARK=1 TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" RUBY=$(cat < /dev/null || script/bootstrap TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" PROF_OUTPUT_FILE=tmp/stackprof-${STACKPROF_MODE}-$(date +%Y%m%d%H%M).dump echo Stackprof Mode: $STACKPROF_MODE test -f "$PROF_OUTPUT_FILE" || { bundle exec ruby -r./lib/jekyll -rstackprof \ -e "StackProf.run(mode: :${STACKPROF_MODE}, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" } bundle exec stackprof $PROF_OUTPUT_FILE $@ jekyll-3.1.6/script/test000077500000000000000000000017771271741406300152450ustar00rootroot00000000000000#!/usr/bin/env bash set -e # Usage: # script/test # script/test [ruby|jruby] # script/test 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 [[ "$1" == "ci" ]] then rubies=( ruby ) shift elif [[ "$1" == "ruby" ]] || [[ "$1" == "jruby" ]] then rubies=( $1 ) shift else rubies=() for r in jruby ruby; do if which "$r" then rubies+=( $r ) fi done fi 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 jekyll-3.1.6/script/travis000077500000000000000000000022051271741406300155610ustar00rootroot00000000000000#!/bin/sh # Usage: script/travis [ruby-version [file]] # Example: script/travis 2.0 test/failing_test.rb # Example: script/travis 2.3.0 set -e mkdir -p vendor/docker docker rm -fv docker-travis > /dev/null 2>&1 || true docker run --volume=$(pwd):/home/travis/builds/jekyll/jekyll \ --workdir=/home/travis/builds/jekyll/jekyll \ --volume=$(pwd)/vendor/docker:/home/travis/builds/jekyll/jekyll/vendor/bundle \ --user=travis --name=docker-travis -dit quay.io/travisci/travis-ruby \ bash > /dev/null status=0 if [ $# -eq 2 ]; then docker exec -it docker-travis bash -ilc " \ rvm use --install --binary --fuzzy $1 bundle install --path vendor/bundle -j 12 \\ --without benchmark:site:development bundle clean script/test $2 " || status=$? elif [ $# -eq 1 ]; then docker exec -it docker-travis bash -ilc " \ rvm use --install --binary --fuzzy $1 bundle install --path vendor/bundle -j 12 \\ --without benchmark:site:development bundle clean bundle exec rake " || status=$? else docker exec -it docker-travis \ bash -il || status=$? fi docker rm -fv docker-travis > /dev/null exit $status jekyll-3.1.6/script/vendor-mimes000077500000000000000000000023541271741406300166630ustar00rootroot00000000000000#!/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) jekyll-3.1.6/site/000077500000000000000000000000001271741406300137645ustar00rootroot00000000000000jekyll-3.1.6/site/.gitignore000066400000000000000000000000301271741406300157450ustar00rootroot00000000000000_site/ *.swp pkg/ test/ jekyll-3.1.6/site/CNAME000066400000000000000000000000151271741406300145260ustar00rootroot00000000000000jekyllrb.com jekyll-3.1.6/site/README.md000066400000000000000000000007171271741406300152500ustar00rootroot00000000000000# 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: jekyll-3.1.6/site/_config.yml000066400000000000000000000010431271741406300161110ustar00rootroot00000000000000markdown: kramdown highlighter: pygments permalink: /news/:year/:month/:day/:title/ 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 timezone: America/Los_Angeles 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 - jekyll-redirect-from - jemoji jekyll-3.1.6/site/_data/000077500000000000000000000000001271741406300150345ustar00rootroot00000000000000jekyll-3.1.6/site/_data/docs.yml000066400000000000000000000012221271741406300165040ustar00rootroot00000000000000- title: Getting Started docs: - home - quickstart - installation - usage - structure - configuration - title: Your Content docs: - frontmatter - posts - drafts - pages - static-files - variables - collections - datafiles - assets - migrations - title: Customization docs: - templates - permalinks - pagination - plugins - extras - title: Deployment docs: - github-pages - deployment-methods - continuous-integration - title: Miscellaneous docs: - troubleshooting - sites - resources - upgrading/0-to-2 - upgrading/2-to-3 - title: Meta docs: - contributing - conduct - history jekyll-3.1.6/site/_docs/000077500000000000000000000000001271741406300150535ustar00rootroot00000000000000jekyll-3.1.6/site/_docs/assets.md000066400000000000000000000055501271741406300167040ustar00rootroot00000000000000--- 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`.
    Jekyll processes all Liquid filters and tags in asset files

    If you are using Mustache or another JavaScript templating language that conflicts with the Liquid template syntax, you will need to place {% raw %} and {% endraw %} tags around your code.

    ## Sass/SCSS Jekyll allows you to customize your Sass conversion in certain ways. Place all your partials in your `sass_dir`, which defaults to `/_sass`. Place your main SCSS or Sass files in the place you want them to be in the output file, such as `/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
    The sass_dir is only used by Sass

    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.

    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 %} jekyll-3.1.6/site/_docs/collections.md000066400000000000000000000227261271741406300177240ustar00rootroot00000000000000--- layout: docs title: Collections permalink: /docs/collections/ ---
    Collections support is unstable and may change

    This is an experimental feature and the API may change until the feature stabilizes.

    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. `/_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.
    Be sure to name your directories correctly

    The folder must be named identically to the collection you defined in your _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 `/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 `/awesome/some_subdir/some_doc/index.html`.
    Don't forget to add YAML for processing

    Files in collections that do not have front matter are treated as static files and simply copied to their output location without processing.

    Variable Description

    collection

    Label of the containing collection.

    path

    Path to the document relative to the collection's directory.

    name

    The document's base filename, with every sequence of spaces and non-alphanumeric characters replaced by a hyphen.

    title

    The document's lowercase title (as defined in its front matter), with every sequence of spaces and non-alphanumeric characters replaced by a hyphen. If the document does not define a title in its front matter, this is equivalent to name.

    output_ext

    Extension of the output file.

    ## 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:
    Variable Description

    label

    The name of your collection, e.g. my_collection.

    docs

    An array of documents.

    files

    An array of static files in the collection.

    relative_directory

    The path to the collection's source directory, relative to the site source.

    directory

    The full path to the collections's source directory.

    output

    Whether the collection's documents will be output as individual files.

    ### Documents In addition to any YAML Front Matter provided in the document's corresponding file, each document has the following attributes:
    Variable Description

    content

    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.

    output

    The rendered output of the document, based on the content.

    path

    The full path to the document's source file.

    relative_path

    The path to the document's source file relative to the site source.

    url

    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 render key in the site's configuration file.

    collection

    The name of the document's collection.

    ## 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 %}

    {{ album.title }}

    Performed by {{ album.artist }}{% if album.director %}, directed by {{ album.director }}{% endif %}

    {% for work in album.works %}

    {{ work.title }}

    Composed by {{ work.composer }}

      {% for track in work.tracks %}
    • {{ track.title }} ({{ track.duration }})
    • {% endfor %}
    {% endfor %} {% endfor %} {% endraw %} {% endhighlight %} jekyll-3.1.6/site/_docs/conduct.md000066400000000000000000000046611271741406300170430ustar00rootroot00000000000000--- layout: docs title: Code of Conduct permalink: "/docs/conduct/" redirect_from: "/conduct/index.html" editable: false --- 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, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 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 a project maintainer. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at [http://contributor-covenant.org/version/1/3/0/][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/3/0/ jekyll-3.1.6/site/_docs/configuration.md000066400000000000000000000634371271741406300202610ustar00rootroot00000000000000--- layout: docs title: Configuration permalink: /docs/configuration/ --- Jekyll allows you to concoct your sites in any way you can dream up, and it’s thanks to the powerful and flexible configuration options that this is possible. These options can either be specified in a `_config.yml` file placed in your site’s root directory, or can be specified as flags for the `jekyll` executable in the terminal. ## Configuration Settings ### Global Configuration The table below lists the available settings for Jekyll, and the various options (specified in the configuration file) and flags (specified on the command-line) that control them.
    Setting Options and Flags

    Site Source

    Change the directory where Jekyll will read files

    source: DIR

    -s, --source DIR

    Site Destination

    Change the directory where Jekyll will write files

    destination: DIR

    -d, --destination DIR

    Safe

    Disable custom plugins, and ignore symbolic links.

    safe: BOOL

    --safe

    Exclude

    Exclude directories and/or files from the conversion. These exclusions are relative to the site's source directory and cannot be outside the source directory.

    exclude: [DIR, FILE, ...]

    Include

    Force inclusion of directories and/or files in the conversion. .htaccess is a good example since dotfiles are excluded by default.

    include: [DIR, FILE, ...]

    Keep files

    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 destination.

    keep_files: [DIR, FILE, ...]

    Time Zone

    Set the time zone for site generation. This sets the TZ environment variable, which Ruby uses to handle time and date creation and manipulation. Any entry from the IANA Time Zone Database is valid, e.g. America/New_York. A list of all available values can be found here. The default is the local time zone, as set by your operating system.

    timezone: TIMEZONE

    Encoding

    Set the encoding of files by name (only available for Ruby 1.9 or later). The default value is utf-8 starting in 2.0.0, and nil before 2.0.0, which will yield the Ruby default of ASCII-8BIT. Available encodings can be shown by the command ruby -e 'puts Encoding::list.join("\n")'.

    encoding: ENCODING

    Defaults

    Set defaults for YAML Front Matter variables.

    see below

    Destination folders are cleaned on site builds

    The contents of <destination> 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 <keep_files> configuration directive.

    Do not use an important location for <destination>; instead, use it as a staging area and copy files from there to your web server.

    ### Build Command Options
    Setting Options and Flags

    Regeneration

    Enable auto-regeneration of the site when files are modified.

    -w, --[no-]watch

    Configuration

    Specify config files instead of using _config.yml automatically. Settings in later files override settings in earlier files.

    --config FILE1[,FILE2,...]

    Drafts

    Process and render draft posts.

    show_drafts: BOOL

    --drafts

    Environment

    Use a specific environment value in the build.

    JEKYLL_ENV=production

    Future

    Publish posts with a future date.

    future: BOOL

    --future

    LSI

    Produce an index for related posts.

    lsi: BOOL

    --lsi

    Limit Posts

    Limit the number of posts to parse and publish.

    limit_posts: NUM

    --limit_posts NUM

    Force polling

    Force watch to use polling.

    --force_polling

    Verbose output

    Print verbose output.

    -V, --verbose

    Silence Output

    Silence the normal output from Jekyll during a build

    -q, --quiet

    Incremental build

    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.

    incremental: BOOL

    -I, --incremental

    ### Serve Command Options In addition to the options below, the `serve` sub-command can accept any of the options for the `build` sub-command, which are then applied to the site build which occurs right before your site is served.
    Setting Options and Flags

    Local Server Port

    Listen on the given port.

    port: PORT

    --port PORT

    Local Server Hostname

    Listen at the given hostname.

    host: HOSTNAME

    --host HOSTNAME

    Base URL

    Serve the website from the given base URL

    baseurl: URL

    --baseurl URL

    Detach

    Detach the server from the terminal

    detach: BOOL

    -B, --detach

    Skips the initial site build.

    Skips the initial site build which occurs before the server is started.

    --skip-initial-build

    X.509 (SSL) Private Key

    SSL Private Key.

    --ssl-key

    X.509 (SSL) Certificate

    SSL Public certificate.

    --ssl-cert

    Do not use tabs in configuration files

    This will either lead to parsing errors, or Jekyll will revert to the default settings. Use spaces instead.

    ## Custom WEBRick Headers You can provide custom headers for your site by adding them to `_config.yml` {% highlight yaml %} # File: _config.yml webrick: headers: My-Header: My-Value My-Other-Header: My-Other-Value {% endhighlight %} ### Defaults We only provide one default and that's a Content-Type header that disables caching in development so that you don't have to fight with Chrome's aggressive caching when you are in development mode. ## 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. 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. Instead of repeating this configuration each time you create a new post or page, Jekyll provides a way to set these defaults in the site configuration. To do this, you can specify site-wide defaults using the `defaults` key in the `_config.yml` file in your projects root directory. The `defaults` key holds an array of scope/values pairs that define what defaults should be set for a particular file path, and optionally, a file type in that path. Let's say that you want to add a default layout to all pages and posts in your site. You would add this to your `_config.yml` file: {% highlight yaml %} defaults: - scope: path: "" # an empty string here means all files in the project values: layout: "default" {% endhighlight %} Here, we are scoping the `values` to any file that exists in the scopes path. Since the path is set as an empty string, it will apply to **all files** in your project. You probably don't want to set a layout on every file in your project - like css files, for example - so you can also specify a `type` value under the `scope` key. {% highlight yaml %} defaults: - scope: path: "" # an empty string here means all files in the project 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 `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`. {% highlight yaml %} defaults: - scope: path: "" type: "posts" values: layout: "my-site" - scope: path: "projects" type: "pages" # previously `page` in Jekyll 2.2. values: layout: "project" # overrides previous default layout author: "Mr. Hyde" {% 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`. {% highlight yaml %} collections: - my_collection: output: true defaults: - scope: path: "" 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`. ### 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 second to 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: {% highlight yaml %} # In _config.yml ... defaults: - scope: path: "projects" type: "pages" values: layout: "project" author: "Mr. Hyde" category: "project" ... {% endhighlight %} {% highlight yaml %} # In projects/foo_project.md --- author: "John Smith" 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. ## Default Configuration 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.
    There are two unsupported kramdown options

    Please note that both remove_block_html_tags and remove_span_html_tags are currently unsupported in Jekyll due to the fact that they are not included within the kramdown HTML converter.

    {% highlight yaml %} # 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 future: false unpublished: false # Plugins whitelist: [] gems: [] # Conversion markdown: kramdown highlighter: rouge lsi: false excerpt_separator: "\n\n" incremental: 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 quiet: false defaults: [] # Markdown Processors rdiscount: extensions: [] redcarpet: extensions: [] kramdown: 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_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. ### 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`. 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. 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 `` 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 v3.2.x. The most commonly used extensions are: - `tables` - `no_intra_emphasis` - `autolink` [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". For example, in your `_config.yml`: kramdown: input: GFM ### Custom Markdown Processors If you're interested in creating a custom markdown processor, you're in luck! Create a new class in the `Jekyll::Converters::Markdown` namespace: {% highlight ruby %} class Jekyll::Converters::Markdown::MyCustomProcessor def initialize(config) require 'funky_markdown' @config = config rescue LoadError STDERR.puts 'You are missing a library required for Markdown. Please run:' STDERR.puts ' $ [sudo] gem install funky_markdown' raise FatalException.new("Missing dependency: funky_markdown") end def convert(content) ::FunkyMarkdown.new(content).convert end end {% endhighlight %} Once you've created your class and have it properly set up either as a plugin in the `_plugins` folder or as a gem, specify it in your `_config.yml`: {% highlight yaml %} markdown: MyCustomProcessor {% endhighlight %} ## Incremental Regeneration
    Incremental regeneration is still an experimental feature

    While incremental regeneration will work for the most common cases, it will not work correctly in every scenario. Please be extremely cautious when using the feature, and report any problems not listed below by opening an issue on GitHub.

    Incremental regeneration helps shorten build times by only generating documents and pages that were updated since the previous build. It does this by keeping track of both file modification times and inter-document dependencies in the `.jekyll-metadata` file. Under the current implementation, incremental regeneration will only generate a document or page if either it, or one of its dependencies, is modified. Currently, the only types of dependencies tracked are includes (using the {% raw %}`{% include %}`{% endraw %} tag) and layouts. This means that plain references to other documents (for example, the common case of iterating over `site.posts` in a post listings page) will not be detected as a dependency. To remedy some of these shortfalls, putting `regenerate: true` in the front-matter of a document will force Jekyll to regenerate it regardless of whether it has been modified. Note that this will generate the specified document only; references to other documents' contents will not work since they won't be re-rendered. Incremental regeneration can be enabled via the `--incremental` flag (`-I` for short) from the command-line or by setting `incremental: true` in your configuration file. jekyll-3.1.6/site/_docs/continuous-integration.md000066400000000000000000000162531271741406300221330ustar00rootroot00000000000000--- layout: docs title: Continuous Integration permalink: /docs/continuous-integration/ --- You can easily test your website build against one or more versions of Ruby. The following guide will show you how to set up a free build environment on [Travis][0], with [GitHub][1] integration for pull requests. Paid alternatives exist for private repositories. [0]: https://travis-ci.org/ [1]: https://github.com/ ## 1. Enabling Travis and GitHub Enabling Travis builds for your GitHub repository is pretty simple: 1. Go to your profile on travis-ci.org: https://travis-ci.org/profile/username 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 your `.travis.yml` file. More details on that below. ## 2. The Test Script The simplest test script simply runs `jekyll build` and ensures that Jekyll doesn't fail to build the site. It doesn't check the resulting site, but it does ensure things are built properly. When testing Jekyll output, there is no better tool than [html-proofer][2]. 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 %} #!/usr/bin/env bash set -e # halt script on error bundle exec jekyll build bundle exec htmlproof ./_site {% endhighlight %} 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): {% highlight ruby %} #!/usr/bin/env ruby require 'html/proofer' HTML::Proofer.new("./_site").run {% endhighlight %} Options are given as a second argument to `.new`, and are encoded in a 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 ## 3. Configuring Your Travis Builds 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, 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, only for GitHub Pages branches: only: - gh-pages # test the gh-pages branch - /pages-(.*)/ # test every branch which starts with "pages-" env: global: - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer {% endhighlight %} Ok, now for an explanation of each line: {% highlight yaml %} language: ruby {% endhighlight %} This line tells Travis to use a Ruby build container. It gives your script access to Bundler, RubyGems, and a Ruby runtime. {% highlight yaml %} rvm: - 2.1 {% endhighlight %} RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This 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 %} Travis allows you to run any arbitrary shell script to test your site. One convention is to put all scripts for your project in the `script` directory, and to call your test script `cibuild`. This line is completely 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, only for GitHub Pages branches: only: - gh-pages # test the gh-pages branch - /pages-(.*)/ # test every branch which starts with "pages-" {% endhighlight %} You want to ensure the Travis builds for your site are being run only on the branch or branches which contain your site. One means of ensuring this isolation is including a branch whitelist in your Travis configuration file. By specifying the `gh-pages` branch, you will ensure the associated test script (discussed above) is only executed on site branches. If you use 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. Travis will build from every push to any branch of your repo if leave it out. {% highlight yaml %} env: global: - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer {% endhighlight %} 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 decrease the install time of Nokogiri by setting the environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`.
    Be sure to exclude vendor from your _config.yml

    Travis bundles all gems in the vendor directory on its build servers, which Jekyll will mistakenly read and explode on.

    {% 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]: http://jekyllrb.com/help/ jekyll-3.1.6/site/_docs/contributing.md000066400000000000000000000120221271741406300201010ustar00rootroot00000000000000--- layout: docs title: Contributing 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 [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, 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. * Please do your best to submit **small pull requests**. The easier the proposed change is to review, the more likely it will be merged. * When submitting a pull request, please make judicious use of the pull request body. A description of what changes were made, the motivations behind the changes and [any tasks completed or left to complete](http://git.io/gfm-tasks) will also speed up review time.
    Contributions will not be accepted without tests

    If you’re creating a small fix or patch to an existing feature, just a simple test will do.

    Test Dependencies ----------------- To run the test suite and build the gem you'll need to install Jekyll's dependencies. Simply run this command to get all set up:
    $ script/bootstrap
    Before you start, run the tests and make sure that they pass (to confirm your environment is configured properly):
    $ 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 -------- Here's the most direct way to get your work merged into the project: * Fork the project. * Clone down your fork ( `git clone git@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 `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 does and the why you think it should be merged. Updating Documentation ---------------------- We want the Jekyll documentation to be the best it can be. We've open-sourced our docs and we welcome any pull requests if you find it lacking. 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 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. 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 link to your plugin under the proper subheading depending upon its type. Gotchas ------- * 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 actively read the issues and will label it once they come across it. Finally... ----------
    Let us know what could be better!

    Both using and hacking on Jekyll should be fun, simple, and easy, so if for some reason you find it’s a pain, please create an issue on GitHub describing your experience so we can make it better.

    jekyll-3.1.6/site/_docs/datafiles.md000066400000000000000000000067271271741406300173450ustar00rootroot00000000000000--- layout: docs title: Data Files permalink: /docs/datafiles/ --- 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/), [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`. Plugins/themes can also leverage Data Files to set configuration variables. ## The Data Folder 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`, `.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: In `_data/members.yml`: {% highlight yaml %} - name: Eric Mill github: konklone - name: Parker Moore github: parkr - name: Liu Fengyun github: liufengyun {% endhighlight %} Or `_data/members.csv`: {% highlight text %} name,github Eric Mill,konklone Parker Moore,parkr Liu Fengyun,liufengyun {% endhighlight %} This data can be accessed via `site.data.members` (notice that the filename determines the variable name). You can now render the list of members in a template: {% highlight html %} {% raw %} {% endraw %} {% endhighlight %} ## 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 below shows how GitHub organizations could be defined separately in a file under the `orgs` folder: In `_data/orgs/jekyll.yml`: {% highlight yaml %} username: jekyll name: Jekyll members: - name: Tom Preston-Werner github: mojombo - name: Parker Moore github: parkr {% endhighlight %} In `_data/orgs/doeorg.yml`: {% highlight yaml %} username: doeorg name: Doe Org members: - name: John Doe github: jdoe {% endhighlight %} The organizations can then be accessed via `site.data.orgs`, followed by the file name: {% highlight html %} {% raw %}
      {% for org_hash in site.data.orgs %} {% assign org = org_hash[1] %}
    • {{ org.name }} ({{ org.members | size }} members)
    • {% endfor %}
    {% 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] %} {% endraw %} {% endhighlight %} jekyll-3.1.6/site/_docs/deployment-methods.md000066400000000000000000000250511271741406300212210ustar00rootroot00000000000000--- layout: docs title: Deployment methods permalink: /docs/deployment-methods/ --- Sites built using Jekyll can be deployed in a large number of ways due to the static nature of the generated output. A few of the most common deployment techniques are described below. ## Web hosting providers (FTP) Just about any traditional web hosting provider will let you upload files to their servers over FTP. To upload a Jekyll site to a web host using FTP, simply run the `jekyll` command and copy the generated `_site` folder to the root folder of your hosting account. This is most likely to be the `httpdocs` or `public_html` folder on most hosting providers. ### FTP using Glynn There is a project called [Glynn](https://github.com/dmathieu/glynn), which lets you easily generate your Jekyll powered website’s static files and send them to your host through FTP. ## Self-managed web server If you have direct access yourself to the deployment web server yourself, the process is essentially the same, except you might have other methods available to you (such as `scp`, or even direct filesystem access) for transferring the files. Just remember to make sure the contents of the generated `_site` folder get placed in the appropriate web root directory for your web server. ## Automated methods There are also a number of ways to easily automate the deployment of a Jekyll site. If you’ve got another method that isn’t listed below, we’d love it if you [contributed](../contributing/) so that everyone else can benefit too. ### Git post-update hook If you store your Jekyll site in [Git](http://git-scm.com/) (you are using version control, right?), it’s pretty easy to automate the deployment process by setting up a post-update hook in your Git repository, [like this](http://web.archive.org/web/20091223025644/http://www.taknado.com/en/2009/03/26/deploying-a-jekyll-generated-site/). ### Git post-receive hook To have a remote server handle the deploy for you every time you push changes using Git, you can create a user account which has all the public keys that are authorized to deploy in its `authorized_keys` file. With that in place, setting up the post-receive hook is done as follows: {% highlight bash %} laptop$ ssh deployer@example.com server$ mkdir myrepo.git server$ cd myrepo.git server$ git --bare init server$ cp hooks/post-receive.sample hooks/post-receive server$ mkdir /var/www/myrepo {% endhighlight %} Next, add the following lines to hooks/post-receive and be sure Jekyll is installed on the server: {% highlight bash %} GIT_REPO=$HOME/myrepo.git TMP_GIT_CLONE=$HOME/tmp/myrepo PUBLIC_WWW=/var/www/myrepo git clone $GIT_REPO $TMP_GIT_CLONE jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW rm -Rf $TMP_GIT_CLONE exit {% endhighlight %} Finally, run the following command on any users laptop that needs to be able to deploy using this hook: {% highlight bash %} laptops$ git remote add deploy deployer@example.com:~/myrepo.git {% endhighlight %} Deploying is now as easy as telling nginx or Apache to look at `/var/www/myrepo` and running the following: {% highlight bash %} laptops$ git push deploy master {% endhighlight %} ### Jekyll-hook You can also use jekyll-hook, a server that listens for webhook posts from GitHub, generates a website with Jekyll, and moves it somewhere to be published. Use this to run your own GitHub Pages-style web server. This method is useful if you need to serve your websites behind a firewall, need extra server-level features like HTTP basic authentication or want to 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/ruby/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/vitalyrepin/vrepinblog/blob/master/transfer.sh). You’d obviously need to change the values to reflect your site’s details. Certificate-based authorization is another way to simplify the publishing process. It makes sense to restrict rsync access only to the directory which it is supposed to sync. This can be done using rrsync. #### Step 1: Install rrsync to your home folder (server-side) If it is not already installed by your host, you can do it yourself: - [Download rrsync](http://ftp.samba.org/pub/unpacked/rsync/support/rrsync) - Place it in the `bin` subdirectory of your home folder (`~/bin`) - Make it executable (`chmod +x`) #### Step 2: Set up certificate-based SSH access (server side) This [process](https://wiki.gentoo.org/wiki/SSH#Passwordless_Authentication) is described in several places online. What is different from the typical approach is to put the restriction to certificate-based authorization in `~/.ssh/authorized_keys`. Then, launch `rrsync` and supply it with the folder it shall have read-write access to: {% highlight bash %} command="$HOME/bin/rrsync ",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa {% endhighlight %} `` is the path to your site. E.g., `~/public_html/you.org/blog-html/`. #### Step 3: Rsync (client-side) Add the `deploy` script to the site source folder: {% highlight bash %} #!/bin/sh rsync -crvz --rsh=ssh -p2222' --delete-after --delete-excluded @: {% endhighlight %} Command line parameters are: - `--rsh=ssh -p2222` — The port for SSH access. It is required if your host uses a different port than the default (e.g, HostGator) - `` — The name of the local output folder (defaults to `_site`) - `` — The username for your hosting account - `` — Your hosting server Using this setup, you might run the following command: {% highlight bash %} rsync -crvz --rsh='ssh -p2222' --delete-after --delete-excluded _site/ hostuser@example.org: {% endhighlight %} Don't forget the column `:` after server name! #### Step 4 (Optional): Exclude the transfer script from being copied to the output folder. This step is recommended if you use these instructions to deploy your site. If you put the `deploy` script in the root folder of your project, Jekyll will copy it to the output folder. This behavior can be changed in `_config.yml`. Just add the following line: {% highlight yaml %} # Do not copy these files to the output directory exclude: ["deploy"] {% endhighlight %} Alternatively, you can use an `rsync-exclude.txt` file to control which files will be transferred to your server. #### Done! Now it's possible to publish your website simply by running the `deploy` script. If your SSH certificate is [passphrase-protected](https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html), you will be asked to enter it when the script executes. ## Rack-Jekyll [Rack-Jekyll](https://github.com/adaoraul/rack-jekyll/) is an easy way to deploy your site on any Rack server such as Amazon EC2, Slicehost, Heroku, and so forth. It also can run with [shotgun](https://github.com/rtomayko/shotgun/), [rackup](https://github.com/rack/rack), [mongrel](https://github.com/mongrel/mongrel), [unicorn](https://github.com/defunkt/unicorn/), and [others](https://github.com/adaoraul/rack-jekyll#readme). Read [this post](http://blog.crowdint.com/2010/08/02/instant-blog-using-jekyll-and-heroku.html) on how to deploy to Heroku using Rack-Jekyll. ## Jekyll-Admin for Rails If you want to maintain Jekyll inside your existing Rails app, [Jekyll-Admin](https://github.com/zkarpinski/Jekyll-Admin) contains drop in code to make this possible. See Jekyll-Admin’s [README](https://github.com/zkarpinski/Jekyll-Admin/blob/master/README) for more details. ## Amazon S3 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. ## OpenShift If you'd like to deploy your site to an OpenShift gear, there's [a cartridge for that](https://github.com/openshift-cartridges/openshift-jekyll-cartridge).
    ProTip™: Use GitHub Pages for zero-hassle Jekyll hosting

    GitHub Pages are powered by Jekyll behind the scenes, so if you’re looking for a zero-hassle, zero-cost solution, GitHub Pages are a great way to host your Jekyll-powered website for free.

    ## Kickster Use [Kickster](http://kickster.nielsenramon.com/) for easy (automated) deploys to GitHub Pages when using unsupported plugins on GitHub Pages. Kickster provides a basic Jekyll project setup packed with web best practises and useful optimization tools increasing your overall project quality. Kickster ships with automated and worry-free deployment scripts for GitHub Pages. Setting up Kickster is very easy, just install the gem and you are good to go. More documentation can here found [here](https://github.com/nielsenramon/kickster#kickster). If you do not want to use the gem or start a new project you can just copy paste the deployment scripts for [Travis CI](https://github.com/nielsenramon/kickster/tree/master/snippets/travis) or [Circle CI](https://github.com/nielsenramon/kickster#automated-deployment-with-circle-ci). jekyll-3.1.6/site/_docs/drafts.md000066400000000000000000000012551271741406300166630ustar00rootroot00000000000000--- 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. jekyll-3.1.6/site/_docs/extras.md000066400000000000000000000023271271741406300167070ustar00rootroot00000000000000--- layout: docs title: Extras permalink: /docs/extras/ --- There are a number of (optional) extra features that Jekyll supports that you may want to install, depending on how you plan to use Jekyll. ## Math Support Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](http://www.mathjax.org/) within math blocks. See the Kramdown documentation on [math blocks](http://kramdown.gettalong.org/syntax.html#math-blocks) and [math support](http://kramdown.gettalong.org/converter/html.html#math-support) for more details. MathJax requires you to include JavaScript or CSS to render the LaTeX, e.g. {% highlight html %} {% endhighlight %} For more information about getting started, check out [this excellent blog post](http://gastonsanchez.com/opinion/2014/02/16/Mathjax-with-jekyll/). ## Alternative Markdown Processors See the Markdown section on the [configuration page](/docs/configuration/#markdown-options) for instructions on how to use and configure alternative Markdown processors, as well as how to create [custom processors](/docs/configuration/#custom-markdown-processors). jekyll-3.1.6/site/_docs/frontmatter.md000066400000000000000000000122011271741406300177360ustar00rootroot00000000000000--- layout: docs title: Front Matter permalink: /docs/frontmatter/ --- 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 basic example: {% highlight yaml %} --- layout: post title: Blogging Like a Hacker --- {% endhighlight %} Between these triple-dashed lines, you can set predefined variables (see below for a reference) or even create custom ones of your own. These variables will then be available to you to access using Liquid tags both further down in the file and also in any layouts or includes that the page or post in question relies on.
    UTF-8 Character Encoding Warning

    If you use UTF-8 encoding, make sure that no BOM header characters exist in your files or very, very bad things will happen to Jekyll. This is especially relevant if you’re running Jekyll on Windows.

    ProTip™: Front Matter Variables Are Optional

    If you want to use Liquid tags and variables 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!)

    ## Predefined Global Variables There are a number of predefined global variables that you can set in the front matter of a page or post.
    Variable Description

    layout

    If set, this specifies the layout file to use. Use the layout file name without the file extension. Layout files must be placed in the _layouts directory.

    permalink

    If you need your processed blog post URLs to be something other than the site-wide style (default /year/month/day/title.html), then you can set this variable and it will be used as the final URL.

    published

    Set to false if you don’t want a specific post to show up when the site is generated.

    category

    categories

    Instead of placing posts inside of folders, you can specify one or more categories that the post belongs to. When the site is generated the post will act as though it had been set with these categories normally. Categories (plural key) can be specified as a YAML list or a comma-separated string.

    tags

    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 comma-separated string.

    ## Custom Variables Any variables in the front matter that are not predefined are mixed into the data that is sent to the Liquid templating engine during the conversion. For instance, if you set a title, you can use that in your layout to set the page title: {% highlight html %} {% raw %}{{ page.title }}{% endraw %} ... {% endhighlight %} ## Predefined Variables for Posts These are available out-of-the-box to be used in the front matter for a post.
    Variable Description

    date

    A date here overrides the date from the name of the post. This can be used to ensure correct sorting of posts. A date is specified in the format YYYY-MM-DD HH:MM:SS +/-TTTT; hours, minutes, seconds, and timezone offset are optional.

    ProTip™: Don't repeat yourself

    If you don't want to repeat your frequently used front matter variables over and over, just define defaults for them and only override them where necessary (or not at all). This works both for predefined and custom variables.

    jekyll-3.1.6/site/_docs/github-pages.md000066400000000000000000000125221271741406300177560ustar00rootroot00000000000000--- layout: docs title: GitHub Pages permalink: /docs/github-pages/ --- [GitHub Pages](http://pages.github.com) are public web pages for users, organizations, and repositories, that are freely hosted on GitHub's `github.io` domain or on a custom domain name of your choice. GitHub Pages are powered by Jekyll behind the scenes, so in addition to supporting regular HTML content, they’re also a great way to host your Jekyll-powered website for free. Never built a website with GitHub Pages before? [See this marvelous guide by Jonathan McGlone to get you up and running](http://jmcglone.com/guides/github-pages/). This guide will teach you what you need to know about Git, GitHub, and Jekyll to create your very own website on GitHub Pages. ### Project Page URL Structure Sometimes it's nice to preview your Jekyll site before you push your `gh-pages` branch to GitHub. However, the subdirectory-like URL structure GitHub uses for Project Pages complicates the proper resolution of URLs. In order to assure your site builds properly, use `site.github.url` in your URL's. {% highlight html %} {% raw %} {{ page.title }} {% endraw %} {% endhighlight %} 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 will resolve properly. ## Deploying Jekyll to GitHub Pages GitHub Pages work by looking at certain branches of repositories on GitHub. 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.
    Use the github-pages gem

    Our friends at GitHub have provided the github-pages 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 Gemfile: {% 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 bundle install, you have the correct version of the github-pages gem. If that fails, simplify it: {% highlight ruby %} source 'https://rubygems.org' gem 'github-pages' {% endhighlight %} And be sure to run bundle update often.

    ### User and Organization Pages User and organization pages live in a special GitHub repository dedicated to only the GitHub Pages files. This repository must be named after the account name. For example, [@mojombo’s user page repository](https://github.com/mojombo/mojombo.github.io) has the name `mojombo.github.io`. Content from the `master` branch of your repository will be used to build and publish the GitHub Pages site, so make sure your Jekyll site is stored there.
    Custom domains do not affect repository names

    GitHub Pages are initially configured to live under the username.github.io subdomain, which is why repositories must be named this way even if a custom domain is being used.

    ### Project Pages Unlike user and organization Pages, Project Pages are kept in the same repository as the project they are for, except that the website content is stored in a specially named `gh-pages` branch. The content of this branch will be rendered using Jekyll, and the output will become available under a subpath of your user pages subdomain, such as `username.github.io/project` (unless a custom domain is specified—see below). The Jekyll project repository itself is a perfect example of this branch structure—the [master branch]({{ site.repository }}) contains the 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.
    Source Files Must be in the Root Directory

    GitHub Pages overrides the “Site Source” configuration value, so if you locate your files anywhere other than the root directory, your site may not build correctly.

    GitHub Pages Documentation, Help, and Support

    For more information about what you can do with GitHub Pages, as well as for troubleshooting guides, you should check out GitHub’s Pages Help section. If all else fails, you should contact GitHub Support.

    jekyll-3.1.6/site/_docs/history.md000066400000000000000000004406011271741406300171030ustar00rootroot00000000000000--- layout: docs title: History permalink: "/docs/history/" --- ## 3.1.6 / 2016-05-19 {: #v3-1-6} ### Bug Fixes {: #bug-fixes-v3-1-6} - Add ability to `jsonify` Drops such that, e.g. `site | jsonify`, works. ([#4914]({{ site.repository }}/issues/4914)) ## 3.1.5 / 2016-05-18 {: #v3-1-5} ### Bug Fixes {: #bug-fixes-v3-1-5} - Sort the results of the `require_all` glob (affects Linux only). ([#4912]({{ site.repository }}/issues/4912)) ## 3.1.4 / 2016-05-18 {: #v3-1-4} ### Bug Fixes {: #bug-fixes-v3-1-4} - Add `ExcerptDrop` and remove excerpt's ability to refer to itself in Liquid ([#4907]({{ site.repository }}/issues/4907)) - Configuration permalink fix where `collections.posts.permalink` inherits properly from `permalink` only when it doesn't exist ([#4910]({{ site.repository }}/issues/4910)) - Add `Configuration.from` to make it easier to build configs from just a hash - Sorting `site.collections` in Liquid by label ([#4910]({{ site.repository }}/issues/4910)) - Fix bug where `layout` in Liquid would inherit from previously-rendered layouts' metadatas ([#4909]({{ site.repository }}/issues/4909)) - Fix bug where `layout` in Liquid would override in the wrong direction (more-specific layouts' data were overwritten by their parent layouts' data; this has now been reversed) ([#4909]({{ site.repository }}/issues/4909)) ## 3.1.2 / 2016-02-19 {: #v3-1-2} ### Minor Enhancements {: #minor-enhancements-v3-1-2} - Include `.rubocop.yml` in Gem ([#4437]({{ site.repository }}/issues/4437)) - `LiquidRenderer#parse`: parse with line numbers. ([#4452]({{ site.repository }}/issues/4452)) - Add consistency to the no-subcommand deprecation message ([#4505]({{ site.repository }}/issues/4505)) ### Bug Fixes {: #bug-fixes-v3-1-2} - Fix syntax highlighting in kramdown by making `[@config](https://github.com/config)` accessible in the Markdown converter. ([#4428]({{ site.repository }}/issues/4428)) - `Jekyll.sanitized_path`: sanitizing a questionable path should handle tildes ([#4492]({{ site.repository }}/issues/4492)) - Fix `titleize` so already capitalized words are not dropped ([#4525]({{ site.repository }}/issues/4525)) - Permalinks which end in a slash should always output HTML ([#4546]({{ site.repository }}/issues/4546)) ### Development Fixes {: #development-fixes-v3-1-2} - Require at least cucumber version 2.1.0 ([#4514]({{ site.repository }}/issues/4514)) ### Site Enhancements {: #site-enhancements-v3-1-2} - Add jekyll-toc plugin ([#4429]({{ site.repository }}/issues/4429)) - Docs: Quickstart - added documentation about the `--force` option ([#4410]({{ site.repository }}/issues/4410)) - Fix broken links to the Code of Conduct ([#4436]({{ site.repository }}/issues/4436)) - Upgrade notes: mention trailing slash in permalink; fixes [#4440]({{ site.repository }}/issues/4440) ([#4455]({{ site.repository }}/issues/4455)) - Add hooks to the plugin categories toc ([#4463]({{ site.repository }}/issues/4463)) - [add note] Jekyll 3 requires newer version of Ruby. ([#4461]({{ site.repository }}/issues/4461)) - Fix typo in upgrading docs ([#4473]({{ site.repository }}/issues/4473)) - Add note about upgrading documentation on jekyllrb.com/help/ ([#4484]({{ site.repository }}/issues/4484)) - Update Rake link ([#4496]({{ site.repository }}/issues/4496)) - Update & prune the short list of example sites ([#4374]({{ site.repository }}/issues/4374)) - Added amp-jekyll plugin to plugins docs ([#4517]({{ site.repository }}/issues/4517)) - A few grammar fixes ([#4512]({{ site.repository }}/issues/4512)) - Correct a couple mistakes in structure.md ([#4522]({{ site.repository }}/issues/4522)) ## 3.1.1 / 2016-01-29 {: #v3-1-1} ### Meta - Update the Code of Conduct to the latest version ([#4402]({{ site.repository }}/issues/4402)) ### Bug Fixes {: #bug-fixes-v3-1-1} - `Page#dir`: ensure it ends in a slash ([#4403]({{ site.repository }}/issues/4403)) - Add `Utils.merged_file_read_opts` to unify reading & strip the BOM ([#4404]({{ site.repository }}/issues/4404)) - `Renderer#output_ext`: honor folders when looking for ext ([#4401]({{ site.repository }}/issues/4401)) ### Development Fixes {: #development-fixes-v3-1-1} - Suppress stdout in liquid profiling test ([#4409]({{ site.repository }}/issues/4409)) ## 3.1.0 / 2016-01-23 {: #v3-1-0} ### Minor Enhancements {: #minor-enhancements-v3-1-0} - Use `Liquid::Drop`s instead of `Hash`es in `#to_liquid` ([#4277]({{ site.repository }}/issues/4277)) - Add 'sample' Liquid filter Equivalent to Array#sample functionality ([#4223]({{ site.repository }}/issues/4223)) - Cache parsed include file to save liquid parsing time. ([#4120]({{ site.repository }}/issues/4120)) - Slightly speed up url sanitization and handle multiples of ///. ([#4168]({{ site.repository }}/issues/4168)) - Print debug message when a document is skipped from reading ([#4180]({{ site.repository }}/issues/4180)) - Include tag should accept multiple variables in the include name ([#4183]({{ site.repository }}/issues/4183)) - Add `-o` option to serve command which opens server URL ([#4144]({{ site.repository }}/issues/4144)) - Add CodeClimate platform for better code quality. ([#4220]({{ site.repository }}/issues/4220)) - General improvements for WEBrick via jekyll serve such as SSL & custom headers ([#4224]({{ site.repository }}/issues/4224), [#4228]({{ site.repository }}/issues/4228)) - Add a default charset to content-type on webrick. ([#4231]({{ site.repository }}/issues/4231)) - Switch `PluginManager` to use `require_with_graceful_fail` for better UX ([#4233]({{ site.repository }}/issues/4233)) - Allow quoted date in front matter defaults ([#4184]({{ site.repository }}/issues/4184)) - Add a Jekyll doctor warning for URLs that only differ by case ([#3171]({{ site.repository }}/issues/3171)) - drops: create one base Drop class which can be set as mutable or not ([#4285]({{ site.repository }}/issues/4285)) - drops: provide `#to_h` to allow for hash introspection ([#4281]({{ site.repository }}/issues/4281)) - Shim subcommands with indication of gem possibly required so users know how to use them ([#4254]({{ site.repository }}/issues/4254)) - Add smartify Liquid filter for SmartyPants ([#4323]({{ site.repository }}/issues/4323)) - Raise error on empty permalink ([#4361]({{ site.repository }}/issues/4361)) - Refactor Page#permalink method ([#4389]({{ site.repository }}/issues/4389)) ### Bug Fixes {: #bug-fixes-v3-1-0} - Pass build options into `clean` command ([#4177]({{ site.repository }}/issues/4177)) - Allow users to use .htm and .xhtml (XHTML5.) ([#4160]({{ site.repository }}/issues/4160)) - Prevent Shell Injection. ([#4200]({{ site.repository }}/issues/4200)) - Convertible should make layout data accessible via `layout` instead of `page` ([#4205]({{ site.repository }}/issues/4205)) - Avoid using `Dir.glob` with absolute path to allow special characters in the path ([#4150]({{ site.repository }}/issues/4150)) - Handle empty config files ([#4052]({{ site.repository }}/issues/4052)) - Rename `[@options](https://github.com/options)` so that it does not impact Liquid. ([#4173]({{ site.repository }}/issues/4173)) - utils/drops: update Drop to support `Utils.deep_merge_hashes` ([#4289]({{ site.repository }}/issues/4289)) - Make sure jekyll/drops/drop is loaded first. ([#4292]({{ site.repository }}/issues/4292)) - Convertible/Page/Renderer: use payload hash accessor & setter syntax for backwards-compatibility ([#4311]({{ site.repository }}/issues/4311)) - Drop: fix hash setter precendence ([#4312]({{ site.repository }}/issues/4312)) - utils: `has_yaml_header?` should accept files with extraneous spaces ([#4290]({{ site.repository }}/issues/4290)) - Escape html from site.title and page.title in site template ([#4307]({{ site.repository }}/issues/4307)) - Allow custom file extensions if defined in `permalink` YAML front matter ([#4314]({{ site.repository }}/issues/4314)) - Fix deep_merge_hashes! handling of drops and hashes ([#4359]({{ site.repository }}/issues/4359)) - Page should respect output extension of its permalink ([#4373]({{ site.repository }}/issues/4373)) - Disable auto-regeneration when running server detached ([#4376]({{ site.repository }}/issues/4376)) - Drop#[]: only use public_send for keys in the content_methods array ([#4388]({{ site.repository }}/issues/4388)) - Extract title from filename successfully when no date. ([#4195]({{ site.repository }}/issues/4195)) ### Development Fixes {: #development-fixes-v3-1-0} - `jekyll-docs` should be easily release-able ([#4152]({{ site.repository }}/issues/4152)) - Allow use of Cucumber 2.1 or greater ([#4181]({{ site.repository }}/issues/4181)) - Modernize Kramdown for Markdown converter. ([#4109]({{ site.repository }}/issues/4109)) - Change TestDoctorCommand to JekyllUnitTest... ([#4263]({{ site.repository }}/issues/4263)) - Create namespaced rake tasks in separate `.rake` files under `lib/tasks` ([#4282]({{ site.repository }}/issues/4282)) - markdown: refactor for greater readability & efficiency ([#3771]({{ site.repository }}/issues/3771)) - Fix many Rubocop style errors ([#4301]({{ site.repository }}/issues/4301)) - Fix spelling of "GitHub" in docs and history ([#4322]({{ site.repository }}/issues/4322)) - Reorganize and cleanup the Gemfile, shorten required depends. ([#4318]({{ site.repository }}/issues/4318)) - Remove script/rebund. ([#4341]({{ site.repository }}/issues/4341)) - Implement codeclimate platform ([#4340]({{ site.repository }}/issues/4340)) - Remove ObectSpace dumping and start using inherited, it's faster. ([#4342]({{ site.repository }}/issues/4342)) - Add script/travis so all people can play with Travis-CI images. ([#4338]({{ site.repository }}/issues/4338)) - Move Cucumber to using RSpec-Expections and furthering JRuby support. ([#4343]({{ site.repository }}/issues/4343)) - Rearrange Cucumber and add some flair. ([#4347]({{ site.repository }}/issues/4347)) - Remove old FIXME ([#4349]({{ site.repository }}/issues/4349)) - Clean up the Gemfile (and keep all the necessary dependencies) ([#4350]({{ site.repository }}/issues/4350)) ### Site Enhancements {: #site-enhancements-v3-1-0} - Add three plugins to directory ([#4163]({{ site.repository }}/issues/4163)) - Add upgrading docs from 2.x to 3.x ([#4157]({{ site.repository }}/issues/4157)) - Add `protect_email` to the plugins index. ([#4169]({{ site.repository }}/issues/4169)) - Add `jekyll-deploy` to list of third-party plugins ([#4179]({{ site.repository }}/issues/4179)) - Clarify plugin docs ([#4154]({{ site.repository }}/issues/4154)) - Add Kickster to deployment methods in documentation ([#4190]({{ site.repository }}/issues/4190)) - Add DavidBurela's tutorial for Windows to Windows docs page ([#4210]({{ site.repository }}/issues/4210)) - Change GitHub code block to highlight tag to avoid it overlaps parent div ([#4121]({{ site.repository }}/issues/4121)) - Update FormKeep link to be something more specific to Jekyll ([#4243]({{ site.repository }}/issues/4243)) - Remove example Roger Chapman site, as the domain doesn't exist ([#4249]({{ site.repository }}/issues/4249)) - Added configuration options for `draft_posts` to configuration docs ([#4251]({{ site.repository }}/issues/4251)) - Fix checklist in `_assets.md` ([#4259]({{ site.repository }}/issues/4259)) - Add Markdown examples to Pages docs ([#4275]({{ site.repository }}/issues/4275)) - Add jekyll-paginate-category to list of third-party plugins ([#4273]({{ site.repository }}/issues/4273)) - Add `jekyll-responsive_image` to list of third-party plugins ([#4286]({{ site.repository }}/issues/4286)) - Add `jekyll-commonmark` to list of third-party plugins ([#4299]({{ site.repository }}/issues/4299)) - Add documentation for incremental regeneration ([#4293]({{ site.repository }}/issues/4293)) - Add note about removal of relative permalink support in upgrading docs ([#4303]({{ site.repository }}/issues/4303)) - Add Pro Tip to use front matter variable to create clean URLs ([#4296]({{ site.repository }}/issues/4296)) - Fix grammar in the documentation for posts. ([#4330]({{ site.repository }}/issues/4330)) - Add documentation for smartify Liquid filter ([#4333]({{ site.repository }}/issues/4333)) - Fixed broken link to blog on using mathjax with jekyll ([#4344]({{ site.repository }}/issues/4344)) - Documentation: correct reference in Precedence section of Configuration docs ([#4355]({{ site.repository }}/issues/4355)) - Add [@jmcglone](https://github.com/jmcglone)'s guide to github-pages doc page ([#4364]({{ site.repository }}/issues/4364)) - Added the Wordpress2Jekyll Wordpress plugin ([#4377]({{ site.repository }}/issues/4377)) - Add Contentful Extension to list of third-party plugins ([#4390]({{ site.repository }}/issues/4390)) - Correct Minor spelling error ([#4394]({{ site.repository }}/issues/4394)) ## 3.0.3 / 2016-02-08 {: #v3-0-3} ### Bug Fixes {: #bug-fixes-v3-0-3} - Fix extension weirdness with folders ([#4493]({{ site.repository }}/issues/4493)) - EntryFilter: only include 'excluded' log on excluded files ([#4479]({{ site.repository }}/issues/4479)) - `Jekyll.sanitized_path`: escape tildes before sanitizing a questionable path ([#4468]({{ site.repository }}/issues/4468)) - `LiquidRenderer#parse`: parse with line numbers ([#4453]({{ site.repository }}/issues/4453)) - `Document#<=>`: protect against nil comparison in dates. ([#4446]({{ site.repository }}/issues/4446)) ## 3.0.2 / 2016-01-20 {: #v3-0-2} ### Bug Fixes {: #bug-fixes-v3-0-2} - Document: throw a useful error when an invalid date is given ([#4378]({{ site.repository }}/issues/4378)) ## 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 `` 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} ### Minor Enhancements {: #minor-enhancements-v2-2-0} - Throw a warning if the specified layout does not exist ([#2620]({{ site.repository }}/issues/2620)) - Whitelist Pygments options in safe mode ([#2642]({{ site.repository }}/issues/2642)) ### Bug Fixes {: #bug-fixes-v2-2-0} - Remove unnecessary `Jekyll::Tags::IncludeTag#blank?` method ([#2625]({{ site.repository }}/issues/2625)) - Categories in the path are ignored ([#2633]({{ site.repository }}/issues/2633)) ### Development Fixes {: #development-fixes-v2-2-0} - Refactoring Errors & Requires of Third-Party stuff ([#2591]({{ site.repository }}/issues/2591)) - Add further tests for categories ([#2584]({{ site.repository }}/issues/2584)) - Proof site with html-proofer on change ([#2605]({{ site.repository }}/issues/2605)) - Fix up bug in [#2605]({{ site.repository }}/issues/2605) which caused proofing the site not to function ([#2608]({{ site.repository }}/issues/2608)) - Use `bundle exec` in `script/proof` ([#2610]({{ site.repository }}/issues/2610)) ### Site Enhancements {: #site-enhancements-v2-2-0} - Update Kramdown urls ([#2588]({{ site.repository }}/issues/2588)) - Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of third-party plugins ([#2596]({{ site.repository }}/issues/2596)) - Fix a bunch of broken links in the site ([#2601]({{ site.repository }}/issues/2601)) - Replace dead links with working links ([#2611]({{ site.repository }}/issues/2611)) - Add jekyll-hook to deployment methods ([#2617]({{ site.repository }}/issues/2617)) - Added kramdown-with-pygments plugin to the list of third-party plugins ([#2623]({{ site.repository }}/issues/2623)) - Update outdated "Extras" page and remove duplicate documentation ([#2622]({{ site.repository }}/issues/2622)) - Add co2 plugin to list of third-party plugins ([#2639]({{ site.repository }}/issues/2639)) - Attempt to clarify the way Sass imports happen ([#2642]({{ site.repository }}/issues/2642)) ## 2.1.1 / 2014-07-01 {: #v2-1-1} ### Bug Fixes {: #bug-fixes-v2-1-1} - Patch read vulnerabilities for data & confirm none for layouts ([#2563]({{ site.repository }}/issues/2563)) - Update Maruku dependency to allow use of the latest version ([#2576]({{ site.repository }}/issues/2576)) - Remove conditional assignment from document URL to prevent stale urls ([#2575]({{ site.repository }}/issues/2575)) ### Site Enhancements {: #site-enhancements-v2-1-1} - Add vertical margin to `highlight` to separate code blocks ([#2558]({{ site.repository }}/issues/2558)) - Add `html_pages` to Variables docs ([#2567]({{ site.repository }}/issues/2567)) - Fixed broken link to Permalinks page ([#2572]({{ site.repository }}/issues/2572)) - Update link to Windows installation guide ([#2578]({{ site.repository }}/issues/2578)) ## 2.1.0 / 2014-06-28 {: #v2-1-0} ### Minor Enhancements {: #minor-enhancements-v2-1-0} - Bump to the latest Liquid version, 2.6.1 ([#2495]({{ site.repository }}/issues/2495)) - Add support for JSON files in the `_data` directory ([#2369]({{ site.repository }}/issues/2369)) - Allow subclasses to override `EXCERPT_ATTRIBUTES_FOR_LIQUID` ([#2408]({{ site.repository }}/issues/2408)) - Add `Jekyll.env` and `jekyll.environment` (the Liquid var) ([#2417]({{ site.repository }}/issues/2417)) - Use `_config.yaml` or `_config.yml` (`.yml` takes precedence) ([#2406]({{ site.repository }}/issues/2406)) - Override collection url template ([#2418]({{ site.repository }}/issues/2418)) - Allow subdirectories in `_data` ([#2395]({{ site.repository }}/issues/2395)) - Extract Pagination Generator into gem: `jekyll-paginate` ([#2455]({{ site.repository }}/issues/2455)) - Utilize `date_to_rfc822` filter in site template ([#2437]({{ site.repository }}/issues/2437)) - Add categories, last build datetime, and generator to site template feed ([#2438]({{ site.repository }}/issues/2438)) - Configurable, replaceable Logger-compliant logger ([#2444]({{ site.repository }}/issues/2444)) - Extract `gist` tag into a separate gem ([#2469]({{ site.repository }}/issues/2469)) - Add `collection` attribute to `Document#to_liquid` to access the document's collection label. ([#2436]({{ site.repository }}/issues/2436)) - 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)) - 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)) - Skip initial build of site on serve with flag ([#2477]({{ site.repository }}/issues/2477)) - Add support for `hl_lines` in `highlight` tag ([#2532]({{ site.repository }}/issues/2532)) - Spike out `--watch` flag into a separate gem ([#2550]({{ site.repository }}/issues/2550)) ### Bug Fixes {: #bug-fixes-v2-1-0} - Liquid `sort` filter should sort even if one of the values is `nil` ([#2345]({{ site.repository }}/issues/2345)) - Remove padding on `pre code` in the site template CSS ([#2383]({{ site.repository }}/issues/2383)) - Set `log_level` earlier to silence info level configuration output ([#2393]({{ site.repository }}/issues/2393)) - Only list pages which have `title` in site template ([#2411]({{ site.repository }}/issues/2411)) - Accept `Numeric` values for dates, not `Number` values ([#2377]({{ site.repository }}/issues/2377)) - 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)) - 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 error which stated that redcarpet was missing, not rouge. ([#2464]({{ site.repository }}/issues/2464)) - Ignore *all* directories and files that merit it on auto-generation ([#2459]({{ site.repository }}/issues/2459)) - Before copying file, explicitly remove the old one ([#2535]({{ site.repository }}/issues/2535)) - Merge file system categories with categories from YAML. ([#2531]({{ site.repository }}/issues/2531)) - Deep merge front matter defaults ([#2490]({{ site.repository }}/issues/2490)) - Ensure exclude and include arrays are arrays of strings ([#2542]({{ site.repository }}/issues/2542)) - Allow collections to have dots in their filenames ([#2552]({{ site.repository }}/issues/2552)) - Collections shouldn't try to read in directories as files ([#2552]({{ site.repository }}/issues/2552)) - Be quiet very quickly. ([#2520]({{ site.repository }}/issues/2520)) ### Development Fixes {: #development-fixes-v2-1-0} - Test Ruby 2.1.2 instead of 2.1.1 ([#2374]({{ site.repository }}/issues/2374)) - Add test for sorting UTF-8 characters ([#2384]({{ site.repository }}/issues/2384)) - Use `https` for GitHub links in documentation ([#2470]({{ site.repository }}/issues/2470)) - Remove coverage reporting with Coveralls ([#2494]({{ site.repository }}/issues/2494)) - Fix a bit of missing TomDoc to `Jekyll::Commands::Build#build` ([#2554]({{ site.repository }}/issues/2554)) ### Site Enhancements {: #site-enhancements-v2-1-0} - Set `timezone` to `America/Los_Angeles` ([#2394]({{ site.repository }}/issues/2394)) - Improve JavaScript in `anchor_links.html` ([#2368]({{ site.repository }}/issues/2368)) - Remove note on Quickstart page about default markdown converter ([#2387]({{ site.repository }}/issues/2387)) - Remove broken link in extras.md to a Maruku fork ([#2401]({{ site.repository }}/issues/2401)) - Update Font Awesome to v4.1.0. ([#2410]({{ site.repository }}/issues/2410)) - Fix broken link on Installation page to Templates page ([#2421]({{ site.repository }}/issues/2421)) - 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 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)) - Add StickerMule + Jekyll post ([#2476]({{ site.repository }}/issues/2476)) - Add Jekyll Asset Pipeline Reborn to list of third-party plugins ([#2479]({{ site.repository }}/issues/2479)) - Add link to jekyll-compress-html to list of third-party plugins ([#2514]({{ site.repository }}/issues/2514)) - Add Piwigo Gallery to list of third-party plugins ([#2526]({{ site.repository }}/issues/2526)) - Set `show_drafts` to `false` in default configuration listing ([#2536]({{ site.repository }}/issues/2536)) - Provide an updated link for Windows installation instructions ([#2544]({{ site.repository }}/issues/2544)) - Remove `url` from configuration docs ([#2547]({{ site.repository }}/issues/2547)) - Documentation for Continuous Integration for your Jekyll Site ([#2432]({{ site.repository }}/issues/2432)) ## 2.0.3 / 2014-05-08 {: #v2-0-3} ### Bug Fixes {: #bug-fixes-v2-0-3} - Properly prefix links in site template with URL or baseurl depending upon need. ([#2319]({{ site.repository }}/issues/2319)) - Update gist tag comments and error message to require username ([#2326]({{ site.repository }}/issues/2326)) - Fix `permalink` setting in site template ([#2331]({{ site.repository }}/issues/2331)) - Don't fail if any of the path objects are nil ([#2325]({{ site.repository }}/issues/2325)) - Instantiate all descendants for converters and generators, not just direct subclasses ([#2334]({{ site.repository }}/issues/2334)) - Replace all instances of `site.name` with `site.title` in site template ([#2324]({{ site.repository }}/issues/2324)) - `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form ([#2339]({{ site.repository }}/issues/2339)) - Use `item_property` for `where` filter so it doesn't break on collections ([#2359]({{ site.repository }}/issues/2359)) - Rescue errors thrown so `--watch` doesn't fail ([#2364]({{ site.repository }}/issues/2364)) ### Site Enhancements {: #site-enhancements-v2-0-3} - Add missing "as" to assets docs page ([#2337]({{ site.repository }}/issues/2337)) - 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 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)) ## 2.0.2 / 2014-05-07 {: #v2-0-2} ### Bug Fixes {: #bug-fixes-v2-0-2} - Correct use of `url` and `baseurl` in the site template. ([#2317]({{ site.repository }}/issues/2317)) - Default `baseurl` to `""` ([#2317]({{ site.repository }}/issues/2317)) ### Site Enhancements {: #site-enhancements-v2-0-2} - Correct docs for the `gist` plugin so it always includes the username. ([#2314]({{ site.repository }}/issues/2314)) - Clarify new (defaults, `where` filter) features in docs ([#2316]({{ site.repository }}/issues/2316)) ## 2.0.1 / 2014-05-06 {: #v2-0-1} ### Bug Fixes {: #bug-fixes-v2-0-1} - Require `kramdown` gem instead of `maruku` gem ## 2.0.0 / 2014-05-06 {: #v2-0-0} ### Major Enhancements {: #major-enhancements-v2-0-0} - Add "Collections" feature ([#2199]({{ site.repository }}/issues/2199)) - Add gem-based plugin whitelist to safe mode ([#1657]({{ site.repository }}/issues/1657)) - Replace the commander command line parser with a more robust solution for our needs called `mercenary` ([#1706]({{ site.repository }}/issues/1706)) - Remove support for Ruby 1.8.x ([#1780]({{ site.repository }}/issues/1780)) - Move to jekyll/jekyll from mojombo/jekyll ([#1817]({{ site.repository }}/issues/1817)) - Allow custom markdown processors ([#1872]({{ site.repository }}/issues/1872)) - Provide support for the Rouge syntax highlighter ([#1859]({{ site.repository }}/issues/1859)) - Provide support for Sass ([#1932]({{ site.repository }}/issues/1932)) - Provide a 300% improvement when generating sites that use `Post#next` or `Post#previous` ([#1983]({{ site.repository }}/issues/1983)) - Provide support for CoffeeScript ([#1991]({{ site.repository }}/issues/1991)) - Replace Maruku with Kramdown as Default Markdown Processor ([#1988]({{ site.repository }}/issues/1988)) - 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)) - 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)) ### Minor Enhancements {: #minor-enhancements-v2-0-0} - Move the EntryFilter class into the Jekyll module to avoid polluting the global namespace ([#1800]({{ site.repository }}/issues/1800)) - Add `group_by` Liquid filter create lists of items grouped by a common property's value ([#1788]({{ site.repository }}/issues/1788)) - Add support for Maruku's `fenced_code_blocks` option ([#1799]({{ site.repository }}/issues/1799)) - Update Redcarpet dependency to ~> 3.0 ([#1815]({{ site.repository }}/issues/1815)) - Automatically sort all pages by name ([#1848]({{ site.repository }}/issues/1848)) - Better error message when time is not parseable ([#1847]({{ site.repository }}/issues/1847)) - Allow `include` tag variable arguments to use filters ([#1841]({{ site.repository }}/issues/1841)) - `post_url` tag should raise `ArgumentError` for invalid name ([#1825]({{ site.repository }}/issues/1825)) - Bump dependency `mercenary` to `~> 0.2.0` ([#1879]({{ site.repository }}/issues/1879)) - Bump dependency `safe_yaml` to `~> 1.0` ([#1886]({{ site.repository }}/issues/1886)) - Allow sorting of content by custom properties ([#1849]({{ site.repository }}/issues/1849)) - Add `--quiet` flag to silence output during build and serve ([#1898]({{ site.repository }}/issues/1898)) - Add a `where` filter to filter arrays based on a key/value pair ([#1875]({{ site.repository }}/issues/1875)) - Route 404 errors to a custom 404 page in development ([#1899]({{ site.repository }}/issues/1899)) - Excludes are now relative to the site source ([#1916]({{ site.repository }}/issues/1916)) - Bring MIME Types file for `jekyll serve` to complete parity with GH Pages servers ([#1993]({{ site.repository }}/issues/1993)) - Adding Breakpoint to make new site template more responsive ([#2038]({{ site.repository }}/issues/2038)) - Default to using the UTF-8 encoding when reading files. ([#2031]({{ site.repository }}/issues/2031)) - Update Redcarpet dependency to ~> 3.1 ([#2044]({{ site.repository }}/issues/2044)) - Remove support for Ruby 1.9.2 ([#2045]({{ site.repository }}/issues/2045)) - Add `.mkdown` as valid Markdown extension ([#2048]({{ site.repository }}/issues/2048)) - Add `index.xml` to the list of WEBrick directory index files ([#2041]({{ site.repository }}/issues/2041)) - Make the `layouts` config key relative to CWD or to source ([#2058]({{ site.repository }}/issues/2058)) - Update Kramdown to `~> 1.3` ([#1894]({{ site.repository }}/issues/1894)) - Remove unnecessary references to `self` ([#2090]({{ site.repository }}/issues/2090)) - Update to Mercenary v0.3.x ([#2085]({{ site.repository }}/issues/2085)) - Ship Sass support as a separate gem ([#2098]({{ site.repository }}/issues/2098)) - Extract core extensions into a Utils module ([#2112]({{ site.repository }}/issues/2112)) - Refactor CLI & Commands For Greater Happiness ([#2143]({{ site.repository }}/issues/2143)) - Provide useful error when Pygments returns `nil` and error out ([#2148]({{ site.repository }}/issues/2148)) - Add support for unpublished drafts ([#2164]({{ site.repository }}/issues/2164)) - Add `force_polling` option to the `serve` command ([#2165]({{ site.repository }}/issues/2165)) - Clean up the `` in the site template ([#2186]({{ site.repository }}/issues/2186)) - 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)) - 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)) - 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)) - Take into account missing values in the Liquid sort filter ([#2299]({{ site.repository }}/issues/2299)) ### Bug Fixes {: #bug-fixes-v2-0-0} - Don't allow nil entries when loading posts ([#1796]({{ site.repository }}/issues/1796)) - Remove the scrollbar that's always displayed in new sites generated from the site template ([#1805]({{ site.repository }}/issues/1805)) - Add `#path` to required methods in `Jekyll::Convertible` ([#1866]({{ site.repository }}/issues/1866)) - Default Maruku fenced code blocks to ON for 2.0.0-dev ([#1831]({{ site.repository }}/issues/1831)) - Change short opts for host and port for `jekyll docs` to be consistent with other subcommands ([#1877]({{ site.repository }}/issues/1877)) - Fix typos ([#1910]({{ site.repository }}/issues/1910)) - Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 ([#1958]({{ site.repository }}/issues/1958)) - Fixes full path leak to source directory when using include tag ([#1951]({{ site.repository }}/issues/1951)) - Don't generate pages that aren't being published ([#1931]({{ site.repository }}/issues/1931)) - Use `SafeYAML.load` to avoid conflicts with other projects ([#1982]({{ site.repository }}/issues/1982)) - Relative posts should never fail to build ([#1976]({{ site.repository }}/issues/1976)) - Remove executable bits of non executable files ([#2056]({{ site.repository }}/issues/2056)) - `#path` for a draft is now `_drafts` instead of `_posts` ([#2042]({{ site.repository }}/issues/2042)) - Patch a couple show-stopping security vulnerabilities ([#1946]({{ site.repository }}/issues/1946)) - Sanitize paths uniformly, in a Windows-friendly way ([#2065]({{ site.repository }}/issues/2065), [#2109]({{ site.repository }}/issues/2109)) - Update gem build steps to work correctly on Windows ([#2118]({{ site.repository }}/issues/2118)) - Remove obsolete `normalize_options` method call from `bin/jekyll` ([#2121]({{ site.repository }}/issues/2121)). - Remove `+` characters from Pygments lexer names when adding as a CSS class ([#994]({{ site.repository }}/issues/994)) - Remove some code that caused Ruby interpreter warnings ([#2178]({{ site.repository }}/issues/2178)) - Only strip the drive name if it begins the string ([#2175]({{ site.repository }}/issues/2175)) - Remove default post with invalid date from site template ([#2200]({{ site.repository }}/issues/2200)) - Fix `Post#url` and `Page#url` escape ([#1568]({{ site.repository }}/issues/1568)) - Strip newlines from the {% raw %}`{% highlight %}`{% endraw %} block content ([#1823]({{ site.repository }}/issues/1823)) - Load in `rouge` only when it's been requested as the highlighter ([#2189]({{ site.repository }}/issues/2189)) - Convert input to string before XML escaping (`xml_escape` liquid filter) ([#2244]({{ site.repository }}/issues/2244)) - Modify configuration key for Collections and reset properly. ([#2238]({{ site.repository }}/issues/2238)) - Avoid duplicated output using `highlight` tag ([#2264]({{ site.repository }}/issues/2264)) - Only use Jekyll.logger for output ([#2307]({{ site.repository }}/issues/2307)) - Close the file descriptor in `has_yaml_header?` ([#2310]({{ site.repository }}/issues/2310)) - Add `output` to `Document` liquid output hash ([#2309]({{ site.repository }}/issues/2309)) ### Development Fixes {: #development-fixes-v2-0-0} - Add a link to the site in the README.md file ([#1795]({{ site.repository }}/issues/1795)) - Add in History and site changes from `v1-stable` branch ([#1836]({{ site.repository }}/issues/1836)) - Testing additions on the Excerpt class ([#1893]({{ site.repository }}/issues/1893)) - Fix the `highlight` tag feature ([#1859]({{ site.repository }}/issues/1859)) - Test Jekyll under Ruby 2.1.0 ([#1900]({{ site.repository }}/issues/1900)) - Add script/cibuild for fun and profit ([#1912]({{ site.repository }}/issues/1912)) - Use `Forwardable` for delegation between `Excerpt` and `Post` ([#1927]({{ site.repository }}/issues/1927)) - Rename `read_things` to `read_content` ([#1928]({{ site.repository }}/issues/1928)) - Add `script/branding` script for ASCII art lovin' ([#1936]({{ site.repository }}/issues/1936)) - Update the README to reflect the repo move ([#1943]({{ site.repository }}/issues/1943)) - Add the project vision to the README ([#1935]({{ site.repository }}/issues/1935)) - Speed up Travis CI builds by using Rebund ([#1985]({{ site.repository }}/issues/1985)) - Use Yarp as a Gem proxy for Travis CI ([#1984]({{ site.repository }}/issues/1984)) - Remove Yarp as a Gem proxy for Travis CI ([#2004]({{ site.repository }}/issues/2004)) - Move the reading of layouts into its own class ([#2020]({{ site.repository }}/issues/2020)) - Test Sass import ([#2009]({{ site.repository }}/issues/2009)) - Switch Maruku and Kramdown in lists of Runtime vs. Development dependencies ([#2049]({{ site.repository }}/issues/2049)) - Clean up the gemspec for the project ([#2095]({{ site.repository }}/issues/2095)) - Add Japanese translation of README and CONTRIBUTING docs. ([#2081]({{ site.repository }}/issues/2081)) - Re-align the tables in Cucumber ([#2108]({{ site.repository }}/issues/2108)) - Trim trailing spaces and convert tabs to spaces ([#2122]({{ site.repository }}/issues/2122)) - Fix the failing Travis scenarios due to Cucumber issues ([#2155]({{ site.repository }}/issues/2155)) - Wrap `bundle install` in `travis_retry` to retry when RubyGems fails ([#2160]({{ site.repository }}/issues/2160)) - Refactor tags and categories ([#1639]({{ site.repository }}/issues/1639)) - Extract plugin management into its own class ([#2197]({{ site.repository }}/issues/2197)) - Add missing tests for `Command` ([#2216]({{ site.repository }}/issues/2216)) - Update `rr` link in CONTRIBUTING doc ([#2247]({{ site.repository }}/issues/2247)) - Streamline Cucumber execution of `jekyll` subcommands ([#2258]({{ site.repository }}/issues/2258)) - Refactor `Commands::Serve`. ([#2269]({{ site.repository }}/issues/2269)) - Refactor `highlight` tag ([#2154]({{ site.repository }}/issues/2154)) - Update `Util` hash functions with latest from Rails ([#2273]({{ site.repository }}/issues/2273)) - Workaround for Travis bug ([#2290]({{ site.repository }}/issues/2290)) ### Site Enhancements {: #site-enhancements-v2-0-0} - Document Kramdown's GFM parser option ([#1791]({{ site.repository }}/issues/1791)) - Move CSS to includes & update normalize.css to v2.1.3 ([#1787]({{ site.repository }}/issues/1787)) - Minify CSS only in production ([#1803]({{ site.repository }}/issues/1803)) - Fix broken link to installation of Ruby on Mountain Lion blog post on Troubleshooting docs page ([#1797]({{ site.repository }}/issues/1797)) - Fix issues with 1.4.1 release blog post ([#1804]({{ site.repository }}/issues/1804)) - Add note about deploying to OpenShift ([#1812]({{ site.repository }}/issues/1812)) - Collect all Windows-related docs onto one page ([#1818]({{ site.repository }}/issues/1818)) - Fixed typo in datafiles doc page ([#1854]({{ site.repository }}/issues/1854)) - Clarify how to access `site` in docs ([#1864]({{ site.repository }}/issues/1864)) - Add closing `` tag to `context.registers[:site]` note ([#1867]({{ site.repository }}/issues/1867)) - Fix link to [@mojombo](https://github.com/mojombo)'s site source ([#1897]({{ site.repository }}/issues/1897)) - Add `paginate: nil` to default configuration in docs ([#1896]({{ site.repository }}/issues/1896)) - Add link to our License in the site footer ([#1889]({{ site.repository }}/issues/1889)) - Add a charset note in "Writing Posts" doc page ([#1902]({{ site.repository }}/issues/1902)) - Disallow selection of path and prompt in bash examples - Add jekyll-compass to the plugin list ([#1923]({{ site.repository }}/issues/1923)) - Add note in Posts docs about stripping `

    ` tags from excerpt ([#1933]({{ site.repository }}/issues/1933)) - Add additional info about the new exclude behavior ([#1938]({{ site.repository }}/issues/1938)) - Linkify 'awesome contributors' to point to the contributors graph on GitHub ([#1940]({{ site.repository }}/issues/1940)) - Update `docs/sites.md` link to GitHub Training materials ([#1949]({{ site.repository }}/issues/1949)) - Update `master` with the release info from 1.4.3 ([#1947]({{ site.repository }}/issues/1947)) - Define docs nav in datafile ([#1953]({{ site.repository }}/issues/1953)) - Clarify the docs around the naming convention for posts ([#1971]({{ site.repository }}/issues/1971)) - Add missing `next` and `previous` docs for post layouts and templates ([#1970]({{ site.repository }}/issues/1970)) - Add note to `Writing posts` page about how to strip html from excerpt ([#1962]({{ site.repository }}/issues/1962)) - Add `jekyll-humanize` plugin to plugin list ([#1998]({{ site.repository }}/issues/1998)) - Add `jekyll-font-awesome` plugin to plugin list ([#1999]({{ site.repository }}/issues/1999)) - Add `sublime-jekyll` to list of Editor plugins ([#2001]({{ site.repository }}/issues/2001)) - Add `vim-jekyll` to the list of Editor plugins ([#2005]({{ site.repository }}/issues/2005)) - Fix non-semantic nesting of `p` tags in `news_item` layout ([#2013]({{ site.repository }}/issues/2013)) - Document destination folder cleaning ([#2016]({{ site.repository }}/issues/2016)) - Updated instructions for NearlyFreeSpeech.NET installation ([#2015]({{ site.repository }}/issues/2015)) - Update link to rack-jekyll on "Deployment Methods" page ([#2047]({{ site.repository }}/issues/2047)) - Fix typo in /docs/configuration ([#2073]({{ site.repository }}/issues/2073)) - Fix count in docs for `site.static_files` ([#2077]({{ site.repository }}/issues/2077)) - Update configuration docs to indicate utf-8 is the default for 2.0.0 and ASCII for 1.9.3 ([#2074]({{ site.repository }}/issues/2074)) - Add info about unreleased feature to the site ([#2061]({{ site.repository }}/issues/2061)) - Add whitespace to liquid example in GitHub Pages docs ([#2084]({{ site.repository }}/issues/2084)) - Clarify the way Sass and CoffeeScript files are read in and output ([#2067]({{ site.repository }}/issues/2067)) - Add lyche gallery tag plugin link to list of plugins ([#2094]({{ site.repository }}/issues/2094)) - Add Jekyll Pages Directory plugin to list of plugins ([#2096]({{ site.repository }}/issues/2096)) - Update Configuration docs page with new markdown extension ([#2102]({{ site.repository }}/issues/2102)) - Add `jekyll-image-set` to the list of third-party plugins ([#2105]({{ site.repository }}/issues/2105)) - Losslessly compress images ([#2128]({{ site.repository }}/issues/2128)) - Update normalize.css to 3.0.0 ([#2126]({{ site.repository }}/issues/2126)) - Update modernizr to v2.7.1 ([#2129]({{ site.repository }}/issues/2129)) - Add `jekyll-ordinal` to list of third-party plugins ([#2150]({{ site.repository }}/issues/2150)) - Add `jekyll_figure` to list of third-party plugins ([#2158]({{ site.repository }}/issues/2158)) - Clarify the documentation for safe mode ([#2163]({{ site.repository }}/issues/2163)) - Some HTML tidying ([#2130]({{ site.repository }}/issues/2130)) - Remove modernizr and use html5shiv.js directly for IE less than v9 ([#2131]({{ site.repository }}/issues/2131)) - Remove unused images ([#2187]({{ site.repository }}/issues/2187)) - Use `array_to_sentence_string` filter when outputting news item categories ([#2191]({{ site.repository }}/issues/2191)) - Add link to Help repo in primary navigation bar ([#2177]({{ site.repository }}/issues/2177)) - Switch to using an ico file for the shortcut icon ([#2193]({{ site.repository }}/issues/2193)) - Use numbers to specify font weights and only bring in font weights used ([#2185]({{ site.repository }}/issues/2185)) - Add a link to the list of all tz database time zones ([#1824]({{ site.repository }}/issues/1824)) - Clean-up and improve documentation `feed.xml` ([#2192]({{ site.repository }}/issues/2192)) - Remove duplicate entry in list of third-party plugins ([#2206]({{ site.repository }}/issues/2206)) - Reduce the whitespace in the favicon. ([#2213]({{ site.repository }}/issues/2213)) - Add `jekyll-page-collections` to list of third-party plugins ([#2215]({{ site.repository }}/issues/2215)) - Add a cross-reference about `post_url` ([#2243]({{ site.repository }}/issues/2243)) - Add `jekyll-live-tiles` to list of third-party plugins ([#2250]({{ site.repository }}/issues/2250)) - Fixed broken link to GitHub training material site source ([#2257]({{ site.repository }}/issues/2257)) - Update link to help repo, now called `jekyll-help` ([#2277]({{ site.repository }}/issues/2277)) - Fix capitalization of 'Jekyll' on Deployment Methods page ([#2291]({{ site.repository }}/issues/2291)) - Include plugins by sonnym in list of third-party plugins ([#2297]({{ site.repository }}/issues/2297)) - Add deprecated articles keeper filter to list of third-party plugins ([#2300]({{ site.repository }}/issues/2300)) - Simplify and improve our CSS. ([#2127]({{ site.repository }}/issues/2127)) - Use black text color for the mobile navbar ([#2306]({{ site.repository }}/issues/2306)) - Use the built in date filter and `site.time` for the copyright year. ([#2305]({{ site.repository }}/issues/2305)) - Update html5shiv to v3.7.2 ([#2304]({{ site.repository }}/issues/2304)) - Add 2.0.0 release post ([#2298]({{ site.repository }}/issues/2298)) - Add docs for custom markdown processors ([#2298]({{ site.repository }}/issues/2298)) - Add docs for `where` and `group_by` Liquid filters ([#2298]({{ site.repository }}/issues/2298)) - Remove notes in docs for unreleased features ([#2309]({{ site.repository }}/issues/2309)) ## 1.5.1 / 2014-03-27 {: #v1-5-1} ### Bug Fixes {: #bug-fixes-v1-5-1} - Only strip the drive name if it begins the string ([#2176]({{ site.repository }}/issues/2176)) ## 1.5.0 / 2014-03-24 {: #v1-5-0} ### Minor Enhancements {: #minor-enhancements-v1-5-0} - Loosen `safe_yaml` dependency to `~> 1.0` ([#2167]({{ site.repository }}/issues/2167)) - Bump `safe_yaml` dependency to `~> 1.0.0` ([#1942]({{ site.repository }}/issues/1942)) ### Bug Fixes {: #bug-fixes-v1-5-0} - Fix issue where filesystem traversal restriction broke Windows ([#2167]({{ site.repository }}/issues/2167)) - Lock `maruku` at `0.7.0` ([#2167]({{ site.repository }}/issues/2167)) ### Development Fixes {: #development-fixes-v1-5-0} - Lock `cucumber` at `1.3.11` ([#2167]({{ site.repository }}/issues/2167)) ## 1.4.3 / 2014-01-13 {: #v1-4-3} ### Bug Fixes {: #bug-fixes-v1-4-3} - Patch show-stopping security vulnerabilities ([#1944]({{ site.repository }}/issues/1944)) ## 1.4.2 / 2013-12-16 {: #v1-4-2} ### Bug Fixes {: #bug-fixes-v1-4-2} - Turn on Maruku fenced code blocks by default ([#1830]({{ site.repository }}/issues/1830)) ## 1.4.1 / 2013-12-09 {: #v1-4-1} ### Bug Fixes {: #bug-fixes-v1-4-1} - Don't allow nil entries when loading posts ([#1796]({{ site.repository }}/issues/1796)) ## 1.4.0 / 2013-12-07 {: #v1-4-0} ### Major Enhancements {: #major-enhancements-v1-4-0} - Add support for TOML config files ([#1765]({{ site.repository }}/issues/1765)) ### Minor Enhancements {: #minor-enhancements-v1-4-0} - Sort plugins as a way to establish a load order ([#1682]({{ site.repository }}/issues/1682)) - Update Maruku to 0.7.0 ([#1775]({{ site.repository }}/issues/1775)) ### Bug Fixes {: #bug-fixes-v1-4-0} - Add a space between two words in a Pagination warning message ([#1769]({{ site.repository }}/issues/1769)) - Upgrade `toml` gem to `v0.1.0` to maintain compat with Ruby 1.8.7 ([#1778]({{ site.repository }}/issues/1778)) ### Development Fixes {: #development-fixes-v1-4-0} - Remove some whitespace in the code ([#1755]({{ site.repository }}/issues/1755)) - Remove some duplication in the reading of posts and drafts ([#1779]({{ site.repository }}/issues/1779)) ### Site Enhancements {: #site-enhancements-v1-4-0} - Fixed case of a word in the Jekyll v1.3.0 release post ([#1762]({{ site.repository }}/issues/1762)) - Fixed the mime type for the favicon ([#1772]({{ site.repository }}/issues/1772)) ## 1.3.1 / 2013-11-26 {: #v1-3-1} ### Minor Enhancements {: #minor-enhancements-v1-3-1} - Add a `--prefix` option to passthrough for the importers ([#1669]({{ site.repository }}/issues/1669)) - Push the paginator plugin lower in the plugin priority order so other plugins run before it ([#1759]({{ site.repository }}/issues/1759)) ### Bug Fixes {: #bug-fixes-v1-3-1} - Fix the include tag when ran in a loop ([#1726]({{ site.repository }}/issues/1726)) - Fix errors when using `--watch` on 1.8.7 ([#1730]({{ site.repository }}/issues/1730)) - Specify where the include is called from if an included file is missing ([#1746]({{ site.repository }}/issues/1746)) ### Development Fixes {: #development-fixes-v1-3-1} - Extract `Site#filter_entries` into its own object ([#1697]({{ site.repository }}/issues/1697)) - Enable Travis' bundle caching ([#1734]({{ site.repository }}/issues/1734)) - Remove trailing whitespace in some files ([#1736]({{ site.repository }}/issues/1736)) - Fix a duplicate test name ([#1754]({{ site.repository }}/issues/1754)) ### Site Enhancements {: #site-enhancements-v1-3-1} - Update link to example Rakefile to point to specific commit ([#1741]({{ site.repository }}/issues/1741)) - Fix drafts docs to indicate that draft time is based on file modification time, not `Time.now` ([#1695]({{ site.repository }}/issues/1695)) - Add `jekyll-monthly-archive-plugin` and `jekyll-category-archive-plugin` to list of third-party plugins ([#1693]({{ site.repository }}/issues/1693)) - Add `jekyll-asset-path-plugin` to list of third-party plugins ([#1670]({{ site.repository }}/issues/1670)) - Add `emoji-for-jekyll` to list of third-part plugins ([#1708]({{ site.repository }}/issues/1708)) - Fix previous section link on plugins page to point to pagination page ([#1707]({{ site.repository }}/issues/1707)) - Add `org-mode` converter plugin to third-party plugins ([#1711]({{ site.repository }}/issues/1711)) - Point "Blog migrations" page to http://import.jekyllrb.com ([#1732]({{ site.repository }}/issues/1732)) - Add docs for `post_url` when posts are in subdirectories ([#1718]({{ site.repository }}/issues/1718)) - Update the docs to point to `example.com` ([#1448]({{ site.repository }}/issues/1448)) ## 1.3.0 / 2013-11-04 {: #v1-3-0} ### Major Enhancements {: #major-enhancements-v1-3-0} - Add support for adding data as YAML files under a site's `_data` directory ([#1003]({{ site.repository }}/issues/1003)) - Allow variables to be used with `include` tags ([#1495]({{ site.repository }}/issues/1495)) - Allow using gems for plugin management ([#1557]({{ site.repository }}/issues/1557)) ### Minor Enhancements {: #minor-enhancements-v1-3-0} - Decrease the specificity in the site template CSS ([#1574]({{ site.repository }}/issues/1574)) - Add `encoding` configuration option ([#1449]({{ site.repository }}/issues/1449)) - Provide better error handling for Jekyll's custom Liquid tags ([#1514]({{ site.repository }}/issues/1514)) - If an included file causes a Liquid error, add the path to the include file that caused the error to the error message ([#1596]({{ site.repository }}/issues/1596)) - If a layout causes a Liquid error, change the error message so that we know it comes from the layout ([#1601]({{ site.repository }}/issues/1601)) - Update Kramdown dependency to `~> 1.2` ([#1610]({{ site.repository }}/issues/1610)) - Update `safe_yaml` dependency to `~> 0.9.7` ([#1602]({{ site.repository }}/issues/1602)) - Allow layouts to be in subfolders like includes ([#1622]({{ site.repository }}/issues/1622)) - Switch to listen for site watching while serving ([#1589]({{ site.repository }}/issues/1589)) - Add a `json` liquid filter to be used in sites ([#1651]({{ site.repository }}/issues/1651)) - Point people to the migration docs when the `jekyll-import` gem is missing ([#1662]({{ site.repository }}/issues/1662)) ### Bug Fixes {: #bug-fixes-v1-3-0} - Fix up matching against source and destination when the two locations are similar ([#1556]({{ site.repository }}/issues/1556)) - Fix the missing `pathname` require in certain cases ([#1255]({{ site.repository }}/issues/1255)) - Use `+` instead of `Array#concat` when building `Post` attribute list ([#1571]({{ site.repository }}/issues/1571)) - Print server address when launching a server ([#1586]({{ site.repository }}/issues/1586)) - Downgrade to Maruku `~> 0.6.0` in order to avoid changes in rendering ([#1598]({{ site.repository }}/issues/1598)) - Fix error with failing include tag when variable was file name ([#1613]({{ site.repository }}/issues/1613)) - Downcase lexers before passing them to pygments ([#1615]({{ site.repository }}/issues/1615)) - Capitalize the short verbose switch because it conflicts with the built-in Commander switch ([#1660]({{ site.repository }}/issues/1660)) - Fix compatibility with 1.8.x ([#1665]({{ site.repository }}/issues/1665)) - Fix an error with the new file watching code due to library version incompatibilities ([#1687]({{ site.repository }}/issues/1687)) ### Development Fixes {: #development-fixes-v1-3-0} - Add coverage reporting with Coveralls ([#1539]({{ site.repository }}/issues/1539)) - Refactor the Liquid `include` tag ([#1490]({{ site.repository }}/issues/1490)) - Update launchy dependency to `~> 2.3` ([#1608]({{ site.repository }}/issues/1608)) - Update rr dependency to `~> 1.1` ([#1604]({{ site.repository }}/issues/1604)) - Update cucumber dependency to `~> 1.3` ([#1607]({{ site.repository }}/issues/1607)) - Update coveralls dependency to `~> 0.7.0` ([#1606]({{ site.repository }}/issues/1606)) - Update rake dependency to `~> 10.1` ([#1603]({{ site.repository }}/issues/1603)) - Clean up `site.rb` comments to be more concise/uniform ([#1616]({{ site.repository }}/issues/1616)) - Use the master branch for the build badge in the readme ([#1636]({{ site.repository }}/issues/1636)) - Refactor Site#render ([#1638]({{ site.repository }}/issues/1638)) - Remove duplication in command line options ([#1637]({{ site.repository }}/issues/1637)) - Add tests for all the coderay options ([#1543]({{ site.repository }}/issues/1543)) - Improve some of the Cucumber test code ([#1493]({{ site.repository }}/issues/1493)) - Improve comparisons of timestamps by ignoring the seconds ([#1582]({{ site.repository }}/issues/1582)) ### Site Enhancements {: #site-enhancements-v1-3-0} - Fix params for `JekyllImport::WordPress.process` arguments ([#1554]({{ site.repository }}/issues/1554)) - Add `jekyll-suggested-tweet` to list of third-party plugins ([#1555]({{ site.repository }}/issues/1555)) - Link to Liquid's docs for tags and filters ([#1553]({{ site.repository }}/issues/1553)) - Add note about installing Xcode on the Mac in the Installation docs ([#1561]({{ site.repository }}/issues/1561)) - Simplify/generalize pagination docs ([#1577]({{ site.repository }}/issues/1577)) - Add documentation for the new data sources feature ([#1503]({{ site.repository }}/issues/1503)) - Add more information on how to create generators ([#1590]({{ site.repository }}/issues/1590), [#1592]({{ site.repository }}/issues/1592)) - Improve the instructions for mimicking GitHub Flavored Markdown ([#1614]({{ site.repository }}/issues/1614)) - Add `jekyll-import` warning note of missing dependencies ([#1626]({{ site.repository }}/issues/1626)) - Fix grammar in the Usage section ([#1635]({{ site.repository }}/issues/1635)) - Add documentation for the use of gems as plugins ([#1656]({{ site.repository }}/issues/1656)) - Document the existence of a few additional plugins ([#1405]({{ site.repository }}/issues/1405)) - Document that the `date_to_string` always returns a two digit day ([#1663]({{ site.repository }}/issues/1663)) - Fix navigation in the "Working with Drafts" page ([#1667]({{ site.repository }}/issues/1667)) - Fix an error with the data documentation ([#1691]({{ site.repository }}/issues/1691)) ## 1.2.1 / 2013-09-14 {: #v1-2-1} ### Minor Enhancements {: #minor-enhancements-v1-2-1} - Print better messages for detached server. Mute output on detach. ([#1518]({{ site.repository }}/issues/1518)) - Disable reverse lookup when running `jekyll serve` ([#1363]({{ site.repository }}/issues/1363)) - Upgrade RedCarpet dependency to `~> 2.3.0` ([#1515]({{ site.repository }}/issues/1515)) - Upgrade to Liquid `>= 2.5.2, < 2.6` ([#1536]({{ site.repository }}/issues/1536)) ### Bug Fixes {: #bug-fixes-v1-2-1} - Fix file discrepancy in gemspec ([#1522]({{ site.repository }}/issues/1522)) - Force rendering of Include tag ([#1525]({{ site.repository }}/issues/1525)) ### Development Fixes {: #development-fixes-v1-2-1} - Add a rake task to generate a new release post ([#1404]({{ site.repository }}/issues/1404)) - Mute LSI output in tests ([#1531]({{ site.repository }}/issues/1531)) - Update contributor documentation ([#1537]({{ site.repository }}/issues/1537)) ### Site Enhancements {: #site-enhancements-v1-2-1} - Fix a couple of validation errors on the site ([#1511]({{ site.repository }}/issues/1511)) - Make navigation menus reusable ([#1507]({{ site.repository }}/issues/1507)) - Fix link to History page from Release v1.2.0 notes post. - Fix markup in History file for command line options ([#1512]({{ site.repository }}/issues/1512)) - Expand 1.2 release post title to 1.2.0 ([#1516]({{ site.repository }}/issues/1516)) ## 1.2.0 / 2013-09-06 {: #v1-2-0} ### Major Enhancements {: #major-enhancements-v1-2-0} - Disable automatically-generated excerpts when `excerpt_separator` is `""`. ([#1386]({{ site.repository }}/issues/1386)) - Add checking for URL conflicts when running `jekyll doctor` ([#1389]({{ site.repository }}/issues/1389)) ### Minor Enhancements {: #minor-enhancements-v1-2-0} - Catch and fix invalid `paginate` values ([#1390]({{ site.repository }}/issues/1390)) - Remove superfluous `div.container` from the default html template for `jekyll new` ([#1315]({{ site.repository }}/issues/1315)) - Add `-D` short-form switch for the drafts option ([#1394]({{ site.repository }}/issues/1394)) - Update the links in the site template for Twitter and GitHub ([#1400]({{ site.repository }}/issues/1400)) - Update dummy email address to example.com domain ([#1408]({{ site.repository }}/issues/1408)) - Update normalize.css to v2.1.2 and minify; add rake task to update normalize.css with greater ease. ([#1430]({{ site.repository }}/issues/1430)) - Add the ability to detach the server ran by `jekyll serve` from it's controlling terminal ([#1443]({{ site.repository }}/issues/1443)) - Improve permalink generation for URLs with special characters ([#944]({{ site.repository }}/issues/944)) - Expose the current Jekyll version to posts and pages via a new `jekyll.version` variable ([#1481]({{ site.repository }}/issues/1481)) ### Bug Fixes {: #bug-fixes-v1-2-0} - Markdown extension matching matches only exact matches ([#1382]({{ site.repository }}/issues/1382)) - Fixed NoMethodError when message passed to `Stevenson#message` is nil ([#1388]({{ site.repository }}/issues/1388)) - Use binary mode when writing file ([#1364]({{ site.repository }}/issues/1364)) - Fix 'undefined method `encoding` for "mailto"' errors w/ Ruby 1.8 and Kramdown > 0.14.0 ([#1397]({{ site.repository }}/issues/1397)) - Do not force the permalink to be a dir if it ends on .html ([#963]({{ site.repository }}/issues/963)) - When a Liquid Exception is caught, show the full path rel. to site source ([#1415]({{ site.repository }}/issues/1415)) - Properly read in the config options when serving the docs locally ([#1444]({{ site.repository }}/issues/1444)) - Fixed `--layouts` option for `build` and `serve` commands ([#1458]({{ site.repository }}/issues/1458)) - Remove kramdown as a runtime dependency since it's optional ([#1498]({{ site.repository }}/issues/1498)) - Provide proper error handling for invalid file names in the include tag ([#1494]({{ site.repository }}/issues/1494)) ### Development Fixes {: #development-fixes-v1-2-0} - Remove redundant argument to Jekyll::Commands::New#scaffold_post_content ([#1356]({{ site.repository }}/issues/1356)) - Add new dependencies to the README ([#1360]({{ site.repository }}/issues/1360)) - Fix link to contributing page in README ([#1424]({{ site.repository }}/issues/1424)) - Update TomDoc in Pager#initialize to match params ([#1441]({{ site.repository }}/issues/1441)) - Refactor `Site#cleanup` into `Jekyll::Site::Cleaner` class ([#1429]({{ site.repository }}/issues/1429)) - Several other small minor refactorings ([#1341]({{ site.repository }}/issues/1341)) - Ignore `_site` in jekyllrb.com deploy ([#1480]({{ site.repository }}/issues/1480)) - Add Gem version and dependency badge to README ([#1497]({{ site.repository }}/issues/1497)) ### Site Enhancements {: #site-enhancements-v1-2-0} - Add info about new releases ([#1353]({{ site.repository }}/issues/1353)) - Update plugin list with jekyll-rss plugin ([#1354]({{ site.repository }}/issues/1354)) - Update the site list page with Ruby's official site ([#1358]({{ site.repository }}/issues/1358)) - Add `jekyll-ditaa` to list of third-party plugins ([#1370]({{ site.repository }}/issues/1370)) - Add `postfiles` to list of third-party plugins ([#1373]({{ site.repository }}/issues/1373)) - For internal links, use full path including trailing `/` ([#1411]({{ site.repository }}/issues/1411)) - Use curly apostrophes in the docs ([#1419]({{ site.repository }}/issues/1419)) - Update the docs for Redcarpet in Jekyll ([#1418]({{ site.repository }}/issues/1418)) - Add `pluralize` and `reading_time` filters to docs ([#1439]({{ site.repository }}/issues/1439)) - Fix markup for the Kramdown options ([#1445]({{ site.repository }}/issues/1445)) - Fix typos in the History file ([#1454]({{ site.repository }}/issues/1454)) - Add trailing slash to site's post URL ([#1462]({{ site.repository }}/issues/1462)) - Clarify that `--config` will take multiple files ([#1474]({{ site.repository }}/issues/1474)) - Fix docs/templates.md private gist example ([#1477]({{ site.repository }}/issues/1477)) - Use `site.repository` for Jekyll's GitHub URL ([#1463]({{ site.repository }}/issues/1463)) - Add `jekyll-pageless-redirects` to list of third-party plugins ([#1486]({{ site.repository }}/issues/1486)) - Clarify that `date_to_xmlschema` returns an ISO 8601 string ([#1488]({{ site.repository }}/issues/1488)) - Add `jekyll-good-include` to list of third-party plugins ([#1491]({{ site.repository }}/issues/1491)) - XML escape the blog post title in our feed ([#1501]({{ site.repository }}/issues/1501)) - Add `jekyll-toc-generator` to list of third-party plugins ([#1506]({{ site.repository }}/issues/1506)) ## 1.1.2 / 2013-07-25 {: #v1-1-2} ### Bug Fixes {: #bug-fixes-v1-1-2} - Require Liquid 2.5.1 ([#1349]({{ site.repository }}/issues/1349)) ## 1.1.1 / 2013-07-24 {: #v1-1-1} ### Minor Enhancements {: #minor-enhancements-v1-1-1} - Remove superfluous `table` selector from main.css in `jekyll new` template ([#1328]({{ site.repository }}/issues/1328)) - Abort with non-zero exit codes ([#1338]({{ site.repository }}/issues/1338)) ### Bug Fixes {: #bug-fixes-v1-1-1} - Fix up the rendering of excerpts ([#1339]({{ site.repository }}/issues/1339)) ### Site Enhancements {: #site-enhancements-v1-1-1} - Add Jekyll Image Tag to the plugins list ([#1306]({{ site.repository }}/issues/1306)) - Remove erroneous statement that `site.pages` are sorted alphabetically. - Add info about the `_drafts` directory to the directory structure docs ([#1320]({{ site.repository }}/issues/1320)) - Improve the layout of the plugin listing by organizing it into categories ([#1310]({{ site.repository }}/issues/1310)) - Add generator-jekyllrb and grunt-jekyll to plugins page ([#1330]({{ site.repository }}/issues/1330)) - Mention Kramdown as option for markdown parser on Extras page ([#1318]({{ site.repository }}/issues/1318)) - Update Quick-Start page to include reminder that all requirements must be installed ([#1327]({{ site.repository }}/issues/1327)) - Change filename in `include` example to an HTML file so as not to indicate that Jekyll will automatically convert them. ([#1303]({{ site.repository }}/issues/1303)) - Add an RSS feed for commits to Jekyll ([#1343]({{ site.repository }}/issues/1343)) ## 1.1.0 / 2013-07-14 {: #v1-1-0} ### Major Enhancements {: #major-enhancements-v1-1-0} - Add `docs` subcommand to read Jekyll's docs when offline. ([#1046]({{ site.repository }}/issues/1046)) - Support passing parameters to templates in `include` tag ([#1204]({{ site.repository }}/issues/1204)) - Add support for Liquid tags to post excerpts ([#1302]({{ site.repository }}/issues/1302)) ### Minor Enhancements {: #minor-enhancements-v1-1-0} - Search the hierarchy of pagination path up to site root to determine template page for pagination. ([#1198]({{ site.repository }}/issues/1198)) - Add the ability to generate a new Jekyll site without a template ([#1171]({{ site.repository }}/issues/1171)) - Use redcarpet as the default markdown engine in newly generated sites ([#1245]({{ site.repository }}/issues/1245), [#1247]({{ site.repository }}/issues/1247)) - Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new sites. ([#1247]({{ site.repository }}/issues/1247)) - In the generated site, remove files that will be replaced by a directory ([#1118]({{ site.repository }}/issues/1118)) - Fail loudly if a user-specified configuration file doesn't exist ([#1098]({{ site.repository }}/issues/1098)) - Allow for all options for Kramdown HTML Converter ([#1201]({{ site.repository }}/issues/1201)) ### Bug Fixes {: #bug-fixes-v1-1-0} - Fix pagination in subdirectories. ([#1198]({{ site.repository }}/issues/1198)) - Fix an issue with directories and permalinks that have a plus sign (+) in them ([#1215]({{ site.repository }}/issues/1215)) - Provide better error reporting when generating sites ([#1253]({{ site.repository }}/issues/1253)) - Latest posts first in non-LSI `related_posts` ([#1271]({{ site.repository }}/issues/1271)) ### Development Fixes {: #development-fixes-v1-1-0} - Merge the theme and layout Cucumber steps into one step ([#1151]({{ site.repository }}/issues/1151)) - Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2` - Include/exclude deprecation handling simplification ([#1284]({{ site.repository }}/issues/1284)) - Convert README to Markdown. ([#1267]({{ site.repository }}/issues/1267)) - Refactor Jekyll::Site ([#1144]({{ site.repository }}/issues/1144)) ### Site Enhancements {: #site-enhancements-v1-1-0} - Add "News" section for release notes, along with an RSS feed ([#1093]({{ site.repository }}/issues/1093), [#1285]({{ site.repository }}/issues/1285), [#1286]({{ site.repository }}/issues/1286)) - Add "History" page. - Restructured docs sections to include "Meta" section. - Add message to "Templates" page that specifies that Python must be installed in order to use Pygments. ([#1182]({{ site.repository }}/issues/1182)) - Update link to the official Maruku repo ([#1175]({{ site.repository }}/issues/1175)) - Add documentation about `paginate_path` to "Templates" page in docs ([#1129]({{ site.repository }}/issues/1129)) - Give the quick-start guide its own page ([#1191]({{ site.repository }}/issues/1191)) - Update ProTip on Installation page in docs to point to all the info about Pygments and the 'highlight' tag. ([#1196]({{ site.repository }}/issues/1196)) - Run `site/img` through ImageOptim (thanks [@qrush](https://github.com/qrush)!) ([#1208]({{ site.repository }}/issues/1208)) - Added Jade Converter to `site/docs/plugins` ([#1210]({{ site.repository }}/issues/1210)) - Fix location of docs pages in Contributing pages ([#1214]({{ site.repository }}/issues/1214)) - Add ReadInXMinutes plugin to the plugin list ([#1222]({{ site.repository }}/issues/1222)) - Remove plugins from the plugin list that have equivalents in Jekyll proper ([#1223]({{ site.repository }}/issues/1223)) - Add jekyll-assets to the plugin list ([#1225]({{ site.repository }}/issues/1225)) - Add jekyll-pandoc-mulitple-formats to the plugin list ([#1229]({{ site.repository }}/issues/1229)) - Remove dead link to "Using Git to maintain your blog" ([#1227]({{ site.repository }}/issues/1227)) - Tidy up the third-party plugins listing ([#1228]({{ site.repository }}/issues/1228)) - Update contributor information ([#1192]({{ site.repository }}/issues/1192)) - Update URL of article about Blogger migration ([#1242]({{ site.repository }}/issues/1242)) - Specify that RedCarpet is the default for new Jekyll sites on Quickstart page ([#1247]({{ site.repository }}/issues/1247)) - Added `site.pages` to Variables page in docs ([#1251]({{ site.repository }}/issues/1251)) - Add Youku and Tudou Embed link on Plugins page. ([#1250]({{ site.repository }}/issues/1250)) - Add note that `gist` tag supports private gists. ([#1248]({{ site.repository }}/issues/1248)) - Add `jekyll-timeago` to list of third-party plugins. ([#1260]({{ site.repository }}/issues/1260)) - Add `jekyll-swfobject` to list of third-party plugins. ([#1263]({{ site.repository }}/issues/1263)) - Add `jekyll-picture-tag` to list of third-party plugins. ([#1280]({{ site.repository }}/issues/1280)) - Update the GitHub Pages documentation regarding relative URLs ([#1291]({{ site.repository }}/issues/1291)) - Update the S3 deployment documentation ([#1294]({{ site.repository }}/issues/1294)) - Add suggestion for Xcode CLT install to troubleshooting page in docs ([#1296]({{ site.repository }}/issues/1296)) - Add 'Working with drafts' page to docs ([#1289]({{ site.repository }}/issues/1289)) - Add information about time zones to the documentation for a page's date ([#1304]({{ site.repository }}/issues/1304)) ## 1.0.3 / 2013-06-07 {: #v1-0-3} ### Minor Enhancements {: #minor-enhancements-v1-0-3} - Add support to gist tag for private gists. ([#1189]({{ site.repository }}/issues/1189)) - Fail loudly when Maruku errors out ([#1190]({{ site.repository }}/issues/1190)) - Move the building of related posts into their own class ([#1057]({{ site.repository }}/issues/1057)) - Removed trailing spaces in several places throughout the code ([#1116]({{ site.repository }}/issues/1116)) - Add a `--force` option to `jekyll new` ([#1115]({{ site.repository }}/issues/1115)) - Convert IDs in the site template to classes ([#1170]({{ site.repository }}/issues/1170)) ### Bug Fixes {: #bug-fixes-v1-0-3} - Fix typo in Stevenson constant "ERROR". ([#1166]({{ site.repository }}/issues/1166)) - Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue ([#1106]({{ site.repository }}/issues/1106)) - Exit with a non-zero exit code when dealing with a Liquid error ([#1121]({{ site.repository }}/issues/1121)) - Make the `exclude` and `include` options backwards compatible with versions of Jekyll prior to 1.0 ([#1114]({{ site.repository }}/issues/1114)) - Fix pagination on Windows ([#1063]({{ site.repository }}/issues/1063)) - Fix the application of Pygments' Generic Output style to Go code ([#1156]({{ site.repository }}/issues/1156)) ### Site Enhancements {: #site-enhancements-v1-0-3} - Add a Pro Tip to docs about front matter variables being optional ([#1147]({{ site.repository }}/issues/1147)) - Add changelog to site as History page in /docs/ ([#1065]({{ site.repository }}/issues/1065)) - Add note to Upgrading page about new config options in 1.0.x ([#1146]({{ site.repository }}/issues/1146)) - Documentation for `date_to_rfc822` and `uri_escape` ([#1142]({{ site.repository }}/issues/1142)) - Documentation highlight boxes shouldn't show scrollbars if not necessary ([#1123]({{ site.repository }}/issues/1123)) - Add link to jekyll-minibundle in the doc's plugins list ([#1035]({{ site.repository }}/issues/1035)) - Quick patch for importers documentation - Fix prefix for WordpressDotCom importer in docs ([#1107]({{ site.repository }}/issues/1107)) - Add jekyll-contentblocks plugin to docs ([#1068]({{ site.repository }}/issues/1068)) - Make code bits in notes look more natural, more readable ([#1089]({{ site.repository }}/issues/1089)) - Fix logic for `relative_permalinks` instructions on Upgrading page ([#1101]({{ site.repository }}/issues/1101)) - Add docs for post excerpt ([#1072]({{ site.repository }}/issues/1072)) - Add docs for gist tag ([#1072]({{ site.repository }}/issues/1072)) - Add docs indicating that Pygments does not need to be installed separately ([#1099]({{ site.repository }}/issues/1099), [#1119]({{ site.repository }}/issues/1119)) - Update the migrator docs to be current ([#1136]({{ site.repository }}/issues/1136)) - Add the Jekyll Gallery Plugin to the plugin list ([#1143]({{ site.repository }}/issues/1143)) ### Development Fixes {: #development-fixes-v1-0-3} - Use Jekyll.logger instead of Jekyll::Stevenson to log things ([#1149]({{ site.repository }}/issues/1149)) - Fix pesky Cucumber infinite loop ([#1139]({{ site.repository }}/issues/1139)) - Do not write posts with timezones in Cucumber tests ([#1124]({{ site.repository }}/issues/1124)) - Use ISO formatted dates in Cucumber features ([#1150]({{ site.repository }}/issues/1150)) ## 1.0.2 / 2013-05-12 {: #v1-0-2} ### Major Enhancements {: #major-enhancements-v1-0-2} - Add `jekyll doctor` command to check site for any known compatibility problems ([#1081]({{ site.repository }}/issues/1081)) - Backwards-compatibilize relative permalinks ([#1081]({{ site.repository }}/issues/1081)) ### Minor Enhancements {: #minor-enhancements-v1-0-2} - Add a `data-lang=""` attribute to Redcarpet code blocks ([#1066]({{ site.repository }}/issues/1066)) - Deprecate old config `server_port`, match to `port` if `port` isn't set ([#1084]({{ site.repository }}/issues/1084)) - Update pygments.rb version to 0.5.0 ([#1061]({{ site.repository }}/issues/1061)) - Update Kramdown version to 1.0.2 ([#1067]({{ site.repository }}/issues/1067)) ### Bug Fixes {: #bug-fixes-v1-0-2} - Fix issue when categories are numbers ([#1078]({{ site.repository }}/issues/1078)) - Catching that Redcarpet gem isn't installed ([#1059]({{ site.repository }}/issues/1059)) ### Site Enhancements {: #site-enhancements-v1-0-2} - Add documentation about `relative_permalinks` ([#1081]({{ site.repository }}/issues/1081)) - Remove pygments-installation instructions, as pygments.rb is bundled with it ([#1079]({{ site.repository }}/issues/1079)) - Move pages to be Pages for realz ([#985]({{ site.repository }}/issues/985)) - Updated links to Liquid documentation ([#1073]({{ site.repository }}/issues/1073)) ## 1.0.1 / 2013-05-08 {: #v1-0-1} ### Minor Enhancements {: #minor-enhancements-v1-0-1} - Do not force use of `toc_token` when using `generate_tok` in RDiscount ([#1048]({{ site.repository }}/issues/1048)) - Add newer `language-` class name prefix to code blocks ([#1037]({{ site.repository }}/issues/1037)) - Commander error message now preferred over process abort with incorrect args ([#1040]({{ site.repository }}/issues/1040)) ### Bug Fixes {: #bug-fixes-v1-0-1} - Make Redcarpet respect the pygments configuration option ([#1053]({{ site.repository }}/issues/1053)) - Fix the index build with LSI ([#1045]({{ site.repository }}/issues/1045)) - Don't print deprecation warning when no arguments are specified. ([#1041]({{ site.repository }}/issues/1041)) - Add missing `` to site template used by `new` subcommand, fixed typos in code ([#1032]({{ site.repository }}/issues/1032)) ### Site Enhancements {: #site-enhancements-v1-0-1} - Changed https to http in the GitHub Pages link ([#1051]({{ site.repository }}/issues/1051)) - Remove CSS cruft, fix typos, fix HTML errors ([#1028]({{ site.repository }}/issues/1028)) - Removing manual install of Pip and Distribute ([#1025]({{ site.repository }}/issues/1025)) - Updated URL for Markdown references plugin ([#1022]({{ site.repository }}/issues/1022)) ### Development Fixes {: #development-fixes-v1-0-1} - Markdownify history file ([#1027]({{ site.repository }}/issues/1027)) - Update links on README to point to new jekyllrb.com ([#1018]({{ site.repository }}/issues/1018)) ## 1.0.0 / 2013-05-06 {: #v1-0-0} ### Major Enhancements {: #major-enhancements-v1-0-0} - Add `jekyll new` subcommand: generate a Jekyll scaffold ([#764]({{ site.repository }}/issues/764)) - Refactored Jekyll commands into subcommands: build, serve, and migrate. ([#690]({{ site.repository }}/issues/690)) - Removed importers/migrators from main project, migrated to jekyll-import sub-gem ([#793]({{ site.repository }}/issues/793)) - Added ability to render drafts in `_drafts` folder via command line ([#833]({{ site.repository }}/issues/833)) - Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) ([#928]({{ site.repository }}/issues/928)) ### Minor Enhancements {: #minor-enhancements-v1-0-0} - Site template HTML5-ified ([#964]({{ site.repository }}/issues/964)) - Use post's directory path when matching for the `post_url` tag ([#998]({{ site.repository }}/issues/998)) - Loosen dependency on Pygments so it's only required when it's needed ([#1015]({{ site.repository }}/issues/1015)) - Parse strings into Time objects for date-related Liquid filters ([#1014]({{ site.repository }}/issues/1014)) - Tell the user if there is no subcommand specified ([#1008]({{ site.repository }}/issues/1008)) - Freak out if the destination of `jekyll new` exists and is non-empty ([#981]({{ site.repository }}/issues/981)) - Add `timezone` configuration option for compilation ([#957]({{ site.repository }}/issues/957)) - Add deprecation messages for pre-1.0 CLI options ([#959]({{ site.repository }}/issues/959)) - Refactor and colorize logging ([#959]({{ site.repository }}/issues/959)) - Refactor Markdown parsing ([#955]({{ site.repository }}/issues/955)) - Added application/vnd.apple.pkpass to mime.types served by WEBrick ([#907]({{ site.repository }}/issues/907)) - Move template site to default markdown renderer ([#961]({{ site.repository }}/issues/961)) - Expose new attribute to Liquid via `page`: `page.path` ([#951]({{ site.repository }}/issues/951)) - Accept multiple config files from command line ([#945]({{ site.repository }}/issues/945)) - Add page variable to liquid custom tags and blocks ([#413]({{ site.repository }}/issues/413)) - Add `paginator.previous_page_path` and `paginator.next_page_path` ([#942]({{ site.repository }}/issues/942)) - Backwards compatibility for 'auto' ([#821]({{ site.repository }}/issues/821), [#934]({{ site.repository }}/issues/934)) - Added date_to_rfc822 used on RSS feeds ([#892]({{ site.repository }}/issues/892)) - Upgrade version of pygments.rb to 0.4.2 ([#927]({{ site.repository }}/issues/927)) - Added short month (e.g. "Sep") to permalink style options for posts ([#890]({{ site.repository }}/issues/890)) - Expose site.baseurl to Liquid templates ([#869]({{ site.repository }}/issues/869)) - Adds excerpt attribute to posts which contains first paragraph of content ([#837]({{ site.repository }}/issues/837)) - Accept custom configuration file via CLI ([#863]({{ site.repository }}/issues/863)) - Load in GitHub Pages MIME Types on `jekyll serve` ([#847]({{ site.repository }}/issues/847), [#871]({{ site.repository }}/issues/871)) - Improve debugability of error message for a malformed highlight tag ([#785]({{ site.repository }}/issues/785)) - Allow symlinked files in unsafe mode ([#824]({{ site.repository }}/issues/824)) - Add 'gist' Liquid tag to core ([#822]({{ site.repository }}/issues/822), [#861]({{ site.repository }}/issues/861)) - New format of Jekyll output ([#795]({{ site.repository }}/issues/795)) - Reinstate `--limit_posts` and `--future` switches ([#788]({{ site.repository }}/issues/788)) - Remove ambiguity from command descriptions ([#815]({{ site.repository }}/issues/815)) - Fix SafeYAML Warnings ([#807]({{ site.repository }}/issues/807)) - Relaxed Kramdown version to 0.14 ([#808]({{ site.repository }}/issues/808)) - Aliased `jekyll server` to `jekyll serve`. ([#792]({{ site.repository }}/issues/792)) - Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. ([#744]({{ site.repository }}/issues/744)) - Refactored Jekyll subcommands into Jekyll::Commands submodule, which now contains them ([#768]({{ site.repository }}/issues/768)) - Rescue from import errors in Wordpress.com migrator ([#671]({{ site.repository }}/issues/671)) - Massively accelerate LSI performance ([#664]({{ site.repository }}/issues/664)) - Truncate post slugs when importing from Tumblr ([#496]({{ site.repository }}/issues/496)) - Add glob support to include, exclude option ([#743]({{ site.repository }}/issues/743)) - Layout of Page or Post defaults to 'page' or 'post', respectively ([#580]({{ site.repository }}/issues/580)) REPEALED by ([#977]({{ site.repository }}/issues/977)) - "Keep files" feature ([#685]({{ site.repository }}/issues/685)) - Output full path & name for files that don't parse ([#745]({{ site.repository }}/issues/745)) - Add source and destination directory protection ([#535]({{ site.repository }}/issues/535)) - Better YAML error message ([#718]({{ site.repository }}/issues/718)) - Bug Fixes - Paginate in subdirectories properly ([#1016]({{ site.repository }}/issues/1016)) - Ensure post and page URLs have a leading slash ([#992]({{ site.repository }}/issues/992)) - Catch all exceptions, not just StandardError descendents ([#1007]({{ site.repository }}/issues/1007)) - 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)) - 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)) - Fix integration with directory_watcher 1.4.x ([#916]({{ site.repository }}/issues/916)) - Accepting strings as arguments to jekyll-import command ([#910]({{ site.repository }}/issues/910)) - Force usage of older directory_watcher gem as 1.5 is broken ([#883]({{ site.repository }}/issues/883)) - Ensure all Post categories are downcase ([#842]({{ site.repository }}/issues/842), [#872]({{ site.repository }}/issues/872)) - Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors ([#555]({{ site.repository }}/issues/555)) - 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)) - 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)) - Force Categories to be Strings ([#767]({{ site.repository }}/issues/767)) - Safe YAML plugin to prevent vulnerability ([#777]({{ site.repository }}/issues/777)) - Add SVG support to Jekyll/WEBrick. ([#407]({{ site.repository }}/issues/407), [#406]({{ site.repository }}/issues/406)) - Prevent custom destination from causing continuous regen on watch ([#528]({{ site.repository }}/issues/528), [#820]({{ site.repository }}/issues/820), [#862]({{ site.repository }}/issues/862)) ### Site Enhancements {: #site-enhancements-v1-0-0} - Responsify ([#860]({{ site.repository }}/issues/860)) - Fix spelling, punctuation and phrasal errors ([#989]({{ site.repository }}/issues/989)) - Update quickstart instructions with `new` command ([#966]({{ site.repository }}/issues/966)) - Add docs for page.excerpt ([#956]({{ site.repository }}/issues/956)) - Add docs for page.path ([#951]({{ site.repository }}/issues/951)) - Clean up site docs to prepare for 1.0 release ([#918]({{ site.repository }}/issues/918)) - Bring site into master branch with better preview/deploy ([#709]({{ site.repository }}/issues/709)) - Redesigned site ([#583]({{ site.repository }}/issues/583)) ### Development Fixes {: #development-fixes-v1-0-0} - Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 ([#938]({{ site.repository }}/issues/938)) - Added "features:html" rake task for debugging purposes, cleaned up Cucumber profiles ([#832]({{ site.repository }}/issues/832)) - Explicitly require HTTPS rubygems source in Gemfile ([#826]({{ site.repository }}/issues/826)) - Changed Ruby version for development to 1.9.3-p374 from p362 ([#801]({{ site.repository }}/issues/801)) - Including a link to the GitHub Ruby style guide in CONTRIBUTING.md ([#806]({{ site.repository }}/issues/806)) - Added script/bootstrap ([#776]({{ site.repository }}/issues/776)) - Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version of greater than 1.9 ([#771]({{ site.repository }}/issues/771)) - Switch to Simplecov for coverage report ([#765]({{ site.repository }}/issues/765)) ## 0.12.1 / 2013-02-19 {: #v0-12-1} ### Minor Enhancements {: #minor-enhancements-v0-12-1} - Update Kramdown version to 0.14.1 ([#744]({{ site.repository }}/issues/744)) - Test Enhancements - Update Rake version to 10.0.3 ([#744]({{ site.repository }}/issues/744)) - Update Shoulda version to 3.3.2 ([#744]({{ site.repository }}/issues/744)) - Update Redcarpet version to 2.2.2 ([#744]({{ site.repository }}/issues/744)) ## 0.12.0 / 2012-12-22 {: #v0-12-0} ### Minor Enhancements {: #minor-enhancements-v0-12-0} - Add ability to explicitly specify included files ([#261]({{ site.repository }}/issues/261)) - Add `--default-mimetype` option ([#279]({{ site.repository }}/issues/279)) - Allow setting of RedCloth options ([#284]({{ site.repository }}/issues/284)) - Add `post_url` Liquid tag for internal post linking ([#369]({{ site.repository }}/issues/369)) - Allow multiple plugin dirs to be specified ([#438]({{ site.repository }}/issues/438)) - Inline TOC token support for RDiscount ([#333]({{ site.repository }}/issues/333)) - Add the option to specify the paginated url format ([#342]({{ site.repository }}/issues/342)) - Swap out albino for pygments.rb ([#569]({{ site.repository }}/issues/569)) - Support Redcarpet 2 and fenced code blocks ([#619]({{ site.repository }}/issues/619)) - Better reporting of Liquid errors ([#624]({{ site.repository }}/issues/624)) - Bug Fixes - Allow some special characters in highlight names - URL escape category names in URL generation ([#360]({{ site.repository }}/issues/360)) - 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)) ## 0.11.2 / 2011-12-27 {: #v0-11-2} - Bug Fixes - Fix gemspec ## 0.11.1 / 2011-12-27 {: #v0-11-1} - Bug Fixes - Fix extra blank line in highlight blocks ([#409]({{ site.repository }}/issues/409)) - Update dependencies ## 0.11.0 / 2011-07-10 {: #v0-11-0} ### Major Enhancements {: #major-enhancements-v0-11-0} - Add command line importer functionality ([#253]({{ site.repository }}/issues/253)) - Add Redcarpet Markdown support ([#318]({{ site.repository }}/issues/318)) - Make markdown/textile extensions configurable ([#312]({{ site.repository }}/issues/312)) - Add `markdownify` filter ### Minor Enhancements {: #minor-enhancements-v0-11-0} - Switch to Albino gem - Bundler support - Use English library to avoid hoops ([#292]({{ site.repository }}/issues/292)) - Add Posterous importer ([#254]({{ site.repository }}/issues/254)) - Fixes for Wordpress importer ([#274]({{ site.repository }}/issues/274), [#252]({{ site.repository }}/issues/252), [#271]({{ site.repository }}/issues/271)) - Better error message for invalid post date ([#291]({{ site.repository }}/issues/291)) - Print formatted fatal exceptions to stdout on build failure - Add Tumblr importer ([#323]({{ site.repository }}/issues/323)) - Add Enki importer ([#320]({{ site.repository }}/issues/320)) - Bug Fixes - Secure additional path exploits ## 0.10.0 / 2010-12-16 {: #v0-10-0} - Bug Fixes - Add `--no-server` option. ## 0.9.0 / 2010-12-15 {: #v0-9-0} ### Minor Enhancements {: #minor-enhancements-v0-9-0} - Use OptionParser's `[no-]` functionality for better boolean parsing. - Add Drupal migrator ([#245]({{ site.repository }}/issues/245)) - Complain about YAML and Liquid errors ([#249]({{ site.repository }}/issues/249)) - Remove orphaned files during regeneration ([#247]({{ site.repository }}/issues/247)) - Add Marley migrator ([#28]({{ site.repository }}/issues/28)) ## 0.8.0 / 2010-11-22 {: #v0-8-0} ### Minor Enhancements {: #minor-enhancements-v0-8-0} - Add wordpress.com importer ([#207]({{ site.repository }}/issues/207)) - Add `--limit-posts` cli option ([#212]({{ site.repository }}/issues/212)) - Add `uri_escape` filter ([#234]({{ site.repository }}/issues/234)) - Add `--base-url` cli option ([#235]({{ site.repository }}/issues/235)) - Improve MT migrator ([#238]({{ site.repository }}/issues/238)) - Add kramdown support ([#239]({{ site.repository }}/issues/239)) - Bug Fixes - Fixed filename basename generation ([#208]({{ site.repository }}/issues/208)) - Set mode to UTF8 on Sequel connections ([#237]({{ site.repository }}/issues/237)) - Prevent `_includes` dir from being a symlink ## 0.7.0 / 2010-08-24 {: #v0-7-0} ### Minor Enhancements {: #minor-enhancements-v0-7-0} - Add support for rdiscount extensions ([#173]({{ site.repository }}/issues/173)) - Bug Fixes - Highlight should not be able to render local files - The site configuration may not always provide a 'time' setting ([#184]({{ site.repository }}/issues/184)) ## 0.6.2 / 2010-06-25 {: #v0-6-2} - Bug Fixes - Fix Rakefile 'release' task (tag pushing was missing origin) - Ensure that RedCloth is loaded when textilize filter is used ([#183]({{ site.repository }}/issues/183)) - Expand source, destination, and plugin paths ([#180]({{ site.repository }}/issues/180)) - Fix `page.url` to include full relative path ([#181]({{ site.repository }}/issues/181)) ## 0.6.1 / 2010-06-24 {: #v0-6-1} - Bug Fixes - Fix Markdown Pygments prefix and suffix ([#178]({{ site.repository }}/issues/178)) ## 0.6.0 / 2010-06-23 {: #v0-6-0} ### Major Enhancements {: #major-enhancements-v0-6-0} - Proper plugin system ([#19]({{ site.repository }}/issues/19), [#100]({{ site.repository }}/issues/100)) - Add safe mode so unsafe converters/generators can be added - Maruku is now the only processor dependency installed by default. Other processors will be lazy-loaded when necessary (and prompt the user to install them when necessary) ([#57]({{ site.repository }}/issues/57)) ### Minor Enhancements {: #minor-enhancements-v0-6-0} - Inclusion/exclusion of future dated posts ([#59]({{ site.repository }}/issues/59)) - Generation for a specific time ([#59]({{ site.repository }}/issues/59)) - Allocate `site.time` on render not per site_payload invocation ([#59]({{ site.repository }}/issues/59)) - Pages now present in the site payload and can be used through the `site.pages` and `site.html_pages` variables - Generate phase added to site#process and pagination is now a generator - Switch to RakeGem for build/test process - Only regenerate static files when they have changed ([#142]({{ site.repository }}/issues/142)) - Allow arbitrary options to Pygments ([#31]({{ site.repository }}/issues/31)) - Allow URL to be set via command line option ([#147]({{ site.repository }}/issues/147)) - Bug Fixes - Render highlighted code for non markdown/textile pages ([#116]({{ site.repository }}/issues/116)) - Fix highlighting on Ruby 1.9 ([#65]({{ site.repository }}/issues/65)) - Fix extension munging when pretty permalinks are enabled ([#64]({{ site.repository }}/issues/64)) - Stop sorting categories ([#33]({{ site.repository }}/issues/33)) - Preserve generated attributes over front matter ([#119]({{ site.repository }}/issues/119)) - Fix source directory binding using `Dir.pwd` ([#75]({{ site.repository }}/issues/75)) ## 0.5.7 / 2010-01-12 {: #v0-5-7} ### Minor Enhancements {: #minor-enhancements-v0-5-7} - Allow overriding of post date in the front matter ([#62]({{ site.repository }}/issues/62), [#38]({{ site.repository }}/issues/38)) - Bug Fixes - Categories isn't always an array ([#73]({{ site.repository }}/issues/73)) - Empty tags causes error in read_posts ([#84]({{ site.repository }}/issues/84)) - Fix pagination to adhere to read/render/write paradigm - Test Enhancement - Cucumber features no longer use site.posts.first where a better alternative is available ## 0.5.6 / 2010-01-08 {: #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 front matter ([#93]({{ site.repository }}/issues/93)) ### Minor Enhancements {: #minor-enhancements-v0-5-6} - Allow .mkd as markdown extension - Use $stdout/err instead of constants ([#99]({{ site.repository }}/issues/99)) - Properly wrap code blocks ([#91]({{ site.repository }}/issues/91)) - Add javascript mime type for webrick ([#98]({{ site.repository }}/issues/98)) ## 0.5.5 / 2010-01-08 {: #v0-5-5} - Bug Fixes - Fix pagination % 0 bug ([#78]({{ site.repository }}/issues/78)) - Ensure all posts are processed first ([#71]({{ site.repository }}/issues/71)) ## NOTE - After this point I will no longer be giving credit in the history; that is what the commit log is for. ## 0.5.4 / 2009-08-23 {: #v0-5-4} - Bug Fixes - Do not allow symlinks (security vulnerability) ## 0.5.3 / 2009-07-14 {: #v0-5-3} - Bug Fixes - Solving the permalink bug where non-html files wouldn't work ([@jeffrydegrande](https://github.com/jeffrydegrande)) ## 0.5.2 / 2009-06-24 {: #v0-5-2} - Enhancements - Added --paginate option to the executable along with a paginator object for the payload ([@calavera](https://github.com/calavera)) - Upgraded RedCloth to 4.2.1, which makes `` tags work once again. - Configuration options set in config.yml are now available through the site payload ([@vilcans](https://github.com/vilcans)) - Posts can now have an empty YAML front matter or none at all (@ bahuvrihi) - Bug Fixes - Fixing Ruby 1.9 issue that requires `#to_s` on the err object ([@Chrononaut](https://github.com/Chrononaut)) - Fixes for pagination and ordering posts on the same day ([@ujh](https://github.com/ujh)) - Made pages respect permalinks style and permalinks in yml front matter ([@eugenebolshakov](https://github.com/eugenebolshakov)) - Index.html file should always have index.html permalink ([@eugenebolshakov](https://github.com/eugenebolshakov)) - Added trailing slash to pretty permalink style so Apache is happy ([@eugenebolshakov](https://github.com/eugenebolshakov)) - Bad markdown processor in config fails sooner and with better message (@ gcnovus) - Allow CRLFs in yaml front matter ([@juretta](https://github.com/juretta)) - Added Date#xmlschema for Ruby versions < 1.9 ## 0.5.1 / 2009-05-06 {: #v0-5-1} ### Major Enhancements {: #major-enhancements-v0-5-1} - Next/previous posts in site payload ([@pantulis](https://github.com/pantulis), [@tomo](https://github.com/tomo)) - Permalink templating system - Moved most of the README out to the GitHub wiki - Exclude option in configuration so specified files won't be brought over with generated site ([@duritong](https://github.com/duritong)) - Bug Fixes - Making sure config.yaml references are all gone, using only config.yml - Fixed syntax highlighting breaking for UTF-8 code ([@henrik](https://github.com/henrik)) - Worked around RDiscount bug that prevents Markdown from getting parsed after highlight ([@henrik](https://github.com/henrik)) - CGI escaped post titles ([@Chrononaut](https://github.com/Chrononaut)) ## 0.5.0 / 2009-04-07 {: #v0-5-0} ### Minor Enhancements {: #minor-enhancements-v0-5-0} - Ability to set post categories via YAML ([@qrush](https://github.com/qrush)) - Ability to set prevent a post from publishing via YAML ([@qrush](https://github.com/qrush)) - Add textilize filter ([@willcodeforfoo](https://github.com/willcodeforfoo)) - Add 'pretty' permalink style for wordpress-like urls ([@dysinger](https://github.com/dysinger)) - Made it possible to enter categories from YAML as an array ([@Chrononaut](https://github.com/Chrononaut)) - Ignore Emacs autosave files ([@Chrononaut](https://github.com/Chrononaut)) - Bug Fixes - Use block syntax of popen4 to ensure that subprocesses are properly disposed ([@jqr](https://github.com/jqr)) - Close open4 streams to prevent zombies ([@rtomayko](https://github.com/rtomayko)) - Only query required fields from the WP Database ([@ariejan](https://github.com/ariejan)) - Prevent `_posts` from being copied to the destination directory ([@bdimcheff](https://github.com/bdimcheff)) - Refactors - Factored the filtering code into a method ([@Chrononaut](https://github.com/Chrononaut)) - Fix tests and convert to Shoulda ([@qrush](https://github.com/qrush), [@technicalpickles](https://github.com/technicalpickles)) - Add Cucumber acceptance test suite ([@qrush](https://github.com/qrush), [@technicalpickles](https://github.com/technicalpickles)) ## 0.4.1 ### Minor Enhancements {: #minor-enhancements-v--} - Changed date format on wordpress converter (zeropadding) ([@dysinger](https://github.com/dysinger)) - Bug Fixes - Add Jekyll binary as executable to gemspec ([@dysinger](https://github.com/dysinger)) ## 0.4.0 / 2009-02-03 {: #v0-4-0} ### Major Enhancements {: #major-enhancements-v0-4-0} - Switch to Jeweler for packaging tasks ### Minor Enhancements {: #minor-enhancements-v0-4-0} - Type importer ([@codeslinger](https://github.com/codeslinger)) - `site.topics` accessor ([@baz](https://github.com/baz)) - Add `array_to_sentence_string` filter ([@mchung](https://github.com/mchung)) - Add a converter for textpattern ([@PerfectlyNormal](https://github.com/PerfectlyNormal)) - Add a working Mephisto / MySQL converter ([@ivey](https://github.com/ivey)) - Allowing .htaccess files to be copied over into the generated site ([@briandoll](https://github.com/briandoll)) - Add option to not put file date in permalink URL ([@mreid](https://github.com/mreid)) - Add line number capabilities to highlight blocks ([@jcon](https://github.com/jcon)) - Bug Fixes - Fix permalink behavior ([@cavalle](https://github.com/cavalle)) - Fixed an issue with pygments, markdown, and newlines ([@zpinter](https://github.com/zpinter)) - Ampersands need to be escaped ([@pufuwozu](https://github.com/pufuwozu), [@ap](https://github.com/ap)) - Test and fix the site.categories hash ([@zzot](https://github.com/zzot)) - Fix site payload available to files ([@matrix9180](https://github.com/matrix9180)) ## 0.3.0 / 2008-12-24 {: #v0-3-0} ### Major Enhancements {: #major-enhancements-v0-3-0} - Added `--server` option to start a simple WEBrick server on destination directory ([@johnreilly](https://github.com/johnreilly) and [@mchung](https://github.com/mchung)) ### Minor Enhancements {: #minor-enhancements-v0-3-0} - Added post categories based on directories containing `_posts` ([@mreid](https://github.com/mreid)) - Added post topics based on directories underneath `_posts` - Added new date filter that shows the full month name ([@mreid](https://github.com/mreid)) - Merge Post's YAML front matter into its to_liquid payload ([@remi](https://github.com/remi)) - Restrict includes to regular files underneath `_includes` - Bug Fixes - Change YAML delimiter matcher so as to not chew up 2nd level markdown headers ([@mreid](https://github.com/mreid)) - Fix bug that meant page data (such as the date) was not available in templates ([@mreid](https://github.com/mreid)) - Properly reject directories in `_layouts` ## 0.2.1 / 2008-12-15 {: #v0-2-1} - Major Changes - Use Maruku (pure Ruby) for Markdown by default ([@mreid](https://github.com/mreid)) - Allow use of RDiscount with `--rdiscount` flag ### Minor Enhancements {: #minor-enhancements-v0-2-1} - Don't load directory_watcher unless it's needed ([@pjhyett](https://github.com/pjhyett)) ## 0.2.0 / 2008-12-14 {: #v0-2-0} - Major Changes - related_posts is now found in `site.related_posts` ## 0.1.6 / 2008-12-13 {: #v0-1-6} - Major Features - Include files in `_includes` with {% raw %}`{% include x.textile %}`{% endraw %} ## 0.1.5 / 2008-12-12 {: #v0-1-5} ### Major Enhancements {: #major-enhancements-v0-1-5} - Code highlighting with Pygments if `--pygments` is specified - Disable true LSI by default, enable with `--lsi` ### Minor Enhancements {: #minor-enhancements-v0-1-5} - Output informative message if RDiscount is not available ([@JackDanger](https://github.com/JackDanger)) - Bug Fixes - Prevent Jekyll from picking up the output directory as a source ([@JackDanger](https://github.com/JackDanger)) - Skip `related_posts` when there is only one post ([@JackDanger](https://github.com/JackDanger)) ## 0.1.4 / 2008-12-08 {: #v0-1-4} - Bug Fixes - DATA does not work properly with rubygems ## 0.1.3 / 2008-12-06 {: #v0-1-3} - Major Features - Markdown support ([@vanpelt](https://github.com/vanpelt)) - Mephisto and CSV converters ([@vanpelt](https://github.com/vanpelt)) - Code hilighting ([@vanpelt](https://github.com/vanpelt)) - Autobuild - Bug Fixes - Accept both `\r\n` and `\n` in YAML header ([@vanpelt](https://github.com/vanpelt)) ## 0.1.2 / 2008-11-22 {: #v0-1-2} - Major Features - Add a real "related posts" implementation using Classifier - Command Line Changes - Allow cli to be called with 0, 1, or 2 args intuiting dir paths if they are omitted ## 0.1.1 / 2008-11-22 {: #v0-1-1} - Minor Additions - Posts now support introspectional data e.g. {% raw %}`{{ page.url }}`{% endraw %} ## 0.1.0 / 2008-11-05 {: #v0-1-0} - First release - Converts posts written in Textile - Converts regular site pages - Simple copy of binary files ## 0.0.0 / 2008-10-19 {: #v0-0-0} - Birthday! jekyll-3.1.6/site/_docs/index.md000066400000000000000000000041741271741406300165120ustar00rootroot00000000000000--- layout: docs title: Welcome permalink: /docs/home/ redirect_from: /docs/index.html --- This site aims to be a comprehensive guide to Jekyll. We’ll cover topics such as getting your site up and running, creating and managing your content, customizing the way your site works and looks, deploying to various environments, and give you some advice on participating in the future development of Jekyll itself. ## So what is Jekyll, exactly? Jekyll is a simple, blog-aware, static site generator. It takes a template directory containing raw text files in various formats, runs it through 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 free**. ## Helpful Hints Throughout this guide there are a number of small-but-handy pieces of information that can make using Jekyll easier, more interesting, and less hazardous. Here’s what to look out for.

    ProTips™ help you get more from Jekyll

    These are tips and tricks that will help you be a Jekyll wizard!

    Notes are handy pieces of information

    These are for the extra tidbits sometimes necessary to understand Jekyll.

    Warnings help you not blow things up

    Be aware of these messages if you wish to avoid certain death.

    You'll see this by a feature that hasn't been released

    Some pieces of this website are for future versions of Jekyll that are not yet released.

    If you come across anything along the way that we haven’t covered, or if you know of a tip you think others would find handy, please [file an issue]({{ site.repository }}/issues/new) and we’ll see about including it in this guide. jekyll-3.1.6/site/_docs/installation.md000066400000000000000000000073141271741406300201030ustar00rootroot00000000000000--- layout: docs title: Installation permalink: /docs/installation/ --- Getting Jekyll installed and ready-to-go should only take a few minutes. If it ever becomes a pain, please [file an issue]({{ site.repository }}/issues/new) (or submit a pull request) 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. - [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 (Jekyll 2 and earlier, for CoffeeScript support). - [Python 2.7](https://www.python.org/downloads/) (for Jekyll 2 and earlier)
    Running Jekyll on Windows

    While Windows is not officially supported, it is possible to get it running on Windows. Special instructions can be found on our Windows-specific docs page.

    ## Install with RubyGems The best way to install Jekyll is via [RubyGems](http://rubygems.org/pages/download). At the terminal prompt, simply run the following command to install Jekyll: {% highlight bash %} $ gem install jekyll {% endhighlight %} All of Jekyll’s gem dependencies are automatically installed by the above command, so you won’t have to worry about them at all. If you have problems installing Jekyll, check out the [troubleshooting](../troubleshooting/) page or [report an issue]({{ site.repository }}/issues/new) so the Jekyll community can improve the experience for everyone.
    Installing Xcode Command-Line Tools

    If you run into issues installing Jekyll's dependencies which make use of native extensions and are using Mac OS X, you will need to install Xcode and the Command-Line Tools it ships with. Download in Preferences → Downloads → Components.

    ## Pre-releases In order to install a pre-release, make sure you have all the requirements installed properly and run: {% highlight bash %} gem install jekyll --pre {% endhighlight %} This will install the latest pre-release. If you want a particular pre-release, use the `-v` switch to indicate the version you'd like to install: {% highlight bash %} gem install jekyll -v '2.0.0.alpha.1' {% endhighlight %} If you'd like to install a development version of Jekyll, the process is a bit more involved. This gives you the advantage of having the latest and greatest, but may be unstable. {% highlight bash %} $ git clone git://github.com/jekyll/jekyll.git $ cd jekyll $ script/bootstrap $ bundle exec rake build $ ls pkg/*.gem | head -n 1 | xargs gem install -l {% endhighlight %} ## Optional Extras There are a number of (optional) extra features that Jekyll supports that you may want to install, depending on how you plan to use Jekyll. These extras include LaTeX support, and the use of alternative content rendering engines. Check out [the extras page](../extras/) for more information.
    ProTip™: Enable Syntax Highlighting

    If you’re the kind of person who is using Jekyll, then chances are you’ll want to enable syntax highlighting using Pygments or Rouge. You should really check out how to do that before you go any farther.

    Now that you’ve got everything installed, let’s get to work! jekyll-3.1.6/site/_docs/migrations.md000066400000000000000000000004721271741406300175540ustar00rootroot00000000000000--- layout: docs title: Blog migrations permalink: /docs/migrations/ --- If you’re switching to Jekyll from another blogging system, Jekyll’s importers can help you with the move. To learn more about importing your site to Jekyll, visit our [`jekyll-import` docs site](http://import.jekyllrb.com/docs/home/). jekyll-3.1.6/site/_docs/pages.md000066400000000000000000000070521271741406300165000ustar00rootroot00000000000000--- layout: docs title: Creating pages 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. ## Homepage Just about every web server configuration you come across will look for an HTML file called `index.html` (by convention) in the site's root folder and display that as the homepage. Unless the web server you’re using is configured to look for some different filename as the default, this file will turn into the homepage of your Jekyll-generated site.
    ProTip™: Use layouts on your homepage

    Any HTML file on your site can use layouts and/or includes, even the homepage. Common content, like headers and footers, make excellent candidates for extraction into a layout.

    ## Where additional pages live Where you put HTML or [Markdown](http://daringfireball.net/projects/markdown/) files for pages depends on how you want the pages to work. There are two main ways of creating pages: - Place named HTML or [Markdown](http://daringfireball.net/projects/markdown/) 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 or index.md 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. ### Named HTML files The simplest way of adding a page is just to add an HTML file in the root directory with a suitable name for the page you want to create. For a site with a homepage, an about page, and a contact page, here’s what the root directory and associated URLs might look like: {% highlight bash %} . |-- _config.yml |-- _includes/ |-- _layouts/ |-- _posts/ |-- _site/ |-- about.html # => http://example.com/about.html |-- index.html # => http://example.com/ |-- other.md # => http://example.com/other.html └── contact.html # => http://example.com/contact.html {% endhighlight %} ### Named folders containing index HTML files 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: {% highlight bash %} . ├── _config.yml ├── _includes/ ├── _layouts/ ├── _posts/ ├── _site/ ├── about/ | └── index.html # => http://example.com/about/ ├── contact/ | └── index.html # => http://example.com/contact/ |── other/ | └── index.md # => http://example.com/other/ └── index.html # => http://example.com/ {% endhighlight %} This approach may not suit everyone, but for people who like clean URLs it’s simple and it works. In the end, the decision is yours!
    ProTip™: Use permalink Front Matter Variable

    Clean URLs can also be achieved using the permalink front matter variable. In the example above, using the first method, you can get URL http://example.com/other for the file other.md by setting this at the top of the file: permalink: /other

    jekyll-3.1.6/site/_docs/pagination.md000066400000000000000000000152641271741406300175360ustar00rootroot00000000000000--- layout: docs title: Pagination 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 offers a pagination plugin, so you can automatically generate the appropriate files and folders you need for paginated listings. For Jekyll 3, include the `jekyll-paginate` plugin in your Gemfile and in your `_config.yml` under `gems`. For Jekyll 2, this is standard.
    Pagination only works within HTML files

    Pagination does not work from within Markdown or Textile files from your Jekyll site. Pagination works when called from within the HTML file, named index.html, which optionally may reside in and produce pagination from within a subdirectory, via the paginate_path configuration value.

    ## Enable pagination To enable pagination for your blog, add a line to the `_config.yml` file that specifies how many items should be displayed per page: {% highlight yaml %} paginate: 5 {% endhighlight %} 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 the destination of the pagination pages: {% highlight yaml %} 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.
    Don't set a permalink

    Setting a permalink in the front matter of your blog page will cause pagination to break. Just omit the permalink.

    ## Liquid Attributes Available The pagination plugin exposes the `paginator` liquid object with the following attributes:
    Attribute Description

    page

    current page number

    per_page

    number of posts per page

    posts

    a list of posts for the current page

    total_posts

    total number of posts in the site

    total_pages

    number of pagination pages

    previous_page

    page number of the previous pagination page, or nil if no previous page exists

    previous_page_path

    path of previous pagination page, or nil if no previous page exists

    next_page

    page number of the next pagination page, or nil if no subsequent page exists

    next_page_path

    path of next pagination page, or nil if no subsequent page exists

    Pagination does not support tags or categories

    Pagination pages through every post in the posts variable regardless of variables defined in the YAML Front Matter of each. It does not currently allow paging over groups of posts linked by a common tag or category. It cannot include any collection of documents because it is restricted to posts.

    ## 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: {% highlight html %} {% raw %} --- layout: default title: My Blog --- {% for post in paginator.posts %}

    {{ post.title }}

    {{ post.date }}

    {{ post.content }}
    {% endfor %} {% endraw %} {% endhighlight %}
    Beware the page one edge-case

    Jekyll does not generate a ‘page1’ folder, so the above code will not work when a /page1 link is produced. See below for a way to handle this if it’s a problem for you.

    The following HTML snippet should handle page one, and render a list of each page with links to all but the current page. {% highlight html %} {% raw %} {% if paginator.total_pages > 1 %} {% endif %} {% endraw %} {% endhighlight %} jekyll-3.1.6/site/_docs/permalinks.md000066400000000000000000000176561271741406300175610ustar00rootroot00000000000000--- 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
    Variable Description

    year

    Year from the Post’s filename

    month

    Month from the Post’s filename

    i_month

    Month from the Post’s filename without leading zeros.

    day

    Day from the Post’s filename

    i_day

    Day from the Post’s filename without leading zeros.

    short_year

    Year from the Post’s filename without the century.

    hour

    Hour of the day, 24-hour clock, zero-padded from the post’s date front matter. (00..23)

    minute

    Minute of the hour from the post’s date front matter. (00..59)

    second

    Second of the minute from the post’s date front matter. (00..59)

    title

    Title from the document’s filename. May be overridden via the document’s slug YAML front matter.

    slug

    Slugified title from the document’s filename ( any character except numbers and letters is replaced as hyphen ). May be overridden via the document’s slug YAML front matter.

    categories

    The specified categories for this Post. If a post has multiple categories, Jekyll will create a hierarchy (e.g. /category1/category2). Also Jekyll automatically parses out double slashes in the URLs, so if no categories are present, it will ignore this.

    ## 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.
    Permalink Style URL Template

    date

    /:categories/:year/:month/:day/:title.html

    pretty

    /:categories/:year/:month/:day/:title/

    ordinal

    /:categories/:year/:y_day/:title.html

    none

    /:categories/:title.html

    ## 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`
    URL Template Resulting Permalink URL

    None specified, or permalink: date

    /2009/04/29/slap-chop.html

    pretty

    /2009/04/29/slap-chop/

    /:month-:day-:year/:title.html

    /04-29-2009/slap-chop.html

    /blog/:year/:month/:day/:title/

    /blog/2009/04/29/slap-chop/

    /:year/:month/:title

    See extensionless permalinks for details.

    /2009/04/slap-chop

    ## 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 %} jekyll-3.1.6/site/_docs/plugins.md000066400000000000000000001277501271741406300170720ustar00rootroot00000000000000--- layout: docs title: Plugins permalink: /docs/plugins/ --- Jekyll has a plugin system with hooks that allow you to create custom generated content specific to your site. You can run custom code for your site without having to modify the Jekyll source itself.
    Plugins on GitHub Pages

    GitHub Pages is powered by Jekyll. However, all Pages sites are generated using the --safe option to disable custom plugins for security reasons. Unfortunately, this means your plugins won’t work if you’re deploying to GitHub Pages.

    You can still use GitHub Pages to publish your site, but you’ll need to convert the site locally and push the generated static files to your GitHub repository instead of the Jekyll source files.

    ## Installing a plugin 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: gems: [jekyll-coffeescript, jekyll-watch, jekyll-assets] # This will require each of these gems automatically. Then install your plugins using `gem install jekyll-coffeescript jekyll-watch 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`
    _plugins, _config.yml and Gemfile can be used simultaneously

    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.

    In general, plugins you make will fall into one of five categories: 1. [Generators](#generators) 2. [Converters](#converters) 3. [Commands](#commands) 4. [Tags](#tags) 5. [Hooks](#hooks) ## Generators You can create a generator when you need Jekyll to create additional content 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). 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 instances of [`Jekyll::Page`]({{ site.repository }}/blob/master/lib/jekyll/page.rb) and are available via `site.pages`. Static files become instances of [`Jekyll::StaticFile`]({{ site.repository }}/blob/master/lib/jekyll/static_file.rb) and are available via `site.static_files`. See [the Variables documentation page](/docs/variables/) and [`Jekyll::Site`]({{ site.repository }}/blob/master/lib/jekyll/site.rb) for more details. For instance, a generator can inject values computed at build time for template variables. In the following example the template `reading.html` has two variables `ongoing` and `done` that we fill in the generator: {% highlight ruby %} module Reading class Generator < Jekyll::Generator def generate(site) ongoing, done = Book.all.partition(&:ongoing?) reading = site.pages.detect {|page| page.name == 'reading.html'} reading.data['ongoing'] = ongoing reading.data['done'] = done end end end {% endhighlight %} This is a more complex generator that generates new pages: {% highlight ruby %} module Jekyll class CategoryPage < Page def initialize(site, base, dir, category) @site = site @base = base @dir = dir @name = 'index.html' self.process(@name) self.read_yaml(File.join(base, '_layouts'), 'category_index.html') self.data['category'] = category category_title_prefix = site.config['category_title_prefix'] || 'Category: ' self.data['title'] = "#{category_title_prefix}#{category}" end end class CategoryPageGenerator < Generator safe true def generate(site) if site.layouts.key? 'category_index' dir = site.config['category_dir'] || 'categories' site.categories.each_key do |category| site.pages << CategoryPage.new(site, site.source, File.join(dir, category), category) end end end end end {% endhighlight %} In this example, our generator will create a series of files under the `categories` directory for each category, listing the posts in each category using the `category_index.html` layout. Generators are only required to implement one method:
    Method Description

    generate

    Generates content as a side-effect.

    ## 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](https://github.com/jekyll/jekyll-textile-converter) markup languages are implemented using this method.
    Remember your YAML Front Matter

    Jekyll will only convert files that have a YAML header at the top, even for converters you add using a plugin.

    Below is a converter that will take all posts ending in `.upcase` and process them using the `UpcaseConverter`: {% highlight ruby %} module Jekyll class UpcaseConverter < Converter safe true priority :low def matches(ext) ext =~ /^\.upcase$/i end def output_ext(ext) ".html" end def convert(content) content.upcase end end end {% endhighlight %} Converters should implement at a minimum 3 methods:
    Method Description

    matches

    Does the given extension match this converter’s list of acceptable extensions? Takes one argument: the file’s extension (including the dot). Must return true if it matches, false otherwise.

    output_ext

    The extension to be given to the output file (including the dot). Usually this will be ".html".

    convert

    Logic to do the content conversion. Takes one argument: the raw content of the file (without YAML Front Matter). Must return a String.

    In our example, `UpcaseConverter#matches` checks if our filename extension is `.upcase`, and will render using the converter if it is. It will call `UpcaseConverter#convert` to process the content. In our simple converter we’re 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:
    Method Description

    init_with_program

    This method accepts one parameter, the Mercenary::Program 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.

    ## Tags If you’d like to include custom liquid tags in your site, you can do so by hooking into the tagging system. Built-in examples added by Jekyll include the `highlight` and `include` tags. Below is an example of a custom liquid tag that will output the time the page was rendered: {% highlight ruby %} module Jekyll class RenderTimeTag < Liquid::Tag def initialize(tag_name, text, tokens) super @text = text end def render(context) "#{@text} #{Time.now}" end end end Liquid::Template.register_tag('render_time', Jekyll::RenderTimeTag) {% endhighlight %} At a minimum, liquid tags must implement:
    Method Description

    render

    Outputs the content of the tag.

    You must also register the custom tag with the Liquid template engine as follows: {% highlight ruby %} Liquid::Template.register_tag('render_time', Jekyll::RenderTimeTag) {% endhighlight %} In the example above, we can place the following tag anywhere in one of our pages: {% highlight ruby %} {% raw %}

    {% render_time page rendered at: %}

    {% endraw %} {% endhighlight %} And we would get something like this on the page: {% highlight html %}

    page rendered at: Tue June 22 23:38:47 –0500 2010

    {% endhighlight %} ### 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. {% highlight ruby %} module Jekyll module AssetFilter def asset_url(input) "http://www.example.com/#{input}?#{Time.now.to_i}" end end end Liquid::Template.register_filter(Jekyll::AssetFilter) {% endhighlight %}
    ProTip™: Access the site object using Liquid

    Jekyll lets you access the site object through the context.registers feature of Liquid at context.registers[:site]. For example, you can access the global configuration file _config.yml using context.registers[:site].config.

    ### Flags There are two flags to be aware of when writing a plugin:
    Flag Description

    safe

    A boolean flag that informs Jekyll whether this plugin may be safely 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 true. 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!

    priority

    This flag determines what order the plugin is loaded in. Valid values are: :lowest, :low, :normal, :high, and :highest. Highest priority matches are applied first, lowest priority are applied last.

    To use one of the example plugins above as an illustration, here is how you’d specify these two flags: {% highlight ruby %} module Jekyll class UpcaseConverter < Converter safe true priority :low ... end 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 :site, :pages, :posts, and :documents. In all cases, Jekyll calls your hooks with the container object as the first callback parameter. But in the case of :pre_render, 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:
    Container Event Called

    :site

    :after_reset

    Just after site reset

    :site

    :post_read

    After site data has been read and loaded from disk

    :site

    :pre_render

    Just before rendering the whole site

    :site

    :post_render

    After rendering the whole site, but before writing any files

    :site

    :post_write

    After writing the whole site to disk

    :pages

    :post_init

    Whenever a page is initialized

    :pages

    :pre_render

    Just before rendering a page

    :pages

    :post_render

    After rendering a page, but before writing it to disk

    :pages

    :post_write

    After writing a page to disk

    :posts

    :post_init

    Whenever a post is initialized

    :posts

    :pre_render

    Just before rendering a post

    :posts

    :post_render

    After rendering a post, but before writing it to disk

    :posts

    :post_write

    After writing a post to disk

    :documents

    :post_init

    Whenever a document is initialized

    :documents

    :pre_render

    Just before rendering a document

    :documents

    :post_render

    After rendering a document, but before writing it to disk

    :documents

    :post_write

    After writing a document to disk

    ## Available Plugins 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. - [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. - [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. - [Emoji for Jekyll](https://github.com/yihangho/emoji-for-jekyll): Seamlessly enable emoji for all posts and pages. - [Compass integration for Jekyll](https://github.com/mscharley/jekyll-compass): Easily integrate Compass and Sass with your Jekyll website. - [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. - [Jekyll::Paginate::Category](https://github.com/midnightSuyama/jekyll-paginate-category): Pagination Generator for Jekyll Category. - [AMP-Jekyll by Juuso Mikkonen](https://github.com/juusaw/amp-jekyll): Generate [Accelerated Mobile Pages](https://www.ampproject.org) of Jekyll posts. #### 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. - [Sass SCSS Converter by Mark Wolfe](https://gist.github.com/960150): Sass converter which uses the new CSS compatible syntax, based Sam X’s fork above. - [LESS Converter by Jason Graham](https://gist.github.com/639920): Convert LESS files to CSS. - [LESS Converter by Josh Brown](https://gist.github.com/760265): Simple LESS converter. - [Upcase Converter by Blake Smith](https://gist.github.com/449463): An example Jekyll converter. - [CoffeeScript Converter by phaer](https://gist.github.com/959938): A [CoffeeScript](http://coffeescript.org) to Javascript converter. - [Markdown References by Olov Lassus](https://github.com/olov/jekyll-references): Keep all your markdown reference-style link definitions in one \_references.md file. - [Stylus Converter](https://gist.github.com/988201): Convert .styl to .css. - [ReStructuredText Converter](https://github.com/xdissent/jekyll-rst): Converts ReST documents to HTML with Pygments syntax highlighting. - [Jekyll-pandoc-plugin](https://github.com/dsanson/jekyll-pandoc-plugin): Use pandoc for rendering markdown. - [Jekyll-pandoc-multiple-formats](https://github.com/fauno/jekyll-pandoc-multiple-formats) by [edsl](https://github.com/edsl): Use pandoc to generate your site in multiple formats. Supports pandoc’s markdown extensions. - [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. - [jekyll-commonmark](https://github.com/pathawks/jekyll-commonmark): Markdown converter that uses [libcmark](https://github.com/jgm/CommonMark), the reference parser for CommonMark. #### 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 `
    ` tag. - [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 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-toc](https://github.com/toshimaru/jekyll-toc): A liquid filter plugin for Jekyll which generates a table of contents. - [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. - [jekyll-roman](https://github.com/paulrobertlloyd/jekyll-roman): A liquid filter for Jekyll that converts numbers into Roman numerals. - [jekyll-typogrify](https://github.com/myles/jekyll-typogrify): A Jekyll plugin that brings the functions of [typogruby](http://avdgaag.github.io/typogruby/). - [Jekyll Email Protect](https://github.com/vwochnik/jekyll-email-protect): Email protection liquid filter for Jekyll #### Tags - [Asset Path Tag](https://github.com/samrayner/jekyll-asset-path-plugin) by [Sam Rayner](http://www.samrayner.com/): Allows organisation of assets into subdirectories by outputting a path for a given file relative to the current post or page. - [Delicious Plugin by Christian Hellsten](https://github.com/christianhellsten/jekyll-plugins): Fetches and renders bookmarks from delicious.com. - [Ultraviolet Plugin by Steve Alex](https://gist.github.com/480380): Jekyll tag for the [Ultraviolet](https://github.com/grosser/ultraviolet) code highligher. - [Tag Cloud Plugin by Ilkka Laukkanen](https://gist.github.com/710577): Generate a tag cloud that links to tag pages. - [GIT Tag by Alexandre Girard](https://gist.github.com/730347): Add Git activity inside a list. - [MathJax Liquid Tags by Jessy Cowan-Sharp](https://gist.github.com/834610): Simple liquid tags for Jekyll that convert inline math and block equations to the appropriate MathJax script tags. - [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. - [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. - [Jsonball](https://gist.github.com/1895282): Reads json files and produces maps for use in Jekyll files. - [Bibjekyll](https://github.com/pablooliveira/bibjekyll): Render BibTeX-formatted bibliographies/citations included in posts and pages using bibtex2html. - [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://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 [``](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. - [Jekyll Responsive Image](https://github.com/wildlyinaccurate/jekyll-responsive-image): Responsive images for Jekyll. Automatically resizes images, supports all responsive methods (``, `srcset`, Imager.js, etc), super-flexible configuration. - [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. - [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. - [Jekyll Quick Man](https://github.com/GSI/jekyll_quick_man) by [GSI](https://github.com/GSI): Tag that renders pretty links to man page sources on the internet. - [jekyll-font-awesome](https://gist.github.com/23maverick23/8532525): Quickly and easily add Font Awesome icons to your posts. - [Lychee Gallery Tag](https://gist.github.com/tobru/9171700) by [tobru](https://github.com/tobru): Include [Lychee](http://lychee.electerious.com/) albums into a post. For an introduction, see [Jekyll meets Lychee - A Liquid Tag plugin](https://tobrunet.ch/articles/jekyll-meets-lychee-a-liquid-tag-plugin/) - [Image Set/Gallery Tag](https://github.com/callmeed/jekyll-image-set) by [callmeed](https://github.com/callmeed): Renders HTML for an image gallery from a folder in your Jekyll site. Just pass it a folder name and class/tag options. - [jekyll_figure](https://github.com/lmullen/jekyll_figure): Generate figures and captions with links to the figure in a variety of formats - [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. - [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. - [jekyll-figure](https://github.com/paulrobertlloyd/jekyll-figure): A liquid tag for Jekyll that generates `
    ` elements. #### Collections - [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. - [Growl Notification Hook by Tate Johnson](https://gist.github.com/525267): Better alternative to the above, but requires his “hook” fork. - [Related Posts by Lawrence Woodman](https://github.com/LawrenceWoodman/related_posts-jekyll_plugin): Overrides `site.related_posts` to use categories to assess relationship. - [jekyll-tagging-related_posts](https://github.com/toshimaru/jekyll-tagging-related_posts): Jekyll related_posts function based on tags (works on Jekyll3). - [Tiered Archives by Eli Naeher](https://gist.github.com/88cda643aa7e3b0ca1e5): Create tiered template variable that allows you to group archives by year and month. - [Jekyll-localization](https://github.com/blackwinter/jekyll-localization): Jekyll plugin that adds localization features to the rendering engine. - [Jekyll-rendering](https://github.com/blackwinter/jekyll-rendering): Jekyll plugin to provide alternative rendering engines. - [Jekyll-pagination](https://github.com/blackwinter/jekyll-pagination): Jekyll plugin to extend the pagination generator. - [Jekyll-tagging](https://github.com/pattex/jekyll-tagging): Jekyll plugin to automatically generate a tag cloud and tag pages. - [Jekyll-scholar](https://github.com/inukshuk/jekyll-scholar): Jekyll extensions for the blogging scholar. - [Jekyll-asset_bundler](https://github.com/moshen/jekyll-asset_bundler): Bundles and minifies JavaScript and CSS. - [Jekyll-assets](http://ixti.net/jekyll-assets/) by [ixti](https://github.com/ixti): Rails-alike assets pipeline (write assets in CoffeeScript, Sass, LESS etc; specify dependencies for automatic bundling using simple declarative comments in assets; minify and compress; use JST templates; cache bust; and many-many more). - [JAPR](https://github.com/kitsched/japr): Jekyll Asset Pipeline Reborn - Powerful asset pipeline for Jekyll that collects, converts and compresses JavaScript and CSS assets. - [File compressor](https://gist.github.com/2758691) by [mytharcher](https://github.com/mytharcher): Compress HTML and JavaScript files on site build. - [Jekyll-minibundle](https://github.com/tkareine/jekyll-minibundle): Asset bundling and cache busting using external minification tool of your choice. No gem dependencies. - [Singlepage-jekyll](https://github.com/JCB-K/singlepage-jekyll) by [JCB-K](https://github.com/JCB-K): Turns Jekyll into a dynamic one-page website. - [generator-jekyllrb](https://github.com/robwierzbowski/generator-jekyllrb): A generator that wraps Jekyll in [Yeoman](http://yeoman.io/), a tool collection and workflow for building 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](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. - [Jekyll Deploy](https://github.com/vwochnik/jekyll-deploy): Adds a `deploy` sub-command to Jekyll. - [Official Contentful Jekyll Plugin](https://github.com/contentful/jekyll-contentful-data-import): Adds a `contentful` sub-command to Jekyll to import data from Contentful. #### 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://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. - [Wordpress2Jekyll](https://wordpress.org/plugins/wp2jekyll/): A Wordpress plugin that allows you to use Wordpress as your editor and (automatically) export content in to Jekyll. WordPress2Jekyll attempts to marry these two systems together in order to make a site that can be easily managed from all devices.
    Jekyll Plugins Wanted

    If you have a Jekyll plugin that you would like to see added to this list, you should read the contributing page to find out how to make that happen.

    jekyll-3.1.6/site/_docs/posts.md000066400000000000000000000213601271741406300165470ustar00rootroot00000000000000--- layout: docs title: Writing posts permalink: /docs/posts/ --- One of Jekyll’s best aspects is that it is “blog aware”. What does this mean, exactly? Well, simply put, it means that blogging is baked into Jekyll’s functionality. If you write articles and publish them online, you can publish and maintain a blog simply by managing a folder of text-files on your computer. Compared to the hassle of configuring and maintaining databases 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 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 To create a new post, all you need to do is create a file in the `_posts` directory. How you name files in this folder is important. Jekyll requires blog post files to be named according to the following format: {% highlight bash %} YEAR-MONTH-DAY-title.MARKUP {% endhighlight %} Where `YEAR` is a four-digit number, `MONTH` and `DAY` are both two-digit numbers, and `MARKUP` is the file extension representing the format used in the file. For example, the following are examples of valid post filenames: {% highlight bash %} 2011-12-31-new-years-eve-is-awesome.md 2012-09-12-how-to-write-a-blog.textile {% endhighlight %}
    ProTip™: Link to other posts

    Use the post_url tag to link to other posts without having to worry about the URL's breaking when the site permalink style changes.

    ### Content Formats 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 [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.
    Be aware of character sets

    Content processors can modify certain characters to make them look nicer. For example, the smart extension in Redcarpet converts standard, ASCII quotation characters to curly, Unicode ones. In order for the browser to display those characters properly, define the charset meta value by including <meta charset="utf-8"> in the <head> of your layout.

    ## Including images and resources 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. 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 are 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: {% highlight text %} ... which is shown in the screenshot below: ![My helpful screenshot]({% raw %}{{ site.url }}{% endraw %}/assets/screenshot.jpg) {% endhighlight %} Linking to a PDF for readers to download: {% highlight text %} ... you can [get the PDF]({% raw %}{{ site.url }}{% endraw %}/assets/mydoc.pdf) directly. {% endhighlight %}
    ProTip™: Link using just the site root URL

    You can skip the {% raw %}{{ site.url }}{% endraw %} variable if you know your site will only ever be displayed at the root URL of your domain. In this case you can reference assets directly with just /path/file.jpg.

    ## Displaying an index of posts 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: {% highlight html %} {% endhighlight %} 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`. 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: {% highlight html %} {% 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: {% highlight html %} {% raw %}{{ post.excerpt | remove: '

    ' | remove: '

    ' }}{% endraw %} {% endhighlight %} 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: --- Excerpt 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` 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: {% highlight text %} {% raw %}{% highlight ruby %}{% endraw %} def show @widget = Widget(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @widget } end end {% raw %}{% endhighlight %}{% endraw %} {% endhighlight %} And the output will look like this: {% highlight ruby %} def show @widget = Widget(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @widget } end end {% endhighlight %}
    ProTip™: Show line numbers

    You can make code snippets include line-numbers by adding the word linenos to the end of the opening highlight tag like this: {% raw %}{% highlight ruby linenos %}{% endraw %}.

    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. jekyll-3.1.6/site/_docs/quickstart.md000066400000000000000000000016731271741406300175760ustar00rootroot00000000000000--- layout: docs title: Quick-start guide permalink: /docs/quickstart/ --- For the impatient, here's how to get a boilerplate Jekyll site up and running. {% highlight bash %} ~ $ gem install jekyll ~ $ jekyll new myblog ~ $ cd myblog ~/myblog $ jekyll serve # => Now browse to http://localhost:4000 {% endhighlight %} If you wish to install jekyll into an existing directory, you can do so by running `jekyll new .` from within the directory instead of creating a new one. If the existing directory isn't empty, you'll also have to pass the `--force` option like so `jekyll new . --force`. 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 advantage of all the awesome configuration options Jekyll makes available. If you're running into problems, ensure you have all the [requirements installed][Installation]. [Installation]: /docs/installation/ jekyll-3.1.6/site/_docs/resources.md000066400000000000000000000066471271741406300174240ustar00rootroot00000000000000--- layout: docs title: Resources permalink: /docs/resources/ --- Jekyll’s growing use is producing a wide variety of tutorials, frameworks, extensions, examples, and other resources that can be very helpful. Below is a collection of links to some of the most popular Jekyll resources. ### Useful Guides - [“Creating and Hosting a Personal Site on GitHub”](http://jmcglone.com/guides/github-pages/) - [‘Build A Blog With Jekyll And GitHub Pages’ on Smashing Magazine](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) - Publishing to GitHub Pages? [Check out our documentation page for just that purpose](/docs/github-pages/). - [Blogging with Git, Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) - [Tips for working with GitHub Pages Integration](https://gist.github.com/jedschneider/2890453) ### Integrations - [Use FormKeep as a backend for forms (contact forms, hiring forms, etc.)](https://formkeep.com/guides/how-to-make-a-contact-form-in-jekyll?utm_source=github&utm_medium=jekyll-docs&utm_campaign=contact-form-jekyll) - [Use Simple Form to add a simple contact form](http://getsimpleform.com/) - [Jekyll Bootstrap](http://jekyllbootstrap.com), 0 to Blog in 3 minutes. Provides detailed explanations, examples, and helper-code to make getting started with Jekyll easier. - [Integrating Twitter with Jekyll](http://www.justkez.com/integrating-twitter-with-jekyll/) > “Having migrated Justkez.com to be based on Jekyll, I was pondering how I might include my recent twitterings on the front page of the site. In the WordPress world, this would have been done via a plugin which may or may not have hung the loading of the page, might have employed caching, but would certainly have had some overheads. … Not in Jekyll.” ### Other commentary - [‘My Jekyll Fork’, by Mike West](http://mikewest.org/2009/11/my-jekyll-fork) > “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 peace with the world.” - [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) jekyll-3.1.6/site/_docs/sites.md000066400000000000000000000015251271741406300165270ustar00rootroot00000000000000--- layout: docs title: Sites using Jekyll permalink: /docs/sites/ --- It’s interesting to see what designs and features others have come up with. Below are some Jekyll-powered blogs which were hand-picked for learning purposes. - [Tom Preston-Werner](http://tom.preston-werner.com/) ([source](https://github.com/mojombo/mojombo.github.io)) - [GitHub Official Teaching Materials](http://training.github.com) ([source](https://github.com/github/training-kit)) - [Rasmus Andersson](http://rsms.me/) ([source](https://github.com/rsms/rsms.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]. [jekyll-sites]: {{ site.repository }}/wiki/Sites jekyll-3.1.6/site/_docs/static_files.md000066400000000000000000000020071271741406300200450ustar00rootroot00000000000000--- 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:
    Variable Description

    file.path

    The relative path to the file.

    file.modified_time

    The `Time` the file was last modified.

    file.extname

    The extension name for the file, e.g. .jpg for image.jpg

    jekyll-3.1.6/site/_docs/structure.md000066400000000000000000000135241271741406300174420ustar00rootroot00000000000000--- layout: docs title: Directory structure permalink: /docs/structure/ --- 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 a 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; the static web site is the final product. A basic Jekyll site usually looks something like this: {% highlight bash %} . ├── _config.yml ├── _drafts | ├── begin-with-the-crazy-ideas.textile | └── on-simplicity-in-technology.markdown ├── _includes | ├── footer.html | └── header.html ├── _layouts | ├── default.html | └── post.html ├── _posts | ├── 2007-10-29-why-every-programmer-should-play-nethack.textile | └── 2009-04-26-barcamp-boston-4-roundup.textile ├── _data | └── members.yml ├── _site ├── .jekyll-metadata └── index.html {% endhighlight %} An overview of what each of these does:
    File / Directory Description

    _config.yml

    Stores configuration data. Many of these options can be specified from the command line executable but it’s easier to specify them here so you don’t have to remember them.

    _drafts

    Drafts are unpublished posts. The format of these files is without a date: title.MARKUP. Learn how to work with drafts.

    _includes

    These are the partials that can be mixed and matched by your layouts and posts to facilitate reuse. The liquid tag {% raw %}{% include file.ext %}{% endraw %} can be used to include the partial in _includes/file.ext.

    _layouts

    These are the templates that wrap posts. Layouts are chosen on a post-by-post basis in the YAML Front Matter, which is described in the next section. The liquid tag {% raw %}{{ content }}{% endraw %} is used to inject content into the web page.

    _posts

    Your dynamic content, so to speak. The naming convention of these files is important, and must follow the format: YEAR-MONTH-DAY-title.MARKUP. The permalinks can be customized for each post, but the date and markup language are determined solely by the file name.

    _data

    Well-formatted site data should be placed here. The Jekyll engine will autoload all YAML files in this directory (using either the .yml, .yaml, .json or .csv formats and extensions) and they will be accessible via `site.data`. If there's a file members.yml under the directory, then you can access contents of the file through site.data.members.

    _site

    This is where the generated site will be placed (by default) once Jekyll is done transforming it. It’s probably a good idea to add this to your .gitignore file.

    .jekyll-metadata

    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 .gitignore file.

    index.html and other HTML, Markdown, Textile files

    Provided that the file has a YAML Front Matter section, it will be transformed by Jekyll. The same will happen for any .html, .markdown, .md, or .textile file in your site’s root directory or directories not listed above.

    Other Files/Folders

    Every other directory and file except for those listed above—such as css and images folders, favicon.ico files, and so forth—will be copied verbatim to the generated site. There are plenty of sites already using Jekyll if you’re curious to see how they’re laid out.

    jekyll-3.1.6/site/_docs/templates.md000066400000000000000000000332111271741406300173730ustar00rootroot00000000000000--- layout: docs title: Templates permalink: /docs/templates/ --- 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. ## Filters
    Description Filter and Output

    Date to XML Schema

    Convert a Date into XML Schema (ISO 8601) format.

    {% raw %}{{ site.time | date_to_xmlschema }}{% endraw %}

    2008-11-07T13:07:54-08:00

    Date to RFC-822 Format

    Convert a Date into the RFC-822 format used for RSS feeds.

    {% raw %}{{ site.time | date_to_rfc822 }}{% endraw %}

    Mon, 07 Nov 2008 13:07:54 -0800

    Date to String

    Convert a date to short format.

    {% raw %}{{ site.time | date_to_string }}{% endraw %}

    07 Nov 2008

    Date to Long String

    Format a date to long format.

    {% raw %}{{ site.time | date_to_long_string }}{% endraw %}

    07 November 2008

    Where

    Select all the objects in an array where the key has the given value.

    {% raw %}{{ site.members | where:"graduation_year","2014" }}{% endraw %}

    Group By

    Group an array's items by a given property.

    {% raw %}{{ site.members | group_by:"graduation_year" }}{% endraw %}

    [{"name"=>"2013", "items"=>[...]}, {"name"=>"2014", "items"=>[...]}]

    XML Escape

    Escape some text for use in XML.

    {% raw %}{{ page.content | xml_escape }}{% endraw %}

    CGI Escape

    CGI escape a string for use in a URL. Replaces any special characters with appropriate %XX replacements.

    {% raw %}{{ "foo,bar;baz?" | cgi_escape }}{% endraw %}

    foo%2Cbar%3Bbaz%3F

    URI Escape

    URI escape a string.

    {% raw %}{{ "foo, bar \baz?" | uri_escape }}{% endraw %}

    foo,%20bar%20%5Cbaz?

    Number of Words

    Count the number of words in some text.

    {% raw %}{{ page.content | number_of_words }}{% endraw %}

    1337

    Array to Sentence

    Convert an array into a sentence. Useful for listing tags.

    {% raw %}{{ page.tags | array_to_sentence_string }}{% endraw %}

    foo, bar, and baz

    Markdownify

    Convert a Markdown-formatted string into HTML.

    {% raw %}{{ page.excerpt | markdownify }}{% endraw %}

    Smartify

    Convert "quotes" into “smart quotes.”

    {% raw %}{{ page.title | smartify }}{% endraw %}

    Converting Sass/SCSS

    Convert a Sass- or SCSS-formatted string into CSS.

    {% raw %}{{ some_scss | scssify }}{% endraw %} {% raw %}{{ some_sass | sassify }}{% endraw %}

    Slugify

    Convert a string into a lowercase URL "slug". See below for options.

    {% raw %}{{ "The _config.yml file" | slugify }}{% endraw %}

    the-config-yml-file

    {% raw %}{{ "The _config.yml file" | slugify: 'pretty' }}{% endraw %}

    the-_config.yml-file

    Data To JSON

    Convert Hash or Array to JSON.

    {% raw %}{{ site.data.projects | jsonify }}{% endraw %}

    Sort

    Sort an array. Optional arguments for hashes: 1. property name 2. nils order (first or last).

    {% raw %}{{ page.tags | sort }}{% endraw %}

    {% raw %}{{ site.posts | sort: 'author' }}{% endraw %}

    {% raw %}{{ site.pages | sort: 'title', 'last' }}{% endraw %}

    Sample

    Pick a random value from an array. Optional: pick multiple values.

    {% raw %}{{ site.pages | sample }}{% endraw %}

    {% raw %}{{ site.pages | sample:2 }}{% endraw %}

    ### 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 If you have small page fragments that you wish to include in multiple places on your site, you can use the `include` tag. {% highlight ruby %} {% raw %}{% include footer.html %}{% endraw %} {% endhighlight %} Jekyll expects all include files to be placed in an `_includes` directory at the root of your source directory. This will embed the contents of `/_includes/footer.html` into the calling file.
    ProTip™: Use variables as file name

    The name of the file you wish to embed can be literal (as in the example above), or you can use a variable, using liquid-like variable syntax as in {% raw %}{% include {{my_variable}} %}{% endraw %}.

    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" variable-param=page.variable %}{% endraw %} {% endhighlight %} These parameters are available via Liquid in the include: {% highlight ruby %} {% 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 60 languages thanks to [Rouge](http://rouge.jneen.net). Rouge is the default highlighter in Jekyll 3 and above. To use it in Jekyll 2, set `highlighter` to `rouge` and ensure the `rouge` gem is installed properly. Alternatively, you can use [Pygments](http://pygments.org) to highlight your code snippets. To use Pygments, you must have Python installed on your system, have the `pygments.rb` gem installed and set `highlighter` to `pygments` in your site's configuration file. Pygments supports [over 100 languages](http://pygments.org/languages/) To render a code block with syntax highlighting, surround your code as follows: {% highlight text %} {% raw %} {% highlight ruby %} def foo puts 'foo' end {% endhighlight %} {% endraw %} {% endhighlight %} The argument to the `highlight` tag (`ruby` in the example above) is the language identifier. To find the appropriate identifier to use for the language you want to highlight, look for the “short name” on the [Rouge wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexers) or the [Pygments' Lexers page](http://pygments.org/docs/lexers/). #### Line numbers There is a second argument to `highlight` called `linenos` that is optional. Including the `linenos` argument will force the highlighted code to include line numbers. For instance, the following code block would include line numbers next to each line: {% highlight text %} {% raw %} {% highlight ruby linenos %} def foo puts 'foo' end {% endhighlight %} {% endraw %} {% endhighlight %} #### Stylesheets for syntax highlighting In order for the highlighting to show up, you’ll need to include a highlighting stylesheet. For an example stylesheet you can look at [syntax.css](https://github.com/mojombo/tpw/tree/master/css/syntax.css). These are the same styles as used by GitHub and you are free to use them for your own site. If you use `linenos`, you might want to include an additional CSS class definition for the `.lineno` class in `syntax.css` to distinguish the line numbers from the highlighted code. ### Post URL If you would like to include a link to a post on your site, the `post_url` tag will generate the correct permalink URL for the post you specify. {% highlight text %} {% raw %} {% post_url 2010-07-21-name-of-post %} {% endraw %} {% endhighlight %} If you organize your posts in subdirectories, you need to include subdirectory path to the post: {% highlight text %} {% raw %} {% post_url /subdir/2010-07-21-name-of-post %} {% endraw %} {% endhighlight %} There is no need to include the file extension when using the `post_url` tag. You can also use this tag to create a link to a post in Markdown as follows: {% highlight text %} {% raw %} [Name of Link]({% post_url 2010-07-21-name-of-post %}) {% endraw %} {% endhighlight %} ### Gist Use the `gist` tag to easily embed a GitHub Gist onto your site. This works with public or secret gists: {% highlight text %} {% raw %} {% gist parkr/931c1c8d465a04042403 %} {% endraw %} {% endhighlight %} You may also optionally specify the filename in the gist to display: {% highlight text %} {% raw %} {% 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. jekyll-3.1.6/site/_docs/troubleshooting.md000066400000000000000000000146721271741406300206360ustar00rootroot00000000000000--- 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.
    Please report issues you encounter!

    If you come across a bug, please create an issue on GitHub describing the problem and any work-arounds you find so we can document it here for others.

    jekyll-3.1.6/site/_docs/upgrading.md000066400000000000000000000005361271741406300173610ustar00rootroot00000000000000--- layout: docs title: Upgrading permalink: /docs/upgrading/ --- Upgrading from an older version of Jekyll? Upgrading to a new major version of Jekyll (e.g. from v2.x to v3.x) may cause some headaches. Take the following guides to aid your upgrade: - [From 0.x to 1.x and 2.x](/docs/upgrading/0-to-2/) - [From 2.x to 3.x](/docs/upgrading/2-to-3/) jekyll-3.1.6/site/_docs/upgrading/000077500000000000000000000000001271741406300170335ustar00rootroot00000000000000jekyll-3.1.6/site/_docs/upgrading/0-to-2.md000066400000000000000000000126311271741406300202760ustar00rootroot00000000000000--- layout: docs title: Upgrading from 0.x to 2.x permalink: /docs/upgrading/0-to-2/ --- Upgrading from an older version of Jekyll? A few things have changed in 1.0 and 2.0 that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: {% highlight bash %} $ gem update jekyll {% endhighlight %}
    Diving in

    Want to get a new Jekyll site up and running quickly? Simply run jekyll new SITENAME to create a new folder with a bare bones Jekyll site.

    ### The Jekyll Command 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, in v2.0 (and later) you should use the subcommands `jekyll build` and `jekyll serve` to build and preview your site.
    Watching and Serving

    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 holds true for `watch: true`. Instead, use the `--watch` flag with either `jekyll serve` or `jekyll build`.

    ### Absolute Permalinks 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. ### Draft Posts Jekyll now lets you write draft posts, and allows you to easily preview how they will look prior to publishing. To start a draft, simply create a folder called `_drafts` in your site's source directory (e.g., alongside `_posts`), and add a new markdown file to it. To preview your new post, simply run the `jekyll serve` command with the `--drafts` flag.
    Drafts don't have dates

    Unlike posts, drafts don't have a date, since they haven't been published yet. Rather than naming your draft something like `2013-07-01-my-draft-post.md`, simply name the file what you'd like your post to eventually be titled, here `my-draft-post.md`.

    ### 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). #### As a result, the following command line flags are now deprecated: * `--no-server` * `--no-auto` (now `--no-watch`) * `--auto` (now `--watch`) * `--server` * `--url=` * `--maruku`, `--rdiscount`, and `--redcarpet` * `--pygments` * `--permalink=` * `--paginate`
    The config flag explicitly specifies your configuration file(s)

    If you use the `--config` flag, Jekyll will ignore your `_config.yml` file. Want to merge a custom configuration with the normal configuration? No problem. Jekyll will accept more than one custom config file via the command line. Config files cascade from right to left, such that if I run `jekyll serve --config _config.yml,_config-dev.yml`, the values in the config files on the right (`_config-dev.yml`) overwrite those on the left (`_config.yml`) when both contain the same key.

    ### 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: * `excerpt_separator` * `host` * `include` * `keep_files` * `layouts` * `show_drafts` * `timezone` * `url` ### 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.
    All page and post URLs contain leading slashes

    If you use the method described above, please remember that the URLs for all posts and pages contain a leading slash. Therefore, concatenating the site baseurl and the post/page url where `site.baseurl = /` and `post.url = /2013/06/05/my-fun-post/` will result in two leading slashes, which will break links. It is thus suggested that prefixing with `site.baseurl` only be used when the `baseurl` is something other than the default of `/`.

    jekyll-3.1.6/site/_docs/upgrading/2-to-3.md000066400000000000000000000134631271741406300203050ustar00rootroot00000000000000--- layout: docs title: Upgrading from 2.x to 3.x permalink: /docs/upgrading/2-to-3/ --- Upgrading from an older version of Jekyll? A few things have changed in 3.0 that you'll want to know about. Before we dive in, go ahead and fetch the latest version of Jekyll: {% highlight bash %} $ gem update jekyll {% endhighlight %} Please note: Jekyll 3 requires Ruby version >= 2.0.0.
    Diving in

    Want to get a new Jekyll site up and running quickly? Simply run jekyll new SITENAME to create a new folder with a bare bones Jekyll site.

    ### site.collections has changed In 2.x, your iterations over `site.collections` yielded an array with the collection label and the collection object as the first and second items, respectively. In 3.x, this complication has been removed and iterations now yield simply the collection object. A simple conversion must be made in your templates: - `collection[0]` becomes `collection.label` - `collection[1]` becomes `collection` When iterating over `site.collections`, ensure the above conversions are made. For `site.collections.myCollection` in Jekyll 2, you now do: {% highlight liquid %} {% raw %} {% assign myCollection = site.collections | where: "label", "myCollection" | first %} {% endraw %} {% endhighlight %} This is a bit cumbersome at first, but is easier than a big `for` loop. ### Dropped dependencies We dropped a number of dependencies the Core Team felt were optional. As such, in 3.0, they must be explicitly installed and included if you use any of the features. They are: - jekyll-paginate – Jekyll's pagination solution from days past - jekyll-coffeescript – processing of CoffeeScript - jekyll-gist – the `gist` Liquid tag - pygments.rb – the Pygments highlighter - redcarpet – the Markdown processor - toml – an alternative to YAML for configuration files - classifier-reborn – for `site.related_posts` ### Future posts A seeming feature regression in 2.x, the `--future` flag was automatically _enabled_. The future flag allows post authors to give the post a date in the future and to have it excluded from the build until the system time is equal or after the post time. In Jekyll 3, this has been corrected. **Now, `--future` is disabled by default.** This means you will need to include `--future` if you want your future-dated posts to generate when running `jekyll build` or `jekyll serve`. ### Layout metadata Introducing: `layout`. In Jekyll 2 and below, any metadata in the layout was merged onto the `page` variable in Liquid. This caused a lot of confusion in the way the data was merged and some unexpected behaviour. In Jekyll 3, all layout data is accessible via `layout` in Liquid. For example, if your layout has `class: my-layout` in its YAML front matter, then the layout can access that via `{% raw %}{{ layout.class }}{% endraw %}`. ### Syntax highlighter changed For the first time, the default syntax highlighter has changed for the `highlight` tag and for backtick code blocks. Instead of [Pygments.rb](https://github.com/tmm1/pygments.rb), it's now [Rouge](http://rouge.jneen.net/). If you were using the `highlight` tag with certain options, such as `hl_lines`, they may not be available when using Rouge. To go back to using Pygments, set `highlighter: pygments` in your `_config.yml` file and run `gem install pygments.rb` or add `gem 'pygments.rb'` to your project's `Gemfile`. ### Relative Permalink support removed In Jekyll 3 and above, relative permalinks have been deprecated. If you created your site using Jekyll 2 and below, you may receive the following error when trying to **serve** or **build**: {% highlight text %} 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. {% endhighlight %} This can be fixed by removing the following line from your `_config.yml` file: {% highlight yaml %} relative_permalinks: true {% endhighlight %} ### Permalinks no longer automatically add a trailing slash In Jekyll 2, any URL constructed from the `permalink:` field had a trailing slash (`/`) added to it automatically. Jekyll 3 no longer adds a trailing slash automatically to `permalink:` URLs. This can potentially result in old links to pages returning a 404 error. For example, suppose a page previously contained the YAML `permalink: /:year-:month-:day-:title` that resulted in the URL `example.com/2016-02-01-test/` (notice the trailing slash), Jekyll internally generates a folder named `2016-02-01-test`. In Jekyll 3, the same `permalink:` generate the file `2016-02-01-test.html` and the URL for the same page will be `example.com/2016-02-01-test`, and consequently any links to the old URL will result in a 404 error. In order to maintain the same URLs and avoid this problem, a trailing slash should be added to the `permalink:` field, for example `permalink: /:year-:month-:day-:title/`. ### All my posts are gone! Where'd they go! Try adding `future: true` to your `_config.yml` file. Are they showing up now? If they are, then you were ensnared by an issue with the way Ruby parses times. Each of your posts is being read in a different timezone than you might expect and, when compared to the computer's current time, is "in the future." The fix for this is to add [a timezone offset](https://en.wikipedia.org/wiki/List_of_UTC_time_offsets) to each post (and make sure you remove `future: true` from your `_config.yml` file). If you're writing from California, for example, you would change this: {% highlight yaml %} --- date: 2016-02-06 19:32:10 --- {% endhighlight %} to this (note the offset): {% highlight yaml %} --- date: 2016-02-06 19:32:10 -0800 --- {% endhighlight %} _Did we miss something? Please click "Improve this page" above and add a section. Thanks!_ jekyll-3.1.6/site/_docs/usage.md000066400000000000000000000073031271741406300165040ustar00rootroot00000000000000--- layout: docs title: Basic Usage permalink: /docs/usage/ --- The Jekyll gem makes a `jekyll` executable available to you in your Terminal window. You can use this command in a number of ways: {% highlight bash %} $ jekyll build # => The current folder will be generated into ./_site $ jekyll build --destination # => The current folder will be generated into $ jekyll build --source --destination # => The folder will be generated into $ jekyll build --watch # => The current folder will be generated into ./_site, # watched for changes, and regenerated automatically. {% endhighlight %}
    Changes to _config.yml are not included during automatic regeneration.

    The _config.yml master configuration file contains global configurations and variable definitions that are read once at execution time. Changes made to _config.yml during automatic regeneration are not loaded until the next execution.

    Note Data Files are included and reloaded during automatic regeneration.

    Destination folders are cleaned on site builds

    The contents of <destination> are automatically 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 <destination> may be specified within the <keep_files> configuration directive.

    Do not use an important location for <destination>; instead, use it as a staging area and copy files from there to your web server.

    Jekyll also comes with a built-in development server that will allow you to 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 %}
    Be aware of default behavior

    As of version 2.4, the serve command will watch for changes automatically. To disable this, you can use jekyll serve --no-watch, which preserves the old behavior.

    {% 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/). Many configuration options can either be specified as flags on the command line, or alternatively (and more commonly) they can be specified in a `_config.yml` file at the root of the source directory. Jekyll will automatically use the options from this file when run. For example, if you place the following lines in your `_config.yml` file: {% highlight yaml %} source: _source destination: _deploy {% endhighlight %} Then the following two commands will be equivalent: {% highlight bash %} $ jekyll build $ jekyll build --source _source --destination _deploy {% endhighlight %} 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. jekyll-3.1.6/site/_docs/variables.md000066400000000000000000000232721271741406300173530ustar00rootroot00000000000000--- layout: docs title: Variables 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 files, Jekyll makes a variety of data available via the [Liquid templating system](https://github.com/Shopify/liquid/wiki). The following is a reference of the available data. ## Global Variables
    Variable Description

    site

    Sitewide information + configuration settings from _config.yml. See below for details.

    page

    Page specific information + the YAML front matter. Custom variables set via the YAML Front Matter will be available here. See below for details.

    content

    In layout files, the rendered content of the Post or Page being wrapped. Not defined in Post or Page files.

    paginator

    When the paginate configuration option is set, this variable becomes available for use. See Pagination for details.

    ## Site Variables
    Variable Description

    site.time

    The current time (when you run the jekyll command).

    site.pages

    A list of all Pages.

    site.posts

    A reverse chronological list of all Posts.

    site.related_posts

    If the page being processed is a Post, this contains a list of up to ten related Posts. By default, these are the ten most recent posts. For high quality but slow to compute results, run the jekyll command with the --lsi (latent semantic indexing) option. Also note GitHub Pages does not support the lsi option when generating sites.

    site.static_files

    A list of all static files (i.e. files not processed by Jekyll's converters or the Liquid renderer). Each file has three properties: path, modified_time and extname.

    site.html_pages

    A subset of `site.pages` listing those which end in `.html`.

    site.html_files

    A subset of `site.static_files` listing those which end in `.html`.

    site.collections

    A list of all the collections.

    site.data

    A list containing the data loaded from the YAML files located in the _data directory.

    site.documents

    A list of all the documents in every collection.

    site.categories.CATEGORY

    The list of all Posts in category CATEGORY.

    site.tags.TAG

    The list of all Posts with tag TAG.

    site.[CONFIGURATION_DATA]

    All the variables set via the command line and your _config.yml are available through the site variable. For example, if you have url: http://mysite.com in your configuration file, then in your Posts and Pages it will be stored in site.url. Jekyll does not parse changes to _config.yml in watch mode, you must restart Jekyll to see changes to variables.

    ## Page Variables
    Variable Description

    page.content

    The content of the Page, rendered or un-rendered depending upon what Liquid is being processed and what page is.

    page.title

    The title of the Page.

    page.excerpt

    The un-rendered excerpt of the Page.

    page.url

    The URL of the Post without the domain, but with a leading slash, e.g. /2008/12/14/my-post.html

    page.date

    The Date assigned to the Post. This can be overridden in a Post’s front matter by specifying a new date/time in the format YYYY-MM-DD HH:MM:SS (assuming UTC), or YYYY-MM-DD HH:MM:SS +/-TTTT (to specify a time zone using an offset from UTC. e.g. 2008-12-14 10:30:00 +0900).

    page.id

    An identifier unique to the Post (useful in RSS feeds). e.g. /2008/12/14/my-post

    page.categories

    The list of categories to which this post belongs. Categories are derived from the directory structure above the _posts directory. For example, a post at /work/code/_posts/2008-12-24-closures.md would have this field set to ['work', 'code']. These can also be specified in the YAML Front Matter.

    page.tags

    The list of tags to which this post belongs. These can be specified in the YAML Front Matter.

    page.path

    The path to the raw post or page. Example usage: Linking back to the page or post’s source on GitHub. This can be overridden in the YAML Front Matter.

    page.next

    The next post relative to the position of the current post in site.posts. Returns nil for the last entry.

    page.previous

    The previous post relative to the position of the current post in site.posts. Returns nil for the first entry.

    ProTip™: Use Custom Front Matter

    Any custom front matter that you specify will be available under page. For example, if you specify custom_css: true in a page’s front matter, that value will be available as page.custom_css.

    ## Paginator
    Variable Description

    paginator.per_page

    Number of Posts per page.

    paginator.posts

    Posts available for that page.

    paginator.total_posts

    Total number of Posts.

    paginator.total_pages

    Total number of Pages.

    paginator.page

    The number of the current page.

    paginator.previous_page

    The number of the previous page.

    paginator.previous_page_path

    The path to the previous page.

    paginator.next_page

    The number of the next page.

    paginator.next_page_path

    The path to the next page.

    Paginator variable availability

    These are only available in index files, however they can be located in a subdirectory, such as /blog/index.html.

    jekyll-3.1.6/site/_docs/windows.md000066400000000000000000000034641271741406300170760ustar00rootroot00000000000000--- layout: docs title: Jekyll on Windows permalink: /docs/windows/ --- While Windows is not an officially-supported platform, it can be used to run Jekyll with the proper tweaks. This page aims to collect some of the general knowledge and lessons that have been unearthed by Windows users. ## Installation Julian Thilo has written up instructions to get [Jekyll running on Windows][windows-installation] and it seems to work for most people. The instructions were written for Ruby 2.0.0, but should work for later versions [prior to 2.2][hitimes-issue]. Alternatively David Burela has written instructions on [how to install Jekyll via Chocolately with 3 command prompt entries](https://davidburela.wordpress.com/2015/11/28/easily-install-jekyll-on-windows-with-3-command-prompt-entries-and-chocolatey/). ## Encoding If you use UTF-8 encoding, make sure that no `BOM` header characters exist in your files or very, very bad things will happen to Jekyll. This is especially relevant if you're running Jekyll on Windows. Additionally, you might need to change the code page of the console window to UTF-8 in case you get a "Liquid Exception: Incompatible character encoding" error during the site generation process. It can be done with the following command: {% highlight bash %} $ chcp 65001 {% endhighlight %} [windows-installation]: http://jekyll-windows.juthilo.com/ [hitimes-issue]: https://github.com/copiousfreetime/hitimes/issues/40 ## Auto-regeneration As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the `--watch` switch is specified during a build or serve. While `listen` has 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 %} gem 'wdm', '~> 0.1.0' if Gem.win_platform? {% endhighlight %} jekyll-3.1.6/site/_includes/000077500000000000000000000000001271741406300157315ustar00rootroot00000000000000jekyll-3.1.6/site/_includes/analytics.html000066400000000000000000000020131271741406300206020ustar00rootroot00000000000000{% if site.gauges_id %} {% endif %} {% if site.google_analytics_id %} {% endif %} jekyll-3.1.6/site/_includes/anchor_links.html000066400000000000000000000020201271741406300212630ustar00rootroot00000000000000 jekyll-3.1.6/site/_includes/docs_contents.html000066400000000000000000000003251271741406300214640ustar00rootroot00000000000000
    jekyll-3.1.6/site/_includes/docs_contents_mobile.html000066400000000000000000000005611271741406300230150ustar00rootroot00000000000000
    jekyll-3.1.6/site/_includes/docs_option.html000066400000000000000000000004511271741406300211370ustar00rootroot00000000000000{% assign items = include.items %} {% for item in items %} {% assign item_url = item | prepend:"/docs/" | append:"/" %} {% for p in site.docs %} {% if p.url == item_url %} {% endif %} {% endfor %} {% endfor %} jekyll-3.1.6/site/_includes/docs_ul.html000066400000000000000000000006251271741406300202520ustar00rootroot00000000000000{% assign items = include.items %}
      {% for item in items %} {% assign item_url = item | prepend:"/docs/" | append:"/" %} {% if item_url == page.url %} {% assign c = "current" %} {% else %} {% assign c = "" %} {% endif %} {% assign p = site.docs | where:"url",item_url | first %}
    • {{ p.title }}
    • {% endfor %}
    jekyll-3.1.6/site/_includes/footer.html000066400000000000000000000011171271741406300201150ustar00rootroot00000000000000

    Proudly hosted by GitHub • Social coding

    jekyll-3.1.6/site/_includes/header.html000066400000000000000000000010041271741406300200420ustar00rootroot00000000000000
    jekyll-3.1.6/site/_includes/news_contents.html000066400000000000000000000017631271741406300215170ustar00rootroot00000000000000
    jekyll-3.1.6/site/_includes/news_contents_mobile.html000066400000000000000000000006171271741406300230430ustar00rootroot00000000000000
    jekyll-3.1.6/site/_includes/news_item.html000066400000000000000000000012001271741406300206020ustar00rootroot00000000000000 jekyll-3.1.6/site/_includes/primary-nav-items.html000066400000000000000000000010341271741406300222010ustar00rootroot00000000000000 jekyll-3.1.6/site/_includes/section_nav.html000066400000000000000000000027201271741406300211300ustar00rootroot00000000000000{% 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 %}
    {% if forloop.first %} Back {% else %} {% assign previous = forloop.index0 | minus: 1 %} {% assign previous_page = docs[previous] | prepend:"/docs/" | append:"/" %} {% endif %}
    {% if forloop.last %} Next {% else %} {% assign next = forloop.index0 | plus: 1 %} {% assign next_page = docs[next] | prepend:"/docs/" | append:"/" %} {% endif %}
    {% break %} {% endif %} {% endfor %}jekyll-3.1.6/site/_includes/top.html000066400000000000000000000014021271741406300174160ustar00rootroot00000000000000 {{ page.title }} {% feed_meta %} jekyll-3.1.6/site/_layouts/000077500000000000000000000000001271741406300156235ustar00rootroot00000000000000jekyll-3.1.6/site/_layouts/default.html000066400000000000000000000003101271741406300201270ustar00rootroot00000000000000{% include top.html %} {% include header.html %} {{ content }} {% include footer.html %} {% include anchor_links.html %} {% include analytics.html %} jekyll-3.1.6/site/_layouts/docs.html000066400000000000000000000011571271741406300174450ustar00rootroot00000000000000--- layout: default ---
    {% include docs_contents_mobile.html %}
    {% include docs_contents.html %}
    jekyll-3.1.6/site/_layouts/news.html000066400000000000000000000004431271741406300174660ustar00rootroot00000000000000--- layout: default ---
    {% include news_contents_mobile.html %}
    {{ content }}
    {% include news_contents.html %}
    jekyll-3.1.6/site/_layouts/news_item.html000066400000000000000000000012611271741406300205030ustar00rootroot00000000000000--- layout: news ---

    {{ page.title }}

    {{ content }}
    jekyll-3.1.6/site/_layouts/page.html000066400000000000000000000004011271741406300174200ustar00rootroot00000000000000--- layout: default ---

    {{ page.title }}

    {{ content }}
    jekyll-3.1.6/site/_posts/000077500000000000000000000000001271741406300152735ustar00rootroot00000000000000jekyll-3.1.6/site/_posts/2013-05-06-jekyll-1-0-0-released.markdown000066400000000000000000000017001271741406300235710ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.0.0 Released" date: "2013-05-06 02:12:52 +0200" author: parkr version: 1.0.0 categories: [release] --- Hey! After many months of hard work by Jekyll's contributors, we're excited to announce the first major release of the project in a long while. v1.0.0 is finally here! While the list of improvements and bug fixes is [quite lengthy][history], here are the highlights (thanks to [@benbalter](http://twitter.com/BenBalter) for the examples and for compiling this list): - Support for the Gist tag for easily embedding Gists ([example](https://gist.github.com/benbalter/5555251)) - Automatically generated post excerpts ([example](https://gist.github.com/benbalter/5555369)) - Save and preview drafts before publishing ([example](https://gist.github.com/benbalter/5555992)) Take a look at the [Upgrading][] page in the docs for more detailed information. [history]: /docs/history/#v1-0-0 [Upgrading]: /docs/upgrading/ jekyll-3.1.6/site/_posts/2013-05-08-jekyll-1-0-1-released.markdown000066400000000000000000000020001271741406300235660ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.0.1 Released" date: "2013-05-08 23:46:11 +0200" author: parkr version: 1.0.1 categories: [release] --- Hot on the trails of v1.0, v1.0.1 is out! Here are the highlights: * Add newer `language-` class name prefix to code blocks ([#1037][]) * Commander error message now preferred over process abort with incorrect args ([#1040][]) * Do not force use of toc_token when using generate_toc in RDiscount ([#1048][]) * Make Redcarpet respect the pygments configuration option ([#1053][]) * Fix the index build with LSI ([#1045][]) * Don't print deprecation warning when no arguments are specified. ([#1041][]) * Add missing `
    ` to site template used by `new` subcommand, fixed typos in code ([#1032][]) See the [History][] page for more information on this release. {% assign issue_numbers = "1037|1040|1048|1053|1045|1041|1032" | split: "|" %} {% for issue in issue_numbers %} [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }} {% endfor %} [History]: /docs/history/#v1-0-1 jekyll-3.1.6/site/_posts/2013-05-12-jekyll-1-0-2-released.markdown000066400000000000000000000020641271741406300235740ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.0.2 Released" date: "2013-05-12 14:45:00 +0200" author: parkr version: 1.0.2 categories: [release] --- v1.0.2 has some key bugfixes that optionally restore some behaviour from pre-1.0 releases, and fix some other annoying bugs: * Backwards-compatibilize relative permalinks ([#1081][]) * Add `jekyll doctor` command to check site for any known compatibility problems ([#1081][]) * Deprecate old config `server_port`, match to `port` if `port` isn't set ([#1084][]) * Update pygments.rb and kramdon versions to 0.5.0 and 1.0.2, respectively ([#1061][], [#1067][]) * Fix issue when post categories are numbers ([#1078][]) * Add a `data-lang=""` attribute to Redcarpet code blocks ([#1066][]) * Catching that Redcarpet gem isn't installed ([#1059][]) See the [History][] page for more information on this release. {% assign issue_numbers = "1059|1061|1066|1067|1078|1081|1084" | split: "|" %} {% for issue in issue_numbers %} [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }} {% endfor %} [History]: /docs/history/#v1-0-2 jekyll-3.1.6/site/_posts/2013-06-07-jekyll-1-0-3-released.markdown000066400000000000000000000014761271741406300236100ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.0.3 Released" date: "2013-06-07 21:02:13 +0200" author: parkr version: 1.0.3 categories: [release] --- v1.0.3 contains some key enhancements and bug fixes: - Fail with non-zero exit code when MaRuKu errors ([#1190][]) or Liquid errors ([#1121][]) - Add support for private gists to `gist` tag ([#1189][]) - Add `--force` option to `jekyll new` ([#1115][]) - Fix compatibility with `exclude` and `include` with pre-1.0 Jekyll ([#1114][]) - Fix pagination issue regarding `File.basename` and `page:num` ([#1063][]) See the [History][] page for more information on this release. {% assign issue_numbers = "1190|1121|1189|1115|1114|1063" | split: "|" %} {% for issue in issue_numbers %} [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }} {% endfor %} [History]: /docs/history/#v1-0-3 jekyll-3.1.6/site/_posts/2013-07-14-jekyll-1-1-0-released.markdown000066400000000000000000000020211271741406300235700ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.1.0 Released" date: "2013-07-14 19:38:02 +0200" author: parkr version: 1.1.0 categories: [release] --- After a month of hard work, the Jekyll core team is excited to announce the release of Jekyll v1.1.0! This latest release of Jekyll brings some really exciting new additions: - Add `docs` subcommand to read Jekyll's docs when offline. ([#1046][]) - Support passing parameters to templates in `include` tag ([#1204][]) - Add support for Liquid tags to post excerpts ([#1302][]) - Fix pagination for subdirectories ([#1198][]) - Provide better error reporting when generating sites ([#1253][]) - Latest posts first in non-LSI `related_posts` ([#1271][]) See the [GitHub Release][] page for more a more detailed changelog for this release. {% assign issue_numbers = "1046|1204|1302|1198|1171|1118|1098|1215|1253|1271" | split: "|" %} {% for issue in issue_numbers %} [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }} {% endfor %} [GitHub Release]: {{ site.repository }}/releases/tag/v1.1.0 jekyll-3.1.6/site/_posts/2013-07-24-jekyll-1-1-1-released.markdown000066400000000000000000000020401271741406300235730ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.1.1 Released" date: "2013-07-24 22:24:14 +0200" author: parkr version: 1.1.1 categories: [release] --- Coming just 10 days after the release of v1.1.0, v1.1.1 is out with a patch for the nasty excerpt inception bug ([#1339][]) and non-zero exit codes for invalid commands ([#1338][]). To all those affected by the [strange excerpt bug in v1.1.0][#1321], I'm sorry. I think we have it all patched up and it should be deployed to [GitHub Pages][gh_pages] in the next couple weeks. Thank you for your patience! If you're checking out v1.1.x for the first time, definitely check out [what shipped with v1.1.0!][v1_1_0] See the [GitHub Release][] page for more a more detailed changelog for this release. {% assign issue_numbers = "1339|1338|1321" | split: "|" %} {% for issue in issue_numbers %} [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }} {% endfor %} [GitHub Release]: {{ site.repository }}/releases/tag/v1.1.1 [gh_pages]: http://pages.github.com [v1_1_0]: {{ site.repository }}/releases/tag/v1.1.0 jekyll-3.1.6/site/_posts/2013-07-25-jekyll-1-0-4-released.markdown000066400000000000000000000016361271741406300236100ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.0.4 Released" date: "2013-07-25 09:08:38 +0200" author: mattr- version: 1.0.4 categories: [release] --- Version 1.0.4 fixes a minor, but nonetheless important security vulnerability affecting several third-party Jekyll plugins. If your Jekyll site does not use plugins, you may, but are not required to upgrade at this time. Community and custom plugins extending the `Liquid::Drop` class may inadvertently disclose some system information such as directory structure or software configuration to users with access to the Liquid templating system. We recommend you upgrade to Jekyll v1.0.4 immediately if you use `Liquid::Drop` plugins on your Jekyll site. Many thanks for [Ben Balter](https://github.com/benbalter) for alerting us to the problem and [submitting a patch][1349] so quickly. [230]: https://github.com/Shopify/liquid/pull/230 [1349]: {{ site.repository }}/issues/1349 jekyll-3.1.6/site/_posts/2013-07-25-jekyll-1-1-2-released.markdown000066400000000000000000000016351271741406300236060ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.1.2 Released" date: "2013-07-25 09:08:38 +0200" author: parkr version: 1.1.2 categories: [release] --- Version 1.1.2 fixes a minor, but nonetheless important security vulnerability affecting several third-party Jekyll plugins. If your Jekyll site does not use plugins, you may, but are not required to upgrade at this time. Community and custom plugins extending the `Liquid::Drop` class may inadvertently disclose some system information such as directory structure or software configuration to users with access to the Liquid templating system. We recommend you upgrade to Jekyll v1.1.2 immediately if you use `Liquid::Drop` plugins on your Jekyll site. Many thanks for [Ben Balter](https://github.com/benbalter) for alerting us to the problem and [submitting a patch][1349] so quickly. [230]: https://github.com/Shopify/liquid/pull/230 [1349]: {{ site.repository }}/issues/1349 jekyll-3.1.6/site/_posts/2013-09-06-jekyll-1-2-0-released.markdown000066400000000000000000000021021271741406300235740ustar00rootroot00000000000000--- layout: news_item title: "Jekyll 1.2.0 Released" date: "2013-09-06 22:02:41 -0400" author: parkr version: 1.2.0 categories: [release] --- After nearly a month and a half of hard work, the Jekyll team is happy to announce the release of v1.2.0. It's chock full of bug fixes and some enhancements that we think you'll love. Here are a few things we think you'll want to know about this release: * Run `jekyll serve --detach` to boot up a WEBrick server in the background. **Note:** you'll need to run `kill [server_pid]` to shut the server down. * You can now **disable automatically-generated excerpts** if you set `excerpt_separator` to `""`. * If you're moving around pages and post, you can now check for **URL conflicts** by running `jekyll doctor`. * If you're a fan of the drafts feature, you'll be happy to know we've added `-D`, a shortened version of `--drafts`. * Permalinks with special characters should now generate without errors. * Expose the current Jekyll version as the `jekyll.version` Liquid variable. For a full run-down, visit our [change log](/docs/history/)! jekyll-3.1.6/site/_posts/2013-09-14-jekyll-1-2-1-released.markdown000066400000000000000000000012371271741406300236040ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.2.1 Released' date: 2013-09-14 20:46:50 -0400 author: parkr version: 1.2.1 categories: [release] --- Quick turnover, anyone? A [recent incompatibility with Liquid v2.5.2](https://github.com/jekyll/jekyll/pull/1525) produced a nasty bug in which `include` tags were not rendered properly within `if` blocks. This release also includes a better handling of detached servers (prints pid and the command for killing the process). **Note**: the `--detach` flag and `--watch` flags are presently incompatible in 1.2.x. Fix for that coming soon! For a full list of the fixes in this release, check out [the change log](/docs/history/)! jekyll-3.1.6/site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown000066400000000000000000000010471271741406300242630ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.3.0.rc1 Released' date: 2013-10-28 20:14:39 -0500 author: mattr- version: 1.3.0.rc1 categories: [release] --- Jekyll 1.3.0 is going to be a big release! In order to make sure we didn't screw anything up too badly, we're making a release candidate available for any early adopters who want to give the latest and 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! jekyll-3.1.6/site/_posts/2013-11-04-jekyll-1-3-0-released.markdown000066400000000000000000000027251271741406300235770ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.3.0 Released' date: 2013-11-04 21:46:02 -0600 author: mattr- version: 1.3.0 categories: [release] --- It's been about six weeks since v1.2.0 and the Jekyll team is happy to announce the arrival of v1.3.0. This is a **huge** release full of all sorts of new features, bug fixes, and other things that you're sure to love. Here are a few things we think you'll want to know about this release: * You can add [arbitrary data][] to the site by adding YAML files under a site's `_data` directory. This will allow you to avoid repetition in your templates and to set site specific options without changing `_config.yml`. * You can now run `jekyll serve --detach` to boot up a WEBrick server in the background. **Note:** you'll need to run `kill [server_pid]` to shut the server down. When ran, you'll get a process id that you can use in place of `[server_pid]` * You can now **disable automatically-generated excerpts** if you set `excerpt_separator` to `""`. * If you're moving pages and posts, you can now check for **URL conflicts** by running `jekyll doctor`. * If you're a fan of the drafts feature, you'll be happy to know we've added `-D`, a shortened version of `--drafts`. * Permalinks with special characters should now generate without errors. * Expose the current Jekyll version as the `jekyll.version` Liquid variable. For a full run-down, visit our [change log](/docs/history/)! [arbitrary data]: /docs/datafiles/ jekyll-3.1.6/site/_posts/2013-11-26-jekyll-1-3-1-released.markdown000066400000000000000000000013701271741406300235770ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.3.1 Released' date: 2013-11-26 19:52:20 -0600 author: mattr- version: 1.3.1 categories: [release] --- Just in time for the US holiday Thanksgiving, we're releasing version 1.3.1 of Jekyll to address some of the issues seen since the release of 1.3.0. In addition to a couple of other smaller bug fixes, the biggest thing we've fixed is an issue with the `--watch` option with Ruby 1.8.7. For a full run-down, visit our [change log](/docs/history/)! Thanks to all the people who have contributed to this release! They are (in alphabetical order): Abhi Yerra, Anatol Broder, Andreas Möller, Greg Karékinian, Sam Rayner, Santeri Paavolainen, Shigeya Suzuki, Yihang Ho, albertogg, andrewhavens, maul.esel, and thomasdao jekyll-3.1.6/site/_posts/2013-12-07-jekyll-1-4-0-released.markdown000066400000000000000000000021251271741406300235760ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.4.0 Released' date: 2013-12-07 13:55:28 -0600 author: mattr- version: 1.4.0 categories: [release] --- About a month after the release of Jekyll v1.3.0, we are releasing Jekyll v1.4.0. This release will be the last non-patch release to support Ruby 1.8.7 and our next release will be Jekyll 2.0.0. Here are a few things we think you'll want to know about this release: * TOML is now a supported markup language for config files. * Maruku has been updated to 0.7.0 which provides some new features and a ton of bugfixes over the previous 0.6.x releases. * Non-`gem` Plugins are now sorted alphabetically by filename before they're processed, which can provide a rudimentary way to establish a load order for plugins. For a full run-down, visit our [change log](/docs/history/)! As always, Jekyll wouldn't be possible without the contributions from others in the Jekyll community. We'd like to thank the following people for contributing to this release: Anatol Broder, David Sawyer, Greg Karékinian, Jordon Bedwell, Matthew Iversen, Persa Zula, and Yi Zeng. jekyll-3.1.6/site/_posts/2013-12-09-jekyll-1-4-1-released.markdown000066400000000000000000000007631271741406300236070ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.4.1 Released' date: 2013-12-09 20:44:13 -0600 author: mattr- version: 1.4.1 categories: [release] --- Another quick turnover, anyone? A [critical bug]({{ site.repository }}/issues/1794) in the reading of posts snuck itself into the 1.4.0 release. To address this issue, we're releasing v1.4.1 of Jekyll so that you can 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/)! jekyll-3.1.6/site/_posts/2013-12-16-jekyll-1-4-2-released.markdown000066400000000000000000000010651271741406300236020ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.4.2 Released' date: 2013-12-16 19:48:13 -0500 author: parkr version: 1.4.2 categories: [release] --- This release fixes [a regression][] where Maruku fenced code blocks were turned off, instead of the previous default to on. We've added a new default configuration to our `maruku` config key: `fenced_code_blocks` and set it to default to `true`. If you do not wish to use Maruku fenced code blocks, you may turn this option off in your site's configuration file. [a regression]: https://github.com/jekyll/jekyll/pull/1830 jekyll-3.1.6/site/_posts/2014-01-13-jekyll-1-4-3-released.markdown000066400000000000000000000022031271741406300235720ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.4.3 Released' date: 2014-01-13 17:43:32 -0800 author: benbalter version: 1.4.3 categories: [release] --- Jekyll 1.4.3 contains two **critical** security fixes. If you run Jekyll locally and do not run Jekyll in "safe" mode (e.g. you do not build Jekyll sites on behalf of others), you are not affected and are not required to update at this time. ([See pull request.]({{ site.repository }}/pull/1944)) Versions of Jekyll prior to 1.4.3 and greater than 1.2.0 may allow malicious users to expose the content of files outside the source directory in the generated output via improper symlink sanitization, potentially resulting in an inadvertent information disclosure. Versions of Jekyll prior to 1.4.3 may also allow malicious users to write arbitrary `.html` files outside of the destination folder via relative path traversal, potentially overwriting otherwise-trusted content with arbitrary HTML or Javascript depending on your server's configuration. *Maintainer's note: Many thanks to @gregose and @charliesome for discovering these vulnerabilities, and to @BenBalter and @alindeman for writing the patch.* jekyll-3.1.6/site/_posts/2014-03-24-jekyll-1-5-0-released.markdown000066400000000000000000000011031271741406300235720ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.5.0 Released' date: 2014-03-24 20:37:59 -0400 author: parkr version: 1.5.0 categories: [release] --- As work continues on Jekyll 2.0.0, we felt it was important to address two key issues of Jekyll 1.4.3, namely the `safe_yaml` dependency below 1.0 and the inability to use Jekyll 1.4.3 on Windows due to a [fun issue with path sanitizing][]. For a full changelog, check out our [history][] page. Now, back to work on 2.0.0! [fun issue with path sanitizing]: https://github.com/jekyll/jekyll/issues/1948 [history]: /docs/history/#v1-5-0 jekyll-3.1.6/site/_posts/2014-03-27-jekyll-1-5-1-released.markdown000066400000000000000000000013031271741406300236000ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 1.5.1 Released' date: 2014-03-27 22:43:48 -0400 author: parkr version: 1.5.1 categories: [release] --- The hawk-eyed [@gregose](https://github.com/gregose) spotted a bug in our `Jekyll.sanitized_path` code: {% highlight ruby %} > sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") => "/tmp/foobar/jail/../../../etc/passwd" {% endhighlight %} Well, we can't have that! In 1.5.1, you'll instead see: {% highlight ruby %} > sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") => "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd" {% endhighlight %} Luckily not affecting 1.4.x, this fix will make 1.5.0 that much safer for the masses. Thanks, Greg! jekyll-3.1.6/site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown000066400000000000000000000120211271741406300231600ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll turns 2.0.0' author: parkr version: 2.0.0 categories: [release] --- A year ago to the day, [we released Jekyll 1.0.0][jekyll-1]. One year later, we present to you the next major version: Jekyll 2.0.0. Jam-packed with some [highly-requested features and bugfixes galore][changelog], this is the best Jekyll yet. Some notable changes: 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 ` 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/#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! Check out our [changelog][] for a complete list of all (200+) changes. Many thanks to these 183 contributors for making Jekyll 2.0.0 happen: Parker Moore, Matt Rogers, maul.esel, Anatol Broder, Zach Gersh, Joel Glovier, Ben Balter, XhmikosR, Coby Chapple, John Piasetzki, Aidan Feldman, Robin Dupret, Pascal Borreli, Troy Swanson, Erik Michaels-Ober, albertogg, Lucas Jenss, Matt Rogers & Persa Zula, Eric Mill, Shigeya Suzuki, Jens Nazarenus, ddavison, Pat Hawks, Rob Wierzbowski, MURAOKA Taro, Casey Lang, Fabian Rodriguez, Greg Karékinian, Zlatan Vasović, Christopher Nicotera, Dmitry Chestnykh, Ryan Morrissey, Jordon, John Hughes, akira yamada, Matt Swanson, Jashank Jeremy, Matthew Iversen, Meeka, liufengyun, Anand Narayan, nitoyon, Geoff Shannon, Benjamin J. Balter, Juan Ignacio Donoso, David Briggs, Benjamin Esham, Slava Pavlutin, Assaf Gelber, Josh Brown, Nick Fagerlund, Davide Ficano, pilosus, Anthony Smith, André Arko, Mikael Konutgan, Matthew Scharley, Dan Tao, scribu, Mort Yao, m, Stephen McDonald, Marcus Stollsteimer, Thomas Torsney-Weir, Jordon Bedwell, Tom Preston-Werner, Lincoln Mullen, Philip Poots, Ivan Tse, Christopher Giroir, Valery Tolstov, Wlodek Bzyl, Xavier Noria, Yi Zeng, Persa Zula, Phil Leggetter, Pirogov Evgenij, Rafael Revi, Rob McGuire-Dale, Rob Muhlestein, Robin Mehner, Roland Warmerdam, Rusty Geldmacher, Sam Rayner, Santeri Paavolainen, Sebastian Morr, Stephan Groß, Steven Spasbo, Tobias Brunner, Tuomas Kareinen, Tyler Margison, Uwe Dauernheim, Yihang Ho, Zach Leatherman, Zequez, andrew morton, andrewhavens, imathis, jannypie, jaybe@jekyll, kk_Ataka, markets, redwallhp, schneems, szymzet, thomasdao, tomsugden, wǒis神仙, 张君君, Noah Slater, Abhi Yerra, Adam Heckler, Ahmed Hazem, Aigars Dzerviniks, Aleksey V. Zapparov, Andreas Möller, Andy Lindeman, Arlen Cuss, Aziz Shamim, Ben Baker-Smith, Ben Hanzl, Ben Hildred, Brian Kim, Brice, Carol Nichols, Chezou, Chris Jones, Christian Grobmeier, Christoph Hochstrasser, Christoph Schiessl, Clint Shryock, Colin Dean, Corey Ward, Damian Lettie, Daniel Schauenberg, David Ensinger, David Paschich, David Sawyer, David Silva Smith, Donald Perry, Doug Johnston, Edward Ball, Eric Dobson, Erik Dungan, Florent Guilleux, Francis, Frederic ROS, GSI2013, Garen Torikian, George Anderson, Giuseppe Capizzi, Ishibashi Hideto, Jarrod Birch, Jeff Kolesky, Jens Bissinger, Jens Krause, John Firebaugh, John Papandriopoulos, Josh Branchaud, Katy DeCorah, Lachlan Holden, Mark Prins, Markus Roth, Martin Charles, Matt Iversen, Matt Sheehan, Matt Swensen, Matthias Vogelgesang, Michael Parker, Miha Rekar, Nathan Youngman, Nick Quaranto, Nick Quinlan, Nick Schonning, Nicolas Alpi, Nicolás Reynolds, Nikkau, 4ensicLog, Octavian Damiean, Olov Lassus, PatrickC8t, Paul Annesley, and Paul Oppenheim. Happy developing! [changelog]: /docs/history/ [@jglovier]: https://github.com/jglovier [jekyll-1]: {% post_url 2013-05-06-jekyll-1-0-0-released %} jekyll-3.1.6/site/_posts/2014-05-08-jekyll-2-0-3-released.markdown000066400000000000000000000016561271741406300236120ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 2.0.3 Released' date: 2014-05-08 22:43:17 -0400 author: parkr version: 2.0.3 categories: [release] --- Hey again! Just wanted to let you know we've released another version of Jekyll, jam-packed with bug fixes. A huge "thank you" is in order for all the folks who have submitted bug reports over the last 2 days — your input is what allows this project to continue. It's always a pain to deal with a MAJOR version bump release, but it's been pretty smooth so far and you have all been nice about the flaws you've found in the tool. Keep filing those reports so we can continue to make Jekyll even better! Thank you to the contributors that contributed code to 2.0.1, 2.0.2, and/or 2.0.3: Parker Moore, Yi Zeng, Gabe Ortiz, Aaron Broder, Alberto Grespan, gpxl, David Briggs, Kevin Ingersoll, and Troy Swanson. As always, check out the [changelog](/docs/history/) for more info. Happy Jekylling! jekyll-3.1.6/site/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown000066400000000000000000000014101271741406300271400ustar00rootroot00000000000000--- layout: news_item title: 'Pick Up your $1 Jekyll Sticker' date: 2014-06-04 15:46:53 -0400 author: parkr categories: [partners] --- ![Jekyll Sticker](/img/jekyll-sticker.jpg) You may have heard that [@cobyism](https://github.com/cobyism)'s excellent Jekyll logo has been made into a sticker. You may have sat idly by, wishing that you could have a sticker honoring your beloved Jekyll. The StickerMule team says, *"Pine no longer!"* StickerMule has **[discounted the price of Jekyll stickers down to $1 and are offering free (domestic) shipping](http://www.stickermule.com/marketplace/825-jekyll-stickers)!** Go grab one now on the StickerMule marketplace – [they'll look swell on your favourite hardware.](https://twitter.com/parkr/status/430826309707902976/photo/1) jekyll-3.1.6/site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown000066400000000000000000000027451271741406300245660ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll Turns 21! Err... I mean 2.1.0.' date: 2014-06-28 17:26:59 -0400 author: parkr version: 2.1.0 categories: [release] --- Jekyll's finally [legal to drink in the States](http://en.wikipedia.org/wiki/Legal_drinking_age). 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 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) - New `--skip_initial_build` flag for `jekyll serve` (#2477) - A bajilion bug fixes and site updates! Let's go party! *Check out the [full changelog](/docs/history/#v2-1-0) for more.* Many thanks to these 37 contributors for the 2.1.0 release: Alberto Grespan, Alessandro Lorenzi, Alex Medearis, Alfred Xing, Anatol Broder, Ben, Ben Balter, Bud Parr, Chezou, Denilson Figueiredo de Sá, Denilson Sá, Ivan Tse, Jens Nazarenus, Jesse Shawl, Jordon Bedwell, Josh Davis, János Rusiczki, Marc Ransome, Mathieu Bruyen, Matt Rogers, Parker Moore, Pat Hawks, Paul Henry, Peter Rhoades, Philipp Rudloff, Quinn Shanahan, Renaud Martinet, Rob Murray, Rodrigo Dumont, Simon Sarris, Terry, Terry Schmidt, Tomer Cohen, XhmikosR, Yihang Ho, jaybe@jekyll, and mikecole. jekyll-3.1.6/site/_posts/2014-07-01-jekyll-2-1-1-released.markdown000066400000000000000000000015631271741406300236010ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 2.1.1 Released' date: 2014-07-01 20:16:43 -0400 author: parkr version: 2.1.1 categories: [release] --- This is a minor release for Jekyll 2.1.0. It fixes a couple bugs and introduces fixes for a couple security-related issues. It covers two security vulnerabilities: 1. One in the reading of data 2. One in the `layouts` setting They were identified in Jekyll 1.5.1 and has been confirmed as patched in this version and the version used by GitHub Pages. If you are in the business of building Jekyll sites, please ensure you upgrade to 2.1.1 as soon as possible. For more, check out [`jekyll/jekyll#2563`](https://github.com/jekyll/jekyll/pull/2563). Additionally, the dependency on Maruku has been loosened and a bug was fixed with document URLs. As always, check out the [full changelog](/docs/history/) for more info! Happy Jekylling! jekyll-3.1.6/site/_posts/2014-07-29-jekyll-2-2-0-released.markdown000066400000000000000000000010561271741406300236100ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 2.2.0 Released' date: 2014-07-29 18:59:13 -0400 author: parkr version: 2.2.0 categories: [release] --- Jekyll 2.2.0 contains a few key updates: 1. A warning will now fire if you specify a layout in any of your pages or posts that doesn't exist. 2. Certain Pygments options are now whitelisted in safe mode 3. Categories in a post's path are now respected (i.e. folders in `_posts` will now work properly). As always, a full list of the updates are on the [history page](/docs/history/#v2-2-0). Happy Jekylling! jekyll-3.1.6/site/_posts/2014-08-10-jekyll-2-3-0-released.markdown000066400000000000000000000034601271741406300236010ustar00rootroot00000000000000--- 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! jekyll-3.1.6/site/_posts/2014-09-09-jekyll-2-4-0-released.markdown000066400000000000000000000027511271741406300236150ustar00rootroot00000000000000--- 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! jekyll-3.1.6/site/_posts/2014-11-06-jekylls-midlife-crisis-jekyll-turns-2-5-0.markdown000066400000000000000000000046671271741406300275570ustar00rootroot00000000000000--- 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! jekyll-3.1.6/site/_posts/2014-11-08-jekyll-2-5-1-released.markdown000066400000000000000000000023321271741406300236020ustar00rootroot00000000000000--- 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 jekyll-3.1.6/site/_posts/2014-11-12-jekyll-2-5-2-released.markdown000066400000000000000000000010061271741406300235730ustar00rootroot00000000000000--- 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! jekyll-3.1.6/site/_posts/2014-12-17-alfredxing-welcome-to-jekyll-core.md000066400000000000000000000016171271741406300252650ustar00rootroot00000000000000--- 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 jekyll-3.1.6/site/_posts/2014-12-22-jekyll-2-5-3-released.markdown000066400000000000000000000011731271741406300236030ustar00rootroot00000000000000--- 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! jekyll-3.1.6/site/_posts/2015-01-20-jekyll-meet-and-greet.markdown000066400000000000000000000014121271741406300241450ustar00rootroot00000000000000--- 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! jekyll-3.1.6/site/_posts/2015-01-24-jekyll-3-0-0-beta1-released.markdown000066400000000000000000000023521271741406300245670ustar00rootroot00000000000000--- 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! jekyll-3.1.6/site/_posts/2015-02-26-introducing-jekyll-talk.markdown000066400000000000000000000013221271741406300246340ustar00rootroot00000000000000--- 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!jekyll-3.1.6/site/_posts/2015-10-26-jekyll-3-0-released.markdown000066400000000000000000000066421271741406300234500ustar00rootroot00000000000000--- 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](/docs/conduct/) 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 Smith, David Wales, David Williamson, DigitalSparky, Dimitri König, Dominik, Eduardo Boucas, Eduardo Bouças, Eduardo Bouças, Erlend Sogge Heggen, Eugene Pirogov, Ezmyrelda Andrade, Fabian Rodriguez, Fabian Tamp, Fabio Niephaus, Falko Richter, Florian Weingarten, Fonso, Garen Torikian, Guillaume LARIVIERE, Günter Kits, I´m a robot, Jason Ly, Jedd Ahyoung, Jensen Kuras, Jesse Pinho, Jesse W, Jim Meyer, Joel Glovier, Johan Bové, Joop Aué, Jordan Thornquest, Jordon Bedwell, Joseph Anderson, Julien Bourdeau, Justin Weiss, Kamil Dziemianowicz, Kevin Locke, Kevin Ushey, Leonard, Lukas, Mads Ohm Larsen, Malo Skrylevo, Marcus Stollsteimer, Mark Phelps, Mark Tareshawty, Martijn den Hoedt, Martin Jorn Rogalla, Martin Rogalla, Matt Rogers, Matt Sheehan, Matthias Nuessler, Max, Max Beizer, Max White, Merlos, Michael Giuffrida, Michael Tu, Mike Bland, Mike Callan, MonsieurV, Nate Berkopec, Neil Faccly, Nic West, Nicholas Burlett, Nicolas Hoizey, Parker Moore, Pascal Borreli, Pat Hawks, Paul Rayner, Pedro Euko, Peter Robins, Philipp Rudloff, Philippe Loctaux, Rafael Picanço, Renaud Martinet, Robert Papp, Ryan Burnette, Ryan Tomayko, Seb, Seth Warburton, Shannon, Stephen Crosby, Stuart Kent, Suriyaa Kudo, Sylvester Keil, Tanguy Krotoff, Toddy69, Tom Johnson, Tony Eichelberger, Tunghsiao Liu, Veres Lajos, Vitaly Repin, Will Norris, William Entriken, XhmikosR, chrisfinazzo, eksperimental, hartmel, jaybe@jekyll, kaatt, nightsense, nitoyon, robschia, schneems, sonnym, takuti, and tasken. Happy Jekylling! jekyll-3.1.6/site/_posts/2015-11-17-jekyll-3-0-1-released.markdown000066400000000000000000000016561271741406300236070ustar00rootroot00000000000000--- 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. jekyll-3.1.6/site/_posts/2016-01-20-jekyll-3-0-2-released.markdown000066400000000000000000000011311271741406300235660ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 3.0.2 Released' date: 2016-01-20 14:08:18 -0800 author: parkr version: 3.0.2 categories: [release] --- A crucial bug was found in v3.0.1 which caused invalid post dates to go unnoticed in the build chain until the error that popped up was unhelpful. v3.0.2 [throws errors as you'd expect](https://github.com/jekyll/jekyll/issues/4375) when there is a post like `_posts/2016-22-01-future.md` or a post has an invalid date like `date: "tuesday"` in their front matter. This should make the experience of working with Jekyll just a little better. Happy Jekylling! jekyll-3.1.6/site/_posts/2016-01-24-jekyll-3-1-0-released.markdown000066400000000000000000000040321271741406300235740ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 3.1.0 Released' date: 2016-01-24 13:16:12 -0800 author: parkr version: 3.1.0 categories: [release] --- Happy weekend! To make your weekend all the better, we have just released v3.1.0 of Jekyll. There are _lots_ of great performance improvements, including a huge one which is to use Liquid drops instead of hashes. Much of the slowness in Jekyll is due to Jekyll making lots of objects it doesn't need to make. By making these objects only as they're needed, we can speed up Jekyll considerably! Some other highlights: * Fix: `permalink`s with non-HTML extensions will not be honored * Fix: `jekyll clean` now accepts build flags like `--source`. * Enhancement: `include` tags can now accept multiple liquid variables * Feature: adds new `sample` liquid tag which gets random element from an array * Fix: Jekyll will read in files with YAML front matter that has extraneous spaces after the first line * Enhancement: extract the `title` attribute from the filename for collection items without a date * Fix: gracefully handle empty configuration files ... and [a whole bunch more](/docs/history/#v3-1-0)! Please [file a bug]({{ site.repository }}/issues/new?title=Jekyll+3.1.0+Issue:) if you encounter any issues! As always, [Jekyll Talk](https://talk.jekyllrb.com) is the best place to get help if you're encountering a problem. Special thanks to all our amazing contributors who helped make v3.1.0 a possibility: Alex J Best, Alexander Köplinger, Alfred Xing, Alistair Calder, Atul Bhosale, Ben Orenstein, Chi Trung Nguyen, Conor O'Callaghan, Craig P. Motlin, Dan K, David Burela, David Litvak Bruno, Decider UI, Ducksan Cho, Florian Thomas, James Wen, Jordon Bedwell, Joseph Wynn, Kakoma, Liam Bowers, Mike Neumegen, Nick Quaranto, Nielsen Ramon, Olivér Falvai, Pat Hawks, Paul Robert Lloyd, Pedro Euko, Peter Suschlik, Sam Volin, Samuel Wright, Sasha Friedenberg, Tim Cuthbertson, Vincent Wochnik, William Entriken, Zshawn Syed, chrisfinazzo, ducksan cho, leethomas, midnightSuyama, musoke, and rebornix Happy Jekylling! jekyll-3.1.6/site/_posts/2016-01-28-jekyll-3-1-1-released.markdown000066400000000000000000000024521271741406300236050ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 3.1.1 Released' date: 2016-01-28 17:21:50 -0800 author: parkr version: 3.1.1 categories: [release] --- This release squashes a few bugs :bug: :bug: :bug: noticed by a few wonderful Jekyll users: * If your `permalink` ended with a `/`, your URL didn't have any extension, even if you wanted one * We now strip the BOM by default per Ruby's `IO.open`. * `page.dir` will not always end in a slash. We also updated our [Code of Conduct](/docs/conduct/) to the latest version of the Contributor Covenant. The update includes language to ensure that the reporter of the incident remains confidential to non-maintainers and that all complaints will result in an appropriate response. I care deeply about Jekyll's community and will do everything in my power to ensure it is a welcoming community. Feel free to reach out to me directly if you feel there is a way we can improve the community for everyone! If you're interested in more details, [there is a diff for that](https://github.com/ContributorCovenant/contributor_covenant/blob/v1_4/diffs/1_3_vs_1_4.patch). See links to the PR's on [the history page](/docs/history/#v3-1-1). Thanks to Jordon Bedwell, chrisfinazzo, Kroum Tzanev, David Celis, and Alfred Xing for their commits on this latest release! :sparkles: Happy Jekylling! jekyll-3.1.6/site/_posts/2016-02-08-jekyll-3-0-3-released.markdown000066400000000000000000000020531271741406300236020ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 3.0.3 Released' date: 2016-02-08 10:39:08 -0800 author: parkr version: 3.0.3 categories: [release] --- [GitHub Pages upgraded to Jekyll 3.0.2][1] last week. With a testbed of over a million sites, this really put Jekyll 3 through the wringer. This release addresses a handful of bugs that were surfaced as a result. The fixes: * Fix problem where outputting to a folder would have two extensions * Handle tildes (`~`) in filenames properly * Fix issue when comparing documents without dates * Include line numbers in liquid error output Read more on the [changelog](/docs/history/#v3-0-3) with links to the related patches. Please keep [submitting bugs][2] as you find them! Please do take a look [in our various help resources](/help/) before filing a bug and use [our forum][3] for asking questions and getting help on a specific problem you're having. Happy Jekylling! [1]: https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0 [2]: {{ site.repository }}/issues [3]: https://talk.jekyllrb.com/ jekyll-3.1.6/site/_posts/2016-02-19-jekyll-3-1-2-released.markdown000066400000000000000000000023631271741406300236100ustar00rootroot00000000000000--- layout: news_item title: 'Jekyll 3.1.2 Released!' date: 2016-02-19 15:24:00 -0800 author: parkr version: 3.1.2 categories: [release] --- Happy Friday from sunny California! Today, we're excited to announce the release of Jekyll v3.1.2, which comes with some crucial bug fixes: * If a syntax error is encountered by Liquid, it will now print the line number. * A nasty war between symbols and strings in our configuration hash caused kramdown syntax highlighting to break. That has been resolved; you stand victorious! * A tilde at the beginning of a filename will no longer crash Jekyll. * The `titleize` filter mistakenly dropped words that were already capitalized. Fixed! * Permalinks which end in a slash will now always output as a folder with an `index.html` inside. Nitty-gritty details, like always, are available in the [history](/docs/history/). Thanks to those who contributed to this release: Alfred Xing, atomicules, bojanland, Brenton Horne, Carlos Garcés, Cash Costello, Chris, chrisfinazzo, Daniel Schildt, Dean Attali, Florian Thomas, Jordon Bedwell, Juuso Mikkonen, Katya Demidova, lonnen, Manabu Sakai, Michael Lee, Michael Lyons, Mitesh Shah, Nicolas Hoizey, Parker Moore, Pat Hawks, Prayag Verma, Robert Martin, Suriyaa Kudo, and toshi. jekyll-3.1.6/site/_sass/000077500000000000000000000000001271741406300150745ustar00rootroot00000000000000jekyll-3.1.6/site/_sass/_font-awesome.scss000066400000000000000000000017141271741406300205370ustar00rootroot00000000000000/*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @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"; } jekyll-3.1.6/site/_sass/_gridism.scss000066400000000000000000000063751271741406300176010ustar00rootroot00000000000000/* * Gridism * A simple, responsive, and handy CSS grid by @cobyism * https://github.com/cobyism/gridism */ /* Preserve some sanity */ .grid, .unit { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } /* Set up some rules to govern the grid */ .grid { display: block; clear: both; } .grid .unit { float: left; width: 100%; padding: 10px; } /* This ensures the outer gutters are equal to the (doubled) inner gutters. */ .grid .unit:first-child { padding-left: 20px; } .grid .unit:last-child { padding-right: 20px; } /* Nested grids already have padding though, so let’s nuke it */ .unit .unit:first-child { padding-left: 0; } .unit .unit:last-child { padding-right: 0; } .unit .grid:first-child > .unit { padding-top: 0; } .unit .grid:last-child > .unit { padding-bottom: 0; } /* Let people nuke the gutters/padding completely in a couple of ways */ .no-gutters .unit, .unit.no-gutters { padding: 0 !important; } /* Wrapping at a maximum width is optional */ .wrap .grid, .grid.wrap { max-width: 978px; margin: 0 auto; } /* Width classes also have shorthand versions numbered as fractions * For example: for a grid unit 1/3 (one third) of the parent width, * simply apply class="w-1-3" to the element. */ .grid .whole, .grid .w-1-1 { width: 100%; } .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 .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%; } .grid .four-fifths, .grid .w-4-5 { width: 80%; } .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; } .align-right { text-align: right; } .pull-left { float: left; } .pull-right { float: right; } /* 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 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; } .unit .grid .unit { padding-left: 0px; padding-right: 0px; } /* Sometimes, you just want to be different on small screens */ .center-on-mobiles { text-align: center !important; } .hide-on-mobiles { display: none !important; } } /* Expand the wrap a bit further on larger screens */ @media screen and (min-width: 1180px) { .wider .grid, .grid.wider { max-width: 1180px; margin: 0 auto; } } jekyll-3.1.6/site/_sass/_mixins.scss000066400000000000000000000020541271741406300174400ustar00rootroot00000000000000@mixin box-shadow($shadow...) { -webkit-box-shadow: $shadow; -moz-box-shadow: $shadow; box-shadow: $shadow; } @mixin border-radius($radius...) { -webkit-border-radius: $radius; -moz-border-radius: $radius; border-radius: $radius; } @mixin border-top-left-radius($radius...) { -webkit-border-top-left-radius: $radius; -moz-border-radius-topleft: $radius; border-top-left-radius: $radius; } @mixin border-top-right-radius($radius...) { -webkit-border-top-right-radius: $radius; -moz-border-radius-topright: $radius; border-top-right-radius: $radius; } @mixin transition($transition...) { -webkit-transition: $transition; -moz-transition: $transition; -o-transition: $transition; transition: $transition; } @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; } jekyll-3.1.6/site/_sass/_pygments.scss000066400000000000000000000071241271741406300200020ustar00rootroot00000000000000.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; } }jekyll-3.1.6/site/_sass/_style.scss000066400000000000000000000621341271741406300172760ustar00rootroot00000000000000/* 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; } @media (max-width: 768px) { .main-nav ul { text-align: right; } } @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); } } @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; } } @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; } } @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+CiAgICA8c3RvcCBvZmZzZXQ9IjclIiBzdG9wLWNvbG9yPSIjY2ZjZmNmIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2FhYWFhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=); 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; } } @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; } @media (max-width: 480px) { article ul { padding-left: 20px; } } @media (max-width: 568px) { article { margin: 0; } } @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+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); 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); } @media (max-width: 568px) { .post-category { padding-left: 30px; } } @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; } @media (min-width: 768px) { pre, code { font-size: 16px; } } .highlight, p > pre, p > code, p > nobr > code, li > code, li> pre, h5 > code, .note > code { background-color: #2b2b2b; color: #fff; max-width: 100%; overflow-x: auto; vertical-align: middle; @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+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxZTFlMWUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); 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+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=); 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+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1YzRlMzUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); 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 ); } @media (max-width: 568px) { .note { margin-right: -30px; } } @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+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDYxN2YiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); 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+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); 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+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNhMjc1MjgiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); 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 */ @media (max-width: 768px) { .mobile-side-scroller { overflow-x: scroll; margin: 0 -40px; padding: 0 10px; } } .show-on-mobiles { display: none; } @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; } jekyll-3.1.6/site/css/000077500000000000000000000000001271741406300145545ustar00rootroot00000000000000jekyll-3.1.6/site/css/screen.scss000066400000000000000000000002001271741406300167200ustar00rootroot00000000000000--- --- @import "mixins"; @import "normalize"; @import "gridism"; @import "pygments"; @import "font-awesome"; @import "style"; jekyll-3.1.6/site/favicon.ico000066400000000000000000000124661271741406300161160ustar00rootroot00000000000000  & h( @ 2qd挹~zCL/0"#TN ܛt&&!##Wۛq~.3!"#idS>K "#*#!Pc%$!"1/~ݎ}4FontAwesomeRegular$Version 4.4.0 2015&FontAwesome RegularBSGP  !YD MFx>ޝƏ)Y ڤhDpjóK”*0~71^{+rAPu;.3ռKğ?]:yf`o&d:ٌeDgKR%qH :фsdW *0#QTݘ:b#@Ym̉{Dt!Zd΅S Qv'xUL8996, BerR+5ˊXWNJ_;J %$-npr tǹpLVĪ{@L"7 B|ڰ7Jdzc*e Kd=x|4!d؋(A`_os[0H^Lpa)1P 8SAs6LDɢoÜKŪ$SDRIUW, u@:5WʬNFGgi<YFP`1%RIb >sµg1{LB#}aD0`C*Տؼ'/a9H}d#"4z@c15n@r67& ZX06Ma]b*ß6.Ql| ]x<ED0f'Bή_ 'h A3w7@o|/J[seދ/"RBmBk>&l@r,4lg踱:eQǿ Z<#(t蒨8 PaL,nr'np8 `:*C(H2VfS9jK;ה'"zJzY=5@涷 adPAiC'%Sd}!ơr3 w! 4qZ,.m#UޤL# RC$rj72t} PP0f \KT,n\ĕ,D:1 7ZA5EYL\WXhY8 `LcNBbMfŚaP֗rIo&DuE:u wzt?3E Yzʞeʙ E"戧IHse-E k~bdB"=8 /PN,,cp]!E˛A_]YkHFTme俿56;6~Jz/cY P=Pk,t֮Phxz$N0:k[NZ8҅s ~7d^+q[цEopHG| ?>=>MJzW=C~4 ϑ2"XAQTWv)pHwã0D&Dܥz݉j{YRNYd\̽;eYM>ܰ(d:hU]T+Ց+Gi US 9pmáp&, TH{b`H'I,mN\+0cjDߖךt8*ݲ` gi3:^ƶS׸?t^.Iʇ6J)A’MwD@CciDړEԯW,;\>YmJmP\Gp %^z'&ggĊ1B^"i_] _+.s>:Ȯԅ)TFD<wVQ⧌LhKc( ht]`#9PP"5Eq+3|{}":L+ W'~ p8i!gFNYX'2F7 3'qy|JV`[i 6o$whOk0gz[6jG8Iۀ}YL)]#z)|\{񖃭>ogNВf/`zC^!keRFBDtPbUZZf2"bflRyIyGY@ 1f1/TM Wn`~@ 'Ѿ:I-+rE`a |󗍌h 3%'"p9mi<[ٝI@z u}!Dގj0"kRؔ <像v7|?9D 7G`aacB5PAza\J;k0fKc58X@/Nؗ@8y`>wo(j^0}G``JU k[@nXg :؉pH_ v"-* Ry%κ1r0H&ʤC2+E|q/Mc/ njA&rMɡ?]5[9qNe}ᙐcp qF)u.u`n)d`Z04 ;[A ֫ WF2!,}jQDt9fA2 ݬާ[5+(!DN/ 23`;1cB\zAqMVwWmmČ)<ݳ.9wHlv*%i;PSBQ^DׂLO_d_P"X{#q w۸D F^Pf>)2˜]8 ;j\ͻh>+QSbJ3AnI`i{9Bc`8mam?)ԁ)QͽiC9e}6!BƿUzelvZ*t>jBlc|8Ca 369NM!jw5Zķoh5!뚲SrَG ߺ:.DfFFpEKҍ%k͉?յ;=2Ʌ܅( P B1Py8 n (*D bڣDHK(jczl |K@2khidj0I1:\Ayo8DHҕ\#(jwiR2eCR#t$H\܃ݹ [H9Q1$-Ps\wO%3(vׅh\xskؓnhҚ׵Aq:Y+ѡ߈@rc F#<ή0z߅(}CA,s5ӌសkUOClml>#S~p=Mxr7y'Cuޏn 9KA$zhQ"mτ>B8%0{lmp{(3pTfT'hbC:Iɉ2o3.glORʫ[}X0t7ߍdjs1:E}nv5p1'/ V['5Uv@}$bhPtjWV&i p/J>s*+.} wdG.f ML.w&E06l~A;9}Tgk뽡x:jm{z``-BU^9PZ`iH4Dђ #C`# MR楡UwgP3Y>C.d+!pU?bZ(=GbBpN--*s, 2(1I lp] E#|c\dJ4n\rіO&nBc{h7 |M=hcYr#y7fа`sS0}1ćHLZ(8d$oo D\b7Qs!^$b\ ƓYB~;XX= 'm G7 f]mC48.zm"D-HKǦO{,4ڦ{HٮF*"0px4'JUxIo!*LTee1.L.֓S`MO+am|VYR'_Ie*8@v۶R8JcK[-"}e*:h"ĬANz_h[Sax*f *D4#]U yA.pdsêђZ*Gڀ%C%W2UU?~N5r )گ ڀⶦkkvjmB^6psc8 BW'JM\h 2dU~!;D+$"&kuHr;1 ?L84P#3)j07-+LKA[z'."fG.܏ d lKO$ޚ1PWlzT7,xr m.8 ,8 on[a\]םxi,RF~035/\ֆxL]2Wpvclxfd!Y3QSCWdPEEo]p7BvBb[vCyX8\ӧ:u"^?t:vo"5f4! (,8dZzrM׌rXï(v?!@l SƆivDNɸB67n*  ˼S]@3pCMJ@<Ks'FA2.$'ǎOLbDó;@eGqw2fc*,fFהCmvƝز+P:VBdKwB?H"C cclq0'ʢF_2d̰z<E u R=o Bc=hqXeE` o6뚀B <aNKplCdR,YlH+O,B-N&jBlLN670iL9D1,3^)܇.CV?1@5d>$SMB|,ݷ F۶4K}y%T=zjc!9fԶľa9:!A8^}Nx0ʕ07qUN:`t%N{#m"3 0 >ͭ9lL(ٽ'H?FOEu6Ȣn/eh- KۅE 1\a6D%Зu#r(a(C)(["zZb7$g 7Ggv 5A4 Rl OW@}an.%9NX\9-y5`%zQ E1ո>,BZdTܸ:cF0+>L)eF򑮮{hR@!j)h1(!D_XX eI<7xrN'o0R[NЗسM 8CYyu]ŚhzN x42x^O- (b@"a@ԴG)cH$'HJC&,~+Rb[Ztp Q6B2C|SBD4 ~D%V\3NR/JrB@_k9*Y oͯsŧ.`,v[ W @šQ^ -BX:y<6&նS;dbt\2KTpA Z+1@P'Bi|j@uu_MGۻhy!NXhF@_09Rq=7Vu!XpA2,JkŬX B^ǶXTRTPb<C ,:[RSMXL / tu|5 8V%?D sȏG͠ap;g 8 O5l Į'_)/ &^/D"*(9C~s5C俟"2Ac]ac­2{ "C$4rix 噇l$#QXzH5C+X;d9ҏnL1:S  g,t%,[ƢʛT3v>:oʻlc'}{_]IaFV8V_WqUrF-{ ^ I0Z7zIh|T"{"׊4y.1Mx)=]PZEߏبQ9-!'JU[8V)y4WaʈW,D1 MѺIyZ'[I)>N,8.<յ'0DÚ}Sp~WHYVVFO(Hvo77`Sv dSqRZYkyKS+:&+8&EgYx ;!B"0/SE/sA)MXSIpD;L]C4HՇeVv]9AFrv0x< rؕ^DEt jBC[c;BR~3|5,d wҢr&=@܆2f% "mbk9 "h׊ Z{4+>'kOz0 Ħl P\V)6@i>XOCf e zCTwgY^0@ y=¦ =(J0x ǩA lD8qOag.`qa`zoZ#̀oZf%lww B/Srb~"ugh]l)ga[+&vc~a"|DT8Wg[>b}=eZr Y=ƪ<9h";wOMRi UMM,y([yt RDl!?7!í_ZDA\o~dZ9xeȦ@U ҕ`djJ] Cw- U"1R -/_>Qgɲhh$MNe} ㅵiSu /|ONmWyG4*e‚ZQOD G>iWA(~YTZ[ G45]Ҽ|#ȟ> 5EYA) }QO08vJ%!/d#FHa|*c.]+@8 .,*<O*jjj#,40IWp+˪Ia+E>nryz sn,zfE^D׉&w>X5U)͡3A)5( zȅC,,n@>9[uE" * 9 q@LTnUk8 I$™+/KxVܡK9k9+SXDς^ 3e2),<lJWt|43섀TӠC ϡ\m r}3i)d6[-GuASY\d[78)nfݝiRс _~-bt84ܗWzpUHIeRR Wޣ^d~}7/%ďKrgéMe_Cq~asli\7$KD[5G)p|a9_4 DDIS`2+^CA704(!"Ŝ6"qwHm!5P>noұi,[!F`tl]KM {5ȳckZaN:{G. t$vG9x(f>,6r(ȭjnr¿\5^yaG J 6ꜞdԼxEXbPx U"eZoƙd0t -df6u͢^GX1LHv&h[]0%bESAL3):f]ġխt:rK0;?:չ!tV1YJ%0RecZn@7hNQqxf0Nt2t!yMQjE\igdsn]?5 Jϖ T$[O ;W3;hu 57np+Pq%(pP79BD0hR>֞g͍LH6Ns|HdhѤ6Ӊ5],]6לJT.![a "3ƼCgMWq`i0W s^kҽC< /8)H| |'ŒSdlKk42{fYۊ%hv2T5ӎճ$)8\\zG;-I^d4#](ײNCh f4,M=@a O,ȠMhN&Yh}<2c7Fq_ہsǠv|pZܦ`=P2ZFޛq#Ո,i摶PruY3Lbo qj/m V@DVʨ"tL1 AMه,k=ّt^^dYQ`HݢpW#u""@P@i()l]<3y倿$)NzO@q=|/H@m?p\0PѸ"a4XZon?n?? eʐF?Q RƷ%IEj(FhOpJ,Xn/밙*WBL5J97Z}zvܬ<HC% #3$IH4YЅ"^& 3i$mV|Crc֑)a6˩0&en BLa=DrU?GK K[ʚ ?rD)ŎpYtRIԓ~uRM0(~^7A,dOJaM l}H+P[a|ȬL3~H @e ܛ_T^RO:s(Ohlջp/siK0Ul?AcS 03~D^Ӧ ^&ǰμBxˎynמc(#ih)q4g'ph­xY;#ߊ@K.of#Mx{o ?%eR1YEdqRzPtv?kŎzhD@xP/0"Ł|n9%)#"RC~2#fhZN̬T!];BsPB-D x+pr|2=~siq*G;HO^=B*KFG'XQUmNַLUK%zcЭ:oA(:|iev_Fr8Q'+VCUE)I =t¼S4XR̼CU*ENϮQӮcW/RfvqRF̎eOWJqT* 5cXXJF-Q*+<?q jVG0|i!?݌vk3}&R;BAiEP\-g|ӈL28i@5A8Yܾt .Eiug(h> " t3bpV&Bx6hE|;O9&qp-׃B,*O4%R\:bu+c&[y?)qm!A !#Ȉ " 6Н i!`YbΧ XoϙF/W9w|*e|UL酁yRI^3}Vvu쟳]DXh0-πԈ%8 _g w{/"NM7- >N@S!ᜪm1GicDAZ2d3Ĥ<|$9xH YEi]gDl :%v/%/EHN>Q/̪`*[(7?Y6 #S!N fk_gm_v bw *3 ;cb.t*-%f' 8d#"kɻ4JVZve:2pː{t`\Os}W8t:4;Caw/Jqi{@5lC߇b`}'F~1Rkcr{C薣@Q0; L!՜%R < i<l :12,D2n'2"v3yC0 Y`Z7<_}~E&neh ej#XV5<C|++ݘadD#0=PG:tm(J`_5X 7)s*J(ya+!\@ >oQ(L i4!D\$?b ! 掀a#i W׌q4lG;Oe3 Ad<=#hE{.-4yw$sm^=TD 0hgJN:;4J0/(YiKpG1{ ȗ r 3.vXк/ '7igkLsKho.2# Q ]~S,4n㻚ˬe *%Tm %FRd`F:̀CS3?,aC`S볯J>:΢ 11o6"K.Q2lr\(`\5}TSf2 Zz ͩVNfvi5KNSi|o,S c,h0@y ׬p4<>x 2{:A{fȈ..(9+ i_V0]p fdqbEjYh6eKiȂ/f\o~r›`Ӈv7U@ĘBc!f$ۺ[7Jht 4[fo1islNb?ԔG8!8K?Dm*`i@SOSpnt9\ Cy ?"-"He7= @)J!,[2v'֔RH;ͧdh.cĀaxFY9eBi eb9-lQ9/+,lQ{22ی3HbGZoE|Z?@+hvd$S¤BY+0Hu>1Ҋ^<{do@؜pf_Jo??da=S[d|L7cd{3Fyw˪/n_HgiQ*s{ x%,Owyg^F9,F{>]2< ˃5\Y 1 6B-5/1eU(u Ŗy`f ٧=9-N_nx<&=eJa#MfB{gJ3;kgW{;`#X U|ŧbB3&.s{U_lHN k):LΆإ)шTA8B uLra?Q2ꪚ`ULb0DBZu'{jܨr- =˃eVnpB|Y@N UܨTkF[Q Nx xÀGi@dpA&nr]2%^֬x/E"sZ\]H[gVl#hY+F$Rk'RFdXVlڽ.075;dĸIn0Ӛs4R)i }1/\-ظƊ4Z>H- ߑ[N` S:˜Y2@Hqp4Ȁ;\4V܀vE3嶖}nyEq`B%a?~(q䢨GH1k ^R%f-euK8[lߺMZ?\['ZsQe/Ra~@:!X_14͔un%P5 bu9C!zΦrt,8 kܭM,Ŧ%ժ4Ft4\+#!/xmd*z݈EuÎwsq؀rj"YNOy$h|BhQp{"(yR +!On=:9?H_JyB}k*[P74h)TerW$ 'smO<J8 $=SR*gк@9P)x<3_X/kr_}>cޗ˜1v3NuO PIDx ݭtE"IS GuT! ezvf K%Rv+ZZst:jac! u{\9g[0IZ[\T+ƕ SRs\0s]]UQxL<IX]E\b ;+qBH)OI1J`vF*=ws{ 1NײaCA8 ^ba+0 D/+\;=bcE7fŴQlohHSO"^_)X#=ԂaAP c=$S4<τmomy:޿i?J @&!(V z"IEgx$4ETBXP ;}b4,#Je`RDXA{3lΤ /|pf蓍>/_@豇 "=pAE@\dqJ&B"ߕdOM\h"гsy.5An-(3Xy!PGn>; GxJBp=dOmOLRE*ʪ1Vۑ _VҊX3!Pל&YF%_SD"(楈:f_C[(H>).$@ŋ,yLF}ӪfۢA8Ȧ] ]_]::K㋂a쮨:!5b-91qqZMJD4ψ5SIz %\A/aEE`>;Y8't%bk=f\o<|!dT{C\+20)O9 3ݗPb/a 9ͯqyEkNl(qJVTe@@~P j9!;/NRfTjcʁ!3W&# `R.J3iRMHMAJd?X8-A VzcB)J7c C $:rZЊ8@&OI߂pXB g+a4pJ *dR8>9^i09^ېIGceMl B<'оs> O1[6]woSqi/O/j-=v[,УeQ&, 52M5 J O,jk.Rə6ˬVq^!V&kW@qaP <^b ?;<7Ԧ =ʌrN)Y.,-a8Q%,\ l H aZFEedB}l]@i&(CʄLJ;{e8;( *@*q wK8+`CO}tH\4&2ξ$z.0@NGo bXu#lc2$|ӕ'$L{PmL$:KG)Z`r#- 6%>Q BBDMlQBw[eJћK S9O4f ų  KAvQz UHJw\ w\ll~ݒHd)JJ(=4 srN,% Ā( b%Y:=oLpGF ^^׫{}%O%5`Q{ (ʮ=רKz7I7kCA!~BMNQxuKŇAlp+w~W,NʖEd-LUD6ϋ,E+OO|(e ۓj4ixehiU9G[O2y]˸ OSŀ6P7j?Z19_̖;S64&P e$u6Nm ƈٞ_I^1V L#S$T.WN 7앯po,p rXT[1{"AЖE$tY竣UL3 1Q$G>@b4{@6a8~GdVfu4Oa,.bn/# >i1舞(̶!^"G0[ YW)t" ZI\E}Aks0ѤR(qϓPldyU!%P f?a6%Fn7JHX7_xcScM~Pr1Qju}fuނ~® 'TeqI^dP95;`x %:E4ؤ\D>^ SjIq|eT.2D9!LoHD"gd\h";Y;\Bn>` h .s=epN5ђwӄd7r P5#axMɀ3coLDT g|pW[l!5zAP _N= b8mߜ!d)B˔F9•Lpẗd 0+A$Erӄ=1s=tLǴFՒe7AgO8rdM,G`j|N.h͐av2E͋IåàCDP|b B2y63Ѓ$-ã1~R3*C xkk=TO1c&z!ŀIwotb$nwo @fc nirfJ\ƐXK%v wN^p?8,kP_xyIt; i;hI7oH7r(_-?oNfZD>O[_tDш<(5оBf߇9Hb'fmhjp{pc !|Qy&"Č{9v+02$hb8Tb%X' S\NGm(0*Y[xd[4MYvj.EA=l.S4xExn(b4X̀'Db D.$ 6H"1-5 PW";}Yr">U' oGtard2ב3'ax .bش*k}s_zIgJspc?SB&DR#9yQBwyFc.(8fH0M-H6DwIl.D=<HX5_K&BAr];13'%p(uĿƸu?nv.Jd`#+'.`i\lEMK62ݤpU OM3aZ *+>-iIM{d=hNlt}0 3aK1z%bfB&RgE *+?(:D%uڈ4MOx04 [,1} pAޞ Ø)47j77N`eKz 1䥶aA=X B+JCjAbp |/R=֢2;_T 5JyBԁ94ҭsp3鷁#&fs\Oj+Vw!ejK@)9"0&q\K-3@FyO:街`]HC0[bL:( 5-ܘBVo2^&;XCKZ2_B$ a'Kr!V埴F8 MXE6pl0hQF 2_`91pm ԂUW7 (;iqV2`_7)ǃ.(T'ږNi P(4fo@?"l;y(uItV/ohם0{27[ Q#vnNa'(#~@m޹\(ׁ?3{4"[@L)bYH ;XյՃUG? I㏽)a0+[ZS4ө%"iUD'\sx }n1a d&pa/G%@?pNFq[uZ Q';|nў6&_3a72&c5lZ5'!i3,KIBɒ40#ƈ@X(U4;kCCGƪJcCrk ( 킼%ʦBGp λ}N!"uRD(@JH*㾻 \֛v$ȬK61W ]00yO(r"Snz7 Pf%EK=yG]6L>h(H$_+h tfK q5Lvhz pi8UI꣤\#+h X':ÌJ3E4u<^nyy7ݑg˱3o~+$[Xh|ӑg3h!N]m.*!z3Rk04ld66q?k?~d`pIɜYܦu1 NU!Rr=BPI>O7?b4u&i5 }{n yx <A1 PKaEj$6h 1.Lli#Yu2Q>$Q")zEly@6 QV řbBA*Zv[,3:{bȥ4Hؓ9b_,U|"&d߂[1a~䔂atNhmDIQd?_^c[-؂_/X|S8VR1[8D^XJڦ .: Һ*80zs%InmM1~{7¬(Q*lb$BY4`@oaG!Lga;k ~9W7 1*FNYi7,вBDeOP1*ҵx!</yAg+^T$@fN8ߓ⅀0J ]GY偒Ttz qew4 +r+=o(T o..&Uz-@LՋUJ4UJR$t캵n8>LɄd%yľXL.簐}X[ڞک+\wՍKs?Y"c3vGxL/8:M#q?A=.|M 9n{,S`N*o-ⲽ|6Zrr"ɉc7Hopb7IY H as'va,@N̤e]=TD9rq'zz2 fOۯeS ?)l3[tg#5DƇ~zQ1,xȂca:!bѱ,(z/ Bj ЧYSC:# e>͗(ޕ\n)!,"[ T),~I'n[L#b0MO3G"//β\¿0ln& f,Bnh=4p+5R)ھN!x*379œ{THHº UzIPi3ZMwRSbu͹TDC*з =%BQ}[`QfG9cj]eVMv RG^d}`3$Q{rE<+$n-rΐ_z+NC ~1:PSogf84H vBaؘz\  doX8jz[IЦy_mZ(y_Ա|vFaJaY84KԻ {}"dA@ J P^_$]w& 礂|y;6p6ԝDrLJs_ sVGˠ5>;5~NUZ)`o%DYjP8 D4rI|&w@!o.nrE^^b'R`Em\O%\$`3K"?.94hlfbZؘkըb+I|ZEhBP0PR,5#w;orˆ;8Θ,6؉@x(P'$ Fsߎ, Jp=7q|,IJ/<{;rZ(5Ƅ;B]u5p1Hf,E,/fI3)f_fVNXZ݋(C&-4:7¥I#8P*HsI\y4864(H Ob (dUm/ Y&98 עm)Ilin_U4Sj,>[ƪ /%K䢎sH1~rI۔($EHa +es9F0/7'iJ ~dĖP>3)h"IF]bX NO!9 ХP飏 ` NE%qG1˝:/,Xr#Z+wʺEǻNRX͊^e5A& f0 nlKQ[Wq]3ӑ435MNQsN/[Ye0Xb+6I4F$70=˦N CtGؼ+vޡQPƈcaU13lx?⎗te ZF[=Os'hlCrSVLۜexdxxs?iE7G uB.d:؋E/m  -E8<;f뎈?WIHjڪ?L .g9bt4`é1ɑ@! I,Fُx'0;b`A}hKe /*Cj+ȝPXq )-6~]ld2-OL>qN<3w{q r9q5 W!No(Bfj=j/ P+>8cqHSq&tI’|^vSF DNkLE_ R֍2#ݙ fg=k('B9Ĭ\C Va)>D^( [Ƹ8!gSpg׽"q S(R00 EؓXHgPTvit}vV38&bQ  #h4Dnw 埍IO^(.X8iQkANR245R.Jw ɜM5tz@^Z۪m[m[i_:*6K맡H|zBЬ,A1fS`$ <.Hii}nqGmhH`1p;ŜY~q ɠxVTd^ԶWy 0c7""S#zfРhC}dشnMw=DDKP)_ñAOJ .-oՄI`<A펝֑(XQ vݡ^a={]XR&%9Ä)ʼn4=ۛ4WE|`8tlowC*Y3 xp % m=;v(0:` fc Qq 0熤eH7 +OJLj`Ưj\i4zj$-U ?_7Ah1kC !{5ЋXZ[mI^:8Fwk8 G?huvPpH6bY^ 0VVH50έ+q2#T` ㄵ@πJLƃ4vnh>+dWu[KɘPz>Ra:rJ#+v`F|^+`z4TßaggL]rl&62]9@t&dYl&$'a3sZ~J#& JvYC^Ox!2QI>Ke&&IrWwtsp@C`7+=ܺnhm^ށ:m34%i;4zz32 K He5,1ÆGÌaxc(a.2Ѝw98D!SY,#<=V -C ՀT{4VrT|DSc:;YQKAX:UfT.$XT8\<#7[@|meBͨuV۴e3B[8ViXi#,5œAh謳Wj, 3Z  Q],«0lCVDڒ$Q7\a~8TYtߎԒi=5LS}=ADczv>ArJ!,%R~xM pQm5@d  f1|Ũ&쀕qi4x=R!¨2ow)8C"`#; "hgsP=hW[gӿ0=^뢬1,. ]vpq VMf߉BN`<`^'t.̴W Y7wd='#YÇf޶K CN,@kEԐR4H =)D`Z=,r: I5'T7kܞ(TLffW+lZ;-<b] yAdXZ ,"Q9ƌ:Iz XmiG2} +8ikƇ+_3hp4EhxNf\Wz\Aʩ(J}y€6'|p ׭XxWψT"4("0=.=5͹em 6 tjٍlӢU>H&,rϋ9G P߂M:e8˗Gj~y5-~PIN'b^:i|eBPU.{$ 6{\@*t  ,Lv֙;B;F @ztjE┉5K(r!fiĶI|H(,ҁV}q3n؆ِġ(SkPuN=a”qR`g )@T̃펖90atW85crtיev]y?0*uJF Y܎4ląZpv䥸C_' -0/5Y5RĊRaVB4KL~$@iK+>3w4u?._2MK@E9\G8^3# ڐ\ Hq NRW9+.-4$O;8si8voLyU lo Ó҉fs#4j1+klћ%"t̗b&oIRj}F(W_Sm& b}rx]ZBFEsuWi}BygC MuZIB&TbX09 ==.ɱ9T%.hȯ 3v ԢJRrM1gmS*-4@#\^O:(; _oῇXE`pk7i=D 7RhLQ> ֥nÇ@7l#o֌w a8Ł"8&aZ(/*) TzáC+PPWc@H:.SrВw*SګX: %[%Vz^H?E08OD݉j|oT H>~UX:PJc-xi2`1 ڗ-B7Bzc0J?;\'{ArѸ`U>E&~&~"4S9us2a?AYUbJp@}B=,Ns$/hwy/^WWUמDfPHYoZ9 MB[H1]5G"R4hC@/tKx2=e fd.\C{-ugWH6$32L*\f8aT% 7s`VYI$e_-Uj( Ҭ|RJ(#S{d&$?5H3X]k*E8)1 %)HN8ˌ'h?/(;B:abxܔuH`ear HL ${Ckײ1a(&m7@^;"&-OZ@Hh@:%*PAܥ$+ ѡya+e˝ UIL , UsoԆ.O\Yʲ3/# 8aOdM ;1RpquPʤB2S 48RDNUu#9˫D,Zu7ԖB퓨AT-VIHRa-zmgaO+ёV?LM X*/)`UU;wsyh~T,b}EB}  Cr/,ɻp,o^v@=]0{vo[4 ~0LMej0p*I"i0]o2I""" \؟`M@Phbi^֙r3 x(ŁfR>m`k=Pne*S<\.И_Uŗ*1kOjb6=C*@kQBcyDePBCBKfv^8h[Lx=Xǵ$"Zndi# 1da+{{Z<=;ohO=$AV㒝E4Ar͖m kn&5cve-8 M -(77\>c@/ސ]^.,^(W`:Aϭ֚&9WxP2ږ24P;j=*]#f^LE-0{"Mh+ob,&MI1it%ˏJ cXɊd0v$=9\s4Qs<)3ez^ ^OնopzJH[ٌfDjI8r%ZSq@{bRǴ'2M#$,ax_6+檘3)H AgԢ b< {02:?;RՌT0C"磐eUOd njɍ9Qa{nQqyoK4T3Sw數ʬ~cJW&`x|rX>v4` k,KWJ;L''FZX-恭W8w*$0&2(61YJ7œy| " k) T:ܽx0ng+ <`Ծrs٧RQE칑~+>|U-iL{Ū Ŋ+Z 3DՙQ^BW]Pr5.YUE'$k51Y0mq;G&9X[~Fb̏= ئa2 B/ H ;Wt+NwFg1u )ˬ:@ZBgf &[\Dgg) jަa .)H'pߤkNAw5&K^h11=O5lL±'l/$+(izzAhTL.ۂŋ@C8c ƛ^eC v"a s2bXF";b6/Ë,mT~][L=2R$@+Y@pW ymf~CX:~T 5 JPB,6wָ˯FHM9Axa%4|559||r-ppO 0Nfgz+1(= !Fvo3 OqFтc)#踥½PmW>;٩]Y SC"YG@TF~6^Fx^?ʎ1l 3l/Qņ֦B$>hTA@ }`3 Ӣ kx&\A^+>aM^u" @[ dC]81 O籰7! m-->\LFDDĈCշN bK7E@nlb'*ɕ R[T&*)c KF /`E#w ۯ޴@R<;,(~qaRMpE&9' ĄC;LUU0g7^XS {et)"o@"qfa /.#b>CxI sɓrsGT:a#h+ F!N@)ȝFnIwuc3qIixk{Єc{mcFK5/f:n` V<Ȗu8k[jBԴNPr+:1jQEe gF.6{&F(䰂ʶs״hAYFMM3 $ =f lN+h$^2ܾ\ +Zi-@Wj/kk-H=0gUni%k1`>HK\3*K|1N@67tN&[MEhd@:owIce?Zs ]9^MT`KxYX doXPu%һt`>Fîl/- 2*`:R>cE> gbl|bw4h0mT8]-)$d'%>o(1*^EaG֖YtFj`>\<:W ^'fb ,erʏ!\}5qGr͎XfțlMgM=ZT?_c J:=rH$*5t򳐷8'(<& 0= 3r^I.TύaR7KZbc?ڛA< oP ,(9Oe1Q,ZXLN1|p C/ 2sy(,DDN$cM`OuBp1/*{/:Wdג rVxW*3~S)ˆQ;;'5ZxDn 2pc Wf)y+\NXöNJ5zl^ X'IK]`Xe>ܱ?^;JKw/gZhOώvGbmIh'kDObHWض؅e.kp%'I BnN"n$_P_AuH+-@=?vu&{ޔ`?N)K"Hp| B"E3q)+Ґ;YvzD>'2ƈe>>:uY;Hmh`Sˍ`|C<jse&y5'bgV%."YVqVu9K Z]<#a} ck6Wjއ,,dN !M>muV* "U43OrG%x+`xJlہmhS0A$0+ G/mx*2+(mmn.4>ޢ8<Τ1sVd<5S7WIHP@g!RCx ق`Ywޘ ێKꮕbxB~ # Mr/ EK A8TL|ks\vl2A9w ]HtKk՛pw!Iq1;gbtQV*'瓮^[]_6-mעρȲj !oi.cMMoDD*|96(+?¥l%"zɑ#C(>xck i QV 6+-KfϽZ82;8PuPbM TaZ6}਑NXDUf?V[2c(*0J 㝙1)LvU<j )^Y "95)T!@DE *BCya<Co\P1Uls좾MYD &=62[dD7QInl,wkP"GHJaegf!M䣱fpu֫9Q,0dTSFni)1`͹w-% RXB.5̒=2[big!m3T?<<5lnω, lg,>΄P-V\)-G]yDY犬CZqA8 1.;5I=r㌉8AYh]/J{2F@.Z&r9dqyaHeQϑVר(ҩn(ˈ뎋<<"olqU+?$i ݷ͞K@(Jvm #~ ɡ a 77xWLV-bjT7/1bJ%ky/6fj"xW9UNV'!z3(U0aYb`TOt)(tWIi`,wh(@yoDȚʉ¡NGRSrpR ɣ3Vg6I M{@BH nܽț,O\JrJ嬙M2IGdXUӥEOQu>lUnJQhRa;b*lWHmVIJBjgNEqt-^͏}'آ䢦Z0@*B,^%s (ɑ<z 4T8[X/] D@rMm~驡_Px], 츻(dW-ycI Aދ3WC9g@0jҁ @mA;\+~3s`  QA@2IQg kK ,dC@u~ӪL2Uuqg $BN#DE{C&5k㯵;R_֒[1uĪS/ e:nQƋ q;p1ker;. SCxA/G vد2cX-P`F(ᛦU~܃k$@%F2B<,t|b$ ٓbE@ lWVYT@c]%TO0tl@b3R=b1C"S+js~A`dcAnR 1/@+5@8k 1"%&!l{&˜[TDQ1itire)X Ѵ1@kFh`@9G k(CM IPp3 BxgD-zc.y)ȽxCжз['X.d50AL4GL|_E4|h W2Ħ\CnLQ-rFE}I~jw@0jEOs%yQe+#s C1']i!apL69Y5Ծ=0!Y "Y8i T4e/sTL3sOjBz-?dh9xΥ3,9ЛpC[Q>eN^(Hqqe$;C2^֘v^Ej5,O3,@LOh7eQ`t=M *J4+-*'b]~՚ _Z4׻_kmf3W¬$᧢jug#"_حpalVě7CL9* 3&k6W4}۷BmP [a /i"7co@(!Wss̗EIB^HA*`z/$6[7 w p2sGx9{C䮸RFX܋b4n0ٱ9[iB87+Ve,~l@{ 0=jfV36mA91:o6w\ ً axJ6<MӛOu:Rh[ApˍĈ|Bnl zf5+ jOC伳IK)%ί\hRo'_Xl%Jys>Z%.馝ĤNáQI0 :3]Ϝ>}&@KZ'5( $R1ly',d5|WAҋ6P/ڦޕyoa= q;hJY i(nZ㹗\n71Fum >mAf oO]:vODbQHݹpށ6톈;Xb'~A(q9*P, @3 ~jlv<6~":~Ź"N@ݤ 5Glx)"1mbd}st4` Sv[iǝ\KBr d\}M~6\ y3kp=`ˎV`l5~\=G8ۿ|`uMtFtV9Qh-<+,Hೊ;%\h ҢU9YJ3aQBC8qBC>.x>~ˇ~?p"by&B@Wx`c6B"-fo& /i/[;>ca8pt/\5zq9TY5Kw!#]RSs G,]zXm/E /Ҭ/j"-%qA|E4B>o9H>Irʺ‘ȪWϩdE xbjyđ~i?{^9N w׏2jJf` 8|#o l~T>*l?r]"wЈ ]QUp;,=~!wB{SX.*-">%(T͵l1] 9v@{6 .-M~=`URzj5Hi! \a^1ja~g4FiH6rY%wbu#bs;?_ƒjPmspZԴ̤ OӨ CcK*z1,>ՁQnh >;ԂG!Tc^*Ѹ c  RJM b +|E Y B1˔ Ng}U|C$m46}Z9$̆s1oQ_'v#3%a%5sTi~qS\u]v% J?355@>;]!㑱X , 5Cq&'fxPv4 v_v(bcn}g|;6?cx KG5rSd :\_=L =,ˑdDnzH;7B8<ثq0hY;5r}9hت-Ƚ:;P۳FLŶ728X_8p%~EHm;HMVm8@\Ʉ]Gil#]v> ӵL[ÔC  Ăv `L_E1#P~P,!e`75PHOڪ *#Ҷtt-J|iZΒl*bNǨQV\.fzY t.ǝ{HQP7@d@ %S@(jl7@7$(XK*`d\ki1p,D1#1^5I~SbYwe'4^>EO+ W.9eFkD_n  8JuKfy@hzCӓ4앢21߷ YF+*GTs"*%,: )=17bs=ʽR#WD\f"W@e􋙿B* 5dj=L^!ox4\(^A=Ï'A}"w4REtZ)#5MG@PncwgEELrĆҁԃ_SbhX "INLBBG4mtJ@b7A:Q=K/H6IVYh!DjZZCω̥j8 A^5UD8*ZHOwJһKxv ZO@ A( |\܀s"gM9fBVaq<٤0D,KVP4gnq,vl,}Ƭ|Nj7<~CuC;w^Uahҕ;0U*%)Sk^#L5c-Rn1#jIԍ~hvlE4bzDžHnE/&v×SjMoW"tfYe`(`^A<eW-8K?[qM/{V˿z} !t @#9Ml}Tyh1֪I P사S":}l d>8{IIO7Q?G8x%7x[6bEUX/ TfF-&UQ ^FtK&_kA MD/+sۜ7w{?OO֝GudP۽%$kQUn*V>wwaX"H?'c Æ z%Vs9ca/(3p_l7_AS$ \pT^s%;Ayj(`>4A`ge, >K&cK7Є"h@AA CQ0`,!/kav OwBB2@@}blIe#h@I9N"I(()NUǴ‡vNk%k ljMd`6HuzAZu$_l^=m F#iY`f~<=`Pyn(Bހl @$(hԫr]JtF4d R-9ד!G4j 4K69VPDKQ8h ٦,@jðexG& ^`hȝ C "Gh @L`: 9qvlRA yv"VsS Cz4@Q h?ݒI]B]a?g xKWDDBp_:bF6/T!pH.)xUp/9L 4x`K=O#=îLʴB#F\RFh$j9E( -5hC:U/^iT$J p Kn !u lhuG4!L8BI]/FX:5(M!`A<.#͒3\s>\2DJr$$4, Jãi:i"/N?9j]?D`T w1ӎ! : cFQ)`! yUzJN\RQLSVդaʉ[~B:0PR&[$ؠs.{lŮZu]MD5j Wyp2. juO=}L[j\?Uw\>DGӛPS)QxpyXˍ/6SVM-BixQOjcnJyl(3y?6`N,>uJDbMC8,SQG%n0'3)w= !/fLeqG=eܟΞ_HuX~[XvүB.؎kcnVVfs* 鯑B0q2ZfmRvVJeЋ#"oDÈSI`:jwT1}r85Y4ưǨ`.7 O&V$FT_qʀ,SkQ PF%1en,Z04f䆀o_ 'W΀x751y[SF={WW+m{ClZN0;\ .㟻*^d*ѤI y.\&i:*O_@!;٢ JZ87g5iM' z]},(ym"ǏGU_ $*LyQTܹI2-o`G!_ODm̉iJH 48t)fI`=bYOշJ]%-]w 0 j a]] TZ H,]ό0ؤ$K$6ߣtez9sy< A+j5fun+x08bgq8M>Uu7\h׃d'k &#רZ]ɹB]t;( L^AboM攞g9r ,Ө5)a\(Up8D6M+ieNc@ZU,e<\pL* c6ˁ'/@&I4:NFծՁܺj5=fd-O7J;2wj%Cp ×G4^E H` / V"=`@IWx07Iuj2fCc;kVztC ^W$iwI-@bzUwhH sBծLCk5#JYNPSwwTK{>,!8KPSPٿ36T.XpOyu6e4赜lIp1P`6* 6<>|)7V1+ĜUIb/QÅR?4娍jTy/D21A4ZFGL C:uƏqP~{19@:/MYI ; `{]> *hbƻ-`[,JA& 3Hk=@%.YF*D2(d޴둒-Vw+$آ|*'%{K@0&\(KRgMP^rG~s?9Q5Jh|B(xȣ#AV08h{2xD&κ4WcxRNM=79IK(v@@6ƪ{P!U7 ulLO2^:!n^]rlXAp}] )O#-\m*Ҁb^B&"K+"L#&6pZ!!o#)лQML!K\mMv4 <>VCNe?!:NMea7YqyO Bs˱37؎B0?"0 Jlʂ"O^zZRp%QWC2bld@h|6%yPRu1 g,Sx9 JeOK, ɱ xJSb SBR4.L6Uดk.6{> aᔹ% otϲSԦhI)A9aa9r8ĉץE0QOZsFGF af"=[,f{ql3ч~AatC]z8[WE;meR2ޡF}1G-2!˫p۱t@yR-N|RtC#r2ױ~/bwμ[+D )LwKTCCW Llg,qHByU  զ!VVj'_6+,C11;8ɏ7Ȭ"\GR% pvk7’BD뽱ecqBQJ th b PU$OwD8IMsh9 ^U,MhQȒ,՚ozbXs >ڛ4Vؤ(WJh[Q\c3e/ޮi\wT_4# 8447,6[M577wt,I _{K9A!H7"lmɈ Cnd26wcStn.$Ih'Ը O'{i!Z|x.60Ur߻et~D"aރvd<8 VepE@p)z6NmBeqEBÑ)嚡)!惡mI Vg=*I%lp"2tJ4HdO}PC.(-,r2 dd3IөLꆰsJ/uXwpFKtmd]ŗ*}8ngOvZIa J!F'UR^y/%`p$ 堍eSv>XPKdžgBfH> #0(J  p[:%5;= -*,La8jTA8 b0ݹ(hDk:s,\JFׇ0L%`^~T^"xKWHqo$o*8eAF ? @B|sz^xJkÆeb?d>L(-sh- M5 q"YY ~*$ # 5d*]2]0!_-,N俺Rb%)wrPInxs4d)q\}Kÿ!7BD5b2 -"hICzMwBxeuG[xx KWx`?} ow" 7ֳG%f“J-E@rD=MG]A[(`ŌJND0GjgPnZe%ڍjcʊXo?ŌP.qtiij!.љPy=xJZOwGjHRߥp@4m'N52/c,Io?¿efB]X S]g 2/13C gP2`:an >Y#YOOEM%9lO Мe{V# c4pr 7"}Y*8-y|N4Tx9s)GK<)Pt9U*}7ۄ*\챙,4j #v}efYiJ#(gX=i;lҋJ0I{'pC")Gqs2~@w^sxqB uFR5@༏ #B7[2b1!cG9#zq兵юĪysPE_U8oI< T;KP]ĨgTY9I 1[1O5k `@A446mNrd&Yܥڸ_+Eh~,.;r.DE7m5L:lIz:'[DY蝳;9Ks 'OjDՌPM!!b;,  @!dTF}=М pRochcU^ok@ة9BA1D|?mf猠;ݍ?fdW^aV?In+& NчMfYkM)cc[3EsTZ|SKmnbIX4]~1~ @?Pˑ'%hAx{(eʮ:yE`ƯÎSWԞ!6hCR i=t>ǁu`GHAxuQ;FGybm]W[',?#L@x]h}O{aUJU1L( AlnKO Ϸ@kjB[h3F3pgt2zDg4^jLR-oIC?ɯ;r=%JviM#{w2y!;<};rG u/ f Sy:צߊ?K|WF7s l#I0+/O>‹ o;\P$ПN*\lH24Y6e |# гabJx]0P׆#WoEoB'([.-Kv< 1jEEIdZ*2Ie$)LF{l50 Z*GI`&e\Ŕ 5LWfOcyF`xBûvNRY<#U ]PcHLs ,!'9th1hWgDɄNp3vT9BD 8Շ,A dc{\ɫXEOKP2}wg(-uV8%X \N)6w3X,(+f&滷-B؎Q-s/$5Awz%ND)lQQq}RX*H\O* s֊ݜ(£*["%JXΙ x ȑ:??4&EB hX! ' P'ÎY)w\8:lz բhCՕLTW?,;$ YQsik!c(^bJH /O7z$SrT&U 2'_*沨bV)HuY`NΧYGY10v$ %-ld3vu(8SO09fN~;$Ȩ]102ɚ! n\Z_AjL(Q-+*HWRK* vtD,D05@EW=w1 z͂+oOe) P2&- qβf)yZꀤKu-5s42OnCu ׺:C{5u\Ձ,0̀>;`#Y n AE!vu"A;{@}5Ad. EҺ{C:$OMJ ezT)g2IX~@Qqgl/wxlz"1!g|5J©q t:"ᤳIn|HE|$;EnE_/ .@GPɶ)p PTo+}J4v@YFNl|,$xM%!(3E'FCfER("2ia|l 7#X7FGZQ@>&0/+3jqw闈 rH=d^ r2^XPy՜@w+NXX|/i6=\WBސ(1")0]FD# tjDcݠ|?GkXТAGwGirb1h~!m)-R/JJFl_ƌ4 ԉJ4!RpMᚖZD`7zs̟b0P_wrjy6f KSyĥAgYThYw N> [k6 /f] __ƌ-tAG(G(A㦭~&l^(V 90SpI4WMk|u [zj>DG?mGXtE':Կ',tdm=;h~.""-Shxzt/&CW<-64_bNѕ=ܶU/nolv\A?yzN $1qVBOBt1*pȭ" `~:HFA*NҲ1^E陭"uJQOL%!Bӷ1o CL|?fXA xL2j<,wY *6QtBi lg.^l[`p-HH/ ?Gu@5,)啛W 4r(}.*I H FY7/T0Ǜ*U悀"FR쑏 ;yZ+#}{蠳0dYLTP]pЖ.D\BZ!N2?"A\AUHͺ)*&O-v|D)Wٔ[H͔-7yƊVƣWQ26Tb f/Z P,NE;(;5E⸮A5lO#:i\BQY{I#a)A35H+ ao@337Ќ]*u00!©viS/$n9/ Q ֲ}R*"@ZHmBGIQ5/6j^kiѺs"߲If!nYI|8ءk ^ (Jԟ͘vPWvl0!qȵӦ Kug^ <.w E 6Ug+ { fDN^%`rt1c>Y_V"_,_ZQal{@ЈIUbjynOX E=0(ԘFG P<kcQnhhd$Yl;Tq<( q ŷ>B(#P FQV0Bq-v Pt 6R8(RI1#/dW4f HR&^6򈗢jOɄ\ֹP$'z2NE5!> 7 2^ 2I!2&P!r8NYh _Q=[awf :!P-II8@;&X L!a\ 5̨$V6G3t!c[BQ-O=A%"SbWZ,*6_0KPt$ū$GZ5Xqȭo'l - \:D H,qFP\:gp+ө"P<]`@$ ""9إu ,&p\YIX6 M "Eoą!ru @Wo򸓙[a`HK 8Lf\x4lґ@^=80 a ?d{Y$"B@0^)DkSj/1z'}<$Lf ۝ `"BB٪JD 6'!=ULQL!w&[AärZp|ʽt (#kݏ}KÂH[eՁ |ZN$iy>˺%j&%[Uq1Xa B"*vTgCK; m Q N(O&h#!!0w<kWSWy,QCK[R/UU)PO118"&hcu /BI)!ңƦIu6wHONC؞.pr`"vg3W8`ص8:XŽ/Q7:UF_OuN+ mt lxB_ڃQURHۼ@ 9n-e`)"5 B .P-h+ YCߟn|.{ᄀ=U%($˒G3S|ЄJ'g͏بE!הD+A)hr3rV*5}/! 'QTߑlZ(z{7`2E͠J>U,nIA2!38cK "FS[7ʼ>JDF.{Wr?jK\-͕> p#l"װ-$)itW7{Adt,q5,~S+И &CorӃpة,\#Ǔ҉%]@P7VE'1z]Z{._SP֮?u)Y\P4NLO恒 >wDZTCoWe}\9#_8͝6J7A9 Q1meTۯ*]# eq}7Wl9Pbfj`3=eN}6QqI΄r(IrZh̄Bj6FwH]fP d_680@twW&KEFF{z*w`V~2 ,`졢`GDQyod k40ݲx\d*t2C՛F!/@3qFUC 5ȦJ4mM*y4>b5#&LK8s )Rd-ִY5ܐNq2low~ls$k":LD˜ )S$/NA]*Έ8Fv4Wͼ ?ꇏl̯KÆ IF@W.u:@1M n g\_F@S^Nb8QU$-"̙!&Bxw %V!($#vV8МV_X?@,o m%Kkbʲi {)&z~V QEe4tAvQm,z@|8'^Irs&80-LAwT/)M/R;pPK\8JqUD9 ? EᅄM+? a C%xv3q/M`jVb ! P΁ .IB@1 ?~BAi2 !ߌȾ$~_ p5itWf81Lm7 ʊ}jN .sluKx VAf & rmr>Tt+_I2l0uXg+ {^`B?$ s~Vo3'A2ER,"J9F+-d(v˸M%-h~ lЍZS֠3Ru8"2n'h̳ƣ8L:9\󶨗MεÓ]Ɉ{S)UNkP/AOO2%_0 z`Tf;m\zz '-OIA,21xѠ8?N^w UIIȖ8웙xdM~ZOg6`bf%W'u`GS!%ٔwMńl< !.݂N ,W+Wpx4jEw6"g"ikD7m@0߻]=;};w7LeŽ3")e?7S)Z%[k%AsJVKdvˮ,N@n 0Vǂy-Jj;c u>t: -u.m] zK*V ~.;jI٘Г_N-6aza^):Rh4n#<5#羣$C)XƚbbLc~G+֒ T.#"gH"̤8Q  ChWIb=w\ip*63x&>tgojv}(>Lc冘Jm G +PQ+tH'L (>{j<8DR ylG̬X?r#* vc|:Tb}P#}@m2ΫʺubA?}M~lLQnt;;I A1E&,spVaicԹNs\ۜ֬{-A'ŀM R%FkuYC&}:/,WbN.ApMw50-1%'¿{ bK7pn~90ېums:B<6jiP͛J-(fլrj!&hcv+v0D锔!/b9gբ%1^!- lQ>wY5ãRj~_ X [Dϛ \?.),JD">ހ [JАUBՀE9HVy'^e'^ 4;H N9=%۴N x {rWZX"GSdAY5Hj ~;% Vd# lzbE8b+B y<p0~Oom@v JSMoqճP!x4HziT# + Tg?H!iּ?&hƟG_Ājxiȷn04P0xG(i#&9=nL:lLv()+Wjd:67Uh rkؖeFxYro$"3XJa\M'H}h&@*[gtXݹLJ=9Mˡe 8#͊oRpqR b9P"(Kù4&:qq7AyAGы x«čD} 鑋- i,+ n '#Eɵ~C>8OݕPBg Xh>evjIѷ $ -C&Is$LI\p! yCtyo h&>uIpl;P3nvgPQU1JM0_Q0VNP|G^.PX~˙a8Iwhҽl0< rnEF>9/تV(CqU!&XRT%y[6bM` V9 nIFu?(%fG5Ӌq55C_ 䕝Y 1iIh\8 SB%}F%dK%[0S!) mL fG x} @D$l7"9yC%B]p:Ɋ/95$ 4ЭYO0zM4VFYa_PH-kCgˆ p^sqն  FKDrÊ-fFlq܂T˜}zN7⍖Q{F'sgiVi\_*f*16[^^23)QQY8}.<2OO,z*} ( qdv0{L*;3_ad{W|7YGM-jH!}`W[ \ELO$UρbʼR3mNǓqM@“JV|040Lcoe/t{Je1^W$a 7"QM1\ QEtԑL ֘PR9}ls.,ϞUL%&o?Ҁsgi~ Fq7z}L 91@=:ޝg|q[,<К/eKh ?d"Z]|0"X"6j0tI+\^aKJ5^7y)„䎪NQ~r;3J"W,ʟΧh% v|w$'KlseuN{dϰ9U@'8M %]Ǜ`-Ƙr+Mx#50("}*bFbH?72 ﲸӺᰝKP7Ժ:& ^7kH}+bI Z?ߟx@Z2>>GOXse^o-90}6Y+v} &>XMpw%Cee lLE=s6|@!BOFb$0#H- Mc, ;e0ǹb_)Dӵ(졁%;FuiN։:]U,{I–wN*(MyB:A`&Q0oٙcF-cEnm\8 iG5rlٛ#gFCLdU0U5]ZkܬAP2.m_]*4{0pZL^Z9A7l o/"o]LQ `LPە }`@N+u& WN{hqgGw`3ڟs|?S 0DH8:9@!D$ T^7p%8Q1Ώ;yM 62U$ZQˠ@闶v9{Ї2>(xL\-ðZ=PJaxY>ie@ b$>7ȯq̒f 'IaƁ2MR!!%:mƒݔ||l E7#'#mtVfa[2)ka#Xe;>jhAbBAU/!iizC"{QgG< @d:0 Ĉ*wG(Tvc! -KgXre&4Xg? #r,I JP&’+"`AP1 }/S5wB>}{HT!B*$}q&/ jd}Vsŗ51OS5ǬFf#Jîq H:^ uUYk8r\ l5*UPj-kos@SY4@fFlcUiKrgJ0*p3"!XLcG|Eg~d_|iIF75 SVy̞_*w N{&vN8(C3D* ,eiկ҃c3U8oL7&XR(6@㎿ Z(9G:j:8 /F͋]w@;cvYYl΃VFTT1@Cbj>'큞uK<Ls r.= *ySsAF AR>9!hG?Nf1Ngh$)6H uZtK8 =Tw 9WȀe,g(͉h$ߖ۹{fZС\ދGM*.j;w$t94,ԩzH \𛉷{~yTUN ]uxB՜!3ܘ*OL #9j&ȍgd!l/c#DpGO1,jrVo1d5zlKrIv6YÚbG usc Gjc@| +A(kdX**BW(43p`mY" AC6`JfQfGU8.F (xrDv߄3' ~FL@cb3^RmXC`ZFNh 3n:[hd_~~,NWP ewӋ+pQfr&$^`7-xxݐS78 MOV]A)%))T{ÂAE}U>%WVJ?>gǨxH$0m/BfZ̀1jz⾭  @@, ;oIknI<05{?̐ʓ]Xnk]9~;Vo`鞭x~F'0cPUIHv~4`YvpHpg!_P~r`Ö y (&~qk/͵R{r=չu]bF|R;"4PMIR, ;9TK!4WęR{ xz@@RkKȐ#)H!̆G29spT. p|ƃG.=pC|胦u1ÆGQ F2eq&4lqh#i1FpPkv x)PxENJ(4QG@*UصL"Åk"CBDI( G !^$LLq:nDĜ ':gp\faC6 R ,t0A܆6VkbhOO=Ng@ @@ @R`"3 H;@A p `z`#pF( ]A~ 2SA` !Ddh 8( 0 @3@6` dS|G̿ Uǟ9|GWӟRyw_}WK_ G^_k>{+#x.o=W~fx޹w}tdL~]wΈwoF^R{/ϦC/r\nԘ/$ mbiM#an}2l.Fs&d"6&H$a*z< R@4 nMi$;8LsB*CSPZ B% d#KB/9֋$hœÅh\m0 yzMш-|~n(0-SG+x.ݼ4Xe{v+453]y1^!3͐ͲY|DNN߽ؿ_a/Xz#a*"@!>'E\kDpV fܨu;͕XOl_/ 1AF"/rf'#,`_CF$0쟚4lߪRp{(/ؼH*y$T( Cn>ڇ}^MV%a!堌`ljxՀG<~m^kPh Iy toy 5kEV \hG3R .)NPHi5٢F-8MU|6!kĽvdBM$~bǒ5+V&e:dV2+7o '\vl¦3n'::oTgr#xCٮVYN|l\rkՂ)G)A:P]Gu>)"R[C $Nq`Pd 9^If˰_* γ$<6tB"Jx/UUDE&EaR'\]4\p_bsSnQ@ i%Ⱦ/8Cጊ٠8{ё|NIzh%0VR+l|0BtĔ˄z%2IC,u:9G1J*6/3i4դYN c SvO#74[$;?Hs4(P>%p:[7HE:KM-gBJ^DAL ̥GCʬg)ȄXVCAcw7 -ݛpACťe#|yH6:pn^/);*fG_bަI=@3(, >"J1 "~:_p yج`аeZvna6 DyO%#W1?8Vt >rV̙O hdJ-㯀J0..ȰYoO Qi)O@VͼS(mX}]@AŒS ;7p?IQ X2S5PCZDd-4KnAp Ȉ%s>T>i$e0b I& m*,㰄<1/z\)uBɅk;VM&`a 0d=Q[ HN& kt~hU;Aߥ ɖc!}_V4LT=SRHCBD1Dv9Y_9XZ`##+3#aŒ,1\"h]z-#AOStw ֋epaudٲtBVV0 vioo%e$MF3 ; 5o]4xmIr狅L+X~#q^}n23t*vv E45l^0]X33\w:7K~i!I&w:vn;1 y ^ҟ%_g -b-{BҸ B-$T>ؚBiiP΄z6ߡX/!U"!TB~dX& }4IX,srޮoZ]=% !mYfS PRRc:DH"a0|;?@aMą180 4M9V?` >aڛ]Nt a-FE jekyll-3.1.6/site/fonts/fontawesome-webfont.ttf000077500000000000000000004157341271741406300216460ustar00rootroot00000000000000`FFTMn2GDEF'~OS/26y(`cmapbgasptglyfɁ|head `6hhea j$hmtxF_ locav|maxpt name3<postvwebfaUmQQN wC33spyrs  n@. / _!"""`%>N^n~.>N^n~>N^n~ / _!"""`%!@P`p 0@P`p!@P`pd]YTC2 ߸ݺ w p7!!!@pp p1]!2#!"&463!&54>3!2+@&&&&@+$(($F#+&4&&4&x+#+".4>32".4>32467632DhgZghDDhg-iWDhgZghDDhg-iW&@ (8 2N++NdN+';2N++NdN+'3 8!  #"'#"$&6$ rL46$܏ooo|W%r4L&V|oooܳ%=M%+".'&%&'3!26<.#!";2>767>7#!"&5463!2 %3@m00m@3%    @ :"7..7":6]^B@B^^BB^ $΄+0110+$ (   t1%%1+`B^^B@B^^"'.54632>324 #LoP$$Po>Z$_dC+I@$$@I+"#"'%#"&547&547%62V??V8<8y   b% I))9I  + % %#"'%#"&547&547%62q2ZZ2IzyV)??V8<8)>~>[   2 b% I))9I '%#!"&54>322>32 &6 yy 6Fe= BSSB =eF6 >xx5eud_C(+5++5+(C_due> /?O_o54&+";2654&+";2654&+";264&#!"3!2654&+";2654&+";264&#!"3!2654&+";2654&+";2654&+";267#!"&5463!2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&^BB^^B@B^@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&B^^B@B^^/?#!"&5463!2#!"&5463!2#!"&5463!2#!"&5463!2L44LL44LL44LL44LL44LL44LL44LL44L4LL44LL4LL44LL4LL44LL4LL44LL /?O_o#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(88((88(@(8 (88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88(88((88/?O_#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!28((88(@(88((88(@(88(@(88((88((88(@(88(@(88((88(@(88((8 (88((88(88((88(88((88(88((88(88((88(88((88y"/&4?62 62,PP&PP,jPn#$"' "/&47 &4?62 62 PP&P&&P&P&P&&P&P#+D++"&=#"&=46;546;232  #"'#"$&6$   @    @  rK56$܏ooo|W@    @   rjK&V|oooܳ0#!"&=463!2  #"'#"$&6$   @ rK56$܏ooo|W@  @ rjK&V|oooܳ)5 $&54762>54&'.7>"&5462zz+i *bkQнQkb* j*LhLLhLzzBm +*i JyhQQhyJ i*+ mJ4LL44LL/?O%+"&=46;2%+"&546;2%+"&546;2+"&546;2+"&546;2`r@@r@@n4&"2#"/+"&/&'#"'&'&547>7&/.=46?67&'&547>3267676;27632Ԗ #H  ,/ 1)  ~'H  (C  ,/ 1)  $H ԖԖm 6%2X  % l2 k r6 [21 ..9Q $ k2 k w3 [20/;Cg+"&546;2+"&546;2+"&546;2!3!2>!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@@`0 o`^BB^`5FN(@(NF5 @@@L%%Ju  @LSyuS@%44%g5#!!!"&5465 7#"' '&/&6762546;2&&??>  LL >  X   &&&AJ A J Wh##!"&5463!2!&'&!"&5!(8((88((`x c`(8`((88(@(8(D 9 8( ,#!"&=46;46;2.  6 $$ @(r^aa@@`(_^aa2NC5.+";26#!26'.#!"3!"547>3!";26/.#!2W  .@   @.$S   S$@   9I   I6>  >%=$4&"2$4&"2#!"&5463!2?!2"'&763!463!2!2&4&&4&&4&&48(@(88(ч::(8@6@*&&*4&&4&&4&&4& (88(@(8888)@)'&&@$0"'&76;46;232  >& $$ `  (r^aa` @`2(^aa$0++"&5#"&54762  >& $$ ^ ?  @(r^aa` ? (^aa #!.'!!!%#!"&547>3!2<<<_@`&& 5@5 @  &&>=(""='#"'&5476.  6 $$   ! (r^aaJ %%(_^aa3#!"'&?&#"3267672#"$&6$3276&@*hQQhwI mʬzzk)'@&('QнQh_   z8zoe$G!"$'"&5463!23267676;2#!"&4?&#"+"&=!2762@hk4&&&GaF * &@&ɆF * Ak4&nf&&&4BHrd@&&4rd  Moe&/?O_o+"&=46;25+"&=46;25+"&=46;2#!"&=463!25#!"&=463!25#!"&=463!24&#!"3!26#!"&5463!2 @  @  @  @  @  @  @    @    @    @   ^B@B^^BB^`@  @ @  @ @  @ @  @ @  @ @  @ 3@  MB^^B@B^^!54&"#!"&546;54 32@Ԗ@8(@(88( p (8jj(88(@(88@7+"&5&5462#".#"#"&5476763232>32@@ @ @KjKך=}\I&:k~&26]S &H&  &H5KKut,4, & x:;*4*&K#+"&546;227654$ >3546;2+"&="&/&546$ <X@@Gv"DװD"vG@@X<4L41!Sk @ G< _bb_ 4.54632&4&&M4&UF &""""& F&M&&M&%.D.%G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4&&M4&UF &""""& FU &'8JSSJ8'&  &'.${{$.'& &M&&M&%.D.%7;&'66'&;4[&$ [2[ $&[  #/37#5#5!#5!!!!!!!#5!#5!5##!35!!! #'+/37;?3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3???? ^>>~??????~??~??^??^^? ^??4&"2#"'.5463!2KjKKjv%'45%5&5L45&% jKKjK@5%%%%54L5&6'k54&"2#"'.5463!2#"&'654'.#32KjKKjv%'45%5&5L45&%%'4$.%%5&55&% jKKjK@5%%%%54L5&6'45%%%54'&55&6'Tdt#!"&'&74676&7>7>76&7>7>76&7>7>76&7>7>63!2#!"3!2676'3!26?6&#!"3!26?6&#!"g(sAeM ,*$/ !'& JP$G] x6,& `   h `   "9Hv@WkNC<.  &k& ( "$p" . #u&#  %!' pJvwEF#  @   @  2#"' #"'.546763!''!0#GG$/!''! 8""8  X! 8" "8  <)!!#"&=!4&"27+#!"&=#"&546;463!232(8&4&&4 8(@(8 qO@8((`(@Oq8(&4&&4&@` (88( Oq (8(`(q!)2"&42#!"&546;7>3!2  Ijjjj3e55e3gr`Ijjjj1GG1rP2327&7>7;"&#"4?2>54.'%3"&#"#ժ!9&WB03& K5!)V?@L' >R>e;&L::%P>vO 'h N_":- &+# : ' +a%3 4'.#"32>54.#"7>7><5'./6$3232#"&#"+JBx)EB_I:I*CRzb3:dtB2P$ $5.3b[F|\8!-T>5Fu\,,jn OrB,7676'5.'732>7"#"&#&#"$ zj=N!}:0e%  y + tD3~U'#B4 # g  '2 %/!: T bRU,7~}%2"/&6;#"&?62+326323!2>?23&'.'.#"&"$#"#&=>764=464.'&#"&'!~:~!PP!~:~!P6 ,,$$% *'  c2N  ($"LA23Yl !x!*%%%% pP,T NE Q7^oH!+( 3  *Ueeu  wga32632$?23&'.5&'&#"&"5$#"#&=>7>4&54&54>.'&#"&'2#".465!#".'&47>32!4&4>Q6 ,,Faw!*' =~Pl*  ($"LA23Yl  )!* <7@@7<  <7@@7<  pP,T MF Q747ƢHoH!+( 3  tJHQ6  wh',686,'$##$',686,'$##$/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?%#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&f&&&&f&&&&f&&&&/?O_o%+"&=46;2+"&=46;2+"&=46;2#!"&=463!2+"&=46;2#!"&=463!2#!"&=463!2#!"&=463!2        @     @   @   @   s  s    s    s  s  /?O#"'&47632#!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2     @     @   @  @          s  s  s  /?O#"&54632 #!"&=463!2#!"&=463!2#!"&=463!2#!"&=463!2`      @     @   @  @     @   s  s  s  #"'#!"&5463!2632' mw@www '*wwww."&462!5 !"3!2654&#!"&5463!2pppp@  @ ^BB^^B@B^ppp@@  @    @B^^BB^^k%!7'34#"3276' !7632k[[v  6`%`$65&%[[k `5%&&'4&"2"&'&54 Ԗ!?H?!,,ԖԖmF!&&!Fm,%" $$ ^aa`@^aa-4'.'&"26% 547>7>2"KjKXQqYn 243nYqQ$!+!77!+!$5KK,ԑ ]""]ً 9>H7'3&7#!"&5463!2'&#!"3!26=4?6 !762xtt`  ^Qwww@?6 1B^^B@B^ @(` `\\\P`tt8`  ^Ͼww@w 1^BB^^B~ @` \ \P+Z#!"&5463!12+"3!26=47676#"'&=# #"'.54>;547632www M8 pB^^B@B^ 'sw- 9*##;Noj' #ww@w "^BB^^B  *  "g`81T`PSA:'*4/D#!"&5463!2#"'&#!"3!26=4?632"'&4?62 62www@?6 1 B^^B@B^ @ BRnBBn^ww@w 1 ^BB^^B @ BnnBC"&=!32"'&46;!"'&4762!#"&4762+!54624&&4&&44&&4&&44&&44&&4&&44&&z6'&'+"&546;267: &&&& s @  Z&&&&Z z+6'&''&'+"&546;267667: : &&&&  s @  :  Z&&&&Z  : zz6'&''&47667S::s @  : 4 : r &546h!!0a   $#!"&5463!2#!"&5463!2&&&&&&&&@&&&&&&&&#!"&5463!2&&&&@&&&&z&54646&5-:s  :  :4:  z+&5464646;2+"&5&5-&&&&:s  :  : &&&& :  z&54646;2+"&5-&&&&s  : &&&&  62#!"&!"&5463!24 @ &&&&-:&&&& "'&476244444Zf "/&47 &4?62S44444#/54&#!4&+"!"3!;265!26 $$ &&&&&&&&@^aa@&&&&&&&&+^aa54&#!"3!26 $$ &&&&@^aa@&&&&+^aa+74/7654/&#"'&#"32?32?6 $$ }ZZZZ^aaZZZZ^aa#4/&"'&"327> $$ [4h4[j^aa"ZiZJ^aa:F%54&+";264.#"32767632;265467>$ $$ oW  5!"40K(0?i+! ":^aaXRd D4!&.uC$=1/J=^aa.:%54&+4&#!";#"3!2654&+";26 $$ ```^aa^aa/_#"&=46;.'+"&=32+546;2>++"&=.'#"&=46;>7546;232m&&m l&&l m&&m l&&ls&%&&%&&%&&%&&&l m&&m l&&l m&&m ,&%&&%&&%&&%&#/;"/"/&4?'&4?627626.  6 $$ I     ͒(r^aaɒ    (_^aa , "'&4?6262.  6 $$ Z4f44fz(r^aaZ&4ff4(_^aa "4'32>&#" $&6$  WoɒV󇥔 zzz8YW˼[?zz:zz@5K #!#"'&547632!2A4@%&&K%54'u%%&54&K&&4A5K$l$L%%%54'&&J&j&K5K #"/&47!"&=463!&4?632%u'43'K&&%@4AA4&&K&45&%@6%u%%K&j&%K55K&$l$K&&u#5K@!#"'+"&5"/&547632K%K&56$K55K$l$K&&#76%%53'K&&%@4AA4&&K&45&%%u'5K"#"'&54?63246;2632K%u'45%u&&J'45%&L44L&%54'K%5%t%%$65&K%%4LL4@&%%K',"&5#"#"'.'547!34624&bqb>#  5&44& 6Uue7D#  "dž&/#!"&546262"/"/&47'&463!2 &@&&4L  r&4  r L&& 4&&&L rI@& r  L4&& s/"/"/&47'&463!2#!"&546262&4  r L&& &@&&4L  r@@& r  L4&& 4&&&L r##!+"&5!"&=463!46;2!28(`8((8`(88(8((8(8 (8`(88(8((8(88(`8#!"&=463!28(@(88((8 (88((88m5'%+"&5&/&67-.?>46;2%6.@g.L44L.g@. .@g. L44L .g@.g.n.4LL43.n.gg.n.34LL4͙.n.g -  $54&+";264'&+";26/a^    ^aa fm  @ J%55!;263'&#"$4&#"32+#!"&5#"&5463!"&46327632#!2$$8~+(888(+}(`8((8`]]k==k]]8,8e8P88P8`(88(@MMO4&#"327>76$32#"'.#"#".'.54>54&'&54>7>7>32&z&^&./+>*>J> Wm7' '"''? &4&c&^|h_bml/J@L@ #M6:D 35sҟw$ '% ' \t3#!"&=463!2'.54>54''  @ 1O``O1CZZ71O``O1BZZ7@  @ N]SHH[3`)TtbN]SHH[3^)Tt!1&' 547 $4&#"2654632 '&476 ==嘅}(zVl''ٌ@uhyyhu9(}VzD##D# =CU%7.5474&#"2654632%#"'&547.'&476!27632#76$7&'7+NWb=嘧}(zVi\j1  z,X Y[6 $!%'FuJiys?_9ɍ?kyhun(}Vz YF  KA؉La  02-F"@Qsp@_!3%54&+";264'&+";26#!"&'&7>2    #%;"";%#`,@L 5 `   `  L`4LH` `   a 5 L@ #37;?Os!!!!%!!!!%!!!!!!!!%!!4&+";26!!%!!!!74&+";26%#!"&546;546;2!546;232 `@ `@ @@ @ @  @  @  @  @ L44LL4^B@B^^B@B^4L  @@@@    @@   @@    M4LL44L`B^^B``B^^B`L7q.+"&=46;2#"&=".'673!54632#"&=!"+"&=46;2>767>3!546327>7&54>$32dFK1A  0) L.٫C58.H(Ye#3C $=463!22>=463!2#!"&5463!2#!"&5463!2H&&/7#"&463!2!2LhLLhLhLLh! &&&&& &4hLLhLLhLLhL%z< 0&4&& )17&4& &&#!"&5463!2!2\@\\@\\@\\\\ W*#!"&547>3!2!"4&5463!2!2W+B"5P+B@"5^=\@\ \H#t3G#3G:_Ht\\ @+32"'&46;#"&4762&&4&&44&&44&&4@"&=!"'&4762!54624&&44&&44&&4&& !!!3!!0@67&#".'&'#"'#"'32>54'6#!"&5463!28ADAE=\W{O[/5dI kDtpČe1?*w@www (M& B{Wta28r=Ku?RZ^GwT -@www$2+37#546375&#"#3!"&5463ww/Dz?swww@wS88 ww#'.>4&#"26546326"&462!5!&  !5!!=!!%#!"&5463!2B^8(Ԗ>@|K55KK55K^B(8ԖԖ€>v5KK55KKHG4&"&#"2654'32#".'#"'#"&54$327.54632@pp)*Pppp)*Pb '"+`N*(a;2̓c`." b PTY9ppP*)pppP*)b ".`(*Nͣ2ͣ`+"' b MRZB4&"24&"264&"26#"/+"&/&'#"'&547>7&/.=46?67&'&547>3267676;27632#"&'"'#"'&547&'&=4767&547>32626?2#"&'"'#"'&547&'&=4767&547>32626?2ԖLhLKjKLhLKjK "8w s%(  ")v  >  "8x s"+  ")v  <  3zLLz3 3>8L3)x3 3zLLz3 3>8L3)x3 ԖԖ4LL45KK54LL45KK #)0C wZ l/ Y N,& #)0C vZl. Y L0"qG^^Gqq$ ]G)FqqG^^Gqq$ ]G)Fq%O#"'#"&'&4>7>7.546$ '&'&'# '32$7>54'VZ|$2 $ |E~E<| $ 2$|ZV:(t}X(  &%(Hw쉉xH(%& (XZT\MKG<m$4&"24&#!4654&#+32;254'>4'654&'>7+"&'&#!"&5463!6767>763232&4&&4N2`@`%)7&,$)' %/0Ӄy#5 +1 &<$]`{t5KK5$e:1&+'3TF0h4&&4&3M:;b^v+D2 5#$IIJ 2E=\$YJ!$MCeM-+(K55KK5y*%Au]c=p4&"24&'>54'64&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4+ 5#bW0/% ')$,&7)%`@``2Nh0##T3'"( 0;e$5KK5 tip<& 1&4&&4&#\=E2 JIURI$#5 2D+v^b;:M2gc]vDEA%!bSV2MK55K(,,MeCM$!J@#"&547&547%6@?V8 b% I)94.""'." 67"'.54632>32+C`\hxeH>Hexh\`C+ED4 #LoP$$Po>Q|I.3MCCM3.I|Q/Z$_dC+I@$$@I+ (@%#!"&5463!2#!"3!:"&5!"&5463!462 ww@  B^^B  4&@&&&4 `  ww   ^B@B^ 24& && &%573#7.";2634&#"35#347>32#!"&5463!2FtIG9;HIxI<,tԩw@wwwz4DD43EEueB&#1s@www .4&"26#!+"'!"&5463"&463!2#2&S3 Ll&c4LL44LL4c@& &{LhLLhL'?#!"&5463!2#!"3!26546;2"/"/&47'&463!2www@B^^B@B^@&4t  r &&`ww@w@^BB^^B@R&t r  4&&@"&5!"&5463!462 #!"&54&>3!2654&#!*.54&>3!24&@&&&4 sw  @B^^B  @w4& && &3@w   ^BB^    I&5!%5!>732#!"&=4632654&'&'.=463!5463!2!2JJSq*5&=CKuuKC=&5*q͍S8( ^B@B^ (8`N`Ѣ΀GtO6)"M36J[E@@E[J63M")6OtG(8`B^^B`8%-3%'&76'&76''&76'&76'&6#5436&76+".=4'>54'6'&&"."&'./"?+"&5463!2  2  5    z<: Ʃw 49[aA)O%-j'&]]5r,%O)@a[9( 0BA; + >HCwww  5 /)  u    @wa-6OUyU[q ( - q[UyUP6$C +) (  8&/ &ww'?$4&"2$4&"2#!"&5463!3!267!2#!#!"&5!"'&762&4&&4&&4&&48(@(88(c==c(8*&&*6&4&&4&&4&&4& (88(@(88HH88`(@&&('@1d4&'.54654'&#"#"&#"32632327>7#"&#"#"&54654&54>76763232632   N<;+gC8A`1a99gw|98aIe$IVNz<:LQJ  ,-[% 061I()W,$-7,oIX()oζA;=N0 eTZ  (O#".'&'&'&'.54767>3232>32 e^\3@P bMO0# 382W# & 9C9 Lĉ" 82<*9FF(W283 #0OMb P@3\^e FF9*<28 "L 9C9 & #!"3!2654&#!"&5463!2`B^^B@B^^ީwww@w^BB^^B@B^ww@w#!72#"' #"'.546763YY !''!0#GG$/!''!&UUjZ 8""8  X! 8" "8 EU4'./.#"#".'.'.54>54.'.#"32676#!"&5463!2G55 :8 c7 )1)  05.D <90)$9w@wwwW + AB 7c  )$+ -.1 9$)0< D.59@www,T1# '327.'327.=.547&54632676TC_LҬ#+i!+*pDNBN,y[`m`%i]hbEm}a u&,SXK &$f9s? _#"!#!#!54632V<%'ЭHH (ںR&=4'>54'6'&&"."&'./"?'&54$ 49[aA)O%-j'&]]5r,%O)@a[9( 0BA; + >HCaaoMa-6OUyU[q ( - q[UyUP6$C +) (  8&/ &fMa%+"&54&"32#!"&5463!54 &@&Ԗ`(88(@(88(r&&jj8((88(@(8#'+2#!"&5463"!54&#265!375!35!B^^BB^^B   `^B@B^^BB^  ` !="&462+"&'&'.=476;+"&'&$'.=476; pppp$!$qr % }#ߺppp!E$ rqܢ# % ֻ!)?"&462"&4624&#!"3!26!.#!"#!"&547>3!2/B//B//B//B @   2^B@B^\77\aB//B//B//B/@    ~B^^B@2^5BB52v.42##%&'.67#"&=463! 25KK5L4_u:B&1/&.- zB^^B4LvyKjK4L[!^k'!A3;):2*547&5462;U gIv0ZZ0L4@Ԗ@4L2RX='8P8'=XR U;Ig0,3lb??bl34LjjL4*\(88(\xI/#"/'&/'&?'&'&?'&76?'&7676767676` (5 )0 ) *) 0) 5(  (5 )0 )))) 0) 5( *) 0) 5(  )5 )0 )**) 0) 5)  )5 )0 )*5h$4&"24&#!4>54&#"+323254'>4'654&'!267+#"'&#!"&5463!2>767>32!2&4&&4N2$YGB (HGEG HQ#5K4Li!<;5KK5 A# ("/?&}vh4&&4&3M95S+C=,@QQ9@@IJ 2E=L5i>9eME;K55K J7R>@#zD<7?s%3#".'.'&'&'.#"!"3!32>$4&"2#!"#"&?&547&'#"&5463!&546323!2` #A<(H(GY$2NL4K5#aWTƾh&4&&4K5;=!ihv}&?/"( #A  5K2*!Q@.'!&=C+S59M34L=E2 JI UR@@&4&&4&5K;ELf9>igR7J K5h4&"24#"."&#"4&#"".#"!54>7#!"&54.'&'.5463246326326&4&&4IJ 2E=L43M95S+C=,@QQ9@@E;K55K J7R>@#zD9eMZ4&&4&<#5K4LN2$YGB (HGEG HV;5KK5 A# ("/?&}vhi!<4<p4.=!32>332653272673264&"2/#"'#"&5#"&54>767>5463!2@@2*! Q@.'!&=C+S59M34L.9E2 JI UR&4&&4&Lf6Aig6Jy#@>R7J K55K;E@TƾH #A<(H(GY$2NL4K#5#a=4&&4&D=ihv}&?/"( #A  5KK5;+54&#!764/&"2?64/!26 $$ & [6[[j6[&^aa@&4[[6[[6&+^aa+4/&"!"3!277$ $$ [6[ &&[6j[ ^aae6[j[6&&4[j[^aa+4''&"2?;2652?$ $$ [6[[6&&4[^aaf6j[[6[ &&[^aa+4/&"4&+"'&"2? $$ [6&&4[j[6[j^aad6[&& [6[[j^aa   $2>767676&67>?&'4&'.'.'."#&6'&6&'3.'.&'&'&&'&6'&>567>#7>7636''&'&&'.'"6&'6'..'/"&'&76.'7>767&.'"76.7"7"#76'&'.'2#22676767765'4.6326&'.'&'"'>7>&&'.54>'>7>67&'&#674&7767>&/45'.67>76'27".#6'>776'>7647>?6#76'6&'676'&67.'&'6.'.#&'.&6'&.5/a^D&"      4   $!   #          .0"Y +  !       $     "  +       Α      ^aa                        P   ' -( # * $  "  !     * !   (         $      2 ~/$4&"2 #"/&547#"32>32&4&&4V%54'j&&'/덹:,{ &4&&4&V%%l$65&b'Cr! " k[G +;%!5!!5!!5!#!"&5463!2#!"&5463!2#!"&5463!2&&&&&&&&&&&&@&&&&&&&&&&&&#"'&5&763!2{' **)*)'/!5!#!"&5!3!26=#!5!463!5463!2!2^B@B^&@&`^B`8(@(8`B^ B^^B&&B^(88(^G 76#!"'&? #!"&5476 #"'&5463!2 '&763!2#"'c)'&@**@&('c (&*cc*&' *@&('c'(&*cc*&('c'(&@*19AS[#"&532327#!"&54>322>32"&462 &6 +&'654'32>32"&462QgRp|Kx;CByy 6Fe= BPPB =eF6 ԖV>!pRgQBC;xK|Ԗ{QNa*+%xx5eud_C(+5++5+(C_due2ԖԖ>NQ{u%+*jԖԖp!Ci4/&#"#".'32?64/&#"327.546326#"/&547'#"/&4?632632(* 8( !)(A(')* 8( !USxySSXXVzxTTUSxySSXXVzxT@(  (8 *(('( (8 SSUSx{VXXTTSSUSx{VXXT#!"5467&5432632t,Ԟ;F`j)6,>jK?Q/!%#!"&7#"&463!2+!'5#8EjjE8@&&&&@XYY&4&&4&qDS%q%N\jx2"&4#"'#"'&7>76326?'&'#"'.'&676326326&'&#"32>'&#"3254?''74&&4&l NnbSVZ bRSD zz DSRb)+USbn \.2Q\dJ'.2Q\dJ.Q2.'Jd\Q2.'Jd`!O` ` &4&&4r$#@B10M5TNT{L5T II T5L;l'OT4M01B@#$*3;$*3;;3*$;3*$: $/ @@Qq`@"%3<2#!"&5!"&5467>3!263! !!#!!46!#!(88(@(8(8(`((8D<++<8(`(8(`8(@(88( 8((`(8((<`(8(``(8||?%#"'&54632#"'&#"32654'&#"#"'&54632|udqܟs] = OfjL?R@T?"& > f?rRX=Edudsq = _MjiL?T@R?E& f > =XRr?b!1E)!34&'.##!"&5#3463!24&+";26#!"&5463!2 08((88(@(8  8((88((`(1  `(88((88(@  `(88(@(8(`#!"&5463!2w@www`@www/%#!"&=463!2#!"&=463!2#!"&=463!2&&&&&&&&&&&&&&&&&&&&&&&&@'7G$"&462"&462#!"&=463!2"&462#!"&=463!2#!"&=463!2ppppppp @   ppp @    @   Рpppppp  ppp    <L\l|#"'732654'>75"##5!!&54>54&#"'>3235#!"&=463!2!5346=#'73#!"&=463!2#!"&=463!2}mQjB919+i1$AjM_3</BB/.#U_:IdDRE @  k*Gj @   @   TP\BX-@8 C)5Xs J@$3T4+,:;39SG2S.7<  vcc)( %Ll}    5e2#!"&=463%&'&5476!2/&'&#"!#"/&'&=4'&?5732767654'&@02uBo  T25XzrDCBBEh:%)0%HPIP{rQ9f#-+>;I@KM-/Q"@@@#-a[ $&P{<8[;:XICC>.'5oe71#.0(  l0&%,"J&9%$<=DTIcs&/6323276727#"327676767654./&'&'737#"'&'&'&54'&54&#!"3!260% <4"VRt8<@< -#=XYhW8+0$"+dTLx-'I&JKkmuw<=V@!X@ v '|N;!/!$8:IObV;C#V  &   ( mL.A:9 !./KLwPM$@@ /?O_o%54&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!2654&#!"3!26#!"&5463!2@@@@@@@@@^BB^^B@B^NB^^B@B^^#+3 '$"/&4762%/?/?/?/?%k*66bbbb|<<<bbbbbbbb%k66Ƒbbb<<<<^bbbbbb@M$4&"2!#"4&"2&#"&5!"&5#".54634&>?>;5463!2LhLLh LhLLhL! 'ԖԖ@' !&  ?&&LhLLhL hLLhL jjjj &@6/" &&J#"'676732>54.#"7>76'&54632#"&7>54&#"&54$ ok; -j=yhwi[+PM 3ѩk=J%62>VcaaQ^ ]G"'9r~:`}Ch 0=Z٤W=#uY2BrUI1^Fk[|aL2#!67673254.#"67676'&54632#"&7>54&#"#"&5463ww+U ,iXբW<"uW1AqSH1bdww%S_o#".54>32#".54632?!"32732>54.4>54&'35#5##33#!"&5463!2=uQ)OH,2QS+ * $  JB;5P#@<5Q#jXUg^ (R/9%LI&D,.D#3!#'267654.#"2>54.'&#"3##5#5353@[Z@0HꟄ9%YJ .H?MpJL1EF1&P5"?j@*Q/+=Y6:k[7'9C 5hoS6Fq}kii$ECPNZSzsS`!9f:}R'!;e.ggR44^>0$/. 0$8];Fk;lll ,<!5##673#$".4>2"&5!#2!46#!"&5463!2rM* *M~~M**M~~M*jjj&&&&`P%挐|NN||NN|*jjjj@&&&&@ "'&463!2@4@&Z4@4&@ #!"&4762&&4Z4&&4@@ "'&4762&4@4&@&4&@ "&5462@@4&&44@&&@ 3!!%!!26#!"&5463!2`m` ^BB^^B@B^  `@B^^BB^^@ "'&463!2#!"&4762@4@&&&&44@4&Z4&&4@ "'&463!2@4@&4@4&@ #!"&4762&&4Z4&&4@:#!"&5;2>76%6+".'&$'.5463!2^B@B^,9j9Gv33vG9H9+bI\ A+=66=+A [">nSMA_:B^^B1&c*/11/*{'VO3@/$$/@*?Nh^l+!+"&5462!4&#"!/!#>32]_gTRdgdQV?U I*Gg?!2IbbIJaaiwE3300 084#"$'&6?6332>4.#"#!"&54766$32z䜬m IwhQQhbF*@&('kz   _hQнQGB'(&*eoz(q!#"'&547"'#"'&54>7632&4762.547>32#".'632%k'45%&+~(  (h  &  \(  (  &  ~+54'k%5%l%%l$65+~  &  (  (\  &  h(  (~+%'!)19K4&"24&"26.676&$4&"24&"24&"2#!"'&46$ KjKKj KjKKje2.e<^P,bKjKKjKjKKj KjKKj##LlLKjKKjK jKKjK~-M7>7&54$ LhяW.{+9E=cQdFK1A  0) pJ2`[Q?l&٫C58.H(Y':d 6?32$64&$ #"'#"&'&4>7>7.546'&'&'# '32$7>54'Yj`a#",5NK ~EVZ|$2 $ |: $ 2$|ZV:(t}hfR88T h̲X(  &%(Hw(%& (XZT\MKG{x!#"'.7#"'&7>3!2%632u  j H{(e 9 1bU#!"&546;5!32#!"&546;5!32#!"&546;5463!5#"&5463!2+!2328((88(``(88((88(``(88((88(`L4`(88(@(88(`4L`(8 (88(@(88((88(@(88((88(@(84L8(@(88((8L48OY"&546226562#"'.#"#"'.'."#"'.'.#"#"&5476$32&"5462И&4&NdN!>! 1X:Dx+  +ww+  +xD:X1 -U !*,*&4&hh&&2NN2D &  ..J< $$ 767#"&'"&547&547&547.'&54>2l4  2cKEooED ) ) Dg-;</- ?.P^P.? -/<;-gYY  .2 L4H|O--O|HeO , , Oeq1Ls26%%4.2,44,2.4%%62sL1qcqAAq4#!#"'&547632!2#"&=!"&=463!54632  @  `     ` ?`   @  @  !    54&+4&+"#"276#!"5467&5432632   `  _ v,Ԝ;G_j)``    _ ԟ7 ,>jL>54'&";;265326#!"5467&5432632    v,Ԝ;G_j) `   `7 ,>jL>X`$"&462#!"&54>72654&'547 7"2654'54622654'54&'46.' &6 &4&&4&yy %:hD:FppG9Fj 8P8 LhL 8P8 E; Dh:% >4&&4&}yyD~s[4Dd=PppP=d>hh>@jY*(88(*Y4LL4Y*(88(*YDw" A4*[s~>M4&"27 $=.54632>32#"' 65#"&4632632 65.5462&4&&4G9& <#5KK5!!5KK5#< &ܤ9Gpp&4&&4&@>buោؐ&$KjKnjjKjK$&jjb>Ppp %!5!#"&5463!!35463!2+32@\\8(@(8\@@\\@\(88(\@ 34#"&54"3#!"&5!"&5>547&5462;U gI@L4@Ԗ@4L2RX='8P8'=XR U;Ig04LjjL4*\(88(\@"4&+32!#!"&+#!"&5463!2pP@@Pjj@@\@\&0pj \\&-B+"&5.5462265462265462+"&5#"&5463!2G9L44L9G&4&&4&&4&&4&&4&L44L &=d4LL4 d=&&`&&&&`&&&&4LL4  &#3CS#!"&5463!2!&'&!"&5!463!2#!"&52#!"&=4632#!"&=463(8((88((`x c`(8@@@`((88(@(8(D 9 8(`@@@@@/?O_o-=%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!!5463!2#!"&5463!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ &&&&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @   `&&&& /?O_o%+"&=46;25+"&=46;2+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2%+"&=46;2+"&=46;2%+"&=46;2+"&=46;2!!#!"&=!!5463!24&+"#54&+";26=3;26%#!"&5463!463!2!2 @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @ 8(@(8 @  @  @  @  @ &&&@8((8@&@  @ @  @  @  @ @  @ @  @ @  @ @  @ @  @ @  @  @  @  (88(  @  ``   `` -&&& (88(&@<c$4&"2!#4&"254&+54&+"#";;26=326+"&5!"&5#"&46346?>;463!2KjKKjKjKKj&ԖԖ&&@&&KjKKjK jKKjK .&jjjj&4&@@&&#'1?I54&+54&+"#";;26=326!5!#"&5463!!35463!2+32 \\8(@(8\ \\@\(88(\: #32+53##'53535'575#5#5733#5;2+3@E&&`@@` `@@`&&E%@`@ @ @      @ :#@!3!57#"&5'7!7!K5@   @5K@@@ #3%4&+"!4&+";265!;26#!"&5463!2&&&&&&&&w@www&&@&&&&@&&@www#354&#!4&+"!"3!;265!26#!"&5463!2&&&&&@&&@&w@www@&@&&&&&&@&:@www-M3)$"'&4762 "'&4762 s 2  .   2 w 2  .   2 w 2    2  ww  2    2  ww M3)"/&47 &4?62"/&47 &4?62S .  2 w 2   .  2 w 2  M . 2    2 .  . 2    2 .M3S)$"' "/&4762"' "/&47623 2  ww  2    2  ww  2    2 w 2   .v 2 w 2   .M3s)"'&4?62 62"'&4?62 623 .  . 2    2 .  . 2    2 .   2 w 2v .   2 w 2-Ms3 "'&4762s w 2  .   2 ww  2    2 MS3"/&47 &4?62S .  2 w 2  M . 2    2 .M 3S"' "/&47623 2  ww  2   m 2 w 2   .M-3s"'&4?62 623 .  . 2    2- .   2 w 2/4&#!"3!26#!#!"&54>5!"&5463!2  @ ^B && B^^B@B^ @  MB^%Q= &&& $$ (r^aa(^aa!C#!"&54>;2+";2#!"&54>;2+";2pPPpQh@&&@j8(PppPPpQh@&&@j8(Pp@PppPhQ&&j (8pPPppPhQ&&j (8p!C+"&=46;26=4&+"&5463!2+"&=46;26=4&+"&5463!2Qh@&&@j8(PppPPpQh@&&@j8(PppPPp@hQ&&j (8pPPppP@hQ&&j (8pPPpp@@ #+3;G$#"&5462"&462"&462#"&462"&462"&462"&462#"&54632K54LKj=KjKKjKjKKjL45KKjK<^^^KjKKjppp\]]\jKL45KjKKjKujKKjK4LKjKK^^^jKKjKpppr]]\  $$ ^aaQ^aa,#"&5465654.+"'&47623   #>bqb&44&ɢ5"  #D7euU6 &4&m 1X".4>2".4>24&#""'&#";2>#".'&547&5472632>3=T==T==T==T=v)GG+v@bRRb@=&\Nj!>3lkik3hPTDDTPTDDTPTDDTPTDD|x xXK--K|Mp<# )>dA{RXtfOT# RNftWQ,%4&#!"&=4&#!"3!26#!"&5463!2!28(@(88((88((8\@\\@\\(88(@(88(@(88@\\\\ u'E4#!"3!2676%!54&#!"&=4&#!">#!"&5463!2!2325([5@(\&8((88((8,9.+C\\@\ \6Z]#+#,k(88(@(88(;5E>:5E\\\ \1. $4@"&'&676267>"&462"&462.  > $$ n%%/02 KjKKjKKjKKjKfff^aayy/PccP/jKKjKKjKKjKffff@^aa$4@&'."'.7>2"&462"&462.  > $$ n20/%7KjKKjKKjKKjKfff^aa3/PccP/y jKKjKKjKKjKffff@^aa +7#!"&463!2"&462"&462.  > $$ &&&&KjKKjKKjKKjKfff^aa4&&4&jKKjKKjKKjKffff@^aa#+3C54&+54&+"#";;26=3264&"24&"2$#"'##"3!2@@KjKKjKKjKKjKܒ,gjKKjKKjKKjKXԀ,, #/;GS_kw+"=4;27+"=4;2'+"=4;2#!"=43!2%+"=4;2'+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;54;2!#!"&5463!2`````````````````````p`K55KK55Kp`````````````````````````5KK55KK@*V#"'.#"63232+"&5.5462#"/.#"#"'&547>32327676R?d^7ac77,9xm#@#KjK# ڗXF@Fp:f_ #WIpp&3z h[ 17q%q#::#5KKu't#!X: %#+=&>7p @ *2Fr56565'5&'. #"32325#"'+"&5.5462#"/.#"#"'&547>32327676@ͳ8 2.,#,fk*1x-!#@#KjK# ڗXF@Fp:f_ #WIpp&3z e`vo8t-  :5 [*#::#5KKu't#!X: %#+=&>7p  3$ "/&47 &4?62#!"&=463!2I.  2 w 2   -@). 2    2 . -@@-S$9%"'&4762  /.7> "/&47 &4?62i2  .   2 w E > u > .  2 w 2   2    2  ww !   h. 2    2 . ;#"'&476#"'&7'.'#"'&476' )'s "+5+@ա' )'F*4*Er4M:}}8 GO *4* (-/' #"'%#"&7&67%632B;>< V??V --C4 <B=cB5 !% %!b 7I))9I7 #"'.5!".67632y( #  ##@,( )8! !++"&=!"&5#"&=46;546;2!76232-SSS  SS``  K$4&"24&"24&"27"&5467.546267>5.5462 8P88P88P88P8P88P4,DS,4pp4,,4pp4,6d7AL*',4ppP88P8P88P8HP88P8`4Y&+(>EY4PppP4Y4Y4PppP4Y%*54&#"#"/.7!2<'G,')7N;2]=A+#H  0PRH6^;<T%-S#:/*@Z}   >h.%#!"&=46;#"&=463!232#!"&=463!2&&&@@&&&@&&&&&&&&&&&&f&&&&a#!"&=463!2#!"&'&63!2&&&&''%@% &&&&&&&&k"G%#/&'#!53#5!36?!#!'&54>54&#"'6763235 Ź}4NZN4;)3.i%Sin1KXL7觧* #& *@jC?.>!&1' \%Awc8^;:+54&#"'6763235 Ź}4NZN4;)3.i%PlnEcdJ觧* #& *-@jC?.>!&1' \%AwcBiC:D'P%! #!"&'&6763!2P &:&? &:&?5"K,)""K,)h#".#""#"&54>54&#"#"'./"'"5327654.54632326732>32YO)I-D%n  "h.=T#)#lQTv%.%P_ % %_P%.%vUPl#)#T=@/#,-91P+R[Ql#)#|'' 59%D-I)OY[R+P19-,##,-91P+R[YO)I-D%95%_P%.%v'3!2#!"&463!5&=462 =462 &546 &&&&&4&r&4&@&4&&4&G݀&&&&f s CK&=462 #"'32=462!2#!"&463!5&'"/&4762%4632e*&4&i76`al&4&&&&&}n  R   R zfOego&&5`3&&&4&&4& D R   R zv"!676"'.5463!2@@w^Cct~5  5~tcC&&@?JV|RIIR|V&&#G!!%4&+";26%4&+";26%#!"&546;546;2!546;232@@@@L44LL4^B@B^^B@B^4L  N4LL44L`B^^B``B^^B`LL4&"2%#"'%.5!#!"&54675#"#"'.7>7&5462!467%632&4&&4  @ o&&}c ;pG=(  8Ai8^^.   &4&&4&` ` fs&& jo/;J!# 2 KAE*,B^^B! `  -4&"2#"/&7#"/&767%676$!28P88PQr @ U @ {`PTP88P8P`  @U @rQ!6'&+!!!!2Ѥ 8̙e;<*@8 !GGGQII %764' 64/&"2 $$ f3f4:4^aaf4334f:4:^aa %64'&" 2 $$ :4f3f4F^aa4f44f^aa 764'&"27 2 $$ f:4:f4334^aaf4:4f3^aa %64/&" &"2 $$ -f44f4^aa4f3f4:w^aa@7!!/#35%!'!%j/d jg2|855dc b @! !%!!7!FG)DH:&H dS)U4&"2#"/ $'#"'&5463!2#"&=46;5.546232+>7'&763!2&4&&4f ]wq4qw] `dC&&:FԖF:&&Cd`4&&4& ]] `d[}&&"uFjjFu"&&y}[d#2#!"&546;4 +"&54&" (88(@(88( r&@&Ԗ8((88(@(8@&&jj'3"&462&    .  > $$ Ԗ>aX,fff^aaԖԖa>TX,,~ffff@^aa/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88((88((88((88((88/+"&=46;2+"&=46;2+"&=46;28((88((88((88((88((88((8 (88((88(88((88(88((885E$4&"2%&'&;26%&.$'&;276#!"&5463!2KjKKj   f  \ w@wwwjKKjK"H   ܚ  f   @www   $64'&327/a^ ! ^aaJ@%% 65/ 64'&"2 "/64&"'&476227<ij6j6u%k%~8p8}%%%k%}8p8~%<@% %%  !232"'&76;!"/&76  ($>( J &% $%64/&"'&"2#!"&5463!2ff4-4ff4fw@wwwf4f-f4@www/#5#5'&76 764/&"%#!"&5463!248` # \P\w@www4`8  #@  `\P\`@www)4&#!"273276#!"&5463!2& *f4 'w@www`&')4f*@www%5 64'&"3276'7>332#!"&5463!2`'(wƒa8! ,j.( &w@www`4`*'?_`ze<  bw4/*@www-.  6 $$  (r^aaO(_^aa -"'&763!24&#!"3!26#!"&5463!2yB(( @   w@www]#@##   @ @www -#!"'&7624&#!"3!26#!"&5463!2y((@B@u @   w@www###@  @ @www -'&54764&#!"3!26#!"&5463!2@@####@w@wwwB((@@www`%#"'#"&=46;&7#"&=46;632/.#"!2#!!2#!32>?6#  !"'?_  BCbCaf\ + ~2   }0$  q 90r p r%D p u?#!"&=46;#"&=46;54632'.#"!2#!!546;2D a__ g *`-Uh1    ߫}   $^L  %b+"&=.'&?676032654.'.5467546;2'.#"ǟ B{PDg q%%Q{%P46'-N/B).ĝ 9kC< Q 7>W*_x*%K./58`7E%_ ,-3  cVO2")#,)9;J) "!* #VD,'#/&>AX>++"''&=46;267!"&=463!&+"&=463!2+32Ԫ$   pU9ӑ @/*f o  VRfq f=SE!#"&5!"&=463!5!"&=46;&76;2>76;232#!!2#![       % )   "  Jg Uh BW&WX hU g 84&#!!2#!!2#!+"&=#"&=46;5#"&=46;463!2j@jo g|@~vv u n#467!!3'##467!++"'#+"&'#"&=46;'#"&=46;&76;2!6;2!6;232+32QKt# #FNQo!"դѧ !mY Zga~bm] [o"U+, @h h@@X hh @83H\#5"'#"&+73273&#&+5275363534."#22>4.#2>ut 3NtRP*Ho2 Lo@!R(Ozh=,GID2F 8PuE>.'%&TeQ,jm{+>R{?jJrL6V @`7>wmR1q uWei/rr :Vr $7V4&#"326#"'&76;46;232!5346=#'73#"'&'73267##"&54632BX;4>ID2F +>R{8PuE>.'%&TeQ,jm{?jJrL6 @`rr :Vr3>wmR1q uWei@ \%4&#"326#!"&5463!2+".'&'.5467>767>7>7632!2&%%&&&& &7.' :@$LBWM{#&$h1D!  .I/! Nr&&%%&&&&V?, L=8=9%pEL+%%r@W!<%*',<2(<&L,"r@ \#"&546324&#!"3!26%#!#"'.'.'&'.'.546767>;&%%&&&& &i7qN !/I.  !D1h$&#{MWBL$@: '.&&%%&&&&=XNr%(M&<(2<,'*%<!W@r%%+LEp%9=8=L  +=\d%54#"327354"%###5#5#"'&53327#"'#3632#"'&=4762#3274645"=424'.'&!  7>76#'#3%54'&#"32763##"'&5#327#!"&5463!2BBPJNC'%! B? )#!CC $)  54f"@@ B+,A  A+&+A  ZK35N # J!1331CCC $)w@www2"33FYF~(-&"o4*)$(* (&;;&&:LA3  8334S,;;,WT+<<+T;(\g7x:&&::&&<r%-@www  +=[c}#"'632#542%35!33!3##"'&5#327%54'&#"5#353276%5##"=354'&#"32767654"2 '.'&547>76 3#&'&'3#"'&=47632%#5#"'&53327''RZZ:kid YYY .06 62+YY-06 R[!.'CD''EH$VVX::Y X;:Y fyd/%jG%EC&&CE%O[52. [$C-D..D^^* ly1%=^I86i077S 3 $EWgO%33%OO%35 EEFWt;PP;pt;PP;pqJgTFQ%33&PP%33%R 7>%3!+}'+"&72'&76;2+"'66;2U &  ( P *'eJ."-dZ-n -'74'&+";27&+";276'56#!"&5463!2~} 7e  ۩w@www"  $Q #'!# @www/4'&327$ '.'.4>7>76 "!!jG~GkjGGk[J@&& @lAIddIAllAIddIA@ '5557 ,VWQV.RW=?l%l`~0~#%5!'#3! %% %=#y ?R'UaM|qByy[C#jXAAҷhUHG/?%##"547#3!264&#"3254&+";267#!"&5463!2R܂#-$䵀((((tQQttQvQtn?D~|D?x##))((QttQvQtt2#!"&54634&"2$4&"2ww@ww||||||w@www||||||| !3 37! $$ n6^55^h ^aaM1^aaO *Cg'.676.7>.'$7>&'.'&'? 7%&'.'.'>767$/u5'&$I7ob?K\[zH,1+.@\7':Yi4&67&'&676'.'>7646&' '7>6'&'&7>7#!"&5463!2PR$++'TJXj7-FC',,&C ."!$28 h /" +p^&+3$ i0(w@www+.i6=Bn \C1XR:#"'jj 8Q.cAj57!? "0D$4" P[ & 2@wwwD~"%.5#5>7>;!!76PYhpN!HrD0M C0N#>8\xx: W]oW-X45/%'#.5!5!#"37>#!"&5463!2p>,;$4 5eD+WcEw@wwwK()F ,VhV^9tjA0/@www@#"'&76;46;23   &  ++"&5#"&7632  ^  c  & @#!'&5476!2 &  ^  b '&=!"&=463!546  &    q&8#"'&#"#"5476323276326767q'T1[VA=QQ3qpHih"-bfGw^44O#A?66%CKJA}} !"䒐""A$@C3^q|z=KK?6 lk)  %!%!VVuuu^-m5w}n7M[264&"264&"2"&546+"&=##"&5'#"&5!467'&766276#"&54632    *<;V<<O@-K<&4'>&4.'.'.'.'.'&6&'.'.6767645.'#.'6&'&7676"&'&627>76'&7>'&'&'&'&766'.7>7676>76&6763>6&'&232.'.6'4.?4.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67 \ U7  J#!W! '  " ';%  k )"    '   /7*   I ,6 *&"!   O6* O $.( *.'  .x,  $CN      * 8   7%&&_f& ",VL,G$3@@$+ "  V5 3"  ""#dA++ y0D- %&n 4P'A5j$9E#"c7Y 6" & 8Z(;=I50 ' !!e  R   "+0n?t(-z.'< >R$A"24B@( ~ 9B9, *$        < > ?0D9f?Ae  .(;1.D 4H&.Ct iY% *  7      J  <    W 0%$  ""I! *  D  ,4A'4J" .0f6D4pZ{+*D_wqi;W1G("% %T7F}AG!1#%  JG 3  '.2>Vb%&#'32&'!>?>'&' &>"6&#">&'>26 $$ *b6~#= XP2{&%gx| .W)oOLOsEzG< CK}E $MFD<5+ z^aa$MWM 1>]|YY^D եA<KmE6<" @9I5*^aa>^4./.543232654.#"#".#"32>#"'#"$&547&54632632':XM1h*+D($,/9p`DoC&JV;267676&#!"&=463!267 #!"'&5463!26%8#! &&Z"M>2! ^I 7LRx_@>MN""`=&&*%I},  L7_jj9/%4&#!"3!264&#!"3!26#!"&5463!2  &&&&&&&&19#"'#++"&5#"&5475##"&54763!2"&4628(3- &B..B& -3(8IggI`(8+Ue&.BB.&+8(kk`%-"&5#"&5#"&5#"&5463!2"&4628P8@B\B@B\B@8P8pPPp@`(88(`p.BB.0.BB.(88(Pppͺ!%>&'&#"'.$ $$ ^/(V=$<;$=V).X^aaJ`"(("`J^aa'I4."2>%'%"/'&5%&'&?'&767%476762%6[՛[[՛o ܴ   $ $ " $ $  ՛[[՛[[5` ^ ^ 2` `2 ^ ^ ` 1%#"$54732$%#"$&546$76327668ʴhf킐&^zs,!V[vn) 6<ׂf{z}))Ns3(@ +4&#!"3!2#!"&5463!2#!"&5463!2@&&&f&&&&@&&&&4&&4&@&&&&&&&& `BH+"/##"./#"'.?&5#"&46;'&462!76232!46 `&C6@Bb03eI;:&&&4L4&F Z4&w4) '' 5r&4&&4&&4I3#&/.#./.'&4?63%27>'./&'&7676>767>?>%6})N @2*&@P9A #sGq] #lh<* 46+(  < 5R5"*>%"/ +[>hy  e !/Ui%6&'&676&'&6'.7>%.$76$% $.5476$6?62'.76&&'&676%.76&'..676#"NDQt -okQ//jo_  %&JՂYJA-.-- 9\DtT+X?*<UW3' 26$>>W0 {"F!"E    ^f`$"_]\<`F`FDh>CwlsJ@ ;=?s  :i_^{8+?` ) O`s2RDE58/Kr #"'>7&4$&5mī"#̵$5$"^^W=acE*czk./"&4636$7.'>67.'>65.67>&/>z X^hc^O<q+f$H^XbVS!rȇr?5GD_RV@-FbV=3! G84&3Im<$/6X_D'=NUTL;2KPwtPt=  &ռ ,J~S/#NL,8JsF);??1zIEJpqDIPZXSF6[?5:NR=;.&1 +!"&=!!%!5463!2sQ9Qs***sQNQsBUw wUBFHCCTww%1#"&=!"&=463!54632.  6 $$     ` ?(r^aa    (_^aa%1#!#"'&47632!2.  6 $$   @  ` (r^aa  ?  @  (_^aa/#"'&476324&#!"3!26#!"&5463!2&@& @   w@www& @B@ &  @ @www"&462  >& $$ Ԗ*(r^aaԖԖ (^aa]6#"$54732>%#"'!"&'&7>32'!!!2f:лѪz~u: ((%`V6B^hD%i(]̳ޛ *>6߅r#! 3?^BEa߀#9#36'&632#"'&'&63232#!"&5463!2 Q,&U #+' ;il4L 92<D`w@www`9ܩ6ɽ ]`C477&@wwwD+"&5#"'&=4?5#"'&=4?546;2%6%66546;2  wwwwcB G]B Gty]ty #3C#!+"&5!"&=463!46;2!24&#!"3!26#!"&5463!2@`@`^BB^^B@B^www@w@`@`2@B^^BB^^ww@w'/?P+5#"&547.467&546;532!764'!"+32#323!&ln@ :MM: @nY*Yz--zY*55QDDU9pY-`]]`.X /2I$ t@@/!!/@@3,$,3$p$00&*0&& !P@RV2#"&/#"&/#"&546?#"&546?'&54632%'&54632763276%>S]8T;/M77T7%>ww@ww!"5bBBb./ * 8(@(87)(8=%/' #?w@www#~$EE y &L(88e):8(%O r    O?GQaq47&67>&&'&67>&"$32#"#"'654  $&6 $6&$ CoL.*K  Px.* iSƓ i 7J ?~pi{_Я;lLUZ=刈刈_t'<Z :!   @! j`Q7  $ky, Rfk*4LlL=Z=刈&$&546$7%7&'5>]5%w&P?zrSF!| &0 ##!"&5#5!3!3!3!32!546;2!5463) );));;))&&&@@&&&  6 $&727"'%+"'&7&54767%&4762֬>4P t+8?::  ::A W` `EvEEvE<."e$IE&O &EI&{h.`m"&#"&'327>73271[ >+)@ (]:2+D?*%Zx/658:@#N C= E(oE=W'c:o0a%4.'&#"32>4.#"32676!##"&'&54676%.547#"&5467>'9C!5goS6/Kce3:k[7u">j@*Q.+=Y4%Q5pKL1FE1@Z[@1G렄:$YJ .H?L0$/. 0$8];8\;)4^;}R'!;e.ggR4!8HX?ZHsG;@"$ECPN[RzsS`;HQ.R)A)(-R6B@"N^ '&76232762$"&5462"&46274&"&'264&#"'&&#"32$54'>$ $&6$ G>>0yx14J55J5J44J5Fd$?4J55%6E#42F%$fLlLq>>11J44%&4Z%44J54R1F$Z-%45J521Z%F1#:ʎ 9LlL#Qa"'&7622762%"&5462"&546274&#"&'73264&#"'&&#"32654'>#!"&5463!2 55 **.>.-@-R.>.-@-<+*q6- -- 0OpoOxzRrqP6z~{{Prr^aa]054&"#"&5!2654632!#"&57265&'&#".'&'#"&5467%&4>7>3263232654.547'654'63277.'.*#">7?67>?>32#"'7'>3'>3235?KcgA+![,7*  2(-#=  /~[(D?G  |,)"# +)O8,+'6 y{=@0mI#938OAE` -  )y_/FwaH8j7=7?%a % %!?)L J 9=5]~pj  %(1$",I  $@((  +!.S -L__$'-9L 5V+ 6 T+6.8- $ 0 + t |S 16]&#"'&#"67>76'&'&#"67>32764.#"#.32>67>7 $&54>7>7>7rJ@ "kb2)W+ ,5/1   #   Z -!$IOXp7sLCF9vz NAG#/ 5|Հ';RKR/J#=$,9,+$UCS7'2"1  ! / ,   /--ST(::(ep4AM@=I>".)xΤlsY|qK@ %(YQ&N EHv~<Zx'#"&5467&6?2?'&"/.7.546326#"&'&/7264/7'764&"'?>>32.AUpIUxYE.A %%%h% %hJ%D,FZxULs TgxUJrVD %hJ%@/LefL.C %Jh%CV sNUxϠ@.FZyUHpVA %h&%% %Ji%CWpIUybJ/Uy^G,D %Jh%@U sMt UC %hJ%C-KfyEX[_gj&/&'.''67>7>7&'&'&'>76763>7>#&'&'767672'%'7'+"&'&546323267>7%#"'4'6767672,32,+DCCQLDf' % :/d B 4@ }  &!0$?Jfdf-.=6(:!TO? !IG_U% . j+.=; 5gN_X "  ##  292Q41   *6nA;| BS N.  %1$ 6 #nk^ '7GWgw2+"&5463#!"&5463!254&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26#"&=! B^^BB^^B:FjB^8((`( `(8^BB^^B@B^"vEj^B(8(`(8(/?O_o/?2#!"&5463;26=4&+";26=4&+";26=4&+";26=4&+"54&+";2654&+";2654&+";2654&+";2654&+";2654&#!"3!2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";2654&+";26@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@`% "&5#"&5&462!762$"&462B\B@B\B8PpP8.BB..BB.8$P88P広3CQ#".54>32#".546322#"&#"#"54>%".54>32%2#"&54> &X=L|<&X=M{2r_-$$-_rUU%&&5%ő'- "'.546762@FF$@B@$.&,&.]]|q#<<#(BB B%'-%'-'%'-"'%&'"'%.5467%467%62@ll@ll,@GG&!@@@@@@!&+#+#6#+$*`:p:px p=`$>>$&@&@ @&p@ &.A!!"!&2673!"5432!%!254#!5!2654#!%!2#!8Zp?vdΊens6(N[RWu?rt1SrF|iZ@7މoy2IMC~[R yK{T:%,AGK2#!"&5463!!2654'654.#532#532"&5!654&#"327#2#>!!ww@ww~uk'JTMwa| DH> I1q Fj?w@wwwsq*4p9O*¸Z^qh LE "(nz8B M'?"&4624&#"'.'324&#"3267##"&/632632.ʏhhMALR vGhг~~K „yO^   ʏʏВ*LM@!שwwȍde)qrOPqȦs:03=7'.?67'67%'>&%'7%7./6D\$>  "N,?a0#O 1G9'/P(1#00  ($=!F "9|]"RE<6 'o9%8J$\ :\HiTe<?}V#oj? d,6%N#" HlSVY]C =@C4&"2!.#!"4&"2+"&=!"&=#"&546;>3!232^^^Y ^^^`pppp`]ibbi]~^^^e^^^PppPPppP]^^]3;EM2+"&=!"&=#"&546;>;5463!232264&"!.#!"264&" ]`pppp`]ibbi^^^dY !^^^]@PppP@@PppP@]^^] ^^^e^^^ 3$#!#!"&5467!"&47#"&47#"&4762++&2 $$ 2&&&4&&Z4&&##&&4&4&44&m4&m+DP4'&#"32763232674'&!"32763 3264'&$#"32763232> $$ g* o`#ə0#z#l(~̠) -g+^aaF s" +g (* 3#!| #/IK/%*%D= )[^aa !!!'!!77!,/,-a/G t%/;<HTbcq%7.#"32%74'&"32765"/7627#"5'7432#"/7632#"5'7432#"&5'74632 #"/6327#"/6327#"/46321"&/462"&/>21"&/567632#!.547632632  *     X    ^  `    ^  b  c   fu U`59u  4J   l~ ~ F 2    m | O,           ru| u  " )9 $7 $&= $7 $&= $7 $&=  $&=46w`ww`ww`wb`VTEvEEvETVTEvEEvET*VTEvEEvET*EvEEvEEvEEv#^cu#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&54&5&'67.'&'&#3274(8((88((`x c`(8!3;:A0?ݫY   ^U 47D$    74U3I  |L38wtL0`((88(@(8(D 9 8(Q1&(!;  (g- Up~R2(/{E(Xz*Z%(i6CmVo8 #Q#!"&5463!2!&'&!"&5!3367653335!3#'.'##'&'35(8((88((`x c`(8iFFZcrcZ`((88(@(8(D 9 8(kk" kkJ ! k#S#!"&5463!2!&'&!"&5!%!5#7>;#!5#35!3#&'&/35!3(8((88((`x c`(8-Kg kL#DCJg  jLD`((88(@(8(D 9 8(jj jjkk kk#8C#!"&5463!2!&'&!"&5!%!5#5327>54&'&#!3#32(8((88((`x c`(8 G]L*COJ?0R\wx48>`((88(@(8(D 9 8(jjRQxk !RY#*2#!"&5463!2!&'&!"&5!!57"&462(8((88((`x c`(8Pppp`((88(@(8(D 9 8(ppp  #*7JR5#5#5#5##!"&5463!2!&'&!"&5##5!"&54765332264&"<(8((88((`x c`(8kޑcO"jKKjK`((88(@(8(D 9 8(SmmS?M&4&&4#9L^#!"&5463!2!&'&!"&5!#"/#"&=46;76276'.'2764'.(8((88((`x c`(8 6ddWW6&44`((88(@(8(D 9 8(. G5{{5]]$5995#3C#!"&5463!2!&'&!"&5!2#!"&5463#"'5632(8((88((`x c`(84LL44LL4l  `((88(@(8(D 9 8(L44LL44L  Z #7K[#!"&5463!2!&'&!"&5!>&'&7!/.?'&6?6.7>'(8((88((`x c`(8` 3  3  3  3 v  ?  `((88(@(8(D 9 8( & & - & &  ?   'j6#'. '!67&54632".'654&#"32eaAɢ/PRAids`WXyzOvд:C;A:25@Ң>-05rn`H( ' gQWZc[ -%7' %'-'% %"'&54762[3[MN 3",""3,3"ong$߆]gn$+) ")")" x#Z#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"oGn\ u_MK'̨|g? CM7MM5,QAAIQqAy{b& BL4PJ9+OABIRo?z.z n6'+s:zcIAC65D*DRRD*wya$, @B39E*DRRD*'/7  $&6$ 6277&47' 7'"' 6& 6'lLRRZB|RR>dZZLlLZRR«Z&>«|R! $&54$7 >54'_ff_L-ff`- c6721>?>././76&/7>?>?>./&31#"$&(@8!IH2hM>'  )-* h'N'!'Og,R"/!YQG54'63&547#5#"=3235#47##6323#324&"26%#!"&5463!2F]kbf$JMM$&N92Z2&`9UW=N9:PO;:dhe\=R +)&')-S99kJ<)UmQ/-Ya^"![Y'(<`X;_L6#)|tWW:;X  #'#3#!"&5463!2) p*xeשw@www0,\8@www9I#"'#"&'&>767&5462#"'.7>32>4."&'&54>32JrO<3>5-&FD(=Gq@C$39aLL²L4 &) @]v q#CO!~󿵂72765'./"#"&'&5 }1R<2" 7MW'$  ;IS7@5sQ@@)R#DvTA ; 0x I)!:> +)C 6.> !-I[4&#"324&#"3264&#"324&#"326&#"#".'7$4$32'#"$&6$32D2)+BB+)3(--(31)+BB+)4'--'4'#!0>R HMŰ9ou7ǖD䣣 R23('3_,--,R23('3_,--,NJ ?uWm%#"'%#"'.5 %&'&7632! ; `u%"(!]#c)(   #"'%#"'.5%&'&76 !  (%##fP_"(!)'+ʼn4I#"$'&6?6332>4.#"#!"&54766$32#!"&=46;46;2z䜬m IwhQQhbF*@&('k@z   _hQнQGB'(&*eozΘ@@`  >. $$ ffff^aafff^aa>"&#"#"&54>7654'&#!"#"&#"#"&54>765'46.'."&54632326323!27654'.5463232632,-,,",:! %]& %@2(/.+*)6! <.$..**"+8#  #Q3,,++#-:#"$$ /:yuxv)%$ /?CG%!5%2#!"&5463!5#5!52#!"&54632#!"&5463#5!5`&&&& &&&&&&&&@&&&&&&&&&&&&%2 &547%#"&632%&546 #"'6\~~\h ~\h\ V V VV%5$4&#"'64'73264&"&#"3272#!"&5463!2}XT==TX}}~>SX}}XS>~}w@www~:xx:~}}Xx9}}9xX}@www/>LXds.327>76 $&6$32762#"/&4762"/&47626+"&46;2'"&=462#"'&4?62E0l,  *"T.D@Yooo@5D [  Z  Z  [ ``[ Z  2 ,l0 (T" .D5@oooY@D, Z  [  [  Z ``EZ  [ 5%!  $&66='&'%77'727'%amlLmf?55>fFtuutFLlLHYC L||L Y˄(E''E*( /?IYiy%+"&=46;2+"&=46;2+"&=46;2+"&=46;2%"&=!#+"&=46;2+"&=46;2+"&=46;2+"&=46;2!54!54>$ +"&=46;2#!"&=@&&@3P > P3&&rrr&&rrr he 4LKM:%%:MKL4WT&&%/9##!"&563!!#!"&5"&5!2!5463!2!5463!2&&&&&&  &&&i@&&@&7'#5&?626J%o;j|/&jJ%p&`Jj&p/|jţ%Jk%o% :g"&5462#"&546324&#!"263662>7'&75.''&'&&'&6463!276i~ZYYZ~@OS;+[G[3YUD#o?D&G3I=JyTkBuhNV!WOhuAiSy*'^CC^'*SwwSTvvTSwwSTvvWID\_"[ gq# /3qFr2/ $rg%4 HffHJ4d#!#7!!7!#5!VFNrmNNN N!Q +?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76 '6# <;11x# *# F-T93%/#0vNZ;:8)M:( &C.J}2 %0  ^*  JF &7'X"2LDM" +6 M2+'BQfXV#+] #' L/(eB9  #,8!!!5!!5!5!5!5#26%!!26#!"&5!5&4& &pPPp@@&&@!&@PppP@*  9Q$"&54627"."#"&547>2"'.#"#"&5476$ "'&$ #"&5476$ (}R}hLK NN Ud: xx 8    ,, |2222 MXXM ic,>>,   ̺  '/7?KSck{4&"2$4&"24&"24&"24&"24&"24&"24&"24&"264&"24&#!"3!264&"2#!"&5463!2KjKKjKjKKjKjKKjKKjKKjKjKKjKjKKjKKjKKjKjKKjKLhLLhLKjKKj&&&&KjKKjL44LL44L5jKKjKKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjKjKKjK4LL44LLjKKjK&&&&jKKjK4LL44LL'E!#"+"&7>76;7676767>'#'"#!"&7>3!2W",&7' #$ &gpf5 O.PqZZdS -V"0kqzTxD!!8p8%'i_F?;kR(` !&)d.<\.'.>%#"'.7>.'&67632&'6'&' #"'.766.'&67632Z &+\cc:>'D> 6KD3W6,9(<*0-?")/SW7.Crb  :+OIX3'#C3:@ #*"-A%,1U=}AQfO$"|'"S*`H(:UܳJ?27sZy%+A07C~Ӗ5A"3 >IY#6?>7&#!%'.'33#&#"#"/3674'.54636%#"3733#!"&5463!24  : @7vH%hEP{0&<'VFJo1,1.F6A#L44LL44L"% 7x'6 O\JYFw~v^fH$ ! "xdjD"!6`J4LL44LL $1Ol-#"326%356.#"#"326%4#"326%3#7#'#3%#7#"&546324>54#"47632&#"'"'473254&'&54323#327#"'47673#327#"546327&#7673>7&#"327#"&54632#7#"&54632654#"47632&#7673>73#7#"&54632.#"#&'#67&#"327&'3673326#!"&5463!2 />  0@[W,8 G'"5,Q4/&4/ $&J (W" +Tl +7o _7*#) 83 ( -5G8 .'3/$&I8 48+5%7%{,2,rr,2,x-2.jj.2-xL44LL44L[ < J 2)(*(8$e  '+ , 1)H/ 'H4/// ,~i6_7G*''4fE!%97+" ;=4FYqO" '+ , &2hh_ ,0(5N(ntggtnno__on4LL44LL  BWbjq}+532%+5324&+32763#4&'.546327&#"#"'3265#"&546325&#"32 !264&"2%#'#735#535#535#3'654&+353#!"&5463!29$<=$@?SdO__J-<AA@)7")9,<$.%0*,G3@%)1??.+&((JgfJ*A!&jjjGZYGиwsswPiL>8aA !M77MM77M3! 4erJ]&3YM(, ,%7(#)  ,(@=)M%A20C&Mee(X0&ĖjjjV 8Z8J9N/4$ 8NN88NN  #&:O[ $?b3'7'#3#%54+32%4+324+323'%#5#'#'##337"&##'!!732%#3#3##!"&53733537!572!56373353#'#'#"5#&#!'#'#463!2#"5#"5!&+&+'!!7353273532!2732%#54&+#32#46.+#2#3#3##+53254&".546;#"67+53254&.546;#"#'#'##"54;"&;7335wY-AJF=c(TS)!*RQ+*RQ+Y,B^9^Ft`njUM ') ~PSPRm٘M77Mo7q @)U 8"E(1++NM77Mx378D62W74;9<-A"EA0:A F@1:ؗBf~~""12"4(w$#11#@}}!%+%5(v$:O\zK?* $\amcrVlOO176Nn23266&+"&#"3267;24&+"'&+";27%4&+";2?>23266&+"&#"3267;254+";27#76;2#!"&5463!23%#2%%,,  _3$$2%%M>AL Vb5)LDHeE:< EM j,K'-R M ~M>AR  Vb5)LEHeE:< E J ABI*'! ($rL44LL44Lv%1 %3!x*k $2 %3!;5h n a !(lI;F   rp p8;5h t a !(lI;F ` #k 4LL44LL  2HW[lt#"'5632#6324&'.54327&#"#"&'32767#533275#"=5&#"'#36323#4'&#"'#7532764&"24'&#"327'#"'&'36#!"&5463!2=!9n23BD$ &:BCRM.0AC'0RH`Q03'`.>,&I / * / 8/n-(G@5$ S3=,.B..B02^`o?7je;9G+L44LL44LyE%# Vb;A !p &'F:Aq)%)#orgT$ v2 8)2z948/{ 8AB..B/q?@r<7(g/4LL44LL ?#!"&'24#"&54"&/&6?&5>547&54626=L4@ԕ;U g3 T 2RX='8P8|5 4Ljj U;Ig@   `  "*\(88(]k  &N4#"&54"3 .#"#!"&'7!&7&/&6?&5>547&54626;U gIm*]Z0L4@ԕ=o=CT T 2RX='8P8|5  U;IgXu?bl3@4Ljja`   `  "*\(88(]k/7[%4&+";26%4&+";26%4&+";26!'&'!+#!"&5#"&=463!7>3!2!2@@@@@@0 o`^BB^`5FN(@(NF5@@@u  @LSyuS@%44%,<H#"5432+"=4&#"326=46;2  >. $$ ~Isy9"SgR8vHD w ffff^aam2N+ )H-mF+10*F +fff^aab4&#"32>"#"'&'#"&54632?>;23>5!"3276#"$&6$3 k^?zb=ka`U4J{K_/4^W&  vx :XB0܂ff ) fzzXlz=lapzob35!2BX G@8  ' '=vN$\ff  1 SZz8zX#("/+'547'&4?6276 'D^h  i%5@%[i  h]@]h  i%@5%[i  h^@@)2#"&5476#".5327>OFi-ay~\~;'S{s:D8>)AJfh]F?X{[TC6LlG]v2'"%B];$+l|%!2>7>232>7>322>7>32"&'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52-P&+F) $P.-P$'#+&PZP&+#"+&P-#) $P-.P$(#+$P.-P$'#+&P-.P$+#pP@@PpH85K"&ZH85K"&ZH85K"&Z@Pp@@@pMSK5, :&LMSK5, :&LMSK5, :& !!3 ! @@@  #"$$3!!2"jaѻxlalxaaj!!3/"/'62'&63!2'y  `I  yMy `I y'[`#".'.#"32767!"&54>3232654.'&546#&'5&#" 4$%Eӕ;iNL291 ;XxR`f՝Q8TWiWgW:;*:`Qs&?RWXJ8 oNU0 J1F@#) [%6_POQiX(o`_?5"$iʗ\&>bds6aP*< -;iFn* -c1BWg4'.'4.54632#7&'.#"#"'.#"32767'#"&54632326#!"&5463!2#$( 1$6]' !E3P|ad(2S;aF9'EOSej]m] <*rYshpt.#)$78L*khw@wwwB % $/$G6 sP`X):F/fwH1pdlqnmPHuikw_:[9D'@www34."2>$4.#!!2>#!".>3!2QнQQнQQh~wwhfffнQQнQQнQZZQffff#>3!2#!".2>4."fffнQQнQQffffQнQQн ,\!"&?&#"326'3&'!&#"#"'  5467'+#"327#"&463!!'#"&463!2632(#AHs9q ci<= #]$ KjKKjKKjKKjH#j#H&&&KjKKjKg V i jKKjKKjKKjK ..n(([5KK55KK5[poNv<+#"'#"&546;&546$32322$B$22$$*$22$Xڭӯ$22$tX'hs2$ϧkc$22$1c$2F33F3VVT2#$2ԱVT2#$2g#2UU݃ 2$#2UU1݃2 ,u54#"67.632&#"32654'.#"32764.'&$#"7232&'##"&54732654&#"467&5463254632>32#"'&ru&9%" *#͟O%GR=O&^opC8pP*bY _#$N Pb@6)?+0L15 "4$.Es  5IQ"!@ h "Y7e|J>ziPeneHbIlF>^]@n*9 6[_3#"&54632#.#"32%3#"&54632#.#"326%4&'.'&! ! 7>7>! =39? 6'_ >29? 5'17m-VU--,bW.뮠@Fyu0HC$뮠@Fyu0HC$L= ?? <=! A <`;+"&54&#!+"&5463!2#!"&546;2!26546;2pЇ0pp@Ipp>Sc+"&=46;254&+"&+";2=46;2;2=46;2;2%54&#!";2=;26#!"&5463!2A5DD5A7^6a7MB55B7?5B~```0`rr5A44A5v5AA5f*A``0` !!!! #!"&5463!2ړ7H7jv@vvv':@vvvMUdkpu{#"'!"'!#"&547.547.54674&547&54632!62!632!#!6227'!%!"67'#77!63!!7357/7'%# %'3/&=&' 5#?&547 6!p4q"""6" 'h*[ |*,@?wAUMpV@˝)Ϳw7({*U%K6=0(M "! O dX$k !! ! b [TDOi @6bxBAݽ5  ɝ:J +3,p x1Fi (R 463!#!"&5%'4&#!"3`а@..@A-XfB$.BB..C} )&54$32&'%&&'67"w`Rd]G{o]>p6sc(@wgmJPAjyYWa͊AZq{HZ:<dv\gx>2ATKn+;"'&#"&#"+6!263 2&#"&#">3267&#">326e~└Ȁ|隚Ν|ū|iyZʬ7Ӕްr|uѥx9[[9jj9ANN+,#ll"BS32fk[/?\%4&+";26%4&+";26%4&+";26%4&+";26%#!"&5467&546326$32]]eeeeee$~i qfN-*#Sjt2"'qCB8!'> !%)-159=AEIMQUY]agkosw{! %! 5!#5#5#5#5#57777????#5!#5!#5!#5!#5!#5!#5!#5#537#5!#5!#5!#5!#5!#55#535353535353%"&546326#"'#32>54.&54>3237.#"Q%%%%%%%%%?iiihOiixiiyiixiiArssrrssr%sssrrssNs%%%%%%%%%%'32#".543232654&#"#"&54654&#"#"&547>326ڞUzrhgrxSПdU 7#"&463!2!2&&4&&&&4&KjKKjKjKKj &&&%&& &&4&&&&4&&&5jKKjKKjKKjK%z 0&4&&3D7&4& %&'S4&"4&"'&"27"&462"&462!2#!"&54>7#"&463!2!2&4&4&4&4KjKKjKjKKj &&&%&& &&4&%&&ے&4"jKKjKKjKKjK%z 0&4&&3D7&4& %& & !'! !%!!!!%"'.763!2o]FooZY@:@!!gf//I62'"/"/"/"/"/"/"/7762762762762762762%"/77627&6?35!5!!3762762'"/"/"/"/"/"/%5#5!4ZSS6SS4SS4SS4SS4SS4SS4ZSS4SS4SS4SS4SS4SS4S-4ZSS4S@4SS4ZSS6SS4SS4SS4SS4SS4S@ZSSSSSSSSSSSSSSZSSSSSSSSSSSSSyZRRR@%:= :+: =RRZSSSSSSSSSSSSSCv!/&'&#""'&#" 32>;232>7>76#!"&54>7'3&547&547>763226323@``` VFaaFV      $. .$     yy .Q5ZE$ ,l*%>>%*>*98(QO! L\p'.'&67'#!##"327&+"&46;2!3'#"&7>;276;2+6267!"'&7&#"(6&#"#"' Dg OOG`n%ELL{@&&Nc,sU&&!Fre&&ss#/,<= #]gL oGkP'r-n&4&2-ir&&?o  4 _5OW! .54>762>7.'.7>+#!"&5#"&5463!2"&462{{BtxG,:`9(0bԿb0(9`:,GxtB&@&&@&K55K`?e==e?1O6# ,  #$  , #6OO&&&&5KK?!"'&'!2673267!'. ."!&54632>321 4q#F""8'go#- #,"tYg>oP$$Po> Zep#)R0+I@$$@I++332++"&=#"&=46;.7>76$  @ ᅪ*r@@r'/2+"&5".4>32!"&=463  &@~[՛[[u˜~gr&`u՛[[՛[~~@r=E32++"&=#"&=46;5&547&'&6;22676;2  >``@``ٱ?E,,=?rH@``@GݧH`jjrBJ463!2+"&=32++"&=#"&=46;5.7676%#"&5   &@~``@``  vXr&@``@+BF`rks463!2+"&=32++"&=#"&=46;5&547'/.?'+"&5463!2+7>6 %#"&5   &@~``@``~4e  0  io@& jV  0  Z9r&@``@Gɞ5o , sp &@k^ , c8~~`r 8>KR_32++"&=!+"&=#"&=46;.767666'27&547&#"&'2#" @@ 'Ϋ'sggsww@sgg@@-ssʃl99OOr99FP^l463!2+"&=$'.7>76%#"&=463!2+"&=%#"&54'>%&547.#"254&' &@L?CuГP vY &@;"ޥ5݇ޥ5`&_ڿgwBF@&J_ s&&?%x%xJP\h463!2+"&='32++"&=#"&=46;5.7676632%#"&56'327&7&#"2#" &@L? ߺu``@``} ຒɞueeu9uee&_"|N@``@""|a~lo99r9@9;C2+"&5"/".4>327'&4?627!"&=463  &@Ռ .  N~[՛[[u˜N .  gr&`֌  . Ou՛[[՛[~N  . @r9A'.'&675#"&=46;5"/&4?62"/32+  '֪ \  . 4 .  \r|ݧ憛@\ .    . \@r9A"/&4?!+"&=##"$7>763546;2!'&4?62  m  - @ݧ憛@& -  @rm4 -  ٮ*   - r+"&5&54>2  @[՛[rdGu՛[[r  ".4>2r[՛[[՛r5՛[[՛[[$2#!37#546375&#"#3!"&5463#22#y/Dz?s!#22#2##2S88 2#V#2L4>32#"&''&5467&5463232>54&#"#"'.Kg&RvgD $ *2% +Z hP=DXZ@7^?1 ۰3O+lh4`M@8'+c+RI2 \ZAhSQ>B>?S2Vhui/,R0+ ZRkmz+>Q2#"'.'&756763232322>4."7 #"'&546n/9bLHG2E"D8_ pdddxO"2xxê_lx2X  !+'5>-pkW[C I I@50Oddd˥Mhfxx^ә #'+/7!5!!5!4&"2!5!4&"24&"2!!! 8P88P 8P88P88P88PP88P8 P88P88P88P8 +N &6 !2#!+"&5!"&=463!46;23!#!"&54>32267632#"_>@`     `  L4Dgy 6Fe=OOU4L>   ` `  4L2y5eud_C(====`L43V &6 #"/#"/&54?'&54?6327632#!"&54>32 7632_>     %%Sy 6Fe=J%>     %65%Sy5eud_C(zz.!6%$!2!!!46;24&"2!54&#!"&&&@ԖV@&&@&&ԖԖ@&3!!! !5!'!53!! #7IeeI7CzCl@@@#2#!"&?.54$3264&"!@մppp((ppp#+/2#!"&?.54$3264&"!264&"!@մ^^^@^^^@((^^^^^^'%!53###3!532654&+5!3!#"3~E,,EG,+ob'q,5,'  #'#3!) p*xe0,\8L #/DM%2<GQ^lw &'&676676&'&7654&'&&546763"#"'3264&7.>&'%'.767&7667&766747665"'.'&767>3>7&'&'47.'.7676767&76767.'$73>?>67673>#6766666&'&6767.'"'276&67&54&&671&'6757>7&"2654&57>&>&'5#%67>76$7&?5.''&'&'#'""#''&'&'&'65.'&6767.'#%&''&'#2%676765&'&'&7&5&'6.7>&5R4&5S9 W"-J0(/r V"-J0(.)#"6&4pOPppc|o}vQ[60XQW1V  # 5X N"& . ) D>q J:102(z/=f*4!> S5b!%  (!$p8~5..:5I  ~T 4~9p# ! ) & ?()5F 1   d%{v*: @e s|D1d {:*dAA|oYk'&<tuut&v HCXXTR;w 71™  Z*&' 1  9? . $Gv 5k65P.$.`aasa``Z9k'9؋ӗa-*Gl|Me_]`F& OܽsDD!/+``aa``a154&'"&#!!26#!"&5463!2    iLCly5)*Hcelzzlec0hb,,beIVB9@RB9J_L44LL44L44%2"4:I;p!q4bb3p (P`t`P(6EC.7BI64LL44LL  .>$4&'6#".54$ 4.#!"3!2>#!"&5463!2Zjbjj[wٝ]>oӰٯ*-oXL44LL44L')꽽)J)]wL`ֺ۪e4LL44LL;4&#!"3!26#!"&5463!2#54&#!";#"&5463!2  @ ^BB^^B@B^  B^^B@B^`@  MB^^B@B^^>  ^B@B^^5=Um ! !!2#!"&=463!.'!"&=463!>2!2#264&"".54>762".54>762?(``(?b|b?B//B/]]FrdhLhdrF]]FrdhLhdrF@@@(?@@ ?(@9GG9@/B//BaItB!!BtI Ѷ!!ь ItB!!BtI Ѷ!!ь-M32#!"&=46;7&#"&=463!2#>5!!4.'.46ՠ`@`ՠ`MsFFsMMsFFsMojjo@@jj@@<!(!!(!-3?32#!"&=46;7&#"&=463!2+!!64.'#ՠ`@`ՠ`  DqLLqDojjo@@jj@@B>=C-3;32#!"&=46;7&#"&=463!2+!!6.'#ՠ`@`ՠ`UVU96gg6ojjo@@jj@@β**ɍ-G32#!"&=46;7&#"&=463!2#>5!!&'.46ՠ`@`ՠ`MsFFsMkkojjo@@jj@@<!(!33!(!9I2#!"&=4637>7.'!2#!"&=463@b":1P4Y,++,Y4P1:"":1P4Y,++,Y4P1:"b@@@7hVX@K-AA-K@XVh77hVX@K-AA-K@XVh7Aj"#54&#"'54&#"3!26=476=4&#"#54&'&#"#54&'&'2632632#!"&5&=4632>3265K @0.B @0.B#6'&& l @0.B 2' .B A2TA9B;h" d mpPTlLc _4.HK5]0CB.S0CB./#'?&&)$$)0CB. }(AB.z3M2"61d39L/PpuT(Ifc_E`1X"#4&"'&#"3!267654&"#4&"#4&26326#!"&'&5463246326\B B\B&@5K&@"6LB\B B\B sciL}QP%&#"!"3!754?27%>54&#!26=31?>Ijjq,J[j.-tjlV\$B.R1?@B.+?2`$v5K-%5KK5.olRIS+6K5̈$B\B 94E.&ʀ15uE& ԖPjjdXUGJ7!.B P2.B %2@ 7K5(B@KjKj?+fU E,5K~!1.>F.F,Q5*H$b2#!"&=%!"&=463!7!"&'&=4634'&#!">3!!"3!32#!"3!23!26=n$7654&#"#654&#"#.!"'.54632&5467>32>3200?t ='/@H@"+4K8"*!4dtB/&> c@0&=  =_JUD29i1"07 {x\YSgSSW]|t eyD0&0D/  I4C+) t .B3%h#/B0&&03|&p>i +#] WsgQT\QglU ]#-39oK_3[_cg"'&#"3!2676=4&"#54&#"#54&#"#4&'2632632632#!"&'&5463246#!#!#5K)B4J&@#\8P8 @0.B J65K J6k cJ/4qG^\hB2.1!~K5y?^\Vljt-.j[J,qjjI7$?1R.B+.B$`2?gvEo.5KK5%-K6+SIR[&.E49 B\B$5KG#!+"&5!"&=463!2+"&' +"' +"'&5>;2>76;2Y    M .x - N     u  , u ?  LW   #  *:J4'&+326+"'#+"&5463!2  $6& $&6$ UbUI-uu,uuڎLlLAX!Jmf\$ 6uuu,KLlL-[k{276/&'&#"&5463276?6'.#"!276/&'&#"&5463276?6'.#"  $6&  $&6]h - %Lb`J%E 5 ,5R- h - %Lb`J%E 5 ,5R-'uu,uulL/hR    dMLc  NhR   dMLc  N1uuu,LlL@  ' 7 '7 ``H ``H !``H ```H` '%  7' 7'7 ' $&6$ X`(W:,:X`(WLLlLX`(W:BX`(XLlL $ %/9ES[#"&54632$"&4624&"26$4&#"2%#"&462$#"&4632#"32&! 24>  !#"&'.'#"$547.'!6$327&'77'&77N77N'qqqqqPOrqEsttsst}||}uԙ[WQ~,> nP/R U P酛n >,m'77'&77N77N6^Orqqqqqqt棣棣(~|| on[usј^~33pc8{y%cq33dqpd L 54 "2654"'&'"/&477&'.67>326?>< x ,  (-'sI  VCV  Hr'-(  $0@!BHp9[%&!@0$u  ]\\]-$)!IHV D V HI!)$-#36>N"&462."&/.2?2?64/67>&  #!"&5463!2]]]3 $; &|v;$ (CS31 =rM= 4TC(G zw@www]]]($-;,540= sL =45,; @www(2#"$&546327654&#" &#"AZ\@/#%E1/##.1E$![A懇@@\!#21E!6!E13"|! gL&5&'.#4&5!67&'&'5676&'6452>3.'5A5RV[t,G'Q4}-&r! G;>!g12sV&2:#;d=*'5E2/..FD֕71$1>2F!&12,@K r#"&5462>%.#"'&#"#"'>54#".'7654&&5473254&/>7326/632327?&$  $6 $&6$ !&"2&^ u_x^h ;J݃HJǭ qE Dm! M G?̯' %o8 9U(F(ߎLlL&!&!SEm|[n{[<ɪ "p C Di% (K HCέ  pC B m8 @Kނ  HF(LlL "*6%&6$ 7&$5%%6'$2"&4}x3nQH:dΏX e8z' li=! 7So?vM '&7>>7'7>''>76.'6'El:Fg r *t6K3U Z83P)3^I%=9 )<}Jk+C-Wd &U-TE+]Qr-< Q#0 C+M8 3':$ _Q =+If5[ˮ&&SGZoMkܬc#2>.""$&6$32}L**L}}L**Lʸֶdd*~;;~\~~~ޚBPBdd N.'>!4&#"#6.!3267!!"''.>75>$732̏Ozv{kgw"+TgEۗE0[CWoG[SL#WN,:vDx93!"&546)2+6'.'.67>76%&F8$.39_0DD40DD0+*M7{L *="# U<-M93#D@U8vk_Y [hD00DD00Dce-JF1 BDN&)@ /1 d 6/1'.#"932>74.#"932>7#"."#".5#".5332654&#"#!!2>22>232>32o'Ve-0F  F0-eW% F0-eW%'Ve-0F 0XWD_J-'F]KAuL9!=MtCGvO>"bMOohV.(, fZC&\|h=*1Hz^I((H_H\V,'L0+A56@+0M%*5A+0M%'L0+@NEsH0EF00EF0-?F1%6810A>A+7iQPq "GY):;)2GH22GH22GH2Ft>t%6#".'.>%6%&7>'.#*.'&676./&'.54>754'&#"%4>327676= >vwd" l "3 /!,+ j2.|%& (N &wh>8X}xc2"W<4<,Z~fdaA`FBIT;hmA<7QC1>[u])  u1V(k1S) - 0 B2* %M ;W(0S[T]I) A 5%R7&&=,Xq&&@X,LΒw%%;#!"&5463!546;2!2!+"&52#!"/&4?63!5! (&&@&&(&&@&&( (  &&@&&@&&&&  #''%#"'&54676%6%% hh @` !   !    #52#"&5476!2#"&5476!2#"'&546        @  @  @   84&"2$4&"2$4&"2#"'&'&7>7.54$ KjKKjKjKKjKjKKjdne4" %!KjKKjKKjKKjKKjKKjK.٫8  !%00C'Z'.W"&462"&462"&462 6?32$6&#"'#"&'5&6&>7>7&54>$ KjKKjKjKKjKjKKjhяW.{+9E=cQdFK1A  0) LlLjKKjKKjKKjKKjKKjKpJ2`[Q?l&٫C58.H(Yee    Y'w(O'RK$#"&#"'>7676327676#" b,XHUmM.U_t,7A3ge z9@xSaQBLb( VU  !!!==w)@T!!77'7'#'#274.#"#32!5'.>537#"6=4>5'.465! KkkK _5 5 #BH1`L I& v6S F!Sr99rS!`` /7K%s}H XV  P V  e  VpdQ*d    L     @ d  %RPBp<$H<TfT H R , D x 6 \ DLX*(2^n0|bX*Z >n@jDH. 4 n !>:>>?|@@>@xAVABBBBCRCDE:FFxFGVGHZHIJIhIIIIJ(JFJdJKKVKLpLMfMNNNOpOPPfPQZQQRRvRTUVRVW W8WWXXhXYY*YTY~YYZ>Z|ZZ[R[\\<\\]@]]]^^^_F`(`aJaabTbbc cd^dde,eef.fggzghhhiiBiijj4jZjk knkklbllm mhmmnn^nno6oopppqvqr0r~s"sst4tu*uv*vw&wx0y@z8z~z{({n{||J||} }}~F~p~~~FnƒbP4t:~臮P܊2~hʌ,(Tԏ2lr8ꔪ\`\.̚ ^Ɯ:؝݆0ޚF߄vDjz8r,d2pL b(< P2nrrrrrrrrrrrrrrrrx'@ ^ ^ t . & $     * < D 0Z   Copyright Dave Gandy 2015. All rights reserved.FontAwesomeRegularpyrs: FontAwesome: 2012FontAwesome RegularVersion 4.4.0 2015FontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/Webfont 1.0Tue Jul 28 11:23:12 2015keeporionFont Squirrelx      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq rstuvwxyz{|}~     " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefuni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205Funi25FCglassmusicsearchenvelopeheartstar star_emptyuserfilmth_largethth_listokremovezoom_inzoom_outoffsignalcogtrashhomefile_alttimeroad download_altdownloaduploadinbox play_circlerepeatrefreshlist_altlockflag headphones volume_off volume_down volume_upqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalic text_height text_width align_left align_center align_right align_justifylist indent_left indent_rightfacetime_videopicturepencil map_markeradjusttinteditsharecheckmove step_backward fast_backwardbackwardplaypausestopforward fast_forward step_forwardeject chevron_left chevron_right plus_sign minus_sign remove_signok_sign question_sign info_sign screenshot remove_circle ok_circle ban_circle arrow_left arrow_rightarrow_up arrow_down share_alt resize_full resize_smallexclamation_signgiftleaffireeye_open eye_close warning_signplanecalendarrandomcommentmagnet chevron_up chevron_downretweet shopping_cart folder_close folder_openresize_verticalresize_horizontal bar_chart twitter_sign facebook_sign camera_retrokeycogscomments thumbs_up_altthumbs_down_alt star_half heart_emptysignout linkedin_signpushpin external_linksignintrophy github_sign upload_altlemonphone check_emptybookmark_empty phone_signtwitterfacebookgithubunlock credit_cardrsshddbullhornbell certificate hand_right hand_lefthand_up hand_downcircle_arrow_leftcircle_arrow_rightcircle_arrow_upcircle_arrow_downglobewrenchtasksfilter briefcase fullscreengrouplinkcloudbeakercutcopy paper_clipsave sign_blankreorderulol strikethrough underlinetablemagictruck pinterestpinterest_signgoogle_plus_sign google_plusmoney caret_downcaret_up caret_left caret_rightcolumnssort sort_downsort_up envelope_altlinkedinundolegal dashboard comment_alt comments_altboltsitemapumbrellapaste light_bulbexchangecloud_download cloud_uploaduser_md stethoscopesuitcasebell_altcoffeefood file_text_altbuildinghospital ambulancemedkit fighter_jetbeerh_signf0fedouble_angle_leftdouble_angle_rightdouble_angle_updouble_angle_down angle_left angle_rightangle_up angle_downdesktoplaptoptablet mobile_phone circle_blank quote_left quote_rightspinnercirclereply github_altfolder_close_altfolder_open_alt expand_alt collapse_altsmilefrownmehgamepadkeyboardflag_altflag_checkeredterminalcode reply_allstar_half_emptylocation_arrowcrop code_forkunlink_279 exclamation superscript subscript_283 puzzle_piece microphonemicrophone_offshieldcalendar_emptyfire_extinguisherrocketmaxcdnchevron_sign_leftchevron_sign_rightchevron_sign_upchevron_sign_downhtml5css3anchor unlock_altbullseyeellipsis_horizontalellipsis_vertical_303 play_signticketminus_sign_alt check_minuslevel_up level_down check_sign edit_sign_312 share_signcompasscollapse collapse_top_317eurgbpusdinrjpyrubkrwbtcfile file_textsort_by_alphabet_329sort_by_attributessort_by_attributes_alt sort_by_ordersort_by_order_alt_334_335 youtube_signyoutubexing xing_sign youtube_playdropbox stackexchange instagramflickradnf171bitbucket_signtumblr tumblr_signlong_arrow_down long_arrow_uplong_arrow_leftlong_arrow_rightwindowsandroidlinuxdribbleskype foursquaretrellofemalemalegittipsun_366archivebugvkweiborenren_372stack_exchange_374arrow_circle_alt_left_376dot_circle_alt_378 vimeo_square_380 plus_square_o_382_383_384_385_386_387_388_389uniF1A0f1a1_392_393f1a4_395_396_397_398_399_400f1ab_402_403_404uniF1B1_406_407_408_409_410_411_412_413_414_415_416_417_418_419uniF1C0uniF1C1_422_423_424_425_426_427_428_429_430_431_432_433_434uniF1D0uniF1D1uniF1D2_438_439uniF1D5uniF1D6uniF1D7_443_444_445_446_447_448_449uniF1E0_451_452_453_454_455_456_457_458_459_460_461_462_463_464uniF1F0_466_467f1f3_469_470_471_472_473_474_475_476f1fc_478_479_480_481_482_483_484_485_486_487_488_489_490_491_492_493_494f210_496f212_498_499_500_501_502_503_504_505_506_507_508_509venus_511_512_513_514_515_516_517_518_519_520_521_522_523_524_525_526_527_528_529_530_531_532_533_534_535_536_537_538_539_540_541_542_543_544_545_546_547_548_549_550_551_552_553_554_555_556_557_558_559_560_561_562_563_564_565_566_567_568_569f260f261_572f263_574_575_576_577_578_579_580_581_582_583_584_585_586_587_588_589_590_591_592_593_594_595_596_597_598f27euniF280uniF281_602_603_604uniF285uniF286_607_608_609_610_611_612_613_614U`jekyll-3.1.6/site/fonts/fontawesome-webfont.woff000077500000000000000000002366041271741406300220070ustar00rootroot00000000000000wOFF=FFTMDn2GDEF`'~OS/2=`6ycmapsbgasp4glyf<"R䨢Ɂhead%26 hhea%!$ jhmtx% F_loca(v|maxp- name-3DYTMj[ڥ?+t:.^kLќ6kK/C9PB5lm죅 ,fIX V:\^hJעZ-ѦUAX@yQFc ;h 52e-oE+[sܪ[vK[t/ۣ'Zݣ32-/$!q 1y.䩄eHB 5_/?;w+/ O|g|dmp,o^(߁ h8825M3['xڼ} |Te7oL&̚0kYlbDQTąQ) TFT}vVoEj[j7Ƕ~?[!?$$2}=s=<s[9DxperAyVQxGs8xX"MEpxgs]ղ:hɄ[zS,$.5n *F$gۅfyw3Iv6 ۸!jC #6{&]v' ϫw ]CT&_uq$ ?_u#ZIZb5ꏢ7z׿F'pq\D%^fF1ႱȝN3pd3nItz`ޣm]K> (f`V trf7_;--نofϯ=]W(.?mڴ='"gV>zYgێ<%LFwԑNhn1[qC§ ?vwP:䡔x!٪urՒpxUto]?܂,>!AQ U(f#J&VJt(NG u57N ~;UUMYgzmSSІZgDبN_KWSգDr;&o5JkWנ ]^fjY؁յ/L f&>0\ !n,@Ԗ  dn.O,wm 8%7@ݷΝ/`V9 Y\}#隒hV.vspqqB:mF brf 2/-4>c?[}GlgsQoan4FʩSLX$BUC9^ V ?=$IԇRsX[<xz>n=fjи;K/*⨓LzUM8gᣏ1,@inj8Vcή9x;e>83$h)G=o[C=Q{m ݁6Sϧ^(ʑv ⸰ÊĆѲ~l.GJVTJ~hRhE 7k:-!mnf AJ7syH12(Ȩs >֗ Cg?T!inIssmg@Gk@kŹjޏҹ/ȥ)fE>Iٌ% apZnM]'߫Į6_V6mزtW_eC5P|~OєN ߧzX. ,|Mrm˚-+"۠1۠PG.R H"ȏ얂(e9Q+27nt0}Y B;<1* :\ A>%H֨(jX1R4FQG!-&agg=j E-H ?ᓇćmo(|^ɲJ,Diw1Igo/f|Re{sc߭MYbc07&e"&!rrO6ܢ7^1MFښĴZ4--ӗLsÖĆIEKNvvpY FfpK5~Q5q^5GDiA8)%LQV+C[.o'\aÛա"ۯ1Dt?^hp+2epY`h Ū[pAuNqf@! Xr}BMiݝ 껲wv-Mdv i 8t_PSk6%5>-u;;f(Mhё}V s,Z?X;8feCJt|õo(6:ﺆuϨ?W [ G!B(5?z-Q30tOps^`) lYv]^Q+@8~p8oX]8h\jEz"ZKʚ:qi6MR-])'ϝkzEV *VGn ZgevK k#B-]s6g R(zo@pG0jv:cQ|}V4&K-!Nӏ> YZ!D1G5ןX1_SSvfƻPzkC=vVsÉ['~+st:Ci~A!FAt_Fp!9$4Ғ(HH/Jvs+|Fy.~4p40BQ)yS>3bgÙq̠ͥdHN*_ ?7Gzzf4YO?u_y]Wţ(aD@AT(1B6ETg,t Qo}j.Qa$Ftq-gMB=ƅ(ς-~ZC})談LP~458=6XI,Mڍf1[Q(-.I\=(%qrፋy\"3{GχyG:-.Q'G0CQ3`5 ẌMp;ɂ5Apl:#o>ܪ-gu-]ht[ 6[sHnBzë3E~v̱j{ɯ]!S}P([06p^`,TjBw-|^#D󐆻 <|G|9W#9F{2HA Ϲ(o >]] h =bGQ®*md_12DQSyJ*ӘKoTKGdM<x1m޼iwΣ(oY, N(g4Q3GC@y DN$RH1$}6Jt-5<}iy%xѺaU[Eԣ?ې[ԛeHn͈;C!Kȏn;G2X=ބOZ$5X cZ'F,9 6tǿEpNZLow,%:]N/丈+S$C#pGaNAVDI4H'NH< {9,XCĦYvmHv\7Da( Ň-I߀~{k'n\;+s?)L٬^i syCdJc5۳mf̉'k7{[=V?ku&Zάx+۱⦾ԪO.~9>ѥѦ<]9YBY(n,%M!-HCÓrEn!:ϲ`gF6#ObE ~񦎶w$q2v-OXͷv7cPS1r) Ui v/BaٹV;_;%Kخr7%\V&chSv F#Kxc8Bh>va~ );|FNaJQgDCvY|5hw耟=dIgL/Ü 7:-&c!VWSGlf$%C@τY$y{a t(ɒx_ʮaEH0:OY_<#K_}v7X;I x-M܍qMyǥkG1&p!)q n׸ALG頰AGi]c7NƎ$bCN t:p9 LQphBaSQȻT۹Bb.K.o#Xp'H#l|Ϧ7ufs粝&U < vØcģ@Ր/"Ƽ4{$}mۿy"餅fSѴcS#)lw̔3\8TvNi<1 v߹_&)"ZN31VS'r8gaT䒳8?[W$RO(K0h1c]=c/61!|7Y͇şS !B)=M3{Rv"+N~Љ{3TA;&A:ףbVz(fO>7= Q1 GgYu''crt+h& >n -A]xL}*u1̦Zzű܎cvŽc落dQQ,(ṟO Wh)I,k#IiLH4bgCQ86oܺuz*rX?D:% yMXPs`؀%pBI^p-^ `6&9N z4 >( 0Ae[k:A*V'K48\P"GՁL:VRmɓAMepTW h#GSc%Z>cDQ&:Tﱪh zM!% çhs8'Ȕ(TbSLq7R|N}u潡ƫ; EJg"2,  @ۅ9s$<@osԓjRwyWKQ>Dfsg(N={R~Vw|C_~^B?E\77Z&te2 6T_tEؔK0Lvdv 3('4f`H9k|n:ηHu4ŴB^JqFP(jB {o6C)6:To A)K*ț5l%4tO=tۥhw](DV= . r]n{gym5VzS[  X|g7–U`'!Xb |)Ǧӣ<Mϸlit`OK숹IRneRDJxҝLJ8v23Ω,?Qy h>^zelm?`2͎rʙ,*=_%)ULS9I/ 5e05FVDo_$հDX:K;&i$6y-FvyhKmIUj^լSQhmn`tGg}F-M5&HdbktөW[hs ~+3yBks U?W(SME˰[Z1Әryw6vJܥJ4~ >::raS#~9`a Je89|SJԮrklCЄh d4{T+TʘeV#=]DmˆiMʳ*KZpn6%/xh%k,VOkaMZmUzxjV/-Tm!sXkCW70:cāƬ$gdApf8ϊ8wU[{$M6m=`ǵ~"XyO*mq hK;. }WGO(1>wɸ.얁0& 3?Z`/;{bA+聴XbAR"@GH72_I *etl%-2/\A/gеQ=gߊC`nܕ4e쥀2!&iJ?1HiW% +בLqAװo<0ʇI%Mp3Uw=* PR+Eއ/Qv} O!,%BLO8CN`2T0M?#V-5?d;?Q'Q+: ԣIWQ.zFІ>]kL 1jfCh G"NzƅLϧ_/C&?] 4|$-Ji-v J(F Hq{,A(R̥fLk?JGDh3KC( Cvsi>!G5QcG;KݤKD5~Ŋbl&BKH[h[5"=,ԙ/~ԭ U[2 O)@T>Տt"qxRO_$ ƺEe/Px/rT"!(鞷ڃIL'j3I&+ٝ~o,TJv!T9wl1:dNʺ/E(&1ik;//?&֊x^4 WU4AZ^nm0{Kҳ/K_ȥ!&K3@z/ː#w 7Y;&k7y!&l>4a+.M?+ZY!՛`T*0D,}. u'f"|TRYAqW+4ӇyDMmg*=pJ{# Zo{i>tK_ۂ ԢA[R>_ џT_ajOBCdٯTbJLe?^( UBpe|e`v8av`oX`H Eq_4;t $tx`ﶠ]9̹Z^H$9tޗd7W8ŐdB(,fIJEBWomÿh7{oV=xL/LM}n;KW>ߵ-:l|}I;?>HѰ2Liچ=wۢZ/'cwNv{A΋? +')Y4 C'}g}vtXojq[/7] .7mOrsܥdv[fhvMR&ө<ẸYܹĚjmg )mq04J)_Zx~g, ڸy З}@u])j%d>om`a"ފ<:TpVfIt~z [h?U_9ͿJyPl_ m&Ů`v =srK?_^ʵ[s_;pv+ "gݓrI OD/;Zؕ׍Үd&\("h85̐#!ɝs;Iڃ~`Fɢf f3yTև(? :}[Rvq@l#` Sr r^2*ӂy@oVa#Fp[`cbß/Be@DČdˀK6B=J#:͘7 I6Q)]>%)ȸ7W7*]v\\dH VpQ@B(nZeJjP"?2T[O ^-5DovF) Հ.$#\&OqVתwXׯ{vjv~cc1 [|X_nh銝UOuoΞ+z\2dDŽh5KU]8EM!% Ech&J@!KM#t#D'q7%Դr-Od&,9=~#.{SEmE]vx+`]2?~7~n,͟dZNÊ'?~&摒ǿimv.kijY٪y!UV2L4Å}~Oc1.wQB/MZ^9ţ|r#RU!>SeSJZo*JVICQV?|x_@4hXn3:B54W-u1Z/MF2>8C3J<ZŠrJr֨s6VpV,0oWk7@hP,].5/{`D=w BySAo͢T?Ah|M5%W14JkLY ?d=6{fhLVc1䍦T!: 6*56OHf{3*E1n3#gܺ={!xu{`I>{*w*(G4j_;˪T*jI )5|iULý z\|!.?ѥJ7>nKCQm"/UD&[1 ;zq ]V]JZu sKWmPNHA|w/n΁Ӏ6n:c5Žc}|Q{ê:Eva.T[t|2c+:6.4LuSJzr26e|3Yh^:{Wϵw<Q|1(/GS Z]1jUT.QzUX{,mL9[4 \&AZ}^3$-c2GÇO>_7Նn'WQOq龾Oe}}/=:&4L^-n>sW^D'_ ]4@ZdA\[45*[Ko7p>m<9/gGH3rhٚ^X.̐ ;Ν=+*?1MTAL&IQ-9h=,{Q VUov^k%@NfgPDÑзO{ya];Hhxd6 6RII64W'ՙhRSm8ɞwa]pXuxx,'yl|R6?qӗ0$O0(jle0$ibc5|Ni9 7nFsp7uDD׬T{Q|M{ݷ&w~{mu\'DpF?q|O<⌊"yQņ$}|mfźw.ZfzsfMe|#zJILW7`E:`?AO颤9T4Z3G]Pr^Oѕ5S1[ `Եۄv}Ai5Мv<6:DOdoqGc{=f瓋:~0czuhvt(l/Eɪx 95]2Z>oa0hӵqѝOmq>繭/]sϿWdI-:0,6`UnGT]IRZ`2jXi{/lXB.bl(u5F<^O4X?陶Phd!n(m36տ1 _l/NO5J CrW͜D`{XY%C@BnufcQ#93# W:nh2}¢.EB01z3,xKЩi"U5t<{8Y qd nqЌ٤]ڍh鐋(;h?yGB(Y;lC']kfN% Go-@{дG՘&{3[)F*O4TBfmP`1¨LR.vړa0И$MVW/Fbr1u#x1fL"u&]i4}B{}46:ͮoDw~⸘53hT6xFZ( ᲄe\f,,Um)7I`P_S* XNIS!lԂ\D =*3E'P fKa?41(d1WAN OzאILNvz!vS~mԎHpop :_~+W7u]-0%fuEMWr8 @(3ow=O?'>wsLcâdf9e9kf39kvM_`\T.RK+yUort*Im\ApIb<=bQ R [ n:> ԞJ+n?2Hl!Wگ3:)z}Z1|A/ooSimr6y؎!2pf9ͱ/oK_S7%rNcµzg[L2pD{,j*/MF&I R$@F`DqI]`3bC0!uNN=sn;s^{<^10UZuI#kmn yXvG[͈磷Tܲm/!LvEQe%6d>缨 q]9瘑&*`I+G8j ;*G'1>~{;cт9<F֦qS]2{ Vm8KgX3䣥e5>&eZcMŎ?htVո<.υ5ߘ쥷lG7~o!lFWMxA~⇾JcBy=KSzk];ҷ=̴[⃍US\?G;R?RWwjwƫ~vk3gt-n3l\^6Ȳ%+@uai+"f? ?[ 5LuD3Ejbyѹqd~~âsBoKDͪZd+L5 9QwKޞtXs"AU5d7I$m/%k׭4:MuGgݮ4}GNe[55R؉ΦꁬͨȎcW>chhvFkvJDfn|0>sy3I-p窛5nd6R-.|M?u 0@pnRd^:-\{GMRL.r=Yli!o`lKdǝh6{cM6j2 f_qfJg﹈Ldn 7[ . Nm]CmF{iNl̂0%MM|}q,EJ﫵WrwlhQ>cF\1kO>7h}ܴŽ\־;7mcݪ򿮸ߏoP0)w/_W 8_c`m`$Op$f Q2vF(S#ȫ_8$s/zsxOy]F(~Q.Z?男OB8Zj_?u.!vwǚػQ:ɱn(F u ᓇF fՐBYVڳ)ǫ,~ /n]&eLn&4AtCtДT͊Wfx .j<4dVNs 55dJ[KҠuiLB=3 TB%s8)X^.7kN+ ܎a ӗߩ7&{ yאe~pkDs\8\s{]6~O:Pݗ(RsמN 4T=Hn{wYehBKc =Y<<%mmߕe%N ]ثeQkS[,7\MOO$z[JYX`o 8,lRx 9A/@Gr\?luW/ڗ^skgΰ\H^gT?]uu>; 8s(>;CNQ'cʞT$^b23ON=IٌgҞ47 iS}]smFTv_SƺzS?.Uc5MaflT~aL7:Os#PU?J^5?cK ɒ&l(k& 7R88Q,yz=y9/~w$>x1>88%6d8k-<3d7Doz҅fF:7s3tib>fB/;=]@Ι¬sYw.w#\da¤21-za'lqhPdhx|2T3fv0Ń˩wXXܟB}wpՊ^D4J/~.]M:ד7E{ZL:=n 8I4 Ҝ `5yyzcQ2_aOz.墥-`͘sz.=9{P{3 ʊ~~ HPs-ݳJv{(3v1fXu% }1\nQɺc:u4`<~(p>Y ʏp'uR6b錇B[x pRf`Z V؛Dvg*Jg+ĤR.WdӮ&s/Qɥ̤sYx暭sp q~ pu$`Ҡt-@/}8{,Q0#Ә͔$QOC8Rybp\QRkfp8zjUNx\S!zrAq)$O]&YVKME"m̰֗m(V'u,+9")=>nxF+!V]Zk/ų WERStk;"Ts٨ٮGgyF>L̈~=t,HJhጏRE12K)(fH ƒ,J'a`+%Q^\Lv]W&b)DwԂh -a.jNtIW*κQzZ딧uIvHnx% 5x,ٌf:ᇊXl(81f%ᡨG\W6cQ0KGIt6Ћne.*HnB \Юl*ueYvv#@RiȠt34+^L1(0Xd;Q7e1QH` Zg@ll f6M`z 6D": Wb$VAI@Vѥ-!'^"HFKz(k(&zdH*yA,Do dl!AjE fl5 HG6QlA'XD :$ajăIA/f3!"I:Ld9-xޤn"5a^^+JrŁENcAZ$ VV` Cg c^EXp ㄑ^F"!zm z!o1m< #E$`Cj= بtJȼSxíAЛ$Q'& ˄1鉌.B"6 QTa &Q0,&Xތay")J>w &$DQ`p!@ =D0RKqHyD^ -$u6^1OHpYkl b%N[*(ء=Yud˜Iz  At 6kg4Rol0Bspߴt!jtK0DY:sW<7 .*?5Efse5!<~o$/8&*.RBAWf!nST~DI_6֩JˌqS%f.}TAYrWZҷIU6 hl<4л^EN h,AڵA]^_-96u*32TF*H;e64#^t;K1{ExM8biE}2+ZwFh.RкEM䘝pMfr˹SN MRġ+ _`2?LR K.zطsƬ^hCw]k(}6zXmGV$LIp벽>T5cgx&@ K ݑ;I>1-$|Z_tKoYq77,R'm#[w 7dqHa?6 FdPxJ9,[! ikLG_R|7s ^ś$`Tk'A߉Ƹ8w^m>/?|ꕻvxu8?š7ykvI1)Q ڃ$ƻ.?Gwްrj(yd'2cs\p 5KH?(]sJ~$xt˻a4͘;p-Oco$݇7 RXsLG=H3j%fz Q,-d9O7iGȕSE9m]껎v>Ԡ{J]WV/G=֕Ga<:n3/ cd{C-p$ner ,캗aTж4a9Lnfvʢ>j aVБb)1cZ"fl).RNaX(mXz]f, o ]lm_ ZK]0Z&Zb /^e h9K,I?Cc^2/K؈Cҫ^l9@nѴEwW,^qCfzs3."uiE餜-voړ䞦0{cءkE?8S^=m֠ 6AeDw' &[_ѳ"D%m@u^v as}#ű﯌2kx57u8;  mVV.M`|vmmO6_}'of@5GY94Y[\ 2bOO۲^=kwtnKc7&r3 Q[[Rf/$LPޭm; *ˆՌVߍATLJ׽+v˹a;` )֍1> 2vgfĔLi;N()JlR> tͽӧMk̫Vl3mѢ X=,մ\бŸq[Ra]Ӽ;6 oWT֊%zWOtYvGV_kZs)ڎ%dk:ojcf+事.j|"n#՛*ƕTl/#$L2aU# T!l,Y-iJ!oNg5I w^L}n '^e0Z K"z5glΦadYz`UGK~=cAo֥ 8?\hkVL:@S>оvFfu;Z|.jcvZtm&|y?Fu#a5{ł*EIjdYYq9JUohCfEZnW],ޥFG.}MAo-#Ԟ˶w:3BqjkyV7a)YV/Zjlh%:z \q3wtvlrn x5%4%X37?ݸxFg} >uΆC+gr&+ ČfcBFFEWXZBMԭ幱s"1.=cՅ?ؤ{{lMSV)*nV 8Q'LzU_p% 9lV2Ea&7ZqӝIQ٢7Og/Hߧ~a?tw ?RHђ<,CB k>ߠ|)/`x?)o<ܢ[vjOxa!M(=?@d 5LL$Gf&"u%hJRJ6GbExb~Izyd4z "7ȼ|a-z?R 4%QfaŖ݈(iOtBuhKW$5~.]uMm-3T_ܴw_k, r2qw{Edtw:Kr$& WY6XnfsئtcA @P$%! ![3wSM?l_~_nn,Ŷe1IU3? 칤MYo|?bIo2WUEb+&YF6'Oϖȵ2#) .]dQ65<=K՘%+3Tr ^׀ gV6.ȏ=oP eqˆܬR[fMKyE}kr3+5nyXmj L+ L&@:f"yKhI HE")bh]gUu.(5`ү)ZDC׷TfM/64EuU 6RTWW*+sWc; pO+9.hhhKu/':.U#K#ʜjWc`=0?"&8aܨqh Zw ix^eH"VPA8ĩ&fHHq Ra>ҀDLXE#|?bybLӣVX6k?0]f6}?Ys*M<G}N[qYnV2[i;ڻuAl=7iycAOÌC.$Qd~y}-+1>qndOWS>qcW&%_~Bz˖?i;=+ƂPSTY-zTM~$&ZjQ r8D䩞0(hd#{HXwd(&&yӠ;0pqvGW\sy\#mHDK'FyL)M6"&l0 &0*hB Lr@JI5E'{%>q) l6HO"HAҽ * 1&ޛPڏ1Y$L0yy -&HwPl惙)0DtR`L'aDϝ ЀFp3=CIy)˰)F¸sU~\=jc^MLR=uvc2y<ͷǿ7IQvz2:ؙ- !0DiRHpv(ɘPV .qv3jf֖i/[Z &X:UBstG$ ^ڒʊ_\E\skuz7[HaiG,4cKbJ#+#`Sl\m:j͋L* 4X2ccW{AU58csߴ{ZI_Mr{Jcq܀GR(a"X3'̈9:e?JkcwӇ:;=ݻ6@t]{@iR@^t-z(E#&ٷ1g 8.up`19Đk֒iBaF(`35-CB[b=p,j9]@;Tvޮ)*{  I;JAiV VNv)iKk6-RޥFH Tfh5Q*z=kл&^r5ɥ{GRT(Vwbgh wNbaO +"5d3dA0-fQ7t2r&u_)N\ĨY` U 3G^{as*۰]+]쒮KC.,|~rWcqA2B,0=P1}X/F=Go}KMNk|}5ЙmL0gEgL~g췣a&$`?2`&mK+CuS5S4 ^&,3|ނ7 O}/􆫘d#nYh\Jm#/>N0?5 Ph HjHXɀ @7xUCM!4g>FkxwUf vp֡m-EJgk Wk(sDY" '=F۾$ɠrTM#RDk=ޜj(ǢjC"SՓUIeGSsS5I S2rQ60#bU&/-eYsvd&a (88jb%Qz@LjSn\_pbS-4"q&EYyfsW]gP8҇"0qvGdS$_N@PG mqXps@4z%۸#@]@L8s oclQvt=}A2 ɢZ%. 7hy8Ḿ$~x*APX8A=YÚv`:Bqy'!+ԗH(qIOu>OwbqC#uΉihz$/MI3ie# \T>`XcMr_/uʜJ\4@:2 u&O4N3=HL¸޳ ɣ$`M 2BEgT*Q )nV̰2J:7TQ!XPH,Ck:%ٮ0Fֆ{J?9._߇3v|))o)]Rs&&܍֍Dr\_LIqxE;sSfpJiWaUJ&=|#][ܭ߆lQQ^fp~܃ uùR^Ap0r8_s+`L}';DNW1?U~p))_Pv8. ~(_'-$᱉]36a<wsiQC\=ПO^Yd|Cm.={7}m̹@D3<7,G1YtI3c 5Hyu!Xd bO۝&PR2榉L1Lb7@g!چ^Dmp^#lU50sl4 yP +B$x_%!JHtϨ[^@=h3cA3{N LZk* ㇙Rebm AIT&~2% vɓ |k!W|Ԥ¼eǀ$)gI}283cZU.2aԯ1_!y6Bh}Q2_N6LPn>}*czX%Wul|ߒ.WΞMڝtR Kw3|MT6%#a'2@5-e2D/ujNX״fͷ"%5$wwEſr^`)|]b.5k&$+yIϖ"Zg-A5aK[$-oH!uҘyL(kXN0ik\h?\Cg27}(%]u]rxMb1xu ZwB4dgȭv[v}SR-l@[|G _:E@XnWWImFqv ܡde[dJUa[帬b?+[VK ۲H|C)gqEJiބIJ"Q3rHLӐ0z dLNMjy)*$La27R=zC|A' FRRdfK"x,! ϕ~3O4?%V|T&4rҡ4}7F?YOr( xG'z?Pa$0=t<ـw[nc ߡiuv;1FA?⫼Wd6@d:=N?"RQIWgJXZqIB8a: ĎLa#N^QuhpOy}>xxAY9Cg Ї)?޸tzAbz:^w|KWy {W+ߦ Z3Wg? uب+͆xzKr!?MЯfGe΢\BUQө8SL (RD e1r&jңo0 lJ|ef]fXRyα{zUWКү<짷5O,)d*\UȎ 3%]EbK/~ctad %Sk!ƣVZ@ۓtz.27 QHvaqH!24Z e ސxα׀[~3#ddo>M܎#ݸgOvp=3k]'(1"|7rLv);H)"TrT!m+av&WB:sm-ΣA oX̚-,6],^?0>.ajehntֶxԟ}x0/;aZbHO|QP =74J#24z Q>0(+R$'hxX6h4!  ,93'K!-tGɮa=qz) IwIfMc,P|C ;?<ݓgF@W{Oe@ 3Qգ|ƱGSLʎs&K$~ ei'ME{ƼLZv2Lt o7ѴG{B̧ {kʊ$+ ЌPqLWjZꛩ՚5|Lk_fo™ٲfpu%Br|ҩʦmv#H̄-=~KJz=nDRđr 1SAf1.I:r'^"Қ:D3w pɅ4ãŊfʋ] 0'h_C!"f1h<ġ~ĤCbu"QoZ4PnOˡ +ӴH3ϫ/MMg]V9{8(&Ľ}jįŷ/; D_ks +Sw鮯+mtHc>TߧLD2}zl:uٴf1);/;ljk u9u~fz!- H.-M4%>,Z 'ui*جGii&L;`*+-]2~}]3y9-Ps1٘L(+P!oԀCpCu܄ ӘcHChQl~q{y[,70}[: 8ÁG@]@?{QteWVn(Z~ډO])"QC _\^BBjܭFޖŘ$ʋGq;q:R7m;Τ,&$w!*>#qN$*X!Bµ$AD HA|\[lˎHLN(@ǂ0@8,$x@w/O 2p8cLLƱh9h: 0:P&ZL#knZw}F#c(k,5+LTc>Эa hJ߼GL聼jdj};V}ʪtϞ:/)åT< [&"mXbe+!E.iz#ۍP+&9Zа?eZE T=Bj$w v땃4#-`I-4nUB#ih ƂG{쵻G8jQ|E/ffxOJP5n )ftb p@୉~E" >xu0{:HxiaqԲ0TO`#р >pg4A6V/Љ5l2Ja4z:oXs]G`yPp,z{~ {|64y*84 o/_Xwݝwsɢ*C@j)4 ,yKE)l@< KQiQhvjqU -#7,ֵ~}$\M?Ƒu _fУ噏4< P{zJ'~݊=Fx)5{@N9>׸g:`O1ÉMf؀(;#dF`#9AΞ9oScmXҺH+ALovSz*w2; ̙x'pHDi !S .Z{Zkѡ =Igq&O'kH=iڝMMsxga8~~>&yoO(Ŗ֜ &$!a丙9!& ~Xk4hnyWxMRc~-Z׼VƑJp{CJQޏL 0Od9-liI Cu˅0~YFPhH?#>6>4 cN4n1]́55{r 0 3iAW㻪t@?ns>@7=cEZSUrzJ*.ՊI4 Ja%Q'd>**B*]I˧]jjBVQwOE)he =Hx$&=%卺 &HbM'NHڄ&>i "!+Uw)P1e7W)j@Ps[DIW0(y1!3>#`hCWn[9:n|S  ?m'Dok {|q \YPpSAGJ800{j4ߒN@7@}S=+79Yaڌ%'se@R L&OkxZ{ZD uuk%9GG+N!jYIE &@}zGpvj5J'3e}(R08EףHBͫ{[jZakvWW XSY?D_Ć &o6Cυ7pH< N L鿌PhEqLMɣNOt[,"e~\ p ',|cp<%}һo׸̫Jg4y"'o4"Y2r>/ʉx.C82*HIh&RL360үhe4Ձ>xWj\A-nřZ ܰRѥY0:} W(i+4 ^! yg ~WIϰoG&L_#cY}OlSxv-:,$ ha_nj]J ͠d9.Q}4zҎK.C0 6d5906-/hXK_8l3?Jz2?pY\DtjZ5O* `-cG[<[_Th.x-:M\E<3B7G8)/Cp&57Ih*4W#ffmpF\ j$._JW-!,~!7 T߾EܟWڢYvFXk{5l$ĺZCiAӫ Z^Fl^!ku1L~rqRҨp$Wؚ~N||G7kڪ9zs p&܀K2)5vlh= 'X<@ 逴FI}IJMr;:lS8p>;DGzķws֣V݋*x!Uxs2V38^++슭k1c(Eg3=L&h)-vСcɤMV+EZ%%YKuU Z_F'ޗokF(kTj&2cB-Ù|Qo3xQ7#) )RFLqtuѪ&ASi1W7ک"v^uKG-L9*^FsKW-m|Y6ai|.V95\f US9RVts \>c 332Dv79W5~ZU0X2ė Z\a Idb$]JqyS2C&6}_Mt`!h9V+j,ʃs{n73qZ< ?6.hN_>~=Ydֶg'Ƨ֌~f4*έ̀v$?L{dOP]DLd$ItȪ`f fwH0 fn '3՘"I#ĥ vuiK? LN|Wt*U?]13FU9Ozş,^o_yp7}Q_5#>_j\hٓ+}z}L鄓Bh 'T_Qg𺬖jǸqS|?܇qkR?IrEPdLVDd :.T f6e2 AH#ɨLpZ|YdW_Ri*!a⬰sOӕuzrhЕóU壼 xlOF6lA02 Šrً-/{M'y9'B!?8gSף$0Y1JjU oZOw}=>{eqj( ϜKPc͛oHE=hk Nry=ΨtBN7{Ny$3}fkzϖ_%K};PfLhݏM 5Zt!H4e-ׁ%NXa%ZcWĿf-|`K(Lp_WV񗠐+R'Bp)v/rÞl8')= M>p.=06Li]Pzqp6r ^z#HP~G`ҩGן8Ri/Xg~aObLl9 $عӓǗ 8)KS]{VxΔ⇏'/| ൢ:Թsg'svγem{߼Rms>xۇ!x=>|g^̌~(\i6P+I-r\0|l1|AcY 6g ;,b*xԁ˃P9Y|"9$HVj#ֱB8f':K#eP$g&$h^hHp #tg0Db B+*,[YdزRϰx˷u& AdWЅsqp>(A=s܆.7l^VpI&xçWTrJ r0o_nRAFo^q2o 佢Y]`t Պpԩ|`Ix`JJNF:%lAB}p.R-ꑤ+Tǂ!4PLI ^.)( -%_zW*`I:_UbuwwY:u* o8,0r_2^Q@?nu)hҰٸ[Rl\jtu:]2fYΖ듩ot So渧١SmWqN&kVsNte_jrO8NcmH擅abG r$hw5 6zM u\X[t}۾%v)+f?ab W`lqb=bwξLa*lYTvc| kĻR]#W3{h1J%H!!WchY6A3V0{I`! =\LFӻoN* +{0 o.Z[PTUOLfJԸ%XH؈d"7ֱ kLǨ2 fex~qC3?Q>aqáҒ0+?ޜ^2SkX=Ө9po()m` -9WJĮ҆R!!+[ gwz6_JJe&}Cz41͞4N(/A%$$>LTe9T('wH0nX)BXNbtXFMy4ѲY0jlP#E*)c? Y"(hAZ b.ZɐhƗ2I%7;)&4^IL<~iBr<ΏldhIKH3UM2elx)Ӣez?*gA2$U~>"pGIӜ4g, DJf2ךKhXTCR3Գ7 ++*[i1@ ( 1 zxT!&^Z0FUHW/̶@R#`37@QlQ)e3`аJY0Wa*T,Pev[ M z[!8e2 ̦3 2_Lnr3Pư?1z唗h!F#Q>2J +e&u~:/}') i ~`e֖ cJ5 2VC @ FƍfY-{P\]`-Jl0X6)(;!$VV Jbj#^j^/YMҼQyr>,>4ktHP)w -4yQP,/olNQZ]`PQVidbXV@sCު9J/WN9hlkgd \4u9fTvPU ,2)h^fj]2U P(j YE B+C9e.F`0: jS0 Ȳ怶V54gkV( \`W˥ ]Wmr Z¶VK!vM[E*X3J q U92~erѰ2U`Nk~}Z$z?~mĥ 9>7apD8 y#U7a=8=E&(X??&|Kjz`[:YP)m++jiKnm Zpx15YYRUX/6pt_š;2;;2qz0ZeaW ߬5"rwC黮9A~Ӏ}n>iG;DU6ć4Sm$)kc*B̳2%v N`HS줭e5`9H7̎*B.v9]9;̼_Y^У=v]n_ [Rp|.k0FBt8y/oS2 ޏ Ŷ^"/47 fbC :$Qb#s,Eɲ}&L|ƐTDžΰxj$ghX(RoA{%<nIكoZ)}#Hnl^jJzo_[Z@:pҚB+Hn,&taW5@[3$[r8gTMGMee CIn( *N[`偁~h>:/ioj,;D"W[o((Zh7Å=t)x`~_ nX^#ŮyIaTN\ $N "st檶6~b$dVZ5XؼCUU >塹Gn-f5{;vX۴(/sT픂0:Ekm'yBC̙<~Z5?}{ɷ\-(:3־?.?~k-8: n2ŞdXBcqUFq=ZuN8ͺ@,fʟѢenD 'K{voG_v(ٽt]sm'e/\11ZQS Fl2#/I[[6jhzR%ؽ*𓎝nZ){<嚲Y{T}4 5vL/0͕:y2Yۮlw,_`zLcW9Ks-.jt]YAXD_RCH█$_x`_e7bVNٹPIoG'=sp,- hv/jG0\ںp'a=A;Ksusq&,fYEe畗LQ,lkZDΗqоgU /7j;@"Qڠj6"̴.R/h37;\?ECdՊ-`=/fHd"~UdEB dУP=2G8TB<4~ٴ`Ճ5|\b.~s3^vۦ憮xQD bE]&sâ7mM3TRr'Py5'N<5{DBi?^+a=?eN=~ǠwD_OP 'h`:P13諏5?շkgp( v?\lA떍ltY߯-pRRAX}.36;t/ݛv;SIS8B?ငB)Y,>a>wTL 'o:JgMDwUX ѝĹd'>$3?C1zXm*113=I-ԔCLӫayyb,zdbq6 G9j oxo6$  yitzpM׋:-'B >HA"l\M'HTչIU}hRy$f9]k rG&U |~xh߬_V_|gSN (" ٪i⺅l%E6'0kL{8A&u_L3ӄNd&k3Z>Bbz^2g[5$0[nr!ɮ &Y֏㛷]X`Кw^ "I+umv<3 f,Kq5t ]Tw&t[>b舫 :ٵ|ݝ7xNE\T )1EѠ4O" (sP¦ x3-b:p3>0ш?VT Z&IFj%zI5=:Q5ĚKpL Gk^&}^2&_I1ˋ/ Y'RZH%> ,,nwI=?PkEY#z 45vW^ّeՔ=u q|+౉B;y3D)L&v 'J>h*Ѻ>s}*^*yLbl9d>q/1~/wPiSybW^ne{X z>|S|O$'G]P \97TۘoCYy9}'iͪqETV_gG\xLDll@]F l,@St7uY-nʽU`ą|1{ucnXsyp_bs\ұlBn̝s)vҢIz9ӟcNYLrTeG΀8~`#myХN?9tnEE.\p7wE#gN=U蛜|ĕ"t;ۛNI[`/89iKr'aI(+8W$MJ1=ZNYcן]z×6?y"Qu)m>O!եF@b|n+"Io~sqo_9}Vƽq =?O/(Qwј1!WsED5a &i /o$A8!26q愚6' P!U05hƫFԥ"xA  g:T xhL>ScF Kï>63rHJ{`0I87%N}[BHÊ}U֙K#rC0v1K46vΪ< \:/c0-*Vǩ%rNpPa6Pl*LJӏyVڧȕr0墨4OG:ٝf+\{IU*Z8 Jʢ glu!y?gk$Ѕ-r%j32 pN0yl5-OȵfmIn00%&LSTr@ t){iEٲZw'p*4dR3f@c+@S!sobcx)e|Sl+.BoiQH9 U\aezH"cߔӊ6٥!zD XW (T8I8h#H$ED/Mu]4Cf~'tDoceyײMIVp@?-=6Ss,e:3eZ5R9+7.9Imۇ[X~g}cUlmM_a[ Tsxg!nUyMeyG&B^mc r4sʭj\g1H9T1rFBCZ0JPhwanĠmMP5 zނ5oB͂w_:WK^3~VO\n}F_pw>WCkQҳ׌n^TbPƵs& -3[Ag42nbby5͞dkKcUW ԓ'6%O\jl(k3%bd Q)lju%u;g  Bi(;PbL?Ș(@UKJ S)tkf:]3`uG0~p-a%:A* ͛Lf!/k`GX7-i1nRt46E/g$(/u a mu֒RQIsʠe3@{ E~^Ot3GgyV T[ͻ=ڿʥ iu5;Np*(jk ^9dcpv d 3u xBJt,1:Jh} -@i262!)Ԩ%m0dJ9H?Ip;/Z NS7Ҫl+dx@0:$ߪd2 ! jEh`_܏@l'.QwRS;P`! @7/Buy^@gM{q^ɥavwY<.Mso\'¥a3ˀbA;UAMt%TFTC9`1Q MCL";vq\ 4gD snC ɳZ?Jv ;hGT{B)Aq㣏pE)HF`$@ 2'a|>/ bJ@$c*KZWղ[/Djm(U oM]n×5uǗZ5.XyI+93ZG5ni!&\9maxSDǪ;V/y*k1'Xum~eMq؁sVw4X&,oț2w˦CS{W;_ *h/L}{ߞ鷅r:6T\acS,)Jtc=w:G:a){$!|:jAJW飩pPRYJ]'KE%-Yl@xdΡ8y/BczU d^0 [ />@aPF A<1| 5&TЃ֤%YL#kA/tCKК;В~:]ړjIY[=Ip>d-yRx2^?+>RZ6rg^'G vf^;Q7tџk$`%䅝'@6h_ S̉e<9$CDG>

    |֕yk?cڇaܯ"T9F0P> !x\ *=\ʵ׾޾k>b4djCȆi>Ye"X&_{晷vIrZZnGZ9p##G6>~@n:DpE{ Hy|קj [ &qs`ULG NMj[ۄ0YֳtiҮ,l-)\cD:MNO2F9ĉ*W?/o>cv:gˋ |5 !\3Ğ'ލzflYwR~yB0fLv-@x"͓:≦$K$a8%ADcD7h Ǿȼ-5S4rR_5qe1o- CA5t-ž"K^aRUFlФ}!:+!]gre{i"hġ;2L[N_sf8X ݯ5#5蚧`@)G/=6k2P/F c8^]HR*y[ EHn e1ߨin?=Du䭛C,M,$Ww/YGCZeci456\Ǥ-`)43vI7B_@!lr.sᱧÿkdRxRitj)Fc~f^̏ H/[V2c(nFҶm0; Ao!8NrP,(=m >!= s29@6%.V&d <䪉犅c >,u$S*LVrJT+UB"S+d3 P u:gAlIժCfT*e7%2A&QMCQi!f|2+8R4fqD%)/i4fZ5iR &zH$J()2JrN!T`AjL!%k|U7ex`~ +پTTOʸ>Ȑ .D[z}'U߁wxE|c4~NT~rZ%@ څ +ZsVTe+zZ#X>{P^ttoAҧUf hO੆Wc j1Z< 8 t F1ƌGgT=" gPçA{%a|)H~tXT Qp|vJS&q~ƩFۭ#.i׀TʆlAߪj4~` 9!'`ڐf 0YHAHΉ)TB-ਛߴI7Y݌:֨n;VBLRS$qyW|&d94Jt%ƘV0o1C2CLHqzje4+i Gzi d_|ѩk>B\^R rEN~Uͪ%+ U08ZM=1-&x, Q-}1)6Ըj.LGTx4j2_"A|ow;|%4cE1Y$9vL6B3%^ jHwgNmڹ3wmuwq[GKGq[thՠ-}QJAG}}{tpX7m{:e=ؤl} @Q ݐ ۜ@^s6f0Y.O u>O.$"@34 ~LpÌ+Β.; } @MTZ9u8=rXn_k5Dkk,oDmKky%NS򺖒ںak ~'@;=.㷢oXWvL7 Sc 9 9׮^c֟LEˆiϷ@OBy!?34$B-ϊ ~dY39ss؋\=ϝ9.X֋ d3z!.%"Kgx{ۉ6H)9&?P7!l07Y)za; W`y壞l}n( 5nH1L"bO66Ĭ$.hd `/0󉚊]R8/@NzaC#sZڐCcW9j՜P!OfLNw{ #La&+8[Rsp~{qCnhcgw:F8j"_)l4,sk?x,R9fUE^0{i%dwKh+ipڅ|O6Z994D/ -4b$ѣKec"s4!f}I5I5-jO-fsZ5v4X܅+i +"#/P x:.U r%h:t55j=^A59FXFoѪE}( ntјW@'p8'j$t淸‘wr߾ʊW?Wk}84fLS>3dݢkNyiNj]qJ!gݒKՔGJVV^Qn1g&=sW썏;lt,CoY7Qd^`,wXa3^τM~!W0PLKܗ]Q;bPˀƓ=|CMk7%Yo4-z$Ғ:>Ulyrҁ?CR_};ڎ,&6|G7Wv t,-j6̨2es ad?xzF3 yB,%nN10f(,YDʸmqoɐ=u†+FiZjRإW۶2u ֱ!̨3*[ #RȰǖHj4N_êQ!,Zb~X6` { ZSj[Y0w#%J`.n9E2UoY5x rBҊiCv=#^՘|N/`zym{,O8Ȑ zG4X" VZM![WM[a{~=XLHJݍ>؊흲PŇ@ ʕm no{yg$EG^ݑ0Ft@[3MWn}'隕oۿY-70@P GYu FVx3}ZW{K4Jc]3y `~:;ӽ2?\iyOO<Mwe 4퓤|O=?cF/<^i5pcϛwJ9ˉ|mԔQX;L$ =߁+ ֽ>:pze!W5Zn;<}ՈW==g+i!p>ݯwRPBes*JSwi ]B{؏ oZ6>YY g.|?9mh $ANJ4pxKpDd 0#ZFti-7R`u[WS-8j(@t# F@f8E { xa#9X"DLx}W?CA.bΔm8Pd]p8On9zQVx>9`X[|o8#Wd2M%OaQt2l,KYzRT2ƈAwxHΆGm*6&o}gp )O JXFf bt 8 WH5 L^49#a7WThs*P GwDu(e<77QbMq J%LJW2<(oRƞ+1 B\S'xD~ X!bs@mA)Ew(p}&ECLo秅R\s: {R((E2sN*;;G4 TP_̀%9r<@܎*y o K>;Lw ZJ/";񥟂 \'3R傧kb1e)f׋w :F$̙ߨKM܍G6 ]7nߵ3wȝ4!:16%-fk 谪֞5n圶1 z8mv3k9!ZKOg>l ЎWjըo;abzk+CB[m?-Qhn˞G KA#RX)/; JPNdžΚ54ݬp^ dK*F> Gİ< ;wόb =hB #䗖"~ӧ@m|w}&*XmL2KA%rhH`qQ _(H Bp'_P('l+b4 Xe(~֧bTbž.^x%+TO72[2hP|E`իmRG(/EI٠<,&کA/[@rK#2Ghݍ=UT69GcT͏4 )Y O'@OU ypC!"O ,0t `IP:M)W1=Tc Eg1eGSuԀ\^%^I_L2/͡T7F`,3j3*+QL.#k! gΥ3K;/[6n8} ?ލ3ʡn|+XR`V^P<6RBOd 2O7deG^J:n\\ ҹvm+qFv7H'_{IRh v3`T 5IMSy:<JiO76O;H{0} RÉ~xU8!Dh"=eN 7cQHz Ag16O 'E)pNϊY\k;4:MrrWHaz|@FPdS>y ([n fi Roy $ 1ZhO-f?dV̢4ôPҫfH@|'X4)nqKO.4͡S5Hh@W<2'a@4cb Csng(*pOT.^pEW>#K`+x'X0%aosO/gC U_Vq0!:6Wf Wh\;ƛ]8%tV~4Ė9saqѐ>*O*3ͯ gww֜;}CGc͚mn]$ٷeO9Ե6|VW{ϓ[[ZU{7$۽hKFJY0ER-8\&,GI|Q V*T('sƒ0HGQ9zJ]B3JZyzs" 4l^ `t\r]EИFy5yq M՚~x1RЕ2y<y|j'pSzܬN@2x 0>//6kڗ|!G2x|\BYDn f7TBoAQGdz._ I"- ygq{kĹ $ɂQ`CQpB:qhP8 f5o,o%C,)T;]\|@j2]x9MY2](2JF>JiSEn1m2}J"Ǘ}JRLFi5ۭFaʏ5^dTL0̎h!-äAjάӕҼјo.͍f;M<7E-Ç?N!mM~`޼HQ'd\40ߌÑ;'|?:߽2^*TlYP.YL)uR)gX(9ʔ ]r<ÆfɤK$rB,@? ՘Wt`99vj7` A FQ|4!昹$x≍u<}!x]Ԝ5 pqs_fȍoJs4f&0i'|O%ĸ>T?n;!|-iFr ΅gr5ȫDV{!Lvm&AX;0A+ѨwQҟ'<új "!Nl|XxjQ#'sD.Lu&o^nm\ѽhV_sXBlنg)ttwfbk~:r`6'Gˬֿ{;j=f>5$|8}MnKn&z8aF/K67|D c2]|ɪxXT>mZK1yC1}w/6lz#ޒ~_qKKK=@n oZ/o=qVeᛶp9R'. }Y{{q"޶Jϐ | .(D_*+'\.?hu?N'᪪@=ƬTXUU^?:5/p9)2eeU3ұsX&:tq,8qd>IMLO-Ow&bLU+PNU+zܪRVpD#uW_vU\?I?NƧb`|*0gr$F22{9K8BT(GK&7X,YX3.A 5 $@k3W ^JG ~F#| 8}#@0C fS~@*i1@=P&z4&)j0trGQ sRUcuYi(tp: 6V47T2?m ^MW5+u<<53 Ta?e}U8z|c;*b<#rN`%rOxFA)\&?W+cᲭJf.Q%@Z!+3Ǚ-dd`-Pj(^'`uu5u5F}qa̲e& ihQTbO(}\D el!C>$UBџafJǬw:c$Y:}}gkAQm}]tv(b{@WUWjTYrRm޽pQ~)nByuuCE݋kfVh˚r f'x>7vH';3퓊ZʤydCYfoegߥXE^^MgJQ6уO++)-L_bݧ(/'ϖ$.KU&³<_hJ}⾑P8'Gz3i gb#%X& 0('~/^f/1U}R{VΚD@Crt}FZQ*]L ܆s}%-` vlIRnG ݸYޜ D7MqѶ\=Lh#;7/[G-]zcĪ KH/ytۤZ\GbET|fڂ(JXMOTtV|M ȡD=PKqC#~H{-n!RQNE=/zuAX- 6M#=PKCJ=82rʑc 4DI('o`m~O:"̆aזW#gwjWi w4\#~I0Җ̞͛=4Vۘ[}/4r2KZ&jUay(xř-= kD/f^1IYܩ+ԕ̑B;TuE6rͺiUv%͗\3\sS lɷ>o^ cWRaYquEz_Y6i@3o?0O-XW%ViQbHݸAݽp juFZ/$j5R2!}?G1nBA4s@@JU!'TmkYtv?07?<>J[뿿b{9+G,t\\6(M.fan.n3ۮOz׳9F^|)5^? 澲obzڌ˖<#2mίۨ-:=^lƺր<J|&LBDH< h`I✟8~O}I!gHc=N G`dFsYhH{j̤>9ɠY6~Cs(LDiKs/urUU /hMqӰvsJ5l]Y/ybXEvŽ{)B"[(zjQO^A{3L*_*hA[mX}ի9O_6YTFԅCF\.dG (Ò=fy3k̑P^F> I 4 -ђbx8M? Yx ">!|~S&ʄZ4O>ڡ[ߺ۟ԗ eMkd[+MO@ *)joE}wCwl+G@TXbc ՘u}t|痣kv{^g.Q+yq i5P{xR8MC:[01l(fN\pQ;wbÇRNXԶrU*% W^ ?%yaYĘzBI=&(ʍไ}dCJ3+li|i˖&i bC@|]:. [L_T}woIuL4iAeB BX Z /?th9۶xz`}cHsta%eF33yL3~f3<. B^[L2x,`5 @ԃXRj<æOT-j֕"NSٳ4ysZzp6X+ԨlDEl}NtA^'`R\Xg3GG` CfA[9WvѻNxҧl>}Ɲ9.aWhc>@_5;j 3#^A0vq-ٿSp)CdF|xF*8Fё"U\Q&3L#Ndi<4aJq3`گe9GB &.ImMf Ggh{:'9 NTƒՠO^=*e(P);@߯>+Cށsћk/>[:! 1p~ ]މ9r#YQ^B .CAWMg OLLH"Яs hzo$1iZ{sᤊfD@FQx,7'l޻ 9mjކ2ЉǾj jxv3qY+QX\u iAs E7^x I.01ۉMijd‹y@7YakN}j~o; ۺV?fo>zmώ?uw϶.^}nٹOq+;eoBweܹUa۶ yVQ["?}!&rλAPPQ(8h;8]qcY}fgnr^?KAf3\$!4}kO=Esix7?W_=bw]KgF#sB"ڶ~LԓRgSƔ3UL-SLof&1S~Y¬z-` DD,EHވˠ  u)OZ>INpZfu Ԇ'TsL9}dTqz×Y2<3B[pGV "eܜ+hJ-}U('|,oc5\,a8<Ҿ;?H;h̿Q~ee>x&/ g+rm?Iؼh?Wq,2! h6_` `"{}R 7$5"GB\!}Ϟx僣Gf|4Kզ3k7~]7uSltL;X1{vqĕ/~ss+7nX91C^/2 &uJ`n:c>ֱfNmF0#&!m@]k M%~ˉ.3z32PU~<??BU82c_"i vIսߵv~>}$2V 'Twa{>blbRBF\[Hj džpP4O7<)3?Jlm;Pfo3.]4W3]u ;\@iOyمk0 (Oe*-d![\27<\΃`RlQjgc8i \ƣvn5FhX wpfQ>1܂}.+CYB _㱨yi4 ^ ӻhOwD:, u? ;z%0fȑFQpH>#?)U}v4".Eڌ Oׁ0 f8Ց# a} o˭-{=8'YExDV0a5iwj,`,Z*.w=6B+[jhPLAT]5 ~pSH` 8UH#'~RX%RU W) RY:W |PӭkLm8!ed+2l ,s8p!m&%{%Z[.^ oñc|Hg (h]y_y[1K+0Gm[ZpeBsL{&b">·cw8 F5wa&J6jNq!M 53dEUI^^|#:~8zA<ϴm*pZ[@]ךsyA+V͐p@$PDQU,,YY4#].]rѾMoUh* xq)QٱA) IdqW@_+/ Gwt&i^WmyҌrARyw!7D !nҿbӞknTޢ/cmRc n,&wn\@܈t{O\z ҫ;G=o ]R`B{V+5%3eVy,W0玉___i,i4Mym|͛0t͚jr)e*zf$]1CɍHBif hbʐx tD&8L,["AuߝD1Ӌ٧:{x0Ҷd֞=Б^sŊ;a%R{7G=H,7,1ocփףЏexX!4ÇkPiC8XkWeL#36g #H>6$.=̞P2* 6-֘Yt!|ۀGKk4g^x]R]ؼ7W;i$bG?ƿhӃ,Pd3H W @)M&+f||\2+6~ɩL-qIxZ2lJʝjT\N\o u8u̿EK*iۣ^ȣ%iqB;󟽼lu}v;,@r;L,ge/eb㣧=)_hs0Up> d8WOOfW8h{,P:D({)t)K =GP?G?[&a"tb~z\n'ms|vX?k?q\43&#> tdA](gw=>< BY"hD1\XⅫݥaW>yyAҦ@D+~{14 ٣4Fpw%B\'K CDnlXT ,M/>GyI.lj;E p⅗D*ǡ# ~ȗķDn\߆ȇD !3v]9/TA=Lug*Jbz'&O83t5gŠ]|֊ īx|`pҲa!QBu=*.v޶%[<s8>R8*Fֺ/cO c\L]T+Q, & !>F T =m}:emo A)JkygM\Ӽ3f}塳[CYtɛ!d%&b؋kXBC.S Qe&66v$2Dl  !(ى2uG=K,gGKp@M&I u@nJxbC4S) > &BUʀZ h'1{C `jfѐ`,7?Í ?+i8?zJ)e3 ֕?]SCIB7Z-T>5@D%4T*!{^y jbR櫻_ɶTjի2 IWL=dQ=`!=#*o{]oI|;I?VD`eDU'L4=GF `$x|t`BN@01? STS,2d&Ww#]`j.&u#gjmmC3^?ԅ7mm`b$aP-mcpp5.B9B1OC?U:˯OxZsgY/:\OƴHˋ)Mvb JG#L=}B7~?Lz?/ѯh8"hX0[;V:V,'m$ԯsETX9 ~kYLl& ztsR)/T [?|2O;-N;wΫgEe{^]oL9wHrKaqC.`jLH7 0L 8>_TCv<<i6HB4LAN$b`4Sx˕%<* 397uM!/篖@|X#kM#CY oI6B@<9q,uW0L`"ڦ8$B2 A&3h #ٓIO^=R?V\1EnœE@bd#ِ/! 1oހ%qKi^" p`VyRīfĉbϛ E:T/܇y3E|r,Y8%^BqݤTB0 "/Q|Pf5J=#pJ!54L5֙?dsavAb1>4gS7olnni X>~'5`B$X8{2h+$U&6%eB`B& NO:Y(#h,5bQ$eY |ZQaqӘSPQ 0, kq!}aA)j"G8mO8pL -j5M!,HnsT<[ s&v5HÐQJu5'{Yϐﳦ:U@ jǾ|,8w2e<9D܄)YV׾κ7cieuk?9T+5ps8M!~yJN7`u5>]-ANX`L'7FC#44JUkRj49jY&*O-ď[ձ1`V[<7%ǥUT.oϏv&j4?Uk1 39/пN"Ӣ+]4‚>;ʬTe \mTgHi꠼6ɭpT=g9$pБ\&d6Eͪ/TRJfנtS4juzdMYr؇W?1E+`Qt,]W6}&#>ý*-WeW39XT4Þ fn̑h3tUr.oz= zAj\.;xpR-1m9U vqpok~+R bQm{+TC* (9CJUET@f,JԧRed:mPk-W(F_,]T^e*', biW̲P8xRz礯Mwwp^@X1P.yo_\w?O:8L$BÇ,ߴe-%S45m/_^P>054ЗffL4У}]j˒GA.i*u*_zE-#fί7޿t-#3,JCDKʤ,I% *H6xst"(t b s=$ӉӘOyX\tlÆ@  JH(zZ]ֻ2=5BZNAO׿Ϣg&5Im>C{`2džiyW6\p-&ź[}#&_?I <{6z&7a3&1-g#,]4V*6 ϳ+T]Wڪ'OՓCXhފ"V[^yJS\+ Tp]V13%WqvV蕅XS<E~X9`0<5}o?sz/L˛ڙlݘjVϣ2!Szyx7)vr`A :ݷ_F cQ 4oVj d76-mj̖pkyV:fulUO Ԙ…uG]g9@åYFaa\0aMڇqP/}=3G@qɥ^|W* Ρw V<?<(|+VaޒEۯo6w*bPu%V";)pNZkk"$GsCO+x\ߪn`ʙ"!8vItܻƒ$p yBa\%ϫ+!:+DGfKIڰIϘv27A,F#;~4T6hP h SV;Kw˂!sw+n,gVYPgvՇ\T흜wlOwI"8<]cs<6]CPw0eěߋ*!PKbuo4[Xrs^nn%E}V(vZ]aZ]84{̸p}~-=V_7fvFqD&qS\]Jnܵ+p-d x!zbꑛKXbhɑ=\諦;z=Vr[U𡪘TUVo3>nIsc,r|tat/:7" T(arl/pdڛ' 2Ϗ$~GvV" R  _R ni Li1v4o\-R-.#$\-+UA2EX%ENcOWO ꉚm> |o%ms6k E+6b#վX3طט3@1<'ߞ6&sۦ$wA\4PdjMƕwu\E0ӈa̯D1K!wHqU$!2m2OwIT` i G^rfDsEGTZ*x9wL=ח{{eUF0I}j+zd2<wCuHou`TnOAOo"^VRSmE޶#}~.}}ݺ1ni=h:U18A%ⰬUbuWjpoUe y@GW1{#9uۺfQ;ܒ@rbVGa+M\?qd$jLg[vk r\,ys#46?>ml~ryNl]ҪFIۤدhjur&tp>L.LT[=" dqG”EIx\9zos}œӇϲ76_meU%3fzk:oiFӖ\mz*_ڛT%ޮYJi.&0V\ wYHIXWRHITF,GKX[BHf +֥roAcgnI})t_9J3.TȦ[7BOlڟؐ5/.='YhW +'7<8keIj6>RSVǶ?x k z}%k]ɀ\vؖOj_ߍfCZ]P]=y F`b} M+@ƕ2.%F揖odKC.s> $tI)tucjW.:v1{f%,h+,sJlyBeh!7jw~}_`T W[RFF-t ExcTCnSl fzˉԹ0(m_n6ЇzfNeЫTS2jR|JM+c@ܬˆ=FEUqȌTz}J=OoӫyR따5S:\͞P +)iK]žTW˘hg4-xYWOHQYL0^ %L" Y47zzpLjx(}}^-9{"7-{hA7X`9OC.:VGsMJ÷Lܕ%gDz J.w>5( .Ls ./uUk NzhZ/k1܆iMCܵZBTVJT/|{}e~~(׏TqPrJF)0=]Vf4pT;Tj_nPtoHQZ۩N #,WB2Ȁa;!t&D`d'gƚ9hGф":DgDdϛ@!;"$8MA,!yC2z7]xhqmM2d]y- Xp,cنWdqTÏ;oޠQyEg|ZfnU>>N|/Px/ѫZM%0kp9<=0@f8xC!'ĵBâE[qEK\ˁKgo8z;O!>:h;B\&5XW!uw㗍#퍗7EW* ׇ y{p2yE桍ۥ(t|S,už˖{prL 3rFWj^|{3563=L颁SPF3s %܎gq:ô(mA?9X h׿8Uvw:ٔc2D?dLbo~6N"* ;xc =pa\O+`Iׯ8)xZ~VGji0}f9i,x@Li<C0K<I -fB!nm$jpQ`Ip.B* FcL8;Dkwg~l6|9A&|)5S@]ŎTKA4[+b9fb6NSKi1L>/@o_k>?T, E tĐ)RLUm$l9,\$GfjN(k\tVI\ E*D>!=O ;yuFtJ1E-h>Hze6m¢ wOwfS9U!b@4H1p'g|ztqTqh TtA*e\z$eчk~@g7`zd1 Jn n]~BwAF%w6́nf?ߠa䵃}JAlcjՂR*\i"|mrG ꈚ'Adu+%f.zHuS 7Bo~2fmEWpk0b00t=䍾쌳^B߃)fҎG;Jxow'y͏͹ T ^nt}Q %GM8S׮w节z ">RO(X1!Xj^ f?>s Հc7?}P,V|4^Hje|fo\./铹w 9z\34;ppe= ԂIOjV7b1M)f?%X Z&^͂^%ePfgԠC`¡hzs5qʋ]QDfH]˒6oEY|A /ѐpx8"W3f x_~N\skz ],AWϢODA5h=3_B3"fDHc.M@?jp}wYr?c#G_'2_cVk3:?$XؙoorM_~ BO3n%&{~ao]Bagn}$YL|lD!Ħ όAuHJʘЅ(]hM1;Y';KFz%{&*$"qq>kcޟq,de'ke3ObΞ.qq{zs`iOͦ ʦo kj/A >>w^r1ghhU=2]:pG.8oߔ o&<5O!7v|YX>>3":N KA}3Iz[\]vDlzh*˕Pw PH/>K'؀QMV 2"[\., B񎙙_8ЮVw m[aʐ|w;뫖5C|x$\6tcx/;O[x4 Mͥz&]c)Eo~lO2x1y`{ s&S0[8m0hj\2v`!+I`iQffaUEU&4gӈE@qZ#lʹۯOʼnmMT>v\ f)6f@uTO<&*[\j6`.A3dp&3g5KPuv6T1?XԬD1kTlo~ypSI*m>TNN/3xÚgTKXbj!Q'{P{Vlپ~vE;V=+1/G_sNJ5 ɦ7{AU$à PT1a٤>2ܲgdW4Zn,XHBOfV(FolpԽn{R]t\[e@{d(#& w)3N/} 0ɲPDci^cI+7x|sQ',IetQ5&kΆ\#2ׁLCI>G!WMhw-j%;{?{ԏ"F)ٿƽD4&Q?HxDEg}1EnXk8&csLuen\Q =ۄ m s]~v6cD{W_-ǎɢjQxfJ .LR2x bV9j~elGLbWq: s4SmVLY{*0kt#xZ")(c󕸶vKflNXA$ jX<y4 )γtM[D^pa:O4gwt+v{:FN t?A%JdA e˷gwPJ-01 c-;}M qr_}[:?Wk8"ym"NNҴ9SH-ˌQ^7 Lwysf},{0\mSOl8ޙÝMε.\cFON=U_~Tu/p?vĸ/tʓ:@bDԝq &0L6dT R|e'x7vRx xl7J a1rCfjYbWĎln? 2$zJ$q9Y Ҋ": H=o<-G_iy/SZ̡*Re`T'FOr% Ld%ۊ>sg? TH6,Smx Xt0\'6} (]N_&0sS~K!/q*aNnD b$#giDr9:y99d[Y:o^jfrJ@zp M F/!=HYe\x(I6ǨũeeG9 Lzz#RԢVa5'mLKPD=FXV)ҙfQˠlOxc`d```ad+`I={&r00DC xc`d``c @dyyxڍTjAݝEW%EQ"sQr ^^骙8Q=]Oxh=0&t :%PhiѲ/mWx0swcņ>x, !U&M{4ҩ"/Tr'}Wr; w^lhόrscƇ)ѽ^őrDȷAOפ[S-U1>{qC˼ty8TllW3=͝;fy^Ul|8qtg_ծ91\5w-j<-_ިx^l޿-{5"kxf_$pJNyD8/i& cеzs^. o|?~E}|mL>N‰9"z;V0ocP=l8vgSYFnARџ! ՁYf5>ٟ&}j?[)kmzRuwcĦfmf|-?)kvh娀SD?|]PɯC{"8[Sn՝ÁJ2l~Za=׹.|({>gSʓv] ?ɺ~4dsG6s=Q_h;"xڝS`22*3rJHTqĈ)PX"23GD#2S\9"cDD52FY)GhdfdD :m`K"j9QIY@QK׀s3H3 3Y™S❕38+29~{n6&;:17k.wn[lvq0/oZ@c0q/(f][ ψw8^XІ"8 ŸJ ':F,A^G-^ZLIIJOI'M2QbO&%&ےY1oqqdjIRє[jJ*#UP0 Mhi45 8222g:.]^^X>A[_!Gx3޿Rs+Yٷ*kvU0u5{u\Z#^c%FYkk;P2$O~)@)dJ:.*Q}#ٍ_i`r鹢\Un[-7Litk#x#{c(O׷IIollf1 Ζ-^&Y ja3ւBI!PTY*EƢ ̑qɭ̭n"Up#(Ly*7!>?ډY' >j o"YUL-)K2K8%ҘRqiGi_v,P*kb'֋{(8$0I$jooEF|z_>Gefe~~Sx 倹:[ K]12@Fir\+iŇ5###JR D4橮79ux<φx<y|x^/Kerx^kuzxo[mvx{}~|>Gcq|>gsy< _/+U|߄o;]|~?'S~_7~?Og ?_ofQ`se`k8p=wpw#s0{޸xxxGx x.`Jlc$<OS4<7 7㙸³</‹/ «xhfF p#[qNE}܆a˸Qh| >'IdoSix+ކx'ޅw=x/>g3YlsA| Eb| _/W+Uj| _7Mf| ߆ow;]n|߇Ca~?O'Si ~?/E~_ůM~C?şKow{ƿ_ow YyQEQeQUQsbX/U&v{=^boW'A`q8T&G#Qhq8V''Q -!E[tDWĉ$q8E*N Ilg-,q8G+ ą"qD\*.+ĕ*qF\+׋č/n0%BaB n,,zZ7Һ֭iNNZwӺ%eR-r#4m+*#E.*UnL(FFP梯~Cd3-Fc#ѸFMz}-ڋ# #,o#gTi67(S W>i11&ĉ}EBfC/ Qme6TfZҾ=̈?dzq%3Τ3 )Ev@)Dda).#5]ܟejLZTڟ*^HW0#fȢ%*(x9StG0cۡ9)nO`bG!oV٪h8 SÅxRrZ;$۩SUށg򎡅 '6sUҷ[뭼-tLxӺ.&ﬔP@Y60& r} D˅SHnHWS5.(ƠHaNo 9 ZH̓"dPaκx &I7kQ+1儃 2otz5t#>:6uU?޾}g+KQ ٍs;̾~xm f&<>4<PSx4ۄGˆzڶPhȬp_HOqz=QOwd6E +hs˅ٶq|mԩǠ^ 1Ǡz ւFl5hrJf;΍6.\03Πz #ꌨ3mBZ3k0kJM^Ɉ&#hۜNzC钛eZӚ'o-^ūxՖV =i%$$$$$$o͈6#ڌh3nuƠv=u^tFGܧZ1XaY[(Xe_oS8s@՗깩oy5#dx*LTUwdT.W :9@( EBL0TP@{f=usF/tsn.\v]W_]3Ojۭ"H&~?ݜABs0֓?5;8(w1@X%A\8[R`ԈFFԎQ5hѣBJNP~D`$3 Wg,Wg{*Ȫ!ӌSHߏtץ?+ɖKdSL7Ol#&>щ@K<6u'﯑Wrq*TuF8 ǰ1f㘗T}UֶI<>"pxxy?`ByZm?*.XVnjS^ςjx39@7 t :gS[Y>&,8. 5)weeII 9^wjߌd;Ɍd')<$0[v ڲ~fz;NvJ]F*S=bIڗΟ7ukϙ)L\wknvq =#S=Lkx#k䃪!d̪/U+@6NDy֤t8ڜop_@U H % %TAT3I QG'ݯ)ٻvO*P@(&ىR'iѽiz՛buͩ}qiv{=鸇cۚ6Gt'8[z;Xзtv']Ex1;sԥ&|,EYP o9ڗ e7[veEh^YRu$c AC5dNV:ȹDmH+2"rlI?i_L5*$յmmb-ڨ((`"XD"@{BW>J<@[@D#ػϔavpixd0ȕ<]mr+r{B0_;c%`uC]lc9<4ό̿Zs>݂r'YǓg~G}.r{ JC'ީk @@b줂#ĝ\a6'Db)-g_?[͓NID`& bd*$ <[~k+xݴ$S*(?o]$iaRJOp~#|rKQ/ؿJńaIvۂ8?^ meRӑW,9M)bP.${i.4Vƙ2P{{7ܐ$#➨D-yF Ѱ i.Z-puLOnjWz=gSf!aoVEH쪞3"Yu:)?q!7;~OWkG7_}V9f(oujg;\ՂFj(( /T-AvwH!#L&v5{G<-w>̐e4c}>?_xwۖyxLa&&ZszG{||̖U%+i^jpśZq0CP1Npm9%*V#[5fc挧Ӷ4?0a8ݤ!,fߐ oѓgx}IP RmL:L+ۢݜ:Bt~]7]_1'm,uaU3+_s~<<<c@d)doe*27,!I8": v#>QkaS~#b=B=|9ee!d႖pפ4hhPP(1$[^d9;zY)Jn}!ܲ;qi+헄H"1$),&0,7z(٘5^7Vk2)AHDk?(Zqhю~f#Md0* ߢ)Α*UV(_jMKe͛s=i劈bp\Dk_VE,fNbSY1!Xvy Y57I,4 zcY=X0\K,M6GmiE6LH!HK]ZD˂kJ&G]]1`,#4Ǭ5iXi1+ID*-*^qgRr X߆o}[But_~D"2C2}7sS PxΩt™8 D,hcbP#w: 7Q}sü~D`kn|/|&*y0I(rlUaRWuTLi)$aCE.Nt_%tĥҀlE @pT0u0Ln\U:56q{cHj2~pImjh`pGbx0r,6juZ/ٱAxOahkhd&ܠ 7`NҵftS#vLU ͣѭkbn 751c Z2%HJGY!JR@0t_|f cjMkhc}++w&Ƕs8J{oAK&Q m~+LYjao2ܩz U'*"Mqs^ٙEZiȓʹhSiΖ3VVYkR<NF:(yPuue*Y:YcL579X{k Tx1 .^&WeU+^JcʚwQM)?)/)qHQT̑Ո5>%ͥF]Ϳ5n99 /8REGkw ͦ<ԎKp֫g 2Es%f %U> 1^鲊O[MEO_C9ѝƓv,P /t]*>F7U<*n&WM*'<%PXUl&Vq 6EDʌWjWApD4jjg>}k8\)-yO} ,%n?)/C}*PC%T.A"]{9\3Byfbd>Tm}ɴ}T+񊷶0TSYԽm |]DGF_$rňIW\q{I dzW`w4Ug<d"UPII UIԭC_GC+}%R!yC9Ηհ 냥},US馠mB~cH'SKYSy0ZƨYʛ~V+F<7Kh&mV=)kxqӇc4p_sfM8l.0qW k,幹l ?1#14N/?E.;Үt^oH 8X^6uCLdY;̀HCY`x8xca`0t@@|}RoVm%Yw?ėw: .^eZ̖-GeûϪ,7aý幩bU@ѪQӚ۹gm~bNkc,z/\M5,.&Z|pU=<5uL_[p&4vL9%Dr 9Ζ'o`ҋKFXcm 抜:SsnݏOj{4 D -VB/&8~ w\޳FGL 1墒;5uf(loN8 hKbZByCN@@ ~06.;TSNg-vWy  AއU8F;kȇ;?uW[}u,:r4QHE`SpAiǡGeͬÕ[d}6ZZj1qtfiPm!,k 6r GԹsm${,C])4`jKT/-Y &C{ ['ٲ6LG1Ly[hr؛:)hXT:æ"PPR<ś azoTQ+a-o9+f֞PćցMlͣS,}FD$sKm6tG$ ~?W p6<3#.NS\5И#|T\o0Cq$7EP"vI@֐RNiȯ= 7ܤpMkpFQ5--s@WC~Y Kk <7IF/{",D|,KsX2Z> 0F1g"'T6*VGV{ ٹd2Ry<H dS1)x¤2av0Ğ+B " ~VQJCLJNVR,Kc$ֳȄY8RpMG=|S 'Q`~ y4<JNܴi#f~#* uͥ򶆯 ;cL]tAGy|󡣃: W?7*D3ߔ* \)J)J[ @xӵ tvu18+ x9{, "t۷ܩ*\R ĈP:4̛2׉ۜBd{cՆ ZquEKD\Ru<:>[7ղԺڠjM\Ri

    {K!d3_dz#(J𱔒@g odեw܆ķow.Fсp5 &cC#JX29[*]k_@\]C%A:dJ/CeG߮w[ZI4R]_IggæceM,y8( yйd;V(y\R B¢,z!+\FeSBU^8O\Lm{Zd4zZL%[+m8ќ.c8-8M[=M`±佯l8 ,K8LpPDd^Ps.`KT q'dQ(Y=LhNӴ-lEh1Ц!Sn`[@w Z-VehpO#%$8a'>d<=N-I ϼ ,$ #D]J ħ0`wXk?;Hܻy #nxw#RZ. TS+XzϨHw,ӏtWj ]ep)"7Dk(6 hh{+akUMeC:8S8a d8jsOzn)ś _ڂ1PlYղO 6^j= ~տ`iETgb+Ƅ s/kn be#-~r? (+ko99B\ut!VIҦrtV7ڢxAHp6C iֱ[l6|kϧsz[:hz{p/Je;P/p޳1}ﮇ],r'^k~U6-mpK"W\L )b+Lȥ_;/Mqr f'[wwѬ "V"D~L$C!jB K(*MDp< Es)RKn [@,؇VYy*A1e:a%rB~JHnbG\Ͻ*J]>! P¶'ԅqz*DJxPwnC<5yF%X4R1 )-ڧAzSO60U_lr &MJ .((\v# d@Tdw2~}^ m(Q@لR`iP f}j4z" kLBZKoDEvH<$GL3%FS>)B N EAbSŴma? :bz]IT3eϪp HR9K,>#g uL2ÐiZF%U#WYa@1nil-( 5nmH''MPj9 V  Cڀ4rl+Z#4E\־Yl8 btdXa?\u8g@ d_WNCɀ>+xH*/Ll<$ǔF0CK @0p6"mokw88JZadnUnrmY9T ]&U4Q 8JKd:1LN`@,%78r,*gm>i]ZN;ٛ\X%ɪvEc xP_.OG\QyI)3]0e]UطxweӢgKzpG`ӫjid,ߛTU[ni8o@-_Mgg'?/m,mz;:ޝJgؘ-TydITV,C askam'VG%̰HbI DDj8CYZU>8#COR<Ac8WKΰWw8ZI)FJIhOIW8,~zaB+ {AT!7lM<]\M7(Um{pka `"ޗYR(giĽ fq_:dGVzuh >(0ZZ3 XC?<$z& >^Bl ;MR!y2cnD'gǭoGY$di0EK'{_MaTTq_uW}`'Eg"z^;ṙX2F5zEоizzãK4I+(/woɥ})B" VO‹\(R_rQTIS ̄"D*孅b,`nlOOi#v<yWc> vǵ.Ża:@K(SX3U)s)1;Q{@ӛdVbv?%6-{,܇ B,Ϙߚ@Q::?b|m uςyK3>Z"|-4V¬i!<@l񉆔Sny\Lֻΐ!/HKZc $(Kږaf,O>K%.҄`)\ suBcS k*\kkmxfMq3]-:Ď{[iaYXpTerv9+-sr#Rˏz^HI?J76 I ^1P..>`FغPqqX.}b?Ec#(UmqW_/E&xdsISOĺؽw0U YLKa@ēp4ۢ˖ۜ*{johM wkٖ2QWQ:51|^T0z/;3y%Fҩ䭫tm!^Tn+6bUup &턆AAV=]]0 z fQ[M,⧞ܴYu:S+3ձ#1bQdC$ SLb aaZ5#MU\c9gH+@-hN~rwVמ)Cn[ZFpq(_oD _ ,J 9 7> %X!*RW>'XJb@Ͱ{haۋI,a\4K|/L20Kck^W/A±qklGXsJe4UHKS!at)CX̆!=VU{ B}{ Ċ\j f®oD3_-9<QN'UH[eaʌ=&޹8P d1h SmoّSN@/v5\G aan{S}7N} $n5i]zcs!3$2;[>bb])QE>>`Hq]esE]Y0Xq.Bt@y #-77~Rq}}EYk O"o?-gQtۿ1us(O(TljOe֬N+~eK؏mФӋ](:tǟ[MzxWob%tzKiMt?1w>(]1 4S&@R ڧat,yٹ"7Զ0 ;]FsfB)Ym sij_t@>ec.q]ϝ7`R !Ǝ8A%qNu δ 2@\pՎ&?я*;أ$н!̀ҳUg *B7!.;kA?DDJwF:5eȁg<̰!K&bX'%B',:sߘ3,vkEm̪VwK)&:RogˡZڽ*Zs,RFy*&om4|6> >\N:X 4=3'ᣓ|5TbXγ>pULRU+;GDyk5/*{1,Jmͤu?:$́;&CΌjRY>=% `Tۋ|kMNt@n`1D{wG rSZ#/25H9 +}>ac5֑玙d-Q/']f׹?z?}!A>z34idq}O7x,/.Yd3 pP"ktvk J8=F Mߵ>&ji7+9\p&qGrGOnב,l{`>؎fo8kff7(V  6kf+TvbD-ySMW~q,-;oCj=յ[f)̎LJɉ 9cI$UPR Y+E8;+,T=2&z~; 4Q_V|> ~j:=&6쁌ӼIQ jA?ns(NP3'(]SIsK88-y+.+l`0*!j%[M8w06;Q#cˢlurf)\΁ҊN`ŁթAwP XݝWtH֜ R H,Oђ0t@û-,7+8%NT|!ZefaUp¾y`nQYhh}qI5$(oZU]kB?~ߜ/D/5AzvNP, Cky"\=Y> 4T,mp/C>w 2M,=ddV?ALZftgXϘqM3]Ċ;g7^qDX eHC:U & @~;Qcpk+ضbQk,0mJ@@`9dn~ncb([[`uz|3ٓ2>C=n\AlZ6LWu҇G#ܮ$a)h 3LoT9&yܗ}(2>k!AH C| n&hd 5F?G{ bs9-_WK˝hii<>B/7R|Apۄp5k-29>4j*۳aeiv=JK|mkgC .CFh%|_#P,w}]2ްA&=67)V&gEt2o[ wXzQr;3ߛb!vLL3>8C+ E1ن(;tҌW>Au.%nRR@.Է/jy31zb^5BRa8|;ONsWKKBS|ӻV~Ëg*KGcB)wsY n_www)Y0jv~vNln5Q5Gҧ¡ uTɐ(bL q:CPWdIa"fT1A3<pJn&=Dz4=`&<Ņ>ë-,b3$✓];-I+5QF$dc٣ޓ+vs*Z^AX0g"YJz:V< U#xNOFuAy1^& y݅ g0S\6*Lh63S/Ym5aѡ,[^-Zv,ϔ~嵾DqHGJZ9v΍{FB5->g^ٹ-߲̑$oPׁ#Z֨Mstb[@j_1ˑ˥>fyIۚrbVe ݳ!z:SD_C%f^kvOtnyCjP?*t.{o88|p)깣EOPUs>1U0%X{5f#cmM&:%8?` v8q*+.g6+O[=6 !7_ɋFIWY˜/hLVLKDv =L2a"&c6+.JZk"]SnhFd=jfx&a"H8L1t.-y8GeYQẇ`40g`K%Oۀ|f40%*ꥼ-6] ӑ VsH۟2T rfȝ0g=0un~ӯrG#JIjSL|;)Hevqt1Q'[]zObȁC=^U@mg*nqCwX`z85RF#Dͫ*,z*$fZ,{4+ʄq8etp>K:rHR|*NRA5w #ZxR zrNeF"b; <LĩWYDċgz*{ڧ|,T@lQ&rF#fVݦ`E9OՍ>ScN c%S:tI,TnZ,A]2qJ?B) 74uaLzEߏ 5UB>ffҹ"*xR|w蠗L_$#2)I~ٯsJ&n~ꨐ=OcڇGtMPN;aWpW@!c {Zx?CT,>sEO^)O[?37R`ZSY˯ _8J,~'@vJ^'ʱf+QiWJjAt%jLb ?"u:u-\?QQ5@C#n{'ZQp<{>tΉ[ym^zѾh+ɚ>j3ɜM,ۯ<(74Fk;FWY+10.39tzhLxe[g# rO%=U¨ytg< 7(^BlR2!&\õ72O΅I%)KJ\6U\k%=[z]kvt|Ԍ/?l?:_|tT@'DZDv' PHbj7=aԬUUGsnʱ65cmҲUf6PC8U" e.oMÌ]9 Ⱥz:D^}d]qm$"*!:&4#HHs^.%"S-YXnw &= ˊ5uDw,7PbE{[@l~=)pk떔 f5Qqa$ Ī[YE!Zx\ãrx^ }jGJ2em#x<0BdC}0545S@ -p <3-~B\׶#7\ܖlgP.uL;_uOǗM]F\+#Soֵ*W~09Y4v߬u/?T:}Nc/?zo}H491l/%gs'oa Cdؓbl2ЇAip_Db6,qY̶Nh, A|`rۺBq%(@%-<\q @Tǽ)_9F95H>А2fz![5-J' QLJ^v8Wp%Ϻ" kcq_WIHJ"j <3tK8^lC ]߬U FX&xl|Z"qR|7p @̣Bx| 6Kh5?@P>4</\쓎<F}ĵwrc)uf҅6Oh)NBO@V 1&W}B/oO:k:o{F QLteL*xJ٣K(hJՇd\E$6wru hT ?V&JT)A] zD_ 6_Y;zL';Xpe}{OzoGUzL0Ѣ |eh&yȚGŵ~=rBP!8,lv0Kf_ N;L쐫Pƅ0YM>󭯾,#@!gAM_#{y_]Ĕ*Hˢ^R50 ^)qwf9 ??7) .:'on0Ga\/c > ʂ  U}C Aq@rMdZQӐ~"Qb< 8q''';Q-FdENr gSS;[XbC*_lsSuJ!ܭZ4hKUDlLu CLZ !lÜ"laj̏ʇڟ SD,L-,QpJ7`__-ݟWf0J(j>yi+SM i{IqƻG|J׫#r'gZYjLfhM9d#]E LKI-fzS 5,9 2aV0nD;}'QUu=lx`2xm ;pvM CMl?&c;5< n51uܤӻw4V&XQ!PT-OZ e{oX~Q?j7AץDGbP?.{:W7v)v"'jͦ,F>9`%Zy ;b2>/y:JAE_w > ;(XquXKwcٛ/?tcnUlAUJ(vdmOXf˕B ]3B=B-9,|! ߙ ,ݹ ;¼i-uubYŨ-S(G͆Qz]6&~9 <ŏ)WU;~u X}FFEc>G PBPal4!r, clH,BNQ-po `V^CI6/B8!\EpM>;{b:E w|*݌PTp^ qЉN. +*=PET b:Ut}O3U(Wpd^PPSvUi2,0՜2ٻ8pT/4g]S;**6 O6:h#ZGhB~iY:,lbܑp^u1फHp>h$fSR| <8?M:+2Q@"RNr~D7ivG;m,O*э5!M(_)6Hs)Y; F8u=:`'ʙrý]JI!t/&GiWoԂꗿt<%j3\_kziⰞM!$%K s(UC~]1g}g "'E}(ޘFJ<?l#Wx.^S2je(oѵhdꝻ5*_fdhuu?scEcI8cՋzExLG$'RE8SS  :nFg! 8Wef?|xF "-l Odau` WIa|sQxgkwFc@ͽ6G.4=*fj]dߤͷӚ%6UB= 6v 4RTӛwDARi8= %pUf- !C{Rݖhkp0/%Q@ Z s*k,Xj5 ıiӫMꢝPPcX9WwKNQ2 SdfγpKD㾀Oqf&A gfÌ+S8w3003R[TW/{/]#c.K?tmt3ɒT8-%d LNJځ腥Sd|DUO\sNv&I°4hJ%$PhMQjݸ{Ŝk0rNm6g(ӫ &/ :s9ԱtJ WhL9kNGKr:4|?#\ҫXB 4H=nAQ~d[}Ϡ1 M\#G, Bl, ܻ͞Npa~`GNk{Ƹ iN!N#2 *,u7aKPVNBHX= b^U, UiITc9֜Q9\FѯgGXsCʟF[JqG1Jʼ7墊&7ձdYX0D}O]f:F{y:9.@T1p Pxn u.O9> 8x*8P七R`bؗ$poOf%eݦ'<1%-ȓ=;-x6G==gI򘧄R%v9`;P h' K GCݮ>Ի_'[skC ZqxhqopVp2nտI>7]y!%+4TI(?4q܅H3AE¢JT^1vEhXElzNP2XTu}5ۅDc5`ߤ2)=!%.h[C; ifi}N2k3gzꬡ+s#l'%0rI.qs*z{ @hhE1S_/4QcH4?@y $0uV`AL=ֽϓTX*?z4&}W7k=5%H{$%n\4󌌃߿|WC9"g]XсOp L~EqZ JЕͭ0NX a 菺-VTbȖ`DS.ɀWWHth7yL,֋S}C l4]lO ݯC?c=5\JK)UpW»Dàbf~~Bkw'< jc64]F<'Cj0>i=Mټ DM>Ͷ/dU#yضD@7:_Ema#]=gON޷H1Wǘ-*HŴKQdR8Ims-" n?:\m߼[o|b1zCon~bU08 2,;w|CX~BQ`)a͹V UP+9 !hDf́E29pp 9'b̨b_L&QKI&a2bx a'a6]Qe8AP  U[ DwYx`P!.QvyT $Yޝ ׂܸPURGu:U`0)҉RYA.5뭢II@Di]b*vr"[e+Q_GO`(d+GAUxߵ- F9Sl=cԙluRX.&BjJ}َCٕƈ\]ucv~s>{V d^03 ֍ߚ{N֡G5MRJϪ[<߇`Ձ3D Cԟ;oR ]lZV{uBj-j ٭X4ͱ  3jK?r4i* L|ܬ0yrB$CFel/F@~X D * 8KV:j#d?yG)KAd|zu<{ a+Nc4:X0GW*S/cDax7[C7rŸރ VWoZ%s4EFN˽ mϢ\0ϲ) )9 ) ]%<}N5}tT]=[=jү__9Zwp,|nٸk (w*Ɨڌ {x ?)gc=HJ|NeR_MW&pU @DsjVoq MW2!;mٕic΢oD$E0]O$l$}VV;\~]S+ZZ[k&'ut<靺OWwm"*}YQf7PV8cje%btLb ߈Be}32 #2d.ش 3)B> 6U 0c;΍Rm=HU[5Xe$eZp hLR@~@t([SY9xW'bif € 8snߌ`uKG˷#4.Hj9xKhOe>nk+*k1օdX<[)ÙϖbRϕ֣z |ͫ< BG_OO'ž[OƹvyX+ݻW\RKXar]/TL鋜aam53¬qrn C`K'aθ"Ht)~=`w82[ADp&)$ &Ey>\x`ik=a8J"X>DCEny ǫ ! 9gg{r.! Vr Lv E;DI!!Nu ˫`n~ PE Sj }X} }.w(܃?n(𴖖4 !p`ѡPM0/̸$Oq%'DDPWM@ȝʽR) E%2(d ul #a@ZrCC>FNyT(Cա PSٓLp[Mz :l EN0ӓ`yzpU|P.ƳxЄDK__g|6VmCPg}+/OD8m͕>"t oH#=$vf;r `ef4X{yR|(;/_ެ8|B2=Ѽ?+K*c}7nĘؔC6*qz/yiP( Mr0*oEU8aE#cleߚ6; ݴLͭ+[P;ueUVtx( 98g.RYD]$3 j*B ^rDc2KR\A9 zpG߉WwAۃ(Vh)-<+U8ɫY}^6*;'WDh'q^<ܥ>&:bF򨆄O*\Q:|Xު xK7UJVj`e^zhRm%;WѬjMCRx孵3D3<,>'FIHe@jzR:rcw/% Zqjݖֵ%]I^󹣣l]5v 9&"41r眏;2+V&R.TJOhWzRMDuLKVOl)џPp.qF^ɪ9ѝ*[p(J3˪%и ) ֹլLLX jVx #G^rGMiv'sa|mo-TB_^^D˅>$rG^~IT\= != ^YߵNZM}I^.|2Pqgp؄ġX{]8Wrԛ:6<RMlt vvwavͪ%a^ R+%c}E /^@F*׮Sp&$:Tsr6G0=iŐ3}`h!z;S?][{ |IK$6_2b!ԧxT.?µE_{,$/2_#K=.2JZkshd*7޶LOwa&̌94JDe;\t8e@)$0mb}b{Wm?hks6Ua^{8mJ.;Ec+~рçb KwA}g\xnO'(2xl+~ʭသ : z7h:[Lv?u@ =+Kb%9-ԒFSz"JENKd%ebv,,MIKOP3gHOmj| ĕu5'w M H)|aCy'9:@(?o8/[T5!"uW YHSt^ts p9b-԰~x[rW4/ii nU0 R.Rn`0-Y o O|wijpR#\ЖT=c70_ 9juT,#f(~9JzDZcR 1)ܐDs۟fy2q'ga_ȍ{3?}{isb?_ftk%[S܀%$Mplӫ"K5Ӄ2 `"^)?hMAWel6m5r2{Lo)ɨp(C4+,hW]X]ցfhFKgD)GƎ9|)҄?}Lr zR? {T'۴ D=>$hA٤/B0bk򾘊  0Uҥ>sćFe^K)N3҃#]:7 S<ي./ 0g`^qic!G2(A͏6'hb9{ =nWỴbT/Ab4 $x4P{ԋsx={L܎.kxÜq]d8nzG,|%Tjoy!i ^] SK2gC5lj$(f䍌m 6si?&HXsOm .ҧ_7׉r0^#vO M HL$b~ Ê1~}^sCs`:o(lEbC n""P 'SYg¦,ׂ A|6Evм~ٻ?䴰/; RiI-An!?j_Ppz]|,pUW@8DUӕ[3[K䍎mcⲔn@1ЅbͲ[ݨUH-'>%4ŊZhuJoH0_& ߥAPd[Nܭtoi\ >Ї#P NYc 9_<yH긬hӛGys`nwwJyҩYKj"qOo feQtn+piX d$6Q_V,?Cb]L:2PuSHn[N2h%TT vN@?ۜ>7uf)uߛAX7kr9ؕQ'5:x0 yv%8-IxscHRYlF:[e}_TGƮ{;9 <2?4dX>39zO(j' =,rc_u+MP } F\t&ґhuѦ2.!-`  fC95DŽZ*jx=a<0QP{60̘)E|apNS-ґNku^롖Mh4*NmR9jEcJ6m~ќ_hbC|<(?LRB^l& !uNy2ۺZ\;r++}\(BqOjCC=( 0F]2(^8]alo(:&vE1jl@P`  LPb$h{,NFd,qbq 辶Sd!EE癬Kq.ybԂxjDX4;>b}/o6+\MmK^{#EםJ4f1ϣYšpXsЧUJ p=ϪY32KdJ%vsLb?BwNtDgq_l5ﲙ FO%ELqWE.A vyL7eR*jGp4HG+ׯ4+)[7ІĤq+U$?)9B?jQˏk?ţ4D cbqF`{~8?vBO'հ>fjG+ߺ!Tr*#qL+9`FY/N5l;Xȋ]hW&h{~hП bS&1x Pd~ %` .nd@EVi5b_34(ych~ Qɪ2"3 ܀V!ixgSP(+(""bXmн^  mMPVq"^d7 vgH_W& *B7btZٻbBg/Sz\ּFp # x)s=;}wFTԩf.(,[Mhp9-8?Z܄ ma=T1̸hҩ?u&i>*Lenj+n~%UnH4Nc 0|r!e`³ VYGW3kg5Wr`yhZζ\:}@c-7򸧎ZaGv2AͲsXi$#>m]9gٴxCT#0_ykΊ9<S!,`\d!Uփ F^}]j[E.I~*'&H=}k4RVuycoށvQnz%w `t яX2+`K cF-G[B#% :/:ɺ )qum숵JYEZ~4;rg;)+d'XW%/I[o?{*DY!׸EȜ"HM" #AW*A7RG+ꃸ8Zq޵P֘$c]2NxQRzfGU$sPC^ GhxsฃaSy7~=ߐDe8^jjemjSe.g7tyW+-Ӫ {@`Hʄ<;Ґừe1AX6$;/0M !<{Q؋́9j<$$w_=ۈG}X,Xqlp2r b\~mQ5" @>ݳukKneIfE16S=RW]l|5ءJΛQ<4L{DCkdۓMKEP^?"C"ARxeM"ĦuB 8褐[Es'U0MD|GdM ')`9J]{8~N\`ؘJ@.MM(`P@4~F@4ro?JP!k%&шRd+[LW^u$ J+b!XCiC*}P0 Dګ@q MS!utk]j=:vI\PGA#ES1 eK@ZELpe ѠPQ=(@{V:L~?L1D[,Sg̍!'b:檖NoiNMOknIG- )Ocb[13S!̄r:ZY6;E>U. w t0' ׭^cܣ}l_"j rXN`37nVbe8ozZ4J٦[ ߷rbS]r7Gw6pemu2G:fL8'R7ܰlQ Z>U- ל^d(߉U^Zn 3c!w[HbYwЫkk}Yo"kmv_@}k׻\2X !A?Cj3:i8P1: k6JFLY}_z;p/-0ApfW /R'ڛQUp-B3eY]ȃd/wt〘iW ?tp|>}ml< x NZmLZS'@Vè#uema;$;vInpK X(>/ 2Rpx2I-V;B:*?rgVL(ԗTEQHv ]NoA}##IY|Uz:\U#U*-F~L!)_;E@5!?[=T/`WY  T 9 Em>oe3[2wGwݲy@5ׯ'J̿ke'#n7-Xwb_%_=Z8xۭ<>;O% QyS?0:2c (oԬ[=}F$D(Mf(D|0F~\:s(X82OO؂H79TB5O4!s̙Q'hMYUkH#:eضY| 'Vn4*) MzE)jqOjh$$mPN`큭IO0\p#5P>#"3-N͕8iSRRYML ĨjǏqF#Th{ma!b7Wb"^Q(4fj/m ~ 8xGnF PjEfSMʧ Q]c5424)wvw TdGi]N3waY`Jq*'Vs ZW၃ n.:Aۡ⟠khQrq~AWZ#?p%-GkY&"fup$8h~ϚWyrH{Giʩ$ݑ8O3u\/K7Y`b3/ pvcyPP^ uۈlP1x#r+%(v 7-S/DڅN'8R(|]bbUo֫2a%ZᇋΏ+/!aݙ[f`_R! j[46sg0>#$Pȟ/o'>l`ӰASfht(皓Բny?Fz)Ɇcp>nv?a͛qͮq Cj͛ MX~^,kweF~=6ģ}) ?$ 'ܑ<M߷J\ nld}݊Aʖ [`hNTYRNjν/ڼͯ.C0AH18"l?Fx]CWZw{"c n+f=\=cjO;!"Rjc|ǐ&fDҎCO/H `kSe&7uH*%GHu.5r|o{A[-.>fzc®|Ʊ}Rw 4L2s!XT#)]T4i'3-!1~_ ls3Irf"CPm Pś&E/̡3_LVsD&*װ/xnjH?9TNC y%BO,eevnSO3޿[6=G4]0E-UؽXa,[*.4ذ^-8{ :BL|WgR6~gs?'Iynhlع~ b6O?xBZ߼:F)`7dN:}-AA7R}ie+iϧ )z>uK8jhWXf8'bn͝}[8f=/ŞAn`iR6j(Udɝ~0FZ'H3wb8E&VZoäitONQטeؓ%@-CP<= 4;xu5bs}>_4E]w,d*|×$e$km|a Us4l c3ܨy.LoN'9[rnmIpɜ ػbQn-(I&|NZΊ v]D|L[wհ71 Wؕ[uHY*I9 ,&~YG/:,f de;\߰bAM|6u JNO?cEE`(ljA6L!C;CH Iz2:^29mγCByB!}Al]J[VGJe'tkCV!T7o+/AY9 c6ok^ŕboj[ wlΧ3OΗt^X?p Q8m| _gN~Ei)[ މ%̳@,1gv~g1yFb+750E Ʌ^ 2L͗NJˎ &ϻn; cb;n2}"P)Pa1UYq84 DWkJB;OGl&pKsJEjC[WQ6Ȕc>^6 `lDi)$mowa,*/wآxxkG9IewE$fԹ+ ĵB g2}o׳Hev!-dgf""B'jO3M v2>hyRAKÙ_HN{fsaf^-vYY῎g1h 7w"0Q}??p-:z<:jۼ|D]:9QENȦeoFn TaoQHna 1CIB_Z9@#r{m]4"fkJ' T$f_Nt8}ȳ9w-->CW:x862yփ藠GLDvMu5g$P.hcT6Pdt' 2ݻ p 6u% AgVn@&;5 #e4vsgjB(ÚA^ 6# |pgGGl8l`d[o6D{ʾ- p EomV} ބDc˛ĭ7Q 8TL)kYؓ|E\(쿺Z^ , FPq-l8dJ"I`wt W`9žTcT-<497[uH"L׏7t'RE{a&LZ|s[*#S5v2 /:lP2~UZoӘbXvSG3]%5yUGwBzƓ; Ȇ Sy `!7ġWs #$d@ϢD ݢB~M_Lm;NT#7݆Guom-ApZ-^KQ(Ƚh/^6>;7"ߧr;TՔ@}4ZUVBΪJt8YB@vwXW۹.a}EĞ = FSd=Vp?꾋1}H=\ 8j_tkn;1;} g+W~Yk]\p`p.ZwlZ|+l!@]SNo?>$ɶ u4N*V8#7Rg^{;N]OQ\1痝MQh' =ÇLb7E5Z-f6D@[ 2VgC7lW?OEz}^ܡu`[t?G {f뢶%Ov=AgEԠj!v ,>Ǒn`tM7E~7b@t;m,kLOؑȧd.(69*&,pl4c(Ml;Q.I4lmܸe!,$N XrܨB0\V29XϋeUiʵɊ#Y&|0|4:=/ u_}w;W6B=ÇJi9ͪpȓ.d><}˜#WsũY?/YZ=K$bcY 9cEg y] P4VE-I͏.Im7oܜDB>tinPݹomA&%1K>]Iu$7&^]_#OS?,  Dt.LaӲ쎘P+r!u_ ۵a;%D*l_{aSﯱY"(UCd[sӯ8v3Ulp( )<=xc6WH&[ I,g-""MHޱGfZӂ{!"觤{mcTzZJS'cmUK3IOr'H6ėreK^Mkd!K Z“5)y<8`e 0yW+P L6hpT$Fy5Մ%jW_<^kc]D2"n^Qy̦J%s"9R)RbveHuS]g:?9Iޤ 3~Ox/>V>22þakz&uf72gPG﫣ԅyMC?׷HBn{6=gl8@WS<\_sNٚ; VnS6w/Ýj1#Uˇwj|@LZx7@]7vnw&Q- nڜ;F6+eg[8rc!~,Z #uyGϡK u#G,Yw42N~joe59/C*F|f5eq96r)dص(w)X3 [sqGĊ_+|_L۟EƠsr[aB),8\qSOSgKSPA)00kNYH- q6}GK$AEd5|ݿOMzROU/07E-xfA GGNŊ :|/GKu mͬ~+*v'. ^C)O !4_cL`*4*Wh)RtTi!Lj 8*<`]2FzDZ+*b?^ⴊ% H8h L^S)y ɞf!@e`ϊDn֤py5VUN AcqbeM'FgŮDqTfj6[ N$ 5>0bǮ[Uj,<|Zo5)t;ܭƃ$yB}@vHlsR??P_^}u۝zaף台4ȳBg1m$-nD?7{!( ZB۱>mW4|r" `bRxoCT嗘AtD]~pMճs.}<8 {橔I IU|>I+xL87n֍1bEԲЯxXF웨D&d5a{y-k<䙚x~3RܔTf8~d(/DS $U%RfyQzw37w3+|8`/k9k :m:gCmP;;8S}% ]ϓ'?˛pssUC>!a6da'>]77k[`~X|C?V3¯dG4k k|8JT]7b+FuFh#Z#1j!Z`]O{4 dRM0;xiQ_VPKe\Ѹg!rlQd'|"88#FR}Z=kI%9=~ys#ѧUo~{;F{Xv<m (Siq5A =lJTĭqH`a*7&C#@p(fM ܽH&NtS16(x4'ZF2cTo+k&`/yDu)9,Q,F)sb蠢pNlq"vIb!E/z}o2#n\ϡrL LwDR'FmŭqRSeŲ+cŠioHZ=T'/5ZLׁ  ?yrsm 5<DN΢qN"NNG"d7퇅/x8Ķ:'to1aI$>^KΏK}ud'Tx`b BJƯ?$ rUC?_WtXplfUcnPge?H̃q:mݧ۶[GYzq78bHdyTyQvLhT)+Qsf}W>il7^8zuy馲R: ܏ꎺgcޯZMGtGs?eSr |o?Z">HSK23; 5>{٫ه14pUkcI]iV.ƙc002L\ 㸌]yw_Eu14*/:p:Mظ5jH0Ӄ}Jď GfW2%UTwi|AqЏߵ!yk;z*8+u߇\u0@Τb(.\rl!ԍ3Ll,x^LFV"7^4v(7 MR7Y(kʓ.[LП#E6s b:#}}h(ޥ;T? DDp9X[z^;>yÛr1s]s،RjGނs+:15_or)/&Hͱۥ;_a7?RV]Bn%dXXB{԰fo |4Mk4e{QF+3U{rNI}ֿnP-;$qLܺ+T9>%w (vI-'@p!R0̯Tֆ~S`o ՜k7N` ewϣvSq[5%aant jD9vN,i+}7&GFCwx0Aq }u^[,=wGGFs%?lJ#3.Z/ɢGP7 4A&?e]tKtV;x/^u,` yXXyT]>E9}u rʏQ+xk?- N=Q*eKdm:{7bVN•3 ,qaooyRv;8Fƛ+S UT:LH k%Ɓl%qZh$ gxF|쿡TAItRJvHn4zt ,*.BM^:6J(,ӵ'gWëןh'Y*?0֩MNH֝#UU-QN-Qc*Z$>v d.<\2.Tlx(:54$}+.Y:*! 4-uڨAq!zT9YV-]pB*S#?'F' Tg~}{mr ݺI\w]Rf^uqը}ufV' /FcYܞPRp*KFYjWCs<.УfRAELvl~maURFH]y)[_#w1Q3s&U*6GX͸8'ğt_1m,x+KgTjJK}S`1I Ap,X1mOnYO/*]6=e0eHre/O' R@?ӯvk##XrX~6Cuib99Y |0rǩc G+#)\W}gh۵fۛ WU\6ulykC&^oty-vۉ'^Li6[Ըpes↥yYq ,੓ԍwB݈G"<"YBNpW5ԍ}zg<׾V:oKC?*M:\̷*_?֗3QmKm*|pfchVɨٲ}vfʏ1s=C: 2,-,ZOOw_peEUXC:,r酕[6WڜB[l먩gH&̓-[kUQ%*SlG$sa7n;I= v`qQ@gRA/ -u:6j&N͐ ^, L15X}]"Zř 9Gvz_!"R- zUv',C4H& f6`׬orzHZQ~@D@-RJ~G8P6A~ z^ó2$DKs^S|y *-cw\e@|1 BfVwmIA"jPmUy^{OU(a,͡8mw'2) b~3?W(B]D25G82?̉u5fg~8Jѐ[Y-q|14.D*t86hǎN>fh0Cw]|VEN]QCS`PԺ6{q6YA`}ޮN41j|-|FIFzhҌ޲v15s)W6^uR[Es|gC&& MO8rM!0EjcHn}sw'~+o0GClo fєJe& hJz<_ݛ%aݫE+'p2ʧ7V(Ɲj; =mb/@ͬnN#D~\W)\vF-*qnY]&-ًkJN0"hFTZm ۪3 owTvhvcvZ 76%F:^dFK)z*H=-[`ɩHʲ˱ik_.6 ހ]ϛ_y@$.aژo7xEcG(Ynͥ]A-G7qH*6 P^,/\(T:$v2ob(-O * |Pg~q.Ƽ>荝N9f(eh\F8#7ބ\ZN]{»# @ {pZ(y*L*g;Tx]ި,f最NH =E([3RBUi$"nE$~\u9{dgVי}177_u\G dHD]' e3!o9̉2 k^ Y;F!y^CgC۾㪳\8=FOzxh $-xP~;6yVs|aUn!|;!+.q9'$>4U`'R s'[1T(Zȋn\:?-a¯8˳;` zDт<^æ0hx#w8i5j.|Ei{ = $zїVz :ڵ6X˨0^p{/4{GE8#C}"ڊ`EF_,d8ͣ!'(p\.fk+j~ԏ2w>7v\"p%":߸څ|>vM-˅ 幃.@Тeog]"w@){ ]x;_ld.Q? 7R/_{Ƒ΍xxU/T'/^kӸ}g39b鍫:2&l٦t mŽ515Yo1ydb=>~Bс-Y&%mtL!b̙0 cqs7Az HAijcݹFP(]kNDG4fc&wkLuLekR=Q)8~l\  !B`0% T#I2v+lξ})A4 keGq?Fcu>W\oi *@zn(Gt:2~珮Ɩ-Ю(1kE"85LYsp*vv"WƸ?>5F{q~VuuY&أH5;IЈ8>-ĸL9,tX CArc?=[_w0vvX ?=ˍ|Ljt+&'[BW;v5?j ]pdi,Kxd*+K}yFap6.hbiM!pNlEȇ?l8f-U8b&㺁T"_ҷfxxrrӦ̅F\Mg5}|@|sj˻tM{X>S+LƄ#cESxs,`sz֘Ij$Uhar s5C_ J*h9dSςBi*!FD0s}Z욡|,[F{RZ?N3n'ݻk: )p<ueTO1(beΈZg 0 GwQJ(jn7_5{Q5p+Y_UY}~1 -T gz ՠ;>cЃn5l hEl1Cy.@So+qD-Rp SiiiU| :#6~]̫DVc팦`UkkuQTڱwqEg-QL\! ̕ <.UF}4=\̶ؙ+>Ya%_\E9ȿz_PQO=j7AJmwҞv[@ٸ]ŹYɜ[.͛8IlK7dRlZ6E'shZ|גijN|:a4=+=bsVvvq֍a5Tؒ(%=iUӹ=u(AxwKj {F{~6x+-:L>%Ɨ%t`u&QinM\*c*ѱJZ]j׀ncj}#  c *}ǏP#yk? FDuJ du:tPqkf`#2ۃ @W.Z] B1a9]UIKp6ý(8 *!խhE>nj=3^3H mbZXzLIu9$:XB{'s,cÄl9ҕr"']rwЁMc4|3M+ }>cٕ@wx1bZ})|$s,LhͲUJعXJڵ'܌%ٵxtud0Gp'eXW'2zUkXv@Vf{dš!m|JGD.H^膀L;gd7ê:ܞp;i*A9O`ܣ߸iytGV! RxxGuI(.$wmY\vcLyY& z:{(_wHyh 9V7'4EikhL& 7||^/q[3ӳ4ċgH-fԁW$sأ?I%nҧ=Nw#ajo5{=~Y K[,oq;qX]fffɨ٠_mcWHOjM!^w3:m#M[GYk=MM4]\[+gxsXµ9N FW onnv-2:I w A8z xUDq"y;8}5=>#:Y:N ů_o)9!Sh(DA0=l@R9]̈ Xh3gƒЧ0u0e^Zp$*V֥MяK'1$U $ +~<B-ID)(E ]u]}g^ƍZF/]3 8/i<_ qPPBVuoi /] I&iQ%2T͟4N#UzH/IAo+;ֹ_OG[6#'ue|YS[0~4ĿsFdBHrrjQk]v~֌uvJdӲveP1醆>dUDZJэQ)z򢁴zq#'qc>l{_IZ]#A֥AlHc=BL 7=4ȇm\U^ fqE,qy@"GRF|уg{=^Rӕ&&cgUNW_ZV%7д6y6X1W @_l'vo5>)M`ubbu EqyUF-:cXk\{.;3G/=M(?dHL(›n?*Y?RE񁄃A`CrD$i-oohZG(fFiÞ8Liia^ PV/ԣ/}3㎸b뽣xjq="܂=qD=/I(GS]0,lҐQ!q~L0?=ikmG',Y] d$a/ås^P-77/(n*OWQXsVNVCTu"\C^ k]SQKe d`݃ 8ŵ\Dn#scb];NqKmQπQ;K}#b8eGd\Ҕ>iq1@\ htD1eH@_wU􀃈`K/(2)Zanӈ$kU2wTցC (ΒGW "Keq;+grK=*hqp{hwίEfov 2 pDžܖnKAH-֭7kta'`oXG$&Pw-+qE쐄Rpe<{,hܧ3<?[m: -C R[Ҫ^3~emN0=`cB (jȋ&=*_Hm'6Jib4.':Q;}UL=v1`,klsWVGϴx?z2wy$mwe9]Q*l>-w"]=#hv{hMr#o4 2{Kk QU7"$t71mt c}J|9NG;ЦEv61 _GEs픐e XnnvCr_Z ]­hR,]}NR[LYGZzJƦx6׿ɒ94i G;%#Imǿ ?u7glZx}ofvZM^ Bj*C({g(jhJox&ۃ҇dBDV1WHo]Wx5B7AFGEp#9+?(B\LO%%4" ӹA^Vyѹ& 0i,/$p[f폯\>.޷O~8+!1 E4/f8?r+sdqz;uީ\-3'#) obնmU`c ܌je/] @/}BEͼ#ؽs N}>!X:03D1tCV8xco ]O\{`=DC}#,"O8r癓m/]/{ !#mXsVɽp,>||fޏ Lfy~c\{E_]ko ѹ zz燯t@ ]/+倾?DpDݲ\Řؖ'Z_dmZUm*6fQzA5O~ Aܼ\ѕȗƵ%ʂ㊛ػg+3JxcSUlxg̢N~G" hd+PPcߖF ~ܿڂ&n v{Z{AĻY&nQ! 9s]/7ڭܩ>lH\҇|d{e;R.:רwU'2xޢ1r:V0FˈuNH?EFgqմC[jn9x:7sDtOI-W 3"M"|6Kc_ARBZ~VcEʓZ+6lXZ?_ ]TްtLѳaw{aű,qwJu{ÛqڄꜶVզ:a7j7Of5C"3c, K:܍^ݷm{st|v[]VѐMGa>`l*O7W0fځ@nyO8r>pu\Pܭ--~I%@". NPy]V5'hSa07eZu_gC֛&T.*6*]vꔢ\>KWl Ucb+q"T85ZJtzk\ Ve5swpc%Ɣ#&Y 9 xEE(&hUiMH߳.Z8r9,;<#h]-iZ'>ӳsm˶muխWD>D-K tOxxN;:8PS8,EFp4ӣ19NpbHjYM+ "jRY411=e&o>"4rΟ~ (Kկy?{q#q癝QnDqCI%BG?BiDYh~Նfֿl%"L?\jcS+UjtW^YQyL-7U{]3>攐w[; "`UY:cxFF/D o_U b$ MF*.5du~-+*pm`y^>9..s}G Uքjoɂ übpY {W 6s6zUy[(=0,gDۀA{%"{Il=^5;L'12I+>YM׽)Z\ut}ہ,]*llFfԆ'6<nC.9Տ;%@~)%Ǭdo}fQS U7b֚@@mB?#џtBP6Wf: bGa`Yo3z+$RE_*X{Pp%-ً.ֿͦ Ң}qSlIH.]qhNW-38ՍY?:ww vg6D[U(ߵ׶ UJWx%d\Y 3<;8(GL#^g}\a؉s99۶P:l4)sF4>r.:rqq+ܨ~uH"/$4NK {+rv8r|mnOÁ0#4[O q6F0汦?XDSJ{JSrNSXnaBB+ZXdd @3\r})tR@MlKj*sg|@@19Ó(OoDsm"luϬ CCs~"O4u}9H N!VeA ϟ h00.Nlj{}8 tMhRTKPr:^WJD\''q\ 7ã xNtq x{pz|9!̥C?Tњc8E *u&SDO9PT-e_ts[8SAzGt*ti!;8;>6K]W*4A_CQ(>XRjkz?r45fvY..y An{;G3V!ijY{ Ju2M-1H4_bq<|n(|d0VQr3OL/Ci*  ߽C2_6!MPN.nTpG<@dv嵨r9}V~L6r2x]:sHρMQOQXHA5w-p,2fDoc-x`oݵcvݤ2)C;CUo$zv-/[E=Vk-"gR|HJ wX}]os$|3 |a>>143R\E7-gX[l\Q >*+@ &u5#" 14 i6;r.|uZK2QApycNMY]Af,j^I 01{KPf{} %D8ľ>~u H]i"K͑gut٠4Ԩ\0u BXH]Ec21?vz"ee|̷/+o}}9tޤs)=jxqRȴHM|dBNmV"\r沾5݃|ƈ>½jc,)Y\ Yp:*-C$v7z`}tuKeXW@4c `һ)ae]F +!{+##jq P@Dq?`xftQj#S h(YfTN/dZ9Ȉe=ʊe ϟƏ@o-į5iQ6qh êA ~͊>lֶ d+^+"4Ϋ5E :v_O8DRϜ< ħ}] ;'^R.d=c}Rw? |bµ=[j uo-3 $;8۹=d|&OogdStC&5)\H6&KB6(mMw׋Ň9%U'D)۳`JƪRLH |UP냘Օhr<[BUqoafDoSx蔼2ud =%@3TbXvED\{@4Yʅ=WHմ 5eX__ɺ؂n=FKnR<.͸yH$+tY1?XX|_D Z"!P/MПLPn;W챎~Ng+S(0oRnJ{j* ;[x^bF ܡ=^R2Lov30MGP0&Mwz@4ȠSWgg,ӘГ0C}}7\;`l "F.&?o*tZ^09GT~ok?a VSv[(托*vg~oA_7L# M[0H@`! 2T䛄t:~k}CD݀1|újk]h!D[=4/;sq}~ndfvT4+*

    uSGIvy.d_eYT}ۥҐه4(|ONbE5U>CHBr-x"vFI_VQCXij'lxd>ދVM xz(dъ{!CU"d |tof/JH{g  "Z0#|,K&;+ 뻛E+ZzZxrQBtaEu-dk9 !.Uxڨi96%a7UmH~(Fm[I1NI"VWwc5Z1EacOޫ2+i˽{6MR2g0G؁w ]KI3m~aÊA;8n4ǖ|a0?v{e%("$);QO@ *J"uN,/ߗ[tY8 %Z[q^cB"FIpMbɝgZAη;xɳ EмÐ}PD|rC^o8|Iբ'/6C7вaTEjR\uh{TM\[G\+{@p{HqAeKn/&k_{;\dzocKQUCC7;a/CWszFc뿋;ߣ)$UfUnLNRov/ ::Ε졸{- 2] MD_Rns @u"*dP$So#=_IJ$GDfVo jU*{3DgV!/0}#R|`v[НT6"X$[It KҠLZ/$.lߤDL2+Ǧ<2ī؝ߓ&Ak-} _1o6cB F2%)S+d10H)f'E]t|YB+(wt$_@: X݈? ,n,=>ݒ2*OӘf 9\K:G;{EltHP`PqlV2IR~g҈ *_\pdu1DY%,P/=p=b-tBhI)>NxiBknKkKZЉ~}s@Z[CyZJ`pנnC9hS&2=+b-fʾ99}m8a}@)9Kҳ´sv%uq- %`B]:h_[<,, `}LHhcR10fkrEbHkRZyM|}dCe }uY68jB)a 9'(c~l*ۭ;O@S,Ng5vlNk<ظE *'ZN{PT3``/ m/fR6P.f`-o mжʶŶ*5n{:k U^!ꕯzTo|nblq~x H_0cΚh)=Lu7ፗx.}?đ_z dXb8rW㤡l:t%C]Hw g44tw@5OHN)99܏n3=^r %]|qs?(K,ɼ,ߐYZcdFfԩ?՘_Ep BoO>I\dM2=i8 „B*m $ae08Bc8lgOfp@VMƯV5mcJDi;$`1mDӒiFQ\&kȸ% h58z2 B8_ qT9 k|9{IhrAq2n6à7dΥ׌ϊi) ·z[xDGQ =1:]?7n}a3年Po[#u}s7E75h >q +޺0'^BępW.duKvFjkEBDmޠ/D]s)-@RD90 YD~G+-"91AįIua-3%J>FavշCsE-;P!M|bL˸zK) c0sETe@l=lKo$:䦣ԉ_9vYc}jj # ѬM[ 8Uhlnگ b?fG?;/v3*K~k%2Ր#ſ\lհCa*.1ۉhLR5Yp;uN#$a K49_CxuzN))]y+̆zramhNmqؕ >4K1#t L:Q/T#@qD?Ok,{9 ?ES⹑s`. \ܔBM Lwd:` 9&fǖl >8H?L HC%h9 _-} a#war%(\2nD[G(jz.c߲&,t{ΌR#c:+\7/ NK;Cװ~S9!Ż&_{K@qpwO,)!ðZY&J U?FT'8q=+8D4`WM{L4I?Uh~ V TF G( u8 rHW5vHOgv_`T5+mU([XQMXYVJZb s)wO ۥPX!H~lֳO4_}>wثѕL<56V.K.vl0מյ]w k%7$juIk"ejk*7D)ک<կ67tHYMc KHO$/ҚO&,o./2qXodIe濜ʣf?z(6ǷW?rՊjH[~BS .{>t"p0=gg90uymΦzo P TD2G}y(J#v:&/f:C qsTzk9n 4kǾ\%Zkޣ1葤b!f)"*)QgTiH"RJ)Zkc1@5  g@LOQ"AŁ33Zkmw~Dq.G`чStp ӻWjekyll-3.1.6/site/freenode.txt000066400000000000000000000000111271741406300163040ustar00rootroot00000000000000aS3gAc4g jekyll-3.1.6/site/help/000077500000000000000000000000001271741406300147145ustar00rootroot00000000000000jekyll-3.1.6/site/help/index.md000066400000000000000000000023231271741406300163450ustar00rootroot00000000000000--- layout: page title: Getting Help --- Need help with Jekyll? Try these resources. ### [Upgrading Documentation](/docs/upgrading/) Did you recently upgrade from Jekyll 1 to 2 or from Jekyll 2 to 3? Known breaking changes are listed in the upgrading docs. ### [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. jekyll-3.1.6/site/img/000077500000000000000000000000001271741406300145405ustar00rootroot00000000000000jekyll-3.1.6/site/img/article-footer.png000066400000000000000000000035071271741406300201720ustar00rootroot00000000000000PNG  IHDRP}VPLTE6tRNS       2IDATxvEFc FBh" (|W.U]CO W:?kvۮ xíLw_ux +UYv^.ZEaUƌP̍㭻J)νȻ'fu$7ݹT8Snz)+6Y+ۈX*{͛~ٽv.0-UH@T\8(c|xYd+2de׊0ʮ!V8Ԝ- B_ mNFv ϰE \+_Zs` XGl0YW(L.] _xI%Ei]\&;BC=,h_Eg%iׅK:_)LJ/%$s4ӍN"WTerMrϷBS>;ihZR]~*\fҷ@Qi7Q[~e !7IeJWzoH&A2=m@ (J7b֍6ڏmigjl-u=2@i:#}m ̍*;w|z;3AiopgR؉آ(dOow|&~v9r';Pvw$ @=?3`xv W6̀ zXH|cɿeI ML5RUY~duЬ "u[@=m4IENDB`jekyll-3.1.6/site/img/footer-logo.png000066400000000000000000000073071271741406300175110ustar00rootroot00000000000000PNG  IHDR* PLTE܀tRNSP`@  p ܬ%2zɇ8t3 !9Oi IDATx^ccᕜifҚmsl۶3=Ƕm۶m_ܪJSԯV*X:#0r18$㐌CrH!dCQ;v#pJ^vGV7뚝d6ֵ̇\F۞H!oL{C.YzXI!/;zeBk. z)^"PY!brȊh5dG!>d,y F$mE (; hC.jAM"޷3p;&$|"$+!cn+D=lvH; 9Nl !+R`ً@[73$A琿yĐ哟q y!9v51i!90lXUI!9_`!DCoaEȤSg ,Cvq Cvqu) Cze2#$ F^&5${J7:-ɹ'zxH_;)l 4!$UO |b ȄBBrȭP1&+Iy>ٔ`(*ش{RSqˀ$b)!9JV.x! ~Hp*JFtI?$< vŐ1"~2!$r7a3BrȎ[!f~Lj !9LHXBprZGC@3 _[u#L !!C49{1CnmK*CrѐG($ d-IuCDgց}w}䭐H!}*rw t$S I`!iy7 ߷g\!#sWQ$yUCs@ >km֩>S LDՕAfK5$]逐@AZiح99Wj d];MX=e!&`N͝/4I?QhaH44C hm~Hq^t!*u!u^rm!i![2L=dDžxUcHv蜐rKcH9$uNH*tZb!}¥=$U68'$8*d(=!ɻސU yB~S"!isBRBx. ^圐v;&dߞ.!ir} &22 G_]!4KKSH栭R~ 2..pLHڣdBnv%qi (j8 vF"!dcBRAhȄ\XWˉf@]\C P\̰MN Iݡȓ#dr>Ž!T/s I4nG 4K5"~X)XU>ңEuym')Rj?MtJߠ`4:z@ LThD*z̆DOq{C*I3*H5١ I7h9!=2%HWH $B&/߳b4LO :v ?A_jւGHOHU;~xYo846↥uO)st8n /k}>;@S4 )"tJa狮ɧ}dsб!? c D=1GdqH8$㐌CrH!d_֡]ӌIENDB`jekyll-3.1.6/site/img/jekyll-sticker.jpg000066400000000000000000003442631271741406300202120ustar00rootroot00000000000000JFIFHH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km:  >=H6) DꃃL0*89B~̷P rs!Id((5i;!NZ(dr5^"b'@әxI`Pp@D=r[Ka!$vCnIŋIcdLE@>4`dRMC.WK=cH HP'Pt)=".Ft! nQZ[,f)XG8c:Q7QGh7,i #C^KMfmО0`)nB/P 8 KP m"m!Д]%!d<9ySNM:.`90}:Lӓ @A00#8:(&NH-dyԝ:^D4;K#+cd &`XKhLbZ6%♚y36n3n<8bA3 sY.IÈ9t%ܘPN e#.L"f<`(0JBHPt A ACrCpjƁ/ErՎ9Dзn&&Liݓ$x^ R;drp: A0r tުD$<$ZmAv%[V( v%CZx=aPM3\A',~ǁ1hy퇀% %4A> S> Y ˮIy&}/^X-9 U.Ĥ4$n0 x@PUX)Jgw ҵDeAt3tT~iij=juQA"M$)h P& Uh s(%nO͎0V>C;Ax.vY rdf&JIqOs//Ɛwo˚×'% >NP =MI!DNqNFfq 9p@&Ɔ,K<,]\gQfIJ4;t=8DzJ.0x xZ0`(vwZHNN~N){i><%tϮ8"c(#t΁0rCK! J ,5i( @VКL1h9n  ;CL#ip@}ͧۮ4+Rl6D aS'Nܶ E a-BD` XS$Pܸ[dRW^wvա(Os؃8ǔKMG'd;2x(A^n_'s v{|77 ak+\q:att7@QBPdv  Wk&6;JAD c*%Sf GB)AP%" y^fIaץ i͝R]gnnphEq +ZH ^{56>q}[> q磦y_^l2!=6L۞NA pr"9<(Ϩ<m 5-uj@QT+ݟf,gO?2\{9_`k]OWoqV;LwNo6;pNKm EV/Y7X|{:Ǣ}[rddgdR*ukY- pz͖ȉR @D 5y[{2'sM͆=KԞG?Clz'.Bp+V$^H°Cn1^]?SQ w4^v^ukFo+ֳՙ| ߡ8iVo[ FP߉`0:3b" @@Z 6ˋOnSǨ2oޮj:trzN̊&9j~ov&F4ח~;M7Wx33|:3OVyۮؽ2ҬdnApsdϱ9ޗF:9v`'#:BQ 9J hBN*%A'ly>= mnW˕\~~X͗gs;>ovkvU+3UtVi˫rfݿHO"TD>L(=_׸slL4-]ܚ_9Ҿw*,78\9@xe HR 6ENSfWfDqJq,h΃$7V҈xo+ެ7=ܫ^VJsz=c1iǣGzNP.Q|gMl3'T/|TjR?/g?]ncsv}"9,J0SU]O|]Wex޶+V/G-P}:K\]z6@lfB%;dB <ōPyiF/b񮗚c t<TvM$h@n6 ˾4Z|91ۑO.~sgz|Yn^dLVf&s3=okD<-k/ͣmyX~2ar5gN3um:^8L{3x;ƹ<.|S\f6U/qegC/@~r~7?ȼ4|q8 qDApIĂO#( YM{Zi<)3s;o%Yq.nu1XxǢ5|}ZIp{%孈wN/U]la-ihA\&oB⛷#R#b~$ w]H,':5ُO.fw4_[DS,뉭VNꆟKSpYϣ!9iAsmgyistMPƜsKI?NQ|?u/x:x5A&բ:z5(AĦ%fd*D#=0݇}Ǧtϣ.]]VEGSE]V)>_|w]+#Li PՆn(4Ľzz y/}N^r3==N?C.ܵ76K2ӣ>3Azq|Yufn^|O[?z=ҟEU=W1XpU=gW,xRxHy~wk/,wYl6IT,$V)a7B ~+Pb6z[}ڟ,YZ|=o&uߨtGG7\gմܺtEODXz>޿$yV'ncr^ߟ?T׾j {=m}a_|e];?'w`-Kiz3ϝ7u)13|L󍻔>Z|M݇mgpv22nw~INyr^>}x\lyz4I}njz+]'38o+XoEr>]mO_k_mz ~le<+R%`5i'b-z@"$u-4ڏuZmOjLʔLY,Mǯs|OsކWmSSLO]Zuٜ3ssy^7:.ky?so|p&?Ks}_ߧ_nb DJ(zg=6mibƠH1f&N|Ͽx/{QWhˎk`EjNǸ?{*y\z>]gf[rzN۹7^<vsx+[;9}Ofyw+X^7xrI͏N}q{\q_3uMi~_?m?OºtC/cW?NOɂIx3- 0H%MEnZKX!?SF|_ao'.l>%gQ|{~,{q΍YweqgatV}wTBQJd@W>>8{1JmLs7\g;E,eOuwS?];N?Em#|,˨_0i/%AB5~9l6j p4n4dD&vvn徂{8q7__3˟"k-J{d: zNm/~33xVL&ͨŪe7 {EVV;Iyɵo 9קe;w&η|ƛ>K}>?u~ś|?[?yqoQ b% LD<\e?1[ҒM422]߻r.;?Nm({>7Fw_VIwZ9멄I>g[ttc#z&_А-ⲿAO;V7YuJh֖s!2?}Rq}'{`Uy~o2̷Zg_{U([s^ur{u'_`Ek| m\R'x!ioAQ|7Qվ@uC~{= Her '_zo2G=;aMMTMޒJ-23i~n`yޔGF>S+"B؍vl>|Og<*b+Pއ rzh]%L/TT3.o_}3_;Yk'Yt8a3 $u3/Yb]no/3wVNe/hǞ}˜vvvwf~Zo_YC2~ H7)Wfl;7SjrmX3w{J~6#[h@zd`(9[4aN~$+-x>G1-i(R믯TB]1:H8F3 F& H֧,b˝LHU&BɠЀ6,i b2hs$MYrǞ`\ 1D4%/^bw5)P)OXRWI j^(zI ,zM72(4L5C5N#/?)nd/'y6>~ӻf.:km-,F%2ЊkO3\U[`]0f:d7oe 2A*]%Q(Ri:eҔF}Gn9赫L6~SG\O'9mLz=Ng@4jdV`^w"5o8wN2^Ǘs:rY;siW (/qNeMǑ+zKJ& 0@P/w7wM^݈b=]ywwwynnkw}{wb6"w흻۵w.w|k˼};erwwa|] ^]`k_lvyy|/9wwGk7n{gk .+ew#|^]k탗M}^^^eվn_#w {v,./Ww9wwyfyya8˼n//!yww輻9~9`<]/. ~/]~Cx08.7|_y~p77~.~}!T%8c&]~{oW !.#ɑd!:7qy~wO4.ʋS _ @H ƢQ!x\G$ .08Rm#uyHMbL2.8T1)ITdN@ D \p"s`7 P\e $B5*C(Bb&b88̸.82`9"yI(#P2~,>H Ire 0H38ᤜdn[{G[/ULG'LYqk:qj86‹ |xH~feN|\wط..Y6iɈ=dHܶ3jMu'jRX{ o^TSqQPFUSナ:hS(!#'ŕlbW,MĠfl{v͉Cڭ QM~4ēfڦj6c+tf Ŏ_ pٲO4iA DϑOra[V`P0+)&e{v 1n@QLG|t]i2r:ѾөU% PV\ji 3:= HߗpEe7ɂ- Q{|-6|{N}~>USxٳC.>?Dfظc}b6iH 0Ş;T:[6,YGC=daDHJɔ>9eĐCE=F995(6q . }% dzDfqߤ$[MnFNml0dɬ눣rĴT:v,i9522nc6C[g]B=feb?`{&6xn;Vr柪ut.n| ImDz aM$d Gk[hAFp\F|{ R:V*,ٹ&I>ÔI&Րpl!P4nPLCLzCn@,N3Dמ=E-QP]š2eK>IY"@dap3nPÙҾ=&MF5<+|r2cۊϐm_8knRq=ACQL󙅜P֙@ =8gSQE=͓yJJA`Ur_"IX:~D`nHL6uTlrc1UHM Tw뼊`DjRQ Cd }-HDN*/AAbٲ\QQR"̛Y)Iyw+0\h(>ĐN adbd ]mb" 2qB" Wܜd5}]XJXG,q>\(j욓*~)jJ< aϻ0P own%==w'+h#j *!99$&nLpa#ʟv"é4tt &G 8a%{ pyFsbֵBFR@0Y#KQ *(Bc#~ΘG0, X[l hȸ wrK <ߖRH)D2J!- ZHLig7@2v3_&uve Vè@>ML{}_!N]evT꾔U_`cEڻ~u_HK˿™Vo>`%@a #S2Al:劮$?:n Bߜ֔s 'UGv[A椦ǩ|vRMxNoE3&z+Ia7,~T_e];Y ^|]y|xy}2)o4:1o|^]]߽]|_w|_7|ߍ]^]_|]߅7wywyw~wyww}..xH8S !1AQ"aq#2BR 3b$0@CS`rPcs4DT%p5d?c$~g'q~|]4~g&n0zlOj nlR a~EQ$$_k9xf6c'w|X^p%eF7𣏕Lqoݕޘjw6#@]}k͞G r~5sunX1g1brQe#i+=^N,jxj˟!o | Yͭ|zPfTh'NQWa WW 'oF1 C1dMI]fOy!M%{$3CUW1Lx=,2]VE 5w\7˦R`2kfޜK "C47ЧxbC"eg:6Ve5<7o&1WT$n Z;0+l6W_4tбZ[>jWŎA7~ťatu ;02[O)$6d4Gc˜Ztu0;gi쯉bx֢{kd7ccs@* U =&\»M[GXhFwm'ϲٵxj]iGҷmx ;h Ѳ>'rѻ:r`3HB/^V#۸c;sBcVga4H N[?%q"4FKI6bq,MɔƺR<=U@c惺څ\hw(&3&(r:0 ycm4$fC{?)%E8Ի1/mI-|:926*Ivy$NGfym@ }-ubieVe_]TqPLm<̆/4 ~&|7]%Xv꠸ `P=>lQ iQymhe:n^ !uF +V.+5|ULq?ŎK צGss* CYݷ ӲZ>nߌ܎';;I;\Bc? bԊ@?|>P1kdmҤ zc^ãכ[ea3^\G p=fFuC5is n.$XKª&ӷ-!]_0;S]0F |PhIB{K|pgՄZ]duu>mξ_H6$͘m&M}kX{Wz]6i -65O&k|Ev ]t,H*$8L\y-l *LNJP*O{cGVN%(䃀 і]H#,ǏrN*徜$׎<:vPf+H#$jUv@6bqkߙ}5\M;쭟L5- }DKAK+l5&ᵦr(N^,`oew(}U pBq""UQ ؒ샺{fM!v0Ұ.F[Pp>= U嗲Cjqeҝȇΰ:2Brp&mvoEO ]Ko "g;qX6I,hݎZCۆ`w*_7TV*FKuw* KfIi_L[[+Cac^7x>pjCYmn ݾY,~FF⣅ubP>'—E'hڲ2>~;ˢKGkn=-FR'V&+hUPm>sğS/N2J}Ku5ͭ$3Vkʊi; C[FLAf翕,ew? }u#t\?;5>w"˫.@6yr_Y$I$NK1xֻ$0$p:yr̛AVGcm{6B~Ĝ?.i ѐ걖=S^o vAvfn.w&}9fk5*(GlV | M{&4VL}y\+վX᧜bt ۳~wVPh9.V8PO%QƖɛV(_R03Ex2yT: n&(cжeoT?j]3q dDGxZC0F0pZ7v^C=b{\H32W#ENXc=:6;-I+xV30'vgWx(ƴȊʬdM]KtK$4M$}ch23mg^sTx--J7`oCL1]T}kz=Df Iu^Ҋ"~{j4pqm8Վ q,p"p6,h7 ?(h8̝Y/ OՖ<̣'-*}w$]Mg`>՚]d AlO}GywU_VP -zWncuhk'[A2Gh" y%ш /^U~n>%OǦA;|&ԏ}sX2`ngvd,py2M3Wjm0?}QV6+kt KxuP XoI;I6v8[zM@p=cC E ^XFYjGFJć=\V_QLM'2YSVR &j Ь7 jG* `RquɍKtd%淪GFyYI]gnfqJDCm؋iבɯ޵m.3bmW|G]Wg(A>zI-nL-[#I<j2#QM|cY#ƭh[X (b'pW;+[h=1ZA,:HHp2I4+TIF>*Ü(Fcb#lftjE;`jgC& 7x[Ea.짫߷28%E(ݎU&ӗrXWY-!?;{|*[ⷁ:fqi͏>T:8@ 1M#:{]X;dC㾖"Ma?3^i.tc5=J܇d;j[^?&ԕskբ-tr,JFFNkgF+ey~H0Xeƹqy=) y v㿉cmX#9"k];Π|+KܶW}&wl}v2ԱIrH9M]Sv[hk~c#v`Lu?iZoǕi G @j=XcrVPZy+sIW~:$[8B(lvkf>&VO=:SFAvO6lbD7H3VE韴t⢷R:(3Ueav;υ9(Og?ʯ?XM@o8!;* %g =4> wWC5!擱;3;k3331YJɁHuy)ߏKZO\srmTv͞`C-KxU=#o!iJTT6z{Ho\*F=wO}Iq*E̒0HuSa- /.*Bٵ.{0&s~Pӹ@곕MSc_Vz Gq."L$h]$Q/3®t䗗M}s?ViY]8Pߎ;V`x۹W8Bd/ Ef9i$C46˺R?V&[˖F6(sGO 7]ܶQ؂"O,@ vR-oF6| $&_j̇ml>[a/(8ݎt"@t!kJ=nQoy!¼I<~Z}N_ P1Hh&^L?CJ~JXɒTlqY{}լY`aOorv&}T}i /!kefۧ\|[>w;ƮOz^\H9Z"{qFmXռIksFU0[ڒ¤W'Wɋ?j(GFKQM#¹>FF Ϗ.m%Ot4l&vc!@BpFZIs;lQ_ZI=XsIid<w QN4c״3䃗Zk6QN<7ޞsN/d`zBq;[X!yHг1MIoK+2Cp~IAiߪ},nEek J8X~ oq)̇+oy<*8仿b[L䑻, [bo4@ZNXa#U{Ԏ5gn '^Kɳ 3ϨI7y_ܻ6ו3b,{oAV Wt^&|Zl'^3fbĒř19g,w5- k+qp?FGl i_>$>T14 H}KS݄;Wvj{0go*KvԐwwOQf=iQ~`ԍw$[elTVK<α3i5&\K9Brm(V#_ `o$Mɐr={呝س1,YcϠ[۸ v6Pd} dtɋ`n*ݧ]jxv[)45jk򖱞|fq<<1y$b3feD+zk HU@8 U$Z2qvcAĞS0z`Y@$iOp'n)G:uaS@D/v~2Fު ~떞Ɏ+/sp lmMA;7EƵ!#cYedBLl2e=Zp֬g k$'<4XBۓa8st%_EO"t<=$p:Wm%in7Cj4Aǀ4ꉵٕs΢}ֶьQY@VD7xo#ny0FɿQ"iK֬1gUJ6Xu,.md]Wy##2;kW ;Q3F=kB[.d6 &^$ŞWl;DV[(20CľmZh h4^[LR+vf |r?ޤHYK/wnw*{O :* bF^zv+L6: `GnydK栳˴ u_o kkj$(ch'oKK"FZF '-q./~X\=᧕@KaGǡcFw *Xm5JisnĻ;-ᴓ(.5zO9d=.LB}7br=} AҫXWlu:dQTo Hd#XzYnm$E61Fi`Vzږ>L֜5 ΌԷ9f췕A?Ҙ-mݱoܗ4F񃑼`+LhT2F ]X$6Df^C5_T@x[׌֓qct;BǍi; 9>ax՞c,a1oA>ml|ݳibι5Ϣ= *,N9+FĎ%M/cDždͮ( EMu)FHǍKu5ħ/+nJ;g`5UQGv@2yXmni w]dac)y֑b (30K+MhX#PVEկ:Ljsw-[ڀ*$sv1㫶o&UcEU]azA\licr>g['mlb4э?u\i_^YY=TOO.ⵀmsV(ǧ+xpj k Q`BsCs}B޸^بvNMK)߁Nu|iMs Y7m-#ZTs۾Sg^ĸP:2ڙ?*IdƥR+9lƖ  1 'p^-ù>>wf':ymO}HwR{#@tdWtYPFh\𫣣 `>O'Xj̈ێ_Ѷ\#%1$q/y2.E!XKc$i$"(xTzӵ Jxxys߼$[E~PhT1rGjFU Ƶh5:>s|\[#LOƺoFE?ߕH /ʃFb<%zi$O纯4dnWzJ~-wc{RR_ݲ#H + hv$OMk(6gnvCѭ^m nF?󓻇iI%3֒m,kR5n}k3LGjF伅b+WY'F'PDN]Qh^|t^n#WxnI "YGH{Tin&PIy*;"AJrԯIies$UWp۶_aSp$d |*Fı[±F͏kD9j.I'5&=ѭY%"x00vǹ{]‘.]bּa}eIYC2$%]F\!t`@С!ED@YΪInMnbߐt[g$+!SohNAvxզa v9zPQ=#QcNoDqvtZDadCm`] dIWYGCvV_p?^[Wa`{d5H=[kFq/~󝦕wAp+9Xt[6Y{\GJȥ،k?H4%]e;Y=Erg+Ihr V.y 5.b>0W+TGs!V,F>ڰ2Xf](u-֑y7Է^ź{}4M?0Zj{h1ijXX&S9;OqM$*s)hr:@ؽ)EA8lm} FRM QI*)t$; h[O2i;岺×s8|GY3]MݬZ"W]HIwQǹ@+< sa$G*ءxT-AHxҖ}aaP5,3Q5̍73S 7Ƨci{V#~‘@;n[_M!%5aKoG?EK쨸y7Qp+A9n4OaGN_(!1AQa q0?2ٙu5.M+֌ LN1WKTYk(.*~s*7V'NR)l$/:軕R-KєR8eEy9Ӊǡyb˗Uʛ\4:.Σ. JR& PQ!ѳlx7D7:q/Fg^^F\% p .f [t RoE:&bXQ dRMiG**@+"HyUoB)@%{d+zQ2cGG^}9Nc3K`CCz7y CUع^g2hxF=e]V6l\F9_w oԹr4%є9}o[?<{8oel?ly}J,ch~^%ԸGKe]Iz:U鶕^PDsß*@7vT)pJ0]5f`P\%z OTn@`yb∇s8q=Tۗ%<>'@ݗ=^jz̺F!̽6K\5ɃN ܿL{ΘK4b3GH4 M{ MF6 va.m?ʶ")4^3~vRqpRA(ScC*6 ??xcP %i R7b+ta\/R:mzTUoK[gW>/2*aK6Pᅦ"əzQ #m .b]K^`HӦPB "(K.,y'ܣobX mogg6ƽm]iz\*m"꾛Yϟ4{` u;-Dcik~f\՗p6Ճkv_;4RǗ\L;PJܻyg/:5l|n. WwqhηBgwy $xNQfx@9>ݢWxJ }زr\zn_UՕf%7Oe+ycZ +^QRr @VX`-Ru\Aۆ?k~3YlY~=Cmf) r nbFs?1v}@JoԬwxU6/^^_̰p]%:&)E GLzc7e)of hd=q *mbɄˠvyHYW!69A1⼱ڥf;(=l)}G+ Io%7@>䯺7RߏD@ Ua\6)KAMs}w?0eL8O9yKS~<h, w9ʆֹ[n<P`2 - T0{s?KYKFoYs>1o6 ?X{K. m/J֥ipf_ @أu0IҽZʆIDX7)~JbYfDlo x1=3C:U>phazk: ,0)j}krvg,\M60dm-f8D02 ;ޣlyv`7?NmhE\&{ rO` J¼ hrVb ݲW$$wg*n |vbVs]?S-#?i&JJݗ)W1^?/Ksc~ljrڲؠZf`Bw) &'/[5 1›bcءl^ ;*Toϝ)* \Ep _s6/ EFk:nŤc`%7ip+_)І1XPVa31#@@Tݶ_y bKFx^$uckX~FoX`Ct>@,ُJ]vo:BkvB;mY_W^^}ΰ!,rQ7/VMY@A@N%CdW(qF_N`UG0x/Oo1S`JG%c<2WZvQDaTl KRqo̅h,̴{eAeyZ}/[#wr\u6PNgkr$vKCz-ؘ2ɍy6j4 .i gOh-L]n<:Q.}n;7'݆6a Lj{yϙ̟1hDKPו ?腁QX;+/zleb)R<{(cS 2P%:3t`sP&BVe%R2 ^[\&Bvx;*v ˼ SɱM!Nag;v ipX`[;sv06]_g6lV2. nh_+Sf{7?ľ+ha ([ߚ}0}sN*T0j8˃/Q n0at`B\6j+ a_{Iu#ޑU>Em/6T/ʯ$~Pa\O$T)-n" 4MB(js35bWxz2~#,:ؖyXw'vd3yV^@Z4R] I`ZwJ*qXK,ќa(ק,т(6.WU'GfZ'Fx5H p!%U2&ӂG _kU-XnK 8USG{ Z,v'&Ta A;{@=/ :R}Ǥdvq|[8:Ew1{42D ? D mhcQ{9j\UTZ+p}w`v_gq'@`4U8Tǻfy~߸X`:d,k;cԴ`ߴ3(?FO,^a.hRgOpڧ:"dm.;սzOc7h(E7rKNv41Ky( Z?sgx/JsVZ v0@+tG6 =b^eX "Tޝ%3A~\:X%XD `ڱ@8RPl*¥a$"t@!oX;>[2V:IpXUCWDE _,\mem|)w-x ڃ%V'_ ݺ-Hyh+doxY0Fmym8Y~;@ߘZ\<]5 TryJ#tahΙiH[zI1a`N.%\\=όxf<62F .xjrWP]m[]퟊ '3ɹS-~TL> żP[¥4aXz-u%"vK+r{>CvSVfݿ֖w=,M2J;%˗.\rv =Z0TUC:Jv!D(]RDȡj35yE3#Д&B7^Y }yB+e`UMۙ#( RZY/j ҇T|ٕQB-gv[{JVOGbH1@~?+#j0yGL@'|J݄7` Qw+|;ISvGJ%R{7̨ ccУx0+Q{w&X/ 1OrcdIT@PN~cĨTq610E~{ 2)|kϿ"8i~[IyJ~a;hx8K [ƾ Qpp:xxUW77Od XK'k/r\\}wNѐ섲\oY1S@y!9¯xe3tK DGJ'_haAZ+߯a;A2㘎 ` byyeQ&f6jwvpmidB!鹇)f/A)?r+,jh1`k'A^kx P+%m?׌v EwhǴ^;{bDo,ˆd/SyMFȻ oJgR9Sۇ[Ex Lv't7ELp))kSr" PsY^eT%Nج` ERDeW*s,w6w8,nBNtct|-4\O&](^DaòRtr?V'RÖgP3-ڃ^rO_ܘ n V5SYյy/K\&k2#oSxp{|>qg?uaA\1{rҶ@VRo iz/GU8җ. ;KM][T,?@}\JBQ$U@/Sv[Uɕw#8j9xx:`@Gen^.SmjsyFoݛf왇 8fpcmL%8S3W`x<LZ@!Æ[$?eYr.^ AzKa1 Tm(=BvE*- j pe˃/E˝a:JU˼vc]m @n}w^RCHhUPoX» Sm"%ةŸGb rS4 !\[.\V_z# =iELu0#fI s}~e"si}`b>[0ɗv/r/KO§sD0W_,x kj2k&As.\/K.\r˂!9ؾa8rZ^Ը2,3vpqoȌ:LOIJ#4w ni`*[Gy._r̸rnxi2ZKrs/2z\z Ypeˆ Ep/Tйz/Qx8:t~W$5j|/3.\zܽn\y.z\r˗.\X:/U.[IE͚+$̾ԼK\/oK/Er.q./@˗.\4 B^_\;K=hJ&.M.ǹr"˙z\u.\_/FZ859sDe4I6ӟCQq iνݧ!;0ӸzN}'ӘBlás'!1AQaq ?!v- .0sfe\(bk~YAz\2Jہ:4jPo5b>cq\"AK.g ġ0̢E21E/kXe&Z7 FXUu*eQb)ų*$b oQ㹎r\Ĵ2^/Ys(b\Û QPEcp& .d-.<Ī_SQf)Bv6&DmĥF L<:aYeD e%H+ĵ x:K?2cj/䙅̤[XNmDj`vuN'2fxiPVpǬe/?HraP&6"\9ffi> 3yJةnK)[ wn ũCsA 6k-Fs%dNQD+c{w0b kr q֪R[heb}ŹjEh`j e%PPKaXQ\-gwKL+e^8S`=fK%Yjaٛ'e˗s~{#OHcdU&lM0+pǸw*ÛMqh. UDV\Njl>)ߏu#Ifb5Lwxa͌Z׍ ƀT P;J59Yܴ_ii_yTS_WFs b6L͸Xfm]L>P3J4Hk{-PM&P32ķUẉZeW7{b劚*FMJ%i{̭[_y3~p~yoMOiol}DoH89b1,-\k.i_t\LT%VX~S#-.o΋.ZRql&P G3ܠ[F'KPͬD&ݑqgڦv7j>EoQ8m"ƿ0uj,E>w>afSmr1̵n9y̹]> yrw.'1AQdL$b\W-]̖-A/Ռ4ͳ-T e-˙kNdX;<[D_C_Rk[b#KfcN<23AKV^es  ^pq̯8_P^?is20sSJU4CK|S5%naۖusFfOPYi |!3)Ura%ىܵVQn6]0`;]Cmk+u3'[}<%OuLKs~`?G ; ZK>̱awVx.y  1p1Ta[{}ט;,[QrsjR\Cg̩)2c(f.5e{\Ds-?E4QreT^Ÿ* m],dzsN%/̾Df|0 v-ʩA-{ĻsOЫc)y +qeEs>;[ĭb!KoPo虏w"0!7|Cj>e'da fXs;f;Zq;bξ)y^&.qbo)Bq%fJ # !hFo0NɌT8Fxjdf*߉KlAw1TC Ԩ*\= %싔P gF+wa씲}Sȭ Ċ\I2 2007}C8srΡ<'krC_ Oh-:@iU&WH?Uc)ب`unHzY_I4 [cF%0AW`?h\,dDUsenwy\&aWAFA5_1g;\ÍLY "Mv6!b f|=`x%be1Y,0GTQf>¨Ѡ+̮ ,ZTq}E -s\s%qD"Ab<KJ KA_b4ocSϸdJ q)q22j[\[3fYSl tdPxB̈B'gaXM 8(6n'Tϻ1bx2֎)ϙ1cĦ5*b03b8V0}}&2˯)v V`D lu4%[A̦.erƇ5QbBhEZ?B* N(cƥq0_W Oh_S̺IB PfQ >a2jS(pjij1M˖j̹bIH1{YvuXWL q6UVC7)_9 pˀ$21+DĺW>Û.!-Nr+Q|&߱\ -boyj& gCkቌ{RW>|1fE\ۺ6ܵ`l, cKS<0~Ȩs.9\u@˗l 2՘=FXR2jVXIPDpNY9qh8% +4,!s Rx;Dy(YsPnb)-#:71]Y1z*6QLliafGD-W\8к`ngw {f)*6)0ܵ%UTiSXoY Q~+RVmd<|,^q͓~"9JdVDbMĠ( %κ1˾Xޱ lپTجuKe[ A}5fCҍj0QU)uQ߱(\8aI\ƧT (3Uo/'\z#"2 #?7=>US3YWG tύϘ0Nas嘘Z:Vn>XU*axJ{Y:,` .6U ~ o(VEclWgb*%Y$C}3[Ua_$W{bQ@Çs.q_I_0m+iKz#Mp*_S*enij))[\n s/jaK{fm6n(c*wT`ʢ%Qy4yix1cG0:;T(\[:crGߺyB`}R䒇s˳pf S8rjjLlpF9U?N'!@35 ڃ:M_!{)Qfn1"# rqQA,_cp7{ %+;?k;S+pA1HrgQ#—yTKfM&9Tn],é%q eZLb1@n2WV2?pnySh2ZeSP WA^7㚄 @S"-Nf.س+}f7*aihmg4ϖ %'n^y^`_:[# BX >b$ %b~g)2p \~.X>9y|z^. CK.3ij}-籄{ & gn{ Py Tg:9KLbrfKOpKq]L8c8ƢXxK+6Bk;{:8)%W,4>UVUVՅhqO&<5e 2,]5,\ 4 ^n-Hs5-CBe̿"KBK#3"RZavyT{edO {V)ό! uRar:j*>A`}"`_ X-S腊2嚕d,H>3J?,e]M eLQBmd^^D(ŕKA2jhe֘~e׿p6Mi,6>"vg,-"VGq_0+sޠj:BQ˂]mݒ1!sv0 EmOp?؀qJ, p WjJ1D ~2_0-4vPL9m%Ų`< d9[^kܤVP!C@]~[e]jC%l(`Vs8\0 .0ۙxH>G³j8 B"y#AyZsos)5Ƚ"Xy˭c3귘jspB|c @q&\\ ?QO2Te3Kqu5X[9fS>b"R>` `8U=&Y9*` T70FWW=XE(N1"ê 8rHx5P:wcL92*_OqoXŋ|3L5'X4B!B3bBH#bQ0d8zvå;/7^Wj1lI@0 e/&Ted3u<]Z)%Qj̳ cEM̠DJe:r8Xc6K.UO.S_AqQ[w0~VBꔖStW%Yh#٥S1d"w-bKXBܼBV{F=u`DF*(*X[Qr7ƵG78(]Hr;u%pNGAP@_-5Rj$+j(ezg޻-E.ذ?P0]_41_sO7c W$ *sĢxh6v/x7fkub/y:9xA ˈO@q7<cuYpNZ`Tz tԬsTsNc3fouMe A@qY<* am,9l3Y*ƾK{BXF?[`\>+0ŽŸ@8Tʱ\&;[+j]y%Ok= ᬅm)*cQPQ0D bq0~e#?9UB/TV`b!Z \Br[,. x2Aʠ)˘%rZ,0PJsvKݣ}Rik|g)5TWt"B?A*-qe*kbꡜdM= -'. MY -P'Zܱ8 4eX|DdD@A8F03{u #6Â/ ms ~f-*QR^M༕#Q~e%y.Y.#lM=EG|EO3Eos*1̱2   rMB}k1k^Phf#]mh-QҵnDp.Լ9ra3f:di:Uɗg u15-/8kw/ƞ1hZA!$EƢ dg+3Q`lw *0J^В(@`y`:]#X^R )h0X3bw9OS pmcK{͐l6 Hm͵Rg(z i51Nl|Źl沱?N#72&+ai&̱v ȈÃKe`gxqp RvB[HPVS̷ť-{ h8ۘ[t KeWJ`ufz%~3* ǹ|̣Rg0ELSqL9eJ3R~A!Pr}Nrfv!tWqr\$tWLh0#Z/h/I,/,eVl쪬!55vbze_½[9B˲aIi(ۦCg 6i2ChH&ǮbIiꯁ(,0XZP28p6 ZTaVuS0.FluF9@BW(Xկp@y*B;*2ӤP(ҍ{V/aXuX(֝fڂ);D)@ p]s)` XM)c^fD$ GBKnC( Vu?&oLbУ^VWizfG/DaT O6nuV13X:F~70K0ܬGiXX[hr^qxf2YԺae]Nhꦂs &+{5UbZ[nawQŦW8Y" 5cgq)Sͼx=CkF)c;h! k懐)F|f)Kvgj#@ i:bEv Yh²ǽF";rő4%9w8G m 7fȿ ` OieXYS'@mP6Dd&Pf->%-JlՎ r˔e\;"0Fp֊\ⰵ$3k8aQngO1V+1$7vU#iRa2)QK8hK?71s5Gp@VU.|][ u*-` Gk'ofd%X%TK. (-Дb̛5@KXm4 f]r>(sjWg'TDfP2!DT^e7Sns#/SPsf5םQr*Լ \pr=ecYNL-՝ /4AٖUjC@fMجe@Ph-(tYd)t~tZ"$ # =Fd@%XAl(0p@ma*zZC8٠^S%Zê:Ƨ#( ,`txYcĤ?_^*zԺ`Ŀj &|ś;4=P6$\ک×X7jA ]pr=b:~ъہ"™t0P^Xʕk+2YP(?fjZV,ㄻ6D@J-:W|rj "̪9*%S{0ld&4}ђغ31?aұ gyRP?A+/> f8TG3,ZM@<,o `Ħrj>rO˔"iGa .=#.řL*ۢz\eTŴgƶ:;:Z8{ҙwp*ekWg+hp"Ant"PI9d  yYn{%Jtyr''EO,ٹ4)RkqNkjΓ}ŕ[ƴ(Ԩ 5wCJ 2nFB~HvPf-g#vz+4SVqiƆpʼno@(ds:+݃Օx]TQoݘDowR+qD7I\-/ObHR3Ҫ qf - j5Db`NW+0 vvU/fXV,b!ȴj|mmXy.|Ue#DrdMFXQj/V "E#}/UE8K.e{2fg2x !0q^A^ dECHKxBD +ͮ:>d JBeb[aZiT®0Tw|_wZD. W&=c!REtaު 7^(]M Z\Y4ZIB2X m?LQh j"kgRb=Á༸$p1/zT(wCF!*2-Dq&.yaՒQ\GoخH+V`gU^8x]gct4}ץ@ M{+c|9YBN\1l0HPιC-ч2/0 F]^3 F2>eTgᶈsB6GkNcA[¾JTei:#MXxzÂX՞xY#a͋Kh܈~TܾVN@U@Dާ}[(A`;P}-r9bs-`Lܦ]f8WS1G3|>@-:@X5_e_żoǘ{ԸrZD9z0B;IQZ#;,i:&3w 8u+/ C٘ϝ&0G<93,eO^X1_d+6k82dLӸfEQj"Z^ȨYKxw+Ji`9TcBVBM|#igʄY0`)M62jbe. f4Ps]"]O.@\Ԩy*Y{b Sx8;gNVeϏgFZp@.XO(QKV+Z ! 8޳{,NR/3N܍H%0l>^X2<QcWπTɼ鿶S_AYA[r ax9[1ExRķBK}beHn`=&x,TŪEj.fE\"1ua:4c3 Vj$s9gT)Dxʀ0:).?38{|4v˛e>f_7G oP/E8Eqd1PҴ^ `%mkraīV .}?QZ<^P8nOԱ0=@3m5l`b2Ԗ c7cP@P)^jU/ tEŝ3QˠGu . :Q(<±Ox7+7Y-V{`m7Oiқ4$GʬE? ClI}[s88q2mn<4HXN2buz o=PdyϞ+bmqr0lm3jkq\$: KTXڣ]օ4WrW[r UVfc;8a D^wԤP޷"h^EV+1csc,tp7ls~#Ѡۃyc*}J[bfc{ܹ|QĶ(Q(\9զ8F`Kf[mY;s\= .d]< a@P[ 0@*Uq\$eK"ܧbXt޴;'ZHt/1q2>xꮟS&NSN[RJVœM5j@"FT/ fP΢I0l·h0A 2tQ Aw騴^l2;w1:}y=cCPݞ+$Q_Krvj>m@Q|1rX=OmWe˘K7s1AscƹݲLv.- {#c;aKhvl S yq銻ų }-4+kJW~/~*sAM +hQ0xB N5V=\19U*VrCs1HYlP@Q~,HMNw%b^0`g 2h9^(LhQϻ 0 R6Q/r\"D+ x?sXF=لt\)x8LɌCZX İhsqܵ"N@G*k*E-JW[aXX)20g%ye*V{}زb1]!(2Ug|gRK.\C%_;mj+H nǹQOqbd[F5s7vqԤJ ++F A7ɞ8*}[Am!\KHAwZ^#Urk R҂wzr/gp%^~`2 %eTݵV`^ecbz{-Uw)TJꐁ.8u:D`)rq@L"qXⰹ|l%ͯ<L 2_a߈Cˮe0sU/x1Bfb(~{2o/*x5+@'r[X<ƨgKŷk>0|en#7бU)\Sߜ˘+|@WB[>r[av~1p叜'iX[ O5svVڃAɓ^Ӈ^'zPaKX2.Wʵ"xI% v @Bh~`wmj,?[RrbƳaoHZXBJ8$XO/;.+4)sP"l=4ڹ=Nimh(oYVr}$ܽZsk̻gwlKBIng<>*"8C.=w-oL@!PۮzZg԰p8MSa "ERw,H~]ɅX۟R!DfZB-ۆ`-R+%o&C-7,̻Z6?O/ J Ifc})0VBˮ5H<&:&>pRs;+pdbQ_lISfϙfڂ[RhM:gaS{OwK],S.y>>bb± q({fp!/PU<\?/dN!1mxs 0z廨aW>"p 2j[w=ƥ[WPsEKwL !}'yb0,#(ܿqghyS۹%Icl..nZoqee910o q}f3},3'iNf\’sC^/%r9f7~>3gЎㇶq3MOP {O8_َ9 8zf>wns?SMg3?!1A "0Qaq2@#B3R$CPbSr?GhBh>;cT>S <3 ҊGU=ppמ~vc=BS(RƍZSA]_TV܂#Q9ahF1ޣێW-=bF|tZElLN2D`P[P!G ETp*p6a+U > U EJ]l*{֗ 1(`P(BQ3=NFUe~PʞB8E3N< 0)SP) 97Q`00Rt$WwSAF:)e8kdL)SO$ )E~I8!g.VL5%J@O;SgS uwqg)ݡQފ{ʉ()94Zece2{ߔUNJH6Y]Bʋe2J~IcXA[?ETTw)S*VO8R*prߪ-'DGv*ʖ6=|D`(e*0 M1Nd YtBzU\D I*ϵ\MWma;=#<n(o1xfRu*ZjEpv&q~iP_==m?.=sNrT')h;?Ӏ6HTKoO2QfdDLНi6 ::a\Gm30(ae7Th)&S烝{&TIM2SͣU!~O8-ofyStU;LCSֲ-euSDo%:>ASa+@\:JPNN[ ; 9,T[sOynM3`&h5/SU U3+SeJL P)P7µ^Raҿ}w[BSe9BI+ѽ6  !%<6d~*9Sg[M p(S9ƭIhNTׄduN2VERnVVKn ,gvꡛJ ȹ-Tre;TѢTRi{iUB[Oן5.iz,Щ7ぺOnUG Sw U\*Us؞Z zT6}tA=4wjU RwTg:6h.@#J[RO;B't]&J2W9]ƾx}Bqdq)\{L|u~%R~Kh%l:O+:Cx?8=%Y 9!&;3W(wRљ^uB@@S[".Ejj+XJmF>*ǤBDHn˜91Z V<6S"Un1zORdw'D9{-kw&6&֬)@krJ8F9XJgI]zh8Dy[2VwU=D"ta4Bq qĒwNÿ׭{S+udWpYPMhqJhk]/ߺ%1ʣ>%5D*U0 )[.;;e;N#5MJ&. mԮ c@@SL_q/S? d'8JMm 4NjTh/p Nr.'qofP4Nsi UmNr&4P줩(Z&S]#'j2߾ G)HRLCLS`` qJlvܠ4DPj"m( NwUt&XAYBp!޲37ך1Ob̶Zi1ϯ')qC:sqR't:*U䫼lqG:/7%FVBĵȜW66 ^ΥV5d cSnMp!4 +-_ Vv.S 7ZQMnw !/vcSR:DVFw I0@ka.h%:rJnp \=zo]WQ5] ^5kQ&uwhjfeʫe,kSx45;HB$v8{PDt(UcIhzUTt%ĵ<QLn`.O\#Jl1s`SdzȾ`"LEʓ/3Dv@vJunSYUWgeVZ?=zq7 L s]z(EL+^T'uU 'Z;IN`2^BT}\uN!:.3owӪ\WNk9plƒZ`PN7\,srk% #Ղ{71T[y:SUWeLᕀKz)K+0\PO^XЦO~C8l4Y7zl?ϯ'1U (}U N2$`/?SZWY!5dTs*QPxJP0f(YL" Y=%;4vPP۷g0fw kU=P C&5U=vjTn!5ER*PF; JS9bKV?3pvg!y;U^z >ʟkܦPFW PJn_[)TiO± >ug I "QI 3+u7Eij;*wYa9 '&R-'Z*ruMvq<5DSmVrx4ߑ29]Q;zG~wWQ/[&>B!8ڕ5@>Rm?*yI@UuRFVS (RLC\7WALcލѱϚoF ӓe1e[&5uUc&Ni`wUjU+m{ "q("*RefJ5(q޺@)A;6+P{Z>٫|!O,y4@NSgT5lWȯ/FνWG62rjL-ppLkUJfDI*# oHdz9ԨX*! Uiaިkާ27EhOz(B %yT^s jwX'S:_ 8 Q+uwp_2)]PRI@%M ,8h8B%JL5Nƴ읝u&뢳5Bg I1*QS䅶|l%f*q8J 8ʛ)`y*eyʞBTpJ(#߅='j#;l-g9C50ubF`J́STNtN;ʕ8U*q(iHi[~$ue]2)6;W+ *ilBv҈O9V3K-Tu+A5|th6J>+JsU'{f8JsldU^d.7›2ܣ|)^T<'v0se4e\S=SVj~*oSg8F*@4L;DiANv`GJ y͛u+16b]j\S2´@Ajq*n@D#t[#:2pE:OƉ&5Ngo,veԼpy1iU`%mSz~Ѩ QrvGdsK{H]hoSo6nSBXsuJ0 z^朂`Yٟh0%Sa~! 'c U|֊IT.Q $¬04 XixTtѕDvC6]U։s_ge[/ r-5=?y쳸>=<]|lɧ&z,&]ϚL ?tOTj MFK%™^HkA9x <1ׂ 3Q8PC+nҬgz쌭SG`e7YNNw6jQ2L \nUrq:D1lY1WG5I\S/+?TGįegiɴaA=/tI^@=SjCjTo5O?d.Nmu%P=PL(E9ەІz-nј1̸d7AjzVq a nGT) LT`5Uc)(Θp q.*6fuϫj\S'E|r~cdݧ; W'{3|2sPi #4ł jog*l}uOD7;Je&N<.LT)F#U9|&^:TƋr8hU' k5z=޽yS;E;m~#M|}B US#?iT8ojʥR*4d*6K[v\C@9/۲͆[.=%MΕ0r}("BNQٹvl|O<|%r[omC}W.2t:"Ns8>M4EdSS Nu(X}0q):\ah  =S{_1ṔQP Q|2[>-(^l5O{:MQtL(<Ja`kD}[3/+؎K \o>TڛIvVDQ=h{=E*Ωw8M1U^|` 8N&CD 0EqYT"aM V|(BmTAxUYqGNkR"G ^o??8|DYSE4*8\3}}GS)3pAW=!}Ua"WM y-ܥR'*y( fCGpTլ\S0&U0T˪IhW~?^9L\a'7MSH5-7*C}Ov1c%Bbok\/P6TZ^{A&d0~qV\tЋ25elۄԗ;9UtɌ.6Z*pWokeEț2VN_+ljr8@=x́Nu]~;gmfVhtvok<^h4 RjaaSirׯ]T4z\TZLsksL1 j{{4GBU6UE>~>~@]?t4D`}lnSFb 4‹&u">SݥŻ#b*^9vb\xI!97T`48~sWw% eԭg5 ^r[vGk-nI3*[ 1 ퟗ}gmQߕq[CeT~Jnr\5* `7z5ٝr2.ތ-\8e3 $0'S(G7K}zgh0`!IϸYM36 A1(~ ( jZ_#3]ʜWhUle'D)j:gkQ~q*TLT:^kҹ`mP,HyYEJJUROG`_m'-:ms|'̅7-mʵKhW{mJ l8hT-7E𕪅;IT Ulja 6J BpM#3=z'z-BA/2!sr ]e7ޛZ=+&u]H5?ht{;>!s,e~WALGz2"`,l#t-:e7CbPw|r[I0Ded~Η-.&_N2ƟgaL-`:JZKaa9?(`J{\p wS8TQ| Nq*%X rKf6BIMhhKc:/ϻ4iN-)A6 4J8D醺"CDf%R^KSDjt+(U.zzSGe4s OT  2/ATP%nPK.̩32a\T/tʇ(whٲ #\1_!ZT(&Hfr}BǼ1RZmTnETY5xCSAk2<Giٹ?e;fQ ^4xO$//oG%%"M{m?9h J%jy 7#~0 t]TOe+LfzP> -AuA FxM)ٓXJ_h-7܄CrLS*S{ ,( qYT(YJ 4KPSPrQ_ߌ!Beg7tڔֵ oxGgiQک%=ΨQcjP@9(d W1Z, .R!UZ﩮J -TF"BMF=$6GS]/5|M\mƍ+t2#p@"F6Q,(YB`Tc  1ʀ^jb* YLAPe4,Eo5\m7`uzP,BEBBB(ܡEךVw+;\\\k1B UAPF(СBaeQ(PWBT(Q* (1h᪅B0  09T(PB (QՐB(P@(ʄF,(*n7܂  T!‚AP(Q(GL(aDPT(#q D-0("n9T((6B0w !E p`0C5.+ vBrfWW?DSuA&!1AQaq?6hxjr?h<|yے 0m)!.U9)Z>O]7GD!sw1N6J Xa<)CnS`"4/o\.(E_81ASv90:7 -Mķ]Jr`v^Ӎysp^"]L!.maz({ODMkͪ7Zyk^n0Lr6/xG4pWW6ʼn+w@ŀDfn x[oxtR;Л߼u~HV/NXDD~f=ގT4`6\`W@؊f*/oxQM vc) Wo.k15{ rǁeqk90%mA8z%k!Ca! I5 "A*fZpd<S =f؊?˃Wz: +d.g>\i4T.(nHLq7Ҝs$detXut Ođaaq,WZfKvszO2=~aOrBg,5}̮kfGs8sQ<\IٰXl,~rqmvs[^n%(ѥxzB (# ⲃ :Y 7\| =8<*9@r]wz;hNq/`y[2B7r`FqǼ=]ק^1Q*N򒄌mĽqrJ__X 9@>. [50% SC\X-ϣ^{͕kUq6VG9{⪠~w1" c(,yvW0ptej\M_="c+bcYV=c*tDKb$V8XV*+e'?xd>pSOZmyWk7mW4ݽ\l/<;@yҿ.  ~aC)gۉV} oc-{a."[ɕLOHV7|HӡRXͷ&*ӜJ5*q Qs 7w,xr@4xGuˋ_fL]r8Sx^ay|c$8(l>_dk `R(^xF8|'|SI7L;wZrPfG>񀖝7[Ʈݹ8_E.pg5!Eu(ۏU=*w+" 0PMv: p 4oy:޸Qsq~rԾT5VKôbG6q} v:\o^0 Tls1Auku"N20vo,ݿ8WO=A-*w^<[Nc ٨(|iD"'Kͳ_EiT+Σ6=_g[t/tO5T7<%<ʷ/}gTʰC]KoόWų86E! e;qFLԻӔ6:][slM=ˌ7^wgɡ4vTU}e)=?4CjRr@ɿ%~LPڝc""\[ʸc&~1\oNPt~{n"yUyNo r}hp\xV}}Z/Q gd[Pg8"&5@784=lV7Z] z8Buf#qr{ ٣:FivB AR!tM7w,-N= Gwm7ni9pr {H"ƈ-/ypi/TTmϸ,14d/mnxM6/xq0d FJ81Q97\-p|Lwj:tSgd}o,[͘,nAtɎj oo NcN;8(iA ӄn`KvwǖkWkpr98ŝe񂁾DU =Ѩa=ӝϼͯ_͉/Eȩ!mKBIԍA 3XUMɅM/dF|Wq m{b$saV5G+ޜ"yVnּwVh|<. sǝz +V={\{q z]p ;#f$e_j>xơ"xŷiɷ9l9VV78&m[*ϜD $+w`ko.iMܩ+Oz}Qα|^7H(Bm{QY]G{9_ˌx S}͆E"&ן.j9.qǫl 6nX .:H ֵ?.Í6kW+*83y.j<[sY.APn%ʧ{*V/%kO5}5I4Bytl? Jl?ߌB4pXuynU\N(@o8q / Ѿ}ܳBzy–u[@_ yPOn`6{] |3e6/|` L'Z%m{U Ț }b-6xKeO 8b6p,+G{(<lr [,n)65xzNJ4*U*y~q^",&0mxpX dBDSyllG9F7)P(ud{K7=<9AMkK/ ;o#R]ް1yN%+RWn(#ne.I4=8=rv4){p_6_(~oU]~1]'Yg/3 Sjbg~z8j-6܈iL8;ԍ\w!_ɬf3s? t>WIYi/UM(r[ u{Sm}@7p;pF~9²N9rmO(!Z7Qͪ4~p޵ gn1B9VY5ü(S-o%ceo:8]^/!ҭX`Ѓ+ Uz.lȈ`LJcxDx;pTt) kG:Y]r,T~0ƪ/"ˋ%D^ܤ޻~qTwi/ Z ȳƞXq AI$#x8Le"ϛE0nO{߃nR(qwf/34@Xw#P]<%Yʠ&jNgVo4M×QBOu/~.MA/F3Kt?ZJ"Dy;\-4T槀"$6,*/͐oa!? Fsy4E_S{ ʂQ p!|\8'x 4obR8o\;Yh'R<`Gs#n';:V3i&޹pPQ?& n8#ަ;-F.H^9Abƛ  MS8h|5y ףߌ0 |lj*ۭU5DDĭP<8јJ(iĠ5:LI=^-K?8@m](|tuֻZHG}g ?xH60γÂ5Xۂ(o k"W4лGmoϬTٽqACz|8$Q:8:;E[>sX_u\{Lsbv1ve3[`i4d6y99xּ$%z"͏{%X28u7A3l珟5/N$.BwKl W um|w8aT L7[NvߜEݧ_$G^1Cn\ුy:@-jPcݗ{s^-}b8%סuȡа(Y%GW8B◴V򞪛; 7, Gt9IDvs4sC&||!\6(^! as1 *}Wۅ3d)Z~qNǧ%ްz]wp㈷7\T,x㋊:|Nۓӽx <v.|"]w{y^p9r4}fΐn v}R] ;́5 md{ 7߳MN[߼ߚmۜd79Wt[L]x^0=7xjd;`D[}ge~@ÔwxhɵBMwyN~rAw{4m׽ O槮CMhnw4>0@z8c[Sq;k˖CGnKU7+BΜpmVpEr9a/Wş=MzφA2.eE?&ڐЙy0SWH֎pO5-(T aLttH d{§pK% i~r8 R\f8wih.;só`ur1HrIvV;#qH=b Qʃ[n<fЯge4r&#d*/$ xA]Y>pڼ8 U{nro|6;\  Ο wwXGb|9"uᆢ :s^ O14 O^r/ κKf|wq]?wLiwas8(׋ʂ}8(]s5W+˦')dw?R6 @[=&qy[..&N߼X]# skMLx'9NOΰpx5" ǻp=Nj3 4 o: Ptx0f TnSɼEq&/ #\[PYquK;7ϛֲm\VP.*ӣbJYo,^?hC>pM]ܰ5:w4}I5(⺿lMWi^.vwXGyN9f5]b 򊿍Ɔ'F5p]O/:˹ۍr Kֻcxݟ ޵cLx>i *LY$;GN#SXFgҽ`px>#k_;y;ȃ&r]C Uk"P0lFP+9f(3`αRSUo3I[1 zV$ px X9؋o(-ig72N]h4gXJAv# BF6M}РqTeb\U=Y +o4t* )ǸVg?@8>,m/U߷UGjCw{3}Ŋ_"c[KwwBV^.9/*ל#u=\ji/>sbx'S_>p눕Z‰Mk* uТsvG!s[_ &I-m>aO7PFM2v.J_CG iڶ,'YQ: TqJUdڼ Ѝ*.~~P':ن^Jxq5Y9U~u FByB](6CF^oT´!mNRIqGG  PKL#haRv׾"]tb쾌 &tӼ2:Q5% S}[TEmRݤC!%7a"0L׶; [EvƱK0Rǯ@-*>wUY [(RlX[$_;WY@\? B>b ` ޲*Ƭk{T7xͅ?`&o6=]^MĨ}D-&Uwzxȥ |UGz|F|T_pr0n:|W@ `nR.owyWx-Z]w;-/ZCRK鐰GCa3bȦtl=BQHg p699`=deܕeZ^ sY}n;x7m$ w iUtrt@6 x8M!o_xY*o`zH!s[s/@R y7@ [J*G1>nY aA Jx>ݩ]n!NߖPywy X"3t/.".P==\)D9zȼCPٌwX$D> %PYsZ50yшlvOWCI:[[ L(uʎ$1D?'7mmrE%pw84Ny ")AkjNyJSm5 #MeT vkӲa-XSզ-MtF L$NCI \m)8A!6I^Zo9aF^[~sB9?7W۝5r^xv5sy2~1i'ŧ^1^ݷYÒk4o wWq@OteÔr?8#[Zx^3DڟKw26F:O_.t s l`7M7 ,Tiܬ, G\~-aH,bʛDv]L$#ֺr-`D0\_8۔O|.]*W{ɐPZ)|abj`[O+ siZQc[jI.@J5 cӇ.{02ARP4!j#y4ophO߬2]σctuY( GgoCn#! n^>[H$b Vt &ҩP8ЖV˗4\+cr5shAჲ8P8/?񅪖-d |ui8z8@\w"z9\3$R,&B-tjفh6\ ![m>n[  EM'yf B=ѹvԢЈFI3^"{^nb|=y~Pּ~lOw(mV77<xM]Ñ4o.*Oe"TîyU&qώxf&{r~>#:xcwyI+yƄMn&APqu44_ow tjE"PѽGpX od."yI)#@p'TH=I ~.4[qPVQm! a5T8i g ]H,f(r[F1Q՛8@!׋%FC"vY4N&Eѩ3DDSUI^A`N'Jl@nl#Uས5 !NnI0`?(Q_Al(34 xy.-|JtzV*$/h B`akWǬ)%JNb +̡ Z/'79P!y@,u6?a?95Zq,ьOq.سET c$wtsbT nōA©9V`.T3d) U6-xGq;[țX-ૅ Е5F ZZrRrtwYR(wN9onP#y&ڄ|nm:}~9G7xm p(0a{e7H`xM :|9^pXVp%PS|XU>a_ L2E@bh#I*qBr7Jn+n -KR.,׭%{ɱyCt D NT$w v]h[%2$NxτSÝ$f@nsUu7ߟlLC]ж-y4;-7/ϩ #WP0EM8Q:@W!ΊA鄐@=c(*"Zky^[AG.M%Lu;‰1+F١nX[*x&2LT=[񄫎s~/9k)[k6׊dn9jc~Q}9I8w_7ԿR_9ƞ/sK_nqєvu1q#՚x5;lj>}l] wVdKuj餈;wnA(vO. 1Р_(мp6EPlɰR\̙Th~qm;ЅYu'x3NMݯ>nJkHӧ" )oyAIK*C{PUqlAUV"O :ˢi4:$]鋙vW%lpxPjCF;Qv׼$(U-~G#(&+F0Pf 66z6O1O1Q1^MP=OXaĘTP$8 0% \CM!t ,gI9[3i|#U;aJt mUh.hrY҇hTr@^"%X "R{}WGmU e/|t\hsvaB _D1(W\fDKu$~MGf#̱<;hAi}4F6wc σt`]bPԡơ^7ϷqrF/L?0"C|[!e>8,UTiP4" B%H<6 -"?Em_خq xQXRp@hu/> (\=kG!}dNs^oXp9D EjGIBT !A,nLz9>4 8i 5D;ڵ!6IbF5  }m {D؎~]OA_^MN<ƙG'FU0zQ(,(r Ds>gTX QH["씪 fOwE'IKׂE=Ϊ 4lodfR-9k@ ^qv UujBopQ!9-YCHp ~Eи&G遐I$>r!Sc5R7 B W=esmeYh@+{@#hZҢT).Uԑ2oI 0}<,lAjYN[ sc>> Vph\yM]iĹ1}z qZM ߛM_ x /rⶈ9;&*_TǒVi?FoZǜo+vO`^`/AZ髈C`U 7L! Hv|h oDC_`/rOx CH'XI B(םYYX4O# Q`VM, 30@%E::ExAE"*h ᅼkf6WՑY4 /V^]]XY4=yd\0Q,:6P-'̰DyhS.QӍ|oP`4g%g4RnbZ3B*XiͫŠ AUfpPBIKDXVNhi9/"=y(T{Wk`|#(_; ,*Pl Sba  ӝ?h!q{C !0"zkdSyp!y%m5(X} PZ 5]r/TSA5EK ;AJ>=2+6Ho66*5;ȵY&ްHi|[|y'yEUw8@*>0 ^@{Ҫ:2'Čם`=䜽7X(v֫zǮ>wK?XdF %[ea7\cJAP7f;:xAڒ@7ϖP8}wd8Ϸ$Sd0vg\m* J(H0Z#&tΌ2Qy< N̟w2*Qsb7?,ʎi/q\(  "}ܫс=s`}♫{q EVo]mzNyo K9$mÕ׿~8fhf;]9`r^oMxpBK ٺbl+)zWXlj@giBQՌ6GƱ*>FaI; `ƧOPh[*R=):DUbUL6bȵha ᫁!*00Eiu^pꬣ`N'HasMZLDDP qۢL*t4(DZl%.F0,h8zGP>VjwUr[YVf]#)F X`[ 0-YAHdҏlyjS6L!r 0_Ii .= *a6t( "Apb`ЄM,&<tb@^W) UR3b(CUq=iVm trDgc?${X(ѱM<I&&> ݹբ.v F́)'鲅KF\43SCU 4*l RiUj*Gtnd* VlAD^hU`FEkl(|PPwxZn" }p ^׻E:%?*c4zx56 PU`9a(㌍†<DtRn}C|B܀XOLðชk<+}d $&r?*a)ƌH A, n,* KI6t_ ԒŬLaV@}o@R>d< /"$@ UJDF%L.p΀oc, 9@jȌ/a 8Oޫ fHݪJjsouDKbHp%҇&cP))%./B9!S=pJ>r$tG6HJ[ ](k%%lx8ɋ IʖICwBvsNԸi3XJŤAxpGW-aϻrJ1jBUW77(4TiXIQܥE|Rb"yuEg)\6#@xsΊyFό(MRթ\=uЫ 4. 4vbx)1 SxKUmn86*{67$9OxLpO/x Lx9:sy %/Q8m|a7QCUpMVMo79 kLqp=C)u i*lMj|qk!X\mDZn_/u)!<KAzF|GBRh1 T9ۉ}N$ ,,Ӌ5$لuribعY]puL#"-kjIP A"2Ahk7l7*P ^, <`L FuEhDg:r <}bLg\X `xP/ڠb)?w09G"UrCZ! 4]3 $ؑDWEQ &הlv8T-X,~~3s_'PIuߌR^) ;=dɼ"!)0(mݽ(8IU_(jTEvuqxyۢ^qUN~uv=md# WJx:@ChJYj !EP\:F(F5H*Ф$ӴeZmqK6lZ +M-׿v,*x9{;yAJw"f0G'3-1\ixaQ|3{n0Y6(@i 6W|oZ( ) cK2@127hv 9bU7v#MBZ4ˠ|!Bh2RҜ4?#lwjOnYzZ~ܦ"(n q ^;=lH/#OO jc]祝N^]~qhޝ*&.3$DaO-^%Ҩ?Xy5o:cA1}w,Mtd9>#]<3 EkoJu2X-jXPTYE;DѨV>Ky*F914p4 r["k'SdCgCe@ sRb::5ɑF.[.ڸV(<ל [((WgTJJP]6Tb2w\MPp^mhJHiA¡0IT4{iNlH$J^iդA1\S3@ aUFߖn1քY_x Sm?N:$&﷐6Gϗ7gj"=UZm{M=D:matjעa5u<b5A k#R'b㔒rn"B0[Ɂغ{x9UH4Gu>qZ*&WyӶk)TzفR ۊRWYV<{Ŧafӛ_hO w_ 5R0w[Tݽ{eRL.hH8NXH :ӁfQ!Y{qD8k`F6r;*u!] ߋ sc>7&) X E< 1$~Bȡҩ bo!W<ȫVAr;Jw(6UQt]0U =vC~0 vdwqH.켑褯JrL4VuΕR >PD"o QjddnQە5n>< "sH5.WOh=pxMZ`¢| !1Euq56[1?b.1o88Zx_@yn5"~shrij409;f:Cnl;cl/G9ːc.l zެt*'9j|M0BpiS*zȭn$Gh'hiZHP9HrRb8kcA)@$؁p;-km@:To5Ol4(aQ3i2RZ1Ôĥ=i8T޶ݘ(G GPn1PvCoo8jnHCHXRO$q#UeΓ@Q-fw'U I #b]9ÍDTD x48J;0!GCЩhPbb8QoOx10 +bEM|xn"󌕢w! 닑sV{ʰy_ֆxjK}\ G_ Ť/kxI@GqcAh/Lc}fJ44]NYx*-ʜO/=ZW' shIj|W 9RP^p95-ʧhgX~"xp:p"\(* & 11'-4]u$E^yDʦʭ]ᅭ^zU8YFAߞkZwΘۜ(焸8᧚GL/E'FOȬEQX.8ѤWYu0GI MH6G7oJq9Kl1fT* ۱F!LMoŌS5žƠT#"3GM|cWUvƏne]^u4%X6k\(W>0.޺* o9fXJxo'tʨ5䆀hzs󀦴PsPizӎVJn?-ty !MN&Fѹf7 SǼYbsަ(Ly b+ۈ=|`r.[ xDruD N}xU)sk5 E/n$i(8&Ie\x8X1)>f9G-P:]]"pt?9 ѽVW~bpio[Ǔ. UiT<%* s@#`X+!@BTU8!P=b: º|d,J~xM|i~]1v"yMw8twktۯaSg]smrao_p(gtvǍ20RHHi;LAHrrZFHl@[.A)7:T#'g+N+lEBHiR9G5vj惎0@+>:(C6܈cw;ch:|pGxoßY]x//=wwe5In[ہ T  ;E^< a]aFX#4$:_J@ giX6W7RWSJT"+%#M[|zN FV5۞1"?a`43k}޿q5$͎ʵp"Z=\h VRofhME  7ޤ|yoN6jOh~91L0ܒvNQ )L`Ϟ2`ty\`" mVIv1US^zgb>EQMHj;wݿRO [ƣq`{9@yWhD-7L?-vpJpigk'lzާ9cː CKyݤln!04"Mx(4[xq5EzuqҐ2"i_rwm|m;~rMI㞹|&Y*kDwbp&Y`yiXH|Ʉ5J CF;C52ҪɩA\-I"J:9N I';sQM+VַqxÒ5" y4U vĈ%.>GʻĦTZ}x8 ~ҳ6; A|e XĬ |Mqj6{)r5  yĉ#>Mg|@rx {10S0kV9!JQ+ ى-~WwQFԚi|Y\j$Ӑ͸Ё*ֻ{qF 'ҵE\"<5{Ŵ'˳6AyEA?8 y_X.1 }\:^y~7g>n5>n 1|@3;^9 l6~y!g[w5orS]rsҧcpBJw5FCÔ-9 wåxU5UAz?"'m Ov[Ywi˄p*~%lNyEd3}aPؾI~QwIouqIt/n3mfv㳚q_.m Rcm4 lq;SGLNNIx$ d/,qoCno;8oBFPy _]~缪V87Yo=iWL(W~_8)}e9K}gub*~=`1q|^S{Y{Ofk%ϧ+.6[:?>x΁:ȁpZj~ R߻k >n!+֛h9> eܛn/YѽSposV?MBמ߼Ƃ{n`N|kw;OћqGNk|aʼyo),[tp0Bu;"SQ}rЊK7q""_V]n7 #hoH?{ fǽC;M8n}aj7xs8W!>xhϼMOoE'A.y?iykC[8[k.AS~hoslWZn_./:TuюM8GQQߌf^r}z+PpR%bqbSչm~qB+ό&U 5w_?5gɕ'WGgDT [s2&wOlyN "S;H+:߼qly9"HQ/ή(;п<5䧏fQQy1o8 uMpA6qSk0k㜚 xmv9rzg(jo3y7R?{GbNV+҉;&xnNbwb,՞޷~j>w*<˚ x0(,jiwbO>mۍ9A}zqN(~¯;g`l{?z0+m)+x]ø UxuOzo8ȕO9-N]qa o?z/py ]Zt E7avǺ3kγ`{3R|G}b=_[Nx]NEr w ߩpQf`(׽~q;RCBO6De|P6z<}\k(d>}`y7\Jxf44nPn@y$ɤC|vɢ:xln~p9|?x×g3<~po1?sco?}1/??I;}q?X+=#g:|gl_ۏ3}1~?~?8s?p0|L)!1AQaq 0@?efLSn>MGUKm㙚̸o0leD ~7[%>6EsBCU"+p ˋ/ +9[)w_B)9Y“J7\o~5x VL#<@Vx:Zib.7ý9ZO7,NB嫆*.-.efE!Gxj2eA9!as!0lEAQıq]ƸJnXK;LNqkS$[Bzxf]cl/ 2AM}B@]w:ärU@3*C1$C,7Jg9sQk q&"0wd[:k,Ap @\JEe߃ 17*3SqC H{ LXo[^5Fޡf {&7.;0K$8A1pTJNVn |i9Z ߂D-/0 )¾\Yƃ?Mf1Πs\[qz̙Q2츛|D EG&nV~#7h9]sYYA|q^k-,353Pfm 1ыHdsl>ȊSX1Wqg2u2m]e6AuA1aٸv,@3kIoč=#/ƂׅRwU|2c™[A!V]n .ws.XޡLh9T]F1,{ܪoNNY:ج#q14=7 1]Y<™|n)w7|yV#%dT f49ύ @);͸' s(R˨db^-[z|l{)̭P2@ 54:Ɔ ̻Bu%s~9o׃W~U_oʊE !"ǿ]&+׆yL,scQH阐,_u(Uß?KM)sdܼ[9``_ Rܠ!BMO3 ܼҋiP_yw;ʤe-K 3/g@h>wf7{ҷ ¦53NL!jQ9U* D87yY1)U %43y/XfOeu ;3~n|+PaNR=i/~Rŝ6=݆m~k9rUlv]Yg%0R[ L_twj_z?ɔK>xfs(EvEYlhԻӘu`8qphR~2рۘjLg,wO׬X:WloI]s, L2 o'F]˙Gͅ3{iV0f.q(𾒓pDuڨ [Iߘbliu] #LiKJ!ZD.BQKH ^gy_ ĸVx#^ wVzU33ӿ3`Yk )Lg6D[tB@uS/__ .|Ĺ0:جe+ a9yŵb~(MUa"UIjO5S@%<7MB4͍ݭ˴g?4#w i˘#x+y`S"h;P8&ˡLœnx,?b Zca&-L^} TuU r\n톨DT4x.Lm*R1j]8j(UN:@Xe4X$s%0N`AC@*׊UJDƖoP2xYP1ꞿS&%&[t1} |r߬ōtw/&7^nX[F~h&7sb,/Wqw+sp[EeÃk3cP}29&hMk)D1t@G"!/0vEX6\Ⱦ`%d^KħH쉘Ers7.soAL继F6s󴣻,nd;KE!!_Sn5x* ۿ㝢&T%`řlt-7F5xdB< ~(ĶD44eW㿓*^:|+÷uq6^ȿ}5vUH S?M2ʺ[1X5aKb}:/XwYn6+"]kd]EaojKzNfY #F9g7 `}6rtG,x6㉽m,ڈ߀<-#痔MYǬi/9KAah=?Ȃ;mHw. Ѯ_GK+Wt4ta6@\oRuk׬oi8bJJfMߒ\=,O.`q1UN/5O!ǝmFFǫln0cCp%ZQk0` S_5(Tlbq<'U4Tz|w>dۮ%"DF}cM-֎>_^;L ϗ[ 뫧fR NՠdzWZ3N`9!jW:E9;%;T Ѯ+u8Ҁo:[M3BS/Ǽ:5ݏ 6U2q< ͎Ө]O\"ǗC tJTg wV w}x8`>v皗)(Y#*UdHSl=16AK߉eC];.5^F>/T4%'f)m*KK/W,'*iT@L52JPk[u}tzEFn;?ȋDL޸qs)[bKmu-`Ѳ=8u@jj*Gϙbuŷ?=`8 xwe*ܦڣ:uY ko8!?52Hhn-Р=Ę!_gSj6 ̜R;y@FɀR+}ge vkg"HHfL@1]8vZQ^(VjXz wǜvsD)kPo.@l+C.L}lືje ]̠[:c6+]\18z}%y1$d*^w5+Te;Ht˖-FݽOEx :>j8Qo(ufzT=%RhZjbaLAOX]/oKr[bX%9+V ՝"ouNDŎ'r\ 1UQV0K̏oteǮ>(mgt!`""<߽]˗JHprRj(e`2Z+5P$ hO9\cn`QGν{ʮww0(mMY#1\e}@R7,HS266P "baDsAR&޺JyYdw4(WC) JM̝6[(oqܨBKpnֻy49_" VsE؂qīuyǝuWr̀3"_oڀknU>%M3öaFI@q^Bl:qN+F_.oSGmb{K0j"k]>kU ?0ξz6cy1Y1#Q֞OcG)BlR^9}taI exh-|⥙Ua*QqՋ|zǂT.sVj j+^mFJy&̑qH})d[poCYU{7.+^\0k^nwX,Zo vr}Ehܾ&R8S e{qpnDaqҳAJgZ\klcɍ_^6bc/Btrjъ+:P]㓯ԧZƔëQn.,=а(WlEUzS#.ՠ;AʑA0󫂐A}r{ȫtCAPPm~zϒ*Azj ؔ6vr3V+`V[uz|ȑa:?9yoM9ፐf j#qW~(r˖"27--NAu#pCѽѱs]|]T{~O*yuž|u)תx?aB~Q9/Gj _`A6˞klϘg!w%9Z*Rqy2t\A Ytrؙ)/BeUwF(]nq ּ}?>LTVP¼| x6*J 45}S#/?K8Я: Y i? N] ." מn4Fk,hL4rU@_bQAJbgY64i}ejەOq21 \̪azVW P_\,eLϗ]B꾀SRQ)]cUpf'BYTǨ_@[aN_7V/y~X+|S&*_nvQ(cavڇulOF1r0Qg&U"X LO,hܱs,hE~siW~Uw{Co:᛬WE`1l;+ X]Ta4=_vꪮXRƠc׌s0GE֑~Îu*7Ǽ-`p`ϛګ4gL[U75T Gq8ۻn7̟WO>f*|p20Q -7㗚,\E(2N jS#C_X%+^e=/P:E|qQ!4?c?J3/69xV]jΨ_J4 r%}kYˢѬQRrlz0g_Aϴ =5kSLuP_:=2VN9Z!,ɮ ~]hICO`5(=ޮ0<==85XphB,SZ4(ˏ/t/E.jXZ6:YWc^:"T n5N*Vz y-w x<ذ'f]ah!Ve|%-~`,Z Ā .~vbX9ӱw awgtw2#);,i=Q]O} ?t֦e 5l0pf KQ֭BރX阻9zFّgž%2#Ɩ$FPeT63)bW7!\oM{!@/ϑ9}0gEQ}H#aI/+u\]k憟3QJ WD*,*ӖZ8 Fe6tKחxfX*d>zyzyeC%%'P_m{ | heYSv1ȣVw=&FP{E⠛wKoV2叫b:'''Y9lƷX#)Gé{AٸȃnR <]{r ]hE5Ϸqj9PY -{ت({`ZC/,4aKC\S8Y B<`ix[{78ʴp_@3mP]fdp50.uAǜy6IL|)>Svۗ˿5]?޷0hCn.]$m2>Hh09edReKϴvܲSNo{̅^#.؀ U=Ԣjۧ]F.z4t^^qwXZss F҉syOxܑ6o%`c}u5NQD\wkR%V6xCQQ7DjSj_M0<5+YurANJ 8>S4^SoYb2yBqSF&M[g[:wo?tƕF3<-/Go.S_8\S1msjzR*LsT:%ת۷jy>m=v^lY(``r(X]R9KŃEfM⴩`ѣ0YJ}Qʯw."wrٛ6DZb<:t!4w )A%;cBČ ݙfK/J.cc#yF^xTKf jP閴? xt@A^>e+阔o3 ÃƎ,|ߧOO[A=:k3bƶt;Pn4npmQ4yB̮ ?7ۏHQd(Q2?>jZUۙT _Y%֎&VEn[ 8l$ \-ͼ[dA,/ycqQ6{may&?^_6/0aB3s4zT.;H9r^b.ɲ㱌[*a4()@/URVJ&+_(1UVu h ?{>zAm jM[DsK9-%i -#*=2{2-w-%?ƟP>bz R1_:7,fw.LF ۸l72~ bXfW(n go8'D3̬YS=Hyn(倛L46ʅ7psG/9%5WQ+7bhvqPxT1 FYm-=f/0npG§b- j jw* 70*XP^D(afF嬴e+RlGDIe >ӫ=#OhK#J[gyq-e6P\দEK*0$5ef]_BDIw e4ek yxq7Ru5 CD.;YbR:˚YY-LD.q,e^ev8s~s/ 1+U."԰K37,KQYqn +fae %Y;qDA]l$I,KeI0aS GAfBNp*j[-ŰN%t[(h"XGS sP"-ˬhܹܺwQBVaZj(+P/*[. AXD1@uQn9-j:(E 4\B@ ƙ] K;QXCG|{)o~fc'?$؜'5霾 'mg(Hud>^x?pz#d9Ʉ>}gM>#d6M>p_X韁Y)!1AQa q0@?Lg}rz|^c,hmĦ銺 k1Ee eb)[!`Vs,N] 1s:72ATEA)ҹz8߫j@),w6vEVi WY"3AFˁnV-q\ DFI)\K= !mQUΦ~Q YJ8l/E{OAbs}^̱+}O= 2R㞃&e1鹹nF@ Ĺq".&dJ*o\eK/DMQ5_he.64]P]Y/Xs&fVYQf*w25  މmIJbC|tSLm+-W"oG1 uܥ*#O,M kmi-SZdn2*\ofF*]djՖ# K"K@uf"釒ebV]x^=;v8g5)ߢ;2#m5 9NuZs+q/=.VK-Gfı^p2ݮqœ[(Q&o[eF];(-~b1 J1?OE7>kfQV+7=t:yn X 1̶&j[&.5wEmE*/9>-'pZ{ˉP}s}٤[AD=S3Lv`s GcJ^I7/b]e0 #ws .e4 | ={mo7 {q8 "M[!KWSe{xy4 x=E=lweAR$XAa0s _b (.s *"mPH0vB'){̳<2nd"*W>Si Y(ʼ+\ZYn \K]w!|DUp{g>1Cekض/eEu+]Gj Y?)ڑ?԰6aW8 Ƀp w0Kk (XS+<2gR>{C\rap1݊ڄ^e*NfYJߨis4fDJXP&)NL  fv(P{7&Z__߈3s3\7ak?inٜD^ۏC1X`yX6[!̻)}o:w6\Ы=|֏|%j}\`u(9ˌ Ygh[\!O@p\aA)tW9QC)^~v3zEB&2%q)v(^ ڳaMTXj[oʜTքۿ4U_c_/> ?jU1l-Wx“ p}#z`>k>Xq+tu1.c-%U*}hj"nOgE Rwks,;pn/ @Z={WCR>ǗAMFk?1.b}v4,,`SwzAJ?{ӗ~)NC) dl?{Z6yi*Naܿ`y4ܻU L̬)ގaBigS8P({'BdE}n X4rFYc8_t,fkזh͠6lpiBɅR8K^0Tb+nyEcX 8[%/t ~h`y wuw 4sb@Wt] 5 L5>2JBc q,0eĻnn7?L!Wt.ql&1u1DRd9vj(Y.w)eEeÀ VZn,Cތ/>fȷv^r$e.Xo(ZFaKA}(s e{Yw v||E Ѩ+(ׇ*ڀʡ`*jg!UNX%4*PnK_-؉_1%/Q3zJ<9`2Rp%gs-s?/ -+qnCv n7k^^3)yd +` i~n8p<)L5fˎ1ڂreFv(wiPf8Ao3A.ZVm&#9,4)]Jmgrɠ@ۈ-q6Z꭪sC5?CyAYAg+kU0$Ŀ ⟝E˅S`:>o+Eݸ]B|&|&/Wl Ev駫oDUm*ϭ \DxH};8\Sp] #S,ҮQ\VGn)zy jxVv!v@wyXMTeb#T =n ?h2eRmW N((Ŧ)K7ʸ92lTkW[7N&cde5aVVaR\ Z/<VVs*X~M53VFX`FKb+Zަ7y )n%ilW&7 b+ ]6rĆ1X%%W|a֘VN8ʛDVUY\e oqb L0ETĴQvW2Kq Fwi P؈Y~x>c߬x2v_[r"ھWpHbQ6Oee]\ BPփx)Ih/=Ё/ۿm/ CV۾nzWd XlsZJ7x. )x9׷PտL(v0E[qv; kxZx5bŖrdB*\I Qx’P3c᱿eUE^4lEVyqie?/Jw(']g ttxGtQ 4 mc@+yR4`B\r֑'f 6 n)")V$`!*4{Vih 0sC)-mNͽPBcj<*ן6Q@YCt_YQeא=Uf2iwL.O\k:S m,qhT_;|g̏ĵT>`g.dnK:  f}%<~ż]Q5^bX+;aixәFI~z+fjT jJy}Nra`30R9pZ$vDZrg 6839U=;x2m ?4x]gwM |붚~yBaTw~+BZ>M87]`Fv}.X7ʆ=j Ŭgrs +v>yF+fcq 7{/ Z8]hֈkmy3 ; a5j`V-pBoq٢;U_v!Z𕿈`赮Qly BϭFFV*պ{V_iګ\JhI를 b냜^>eX `ȶ-E$PQr&z %oaS)e<2d9\2vn$'ڢK%^b^& t^tj9ӑ"w+ӼAwcǏ9QpCdJф3bˠ/6jY/du5(o/x#(:ZԹ<{+ũ .\n!}>`r4ܽty)֭x]r/qu1)3XouF5+`:+qZGkUxp 7ǃM"*{np"e<"l}b H&xBJݸτ_+9@"\,#Gk^W/˷ey/P}ӬL`[SV~jP4?HwQ+FۘBy9 '/mnbH +0~S3.%ǿU|&UfmEsX*˥PW.n1`%11ra~5G ߍpl}|âg,~`(>;yVhCޔ/o7Eގ\c1`\p, <~ؾ*VWфQk D<:O@/mG* JVsƒ >`KZx+i%mS76P9{GB}v1B-!˵kENqagAN'vIf8˾>flwwĩb#J x>mp*,ފ9iK|QK٘AB+i~KvPßSLl47BD#X?9A{G q R}'$rh ˍXw3Q T?!_q˘pVN}e1By|n ︠׀OY Jn2Kyq)3t/&׶YMd,bjk)/3-'}aͤJ2mF ([k"A0 2 W*i~-3+CW  ^{_8p=1^ϖn{R t-m|g4O1Z.Z/+|s[>K鸕&"7SV P!!_m_DUv"n}O5qPuY5{ݞJe3͎T^ jhS K%>14?L&f%sss^-_tw9_Dg~k4`;֣xLeg=p 6D $>,褿e <Tw}`ʯm3&߼*~~߷vs_,?/V{(.b4`ܠ z')ZV!;DML.aәɦ32Ͽ&DB{˙3SAA5d\ώOk Dyj1?H[D.,b+LQ9ҫp* nWGo/Uhۣ1U k!|8f#j42AlN/ɧ0cRnainXg%̤3wJ\*z!U{M5n.YۀYNM_TJ\T IelGO<x,7mWW7\`zY':Vore1P;3a(}>b헫x¾BWo`7wUtUk#Xn%"vtӾĦyJ#B@s+RL=k,g Twqisb浍il #b.7 > ElE8 ᔬ`(op[n(` FVJ|c?- ~{k8ͲvUr3A¼ ƽ-^:a$$YKEŜ*y3jm&\z5wZQRJ(thh8U2Pfu׷`"Vx,E|"5X/ej12- V1!M0?ЁW@fhlxo'Y`m~׷ ]56۴4sp[خ JAGNlNyh/o1m9gܤ 3ʓk^_hC1fJde.HVEmQVU}ܡ3:s+O!e֓"Ub_D\c֖[m )G ;#KhYȱPUM{y~G4sow(p,gή|? RS4#<)=_ܕ}_ilfS>¿ox`3/a4weUj8X"⌼X/|u~"ծzS}w(:1( )[{&~]44BGBX;.iPW)k"9J hrL$YV%q {3Pg?,;L/`n`иG,˳MO;+U2[*F|DB\\gdir~5T`JZM_W83ʗ]\o3Y}!ϒv^Xskո>ċ Vce7w-'>BT"bX`6WQBbe[ jd/{GiPj\A-n#zRSHX@w4 w1[韴k_C8Qimjņ7Y]^;Yz77Arw;N^qwNn)"ܡ.(n*x(*S9*bs8Uw%y+iixvo4̢ j7ĦzF\JF(ԫNe9ͩ-E{FI| `Ă$na. -W썛m 2 b 7bV5t:e+x|CCK2,P-A-1n#*ĭ=R1*ZZ$ *+t^"vHq!̶0IJ[D5=5%`^&5Nj0\ƌ_JS 9LK*"#PLiT3J{%KܢZUwwXZc AK*kɈ5sĶI{*Ds(ZDzY]e;E Ԯb5fLנGBp^" s x{#0( 6T9j_4 1Q+l&t` ,Ƹ[: ̺ń%K`ᖘ9Nz G0EpnS1-u w0imK:%N7;RW̠}֧7!pS?xzon|6_G '3F;~>zrhig9?z;g)GLy3lk=.s60ߧjekyll-3.1.6/site/img/logo-2x.png000066400000000000000000001326621271741406300165470ustar00rootroot00000000000000PNG  IHDR.yIDATx^il\u{f8}}E"P;Rdٖo&c ZCHPcPH86l4˻ZdkD-$e(q_dq-=⽇R$ʱ'm}{eY*-8B@!rB9 r@! BRcQFF&ͻ+k223 S_Q`gb:3Mtd, OI~@iiiw^]K{om?_Z~=լ?:5j[x4M2:rmݺN8I99ٔmߠM6ю;hݴo>ZlAFt:;:hjjeAȽ/0,з4?|rr*TէZfB>m\B}/%0:u]1(kQ6uѢEV}k?Y8oOӂeĄesRU]p2e M諫 ::\#m:uBgKYYXb31HTU".2"x8~ӊ4?6=3Z֯_ߔmzzwjj_[H )\333 @Q}3W0 9`E(w JJK6?jNOO?T^^q033~gdn0<@__#R a(ġp{>+4>>.؉ˤT)Y$g,^cU}C߇.^:}Ow~\:ipO;QUEU%($8uFji>K,R}>UXR(;;-||-3IUQSx 9ZQPW_H8|Tc̬vM@(LϧC ;!d۹f:uq[y,KuC;(7w1QII ]9eddg9,gYuu]_o pnoohll,CD׆h~m\UKHL8qMtNhbnqvt,9JII\S^VFKBTXXbM))TVV^u˒[G,},{ϚRR#;EJtaFDa!gwNΏ+R$ӢZatMMM) p#C6ӲX˅:~t+VTSʕRسI$JOK˾o>[757_Ks+999'&'3׻6B@.JtDH:cB.E+DdU.Y"[4)4y]ƸGϤ[ Oɢ~a^Q#0XɢǮ4 SVZjGOII (~(1MR(+*#nHWBNzL_G|r; s|-E_ Xup:w/[-;.[Ϝ9{58 !fS359.դׄ qw9I˄2TPPH'O46:J-߭{:_n4Pׅ OBztdL_t*_͂!XZUEIy_m)ڊBQoegPC}z >}Zߩ&9N}7J=r;M]$7q%nV_ugW7p]h#5?=#3EW|K+$?J%2R+**򲚚:};&p8, Z{]G cs=rL4JWW~%/opQJ`VWWm޼V g!MIpsĞKH[ʭH׮['כ755ŋCsv\q<P MOзm*aoL:LINn߾orou{(|>r _ ^ZZVV'40tۥWu>\Ȼ.KՀQՍ76|gd_.uuqDvX WTTL i),NI7Yr5 J1u]7vkxm cJJJ:˗/S?zooAe5ԔKV[!'q;k;s'|r\ϙw& {1M9n۶|H6s+I-3&KmcC+DA]ZrDWXP(Mˢpx]w"s#^CNEEd,,׷e˖?wȗAn6>ޒW)!sY.oX]c]:`H#"s-j,3dZ *)==JKKA3y0Ly_Ugہ{)i:9M r0o0_W\\Rcdz`((!mbŜdQKfd|'j[#~e13_FDr+ͪ \0m[xݝ(39HJ1\9<~j]zWu~g>';^''8tԮ]&Ν;71 ;G:o&)B˘:N+ ,"MU+BELxq';z&~ꩧ.;=iei\OH!8;"\[ _Mb#Y[C=nkwn| K?gӗ e=>|8s{KFB 9?/PqNpز}v,~(F@T> R RcƯ*RR-N~q.$Ɗ/KG'9tZ T5YeIV`c(Lf1:)q8k 7ݮqwv"s#G~>x 9}uvtAOA7~E%qdhr^?kȉGc>X*gϞ~gG}n7$98"BҨ^~RQz튵ssvN&z5k׮a1_uz97t,wqo|]>l7j;'x@&&&pGGpэ9rbn?GG G*GFIIIs=Ws{.\xuu]8V0-pۑ}v^jn#.3tw}oG؎] /3Ű\;%UYwLi;WTy5W+jɣq'?~>BDBlBoa]t dee{ソt=<ȿ۷v,PWZ[ZUU_PXX%\6S=#v=tЅ!ՃDĊ%}N,*%%'x$-;b>WZ|Zi'ɸ@ǖ_}ء_+W7F}'ɽ$7C:rWmn⬺=Inr3g\AD׼1Gڞ={Å5"/τQH.|9EEu?UFgWg؂-,:Y$kv!~]9 ͊g!w) x?]p`.3;'̴,78b +V+<>rIn5;6n $]#pk LLΞGwkۑ'ۿG n\궔ԜLT\HkMӰܼC5ISW=f,y13rHɓs>E9q#O>d-[>>.пUDJi.).)i%oHV[Ӵ(ez&Alk {phOVg;pŋaAF0ғ8B֬Ysϗ" (4M m߾=Eed>k֥)2,a۪v8T97#ڱ RHc:th|ll]- !`MMMs$X(^W&  V㷪0tq8i,$7˒ײ:ꛦĒ3Yb$/9kok"^@8x\4c͘ 7 o;<< ڿ׎_ `]v~衇~ǚZ.y7pq1rx_!q`s +fS++֯_fmzzzX;nY)%g\aZu^qQVcom4?a!9 뭷ر9 6ʹP477ܹ/fSU[ٝWۮ=6 !Yb0Fދq&n G>7D|*+Bnb+d9:];n 5ߐU+Vx1 5>>ᶶ~˲Zhb~uuh&݈⺨,*Kp .AA&BFwt;5u3 OtWw"wȑ#ǂi5dϗ3^xak-YbV  ˊ_^|۶mz!ܖexEiu!n-am#bg!iT:>HܥKI&۵mۧ Xk͌:XQ$ƨC$Cel8lY)Θ]nQQJ@YYN4hРD:xW޿˦¬e06 ȋei&/AV&Mƒ%KPyBFou:3_|0n/j(Wx? X-hy8KKx≫1䙥Ou}I8Ufb\8 RR+iHn>A`;ZJŝMKUΝazlU͓~d1Y\ 37N;m:^ƥ% 낷rU kO|s"̀Cd毿\-Ů%vR} ĵ괘8'טx>LKT2%zr`RRkl\VΜVW׮]t/'qO@//D0sλY5\ \:wq} 'r!{p3h9yVYix;o{߄+/x$vjȝ)ӦM+D2g9"l."=رku x_R|pSO=)['s~/QhN|lxJ6ݤWi {{rn;9դ%U *gؒc?ib:OVf1l6N ??ꫯʴԴ"@n馛5Yq,T֟p z>֛wMz K"JjC{uus{n9ȱ,ǰrr?ۓw:L(1{ꨙy8n4@H']fx&.p W=<]V@ߜcb#CS0A<}jNn7ªS|Tpa bM,Md8&M61I]KcR?忭| >Ljػ1Qp5T?hwL7Tq$#tr,RDp{u:uE_5H߿M8@OUt j6~6\7cqVݰ#0_`V biޤiRjmތVW4ݒCo4@vVǒUҭ!}Ygeq/㌪0t.JvⅆYev6S$>[oxfkYLũgp@MՙUtfZ̍Z4׍(_F+̤;O<\@Զj(V٫S5X.Z*LtVtz3{78.Zg\ILmx$v: ?L5xj׿^uT5'`No3| [&j A\X&-кV cu]pY7]ծuLl袋R z[Y&2Qčќ|k?,tq=/z'j̺~Ĭ>jJe?:uj& +XypiSUmoq˘.ȍzxup܄Ǘf126믿5r mr?2g͚u/ңķh ^ĕc>w{Zc;wװ'`BkF2^U:J{qyu]ހ-u"ĉ*Z6ֲ4ĎA{i\'9p]uEe;l6Zhl֮'L6pa0P(͜9s+2w@JN~ޗM~( HVI/cx"vJ4[_߀7Wف |˘q/=~:?( DUO16s[>1}b)(@7DDiǰkWk!hΝ5oޢ [P@SP-gh@.dh9;2FsA| +~ uuSG4&&W,*r|_ MMifzRW@{ GA?/ԂjE"Jr-3=m_Mʝ3EШo߾W7 +#~  ԣSdddݪTa֩ 5]l s˄0?4kqg+VXI?|:nYk?R>qU}zۚ{&❣^I'/O)ȓeFtz}m> ON0GH$|ꩧr6 SJ|Q^"ZС%/E9,\)1j=Pj=Tܜcb8J)k3_YFn V?:)?}۰'}{qǽ.5 ̬;vI~q&´GI.pҼO67nz bnձ7%c!%+y>jZA'D_92ZrSj~I :'dcgbِY*1f1x\d˭z3S5Zu`=/VֶU Ŀ?S&j tp%G&0wX-AaI ~3ftlղe4괝 Xˣ*MZ$.1΁ȋ [cR#T(ČN HIR~E yo>[D¶$ 0DU`@ wdD {` &^5 gыLs*waW%ӄGkz0N)d35l(c7n%i&Ϊ܅͊sc1I^m&Cw̒ 62EfZ=@v6lI:_9)-b'd~|zۖx6knF`QNNnn*]F~# ڭn5)oNUq2&+`(FJlŪBkyR 71"3 ]֍`d™d$J պ.l׿w!b deɈ@+>J;Ν :RfYDg~dR_{gbw+<ԟ0*&'0ؠnG45CZ pr66=5X(&O3`:7Ҹ+b̎u}n>܄뤪m/3gUhӦm=FOFD@GԵ ANn{X|obJ.uz V6nueX(e@La]f0R8MYAkk*+ƟT~u1c+1TXuP,o}273QP:c$ʥx.<3& }P ?EnwJ_l4Ga낶9Ŭ,4{ :QF{V]`ykKlhfh kwݰ*=o٢e.]НzD셵+^#!ܹ w`%ivynZ}͚5qFp| UhّLdc?>#_AH`ԙ֗Q7 x|quzx"SwdrK}NPCJW*誁RS*)'&M4AsVǨ^{*6}^> r\׮]3۴iӧa-,;DmkޒMV~3Yeqի?lŞ}Ʋ&Nlƒ }v%;-g0qf. .`^y]5*Ȑ7!UݩxD%]jRxY:jH'%>V>תO5X *l]NM=s/CT*g?nQ/wYwpJ~=O#PKGoVSgx4N>ڷootrUj]gٛ6|Vu=%pUR& bA[W_}u/&!,/ nP nzN"Te8SUg"e}RMUx-4盃Pj0dȐ=K"RIB:2}KT2mt9Q[O[bB*ZdSVa[0 cكUXʀV>?ݴzu9 qRs$S2i_&,TSM8qH͹U R A\z81l!h; @f1b壏> |{Xk Q#pʲn!> o@x7w4hЭ&+x7޻>p9!Qr)wU&( uuU :Eǎϩ877HMT '7<*i z5FoLJ ,˦_ڊ +J_@oz{ps~uX:MT| ? &> K2˃[ i7ɘy:bFj?N٬[nQG@l9U™q-%1(9u$6 Qx @sS h _&UVȔI4@ĉd^YĕW^R}{ w fJ9UQ#ۂc(WW&Σţ`HzE+qg̓ڸM_dnjP9Ꭹ Ċ}{}bV1ݮȭƍMդ̙;Δ╄; %ת t& ^Ui]KS Wn@,QM*vicEF-< E{nv1i|.~xTt@KE>" ̵~~ܸq+MDKgڑs)?2V3^='x|SORj5{Yg=_6"¾y]u#+R=\_pp[}-2X"Tc3_&Y񯿲HKjzU<ӄ"t| KVu6LkM5)X7 f}DćQ<5[IIDjYrdx AH? Q^`XM^Xw2AZvI W̳mOpYK gS$;:@0<8MEsk!l<= _~dl N͚ Ih(.i.tcK@LZl_~DW{M9V|ʇVuVPE =leo-"G$ 0WRx_U@޶mSN~T"`}@Se6ly2.tpߊp(!upqz5UyunbOoW˜78S`шZƢ\Olzt, x >i@fL=-hZN8RD _xAT؟yYYٻiO߸AU z\ܹ,'ml[6 <8KH]*+VV߭ڵVްZ{[7+8`_I\6N?̙bɺ| yى yyy[noٙ4@TSW?1@՞_Tm/뱷)qr[`fVqj@nc6R U-[h50wn;wD9y 4+0xE1ĕs)b",|3?HKUS?Hw X ;mj&}wvg<酩mD0kDY]*)u~O zk%HU>mڵݍ(eRڗM E=-Vt&+nBmZʲy$nJЁQ#9 4m*']_dMB9?.p@T4XWj9ig6As0Tҫqg̶7"x(3x֭[)jhaMbD8oc6: HW,|'ʐ!,gIC=X< 'M KV[^\WpL)LM46sAݯd,+tI @{DA<.M_ŠX#kJߺU'$LM$2ߩeWag&M!5ce>#g}a{=op*܉ux1J@5=ywQ23-a0@)\{1|٢\n}w6'`:–uF?`=B 0M"\la1mܞ|{hkxgI_k&On@*Oil<1Wxz5: ; t[Bwts,ȶV`6ΙcEي}̆t ZதmI4#@۶C[Pȧgqqr䶜p@GLO<̎L8_|9ȯָ3~qJd?3uVC*8cxg\x!7oO:uw@X1di_p>&SHmzSׯmĥ6YGpn'3A]T4lأ} M1m̩"6hT+Ȥ@;.Xd]n8|J+s} #]jvV3|ɒ%]:7jHhѢ' +3Y[n|E-TDm9Tqb,C̶vpNvExRKڼPH DeEt׻t--p  \$Rb]/q;QSwDӗ$hզlDVSsf)O}JQ>k3~8텗lիkd4L\ضʤ.-fwW_ZQN].YԪ2swo= YرW \3 )QMXGD{,VC*h"vvLbET^=ι? fp$=q.Xp( YRPR .R`^CGq$ʜ$;^,Tgg+Qz'.oc^qd6D^-h5{s=0LyY /]ON "S;@' 2fsu6mrڶԾ]\1f=Q/Ǐdwso>"tW֫L|.ɫH w#J:̙8qfP0d1ep׮]՞bȥk>3yz_OMFs3Kh2Y),JNq%;µK;L35N=; h2xE ߥu%%*RxK@e{ن V$7W1[bگ@c ?iV27^uK?mI'O6/7=3v f+QuG_M=z 07vCQ]nڍ"4h`7y>s2w4iң8],,جE3\-rRV8',1c耰E3_Fq:?T7lh*}WٕVLćRB$hddJҘx^0HlBT3(ءc: ή o[8|Rd4+㗎s[kbߵ0o&(9.[ 2|2ֺ .[@G@@є\BqoXyFw0hNm&˨e4s/N @xԆk#B[طouefS}Ϫ/B-&Ǽ=sڃ9jРAok"C c{cpSqw:zIIf#Tl&K[X@ {_KFX'b"s1 ӓ8=9Y8YԚϣ79^dEX nAZ.gT܄}5\}ves%$jyk=%Hrʓ9j /ybS̨^{G߃~;9W/w׫OUn|^M6mƝVKgϲ" Y6;D充Re@Jigs_KYx[ƗSm~Zly,]p`;~ 1`bekozT:+}z7xG0xBҢҦu;RúoaGewX Y9,y5>4+Nn(qR!Fkyxw¾o&& ^A5Fܤ,W_9rmr{qj[`§:<-Ό=rX|]_;.Hϗs6WX~cl{zWƐQՌdXpzͺxk8858/ 'z{~pZۖ6u ^"[q>KZBtz\5'Ǫצ٨Q5,]¦O<8|hh8&0rM HYkqYǢ>)n!_'=dAW\qEk8#5B:x(*ʑQ^d` jz' S`ՄJ7l)oRҔlނɮR"'veSuUP? ywB[>8\Zά:yۋM* ~vEe'xcI9/rM֡oT6aLfl#V*uqf!Qѱ"rg : l~=;|Ⱥ8N7IV3:*~)WO:z\7hЖ1aK76'l l믅^lZvիgQl&V]%;Vɑ!6} KᇙӿiӖ9+vYQH(F5r`LWDw? >Wd-Y:o̘1l31b>r= +ϳ61ݧc W 草YYY S"aha9pyⲈ4pވG=Y|*.Yk[S~;z𼊁iuxUY-h:Cywo/)@-^;>\(`WK.C"E1 U>l12nREHdY.>ؓ@ /0a#d@3cVz|&}L(ATw7(az^ 7?^'AѨ+鯻,XIw} xp܏* ]ȮI(\bhX^Ƌ9f0۶+V8,%y!";O\Tmz#(MMQDnr 1UZշ@^gqCېlbLL37d΀ [k[X[m f `%ٻ,BW*lyzC5ޢ)ԬEZ6lraͼ+> qcPG:/Lau<[LZ}~=x&#~.犵J84& i赖L6~ޖ$]aw c ZJJ,1? {JIoڴi)7*~q>T2tTTMk> FcZDj=h/`+m,Rn?baq9y&En o  )ܨXyu1|! 7C@D1`WX06$ {6Le:"y6-UN5D s-}3G&$hpAWYΦ4N$*s5๘y ȕx 7}Engo,‹Z~=vßY =r:@|6l$WsQ[=4iיT\a ~tbFH6&BOIUo\5`cNImxu7!ij!H mdú-gAe#`5kD,NiS+8tewB*,QZ:Q:2s qD}G[IlJ+0O%w)N”awUo)Vؘv@sXA7hrH"r[ܢ>QtehlGo/I3lvpxq9ce~IS؜b4) %@H3)Lz؇-7H5R5=jݑz鼯8/`3ӎ(?@4`,Ŗ hZJߐ)~͂&' 8bz~3@T1q>h UzM7/^a M .cZ7ia%@Ot~+s]9FpBvkAS彃iPzFz㪫Rfy՝6x~{ rO+_FZaㄸ9s5!j%BbKYR9+VZfUT1w.5Ԇj,+ׄa'I n 1|A90@9T +c5L CUەקF<[K&u9|~M0fNV5E%*e]6&1>ja>cO`AGVz݄W U $)}Yy+¦?:Y)>שAп,֕a1ZtO([bp)QZUذa:r^  NI8BY4ҶTcTFd0N6SuG8AfSs~7k(BOJ';-{cuL + X먗nT,\~1hsΫ/C)ֳH:&q )4ؔ@e6\^u<%o<[ Ʊyv{d*K`|1ɱ'QRݺv6|h˖DpMl+VZ PՒe UQ&p:w@&V A+&؏?*Z\6ui@~N{>J;[s" %:)Vȥ<[6κ#\;Em 3Jd,bxauy\hFhޢ}Iq $l,+WZq` l*8@ݪfͬ# A ͙cΜ)N: jze|0&s%3w;Եd@^Wg iE:f߱c(`IޱcAqj&۹cXn3e+~ᇵ t=PS.+~^ԗ1} ʦ*Dn{n :q@v19x|iF{mbi ^?o"}3W ^0q L4m"|ꩧ[0ki<#SH,j㙭khFw:[)Ɍix-M# 4 =7fL&/ا}N; gCam;nnqIigeZȝ:ehIIJ cBgca;'Ŗ/ʥc2ɦd &~-:Q{Rjts >'Fd:Ô̥Isc~\} @O jt=-SX.( 'o͍Q%IźmBJxL“. l98}#h 'Ch6;9j3R*u5$#o+ENO576!1N&lXƍ:FcQvLq'XVg˜S`J)31Qqy>Kxc'+Яc ї olL!F8 } sik(qL" jF1#14T-`Яz[ D e颬R/c&%C @! #%σ&'S!*fXSbѹc2PqYAu\  h ƢoX>O3jR'RX@;\'ՙV"DTU&7B9DuYa(S< xϦ 8 01l\lr&:1L?FArB="GT6sY e&_1AI֌kjz7mhc ;aRێzdT8١M}*Q=LIs+1%m 20xǎ|i&4RJ&/vd@V0 -c Qru}o.YoW,H6ՏR .)xv 2؃rds\e6 J7q+p *ltd}ol,x9PIc'JRw_@=*F  % ?'/lVdSXet6z[F0AМf^k4YMdG$ { LِllCA;cJr/2߻H*kև4v[~=`Ft6C.]\NV@rD+8`D&YLry(9 ]|@\g:&j#1ݼǀN̤eCؖ_୿'Ug2b5X;0m) 3r@(&.)n|v A?sqNZy*n3T߶c;dp8yMjxy\~if7?q$kqЈ#dL& ⤓NEd 2|g GkSDdT.+应J)`pUU6&]=Gt3><ԣ9@x0('fュ ?^qD8vwD\15d)6."m/@و:smbӱ.| <č˯ٶP G}e&12Y/<E\ L$B%lC {\@h@#9TiSS0pΰA&;}maKQ+9-nT]laU {l0f`Q? XM"$0-koUͬ$ƦD Y]f66oLK[k 6܂PB\6%g1(FGѬhko<Աe@ )*lܶh-K+"n2Ld ޾1 dfJ_Zͷ8*:XRhY(p'PK,x)# `LVY )6q{pR}T^f7L2X,V6 ~)8ebjџ R R8ҦG  .7oO;Q }d+UMWt/2Gڈn AְI_A@W}h)2q>j(͍6d瑁QY m yQJzUe Y-⽋) ITeK%|W=B#kG⡯lu$-bp &GH:FD1pXLE1L.zه^8f/i09ub٠JPnFe B7`SU ;C\s.FxN[[א !Z*X_/܆'d nc RۙCafWvw6ls= @tM(mHA7$=##=Է ì7]zY@ ֙|ƥܼfאr urd`[2~جiTT=6؊V6x~r\ߑxMML27^2 @׊Ԥw[J*6U+bj:[] 6o5=zX^3J]ohbBJlܕ#BɆŝRI"hP@ꋰǦOU ftO -&u"b[_ן!2NZSNmD 0-mk}x8w*Sao= aw"82x4yQȩy N+aF4ei {I^^ i.HD])M?@-tU*mfJ]"zũ?@ 0UgZ/>EBF}x)Q +Nh6Piz?\f^)ybd. ?+n^ ܇Z&!&gmxS };4@vlx1iuZ-0cZ8acٚ1-a9V8MS/\i ̽DbØ}@Ϟ!E  +@ Ks} A<f~:L97FOjr< %M$ U%`ďZ01<9?:V۟ Tcl4nlߓkDr MU4 7f&0P3wAgւcd # ޽{+sR&JQ#$S^ 2|M}*7@3Ɗ$T؊ 2 8U.\;ϯ'A˘~>V|p3GSwwבLӅO1S#=0 @lDXF[wTPa[a3HFox"&)02yLg Җ>sW61ҋ}3.RcL{+`zL^Y:d׶أj41 Dr[/`PGv?>); ?1؇kFB9Qn07<,kImo_X֨ c<[K,\6l.3)y z^pbHMoG{ֻt).s.l&I6a6 Tj✿,Z`Räm~7 ͝+̼-Oisr6?Bk+גJ} ˦,s67 UiJθQY#2("œ_HU/Q7{w5iyO_!(jeXQ#QY:ǘɾm^kmdp5@ίJpsjH)6 wrX1jDA\GcEe$lJzTOjƫ VBw#."pmS>@8K/@5@H^(!k#&K m$6)%(R՝3 ;mHvnaRd>ğ*/&L~=?(6^7yj`p( };e_lI66 kɇZa9hتլW/)E9 nas0Osr2w "8ql,Ye-hI*)>`5{H'&{7\cxE*p ^U4P*ixB3xeGOr?LŝO(z9k];қ Y*QftBxu#Cen-U nԥc{4 a+7|ל¹FPTVU2Oq/jHiC\@wr#KS`/"Fӯz8Cv:S>xVDm"%Ű /mF9x`!rr@e$|1ha:GlPAF8Ju> gH͚5Nnb"NKiN OMEh6S r*D΀?] iT2r3Ug(+0nUSbfMBPh%qs%f)N= )\R [4o{#`U J6۹ALzv{,妚x? ɁXL,UU7"l_k S%nl<_Դh}''w{`@n7C֋oOUx%w/}`RQ#YkQ}dy65)p Z3w|/JPw٭ڨ}fe3dH 9̆,{& |ʥM,-?Z6ݹV'lZ-dܓb>ǖfPUGy dcRчH5]jr WZFMX8'O{J DQط8Y9ᕱ?#SH-}><FI@C߰eR#lQ~bzڋk)?MSJا65v3B0`C ]}}٨%CK*ah-z2*z/V2hUlajYLl6okh޼CKʖӕ6w<"i|Z1} ΄ yaR&,{,GcyLniY͛;NnwdtOV|._oՕPvŇBR^qD^ MKVndRfgEllЀ:4p{@^{Sa_hzEp/<6ajqg\̌1,PQ[>{cYkDԖ HQ)V(9~I}[E0cE9^\g|'Z6^D&M~} _>3ajsV7r?L/;E;2 7{pYdZe5"Y#55ahzA"66N!xϏG|ac=T?L~ wBsb]iXW+\ܨy,Rs`Jl鐚Μ|e`2y'۵%=?X_f1 !O]LOLU:QdH:a1m/be>Yx3˫)6nbܡ[{6m$tjؖl|i3fXYpy̐0u[jrP6kBVplm)&VO?YQHNol lIk'0kx :>af`Oy<7`pװu{Oiظy]K)7,Pcښ6yHveBf9ð(-zv3]$0YT>^oz6iH%!+݄M0A1M ֒94kJ4 hc,c_j""{[ݧ)'JoljlP5Dl,!i @n>9 27^7zy dsJHXh' ԃ(7 xlQVgZ)~ ۷2մM'Ko۷w^nX{4sJ& $Zޫ P;C@{1:~0uL ʕV'5 @#ͣ⛂׭r6@^'sF1m "ԞNjR'^57G{#IV%_ǺJ6>ӣ^v= ͤ eF)!1X2*DR gOZ(0WRjd'*7ҟdd#TC\+jC@Og`~pNJSߌev[HVh%9p; %y?LQL+hLEye.0*1rZģ Oq^OJ\-@rsۤ(KbiL<_MQPY [aX{Vwky\ϊ(*hj ԣd XJ%`eElL~1BqYh߈#l9J&$8yoD -Ҥ.%p{2ۍ<)Hz>zw͔,Q,0]vO|7Mbg\Q@z#Zm۫9i{hI9UqӖ6zkBi)cI_xD=#R:1>TDqcx9~:ur>3a ~'0CQʘI/A?Qp0J7=UWڼnHiCFsޘ1c+.J׮d9$teV?j1Yl6p\IǮ}d=l, n{z#)w1+E x`\eUo u9뙄p[fTv<˯V(E^X0Laim۷ҥv h[jԣ ކK}<(Zis9j@Ju-|z: cr^Q$iⲸ9 *!&(Xx]鈆PFX8% +v iYf<`=Q_` ,QRUx"z/#i0X륤YeSga뙍bWZ IƴH"])LU6/O 47|Lpj&E-v z[²Bm<~, %Svg\-JJxd奄7<ZSP_dvCaN%C.|CfhXpd Y9 60/Q ]2[G6 Г=ZdHg9u4/4y C!uإ_< P/sg~56Wެ]qۮEEFͅnZ=y?qXSwKŅ4O(6xŠV6RjZ3^ c:`=d:XN o)64k[~U,KcTQ}o)+Fv8]*Z(}/Ppٹ9LYj S?M3Y=JBpbTgfH(,HLw>G,nv> 0Y6i1ǤlI$؜@Y@Jenpx3 DӐt ǓڪJк֖㛭(`+d`9 P78q045v*uq[_`0c>#˩Y 'vn:Ļ#xLG ܴMeS> LR41¨a?G6A8*GJl?0v7: R"0r, Ei),(^}`4N> &W.ẽX@,P?~]Yn7]m)my<&eظp&U=f,N3egoe HZIyj[^BvL H{Ic옣P=Dz )j%k0Xѓne |֏-wM`J} Sjʍ>9 k4e@I:sV`SAYb)ͺ#90u1`%ta>|~ 5L{taibi DL Ȭ9j+fU ^v>3tۖ;Kwu)S\ 8̠9ߡm`d ཛྷIu ~idJGy1*fD;'P/36T&{Ya2J#hN1NK%fZÄ2S田2x4t$0 Je0Ԇl;CZ4ۙZ6ЫdV `+nn.hzd䄌\[7pOb8}3'`9AX~f#ZD=R,n[(`OQmU IWs^826 ġb,g5RB%!)WsA|Ud7~vfm`mB%Uh*}vËdS`gچ mZE$#kwM-Ho|FG=!Hҩ3X~:ja736uz&*FlCˌKm@ |4 '\ª !Հb@oVL x Xdr4mngS_F)dJ! [(ikTV.[,q絲aXWHјA2 K0Y y]w!e;EYMPs~ɁsN"Fͭ:F^4!nj~fIΨӁS^!ЙM6=3OiGu|P-ڷ /^dh%]ty XNr\YXKTށ gV@69l>¡d'V.l|A@Ա =Vp<`+ }7o쥘|#JiA'sp`Ch+;,74̜`ڇ3"PWB{{xVpz:ޯ : 6FAqmb)oT{Bb@%0UQ`22ex! r<aEexqXC³ U^{\>?뭆 lmvilFҗ v/UXj"^vt}o9u!3;Kjsl!X lAgZy ;lMH1hX(F>lLr>NaJx'uܹ)Y '6,55kf6?'WP"laUx+jv} /:Z΂ݻ[C?2̥+ ˪S"7}Ҷw}`dSJ C=63&HW}å&$|ں4ءØ۴™X\NZRFb3V]5M ԕsj^YTՇa,yWO?>"mk ^Ɇ#65SKߠMCXǻ;OL: p5])+p-"}(3t׀q+˼ztU9yse `"b 8'H o toTץ}uH-Xߤ;Fu͐93bcc!@WE=>yN} C7OE˖toղe24ڼl=V.x?5wai ^@`pbX)C ֈpc 8+0SIyQ|[s63zRí{Yc)u8uL(NHnahnYiG혙;n0r3PiM04Ecf\;|V)\,9unFOgk[{ R QgUHBX( n4SeڦD{d%R%N;*a"KceQ.iDd!**샏=t}/ٗzh,MƓwT@fԣQRj,"\-FxvϢ8A?=E\}Τ߀i)bH+AqK$`3YUut^:!ˆ:'繜wL؝H^tб 7Ce#ԾWXqn,̓G'^ 85:cwPKX9* RZu%| [H 4zݛ J'MI ݆EƣWTܭx0԰ 6iMH3I9s%L_6'V+3}֦*ݫ86D5Tc:7d1#ծ>6UӁџ9٢O30υq>Q;N2+yEҡ; %b)6ۯuzF@_}Įt:lWSl%ahQ0M(Z/\MT]joqv/4zr9P(O&Yc K9,`C" 'ta< 0?g| L+q]qU)'gà.ZY͛Yݭ@0rǰ櫯. r>uqG͎9'9Kn^C\&,qD 30`wr;Y)`-+`ao|b6F`ݲJkmf:pxtB1c*j 8Q3Wiyj,!ʦMQuq]g>Tj=eSb茛X{}nC5.̜n#VfPb%RHm"П|R{k|ey 2ZaKiW%ʓZ&x ݪ Q_DyH+#~ZdDw&e[5tOtjߡnG?CYV hz%223z~ðqnQ4,Q2wn%$U,{HKy1ຊc 6ZE@q#P5ߢl&v)lG3ReJF>V@]XթJוADdXWPΪJ.^͍)=Ά.͋JUkk66.u̬G41b,$"f ܆(26xȐ#{Ki38wD|q"0q=[&C^Ӳ1᠄;-g ljV(WhtfT-Xa [QًU8R^;5ڪd nyn"2ESb=x`X+/]~)+d=3SsDͥ@T/^Kp Vi_Zr*၍!zOP$6&Ku-fˤ efM,(l }grl"+Y EA ֘ZVRVO/ r(hi }q)ү=P|SBT Ь K`.JvSMN60{.V4H+6V5tl~d:}[JC%M|U133x:zy8[s̱Em[Px.QJSTMn֖mWL9P%%KRkr߹`/'(SAT.###m^Tu=ݧfS@ /g=7I)Q-a&aڤlC!jX>5XS`& q̏Y92йKAl{ JNsWqQOL%g!,̳A`hqjDa7k /rɽ/NK1:C@ٚÄ#1}b/ xj.+AB!όUr?Qطw^laט,}ݽMJ|/Pܬ<:J29ݱ nyWEWb0 \rVdީU{GO>"S4C,׮"xsq9 Fd/%keBQ l%gN|beg ͌mB1;f$g]&mY@'O~";^GÆZwq0$}80Z'" %k¥-n;˦'Y{E*0+СcǪ܄C8sf)eֺi;t3rLٯ¦{̝2%qc+g1PԽ R>8H{Fr)b1y-nŨE2`: ;ͨ'|J2x+vE#,b[6;jz5 0rĢ$?ii+1IOiu=`4h}+t@<"9sfC@3r3kg4kI .F=驞԰qk5Lc*́R7I ͐Gw^-X͗^z \ftGĩ{iRXЎT+b#"ԙR/sYָӌ)]:sL= ; )g@ ׎(>#0 %J7]Eqsm(ԟ W/NE-=,v#?=iDŽH6Ð<ű}L:*u?J{fZtENVRXq}C2Ӟ%Bԯo#qrkLlab2b9[7vd@8fcǎ}]pw.D n~x?O#^TTQs?,5ŪͮruLgT_VR/I_yW?9U1jÆ X/^[x,&hqDm6Re5ojv0ܱ$ff믿>zT6>c0qY]JR7b m,cyٖ/> EDnj@Y߂ÇpsKϬg12?f2? UVM4 38iچ_|˘U`8|j7\u󫱺bil7kJp, ʞ5kֽݟt|,/ϗ]vٛ ĕ㯹`jvOM_uoQKj]SWNnQȇc)w !IolE0gA6lWp8IZ`hCn LЖVXbeIg[{X$"7oRkSPS6T>Ɍtz#qlz5eg.<淹Vo~>TD믿~.J&hĩIk^{ f^[%];k] ٢6sTe )`b] rDӦV`@+.l 32$#jEm~(R6X>@hX uaۗ_~qN%HY.A $*͍;uZQ85rO9ӳH_УGP[^ǒyzW>F6j`J?23oߡ,bgCu۴Qr026nʒ5P3=,{P⼖J].6cwyGWR ~h;Ub6aղRظcF+W&'nVe8 1E\|bS>j3;u괿~ow>_Oj\grC.ߨ_P#.6+d\z?px:+ի7|_}<⺏]'ԗhԤIGiT=qRj㱭[,[)qʂx'`N߸M [˛R\rc{z?lذa#GQ_l=3VoZ¬,T{r!AFJf/G~ E&Ϊ9~"< z衇0~\VH|(pۛ>1厶m۞P<of,ù#'z]ekZ],Y+zǩGׯo\ iRjwż=dŊ.Ai짟~EU;3('Q˟]t|WV *a-(7`hJ .LǤӟ W7?;ܶszT?u$cI+Fnv[`ҀcgG y:6Wڍ(eggN#bh c.&F.3g!̟qaV+hN;5|g8v)~#R)7VP5 -Z8F^`㞻,:1@He_G(nN(ǚ5UDn^iu]DnVm`WjwZ1 ˤ-&Bem!ӹX;g1jx^g z8 yرED S{?裏~.@wYL qʔ]i \R&ZB'p2:TIdiճ`Y5^H#j?[RzWA\vvŀ]ZU'l<8Rr)Ux'e^ 'Oׁ$h<<)SM79nUM=^7۷O+ۊb?aj #lSŸq5 ڪt[-w:w쁘ȈG9nrk֮rQ6G].C avv|: #\tV=Rgb> EoJ #~q=)Tt_'ks^D)Ƅ9E۹F^. .!55Eј=8:'x9@|+&uQ(8_ uY Hݴ:l\ `2̶@Zz'72`Vr/ :Ű ye+#jA x k[ƌUW]ݹ7 u3TƵ0rXCwu 6u"К+]v )LO8 t /VJ8׭+/..[zHZ*2rzǷƫ7Ҡ[Jo Y-if@ Lu-O>7Цl;ҏ6mzحSi-<o{خafSJ ~je%rM3 Sل#!ޓ'SϦ{w27Z;v[ ? UL ; @6h8cwBL]>qRNo(,wFͼZ*=O> ku~σOD-|<k iv- ؔn(,,X6"{V oĵV#6na(ʔ3Z:Nk!uuÒg&+/f&P /:dlkZpM?[7G{$,$"Z85EɆep^\)e^| 7'eنVxtzB#**\Sjk#ެYa5)DZs3,-7$TEm~01b֫Q-"'b|h@U 1S+ .aiؿtロ 'iuwrG\&q&+;u܂JhRXqcG+J'?0do(n²)͎ƭLgxIlJZ"7?b޴tA9(_\.6[.~_!^}jܡ~@00mxڰa grH)z`XkҸ F~$ZaFGU?'ų(C[Rf&?fXMp<?D?,M}0W7Gkb|6XvI~TGt.wHxV+Mֽޙ[>Z6)ēnJ 跗_~yP@[^R8SϸK.9#=q$Ϸ>؊Աf-a: 6+tɎ2Hk2^t뭷gC2/U@EcΣz6HftO`FuU:It4E:O0a{y5C8t_؊g'ݾJ [J[VqÎ#_/wQȄ8kVݻ!뀫z+C207z4LSjLAgNfȉ\IEq>:u"ZUQ:tsΜc1\Z[nìҼ܊%lF54'h VI d9m*s,?#O̕9ZͺLnJ{SG{__bZg3fˏ2`I`Ka, S?8#ۿaG0 e <3|VNpebnoƋZju( ($N-]X3@3KRܔe{0x-d#y!Ex4/锔>'V@XfL9 sXd=w g_rwfef!~jfij[/ ~*%{,3kk/+x5Vwo&`a䐬|4˹N_`-Du/3půXDL$ԣܗs[c."իאՈ ە .NA}lS+ [B].[g,Ê<7=uS::)  [VVÆ %wx z5i|]5Z wrlnf_M1'Y²nFQϥ= |`Y2QgϞ}/|! /XtˆsQYӧ[&ZӦYQ^lho38:P+|%ݿLq #$3L8fl{oj {1+kR->^r/w0u! wR\ آyww"#.lJP+֘Jƾ}]g4Cր{!<0U1z]vuZӆ 5))޲䚖=u O|Ej<G3c=in_VV%i`^Th}V?XvII"ȹ/ڵBfO?ò{lb嵸օxIf4Fu èV 46.FK݁>{I頮;EGd [}1)U˗/_^0iҤ0|K:6jQ0vgq{=ݛ .51߆m9nmR>]l\%܌|LjÛﲓO9|ZQvt-IX*7wY=N݆ef2 ww_˦dCјlVɮ֗i#nk} W`Xawd5j(}nZIZfv M,LI9Af\6APj[=&TGbW1_-g}:ujG \ìF\d깛˲ =B䒖\h ɫz.ļu ~SN)v|@#vsKي^srP'3dAvDkAJAa[v۷sR]Qm+2s +XKHެ.]tseGMK@\-Z1!xCLx-d'Sl^kLM{qW 8,daД}KGii ڲ ="Us8uZV:aÝyaa⑲B< @D!k"\Ǔ:>{ =!s%os7沢`Lh Ï=x@-sL T׳~|ԡvqwp>}”ɋrtP¤#ġNj=@; ZI}= $N  Ar}Dy?gMbϺ} WaXFA78}o?j:N\ޘLV1tGCk8tȐ!4o0RX9B8H."Y0zzPwW@F: G}XoB|) 5k2k l7b>p\ eKZbc h21z֭{i Ҳ7NZAg1(K+oǢzkˌ36[i_5(*6ZkaF "|*5@ྪኯôRE~y"OFoan۽sܪj[4rbEFQ|"tyyeٳvݽӪjەV\*eOӟ'O~O'D_"y:n]=C]_=rU""ȽH#};Hg'ϑq:?qWy:!K%^Y_󔳵?MޑEP"9(r@9E(rP"9X";IENDB`jekyll-3.1.6/site/img/logo-rss.png000066400000000000000000000136061271741406300170210ustar00rootroot00000000000000PNG  IHDRIw_MIDATx @ z K>5"rzm] xTV↭T("Ҩmf2k&d&BS-U(˥ ZB(Ȟ% l@`"!ɟ:)D<7yssOHݱs}ѱuI)i߯ol_rdصk-[Qt\<-]2yzyQeyKgd֝pa=;!CFOsxzo*?~<=4zhrttx$Qa 2rrr:вg~:Ds=GF#F'M{ CFbQSaQ1q,7sєTV"SR:QUEkky#o۴icBFaϞ=wG5U[|.X`t> <))V2.++T_@BF!8,LH>f?/88t}PPsC+)iaqqkbpIMKg2u >uK.Rȸ9DFF7l#ww6gGKH!se`p<5#]`P7JٳgO \_@j>Z L^n~0)=Of&x>N' jn>G|ݻwO2nk֬c1>|3y)ަSjzUi&2_1y Fjsz"K/t{lZNo(Xp(:sx^H@5 ,9}+z+r/"L&wX"'3)#S'J`>Y,k% E~tZiK׺ym!Hb6S<#h.n:CeQŘ1t'QZ^0bYtF 3ghd'%+@ F)p'${uhT6ra-m۷< (O=b9z' D3Rjcjr?>`NxժD`ҥ0=Np|=>V# WaeD5x > ݘ'LS BCa8ugVuJHrdh1EOy F) M8~ 1luvv~e UkMvs,}n}c] 5'~H@ &"1~ʔ)?68]<=:O/@# XH @0 9qj:d/~n64@MFJ?g_H/~84e_E{huELz@R9B䶥MJ%m4v,qdX6VkKMJ h@OT]_̚I ..fzMNc`wB*EёZ ӑ3 ${ s* Vzna&+RΝρsp(Τy[U* GR_sɇZy `eO?MS"2gie2́9&p"o{w(;<.n)|ށX7= pG >F?$mhmg{ oop6&PgX_]qP(\j[ ףP3y8}aPtCTTY۾X''2I88%2aJޣWݹ)1GznBt#?΋ "ޭ3^(G9E/^t71?b3am8vD;(Jec9$c+ 075q i׍Ϙ R[ۙlg<[ZF,8{{~ul# + Tw>q<{s9]榱A@qfS3ﵻyطAR/ݐ>wz>Wfؖ x;ֲAO0qJF=jcY$ཌ-W,үEHH8ww:0q"mYHp4*{t:b`xpv\px` Pp73aLe3fi@hgr:ѣFM,5~GNC|nREUA?͇Zn p y:C_#?T@<K?ntvs"NNjM_ /@DH,#.f 4E1HQ(T$~c%qwnȥs.'p*gAl7x^@:O!3;e"a誴b*ֈCE4z ]&>ѡP_lw Ij{n0&(#^OϰF=CT1)}<1Nox a,n N V  U 9342QNM^m36c,8wrF>A:fdySXooˋBzQ<0Ʒm*+GbG {! B}zmaM`XkoqNʹH/ǏDDÈBGls["BĚ&2pe rZk'H쬜[oC?% U7RD7v -qέ@|Zá|(~]k 7&569^^E5g!o>=`CVɻ48?;ֱ0x}SD!|1@ Gep@r2>|Vl=Rjgnz6lIlضk ֡n~_.5(x 8ZxG/k5ȃP,$:0qh^jaqsYhwS,JxY" ?i֭{h I W%exf䦁qvv%7 5t'ORH}M&u azcD e˖?"h5%YNς-]=ڨT^ݸ$΂{ yYcO8clE?4[o2gs?-ߑST|3~R=<(nkAڊis@N]F8I]P8LLy`z^pVlށ2= E7)OBc tpI;c$6q5`-ox LZI[Ji&Djk6\7?\CoE\|3s׸O uH?%Qy^o8&~N:)Q\.ΝMWKm\DK\‘UOҪs&݁j)UQ~mqݤ1=򄋋fرcwf}TNbb8#x]ΖAccȴBq3gNSx}EKzl`A*u gW_E?g;;+D42G0}$RDB5ݏfkheEEg6S vv N'M"FeU՟@"Y:::Ջ>ݳ $c߁(vhDD&>۶[u)òph~HcÇS%yZpʷ۷o#C,9pU!~$ |#D3GN*RJE|Q# Njҙ3Tr/a /a'< O*F7k'B. ϊ[Č̨Ti ~==kJaaoJͫW8tpN[4k?as.4WH[F]HZ, kͽ&_o~ һ. ~9f̘[5^7v($Dx(n!{ E?&`׌pџ3GnPF:r{*4;HYN<*#=~DH.өu: hRbE }Tr΂P[d[x"-\xCEɓ|id_gD[8yCL{-(m9:NgE?H?7+FX3y]\D?qҲ]jR.`:6j V#Ǩ쨜fPvڸKvpv8x)qnwoi6~mog7XmUvmo1?, 3:%n%$Rx V y!@}9n.[CT\xq*pIo$$~ nwr=*q4-p~p9J?9I?lZoD5Q}*}9ɇpi{SOvQ`(P.k"f͐8m.lo+}V+Fo;_ Sᫍ \2;ie>hak|ZiQ94خb:WNMT/.ڃWctZqxhIA @<'I2( JI2(%@$\ JR JR JR J JI2( JI2( JI2( JI2(0(%ɠ0(%ɠ0(%ɠ0(%ɠ J!I?3(<&$I%A)I%AI2(<nQ- JI2(%mI7ɠ`cHIP!Ir9Wr$rWٺt mIfB W=?IX?:$Io'%P?چ$闃/ 9`9 FO.Js#IG $i֨JpY\;$م$i֠Jpgr$ `TJF$ `TJWʡ$5.$I[QJIZKҒ19!CH~KIه$5}H{'h0MHҗɾ0$}јܸ`1t$ɉnH2&O%X)%?$$;$O)ɘ<宥 I1-p IrE>}K8-I>uԷ$p$cPsI1ٵ\`: ʡ$=#IIZA#ɘKk$ג|t!Io2&%_RJ$~$NR: IK)ɯא$NhU\B^8&7%WMHҋPru8$`Lve*rBHp8GA9\-!IШ IKTr8$ycH_ے;)%n|s7N{K% K%e !I.35$4چ$5ʡ$K>HA9A B$a IIC<@SH҂1ٕr IZ0(% $i<KZ:(%`IX?p IzpP&<`$/ܕ9- o<(ɓЇ$Do} W[Z -v@Ҩjb l6.imUc6@6!4:Fc0ud!D8Z\cb-_!sٹ̝{sV;ٙg>Kx}&[|Ug΁PVH qx7uknt#:#ktwѱۖ.)QT`oY_Ϲc A02DHVNWxƇ唣+ŌpGXH )% ;y/z_V|gM'䘏G'W43-#F 5&aF e6CdwB/Y\,T ҁDf0ALzwgA0]}k' 5Q ڹcݖZ6ҳ~;6w,.}f>gF@a3߳zo<75ȥ FS%5Fa\STTyOFpCẂ]cȨ.oJ@P"$Acm훖ӭ}Lo(tLl*|/..&RHNS3~FZajFM2=)-Rw#0L(Nr Ai4WVhTP0ĥ=6EPkJfNo+m+G LKE35ϒ+*!I: TԲԠtj+taQOHN}8{XR²@2W"(AMq#$1̇pW34%Ky0w.=l7% ( JJolaJQG1dDm #Z A J/bR9U #Zsy!(AY?ōaXNpfU"(AYdUg(:o% (JQ/aJ%2`$bJ%brP0:5<|SDLbX-'*_}Aߴ 1aoTA@P]L*(DUܛkDBͽ}D哫W"(tt_{(xTz/]L{q\z}60{B"gTI4VLJT̨DP&HL*#-_9r"Xngvd}Lj*APv@P޶tuŤן̦y" q86pzJ% (T˭㖃џW&" L󧏺YUSm) r#ĩ=[F , սz&gK?>Ʈg2J Jw9vnrQh4`إ seIJ}#(5Lu.05̔|&A~ @Cк5dO2;6׮;@Pm8Y&Qi7T⤞R]J J=6 &㥦L:Ufr]"( &eyrWyoKN (j oQ1)hΤw @ԃЗ51TOe35EfQPj`ptF`lLvw}[у @C2M껺 ݚgkk)hgVg~~qocLߟןI#}ΘΛcܔ~x_ܹ+V]DP@TŤvv'w?UZ9kHwLbe*yq4:C/OUVUK9@aUkzS8{aRڞRAaP ɞRLR6UzN&Dwv1AUN߾MN9S:2k(%%mD<$Ha97Q*FPrf[;Y褄";ryB?QIjpmT2KM"(A3Nk'%Ld8QII+&=J'VyH2 ʱ*%?mtR!0bҁӴp1RTjk+w<*% @V筝ܭX9Q:r,1\J.NaFj5Τ.6퍠: fU"zϾlԍf,u#wGh-tSfL3ʈR|PY.U^ `TtFys:jָ { p4DmgRczEhK/bme2I kiƉzY4Է!*'HwK4(dGL^p).Zň`%(3vxK-.r襃zIwKZ?IJF֥V"5 Lm&uU&yfj:H1bCe%kPgA]j x@5.ݲMT/A Fxn*IqT(`Kv|l͡~F#_hswE6@j̝f Q"5kXiSHc{ ]GP@x޶FGG nu|g9H{G91oKW.*{CVĕZ;i#h̉ΤR\aP1GYk9@#}R{]Nԋ3&@s H5`ȾʚD$(j6 9vxˁP86ZUNo:Un1`qtPGPHvzVɝAC%.$:Ԥ2@sJ*TvQ^lU l*(߻-,A)l9RL#nAȠ "\n 0}3H\Xs7 9>옖 AiEjigy-=APKQَQP=vAik"("8p뒳 @c#A)%Ie;ƜOFP`CP:0%ojg"8DGĂ+~H>-[!(X+3<ʃO?x%ɩ TevI@M9^eٔPϟ֏nS` {ԟnd7Ջw,\T#W]=pslJB{== JrdQDPՠXu{Gn~Mh#NOp&ls٠i:2H̽}[̽ײ!j/(EP* yK\ uǷoKhm_{(`tPޗ/],=th<lE T U֡9zIho#AKF l)nt]Ȗ?\l1RQ@̠8Xd3 mDU<@$cШ=ZMIF,&æEhu&{(ovC7,&?L>s^>P: |= Չ \C1:H"AXɡ5?`5% 3})VNQctY[>h+PD mkzAY }(TI ;KS2G?vl("視mj1u*q?3)4ч-F7hD~&0xiYA6N:KLpɚ 4g- h j-qTiDgv损6E6<7lTءңWalQJN22Z 8s~K04uqALI͜fWb+-s OxM̤ h̉1mSW1.(ZJ5ŜԉD~Q׶bSpe6x"-s H{;p>P|jsk^jEt&p9a"!3]!2F L+;78O}lt8Z2L:&ݍ̡̰%g"^ C09^h+\xM Y8}rK'h)$T8A7(3)lj98/22vx_,#G)xT*t_κJ/L2.QA=iٷv{YZ;Q2<=[9֮9_=u'ڈJ^K5~6sL!8(cäs34aՃ!s)=:p5UV0K+D*9E^pHwO(C8WD8': h6X/t0ՐaxXCEp$ %f(J{ *qtw3|͙+KŢVCٰ(%\)*wt+uEiDLIFMaj7" 2bIHƁKݤu}/D%grÚvv;3Ĺ ~tREsaAD fwwhlZtrNщ:}048%kοwDŋ3A}vjgRQV*ji`@3ItMrǙDNFcf8?{u}T*ijR?RorSmEN{**ZA;\;شV vNfAOvOA~d !!7@HlB ^'~n;&,1M93RIN'EoAUN1f1S{+mťeEŞBٝ'Y;sdێ,.}E#yw޵%s9:zMh*y7IǘˢtfdL`}z>:gUuRJHQq|ٹkl)[[\G?-X(BYÚɪ~B D!٭Ū dV|&9H7f]TKk[JM^ϾHu^y3Ϭ_7MYt ނ|S74}.!AH߮$n$s-&:}6qӓuwʁfǵke˖)Տ<"wdV*`.ڊ6>( !Vngo̔H2@&O9rС>owtttʟ_]c2Ѹ뮻mّS\X{wn^Jy}BHW泙A5/H'NGpo|HFgj279T8g)BJL*!B/V4E`J$”NknP S'OdpttvOӘ< q%Ens $l8'P=6Kͻ !\u 3歶[)ՙQ穑 IOO\sՏ;ޕ*)S.R)(t\* {!p=)(*dom2褔ҠNJK|N )Y1Hs>JBYn+N'Ӎ(JDO?ѳ22rZĉ?0 pNwwtvvIk[RI)KmSj9I)ڻ]uj 2Àh* vI{QVn&<7EQ0)R?3L)iL)Α@81=rDz.W;$IٰQpsDVVרMI1L/ L)+ZkhT#gkx6m8N(j:COQߐ?)e9'tRwy&0j s&L/T?gR%$aOč7m3=7DQ'AᜡaOtRJ_1Hw!9ގ)e𯽃9ToL/fS}.84n*o!d=IJI&)J(asN>~\ps9rTps4)9%xfsy]QC8'%L%{* cXc5~:5]$EQ4)sF[s:=TJsj`"jY]cꤜSb%6!>x- &a % _^/׈>%f( ko'pރ9X{wÄsjNJL!ǃ9Uppۈ9U~~ߊon:> 03f0 }`{~I-h(T8X8LJpkos8QM!Ip^{sRgT\%ɋ3:(A/?4EQIӃpN鵷9jBRtUON V=u|([g‰d&IVL&(S sdT^sItH MNJeQ{hNh'%>v V[JC$A >7Zcg0:D CgRK(JspN1e(E[Tڀϊ+pN+L.GzLmL6#M%5!'19hIH={֥9NNpNgp9Xo9卵]S 9wp8'5LeLVg-!ꈈX7JRlᜠNpA8KYI5Ċ[O)gkpYKssHN#,d(N)3ΑSRszA'?!-X{7;)iDFeNJw{X N. /O(O#5앤(* %9N@8_sk :)u8RE،ĕ:_R5 =&rvp͉n(FϞupNrpw<&_{pۦp;NCrW^POWlQ?Y=EqJ:);)sv@6w䭷r9NJRQgNJTKLT &WdC5nāF(*mӦM_i~ K.|,*_|l6W_UATW/X -K@W!I;"ˌ@&HREـxLou zzsHJ)c>T/Wc|ph22!(J&r+X{t9ZZ2p'^'sHySn}CM✫ah&}@7ߌ eh' s2t[E ca2yV{^i#z]=\(JT,ZHM!K΁ ]{{9%w!CAAS`6/?I{4]4ŹEQs\ SHΩlInLQZ`p,ł%ƎAOM44R)(xO(InQ%1e:kb!>4(*|[]wݭL#fRskpNAy!.`|6(odI(1W? IaP2H(\@r}wNJA0$lH(E`7( d[eD T2 8!$f< sEQH< *@)(`'BJ[ʟ}VM)kwR:qB8Oo:(J2| :P7~T?)}5] z|B[8 dA (%v_sPSY]'8c7xLN0I27EQT*rtVpsv`ۅ9.Bt @B|  PE%A}з-l_Bz^~PP A5]F A(qp'e1NI,lS (*W,X@\ri/,GZ@#a9٠1#C^zIA/W_}ɃeLf:pw儸8-SEFhr%ȕ9 3gԩSr瓾 aHhMԂ*PAEPt,_޹Lmߡ=xDڵь/pLl7u(R1t\"]z6뮓~!XFA;8zP&\ /-MO)@ƍrŝwM6\[1(kXf{=>%'JK( 0᜽N 9>g^x1#ͮL߂_b.E_3Dzñ=i=eEQEQ4E_c޿r{D|>?A ٪;)u8G*U8'/P\{mkfI#^xu"Ѱ7Eڬ&)^\V ۈɄ|`(%'Httt`pа d&uxUޅ!MG(5F2f7'bu`ff"EQ^a*a ϪpX8[k. 9:xI v`yw&pISI]|EU !.`NbSEQ30H+po!=:F87YI9SC酡 sAY`+(ڻ7t8g*p s'"((mu1法YYp:)ޝTi*/L'd_qpZIaLȠ/~ѓ|,/)qQEQXCJM_F !GV֝*xq| [B92?_s:4 1@7yM>VDQEC+qzRuRpκu* :AA])~9ι{"J>,n&&X :y3epCT*G:V"/)l,REua7zU`^}MNcJ:)"vRւpNlCIh'eS~yM5j2iM \!+-Y#5j.(j. S`CY 9ow s|Cҿb) :PIՋZ]J&.Gyas^HQ5G7Peٳsdh,x@ S.Zaw/ᜭ ]F۰/P4,!j&$&t4e$馞j_tn (昶"Ս`J]gϞ9'}>[i TFMcG;:)U&C Դ2j3YԓG 3uH2 .@_uEQsIHXg1r@ŮsΥ7X'5j AԃjP eá*=]2nܨ;)75 j;<'d2g,WFR(Rb1>hӘRNʆ9;1p?I u7B:֜;V=,707؄/0cIzQEQ-VCɢor\@87$+V9`?A Io&.Gy22aL(gP`,?]zZ%sPEP1I!A8G9Q:)Ås6)w/st'eDBWiTE'YC&2D8GYɠ(h(c\{ᜓ>-\h 4P @p< ly,h 5rc}oC3&%ID&:g .pE%(ʔ :)S9#24IfZ{wv0Srnם,yiizJJ7nԝJy M$!I(b($SJ'RS8gr] JAQH' T9YX'SEwvۧqMà(>UaWeH8Ǧ9F;)NQ:)ÅsoΩVʚXPb7&*J7B (]ϹzqZLYΩtRS8ǽ~@Hn\V,=V3 ifPEQ-TPB 7IX{g #cn󯽻@+hI9ې(^{\9oEHz)'0=MCi(*pNhr,j 9Š,ti]:sכT4+B^f|EQEM5A'eV NDIY_{µku'$p=(ItRpź2R8 .l%˗)e.WmwLyR2+A 4bEQEN@8g: hIiuRwRpCTL_|Yut)DQEqJ{}ŪVMݮJK|] |i|ޫfh{uy #EQpMsNN5kq/Y"+}ea{ɮ4ڠq$1$>y m.]F|*E_neC0&&(gN'NJ Ԁ P nPq-Ұci<$ Քrݓf!4i x%aON-E5BZPˤPEQ\{s9'}28x\ dZS'%-rY7ݹy b m"#) 6DV3Iy_V4rEQ5QPT'%9O9RS#]<"-_\|Tv|PZ`K45Tz=pRjtU L- S > p%(Ӂemn(i(-Zi3((j9ʔӧ=X{<)wLz{HO!J[{2FwGgXKkJv>f{ec}o $^z@&Hq4)@NѼᯖ 4|z % (&#Lۍp ?.ȑraz +0]prvL-s2LjA&pt`#͏8oZC&]&0 ŵp N3MQE%pkooý#dwO8$ai$\xU0FV1K$av™ 6ja(}+^_NCIQE%s9u76{wpq hDzֱK`9#@ .C Kp ^m=<}(RK⧙73?<,o <(v>]ųJv&x/*( _#{sSP6k+wd7_J1 ٞ͠,J~0wz'^n{%WY>+ tɲ|#k?Z[A9gmΙ:=\cV9d0}dfkd浶\=q(p0 @~˳/dr}P w]Pڝ''e2xA_Pؐ%(`, p#re=AYf/;JA#6OOe]AC{yP Q[P ʌ= 7 JX|4OP;Gu㎠tM LZv2{#(QPn\.ˬe92Gv7s)(g{ JA91YCk40$$ &Zް0j=|'{=7z|z2}7?:߳)\^2|Pcw],Ӓ:R1ַ,&Ϩ5ZL Cx 7m %2:$o(057qwu^uZGOJ%|%-I]iIʥeOE5}kh2}yϴ Ԓ2 iܽiJE2?׷UԗR[je#qlK]oS̈́րh(xkU3) jVq_* eDC~~i{FZM]q:U=U{oj*P_jg0=hdcRfFf•T'pMm)^k~y2fWz4D-&Wٍ:Cgf2 1X5'^uoWطtQSi GIl]`${Rd: LZWwRJzm_ǁŧV_;Ipz&mpxf2&a*7nh](cIIJ: \*,7u#M8@s30\MR׋\]gKRtoWS4t Gek*M7o.G+1[yck,|6`&-*iMm 8Қ)6$]ը]5ZuLe:4H3m߶-љ0i~X?;3FcNHnڿb p/ip3_ JFrNZ/FrE͘HqGhȉP?鷎r*Ж׾67%nCT ^a$Vrz2s';Rd{j{he=R+,HLvT@ h PVpiUip [p}E=i.H:ϨYH\5}dBEzufg`XVF,M@ e.}JLZ/,(NsjBHJpBܬ[7$X:~*\+K2<{*FUf)4AzqfVȒ)栩2$?6VTTRCCd\3|(Z>$zŮ0eflRd.0GH7s7!.}Oi2|rExUC(<ۣw켤8ߔ7T5 ;}/*>#}lפ 6xMwy{?+? #[;A[z2sћYdjk3]ioc'/zY;KG->}w39uڞ  ~oW)x_ hԩts`&σwB^8EzޞKh( rLiHU< N}ٟ?{ſk"Fy8{(ԋ1{a-fվN&hejgC"Q>5NPR0_{8#tŠ ]#T$;8yPGCRl] eXnތ JhġҡB}"S1FR*ZGfcEܾ`(d,RSq.ԓ>&??Hw#d|mZ.7??ZʶTɺvl([n.J74kLjR=`$~^GC)UtL1Bs3 D1,|;/)ЋˡP{/N=ui(LTRS9C#,(: 3ޣ;f,`$W2ܟq'K;Ya&SSٌ^:5 WCVi蜵[__o)ܿQ %OĮnFр3TZG)m&e0<2+H[qt2OmҔ뾮z̰ll|8('aRdmS#Dt2\58vsڊYrQI13J Jj+'6ư(eDmt։(g-l"Vs$LQcgS+ Hi JE1N 2E X0K2̤Ijk,$4IT85"uc!n&=%}E9eWH? LU#;utW|2hࣥÑFD5vuSmvxv?Z.UG-s7Z=:V4zR+-PI+ZۈTP&QÊH)>/_njPֲԑ3p B%=xjwuk ՆCTȚ\b(exLWqĔ0iƗnz  %E6 5>%R&vQJT'CACO*{5Gԑ^b(=vB*:n lK] f0'P;iF'|gukV6A悴L \tC)S;+Cs]K 56YlIݑ 9gJ>Q̶ԕri0c bn ey\R>Hr 5ڜzA9yl JA Iig>"Eyn(cGj1@FsnRd޺64kd(7gZ|f(;ۺ]5o(-سT5cz͎jŞKCRэW8R4iuOE}cb%?/+-IyP~.!纮krorYʥԕ:-6m{ZN(Bё}%m*[R_e(ucijC9%K{IË4={~/+_EJ]]u@O J:'΢`Z`F:[:#s>Kf14;IENDB`jekyll-3.1.6/site/index.html000066400000000000000000000066051271741406300157700ustar00rootroot00000000000000--- layout: default title: Jekyll • Simple, blog-aware, static sites overview: true ---

    Transform your plain text into static websites and blogs.

    Get up and running in seconds.

    Quick-start Instructions

    ~ $ gem install jekyll

    ~ $ jekyll new my-awesome-site

    ~ $ cd my-awesome-site

    ~/my-awesome-site $ jekyll serve

    # => Now browse to http://localhost:4000

    Free Jekyll hosting on GitHub Pages

    Free hosting with GitHub Pages

    Sick of dealing with hosting companies? GitHub Pages are powered by Jekyll, so you can easily deploy your site using GitHub for free—custom domain name and all.

    Learn more about GitHub Pages →
    jekyll-3.1.6/site/js/000077500000000000000000000000001271741406300144005ustar00rootroot00000000000000jekyll-3.1.6/site/latest_version.txt000066400000000000000000000000061271741406300175620ustar00rootroot000000000000003.1.6 jekyll-3.1.6/site/news/000077500000000000000000000000001271741406300147405ustar00rootroot00000000000000jekyll-3.1.6/site/news/index.html000066400000000000000000000002111271741406300167270ustar00rootroot00000000000000--- layout: news title: News permalink: /news/ author: all --- {% for post in site.posts %} {% include news_item.html %} {% endfor %} jekyll-3.1.6/site/news/releases/000077500000000000000000000000001271741406300165435ustar00rootroot00000000000000jekyll-3.1.6/site/news/releases/index.html000066400000000000000000000002431271741406300205370ustar00rootroot00000000000000--- layout: news title: Releases permalink: /news/releases/ author: all --- {% for post in site.categories.release %} {% include news_item.html %} {% endfor %} jekyll-3.1.6/site/redirects/000077500000000000000000000000001271741406300157505ustar00rootroot00000000000000jekyll-3.1.6/site/redirects/github.html000066400000000000000000000001161271741406300201160ustar00rootroot00000000000000--- permalink: /github.html redirect_to: https://github.com/jekyll/jekyll --- jekyll-3.1.6/site/redirects/issues.html000066400000000000000000000001251271741406300201470ustar00rootroot00000000000000--- permalink: /issues.html redirect_to: https://github.com/jekyll/jekyll/issues --- jekyll-3.1.6/test/000077500000000000000000000000001271741406300137775ustar00rootroot00000000000000jekyll-3.1.6/test/fixtures/000077500000000000000000000000001271741406300156505ustar00rootroot00000000000000jekyll-3.1.6/test/fixtures/broken_front_matter1.erb000066400000000000000000000001131271741406300224620ustar00rootroot00000000000000# Some stuff on the first line --- test: good --- Real content starts here jekyll-3.1.6/test/fixtures/broken_front_matter2.erb000066400000000000000000000000551271741406300224700ustar00rootroot00000000000000--- bad yaml: [ --- Real content starts here jekyll-3.1.6/test/fixtures/broken_front_matter3.erb000066400000000000000000000000731271741406300224710ustar00rootroot00000000000000--- test: good --- Real content starts here jekyll-3.1.6/test/fixtures/empty_permalink.erb000066400000000000000000000000461271741406300215420ustar00rootroot00000000000000--- permalink: '' --- Empty Permalink jekyll-3.1.6/test/fixtures/exploit_front_matter.erb000066400000000000000000000001021271741406300226030ustar00rootroot00000000000000--- test: !ruby/hash:DoesNotExist {} --- Real content starts here jekyll-3.1.6/test/fixtures/front_matter.erb000066400000000000000000000000541271741406300210450ustar00rootroot00000000000000--- test: good --- Real content starts here jekyll-3.1.6/test/helper.rb000066400000000000000000000064631271741406300156140ustar00rootroot00000000000000def jruby? defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby' end if ENV["CI"] require "codeclimate-test-reporter" CodeClimate::TestReporter.start else require File.expand_path("../simplecov_custom_profile", __FILE__) SimpleCov.start "gem" do add_filter "/vendor/gem" add_filter "/vendor/bundle" add_filter ".bundle" end end require "nokogiri" require 'rubygems' require 'ostruct' require 'minitest/autorun' require 'minitest/reporters' require 'minitest/profile' require 'rspec/mocks' require_relative "../lib/jekyll.rb" Jekyll.logger = Logger.new(StringIO.new) unless jruby? require 'rdiscount' require 'redcarpet' end require 'kramdown' require 'shoulda' include Jekyll # Report with color. Minitest::Reporters.use! [ Minitest::Reporters::DefaultReporter.new( :color => true ) ] module Minitest::Assertions def assert_exist(filename, msg = nil) msg = message(msg) { "Expected '#{filename}' to exist" } assert File.exist?(filename), msg end def refute_exist(filename, msg = nil) msg = message(msg) { "Expected '#{filename}' not to exist" } refute File.exist?(filename), msg end end module DirectoryHelpers def dest_dir(*subdirs) test_dir('dest', *subdirs) end def source_dir(*subdirs) test_dir('source', *subdirs) end def test_dir(*subdirs) File.join(File.dirname(__FILE__), *subdirs) end end class JekyllUnitTest < Minitest::Test include ::RSpec::Mocks::ExampleMethods include DirectoryHelpers extend DirectoryHelpers def mu_pp obj s = obj.is_a?(Hash) ? JSON.pretty_generate(obj) : obj.inspect s = s.encode Encoding.default_external if defined? Encoding s end 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 default_configuration Marshal.load(Marshal.dump(Jekyll::Configuration::DEFAULTS)) end def build_configs(overrides, base_hash = default_configuration) Utils.deep_merge_hashes(base_hash, overrides) end def site_configuration(overrides = {}) full_overrides = build_configs(overrides, build_configs({ "destination" => dest_dir, "incremental" => false })) build_configs({ "source" => source_dir }, full_overrides). fix_common_issues. backwards_compatibilize. add_default_collections end def clear_dest FileUtils.rm_rf(dest_dir) FileUtils.rm_rf(source_dir('.jekyll-metadata')) end def directory_with_contents(path) FileUtils.rm_rf(path) FileUtils.mkdir(path) File.open("#{path}/index.html", "w"){ |f| f.write("I was previously generated.") } end def with_env(key, value) old_value = ENV[key] ENV[key] = value yield ENV[key] = old_value end def capture_output stderr = StringIO.new Jekyll.logger = Logger.new stderr yield stderr.rewind return stderr.string.to_s end alias_method :capture_stdout, :capture_output alias_method :capture_stderr, :capture_output def nokogiri_fragment(str) Nokogiri::HTML.fragment( str ) end end jekyll-3.1.6/test/safe_glob_test[/000077500000000000000000000000001271741406300171125ustar00rootroot00000000000000jekyll-3.1.6/test/safe_glob_test[/find_me.txt000066400000000000000000000000001271741406300212420ustar00rootroot00000000000000jekyll-3.1.6/test/simplecov_custom_profile.rb000066400000000000000000000003101271741406300214310ustar00rootroot00000000000000require 'simplecov' SimpleCov.profiles.define 'gem' do add_filter '/test/' add_filter '/features/' add_filter '/autotest/' add_group 'Binaries', '/bin/' add_group 'Libraries', '/lib/' end jekyll-3.1.6/test/source/000077500000000000000000000000001271741406300152775ustar00rootroot00000000000000jekyll-3.1.6/test/source/+/000077500000000000000000000000001271741406300154315ustar00rootroot00000000000000jekyll-3.1.6/test/source/+/%# +.md000066400000000000000000000001401271741406300162500ustar00rootroot00000000000000--- layout: default title : Page name with non-alphabetic character --- Line 1 {{ page.title }} jekyll-3.1.6/test/source/+/foo.md000066400000000000000000000001451271741406300165360ustar00rootroot00000000000000--- layout: default title : Page inside + permalink: /+/plus+in+url.html --- Line 1 {{ page.title }} jekyll-3.1.6/test/source/.htaccess000066400000000000000000000002101271741406300170660ustar00rootroot00000000000000--- layout: nil --- ErrorDocument 404 /404.html ErrorDocument 500 /500.html {% for post in site.posts %} # {{ post.url }} {% endfor %}jekyll-3.1.6/test/source/_config.dev.toml000066400000000000000000000001071271741406300203530ustar00rootroot00000000000000baseurl = "/you-beautiful-blog-you" title = "My magnificent site, wut" jekyll-3.1.6/test/source/_data/000077500000000000000000000000001271741406300163475ustar00rootroot00000000000000jekyll-3.1.6/test/source/_data/categories/000077500000000000000000000000001271741406300204745ustar00rootroot00000000000000jekyll-3.1.6/test/source/_data/categories/dairy.yaml000066400000000000000000000001131271741406300224630ustar00rootroot00000000000000name: Dairy products: - name: cheese price: 5.3 - name: milk price: 2.5jekyll-3.1.6/test/source/_data/languages.yml000066400000000000000000000000161271741406300210350ustar00rootroot00000000000000- java - ruby jekyll-3.1.6/test/source/_data/members.json000066400000000000000000000002471271741406300206770ustar00rootroot00000000000000[ { "name": "Jack", "age": 27, "blog": "http://example.com/jack" }, { "name": "John", "age": 32, "blog": "http://example.com/john" } ] jekyll-3.1.6/test/source/_data/members.yaml000066400000000000000000000001571271741406300206700ustar00rootroot00000000000000- name: Jack age: 27 blog: http://example.com/jack - name: John age: 32 blog: http://example.com/john jekyll-3.1.6/test/source/_data/products.yml000077700000000000000000000000001271741406300235312../products.ymlustar00rootroot00000000000000jekyll-3.1.6/test/source/_drafts/000077500000000000000000000000001271741406300167215ustar00rootroot00000000000000jekyll-3.1.6/test/source/_drafts/draft-properties.text000066400000000000000000000002111271741406300231130ustar00rootroot00000000000000--- categories: foo bar baz foo: bar layout: default tags: ay bee cee title: Properties Draft --- All the properties. Plus an excerpt. jekyll-3.1.6/test/source/_includes/000077500000000000000000000000001271741406300172445ustar00rootroot00000000000000jekyll-3.1.6/test/source/_includes/include.html000066400000000000000000000000111271741406300215450ustar00rootroot00000000000000included jekyll-3.1.6/test/source/_includes/params.html000066400000000000000000000002421271741406300214130ustar00rootroot00000000000000{{include.param}}
      {% for param in include %}
    • {{param[0]}} = {{param[1]}}
    • {% endfor %}
    jekyll-3.1.6/test/source/_includes/sig.markdown000066400000000000000000000000521271741406300215670ustar00rootroot00000000000000--- Tom Preston-Werner github.com/mojombo jekyll-3.1.6/test/source/_includes/tmp000077700000000000000000000000001271741406300214252../../../tmp/ustar00rootroot00000000000000jekyll-3.1.6/test/source/_includes_custom/000077500000000000000000000000001271741406300206365ustar00rootroot00000000000000jekyll-3.1.6/test/source/_includes_custom/custom.html000066400000000000000000000000171271741406300230340ustar00rootroot00000000000000custom_includedjekyll-3.1.6/test/source/_layouts/000077500000000000000000000000001271741406300171365ustar00rootroot00000000000000jekyll-3.1.6/test/source/_layouts/default.html000066400000000000000000000013221271741406300214460ustar00rootroot00000000000000 {{ page.title }}
    Tom Preston-Werner
    {{ content }}
    jekyll-3.1.6/test/source/_layouts/post/000077500000000000000000000000001271741406300201235ustar00rootroot00000000000000jekyll-3.1.6/test/source/_layouts/post/simple.html000066400000000000000000000000261271741406300223000ustar00rootroot00000000000000<<< {{ content }} >>> jekyll-3.1.6/test/source/_layouts/simple.html000066400000000000000000000000251271741406300213120ustar00rootroot00000000000000<<< {{ content }} >>>jekyll-3.1.6/test/source/_methods/000077500000000000000000000000001271741406300171015ustar00rootroot00000000000000jekyll-3.1.6/test/source/_methods/_do_not_read_me.md000066400000000000000000000001111271741406300225110ustar00rootroot00000000000000--- title: The unreadable wonder --- Don't read me, you fool! FILTER ME jekyll-3.1.6/test/source/_methods/configuration.md000066400000000000000000000002371271741406300222740ustar00rootroot00000000000000--- title: "Jekyll.configuration" whatever: foo.bar --- Use `{{ page.title }}` to build a full configuration for use w/Jekyll. Whatever: {{ page.whatever }} jekyll-3.1.6/test/source/_methods/escape-+ #%20[].md000066400000000000000000000000571271741406300216170ustar00rootroot00000000000000--- title: "Jekyll.escape" --- Signs are nice jekyll-3.1.6/test/source/_methods/sanitized_path.md000066400000000000000000000001551271741406300224320ustar00rootroot00000000000000--- title: "Jekyll.sanitized_path" --- `{{ page.title }}` is used to make sure your path is in your source. jekyll-3.1.6/test/source/_methods/site/000077500000000000000000000000001271741406300200455ustar00rootroot00000000000000jekyll-3.1.6/test/source/_methods/site/_dont_include_me_either.md000066400000000000000000000001171271741406300252150ustar00rootroot00000000000000--- title: Don't Include Me Either --- Don't include me either. FILTER ME PLZ jekyll-3.1.6/test/source/_methods/site/generate.md000066400000000000000000000001271271741406300221610ustar00rootroot00000000000000--- title: "Site#generate" layout: default --- Run your generators! {{ page.layout }} jekyll-3.1.6/test/source/_methods/site/initialize.md000066400000000000000000000000351271741406300225260ustar00rootroot00000000000000--- --- Page without title. jekyll-3.1.6/test/source/_methods/um_hi.md000077700000000000000000000000001271741406300237342./site/generate.mdustar00rootroot00000000000000jekyll-3.1.6/test/source/_methods/yaml_with_dots.md000066400000000000000000000002311271741406300224450ustar00rootroot00000000000000--- title: "YAML with Dots" whatever: foo.bar ... Use `{{ page.title }}` to build a full configuration for use w/Jekyll. Whatever: {{ page.whatever }} jekyll-3.1.6/test/source/_plugins/000077500000000000000000000000001271741406300171175ustar00rootroot00000000000000jekyll-3.1.6/test/source/_plugins/dummy.rb000066400000000000000000000001451271741406300205770ustar00rootroot00000000000000module Jekyll class Dummy < Generator priority :high def generate(site) end end end jekyll-3.1.6/test/source/_posts/000077500000000000000000000000001271741406300166065ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/2008-02-02-not-published.markdown000066400000000000000000000001671271741406300241600ustar00rootroot00000000000000--- layout: default title: Not published! published: false category: publish_test --- This should *not* be published! jekyll-3.1.6/test/source/_posts/2008-02-02-published.markdown000066400000000000000000000001311271741406300233510ustar00rootroot00000000000000--- layout: default title: Publish category: publish_test --- This should be published. jekyll-3.1.6/test/source/_posts/2008-10-18-foo-bar.markdown000066400000000000000000000001161271741406300227300ustar00rootroot00000000000000--- layout: default title: Foo Bar --- # {{ page.title }} Best **post** everjekyll-3.1.6/test/source/_posts/2008-11-21-complex.markdown000066400000000000000000000001431271741406300230450ustar00rootroot00000000000000--- layout: default title: Complex --- url: {{ page.url }} date: {{ page.date }} id: {{ page.id }}jekyll-3.1.6/test/source/_posts/2008-12-03-permalinked-post.markdown000066400000000000000000000002111271741406300246510ustar00rootroot00000000000000--- title: Post with Permalink permalink: my_category/permalinked-post --- h1. {{ page.title }}

    Best post ever

    jekyll-3.1.6/test/source/_posts/2008-12-13-include.markdown000066400000000000000000000001231271741406300230210ustar00rootroot00000000000000--- layout: default title: Include --- {% include sig.markdown %} This _is_ cool jekyll-3.1.6/test/source/_posts/2009-01-27-array-categories.markdown000066400000000000000000000001501271741406300246430ustar00rootroot00000000000000--- layout: default title: Array categories in YAML categories: - foo - bar - baz --- Best *post* ever jekyll-3.1.6/test/source/_posts/2009-01-27-categories.markdown000066400000000000000000000001341271741406300235310ustar00rootroot00000000000000--- layout: default title: Categories in YAML categories: foo bar baz --- Best *post* ever jekyll-3.1.6/test/source/_posts/2009-01-27-category.markdown000066400000000000000000000001201271741406300232140ustar00rootroot00000000000000--- layout: default title: Category in YAML category: foo --- Best *post* ever jekyll-3.1.6/test/source/_posts/2009-01-27-empty-categories.markdown000066400000000000000000000001161271741406300246650ustar00rootroot00000000000000--- layout: default title: Category in YAML categories: --- Best *post* ever jekyll-3.1.6/test/source/_posts/2009-01-27-empty-category.markdown000066400000000000000000000001141271741406300243530ustar00rootroot00000000000000--- layout: default title: Category in YAML category: --- Best *post* ever jekyll-3.1.6/test/source/_posts/2009-01-27-no-category.markdown000066400000000000000000000001021271741406300236260ustar00rootroot00000000000000--- layout: default title: Category in YAML --- Best *post* ever jekyll-3.1.6/test/source/_posts/2009-03-12-hash-#1.markdown000066400000000000000000000000701271741406300225230ustar00rootroot00000000000000--- layout: default title: Hash #1 --- Hashes are nice jekyll-3.1.6/test/source/_posts/2009-05-18-empty-tag.markdown000066400000000000000000000000411271741406300233140ustar00rootroot00000000000000--- title: A Tag tag: --- Whoa. jekyll-3.1.6/test/source/_posts/2009-05-18-empty-tags.markdown000066400000000000000000000000511271741406300235000ustar00rootroot00000000000000--- title: Some Tags tags: --- Awesome! jekyll-3.1.6/test/source/_posts/2009-05-18-tag.markdown000066400000000000000000000000461271741406300221650ustar00rootroot00000000000000--- title: A Tag tag: code --- Whoa. jekyll-3.1.6/test/source/_posts/2009-05-18-tags.markdown000066400000000000000000000001021271741406300223410ustar00rootroot00000000000000--- title: Some Tags tags: - food - cooking - pizza --- Awesome! jekyll-3.1.6/test/source/_posts/2009-06-22-empty-yaml.markdown000066400000000000000000000000231271741406300234770ustar00rootroot00000000000000--- --- Empty YAML.jekyll-3.1.6/test/source/_posts/2009-06-22-no-yaml.markdown000066400000000000000000000000101271741406300227510ustar00rootroot00000000000000No YAML.jekyll-3.1.6/test/source/_posts/2010-01-08-triple-dash.markdown000066400000000000000000000000531271741406300236070ustar00rootroot00000000000000--- title: Foo --- Bar --- Triple the fun!jekyll-3.1.6/test/source/_posts/2010-01-09-date-override.markdown000066400000000000000000000001321271741406300241240ustar00rootroot00000000000000--- date: 2010-01-10 --- Post with a front matter date {{ page.date | date_to_string }} jekyll-3.1.6/test/source/_posts/2010-01-09-time-override.markdown000066400000000000000000000001431271741406300241470ustar00rootroot00000000000000--- date: 2010-01-10 13:07:09 --- Post with a front matter time {{ page.date | date_to_string }} jekyll-3.1.6/test/source/_posts/2010-01-09-timezone-override.markdown000066400000000000000000000001701271741406300250430ustar00rootroot00000000000000--- date: 2010-01-10 13:07:09 +00:00 --- Post with a front matter time with timezone {{ page.date | date_to_string }} jekyll-3.1.6/test/source/_posts/2010-01-16-override-data.markdown000066400000000000000000000000611271741406300241170ustar00rootroot00000000000000--- date: 2010-01-10 13:07:09 tags: A string --- jekyll-3.1.6/test/source/_posts/2011-04-12-md-extension.md000066400000000000000000000004121271741406300225610ustar00rootroot00000000000000--- date: 2011-04-12 13:07:09 --- under default configuration, this post should get processed by the identity converter. By changing textile extension or markdown extension configuration parameters, you should be able to associate it with either of those convertersjekyll-3.1.6/test/source/_posts/2011-04-12-text-extension.text000066400000000000000000000000001271741406300235220ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/2013-01-02-post-excerpt.markdown000066400000000000000000000002311271741406300240230ustar00rootroot00000000000000--- layout: ~ title: Post Excerpt --- First paragraph with [link ref][link]. Second paragraph --- Third paragraph [link]: http://www.jekyllrb.com/ jekyll-3.1.6/test/source/_posts/2013-01-12-nil-layout.markdown000066400000000000000000000000771271741406300234740ustar00rootroot00000000000000--- layout: nil title: No layout --- This post has no layout. jekyll-3.1.6/test/source/_posts/2013-01-12-no-layout.markdown000066400000000000000000000001241271741406300233170ustar00rootroot00000000000000--- title: I have no layout --- This post will be rendered with the "post" layout. jekyll-3.1.6/test/source/_posts/2013-03-19-not-a-post.markdown/000077500000000000000000000000001271741406300234625ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep000066400000000000000000000000001271741406300251010ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/2013-04-11-custom-excerpt.markdown000066400000000000000000000002321271741406300243540ustar00rootroot00000000000000--- layout: ~ excerpt: 'I can set a custom excerpt' --- This is not my excerpt. Neither is this. I can use the excerpt: {{page.excerpt}}jekyll-3.1.6/test/source/_posts/2013-05-10-number-category.markdown000066400000000000000000000001321271741406300244740ustar00rootroot00000000000000--- layout: default title: Number Category in YAML category: 2013 --- Please make me passjekyll-3.1.6/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown000066400000000000000000000004071271741406300263240ustar00rootroot00000000000000--- layout: post title: Post Excerpt with Layout categories: - bar - baz - z_category - MixedCase tags: - first - second - third - jekyllrb.com --- First paragraph with [link ref][link]. Second paragraph --- Third paragraph [link]: http://www.jekyllrb.com/ jekyll-3.1.6/test/source/_posts/2013-08-01-mkdn-extension.mkdn000066400000000000000000000000001271741406300234400ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/2013-12-17-include-variable-filters.markdown000066400000000000000000000011641271741406300262600ustar00rootroot00000000000000--- title: Post layout: post include1: include.html include2: include include3: INCLUDE include4: params include5: clude --- Liquid tests - 1 {% include {{ page.include1 }} %} - 2 {% include {{ page.include2 | append: '.html' }} %} - 3 {% include {{ page.include3 | downcase | append: '.html' }} %} Whitespace tests - 4 {% include {{page.include1}} %} - 5 {% include {{ page.include1}} %} - 6 {% include {{ page.include3 | downcase | append: '.html'}} %} Parameters test - 7 {% include {{ page.include4 | append: '.html' }} var1='foo' var2='bar' %} Partial variable test - 8 {% include in{{ page.include5 }}.html %} jekyll-3.1.6/test/source/_posts/2013-12-20-properties.text000066400000000000000000000002221271741406300227260ustar00rootroot00000000000000--- categories: foo bar baz MixedCase foo: bar layout: default tags: ay bee cee title: Properties Post --- All the properties. Plus an excerpt. jekyll-3.1.6/test/source/_posts/2014-01-06-permalink-traversal.md000066400000000000000000000000751271741406300241420ustar00rootroot00000000000000--- permalink: /%2e%2e/%2e%2e/%2e%2e/baddie.html --- # Test jekyll-3.1.6/test/source/_posts/2014-03-03-yaml-with-dots.md000066400000000000000000000000711271741406300230340ustar00rootroot00000000000000--- title: Test Post Where YAML Ends in Dots ... # Test jekyll-3.1.6/test/source/_posts/2014-03-22-escape-+ %20[].markdown000066400000000000000000000001021271741406300235170ustar00rootroot00000000000000--- layout: default title: Plus space percent --- Signs are nice jekyll-3.1.6/test/source/_posts/2014-07-05-another-mixed-case-category.markdown000066400000000000000000000001511271741406300266710ustar00rootroot00000000000000--- layout: default title: Another Mixed Case Category in YAML category: Mixedcase --- Best *post* ever jekyll-3.1.6/test/source/_posts/2014-07-05-mixed-case-category.markdown000066400000000000000000000001411271741406300252320ustar00rootroot00000000000000--- layout: default title: Mixed Case Category in YAML category: MixedCase --- Best *post* ever jekyll-3.1.6/test/source/_posts/2014-09-02-relative-includes.markdown000066400000000000000000000016451271741406300250300ustar00rootroot00000000000000--- 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 %} jekyll-3.1.6/test/source/_posts/2014-11-24-Rmd-extension.Rmd000066400000000000000000000000001271741406300230220ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/2015-01-08-post-excerpt-separator.markdown000066400000000000000000000003001271741406300260260ustar00rootroot00000000000000--- layout: ~ title: Post Excerpt Separator excerpt_separator: "\n---\n" --- First paragraph with [link ref][link]. Second paragraph --- Third paragraph [link]: http://www.jekyllrb.com/ jekyll-3.1.6/test/source/_posts/2015-02-20-extensionless-permalink.markdown000066400000000000000000000001251271741406300262560ustar00rootroot00000000000000--- layout: ~ title: Extensionless Permalink permalink: /:title --- {{ page.url }} jekyll-3.1.6/test/source/_posts/2015-12-27-extra-spaces.markdown000066400000000000000000000000301271741406300237750ustar00rootroot00000000000000--- extra: spaces --- jekyll-3.1.6/test/source/_posts/es/000077500000000000000000000000001271741406300172155ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/es/2008-11-21-nested.markdown000066400000000000000000000001431271741406300232670ustar00rootroot00000000000000--- layout: default title: Nested --- url: {{ page.url }} date: {{ page.date }} id: {{ page.id }} jekyll-3.1.6/test/source/_posts/include_relative/000077500000000000000000000000001271741406300221245ustar00rootroot00000000000000jekyll-3.1.6/test/source/_posts/include_relative/params.html000066400000000000000000000002431271741406300242740ustar00rootroot00000000000000{{include.param}}
      {% for param in include %}
    • {{param[0]}} = {{param[1]}}
    • {% endfor %}
    jekyll-3.1.6/test/source/_posts/include_relative/rel_include.html000066400000000000000000000000221271741406300252710ustar00rootroot00000000000000relative_included jekyll-3.1.6/test/source/_sass/000077500000000000000000000000001271741406300164075ustar00rootroot00000000000000jekyll-3.1.6/test/source/_sass/_grid.scss000066400000000000000000000000251271741406300203650ustar00rootroot00000000000000.half { width: 50%; }jekyll-3.1.6/test/source/_slides/000077500000000000000000000000001271741406300167215ustar00rootroot00000000000000jekyll-3.1.6/test/source/_slides/example-slide-1.html000066400000000000000000000000661271741406300225000ustar00rootroot00000000000000--- title: Example slide layout: slide --- Wooot jekyll-3.1.6/test/source/_slides/example-slide-2.html000066400000000000000000000001441271741406300224760ustar00rootroot00000000000000--- title: Override title layout: slide nested: test1: override1 test2: override2 --- jekyll-3.1.6/test/source/_slides/example-slide-3.html000066400000000000000000000001131271741406300224730ustar00rootroot00000000000000--- title: Override permalink layout: slide permalink: /slide/3/ --- jekyll-3.1.6/test/source/_slides/example-slide-4.html000066400000000000000000000012441271741406300225020ustar00rootroot00000000000000--- 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**. jekyll-3.1.6/test/source/_slides/example-slide-5.html000066400000000000000000000000371271741406300225020ustar00rootroot00000000000000--- layout: slide --- Wooot jekyll-3.1.6/test/source/_slides/example-slide-6.html000066400000000000000000000012511271741406300225020ustar00rootroot00000000000000--- 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**. jekyll-3.1.6/test/source/_slides/example-slide-7.md000066400000000000000000000001641271741406300221410ustar00rootroot00000000000000--- am_i_convertible: yes permalink: /slides/example-slide-7.php --- Am I convertible? {{ page.am_i_convertible }} jekyll-3.1.6/test/source/_slides/example-slide-Upper-Cased.html000066400000000000000000000000671271741406300244510ustar00rootroot00000000000000--- title: Example Slide layout: slide --- Cased! jekyll-3.1.6/test/source/_slides/non-outputted-slide.html000066400000000000000000000001431271741406300235300ustar00rootroot00000000000000--- title: Non outputted slide layout: slide published: false --- This should not be output jekyll-3.1.6/test/source/_slides/octojekyll.png000066400000000000000000000535301271741406300216140ustar00rootroot00000000000000PNG  IHDR({2WIDATxmP+a:X HH@H" H}ЙݝL@93~5ϟ*Q.`:6j V#Ǩ쨜fPvڸKvpv8x)qnwoi6~mog7XmUvmo1?, 3:%n%$Rx V y!@}9n.[CT\xq*pIo$$~ nwr=*q4-p~p9J?9I?lZoD5Q}*}9ɇpi{SOvQ`(P.k"f͐8m.lo+}V+Fo;_ Sᫍ \2;ie>hak|ZiQ94خb:WNMT/.ڃWctZqxhIA @<'I2( JI2(%@$\ JR JR JR J JI2( JI2( JI2( JI2(0(%ɠ0(%ɠ0(%ɠ0(%ɠ J!I?3(<&$I%A)I%AI2(<nQ- JI2(%mI7ɠ`cHIP!Ir9Wr$rWٺt mIfB W=?IX?:$Io'%P?چ$闃/ 9`9 FO.Js#IG $i֨JpY\;$م$i֠Jpgr$ `TJF$ `TJWʡ$5.$I[QJIZKҒ19!CH~KIه$5}H{'h0MHҗɾ0$}јܸ`1t$ɉnH2&O%X)%?$$;$O)ɘ<宥 I1-p IrE>}K8-I>uԷ$p$cPsI1ٵ\`: ʡ$=#IIZA#ɘKk$ג|t!Io2&%_RJ$~$NR: IK)ɯא$NhU\B^8&7%WMHҋPru8$`Lve*rBHp8GA9\-!IШ IKTr8$ycH_ے;)%n|s7N{K% K%e !I.35$4چ$5ʡ$K>HA9A B$a IIC<@SH҂1ٕr IZ0(% $i<KZ:(%`IX?p IzpP&<`$/ܕ9- o<(ɓЇ$Do} W[Z -v@Ҩjb l6.imUc6@6!4:Fc0ud!D8Z\cb-_!sٹ̝{sV;ٙg>Kx}&[|Ug΁PVH qx7uknt#:#ktwѱۖ.)QT`oY_Ϲc A02DHVNWxƇ唣+ŌpGXH )% ;y/z_V|gM'䘏G'W43-#F 5&aF e6CdwB/Y\,T ҁDf0ALzwgA0]}k' 5Q ڹcݖZ6ҳ~;6w,.}f>gF@a3߳zo<75ȥ FS%5Fa\STTyOFpCẂ]cȨ.oJ@P"$Acm훖ӭ}Lo(tLl*|/..&RHNS3~FZajFM2=)-Rw#0L(Nr Ai4WVhTP0ĥ=6EPkJfNo+m+G LKE35ϒ+*!I: TԲԠtj+taQOHN}8{XR²@2W"(AMq#$1̇pW34%Ky0w.=l7% ( JJolaJQG1dDm #Z A J/bR9U #Zsy!(AY?ōaXNpfU"(AYdUg(:o% (JQ/aJ%2`$bJ%brP0:5<|SDLbX-'*_}Aߴ 1aoTA@P]L*(DUܛkDBͽ}D哫W"(tt_{(xTz/]L{q\z}60{B"gTI4VLJT̨DP&HL*#-_9r"Xngvd}Lj*APv@P޶tuŤן̦y" q86pzJ% (T˭㖃џW&" L󧏺YUSm) r#ĩ=[F , սz&gK?>Ʈg2J Jw9vnrQh4`إ seIJ}#(5Lu.05̔|&A~ @Cк5dO2;6׮;@Pm8Y&Qi7T⤞R]J J=6 &㥦L:Ufr]"( &eyrWyoKN (j oQ1)hΤw @ԃЗ51TOe35EfQPj`ptF`lLvw}[у @C2M껺 ݚgkk)hgVg~~qocLߟןI#}ΘΛcܔ~x_ܹ+V]DP@TŤvv'w?UZ9kHwLbe*yq4:C/OUVUK9@aUkzS8{aRڞRAaP ɞRLR6UzN&Dwv1AUN߾MN9S:2k(%%mD<$Ha97Q*FPrf[;Y褄";ryB?QIjpmT2KM"(A3Nk'%Ld8QII+&=J'VyH2 ʱ*%?mtR!0bҁӴp1RTjk+w<*% @V筝ܭX9Q:r,1\J.NaFj5Τ.6퍠: fU"zϾlԍf,u#wGh-tSfL3ʈR|PY.U^ `TtFys:jָ { p4DmgRczEhK/bme2I kiƉzY4Է!*'HwK4(dGL^p).Zň`%(3vxK-.r襃zIwKZ?IJF֥V"5 Lm&uU&yfj:H1bCe%kPgA]j x@5.ݲMT/A Fxn*IqT(`Kv|l͡~F#_hswE6@j̝f Q"5kXiSHc{ ]GP@x޶FGG nu|g9H{G91oKW.*{CVĕZ;i#h̉ΤR\aP1GYk9@#}R{]Nԋ3&@s H5`ȾʚD$(j6 9vxˁP86ZUNo:Un1`qtPGPHvzVɝAC%.$:Ԥ2@sJ*TvQ^lU l*(߻-,A)l9RL#nAȠ "\n 0}3H\Xs7 9>옖 AiEjigy-=APKQَQP=vAik"("8p뒳 @c#A)%Ie;ƜOFP`CP:0%ojg"8DGĂ+~H>-[!(X+3<ʃO?x%ɩ TevI@M9^eٔPϟ֏nS` {ԟnd7Ջw,\T#W]=pslJB{== JrdQDPՠXu{Gn~Mh#NOp&ls٠i:2H̽}[̽ײ!j/(EP* yK\ uǷoKhm_{(`tPޗ/],=th<lE T U֡9zIho#AKF l)nt]Ȗ?\l1RQ@̠8Xd3 mDU<@$cШ=ZMIF,&æEhu&{(ovC7,&?L>s^>P: |= Չ \C1:H"AXɡ5?`5% 3})VNQctY[>h+PD mkzAY }(TI ;KS2G?vl("視mj1u*q?3)4ч-F7hD~&0xiYA6N:KLpɚ 4g- h j-qTiDgv损6E6<7lTءңWalQJN22Z 8s~K04uqALI͜fWb+-s OxM̤ h̉1mSW1.(ZJ5ŜԉD~Q׶bSpe6x"-s H{;p>P|jsk^jEt&p9a"!3]!2F L+;78O}lt8Z2L:&ݍ̡̰%g"^ C09^h+\xM Y8}rK'h)$T8A7(3)lj98/22vx_,#G)xT*t_κJ/L2.QA=iٷv{YZ;Q2<=[9֮9_=u'ڈJ^K5~6sL!8(cäs34aՃ!s)=:p5UV0K+D*9E^pHwO(C8WD8': h6X/t0ՐaxXCEp$ %f(J{ *qtw3|͙+KŢVCٰ(%\)*wt+uEiDLIFMaj7" 2bIHƁKݤu}/D%grÚvv;3Ĺ ~tREsaAD fwwhlZtrNщ:}048%kοwDŋ3A}vjgRQV*ji`@3ItMrǙDNFcf8?{u}T*ijR?RorSmEN{**ZA;\;شV vNfAOvOA~d !!7@HlB ^'~n;&,1M93RIN'EoAUN1f1S{+mťeEŞBٝ'Y;sdێ,.}E#yw޵%s9:zMh*y7IǘˢtfdL`}z>:gUuRJHQq|ٹkl)[[\G?-X(BYÚɪ~B D!٭Ū dV|&9H7f]TKk[JM^ϾHu^y3Ϭ_7MYt ނ|S74}.!AH߮$n$s-&:}6qӓuwʁfǵke˖)Տ<"wdV*`.ڊ6>( !Vngo̔H2@&O9rС>owtttʟ_]c2Ѹ뮻mّS\X{wn^Jy}BHW泙A5/H'NGpo|HFgj279T8g)BJL*!B/V4E`J$”NknP S'OdpttvOӘ< q%Ens $l8'P=6Kͻ !\u 3歶[)ՙQ穑 IOO\sՏ;ޕ*)S.R)(t\* {!p=)(*dom2褔ҠNJK|N )Y1Hs>JBYn+N'Ӎ(JDO?ѳ22rZĉ?0 pNwwtvvIk[RI)KmSj9I)ڻ]uj 2Àh* vI{QVn&<7EQ0)R?3L)iL)Α@81=rDz.W;$IٰQpsDVVרMI1L/ L)+ZkhT#gkx6m8N(j:COQߐ?)e9'tRwy&0j s&L/T?gR%$aOč7m3=7DQ'AᜡaOtRJ_1Hw!9ގ)e𯽃9ToL/fS}.84n*o!d=IJI&)J(asN>~\ps9rTps4)9%xfsy]QC8'%L%{* cXc5~:5]$EQ4)sF[s:=TJsj`"jY]cꤜSb%6!>x- &a % _^/׈>%f( ko'pރ9X{wÄsjNJL!ǃ9Uppۈ9U~~ߊon:> 03f0 }`{~I-h(T8X8LJpkos8QM!Ip^{sRgT\%ɋ3:(A/?4EQIӃpN鵷9jBRtUON V=u|([g‰d&IVL&(S sdT^sItH MNJeQ{hNh'%>v V[JC$A >7Zcg0:D CgRK(JspN1e(E[Tڀϊ+pN+L.GzLmL6#M%5!'19hIH={֥9NNpNgp9Xo9卵]S 9wp8'5LeLVg-!ꈈX7JRlᜠNpA8KYI5Ċ[O)gkpYKssHN#,d(N)3ΑSRszA'?!-X{7;)iDFeNJw{X N. /O(O#5앤(* %9N@8_sk :)u8RE،ĕ:_R5 =&rvp͉n(FϞupNrpw<&_{pۦp;NCrW^POWlQ?Y=EqJ:);)sv@6w䭷r9NJRQgNJTKLT &WdC5nāF(*mӦM_i~ K.|,*_|l6W_UATW/X -K@W!I;"ˌ@&HREـxLou zzsHJ)c>T/Wc|ph22!(J&r+X{t9ZZ2p'^'sHySn}CM✫ah&}@7ߌ eh' s2t[E ca2yV{^i#z]=\(JT,ZHM!K΁ ]{{9%w!CAAS`6/?I{4]4ŹEQs\ SHΩlInLQZ`p,ł%ƎAOM44R)(xO(InQ%1e:kb!>4(*|[]wݭL#fRskpNAy!.`|6(odI(1W? IaP2H(\@r}wNJA0$lH(E`7( d[eD T2 8!$f< sEQH< *@)(`'BJ[ʟ}VM)kwR:qB8Oo:(J2| :P7~T?)}5] z|B[8 dA (%v_sPSY]'8c7xLN0I27EQT*rtVpsv`ۅ9.Bt @B|  PE%A}з-l_Bz^~PP A5]F A(qp'e1NI,lS (*W,X@\ri/,GZ@#a9٠1#C^zIA/W_}ɃeLf:pw儸8-SEFhr%ȕ9 3gԩSr瓾 aHhMԂ*PAEPt,_޹Lmߡ=xDڵь/pLl7u(R1t\"]z6뮓~!XFA;8zP&\ /-MO)@ƍrŝwM6\[1(kXf{=>%'JK( 0᜽N 9>g^x1#ͮL߂_b.E_3Dzñ=i=eEQEQ4E_c޿r{D|>?A ٪;)u8G*U8'/P\{mkfI#^xu"Ѱ7Eڬ&)^\V ۈɄ|`(%'Httt`pа d&uxUޅ!MG(5F2f7'bu`ff"EQ^a*a ϪpX8[k. 9:xI v`yw&pISI]|EU !.`NbSEQ30H+po!=:F87YI9SC酡 sAY`+(ڻ7t8g*p s'"((mu1法YYp:)ޝTi*/L'd_qpZIaLȠ/~ѓ|,/)qQEQXCJM_F !GV֝*xq| [B92?_s:4 1@7yM>VDQEC+qzRuRpκu* :AA])~9ι{"J>,n&&X :y3epCT*G:V"/)l,REua7zU`^}MNcJ:)"vRւpNlCIh'eS~yM5j2iM \!+-Y#5j.(j. S`CY 9ow s|Cҿb) :PIՋZ]J&.Gyas^HQ5G7Peٳsdh,x@ S.Zaw/ᜭ ]F۰/P4,!j&$&t4e$馞j_tn (昶"Ս`J]gϞ9'}>[i TFMcG;:)U&C Դ2j3YԓG 3uH2 .@_uEQsIHXg1r@ŮsΥ7X'5j AԃjP eá*=]2nܨ;)75 j;<'d2g,WFR(Rb1>hӘRNʆ9;1p?I u7B:֜;V=,707؄/0cIzQEQ-VCɢor\@87$+V9`?A Io&.Gy22aL(gP`,?]zZ%sPEP1I!A8G9Q:)Ås6)w/st'eDBWiTE'YC&2D8GYɠ(h(c\{ᜓ>-\h 4P @p< ly,h 5rc}oC3&%ID&:g .pE%(ʔ :)S9#24IfZ{wv0Srnם,yiizJJ7nԝJy M$!I(b($SJ'RS8gr] JAQH' T9YX'SEwvۧqMà(>UaWeH8Ǧ9F;)NQ:)ÅsoΩVʚXPb7&*J7B (]ϹzqZLYΩtRS8ǽ~@Hn\V,=V3 ifPEQ-TPB 7IX{g #cn󯽻@+hI9ې(^{\9oEHz)'0=MCi(*pNhr,j 9Š,ti]:sכT4+B^f|EQEM5A'eV NDIY_{µku'$p=(ItRpź2R8 .l%˗)e.WmwLyR2+A 4bEQEN@8g: hIiuRwRpCTL_|Yut)DQEqJ{}ŪVMݮJK|] |i|ޫfh{uy #EQpMsNN5kq/Y"+}ea{ɮ4ڠq$1$>y m.]F|*E_neC0&&(gN'NJ Ԁ P nPq-Ұci<$ Քrݓf!4i x%aON-E5BZPˤPEQ\{s9'}28x\ dZS'%-rY7ݹy b m"#) 6DV3Iy_V4rEQ5QPT'%9O9RS#]<"-_\|Tv|PZ`K45Tz=pRjtU L- S > p%(Ӂemn(i(-Zi3((j9ʔӧ=X{<)wLz{HO!J[{2FwGgXKkJv>f{ec}o $^z@&Hq4)@NѼᯖ 4|z % (&#Lۍp ?.ȑraz +0]prvL-s2LjA&pt`#͏8oZC&]&0 ŵp N3MQE%pkooý#dwO8$ai$\xU0FV1K$av™ 6ja(}+^_NCIQE%s9u76{wpq hDzֱK`9#@ .C Kp ^m=<}(RK⧙73?<,o <(v>]ųJv&x/*( _#{sSP6k+wd7_J1 ٞ͠,J~0wz'^n{%WY>+ tɲ|#k?Z[A9gmΙ:=\cV9d0}dfkd浶\=q(p0 @~˳/dr}P w]Pڝ''e2xA_Pؐ%(`, p#re=AYf/;JA#6OOe]AC{yP Q[P ʌ= 7 JX|4OP;Gu㎠tM LZv2{#(QPn\.ˬe92Gv7s)(g{ JA91YCk40$$ &Zް0j=|'{=7z|z2}7?:߳)\^2|Pcw],Ӓ:R1ַ,&Ϩ5ZL Cx 7m %2:$o(057qwu^uZGOJ%|%-I]iIʥeOE5}kh2}yϴ Ԓ2 iܽiJE2?׷UԗR[je#qlK]oS̈́րh(xkU3) jVq_* eDC~~i{FZM]q:U=U{oj*P_jg0=hdcRfFf•T'pMm)^k~y2fWz4D-&Wٍ:Cgf2 1X5'^uoWطtQSi GIl]`${Rd: LZWwRJzm_ǁŧV_;Ipz&mpxf2&a*7nh](cIIJ: \*,7u#M8@s30\MR׋\]gKRtoWS4t Gek*M7o.G+1[yck,|6`&-*iMm 8Қ)6$]ը]5ZuLe:4H3m߶-љ0i~X?;3FcNHnڿb p/ip3_ JFrNZ/FrE͘HqGhȉP?鷎r*Ж׾67%nCT ^a$Vrz2s';Rd{j{he=R+,HLvT@ h PVpiUip [p}E=i.H:ϨYH\5}dBEzufg`XVF,M@ e.}JLZ/,(NsjBHJpBܬ[7$X:~*\+K2<{*FUf)4AzqfVȒ)栩2$?6VTTRCCd\3|(Z>$zŮ0eflRd.0GH7s7!.}Oi2|rExUC(<ۣw켤8ߔ7T5 ;}/*>#}lפ 6xMwy{?+? #[;A[z2sћYdjk3]ioc'/zY;KG->}w39uڞ  ~oW)x_ hԩts`&σwB^8EzޞKh( rLiHU< N}ٟ?{ſk"Fy8{(ԋ1{a-fվN&hejgC"Q>5NPR0_{8#tŠ ]#T$;8yPGCRl] eXnތ JhġҡB}"S1FR*ZGfcEܾ`(d,RSq.ԓ>&??Hw#d|mZ.7??ZʶTɺvl([n.J74kLjR=`$~^GC)UtL1Bs3 D1,|;/)ЋˡP{/N=ui(LTRS9C#,(: 3ޣ;f,`$W2ܟq'K;Ya&SSٌ^:5 WCVi蜵[__o)ܿQ %OĮnFр3TZG)m&e0<2+H[qt2OmҔ뾮z̰ll|8('aRdmS#Dt2\58vsڊYrQI13J Jj+'6ư(eDmt։(g-l"Vs$LQcgS+ Hi JE1N 2E X0K2̤Ijk,$4IT85"uc!n&=%}E9eWH? LU#;utW|2hࣥÑFD5vuSmvxv?Z.UG-s7Z=:V4zR+-PI+ZۈTP&QÊH)>/_njPֲԑ3p B%=xjwuk ՆCTȚ\b(exLWqĔ0iƗnz  %E6 5>%R&vQJT'CACO*{5Gԑ^b(=vB*:n lK] f0'P;iF'|gukV6A悴L \tC)S;+Cs]K 56YlIݑ 9gJ>Q̶ԕri0c bn ey\R>Hr 5ڜzA9yl JA Iig>"Eyn(cGj1@FsnRd޺64kd(7gZ|f(;ۺ]5o(-سT5cz͎jŞKCRэW8R4iuOE}cb%?/+-IyP~.!纮krorYʥԕ:-6m{ZN(Bё}%m*[R_e(ucijC9%K{IË4={~/+_EJ]]u@O J:'΢`Z`F:[:#s>Kf14;IENDB`jekyll-3.1.6/test/source/_thanksgiving/000077500000000000000000000000001271741406300201325ustar00rootroot00000000000000jekyll-3.1.6/test/source/_thanksgiving/2015-11-26-thanksgiving.md000066400000000000000000000000411271741406300241740ustar00rootroot00000000000000--- --- Happy {{ page.title }} ! jekyll-3.1.6/test/source/_thanksgiving/black-friday.md000066400000000000000000000000311271741406300227760ustar00rootroot00000000000000--- --- {{ page.title }} jekyll-3.1.6/test/source/_urls_differ_by_case_invalid/000077500000000000000000000000001271741406300231355ustar00rootroot00000000000000jekyll-3.1.6/test/source/_urls_differ_by_case_invalid/page1.html000066400000000000000000000000701271741406300250150ustar00rootroot00000000000000--- title: About permalink: /about/ --- About the site jekyll-3.1.6/test/source/_urls_differ_by_case_invalid/page2.html000066400000000000000000000000701271741406300250160ustar00rootroot00000000000000--- title: About permalink: /About/ --- About the site jekyll-3.1.6/test/source/_urls_differ_by_case_valid/000077500000000000000000000000001271741406300226065ustar00rootroot00000000000000jekyll-3.1.6/test/source/_urls_differ_by_case_valid/page1.html000066400000000000000000000000701271741406300244660ustar00rootroot00000000000000--- title: About permalink: /about/ --- About the site jekyll-3.1.6/test/source/_with.dots/000077500000000000000000000000001271741406300173615ustar00rootroot00000000000000jekyll-3.1.6/test/source/_with.dots/all.dots/000077500000000000000000000000001271741406300211015ustar00rootroot00000000000000jekyll-3.1.6/test/source/_with.dots/all.dots/2.4.0.md000066400000000000000000000000351271741406300220620ustar00rootroot00000000000000--- title: v2.4.0 --- v2.4.0jekyll-3.1.6/test/source/_with.dots/file.with.dots.md000066400000000000000000000000371271741406300225440ustar00rootroot00000000000000--- --- I'm a file with dots. jekyll-3.1.6/test/source/_with.dots/mit.txt000066400000000000000000000000741271741406300207140ustar00rootroot00000000000000--- --- I should be output to `/with.dots/mit/index.html`. jekyll-3.1.6/test/source/_with.dots/permalink.with.slash.tho.md000066400000000000000000000001761271741406300245450ustar00rootroot00000000000000--- permalink: /with.dots/permalink.with.slash.tho/ --- I'm a file with dots BUT I have a permalink which ends with a slash. jekyll-3.1.6/test/source/about.html000066400000000000000000000000701271741406300172740ustar00rootroot00000000000000--- title: About permalink: /about/ --- About the site jekyll-3.1.6/test/source/category/000077500000000000000000000000001271741406300171145ustar00rootroot00000000000000jekyll-3.1.6/test/source/category/_posts/000077500000000000000000000000001271741406300204235ustar00rootroot00000000000000jekyll-3.1.6/test/source/category/_posts/2008-9-23-categories.markdown000066400000000000000000000001031271741406300252650ustar00rootroot00000000000000--- layout: default title: Categories --- Categories _should_ workjekyll-3.1.6/test/source/contacts.html000066400000000000000000000000701271741406300200000ustar00rootroot00000000000000--- title: Contact Information --- Contact Information jekyll-3.1.6/test/source/contacts/000077500000000000000000000000001271741406300171155ustar00rootroot00000000000000jekyll-3.1.6/test/source/contacts/bar.html000066400000000000000000000000701271741406300205440ustar00rootroot00000000000000--- title: Contact Information --- Contact Information jekyll-3.1.6/test/source/contacts/humans.txt000066400000000000000000000001331271741406300211460ustar00rootroot00000000000000--- permalink: /contacts/humans/ --- I should be output to `/contacts/humans/index.html`. jekyll-3.1.6/test/source/contacts/index.html000066400000000000000000000000701271741406300211070ustar00rootroot00000000000000--- title: Contact Information --- Contact Information jekyll-3.1.6/test/source/css/000077500000000000000000000000001271741406300160675ustar00rootroot00000000000000jekyll-3.1.6/test/source/css/main.scss000066400000000000000000000000301271741406300177010ustar00rootroot00000000000000--- --- @import "grid";jekyll-3.1.6/test/source/css/screen.css000066400000000000000000000017731271741406300200700ustar00rootroot00000000000000/*****************************************************************************/ /* /* Common /* /*****************************************************************************/ /* Global Reset */ * { margin: 0; padding: 0; } html, body { height: 100%; } body { background-color: white; font: 13.34px helvetica, arial, clean, sans-serif; *font-size: small; text-align: center; } h1, h2, h3, h4, h5, h6 { font-size: 100%; } h1 { margin-bottom: 1em; } p { margin: 1em 0; } a { color: #00a; } a:hover { color: black; } a:visited { color: #a0a; } table { font-size: inherit; font: 100%; } /*****************************************************************************/ /* /* Site /* /*****************************************************************************/ .site { font-size: 110%; text-align: justify; width: 40em; margin: 3em auto 2em auto; line-height: 1.5em; } .title { color: #a00; font-weight: bold; margin-bottom: 2em; } .site .meta { color: #aaa; }jekyll-3.1.6/test/source/deal.with.dots.html000066400000000000000000000001161271741406300210120ustar00rootroot00000000000000--- title: Deal with dots --- Let's test if jekyll deals properly with dots. jekyll-3.1.6/test/source/dynamic_file.php000066400000000000000000000001321271741406300204270ustar00rootroot00000000000000--- --- I'm a Jekyll file! I should be output as dynamic_file.php, no .html to be found. jekyll-3.1.6/test/source/environment.html000066400000000000000000000001141271741406300205250ustar00rootroot00000000000000--- title: I'm a Jekyll environment exchequer --- {{ jekyll.environment }} jekyll-3.1.6/test/source/exploit.md000066400000000000000000000000751271741406300173070ustar00rootroot00000000000000--- permalink: /%2e%2e/%2e%2e/%2e%2e/baddie.html --- # Test jekyll-3.1.6/test/source/foo/000077500000000000000000000000001271741406300160625ustar00rootroot00000000000000jekyll-3.1.6/test/source/foo/_posts/000077500000000000000000000000001271741406300173715ustar00rootroot00000000000000jekyll-3.1.6/test/source/foo/_posts/bar/000077500000000000000000000000001271741406300201355ustar00rootroot00000000000000jekyll-3.1.6/test/source/foo/_posts/bar/2008-12-12-topical-post.markdown000066400000000000000000000001321271741406300253420ustar00rootroot00000000000000--- layout: default title: Topical Post --- h1. {{ page.title }} This post has a topic. jekyll-3.1.6/test/source/index.html000066400000000000000000000006331271741406300172760ustar00rootroot00000000000000--- layout: default title: Tom Preston-Werner --- h1. Welcome to my site h2. Please read our {{ site.posts | size }} Posts {% assign first_post = site.posts.first %}

    {{ first_post.title }}

    {{ first_post.content }}
    jekyll-3.1.6/test/source/js/000077500000000000000000000000001271741406300157135ustar00rootroot00000000000000jekyll-3.1.6/test/source/js/coffeescript.coffee000066400000000000000000000003121271741406300215340ustar00rootroot00000000000000--- message: "I knew it!" --- $ -> list = [1, 2, 3, 4, 5] square = (x) -> x * x cube = (x) -> square(x) * x cubes = (math.cube num for num in list) alert "{{ page.message }}" if elvis? jekyll-3.1.6/test/source/pgp.key000066400000000000000000000001151271741406300165740ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) jekyll-3.1.6/test/source/products.yml000066400000000000000000000000651271741406300176660ustar00rootroot00000000000000- name: sugar price: 5.3 - name: salt price: 2.5 jekyll-3.1.6/test/source/properties.html000066400000000000000000000001451271741406300203610ustar00rootroot00000000000000--- foo: bar layout: default permalink: /properties/ title: Properties Page --- All the properties. jekyll-3.1.6/test/source/sitemap.xml000066400000000000000000000020411271741406300174600ustar00rootroot00000000000000--- layout: nil --- http://example.com {{ site.time | date: "%Y-%m-%d" }} daily 1.0 {% for post in site.posts %} http://example.com{{ post.url }}/ {{ post.date | date: "%Y-%m-%d" }} monthly 0.2 {% endfor %} {% for page in site.html_pages %} http://example.com{{ page.url }} {{ site.time | date: "%Y-%m-%d" }} {% if page.changefreq %}{{ page.changefreq }}{% endif %} {% if page.priority %}{{ page.priority }}{% endif %} {% endfor %} jekyll-3.1.6/test/source/static_files.html000066400000000000000000000002411271741406300206330ustar00rootroot00000000000000--- --- {% for file in site.static_files %} - {{ file.path }} last edited at {{ file.modified_time | date:"%H:%m" }} with extname {{ file.extname }}{% endfor %} jekyll-3.1.6/test/source/symlink-test/000077500000000000000000000000001271741406300177425ustar00rootroot00000000000000jekyll-3.1.6/test/source/symlink-test/_data000077700000000000000000000000001271741406300221362../_dataustar00rootroot00000000000000jekyll-3.1.6/test/source/symlink-test/symlinked-dir000077700000000000000000000000001271741406300233612../cssustar00rootroot00000000000000jekyll-3.1.6/test/source/symlink-test/symlinked-file000077700000000000000000000000001271741406300250042../index.htmlustar00rootroot00000000000000jekyll-3.1.6/test/source/unpublished.html000066400000000000000000000001401271741406300205020ustar00rootroot00000000000000--- layout: default title: Not published! published: false --- This should *not* be published! jekyll-3.1.6/test/source/win/000077500000000000000000000000001271741406300160745ustar00rootroot00000000000000jekyll-3.1.6/test/source/win/_posts/000077500000000000000000000000001271741406300174035ustar00rootroot00000000000000jekyll-3.1.6/test/source/win/_posts/2009-05-24-yaml-linebreak.markdown000066400000000000000000000001171271741406300250770ustar00rootroot00000000000000--- layout: post title: "Test title" tag: "Ruby" --- This is the contentjekyll-3.1.6/test/source/z_category/000077500000000000000000000000001271741406300174455ustar00rootroot00000000000000jekyll-3.1.6/test/source/z_category/_posts/000077500000000000000000000000001271741406300207545ustar00rootroot00000000000000jekyll-3.1.6/test/source/z_category/_posts/2008-9-23-categories.markdown000066400000000000000000000001411271741406300256200ustar00rootroot00000000000000--- layout: default title: Categories --- Categories _should_ work. Even if ordered after index.jekyll-3.1.6/test/test_ansi.rb000066400000000000000000000010141271741406300163110ustar00rootroot00000000000000require "helper" class TestAnsi < JekyllUnitTest context nil do setup do @subject = Jekyll::Utils::Ansi end Jekyll::Utils::Ansi::COLORS.each do |color, val| should "respond_to? #{color}" do assert @subject.respond_to?(color) end end should "be able to strip colors" do assert_equal @subject.strip(@subject.yellow(@subject.red("hello"))), "hello" end should "be able to detect colors" do assert @subject.has?(@subject.yellow("hello")) end end end jekyll-3.1.6/test/test_cleaner.rb000066400000000000000000000034451271741406300170020ustar00rootroot00000000000000require 'helper' class TestCleaner < JekyllUnitTest context "directory in keep_files" do setup do clear_dest 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 = fixture_site @site.keep_files = ['to_keep/child_dir'] @cleaner = Cleaner.new(@site) @cleaner.cleanup! end teardown do FileUtils.rm_rf(dest_dir('to_keep')) end should "keep the parent directory" do assert_exist dest_dir('to_keep') end should "keep the child directory" do assert_exist dest_dir('to_keep', 'child_dir') end should "keep the file in the directory in keep_files" do assert_exist dest_dir('to_keep', 'child_dir', 'index.html') end should "delete the file in the directory not in keep_files" do refute_exist dest_dir('to_keep', 'index.html') end end context "directory containing no files and non-empty directories" do setup do clear_dest FileUtils.mkdir_p(source_dir('no_files_inside', 'child_dir')) FileUtils.touch(source_dir('no_files_inside', 'child_dir', 'index.html')) @site = fixture_site @site.process @cleaner = Cleaner.new(@site) @cleaner.cleanup! end teardown do FileUtils.rm_rf(source_dir('no_files_inside')) FileUtils.rm_rf(dest_dir('no_files_inside')) end should "keep the parent directory" do assert_exist dest_dir('no_files_inside') end should "keep the child directory" do assert_exist dest_dir('no_files_inside', 'child_dir') end should "keep the file" do assert_exist source_dir('no_files_inside', 'child_dir', 'index.html') end end end jekyll-3.1.6/test/test_coffeescript.rb000066400000000000000000000021751271741406300200440ustar00rootroot00000000000000require 'helper' class TestCoffeeScript < JekyllUnitTest context "converting CoffeeScript" do setup do External.require_with_graceful_fail('jekyll-coffeescript') @site = fixture_site @site.process @test_coffeescript_file = dest_dir("js/coffeescript.js") @js_output = <<-JS (function() { $(function() { var cube, cubes, list, num, square; list = [1, 2, 3, 4, 5]; square = function(x) { return x * x; }; cube = function(x) { 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)); } return results; })(); if (typeof elvis !== "undefined" && elvis !== null) { return alert("I knew it!"); } }); }).call(this); JS end should "write a JS file in place" do assert_exist @test_coffeescript_file, "Can't find the converted CoffeeScript file in the dest_dir." end should "produce JS" do assert_equal @js_output, File.read(@test_coffeescript_file) end end end jekyll-3.1.6/test/test_collections.rb000066400000000000000000000140361271741406300177050ustar00rootroot00000000000000require 'helper' class TestCollections < JekyllUnitTest context "an evil collection" do setup do @collection = Jekyll::Collection.new(fixture_site, "../../etc/password") end should "sanitize the label name" do assert_equal @collection.label, "....etcpassword" end should "have a sanitized relative path name" do assert_equal @collection.relative_directory, "_....etcpassword" end should "have a sanitized full path" do assert_equal @collection.directory, source_dir("_....etcpassword") end end context "a simple collection" do setup do @collection = Jekyll::Collection.new(fixture_site, "methods") end should "sanitize the label name" do assert_equal @collection.label, "methods" end should "have default url template" do assert_equal @collection.url_template, "/:collection/:path:output_ext" end should "contain no docs when initialized" do assert_empty @collection.docs end should "know its relative directory" do assert_equal @collection.relative_directory, "_methods" end should "know the full path to itself on the filesystem" do assert_equal @collection.directory, source_dir("_methods") end context "when turned into Liquid" do should "have a label attribute" do assert_equal @collection.to_liquid["label"], "methods" end should "have a docs attribute" do assert_equal @collection.to_liquid["docs"], Array.new end should "have a directory attribute" do assert_equal @collection.to_liquid["directory"], source_dir("_methods") end should "have a relative_directory attribute" do assert_equal @collection.to_liquid["relative_directory"], "_methods" end should "have a output attribute" do assert_equal @collection.to_liquid["output"], false end end should "know whether it should be written or not" do assert_equal @collection.write?, false @collection.metadata['output'] = true assert_equal @collection.write?, true @collection.metadata.delete 'output' end end context "with no collections specified" do setup do @site = fixture_site @site.process end should "contain only the defaul collections" do refute_equal Hash.new, @site.collections refute_nil @site.collections end end context "a collection with permalink" do setup do @site = fixture_site({ "collections" => { "methods" => { "permalink" => "/awesome/:path/" } } }) @site.process @collection = @site.collections["methods"] end should "have custom url template" do assert_equal @collection.url_template, "/awesome/:path/" end end context "with a collection" do setup do @site = fixture_site({ "collections" => ["methods"] }) @site.process @collection = @site.collections["methods"] end should "create a Hash on Site with the label mapped to the instance of the Collection" do assert @site.collections.is_a?(Hash) refute_nil @site.collections["methods"] assert @site.collections["methods"].is_a? Jekyll::Collection end should "collects docs in an array on the Collection object" do assert @site.collections["methods"].docs.is_a? Array @site.collections["methods"].docs.each do |doc| assert doc.is_a? Jekyll::Document 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 refute_includes @collection.filtered_entries, "_do_not_read_me.md" end should "not include files which start with an underscore in a subdirectory" do refute_includes @collection.filtered_entries, "site/_dont_include_me_either.md" end should "not include the underscored files in the list of docs" do 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 context "with a collection with metadata" do setup do @site = fixture_site({ "collections" => { "methods" => { "foo" => "bar", "baz" => "whoo" } } }) @site.process @collection = @site.collections["methods"] end should "extract the configuration collection information as metadata" do assert_equal @collection.metadata, {"foo" => "bar", "baz" => "whoo"} end end context "in safe mode" do setup do @site = fixture_site({ "collections" => ["methods"], "safe" => true }) @site.process @collection = @site.collections["methods"] end should "not allow symlinks" do 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 refute_includes @collection.docs.map(&:relative_path), "_methods/um_hi.md" end end context "with dots in the filenames" do setup do @site = fixture_site({ "collections" => ["with.dots"], "safe" => true }) @site.process @collection = @site.collections["with.dots"] end should "exist" do refute_nil @collection end should "contain one document" do assert_equal 4, @collection.docs.size end should "allow dots in the filename" do assert_equal "_with.dots", @collection.relative_directory end should "read document in subfolders with dots" do assert @collection.docs.any? { |d| d.path.include?("all.dots") } end end end jekyll-3.1.6/test/test_command.rb000066400000000000000000000011711271741406300170010ustar00rootroot00000000000000require 'helper' class TestCommand < JekyllUnitTest context "when calling .add_build_options" do should "add common options" do cmd = Object.new 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 def site.process; raise Jekyll::Errors::FatalException; end error = assert_raises(SystemExit) { Command.process_site(site) } refute_equal 0, error.status end end end end jekyll-3.1.6/test/test_commands_serve.rb000066400000000000000000000051321271741406300203710ustar00rootroot00000000000000require "webrick" require "mercenary" require "helper" class TestCommandsServe < JekyllUnitTest def custom_opts(what) @cmd.send( :webrick_opts, what ) end context "with a program" do setup do @merc, @cmd = nil, Jekyll::Commands::Serve Mercenary.program(:jekyll) do |p| @merc = @cmd.init_with_program( p ) end end should "label itself" do assert_equal( @merc.name, :serve ) end should "have aliases" do assert_includes @merc.aliases, :s assert_includes @merc.aliases, :server end should "have a description" do refute_nil( @merc.description ) end should "have an action" do refute_empty( @merc.actions ) end should "not have an empty options set" do refute_empty( @merc.options ) end context "with custom options" do should "create a default set of mimetypes" do refute_nil custom_opts({})[ :MimeTypes ] end should "use user destinations" do assert_equal "foo", custom_opts({ "destination" => "foo" })[ :DocumentRoot ] end should "use user port" do # WHAT?!?!1 Over 9000? That's impossible. assert_equal 9001, custom_opts( { "port" => 9001 })[ :Port ] end context "verbose" do should "debug when verbose" do assert_equal custom_opts({ "verbose" => true })[:Logger].level, 5 end should "warn when not verbose" do assert_equal custom_opts({})[:Logger].level, 3 end end context "enabling ssl" do should "raise if enabling without key or cert" do assert_raises RuntimeError do custom_opts({ "ssl_key" => "foo" }) end assert_raises RuntimeError do custom_opts({ "ssl_key" => "foo" }) end end should "allow SSL with a key and cert" do expect(OpenSSL::PKey::RSA).to receive(:new).and_return("c2") expect(OpenSSL::X509::Certificate).to receive(:new).and_return("c1") allow(File).to receive(:read).and_return("foo") result = custom_opts({ "ssl_cert" => "foo", "source" => "bar", "enable_ssl" => true, "ssl_key" => "bar" }) assert result[:SSLEnable] assert_equal result[:SSLPrivateKey ], "c2" assert_equal result[:SSLCertificate], "c1" end end end end end jekyll-3.1.6/test/test_configuration.rb000066400000000000000000000356441271741406300202460ustar00rootroot00000000000000require 'helper' class TestConfiguration < JekyllUnitTest @@test_config = { "source" => new(nil).source_dir, "destination" => dest_dir } context ".from" do should "create a Configuration object" do assert_instance_of Configuration, Configuration.from({}) end should "merge input over defaults" do result = Configuration.from({"source" => "blah"}) refute_equal result["source"], Configuration::DEFAULTS["source"] assert_equal result["source"], "blah" end should "fix common mistakes" do result = Configuration.from({"paginate" => 0}) assert_nil result["paginate"], "Expected 'paginate' to be corrected to 'nil', but was #{result["paginate"].inspect}" end should "add default collections" do result = Configuration.from({}) assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext"}} end should "NOT backwards-compatibilize" do assert Configuration.from("watch" => true)["watch"], "Expected the 'watch' key to not be removed." end end context "#add_default_collections" do should "no-op if collections is nil" do result = Configuration[{"collections" => nil}].add_default_collections assert_nil result["collections"] end should "turn an array into a hash" do result = Configuration[{"collections" => %w{methods}}].add_default_collections assert_instance_of Hash, result["collections"] assert_equal result["collections"], {"posts" => {"output" => true}, "methods" => {}} end should "only assign collections.posts.permalink if a permalink is specified" do result = Configuration[{"permalink" => "pretty", "collections" => {}}].add_default_collections assert_equal result["collections"], {"posts" => {"output" => true, "permalink" => "/:categories/:year/:month/:day/:title/"}} result = Configuration[{"permalink" => nil, "collections" => {}}].add_default_collections assert_equal result["collections"], {"posts" => {"output" => true}} end should "forces posts to output" do result = Configuration[{"collections" => {"posts" => {"output" => false}}}].add_default_collections assert_equal result["collections"]["posts"]["output"], true end end context "#stringify_keys" do setup do @mixed_keys = Configuration[{ 'markdown' => 'kramdown', :permalink => 'date', 'baseurl' => '/', :include => ['.htaccess'], :source => './' }] @string_keys = Configuration[{ 'markdown' => 'kramdown', 'permalink' => 'date', 'baseurl' => '/', 'include' => ['.htaccess'], 'source' => './' }] end should "stringify symbol keys" do assert_equal @string_keys, @mixed_keys.stringify_keys end should "not mess with keys already strings" do assert_equal @string_keys, @string_keys.stringify_keys end end context "#config_files" do setup do @config = Configuration[{"source" => source_dir}] @no_override = {} @one_config_file = {"config" => "config.yml"} @multiple_files = {"config" => %w[config/site.yml config/deploy.toml configuration.yml]} end should "always return an array" do assert @config.config_files(@no_override).is_a?(Array) assert @config.config_files(@one_config_file).is_a?(Array) assert @config.config_files(@multiple_files).is_a?(Array) end should "return the default config path if no config files are specified" do assert_equal [source_dir("_config.yml")], @config.config_files(@no_override) end should "return .yaml if it exists but .yml does not" do 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 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 assert_equal %w[config.yml], @config.config_files(@one_config_file) end should "return an array of the config files if given many config files" do assert_equal %w[config/site.yml config/deploy.toml configuration.yml], @config.config_files(@multiple_files) end end context "#read_config_file" do setup do @config = Configuration[{"source" => source_dir('empty.yml')}] end should "not raise an error on empty files" do allow(SafeYAML).to receive(:load_file).with('empty.yml').and_return(false) Jekyll.logger.log_level = :warn @config.read_config_file('empty.yml') Jekyll.logger.log_level = :info end end context "#read_config_files" do setup do @config = Configuration[{"source" => source_dir}] end should "continue to read config files if one is empty" do allow(SafeYAML).to receive(:load_file).with('empty.yml').and_return(false) allow(SafeYAML).to receive(:load_file).with('not_empty.yml').and_return({'foo' => 'bar', 'include' => '', 'exclude' => ''}) Jekyll.logger.log_level = :warn read_config = @config.read_config_files(['empty.yml', 'not_empty.yml']) Jekyll.logger.log_level = :info assert_equal 'bar', read_config['foo'] end end context "#backwards_compatibilize" do setup do @config = Configuration[{ "auto" => true, "watch" => true, "server" => true, "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.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.key?("server") assert !@config.backwards_compatibilize.key?("server") end should "transform string exclude into an array" do 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.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.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 @config = Proc.new do |val| Configuration[{ 'paginate' => val }] end end should "sets an invalid 'paginate' value to nil" do assert_nil @config.call(0).fix_common_issues['paginate'] assert_nil @config.call(-1).fix_common_issues['paginate'] assert_nil @config.call(true).fix_common_issues['paginate'] end end context "loading configuration" do setup do @path = source_dir('_config.yml') @user_config = File.join(Dir.pwd, "my_config_file.yml") end should "fire warning with no _config.yml" do 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 site_configuration, Jekyll.configuration(@@test_config) end should "load configuration as hash" do allow(SafeYAML).to receive(:load_file).with(@path).and_return(Hash.new) allow($stdout).to receive(:puts).with("Configuration file: #{@path}") assert_equal site_configuration, Jekyll.configuration(@@test_config) end should "fire warning with bad config" do 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 site_configuration, Jekyll.configuration(@@test_config) end should "fire warning when user-specified config file isn't there" do 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 end should "not clobber YAML.load to the dismay of other libraries" do assert_equal :foo, YAML.load(':foo') # as opposed to: assert_equal ':foo', SafeYAML.load(':foo') end end context "loading config from external file" do setup do @paths = { :default => source_dir('_config.yml'), :other => source_dir('_config.live.yml'), :toml => source_dir('_config.dev.toml'), :empty => "" } end 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 site_configuration, Jekyll.configuration(@@test_config) end should "load different config if specified" do 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]}") Jekyll.configuration({ "config" => @paths[:other] }) assert_equal \ site_configuration({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration(@@test_config.merge({ "config" => @paths[:other] })) end should "load default config if path passed is empty" do allow(SafeYAML).to receive(:load_file).with(@paths[:default]).and_return({}) allow($stdout).to receive(:puts).with("Configuration file: #{@paths[:default]}") assert_equal \ site_configuration, Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:empty]] })) end should "successfully load a TOML file" do Jekyll.logger.log_level = :warn assert_equal \ site_configuration({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:toml]] })) Jekyll.logger.log_level = :info end should "load multiple config files" do 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 \ site_configuration, Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:default], @paths[:other], @paths[:toml]] })) end should "load multiple config files and last config should win" do 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 \ site_configuration({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration(@@test_config.merge({ "config" => [@paths[:default], @paths[:other]] })) end end context "#add_default_collections" do should "not do anything if collections is nil" do conf = Configuration[default_configuration].tap {|c| c['collections'] = nil } assert_equal conf.add_default_collections, conf assert_nil conf.add_default_collections['collections'] end should "converts collections to a hash if an array" do conf = Configuration[default_configuration].tap {|c| c['collections'] = ['docs'] } assert_equal conf.add_default_collections, conf.merge({ "collections" => { "docs" => {}, "posts" => { "output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext" }}}) end should "force collections.posts.output = true" do conf = Configuration[default_configuration].tap {|c| c['collections'] = {'posts' => {'output' => false}} } assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { "output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext" }}}) end should "set collections.posts.permalink if it's not set" do conf = Configuration[default_configuration] assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { "output" => true, "permalink" => "/:categories/:year/:month/:day/:title:output_ext" }}}) end should "leave collections.posts.permalink alone if it is set" do posts_permalink = "/:year/:title/" conf = Configuration[default_configuration].tap do |c| c['collections'] = { "posts" => { "permalink" => posts_permalink } } end assert_equal conf.add_default_collections, conf.merge({ "collections" => { "posts" => { "output" => true, "permalink" => posts_permalink }}}) end end end jekyll-3.1.6/test/test_convertible.rb000066400000000000000000000041601271741406300177000ustar00rootroot00000000000000require 'helper' require 'ostruct' class TestConvertible < JekyllUnitTest context "yaml front-matter" do setup do @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 should "parse the front-matter correctly" do ret = @convertible.read_yaml(@base, 'front_matter.erb') assert_equal({'test' => 'good'}, ret) end should "not parse if the front-matter is not at the start of the file" do ret = @convertible.read_yaml(@base, 'broken_front_matter1.erb') assert_equal({}, ret) end should "not parse if there is syntax error in front-matter" do name = 'broken_front_matter2.erb' out = capture_stderr do ret = @convertible.read_yaml(@base, name) assert_equal({}, ret) end assert_match(/YAML Exception|syntax error|Error reading file/, out) assert_match(/#{File.join(@base, name)}/, out) end should "not allow ruby objects in yaml" do out = capture_stderr do @convertible.read_yaml(@base, 'exploit_front_matter.erb') end refute_match /undefined class\/module DoesNotExist/, out end should "not parse if there is encoding error in file" do name = 'broken_front_matter3.erb' out = capture_stderr do ret = @convertible.read_yaml(@base, name, :encoding => 'utf-8') assert_equal({}, ret) end assert_match(/invalid byte sequence in UTF-8/, out) assert_match(/#{File.join(@base, name)}/, out) end should "parse the front-matter but show an error if permalink is empty" do name = 'empty_permalink.erb' assert_raises(Errors::InvalidPermalinkError) do @convertible.read_yaml(@base, name) end end should "parse the front-matter correctly whitout permalink" do out = capture_stderr do @convertible.read_yaml(@base, 'front_matter.erb') end refute_match(/Invalid permalink/, out) end end end jekyll-3.1.6/test/test_doctor_command.rb000066400000000000000000000023211271741406300203510ustar00rootroot00000000000000require 'helper' require 'jekyll/commands/doctor' class TestDoctorCommand < JekyllUnitTest context 'urls only differ by case' do setup do clear_dest end should 'return success on a valid site/page' do @site = Site.new(Jekyll.configuration({ "source" => File.join(source_dir, '/_urls_differ_by_case_valid'), "destination" => dest_dir })) @site.process output = capture_stderr do ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) assert_equal false, ret end assert_equal "", output end should 'return warning for pages only differing by case' do @site = Site.new(Jekyll.configuration({ "source" => File.join(source_dir, '/_urls_differ_by_case_invalid'), "destination" => dest_dir })) @site.process output = capture_stderr do ret = Jekyll::Commands::Doctor.urls_only_differ_by_case(@site) assert_equal true, ret end assert_includes output, "Warning: The following URLs only differ by case. On a case-insensitive file system one of the URLs will be overwritten by the other: #{dest_dir}/about/index.html, #{dest_dir}/About/index.html" end end end jekyll-3.1.6/test/test_document.rb000066400000000000000000000337711271741406300172140ustar00rootroot00000000000000require 'helper' 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 = 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 should "knows its extname" do assert_equal ".md", @document.extname end should "know its basename" do assert_equal "configuration.md", @document.basename end should "know its basename without extname" do assert_equal "configuration", @document.basename_without_ext end should "know whether its a yaml file" do assert_equal false, @document.yaml_file? end should "know its data" do assert_equal "Jekyll.configuration", @document.data["title"] assert_equal "foo.bar", @document.data["whatever"] end should "be jsonify-able" do page_json = @document.to_liquid.to_json parsed = JSON.parse(page_json) assert_equal "Jekyll.configuration", parsed["title"] assert_equal "foo.bar", parsed["whatever"] assert_equal nil, parsed["previous"] next_doc = parsed["next"] assert_equal "_methods/escape-+ #%20[].md", next_doc["path"] assert_equal "Jekyll.escape", next_doc["title"] next_prev_doc = next_doc["previous"] assert_equal "Jekyll.configuration", next_prev_doc["title"] assert_equal "_methods/configuration.md", next_prev_doc["path"] assert_equal "_methods/escape-+ #%20[].md", next_prev_doc["next"]["path"] assert_nil next_prev_doc["previous"] # nothing before Jekyll.configuration assert_nil next_prev_doc["next"]["next"] assert_nil next_prev_doc["next"]["previous"] assert_nil next_prev_doc["next"]["content"] assert_nil next_prev_doc["next"]["excerpt"] assert_nil next_prev_doc["next"]["output"] next_next_doc = next_doc["next"] assert_equal "Jekyll.sanitized_path", next_next_doc["title"] assert_equal "_methods/sanitized_path.md", next_next_doc["path"] assert_equal "_methods/escape-+ #%20[].md", next_next_doc["previous"]["path"] assert_equal "_methods/site/generate.md", next_next_doc["next"]["path"] assert_nil next_next_doc["next"]["next"] assert_nil next_next_doc["next"]["previous"] assert_nil next_next_doc["next"]["content"] assert_nil next_next_doc["next"]["excerpt"] assert_nil next_next_doc["next"]["output"] assert_nil next_next_doc["previous"]["next"] assert_nil next_next_doc["previous"]["previous"] assert_nil next_next_doc["previous"]["content"] assert_nil next_next_doc["previous"]["excerpt"] assert_nil next_next_doc["previous"]["output"] 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 = fixture_site({ "collections" => ["slides"], "defaults" => [{ "scope"=> {"path"=>"", "type"=>"slides"}, "values"=> { "nested"=> { "key"=>"myval", } } }] }) @site.process @document = @site.collections["slides"].docs.select{|d| d.is_a?(Document) }.first end should "know the frontmatter defaults" do 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 = fixture_site({ "collections" => ["slides"], "defaults" => [{ "scope"=> {"path"=>"", "type"=>"slides"}, "values"=> { "nested"=> { "test1"=>"default1", "test2"=>"default1" } } }] }) @site.process @document = @site.collections["slides"].docs[1] end should "override default values in the document frontmatter" do 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 = fixture_site({ "collections" => ["slides"], "defaults" => [{ "scope"=> {"path"=>"_slides", "type"=>"slides"}, "values"=> { "nested"=> { "key"=>"value123", } } }] }) @site.process @document = @site.collections["slides"].docs.first end should "know the frontmatter defaults" do 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 = fixture_site({ "collections" => ["slides"], "defaults" => [{ "scope"=> {"path"=>"somepath", "type"=>"slides"}, "values"=> { "nested"=> { "key"=>"myval", } } }] }) @site.process @document = @site.collections["slides"].docs.first end should "not know the specified frontmatter defaults" do 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 = fixture_site({ "collections" => ["slides"] }) @site.process @document = @site.collections["slides"].docs[2] @dest_file = dest_dir("slide/3/index.html") end should "know its permalink" do assert_equal "/slide/3/", @document.permalink end should "produce the right URL" do assert_equal "/slide/3/", @document.url 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" } }, "permalink" => "pretty" }) @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 should "honor the output extension of its permalink" do assert_equal ".html", @document.output_ext 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[7] @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 "a document in a collection with cased file name" do setup do @site = fixture_site({ "collections" => { "slides" => { "output" => true } } }) @site.process @document = @site.collections["slides"].docs[6] @dest_file = dest_dir("slides/example-slide-7.php") end should "be written out properly" do assert_exist @dest_file end should "produce the permalink as the url" do assert_equal "/slides/example-slide-7.php", @document.url end should "be written to the proper directory" do assert_equal @dest_file, @document.destination(dest_dir) end should "honor the output extension of its permalink" do assert_equal ".php", @document.output_ext 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 "document with a permalink with dots & a trailing slash" do setup do @site = fixture_site({"collections" => { "with.dots" => { "output" => true } }}) @site.process @document = @site.collections["with.dots"].docs.last @dest_file = dest_dir("with.dots", "permalink.with.slash.tho", "index.html") end should "yield an HTML document" do assert_equal @dest_file, @document.destination(dest_dir) end should "be written properly" do assert_exist @dest_file end should "get the right output_ext" do assert_equal ".html", @document.output_ext 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 end end jekyll-3.1.6/test/test_entry_filter.rb000066400000000000000000000067401271741406300201000ustar00rootroot00000000000000require 'helper' class TestEntryFilter < JekyllUnitTest context "Filtering entries" do setup do @site = Site.new(site_configuration) end should "filter entries" do ent1 = %w[foo.markdown bar.markdown baz.markdown #baz.markdown# .baz.markdow foo.markdown~ .htaccess _posts _pages] entries = EntryFilter.new(@site).filter(ent1) assert_equal %w[foo.markdown bar.markdown baz.markdown .htaccess], entries end should "filter entries with exclude" do excludes = %w[README TODO vendor/bundle] files = %w[index.html site.css .htaccess vendor] @site.exclude = excludes + ["exclude*"] assert_equal files, @site.reader.filter_entries(excludes + files + ["excludeA"]) end should "filter entries with exclude relative to site source" do excludes = %w[README TODO css] files = %w[index.html vendor/css .htaccess] @site.exclude = excludes assert_equal files, @site.reader.filter_entries(excludes + files + ["css"]) end should "filter excluded directory and contained files" do excludes = %w[README TODO css] files = %w[index.html .htaccess] @site.exclude = excludes assert_equal files, @site.reader.filter_entries(excludes + files + ["css", "css/main.css", "css/vendor.css"]) end should "not filter entries within include" do includes = %w[_index.html .htaccess include*] files = %w[index.html _index.html .htaccess includeA] @site.include = includes assert_equal files, @site.reader.filter_entries(files) end should "filter symlink entries when safe mode enabled" do 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.reader.filter_entries(files) end should "not filter symlink entries when safe mode disabled" do allow(File).to receive(:symlink?).with('symlink.js').and_return(true) files = %w[symlink.js] assert_equal files, @site.reader.filter_entries(files) end should "not include symlinks in safe mode" do site = Site.new(site_configuration('safe' => true)) site.reader.read_directories("symlink-test") assert_equal [], site.pages assert_equal [], site.static_files end should "include symlinks in unsafe mode" do 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 @site = Site.new(site_configuration) @filter = EntryFilter.new(@site) end should "return false with no glob patterns" do assert !@filter.glob_include?([], "a.txt") end should "return false with all not match path" do data = ["a*", "b?"] assert !@filter.glob_include?(data, "ca.txt") assert !@filter.glob_include?(data, "ba.txt") end should "return true with match path" do data = ["a*", "b?", "**/a*"] assert @filter.glob_include?(data, "a.txt") assert @filter.glob_include?(data, "ba") assert @filter.glob_include?(data, "c/a/a.txt") assert @filter.glob_include?(data, "c/a/b/a.txt") end should "match even if there is no leading slash" do data = ['vendor/bundle'] assert @filter.glob_include?(data, '/vendor/bundle') assert @filter.glob_include?(data, 'vendor/bundle') end end end jekyll-3.1.6/test/test_excerpt.rb000066400000000000000000000100331271741406300170320ustar00rootroot00000000000000require 'helper' class TestExcerpt < JekyllUnitTest def setup_post(file) Document.new(@site.in_source_dir(File.join('_posts', file)), { site: @site, collection: @site.posts }).tap(&:read) end def do_render(document) @site.layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")} document.output = Jekyll::Renderer.new(@site, document, @site.site_payload).run end context "With extraction disabled" do setup do clear_dest @site = fixture_site('excerpt_separator' => '') @post = setup_post("2013-07-22-post-excerpt-with-layout.markdown") end should "not be generated" do refute @post.generate_excerpt? end end context "An extracted excerpt" do setup do clear_dest @site = fixture_site @post = setup_post("2013-07-22-post-excerpt-with-layout.markdown") @excerpt = @post.data['excerpt'] end context "#include(string)" do setup do @excerpt.output = "Here is a fake output stub" end should "return true only if an excerpt output contains a specified string" do assert @excerpt.include?("fake output") refute @excerpt.include?("real output") end end context "#id" do should "contain the UID for the post" do assert_equal @excerpt.id, "#{@post.id}#excerpt" end should "return a string" do assert_same @post.id.class, String end end context "#to_s" do should "return rendered output" do assert_equal @excerpt.output, @excerpt.to_s end should "return its output if output present" do @excerpt.output = "Fake Output" assert_equal @excerpt.output, @excerpt.to_s end end context "#inspect" do should "contain the excerpt id as a shorthand string identifier" do assert_equal @excerpt.inspect, "" end should "return a string" do assert_same @post.id.class, String end end 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/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 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 end context "#content" do context "before render" do should "be the first paragraph of the page" do assert_equal "First paragraph with [link ref][link].\n\n[link]: http://www.jekyllrb.com/", @excerpt.content end should "contain any refs at the bottom of the page" do assert @excerpt.content.include?("[link]: http://www.jekyllrb.com/") end end context "after render" do setup do @rendered_post = @post.dup do_render(@rendered_post) @extracted_excerpt = @rendered_post.data['excerpt'] end should "be the first paragraph of the page" do assert_equal "

    First paragraph with link ref.

    \n\n", @extracted_excerpt.output end should "link properly" do assert @extracted_excerpt.content.include?("http://www.jekyllrb.com/") end 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 jekyll-3.1.6/test/test_excerpt_drop.rb000066400000000000000000000020671271741406300200660ustar00rootroot00000000000000require 'helper' class TestExcerptDrop < JekyllUnitTest context "an excerpt drop" do setup do @site = fixture_site @site.read @doc = @site.docs_to_write.find { |d| !d.data['layout'].nil? } @doc_drop = @doc.to_liquid @excerpt = @doc.data['excerpt'] @excerpt_drop = @excerpt.to_liquid end should "have the right thing" do assert @doc.is_a? Jekyll::Document assert @doc_drop.is_a? Jekyll::Drops::DocumentDrop assert @excerpt.is_a? Jekyll::Excerpt assert @excerpt_drop.is_a? Jekyll::Drops::ExcerptDrop end should "not have an excerpt" do assert_nil @excerpt.data['excerpt'] assert @excerpt_drop.class.invokable? 'excerpt' assert_nil @excerpt_drop['excerpt'] end should "inherit the layout for the drop but not the excerpt" do assert_nil @excerpt.data['layout'] assert_equal @excerpt_drop['layout'], @doc_drop['layout'] end should "inherit values from the document" do assert_equal @excerpt_drop.keys.sort, @doc_drop.keys.sort end end end jekyll-3.1.6/test/test_filters.rb000066400000000000000000000407661271741406300170500ustar00rootroot00000000000000# coding: utf-8 require 'helper' class TestFilters < JekyllUnitTest class JekyllFilter include Jekyll::Filters attr_accessor :site, :context def initialize(opts = {}) @site = Jekyll::Site.new(Jekyll.configuration(opts.merge('skip_config_files' => true))) @context = Liquid::Context.new({}, {}, { :site => @site }) end end context "filters" do 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 = [ { "color" => "red", "size" => "large" }, { "color" => "red", "size" => "medium" }, { "color" => "blue", "size" => "medium" } ] end should "markdownify with simple string" do assert_equal "

    something really simple

    \n", @filter.markdownify("something **really** simple") end context "smartify filter" do should "convert quotes and typographic characters" do assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) end should "escapes special characters when configured to do so" do kramdown = JekyllFilter.new({:kramdown => {:entity_output => :symbolic}}) assert_equal "“This filter’s test…”", kramdown.smartify(%q{"This filter's test..."}) end should "convert HTML entities to unicode characters" do assert_equal "’", @filter.smartify("’") assert_equal "“", @filter.smartify("“") end should "allow raw HTML passthrough" do assert_equal "Span HTML is not escaped", @filter.smartify("Span HTML is not escaped") assert_equal "
    Block HTML is not escaped
    ", @filter.smartify("
    Block HTML is not escaped
    ") end should "escape special characters" do assert_equal "3 < 4", @filter.smartify("3 < 4") assert_equal "5 > 4", @filter.smartify("5 > 4") assert_equal "This & that", @filter.smartify("This & that") end 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 should "convert array to sentence string with one arg" do assert_equal "1", @filter.array_to_sentence_string([1]) assert_equal "chunky", @filter.array_to_sentence_string(["chunky"]) end should "convert array to sentence string with two args" do assert_equal "1 and 2", @filter.array_to_sentence_string([1, 2]) assert_equal "chunky and bacon", @filter.array_to_sentence_string(["chunky", "bacon"]) end should "convert array to sentence string with multiple args" do assert_equal "1, 2, 3, and 4", @filter.array_to_sentence_string([1, 2, 3, 4]) assert_equal "chunky, bacon, bits, and pieces", @filter.array_to_sentence_string(["chunky", "bacon", "bits", "pieces"]) end context "date filters" do context "with Time object" do should "format a date with short format" do assert_equal "27 Mar 2013", @filter.date_to_string(@sample_time) end should "format a date with long format" do assert_equal "27 March 2013", @filter.date_to_long_string(@sample_time) end should "format a time with xmlschema" do 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) 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 context "with String object" do should "format a date with short format" do assert_equal "11 Sep 2001", @filter.date_to_string(@time_as_string) end should "format a date with long format" do assert_equal "11 September 2001", @filter.date_to_long_string(@time_as_string) end should "format a time with xmlschema" do 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) end end context "with a Numeric object" do should "format a date with short format" do assert_equal "10 May 2014", @filter.date_to_string(@time_as_numeric) end should "format a date with long format" do assert_equal "10 May 2014", @filter.date_to_long_string(@time_as_numeric) end should "format a time with xmlschema" do assert_match /2014-05-10T00:10:07/, @filter.date_to_xmlschema(@time_as_numeric) end should "format a time according to RFC-822" do assert_equal "Sat, 10 May 2014 00:10:07 +0000", @filter.date_to_rfc822(@time_as_numeric) end end end should "escape xml with ampersands" do assert_equal "AT&T", @filter.xml_escape("AT&T") assert_equal "<code>command &lt;filename&gt;</code>", @filter.xml_escape("command <filename>") end should "not error when xml escaping nil" do assert_equal "", @filter.xml_escape(nil) end should "escape space as plus" do assert_equal "my+things", @filter.cgi_escape("my things") end should "escape special characters" do assert_equal "hey%21", @filter.cgi_escape("hey!") end should "escape space as %20" do assert_equal "my%20things", @filter.uri_escape("my things") end context "jsonify filter" do should "convert hash to json" do assert_equal "{\"age\":18}", @filter.jsonify({:age => 18}) end should "convert array to json" do assert_equal "[1,2]", @filter.jsonify([1, 2]) assert_equal "[{\"name\":\"Jack\"},{\"name\":\"Smith\"}]", @filter.jsonify([{:name => 'Jack'}, {:name => 'Smith'}]) end should "convert drop to json" do @filter.site.read expected = { "path" => "_posts/2008-02-02-published.markdown", "previous" => nil, "output" => nil, "content" => "This should be published.\n", "id" => "/publish_test/2008/02/02/published", "url" => "/publish_test/2008/02/02/published.html", "relative_path" => "_posts/2008-02-02-published.markdown", "collection" => "posts", "excerpt" => "

    This should be published.

    \n", "draft" => false, "categories" => [ "publish_test" ], "layout" => "default", "title" => "Publish", "category" => "publish_test", "date" => "2008-02-02 00:00:00 +0000", "slug" => "published", "ext" => ".markdown", "tags" => [] } actual = JSON.parse(@filter.jsonify(@filter.site.docs_to_write.first.to_liquid)) next_doc = actual.delete("next") refute_nil next_doc assert next_doc.is_a?(Hash), "doc.next should be an object" assert_equal expected, actual end should "convert drop with drops to json" do @filter.site.read actual = @filter.jsonify(@filter.site.to_liquid) assert_equal JSON.parse(actual)["jekyll"], { "environment" => "development", "version" => Jekyll::VERSION } 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 should "successfully group array of Jekyll::Page's" do @filter.site.process grouping = @filter.group_by(@filter.site.pages, "layout") grouping.each do |g| assert ["default", "nil", ""].include?(g["name"]), "#{g['name']} isn't a valid grouping." case g["name"] when "default" assert g["items"].is_a?(Array), "The list of grouped items for 'default' is not an Array." assert_equal 5, g["items"].size when "nil" assert g["items"].is_a?(Array), "The list of grouped items for 'nil' is not an Array." assert_equal 2, g["items"].size when "" assert g["items"].is_a?(Array), "The list of grouped items for '' is not an Array." assert_equal 13, g["items"].size end end end end context "where filter" do should "return any input that is not an array" do 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 should "return sorted strings" do assert_equal ["10", "2"], @filter.sort(["10", "2"]) assert_equal [{"a" => "10"}, {"a" => "2"}], @filter.sort([{"a" => "10"}, {"a" => "2"}], "a") assert_equal ["FOO", "Foo", "foo"], @filter.sort(["foo", "Foo", "FOO"]) assert_equal ["_foo", "foo", "foo_"], @filter.sort(["foo_", "_foo", "foo"]) # Cyrillic assert_equal ["ВУЗ", "Вуз", "вуз"], @filter.sort(["Вуз", "вуз", "ВУЗ"]) assert_equal ["_вуз", "вуз", "вуз_"], @filter.sort(["вуз_", "_вуз", "вуз"]) # Hebrew assert_equal ["אלף", "בית"], @filter.sort(["בית", "אלף"]) end should "return sorted by property array" do assert_equal [{"a" => 1}, {"a" => 2}, {"a" => 3}, {"a" => 4}], @filter.sort([{"a" => 4}, {"a" => 3}, {"a" => 1}, {"a" => 2}], "a") end should "return sorted by property array with nils first" do ary = [{"a" => 2}, {"b" => 1}, {"a" => 1}] assert_equal [{"b" => 1}, {"a" => 1}, {"a" => 2}], @filter.sort(ary, "a") assert_equal @filter.sort(ary, "a"), @filter.sort(ary, "a", "first") end should "return sorted by property array with nils last" do assert_equal [{"a" => 1}, {"a" => 2}, {"b" => 1}], @filter.sort([{"a" => 2}, {"b" => 1}, {"a" => 1}], "a", "last") end end context "inspect filter" do should "return a HTML-escaped string representation of an object" do assert_equal "{"<a>"=>1}", @filter.inspect({ "" => 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 context "sample filter" do should "return a random item from the array" do input = %w(hey there bernie) assert_includes input, @filter.sample(input) end should "allow sampling of multiple values (n > 1)" do input = %w(hey there bernie) @filter.sample(input, 2).each do |val| assert_includes input, val end end end end end jekyll-3.1.6/test/test_front_matter_defaults.rb000066400000000000000000000116371271741406300217660ustar00rootroot00000000000000require 'helper' class TestFrontMatterDefaults < JekyllUnitTest context "A site with full front matter defaults" do setup do @site = fixture_site({ "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 = fixture_site({ "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 = fixture_site({ "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 = fixture_site({ "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 = fixture_site({ "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 = fixture_site({ "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 = fixture_site({ "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 context "A site with front matter defaults with quoted date" do setup do @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, "defaults" => [{ "values" => { "date" => "2015-01-01 00:00:01" } }] })) end should "not raise error" do @site.process end should "parse date" do @site.process date = Time.parse("2015-01-01 00:00:01") assert @site.pages.find { |page| page.data["date"] == date } assert @site.posts.find { |page| page.data["date"] == date } end end end jekyll-3.1.6/test/test_generated_site.rb000066400000000000000000000050041271741406300203440ustar00rootroot00000000000000require 'helper' class TestGeneratedSite < JekyllUnitTest context "generated sites" do setup do clear_dest @site = fixture_site @site.process @index = File.read(dest_dir('index.html')) end should "ensure post count is as expected" do assert_equal 49, @site.posts.size end should "insert site.posts into the index" do assert @index.include?("#{@site.posts.size} Posts") end should "render latest post's content" do assert @index.include?(@site.posts.last.content) end should "hide unpublished posts" do published = Dir[dest_dir('publish_test/2008/02/02/*.html')].map {|f| File.basename(f)} assert_equal 1, published.size assert_equal "published.html", published.first end should "hide unpublished page" do refute_exist dest_dir('/unpublished.html') end should "not copy _posts directory" do refute_exist dest_dir('_posts') end should "process a page with a folder permalink properly" do about = @site.pages.find {|page| page.name == 'about.html' } assert_equal dest_dir('about', 'index.html'), about.destination(dest_dir) assert_exist dest_dir('about', 'index.html') end should "process other static files and generate correct permalinks" do assert_exist dest_dir('contacts.html') assert_exist dest_dir('dynamic_file.php') 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 #{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 end context "generating limited posts" do setup do clear_dest @site = fixture_site("limit_posts" => 5) @site.process @index = File.read(dest_dir('index.html')) end should "generate only the specified number of posts" do assert_equal 5, @site.posts.size end should "ensure limit posts is 0 or more" do assert_raises ArgumentError do clear_dest @site = fixture_site("limit_posts" => -1) end end should "acceptable limit post is 0" do clear_dest assert fixture_site("limit_posts" => 0), "Couldn't create a site with limit_posts=0." end end end jekyll-3.1.6/test/test_kramdown.rb000066400000000000000000000072261271741406300172140ustar00rootroot00000000000000# encoding: UTF-8 require 'helper' class TestKramdown < JekyllUnitTest context "kramdown" do setup do @config = { 'markdown' => 'kramdown', 'kramdown' => { 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo', 'entity_output' => 'as_char', 'toc_levels' => '1..6', 'auto_ids' => false, 'footnote_nr' => 1, 'syntax_highlighter_opts' => { 'bold_every' => 8, 'css' => :class } } } @config = Jekyll.configuration(@config) @markdown = Converters::Markdown.new( @config ) end should "run Kramdown" do assert_equal "

    Some Header

    ", @markdown.convert('# Some Header #').strip end context "when asked to convert smart quotes" do should "convert" do assert_match %r!

    (“|“)Pit(’|’)hy(”|”)<\/p>!, @markdown.convert(%{"Pit'hy"}).strip end should "support custom types" do override = { "highlighter" => nil, 'kramdown' => { 'smart_quotes' => 'lsaquo,rsaquo,laquo,raquo' } } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) assert_match %r!

    («|«)Pit(›|›)hy(»|»)<\/p>!, \ markdown.convert(%{"Pit'hy"}).strip end end should "render fenced code blocks with syntax highlighting" do result = nokogiri_fragment(@markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) ~~~ruby puts "Hello World" ~~~ MARKDOWN selector = "div.highlighter-rouge>pre.highlight>code" refute result.css(selector).empty? end context "when a custom highlighter is chosen" do should "use the chosen highlighter if it's available" do override = { "highlighter" => nil, "markdown" => "kramdown", "kramdown" => { "syntax_highlighter" => :coderay } } markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) ~~~ruby puts "Hello World" ~~~ MARKDOWN selector = "div.highlighter-coderay>div.CodeRay>div.code>pre" refute result.css(selector).empty? end should "support legacy enable_coderay... for now" do override = { "markdown" => "kramdown", "kramdown" => { "enable_coderay" => true, } } @config.delete("highlighter") @config["kramdown"].delete("syntax_highlighter") markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override)) result = nokogiri_fragment(markdown.convert(Utils.strip_heredoc <<-MARKDOWN)) ~~~ruby puts "Hello World" ~~~ MARKDOWN selector = "div.highlighter-coderay>div.CodeRay>div.code>pre" refute result.css(selector).empty?, "pre tag should exist" end end should "move coderay to syntax_highlighter_opts" do original = Kramdown::Document.method(:new) markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, { "higlighter" => nil, "markdown" => "kramdown", "kramdown" => { "syntax_highlighter" => "coderay", "coderay" => { "hello" => "world" } } })) expect(Kramdown::Document).to receive(:new) do |arg1, hash| assert_equal hash["syntax_highlighter_opts"]["hello"], "world" original.call(arg1, hash) end markdown.convert("hello world") end end end jekyll-3.1.6/test/test_layout_reader.rb000066400000000000000000000020361271741406300202230ustar00rootroot00000000000000require 'helper' class TestLayoutReader < JekyllUnitTest context "reading layouts" do setup do config = Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir}) @site = fixture_site(config) end should "read layouts" do layouts = LayoutReader.new(@site).read assert_equal ["default", "simple", "post/simple"].sort, layouts.keys.sort end context "when no _layouts directory exists in CWD" do should "know to use the layout directory relative to the site source" do assert_equal LayoutReader.new(@site).layout_directory, source_dir("_layouts") end end context "when a _layouts directory exists in CWD" do setup do 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 assert_equal LayoutReader.new(@site).layout_directory, source_dir("blah/_layouts") end end end end jekyll-3.1.6/test/test_liquid_extensions.rb000066400000000000000000000015171271741406300211350ustar00rootroot00000000000000require 'helper' class TestLiquidExtensions < JekyllUnitTest context "looking up a variable in a Liquid context" do class SayHi < Liquid::Tag include Jekyll::LiquidExtensions def initialize(tag_name, markup, tokens) @markup = markup.strip end def render(context) "hi #{lookup_variable(context, @markup)}" end end Liquid::Template.register_tag('say_hi', SayHi) setup do @template = Liquid::Template.parse("{% say_hi page.name %}") # Parses and compiles the template end should "extract the var properly" do assert_equal @template.render({'page' => {'name' => 'tobi'}}), 'hi tobi' end should "return the variable name if the value isn't there" do assert_equal @template.render({'page' => {'title' => 'tobi'}}), 'hi page.name' end end end jekyll-3.1.6/test/test_liquid_renderer.rb000066400000000000000000000011471271741406300205430ustar00rootroot00000000000000require '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 jekyll-3.1.6/test/test_log_adapter.rb000066400000000000000000000077371271741406300176620ustar00rootroot00000000000000require 'helper' 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 should "set the writers logging level" do subject = Jekyll::LogAdapter.new(LoggerDouble.new) subject.log_level = :error assert_equal Jekyll::LogAdapter::LOG_LEVELS[:error], subject.writer.level 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) allow(writer).to receive(:debug).with('topic '.rjust(20) + 'log message').and_return(true) assert logger.debug('topic', 'log message') end end context "#info" do should "call #info on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) allow(writer).to receive(:info).with('topic '.rjust(20) + 'log message').and_return(true) assert logger.info('topic', 'log message') end end context "#warn" do should "call #warn on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) allow(writer).to receive(:warn).with('topic '.rjust(20) + 'log message').and_return(true) assert logger.warn('topic', 'log message') end end context "#error" do should "call #error on writer return true" do writer = LoggerDouble.new logger = Jekyll::LogAdapter.new(writer) allow(writer).to receive(:error).with('topic '.rjust(20) + 'log message').and_return(true) assert logger.error('topic', 'log message') end end context "#abort_with" do should "call #error and abort" do logger = Jekyll::LogAdapter.new(LoggerDouble.new) 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 jekyll-3.1.6/test/test_new_command.rb000066400000000000000000000063001271741406300176510ustar00rootroot00000000000000require 'helper' require 'jekyll/commands/new' class TestNewCommand < JekyllUnitTest def dir_contents(path) Dir["#{path}/**/*"].each do |file| file.gsub! path, '' end end def site_template File.expand_path("../lib/site_template", File.dirname(__FILE__)) end context 'when args contains a path' do setup do @path = 'new-site' @args = [@path] @full_path = File.expand_path(@path, Dir.pwd) end teardown do FileUtils.rm_r @full_path end should 'create a new directory' do refute_exist @full_path Jekyll::Commands::New.process(@args) assert_exist @full_path end should 'display a success message' do 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 static_template_files = dir_contents(site_template).reject do |f| File.extname(f) == '.erb' end capture_stdout { Jekyll::Commands::New.process(@args) } new_site_files = dir_contents(@full_path).reject do |f| File.extname(f) == '.markdown' end assert_same_elements static_template_files, new_site_files end should 'process any ERB files' do erb_template_files = dir_contents(site_template).select do |f| File.extname(f) == '.erb' end stubbed_date = '2013-01-01' allow_any_instance_of(Time).to receive(:strftime) { stubbed_date } erb_template_files.each do |f| f.chomp! '.erb' f.gsub! '0000-00-00', stubbed_date end capture_stdout { Jekyll::Commands::New.process(@args) } new_site_files = dir_contents(@full_path).select do |f| erb_template_files.include? f end 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 setup do @site_name_with_spaces = 'new site name' @multiple_args = @site_name_with_spaces.split end teardown do FileUtils.rm_r File.expand_path(@site_name_with_spaces, Dir.pwd) end should 'create a new directory' do refute_exist @site_name_with_spaces capture_stdout { Jekyll::Commands::New.process(@multiple_args) } assert_exist @site_name_with_spaces end end context 'when no args are given' do setup do @empty_args = [] end should 'raise an ArgumentError' do exception = assert_raises ArgumentError do Jekyll::Commands::New.process(@empty_args) end assert_equal 'You must specify a path.', exception.message end end end jekyll-3.1.6/test/test_page.rb000066400000000000000000000253351271741406300163070ustar00rootroot00000000000000require 'helper' class TestPage < JekyllUnitTest def setup_page(*args) dir, file = args dir, file = ['', dir] if file.nil? @page = Page.new(@site, source_dir, dir, file) end def do_render(page) layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html") } page.render(layouts, @site.site_payload) end context "A Page" do setup do clear_dest @site = Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir, "skip_config_files" => true })) end context "processing pages" do should "create url based on filename" do @page = setup_page('contacts.html') assert_equal "/contacts.html", @page.url end should "not published when published yaml is false" do @page = setup_page("unpublished.html") assert_equal false, @page.published? end should "create url with non-alphabetic characters" do @page = setup_page('+', '%# +.md') assert_equal "/+/%25%23%20+.html", @page.url end context "in a directory hierarchy" do should "create url based on filename" do @page = setup_page('/contacts', 'bar.html') assert_equal "/contacts/bar.html", @page.url end should "create index url based on filename" do @page = setup_page('/contacts', 'index.html') assert_equal "/contacts/", @page.url end end should "deal properly with extensions" do @page = setup_page('deal.with.dots.html') assert_equal ".html", @page.ext end should "deal properly with non-html extensions" do @page = setup_page('dynamic_page.php') @dest_file = dest_dir("dynamic_page.php") assert_equal ".php", @page.ext assert_equal "dynamic_page", @page.basename assert_equal "/dynamic_page.php", @page.url assert_equal @dest_file, @page.destination(dest_dir) end 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 @dest_file, @page.destination(dest_dir) end should "make properties accessible through #[]" do page = setup_page('properties.html') attrs = { content: "All the properties.\n", dir: "/properties/", excerpt: nil, foo: 'bar', layout: 'default', name: "properties.html", path: "properties.html", permalink: '/properties/', published: nil, title: 'Properties Page', url: "/properties/" } attrs.each do |attr, val| attr_str = attr.to_s result = page[attr_str] assert_equal val, result, "For :" end end context "with pretty permalink style" do setup do @site.permalink_style = :pretty end 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 @page = setup_page('index.html') assert_equal '/', @page.dir end context "in a directory hierarchy" do should "create url based on filename" do @page = setup_page('/contacts', 'bar.html') assert_equal "/contacts/bar/", @page.url end should "create index url based on filename" do @page = setup_page('/contacts', 'index.html') assert_equal "/contacts/", @page.url end should "return dir correctly" do @page = setup_page('/contacts', 'bar.html') assert_equal '/contacts/bar/', @page.dir end should "return dir correctly for index page" do @page = setup_page('/contacts', 'index.html') assert_equal '/contacts/', @page.dir end end end 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 should "return dir correctly" do assert_equal '/', setup_page('contacts.html').dir assert_equal '/contacts/', setup_page('contacts/bar.html').dir assert_equal '/contacts/', setup_page('contacts/index.html').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 assert_equal '/', setup_page('contacts.html').dir assert_equal '/contacts/', setup_page('contacts/index.html').dir assert_equal '/contacts/', setup_page('contacts/bar.html').dir end end should "respect permalink in yaml front matter" do file = "about.html" @page = setup_page(file) assert_equal "/about/", @page.permalink assert_equal @page.permalink, @page.url assert_equal "/about/", @page.dir end should "return nil permalink if no permalink exists" do @page = setup_page('') assert_equal nil, @page.permalink end should "not be writable outside of destination" do unexpected = File.expand_path("../../../baddie.html", dest_dir) File.delete unexpected if File.exist?(unexpected) page = setup_page("exploit.md") do_render(page) page.write(dest_dir) refute_exist unexpected end end context "with specified layout of nil" do setup do @page = setup_page('sitemap.xml') end should "layout of nil is respected" do assert_equal "nil", @page.data["layout"] end end context "rendering" do setup do clear_dest end should "write properly" do page = setup_page('contacts.html') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('contacts.html') end should "write even when the folder name is plus and permalink has +" do page = setup_page('+', 'foo.md') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir), "#{dest_dir} should be a directory" assert_exist dest_dir('+', 'plus+in+url.html') end should "write even when permalink has '%# +'" do page = setup_page('+', '%# +.md') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('+', '%# +.html') end should "write properly without html extension" do page = setup_page('contacts.html') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('contacts', 'index.html') end should "support .htm extension and respects that" do page = setup_page('contacts.htm') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('contacts', 'index.htm') end should "support .xhtml extension and respects that" do page = setup_page('contacts.xhtml') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('contacts', 'index.xhtml') end should "write properly with extension different from html" do page = setup_page("sitemap.xml") page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert_equal "/sitemap.xml", page.url assert_nil page.url[/\.html$/] assert File.directory?(dest_dir) assert_exist dest_dir('sitemap.xml') end should "write dotfiles properly" do page = setup_page('.htaccess') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('.htaccess') end context "in a directory hierarchy" do should "write properly the index" do page = setup_page('/contacts', 'index.html') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('contacts', 'index.html') end should "write properly" do page = setup_page('/contacts', 'bar.html') do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('contacts', 'bar.html') end should "write properly without html extension" do page = setup_page('/contacts', 'bar.html') page.site.permalink_style = :pretty do_render(page) page.write(dest_dir) assert File.directory?(dest_dir) assert_exist dest_dir('contacts', 'bar', 'index.html') end end end end end jekyll-3.1.6/test/test_path_sanitization.rb000066400000000000000000000020101271741406300211040ustar00rootroot00000000000000require 'helper' class TestPathSanitization < JekyllUnitTest context "on Windows with absolute source" do setup do @source = "C:/Users/xmr/Desktop/mpc-hc.org" @dest = "./_site/" 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) end should "strip just the initial drive name" do assert_equal "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd", Jekyll.sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd") end end should "escape tilde" do assert_equal source_dir("~hi.txt"), Jekyll.sanitized_path(source_dir, "~hi.txt") assert_equal source_dir("files", "~hi.txt"), Jekyll.sanitized_path(source_dir, "files/../files/~hi.txt") end should "remove path traversals" do assert_equal source_dir("files", "hi.txt"), Jekyll.sanitized_path(source_dir, "f./../../../../../../files/hi.txt") end end jekyll-3.1.6/test/test_plugin_manager.rb000066400000000000000000000020461271741406300203550ustar00rootroot00000000000000require '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 jekyll-3.1.6/test/test_rdiscount.rb000066400000000000000000000017331271741406300174010ustar00rootroot00000000000000require 'helper' 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' => { 'toc_token' => '{:toc}', 'extensions' => [ 'smart', 'generate_toc' ], } } @markdown = Converters::Markdown.new config end should "pass rdiscount extensions" do assert_equal "

    “smart”

    ", @markdown.convert('"smart"').strip end should "render toc" do toc = <<-TOC

    Header 1

    Header 2

    TOC assert_equal toc.strip, @markdown.convert("# Header 1\n\n## Header 2\n\n{:toc}").strip end end end jekyll-3.1.6/test/test_redcarpet.rb000066400000000000000000000051611271741406300173370ustar00rootroot00000000000000require 'helper' class TestRedcarpet < JekyllUnitTest context "redcarpet" do setup do if jruby? then skip( "JRuby does not perform well with CExt, test disabled." ) end @config = { 'markdown' => 'redcarpet', 'redcarpet' => { 'extensions' => [ 'smart', 'strikethrough', 'filter_html' ] } } @markdown = Converters::Markdown.new @config end should "pass redcarpet options" do assert_equal "

    Some Header

    ", @markdown.convert('# Some Header #').strip end should "pass redcarpet SmartyPants options" do assert_equal "

    “smart”

    ", @markdown.convert('"smart"').strip end should "pass redcarpet extensions" do assert_equal "

    deleted

    ", @markdown.convert('~~deleted~~').strip end should "pass redcarpet render options" do assert_equal "

    bad code not here: i am bad

    ", @markdown.convert('**bad code not here**: ').strip end context "with pygments enabled" do setup do @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => 'pygments' }) end should "render fenced code blocks with syntax highlighting" do assert_equal "
    puts "Hello world"\n
    ", @markdown.convert( <<-EOS ```ruby puts "Hello world" ``` EOS ).strip end end context "with rouge enabled" do setup do @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => 'rouge' }) end should "render fenced code blocks with syntax highlighting" do assert_equal "
    puts \"Hello world\"\n
    ", @markdown.convert( <<-EOS ```ruby puts "Hello world" ``` EOS ).strip end end context "without any highlighter" do setup do @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => nil }) end should "render fenced code blocks without syntax highlighting" do assert_equal "
    puts "Hello world"\n
    ", @markdown.convert( <<-EOS ```ruby puts "Hello world" ``` EOS ).strip end end end end jekyll-3.1.6/test/test_regenerator.rb000066400000000000000000000227351271741406300177110ustar00rootroot00000000000000require '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_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 jekyll-3.1.6/test/test_related_posts.rb000066400000000000000000000035711271741406300202410ustar00rootroot00000000000000require 'helper' class TestRelatedPosts < JekyllUnitTest context "building related posts without lsi" do setup do @site = fixture_site end should "use the most recent posts for related posts" do @site.reset @site.read last_post = @site.posts.last related_posts = Jekyll::RelatedPosts.new(last_post).build 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 if jruby? skip( "JRuby does not perform well with CExt, test disabled." ) end allow_any_instance_of(Jekyll::RelatedPosts).to receive(:display) @site = fixture_site({ "lsi" => true }) @site.reset @site.read 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 end jekyll-3.1.6/test/test_sass.rb000066400000000000000000000014071271741406300163360ustar00rootroot00000000000000require 'helper' class TestSass < JekyllUnitTest context "importing partials" do setup do @site = Jekyll::Site.new(Jekyll.configuration({ "source" => source_dir, "destination" => dest_dir })) @site.process @test_css_file = dest_dir("css/main.css") end should "import SCSS partial" do assert_equal ".half {\n width: 50%; }\n", File.read(@test_css_file) end should "register the SCSS converter" do assert !!@site.find_converter_instance(Jekyll::Converters::Scss), "SCSS converter implementation should exist." end should "register the Sass converter" do assert !!@site.find_converter_instance(Jekyll::Converters::Sass), "Sass converter implementation should exist." end end end jekyll-3.1.6/test/test_site.rb000066400000000000000000000424021271741406300163310ustar00rootroot00000000000000require 'helper' class TestSite < JekyllUnitTest context "configuring sites" do should "have an array for plugins by default" do site = Site.new default_configuration assert_equal [File.join(Dir.pwd, '_plugins')], site.plugins end should "look for plugins under the site directory by default" do site = Site.new(site_configuration) assert_equal [source_dir('_plugins')], site.plugins end should "have an array for plugins if passed as a string" do site = Site.new(site_configuration({ '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(site_configuration({ '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(site_configuration({ 'plugins_dir' => [] })) assert_equal [], site.plugins end should "have the default for plugins if nil is passed" do site = Site.new(site_configuration({ 'plugins_dir' => nil })) assert_equal [source_dir('_plugins')], site.plugins end should "expose default baseurl" do site = Site.new(default_configuration) assert_equal Jekyll::Configuration::DEFAULTS['baseurl'], site.baseurl end should "expose baseurl passed in from config" do site = Site.new(site_configuration({ 'baseurl' => '/blog' })) assert_equal '/blog', site.baseurl end end context "creating sites" do setup do @site = Site.new(site_configuration) @num_invalid_posts = 4 end teardown do if defined?(MyGenerator) self.class.send(:remove_const, :MyGenerator) end end should "have an empty tag hash by default" do assert_equal Hash.new, @site.tags end should "give site with parsed pages and posts to generators" do 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 refute_equal 0, @site.pages.size assert_equal 'hi', @site.file_read_opts[:secret_message] end should "reset data before processing" do clear_dest @site.process before_posts = @site.posts.length before_layouts = @site.layouts.length before_categories = @site.categories.length before_tags = @site.tags.length before_pages = @site.pages.length before_static_files = @site.static_files.length before_time = @site.time @site.process assert_equal before_posts, @site.posts.length assert_equal before_layouts, @site.layouts.length assert_equal before_categories, @site.categories.length assert_equal before_tags, @site.tags.length assert_equal before_pages, @site.pages.length assert_equal before_static_files, @site.static_files.length assert before_time <= @site.time end 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 dest = File.expand_path(@site.static_files[0].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 # simulate file modification by user FileUtils.touch some_static_file 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 must be the same end should "write static files if not modified but missing in destination" do clear_dest StaticFile.reset_cache @site.regenerator.clear @site.process dest = File.expand_path(@site.static_files[0].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 # simulate destination file deletion File.unlink dest refute File.exist?(dest) sleep 1 @site.process mtime3 = File.stat(dest).mtime.to_i 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 remain the same end should "setup plugins in priority order" do assert_equal @site.converters.sort_by(&:class).map{|c|c.class.priority}, @site.converters.map{|c|c.class.priority} assert_equal @site.generators.sort_by(&:class).map{|g|g.class.priority}, @site.generators.map{|g|g.class.priority} end should "sort pages alphabetically" do 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( %#\ +.md .htaccess about.html bar.html coffeescript.coffee contacts.html deal.with.dots.html dynamic_file.php environment.html exploit.md foo.md humans.txt index.html index.html main.scss main.scss properties.html sitemap.xml static_files.html symlinked-file ) assert_equal sorted_pages, @site.pages.map(&:name) end should "read posts" do @site.posts.docs.concat(PostReader.new(@site).read_posts('')) posts = Dir[source_dir('_posts', '**', '*')] 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, 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, Utils.has_yaml_header?(abs_path) end should "expose jekyll version to site payload" do assert_equal Jekyll::VERSION, @site.site_payload['jekyll']['version'] end should "expose list of static files to site payload" do assert_equal @site.static_files, @site.site_payload['site']['static_files'] end should "deploy payload" do clear_dest @site.process posts = Dir[source_dir("**", "_posts", "**", "*")] 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 assert_equal 5, @site.categories['foo'].size end context 'error handling' do should "raise if destination is included in source" do assert_raises Jekyll::Errors::FatalException do site = Site.new(site_configuration('destination' => source_dir)) end end should "raise if destination is source" do assert_raises Jekyll::Errors::FatalException do site = Site.new(site_configuration('destination' => File.join(source_dir, ".."))) end end end context 'with orphaned files in destination' do setup do clear_dest @site.regenerator.clear @site.process # generate some orphaned files: # single file File.open(dest_dir('obsolete.html'), 'w') # single file in sub directory FileUtils.mkdir(dest_dir('qux')) File.open(dest_dir('qux/obsolete.html'), 'w') # empty directory FileUtils.mkdir(dest_dir('quux')) FileUtils.mkdir(dest_dir('.git')) FileUtils.mkdir(dest_dir('.svn')) FileUtils.mkdir(dest_dir('.hg')) # single file in repository File.open(dest_dir('.git/HEAD'), 'w') File.open(dest_dir('.svn/HEAD'), 'w') File.open(dest_dir('.hg/HEAD'), 'w') end teardown do FileUtils.rm_f(dest_dir('obsolete.html')) FileUtils.rm_rf(dest_dir('qux')) FileUtils.rm_f(dest_dir('quux')) FileUtils.rm_rf(dest_dir('.git')) FileUtils.rm_rf(dest_dir('.svn')) FileUtils.rm_rf(dest_dir('.hg')) end should 'remove orphaned files in destination' do @site.process refute_exist dest_dir('obsolete.html') refute_exist dest_dir('qux') refute_exist dest_dir('quux') assert_exist dest_dir('.git') assert_exist dest_dir('.git', 'HEAD') end should 'remove orphaned files in destination - keep_files .svn' do config = site_configuration('keep_files' => %w{.svn}) @site = Site.new(config) @site.process refute_exist dest_dir('.htpasswd') refute_exist dest_dir('obsolete.html') refute_exist dest_dir('qux') refute_exist dest_dir('quux') refute_exist dest_dir('.git') refute_exist dest_dir('.git', 'HEAD') assert_exist dest_dir('.svn') assert_exist dest_dir('.svn', 'HEAD') end end context 'using a non-default markdown processor in the configuration' do should 'use the non-default markdown processor' do class Jekyll::Converters::Markdown::CustomMarkdown def initialize(*args) @args = args end def convert(*args) "" end end custom_processor = "CustomMarkdown" 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) end should 'ignore, if there are any bad characters in the class name' do module Jekyll::Converters::Markdown::Custom class Markdown def initialize(*args) @args = args end def convert(*args) "" end end end bad_processor = "Custom::Markdown" s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false)) assert_raises Jekyll::Errors::FatalException do s.process end # Do some cleanup, we don't like straggling stuff's. Jekyll::Converters::Markdown.send(:remove_const, :Custom) end end 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 Site.new(site_configuration('markdown' => bad_processor)) end should 'throw FatalException at process time' do bad_processor = 'not a processor name' s = Site.new(site_configuration('markdown' => bad_processor, 'incremental' => false)) assert_raises Jekyll::Errors::FatalException do s.process end end end context 'data directory' do should 'auto load yaml files' do site = Site.new(site_configuration) site.process file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.yaml')) assert_equal site.data['members'], file_content 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(site_configuration) site.process file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'languages.yml')) assert_equal site.data['languages'], file_content assert_equal site.site_payload['site']['data']['languages'], file_content end should 'auto load json files' do site = Site.new(site_configuration) site.process file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.json')) assert_equal site.data['members'], file_content assert_equal site.site_payload['site']['data']['members'], file_content end should 'auto load yaml files in subdirectory' do site = Site.new(site_configuration) site.process file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'categories', 'dairy.yaml')) assert_equal site.data['categories']['dairy'], file_content assert_equal site.site_payload['site']['data']['categories']['dairy'], file_content end should "load symlink files in unsafe mode" do site = Site.new(site_configuration('safe' => false)) site.process file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'products.yml')) assert_equal site.data['products'], file_content assert_equal site.site_payload['site']['data']['products'], file_content end should "not load symlink files in safe mode" do site = Site.new(site_configuration('safe' => true)) site.process assert_nil site.data['products'] assert_nil site.site_payload['site']['data']['products'] end end context "manipulating the Jekyll environment" do setup do @site = Site.new(site_configuration({ 'incremental' => false })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } end should "default to 'development'" do assert_equal "development", @page.content.strip end context "in production" do setup do ENV["JEKYLL_ENV"] = "production" @site = Site.new(site_configuration({ 'incremental' => false })) @site.process @page = @site.pages.find { |p| p.name == "environment.html" } end teardown do ENV.delete("JEKYLL_ENV") end should "be overridden by JEKYLL_ENV" do assert_equal "production", @page.content.strip end end end context "with liquid profiling" do setup do @site = Site.new(site_configuration('profile' => true)) end # Suppress output while testing setup do $stdout = StringIO.new end teardown do $stdout = STDOUT 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 jekyll-3.1.6/test/test_static_file.rb000066400000000000000000000105461271741406300176570ustar00rootroot00000000000000require '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 jekyll-3.1.6/test/test_tags.rb000066400000000000000000000552671271741406300163400ustar00rootroot00000000000000# coding: utf-8 require 'helper' class TestTags < JekyllUnitTest def setup FileUtils.mkdir_p("tmp") end def create_post(content, override = {}, converter_class = Jekyll::Converters::Markdown) site = fixture_site({"highlighter" => "rouge"}.merge(override)) if override['read_posts'] site.posts.docs.concat(PostReader.new(site).read_posts('')) end info = { :filters => [Jekyll::Filters], :registers => { :site => site } } @converter = site.converters.find { |c| c.class == converter_class } payload = { "highlighter_prefix" => @converter.highlighter_prefix, "highlighter_suffix" => @converter.highlighter_suffix } @result = Liquid::Template.parse(content).render!(payload, info) @result = @converter.convert(@result) end def fill_post(code, override = {}) content = < 'inline' }, tag.instance_variable_get(:@highlight_options)) end 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(:@highlight_options)) end 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(:@highlight_options)) end 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(:@highlight_options)) end 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(:@highlight_options)) end 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(:@highlight_options)) end 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 = highlight_block_with_opts('text ') end should "allow linenos" do sanitized = @tag.sanitized_opts({:linenos => true}, true) assert_equal true, sanitized[:linenos] end 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 sanitized = @tag.sanitized_opts({:cssclass => "ahoy"}, true) assert_equal "ahoy", sanitized[:cssclass] end should "allow startinline" do sanitized = @tag.sanitized_opts({:startinline => true}, true) assert_equal true, sanitized[:startinline] end should "strip unknown options" do sanitized = @tag.sanitized_opts({:light => true}, true) assert_nil sanitized[:light] end end context "with the pygments highlighter" do setup do if jruby? then skip( "JRuby does not support Pygments." ) end end 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 %{
    test
    }, @result end should "render markdown with pygments with line numbers" do assert_match %{
    1 test
    }, @result end end 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 %{
    ./jekyll.gemspec
    }, @result end end 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 %{
    Æ
    }, @result end end 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 %{
         [,1] [,2]}, @result
          end
        end
    
        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 "
         [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", @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]", {'highlighter' => 'pygments'} end should "only strip the preceding newlines" do assert_match %{
         [,1] [,2]}, @result
          end
        end
    
        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 %{
         [,1] [,2]}, @result
          end
        end
      end
    
      context "with the rouge highlighter" do
        context "post content has highlight tag" do
          setup do
            fill_post("test")
          end
    
          should "render markdown with rouge" do
            assert_match %{
    test
    }, @result end should "render markdown with rouge with line numbers" do assert_match %{
    1
    test\n
    }, @result end end context "post content has highlight with file reference" do setup do fill_post("./jekyll.gemspec") end should "not embed the file" do assert_match %{
    ./jekyll.gemspec
    }, @result end end context "post content has highlight tag with UTF character" do setup do fill_post("Æ") end should "render markdown with pygments line handling" do assert_match %{
    Æ
    }, @result end end context "post content has highlight tag with preceding spaces & lines" 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 %{
         [,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 "
         [,1] [,2]\n\n\n[1,] FALSE TRUE\n[2,] FALSE TRUE
    ", @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 %{
         [,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 %{
         [,1] [,2]}, @result
          end
        end
      end
    
      context "simple post with markdown and pre tags" do
        setup do
          @content = < 'rdiscount'
            })
          end
    
          should "parse correctly" do
            assert_match %r{FIGHT!}, @result
            assert_match %r{FINISH HIM}, @result
          end
        end
    
        context "using Kramdown" do
          setup do
            create_post(@content, 'markdown' => 'kramdown')
          end
    
          should "parse correctly" do
            assert_match %r{FIGHT!}, @result
            assert_match %r{FINISH HIM}, @result
          end
        end
    
        context "using Redcarpet" do
          setup do
            if jruby?
              skip(
                "JRuby does not perform well with CExt, test disabled."
              )
            end
    
            create_post(@content, {
              'markdown' => 'redcarpet'
            })
          end
    
          should "parse correctly" do
            assert_match %r{FIGHT!}, @result
            assert_match %r{FINISH HIM}, @result
          end
        end
      end
    
      context "simple page with post linking" do
        setup do
          content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
        end
    
        should "not cause an error" do
          refute_match /markdown\-html\-error/, @result
        end
    
        should "have the url to the \"complex\" post from 2008-11-21" do
          assert_match %r{/2008/11/21/complex/}, @result
        end
      end
    
      context "simple page with nested post linking" do
        setup do
          content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
        end
    
        should "not cause an error" do
          refute_match /markdown\-html\-error/, @result
        end
    
        should "have the url to the \"complex\" post from 2008-11-21" do
          assert_match %r{1\s/2008/11/21/complex/}, @result
          assert_match %r{2\s/2008/11/21/complex/}, @result
        end
    
        should "have the url to the \"nested\" post from 2008-11-21" do
          assert_match %r{3\s/2008/11/21/nested/}, @result
          assert_match %r{4\s/2008/11/21/nested/}, @result
        end
      end
    
      context "simple page with invalid post name linking" do
        should "cause an error" do
          content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
          end
        end
      end
    
      context "include tag with parameters" do
    
        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 = < '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 = < '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
    
        context "with one parameter" do
          setup do
            content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
          end
    
          should "correctly output include variable" do
            assert_match "value", @result.strip
          end
    
          should "ignore parameters if unused" do
            assert_match "
    \n

    Tom Preston-Werner\ngithub.com/mojombo

    \n", @result end end context "with invalid parameter syntax" do should "throw a ArgumentError" do content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) end content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) end end end context "with several parameters" do setup do content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) end should "list all parameters" do assert_match '
  • param1 = new_value
  • ', @result assert_match '
  • param2 = another
  • ', @result end should "not include previously used parameters" do assert_match "", @result end end context "without parameters" do setup do content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) end should "include file with empty parameters" do assert_match "", @result end end context "with custom includes directory" do setup do content = < '_includes_custom', 'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) end should "include file from custom directory" do assert_match "custom_included", @result end end context "without parameters within if statement" do setup do content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) end should "include file with empty parameters within if statement" do assert_match "", @result end end context "include missing file" do setup do @content = < 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true}) end assert_equal 'Included file \'_includes/missing.html\' not found', exception.message end end context "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? "2013-12-17-include-variable-filters.markdown" } @content = post.output end should "include file as variable with liquid filters" do assert_match %r{1 included}, @content assert_match %r{2 included}, @content assert_match %r{3 included}, @content end should "include file as variable and liquid filters with arbitrary whitespace" do assert_match %r{4 included}, @content assert_match %r{5 included}, @content assert_match %r{6 included}, @content end should "include file as variable and filters with additional parameters" do assert_match '
  • var1 = foo
  • ', @content assert_match '
  • var2 = bar
  • ', @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 '
  • var1 = foo
  • ', @content assert_match '
  • var2 = bar
  • ', @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 = < '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 = < '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 = < '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 = < '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 jekyll-3.1.6/test/test_url.rb000066400000000000000000000041441271741406300161700ustar00rootroot00000000000000require 'helper' class TestURL < JekyllUnitTest context "The URL class" do should "throw an exception if neither permalink or template is specified" do assert_raises ArgumentError do URL.new(:placeholders => {}) end end should "replace placeholders in templates" do assert_equal "/foo/bar", URL.new( :template => "/:x/:y", :placeholders => {:x => "foo", :y => "bar"} ).to_s end 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"}, :permalink => "/le/perma/link" ).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 should "handle UrlDrop as a placeholder in addition to a hash" do site = fixture_site({ "collections" => { "methods" => { "output" => true } }, }) site.read doc = site.collections["methods"].docs.find do |doc| doc.relative_path == "_methods/escape-+ #%20[].md" end assert_equal '/methods/escape-+-20/escape-20.html', URL.new( :template => '/methods/:title/:name:output_ext', :placeholders => doc.url_placeholders ).to_s end end end jekyll-3.1.6/test/test_utils.rb000066400000000000000000000275771271741406300165450ustar00rootroot00000000000000require 'helper' class TestUtils < JekyllUnitTest context "The \`Utils.deep_merge_hashes\` method" do setup do clear_dest @site = fixture_site @site.process end should "merge a drop into a hash" do data = {"page" => {}} merged = Utils.deep_merge_hashes(data, @site.site_payload) assert merged.is_a? Hash assert merged["site"].is_a? Drops::SiteDrop assert_equal data["page"], merged["page"] end should "merge a hash into a drop" do data = {"page" => {}} assert_nil @site.site_payload["page"] merged = Utils.deep_merge_hashes(@site.site_payload, data) assert merged.is_a? Drops::UnifiedPayloadDrop assert merged["site"].is_a? Drops::SiteDrop assert_equal data["page"], merged["page"] end end context "hash" do context "pluralized_array" do should "return empty array with no values" do data = {} assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return empty array with no matching values" do data = { 'foo' => 'bar' } assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return plural array with nil singular" do data = { 'foo' => 'bar', 'tag' => nil, 'tags' => ['dog', 'cat'] } assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return single value array with matching singular" do data = { 'foo' => 'bar', 'tag' => 'dog', 'tags' => ['dog', 'cat'] } assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return single value array with matching singular with spaces" do data = { 'foo' => 'bar', 'tag' => 'dog cat', 'tags' => ['dog', 'cat'] } assert_equal ['dog cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return empty array with matching nil plural" do data = { 'foo' => 'bar', 'tags' => nil } assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return empty array with matching empty array" do data = { 'foo' => 'bar', 'tags' => [] } assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return single value array with matching plural with single string value" do data = { 'foo' => 'bar', 'tags' => 'dog' } assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return multiple value array with matching plural with single string value with spaces" do data = { 'foo' => 'bar', 'tags' => 'dog cat' } assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return single value array with matching plural with single value array" do data = { 'foo' => 'bar', 'tags' => ['dog'] } assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end should "return multiple value array with matching plural with multiple value array" do data = { 'foo' => 'bar', 'tags' => ['dog', 'cat'] } assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags') end end 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.titleize_slug\` method" do should "capitalize all words and not drop any words" do assert_equal "This Is A Long Title With Mixed Capitalization", Utils.titleize_slug("This-is-a-Long-title-with-Mixed-capitalization") assert_equal "This Is A Title With Just The Initial Word Capitalized", Utils.titleize_slug("This-is-a-title-with-just-the-initial-word-capitalized") assert_equal "This Is A Title With No Capitalization", Utils.titleize_slug("this-is-a-title-with-no-capitalization") 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 context "The \`Utils.safe_glob\` method" do should "not apply pattern to the dir" do dir = "test/safe_glob_test[" assert_equal [], Dir.glob(dir + "/*") assert_equal ["test/safe_glob_test[/find_me.txt"], Utils.safe_glob(dir, "*") end should "return the same data to #glob" do dir = "test" assert_equal Dir.glob(dir + "/*"), Utils.safe_glob(dir, "*") assert_equal Dir.glob(dir + "/**/*"), Utils.safe_glob(dir, "**/*") end should "return the same data to #glob if dir is not found" do dir = "dir_not_exist" assert_equal [], Utils.safe_glob(dir, "*") assert_equal Dir.glob(dir + "/*"), Utils.safe_glob(dir, "*") end should "return the same data to #glob if pattern is blank" do dir = "test" assert_equal [dir], Utils.safe_glob(dir, "") assert_equal Dir.glob(dir), Utils.safe_glob(dir, "") assert_equal Dir.glob(dir), Utils.safe_glob(dir, nil) end should "return the same data to #glob if flag is given" do dir = "test" assert_equal Dir.glob(dir + "/*", File::FNM_DOTMATCH), Utils.safe_glob(dir, "*", File::FNM_DOTMATCH) end should "support pattern as an array to support windows" do dir = "test" assert_equal Dir.glob(dir + "/**/*"), Utils.safe_glob(dir, ["**", "*"]) end end context "The \`Utils.has_yaml_header?\` method" do should "accept files with yaml front matter" do file = source_dir("_posts", "2008-10-18-foo-bar.markdown") assert_equal "---\n", File.open(file, 'rb') { |f| f.read(4) } assert Utils.has_yaml_header?(file) end should "accept files with extraneous spaces after yaml front matter" do file = source_dir("_posts", "2015-12-27-extra-spaces.markdown") assert_equal "--- \n", File.open(file, 'rb') { |f| f.read(6) } assert Utils.has_yaml_header?(file) end should "reject pgp files and the like which resemble front matter" do file = source_dir("pgp.key") assert_equal "-----B", File.open(file, 'rb') { |f| f.read(6) } refute Utils.has_yaml_header?(file) end end context "The \`Utils.merged_file_read_opts\` method" do should "ignore encoding if it's not there" do opts = Utils.merged_file_read_opts(nil, {}) assert_nil opts["encoding"] end should "add bom to encoding" do opts = Utils.merged_file_read_opts(nil, { "encoding" => "utf-8" }) assert_equal "bom|utf-8", opts["encoding"] end should "preserve bom in encoding" do opts = Utils.merged_file_read_opts(nil, { "encoding" => "bom|utf-8" }) assert_equal "bom|utf-8", opts["encoding"] end end end