commit
						d3e23c2fae
					
				|  | @ -12,5 +12,8 @@ gh-pages/ | ||||||
| site/_site/ | site/_site/ | ||||||
| coverage | coverage | ||||||
| .ruby-version | .ruby-version | ||||||
|  | .ruby-gemset | ||||||
| .sass-cache | .sass-cache | ||||||
| tmp/stackprof-* | tmp/* | ||||||
|  | .jekyll-metadata | ||||||
|  | /vendor | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								.travis.yml
								
								
								
								
							
							
						
						
									
										10
									
								
								.travis.yml
								
								
								
								
							|  | @ -2,13 +2,13 @@ language: ruby | ||||||
| cache: bundler | cache: bundler | ||||||
| sudo: false | sudo: false | ||||||
| rvm: | rvm: | ||||||
|  | - 2.2 | ||||||
| - 2.1 | - 2.1 | ||||||
| - 2.0 | - 2.0 | ||||||
| - 1.9.3 |  | ||||||
| env: | env: | ||||||
|   matrix: |   matrix: | ||||||
|   - TEST_SUITE=test |     - TEST_SUITE=test | ||||||
|   - TEST_SUITE=cucumber |     - TEST_SUITE=cucumber | ||||||
| before_script: bundle update | before_script: bundle update | ||||||
| script: script/cibuild | script: script/cibuild | ||||||
| notifications: | notifications: | ||||||
|  | @ -16,9 +16,9 @@ notifications: | ||||||
|     on_success: change |     on_success: change | ||||||
|     on_failure: change |     on_failure: change | ||||||
|     channels: |     channels: | ||||||
|     - irc.freenode.org#jekyll |       - irc.freenode.org#jekyll | ||||||
|     template: |     template: | ||||||
|     - "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}" |       - "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}" | ||||||
|   email: |   email: | ||||||
|     on_success: never |     on_success: never | ||||||
|     on_failure: never |     on_failure: never | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ Contribute | ||||||
| So you've got an awesome idea to throw into Jekyll. Great! Please keep the | So you've got an awesome idea to throw into Jekyll. Great! Please keep the | ||||||
| following in mind: | 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.** | * **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 | * 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 |   test will do. Please stay in the confines of the current test suite and use | ||||||
|  | @ -67,7 +68,7 @@ You can find the documentation for jekyllrb.com in the | ||||||
| [site](https://github.com/jekyll/jekyll/tree/master/site) directory of | [site](https://github.com/jekyll/jekyll/tree/master/site) directory of | ||||||
| Jekyll's repo on GitHub.com. | Jekyll's repo on GitHub.com. | ||||||
| 
 | 
 | ||||||
| All documentation pull requests should be directed at `master`.  Pull | All documentation pull requests should be directed at `master`. Pull | ||||||
| requests directed at another branch will not be accepted. | requests directed at another branch will not be accepted. | ||||||
| 
 | 
 | ||||||
| The [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) on GitHub | The [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) on GitHub | ||||||
|  |  | ||||||
							
								
								
									
										33
									
								
								Gemfile
								
								
								
								
							
							
						
						
									
										33
									
								
								Gemfile
								
								
								
								
							|  | @ -1,7 +1,40 @@ | ||||||
| source 'https://rubygems.org' | source 'https://rubygems.org' | ||||||
| gemspec | gemspec | ||||||
| 
 | 
 | ||||||
|  | gem 'pygments.rb', '~> 0.6.0' | ||||||
|  | gem 'redcarpet', '~> 3.1' | ||||||
|  | gem 'toml', '~> 0.1.0' | ||||||
|  | gem 'jekyll-paginate', '~> 1.0' | ||||||
|  | gem 'jekyll-gist', '~> 1.0' | ||||||
|  | gem 'jekyll-coffeescript', '~> 1.0' | ||||||
|  | gem 'classifier-reborn', '~> 2.0' | ||||||
|  | 
 | ||||||
|  | gem 'rake', '~> 10.1' | ||||||
|  | gem 'rdoc', '~> 3.11' | ||||||
|  | gem 'redgreen', '~> 1.2' | ||||||
|  | gem 'shoulda', '~> 3.5' | ||||||
|  | gem 'cucumber', '1.3.18' | ||||||
|  | gem 'maruku', '~> 0.7.0' | ||||||
|  | gem 'rdiscount', '~> 2.0' | ||||||
|  | gem 'launchy', '~> 2.3' | ||||||
|  | gem 'simplecov', '~> 0.9' | ||||||
|  | gem 'mime-types', '~> 1.5' | ||||||
|  | gem 'activesupport', '~> 3.2.13' | ||||||
|  | gem 'jekyll_test_plugin' | ||||||
|  | gem 'jekyll_test_plugin_malicious' | ||||||
|  | gem 'liquid-c', '~> 3.0' | ||||||
|  | gem 'minitest' | ||||||
|  | gem 'minitest-reporters' | ||||||
|  | gem 'minitest-profile' | ||||||
|  | gem 'test-unit' if RUBY_PLATFORM =~ /cygwin/ || RUBY_VERSION.start_with?("2.2") | ||||||
|  | gem 'rspec-mocks' | ||||||
|  | 
 | ||||||
| if ENV['BENCHMARK'] | if ENV['BENCHMARK'] | ||||||
|   gem 'rbtrace' |   gem 'rbtrace' | ||||||
|   gem 'stackprof' |   gem 'stackprof' | ||||||
|  |   gem 'benchmark-ips' | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | if ENV['PROOF'] | ||||||
|  |   gem 'html-proofer', '~> 2.0' | ||||||
| end | end | ||||||
|  |  | ||||||
							
								
								
									
										149
									
								
								History.markdown
								
								
								
								
							
							
						
						
									
										149
									
								
								History.markdown
								
								
								
								
							|  | @ -2,25 +2,172 @@ | ||||||
| 
 | 
 | ||||||
| ### Major Enhancements | ### Major Enhancements | ||||||
| 
 | 
 | ||||||
|  |   * Incremental regeneration (#3116) | ||||||
|  |   * Drop support for Ruby 1.9.3. (#3235) | ||||||
|  |   * Upgrade to Liquid 3.0.0 (#3002) | ||||||
|  |   * 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) | ||||||
|  | 
 | ||||||
| ### Minor Enhancements | ### Minor Enhancements | ||||||
| 
 | 
 | ||||||
|  |   * 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) | ||||||
|  | 
 | ||||||
|  | ### Bug Fixes | ||||||
|  | 
 | ||||||
|  |   * 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) | ||||||
|  | 
 | ||||||
|  | ### Development Fixes | ||||||
|  | 
 | ||||||
|  |   * 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) | ||||||
|  | 
 | ||||||
|  | ### Site Enhancements | ||||||
|  | 
 | ||||||
|  |   * Add blog post announcing Jekyll Help (#3523) | ||||||
|  |   * Add Jekyll Talk to Help page on site (#3518) | ||||||
|  |   * 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) | ||||||
|  | 
 | ||||||
|  | ## 2.5.3 / 2014-12-22 | ||||||
|  | 
 | ||||||
| ### Bug Fixes | ### Bug Fixes | ||||||
| 
 | 
 | ||||||
|   * When checking a Markdown extname, include position of the `.` (#3147) |   * When checking a Markdown extname, include position of the `.` (#3147) | ||||||
|   * Fix `jsonify` Liquid filter handling of boolean values (#3154) |   * Fix `jsonify` Liquid filter handling of boolean values (#3154) | ||||||
|   * Add comma to value of `viewport` meta tag (#3170) |   * Add comma to value of `viewport` meta tag (#3170) | ||||||
|   * Set the link type for the RSS feed to `application/rss+xml` (#3176) |   * Set the link type for the RSS feed to `application/rss+xml` (#3176) | ||||||
|  |   * Refactor `#as_liquid` (#3158) | ||||||
| 
 | 
 | ||||||
| ### Development Fixes | ### Development Fixes | ||||||
| 
 | 
 | ||||||
|  |   * Exclude built-in bundles from being added to coverage report (#3180) | ||||||
|  | 
 | ||||||
| ### Site Enhancements | ### Site Enhancements | ||||||
| 
 | 
 | ||||||
|  |   * Add `@alfredxing` to the `@jekyll/core` team. :tada: (#3218) | ||||||
|   * Document the `-q` option for the `build` and `serve` commands (#3149) |   * Document the `-q` option for the `build` and `serve` commands (#3149) | ||||||
|   * Fix some minor typos/flow fixes in documentation website content (#3165) |   * Fix some minor typos/flow fixes in documentation website content (#3165) | ||||||
|   * Add `keep_files` to configuration documentation (#3162) |   * Add `keep_files` to configuration documentation (#3162) | ||||||
|   * Repeat warning about cleaning of the `destination` directory (#3161) |   * Repeat warning about cleaning of the `destination` directory (#3161) | ||||||
|   * Add jekyll-500px-embed to list of third-party plugins (#3163) |   * Add jekyll-500px-embed to list of third-party plugins (#3163) | ||||||
|   * Simplified platform detection in Gemfile example for Windows (#3177) |   * 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 | ## 2.5.2 / 2014-11-17 | ||||||
| 
 | 
 | ||||||
|  | @ -477,7 +624,7 @@ | ||||||
|   * Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy |   * Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy | ||||||
|     looking up of variable values in a Liquid context. (#2253) |     looking up of variable values in a Liquid context. (#2253) | ||||||
|   * Remove literal lang name from class (#2292) |   * Remove literal lang name from class (#2292) | ||||||
|   * Return `utf-8` encoding in header for  webrick error page response (#2289) |   * Return `utf-8` encoding in header for webrick error page response (#2289) | ||||||
|   * Make template site easier to customize (#2268) |   * Make template site easier to customize (#2268) | ||||||
|   * Add two-digit year to permalink template option (#2301) |   * Add two-digit year to permalink template option (#2301) | ||||||
|   * Add `site.documents` to Liquid payload (list of all docs) (#2295) |   * Add `site.documents` to Liquid payload (list of all docs) (#2295) | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								LICENSE
								
								
								
								
							
							
						
						
									
										8
									
								
								LICENSE
								
								
								
								
							|  | @ -1,9 +1,9 @@ | ||||||
| (The MIT License) | The MIT License (MIT) | ||||||
| 
 | 
 | ||||||
| Copyright (c) 2008-2014 Tom Preston-Werner | Copyright (c) 2008-2015 Tom Preston-Werner | ||||||
| 
 | 
 | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
| of this software and associated documentation files (the 'Software'), to deal | of this software and associated documentation files (the "Software"), to deal | ||||||
| in the Software without restriction, including without limitation the rights | in the Software without restriction, including without limitation the rights | ||||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
| copies of the Software, and to permit persons to whom the Software is | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | @ -12,7 +12,7 @@ furnished to do so, subject to the following conditions: | ||||||
| The above copyright notice and this permission notice shall be included in all | The above copyright notice and this permission notice shall be included in all | ||||||
| copies or substantial portions of the Software. | copies or substantial portions of the Software. | ||||||
| 
 | 
 | ||||||
| THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| # [Jekyll](http://jekyllrb.com/) | # [Jekyll](http://jekyllrb.com/) | ||||||
| 
 | 
 | ||||||
| [](https://rubygems.org/gems/jekyll) | [](https://rubygems.org/gems/jekyll) | ||||||
| [](https://travis-ci.org/jekyll/jekyll) | [](https://travis-ci.org/jekyll/jekyll) | ||||||
| [](https://codeclimate.com/github/jekyll/jekyll) | [](https://codeclimate.com/github/jekyll/jekyll) | ||||||
| [](https://gemnasium.com/jekyll/jekyll) | [](https://gemnasium.com/jekyll/jekyll) | ||||||
| [](https://hakiri.io/github/jekyll/jekyll/master) | [](https://hakiri.io/github/jekyll/jekyll/master) | ||||||
| 
 | 
 | ||||||
| By Tom Preston-Werner, Nick Quaranto, Parker Moore, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)! | By Tom Preston-Werner, Nick Quaranto, Parker Moore, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)! | ||||||
|  |  | ||||||
							
								
								
									
										51
									
								
								Rakefile
								
								
								
								
							
							
						
						
									
										51
									
								
								Rakefile
								
								
								
								
							|  | @ -26,7 +26,7 @@ def gemspec_file | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| def gem_file | def gem_file | ||||||
|   "#{name}-#{version}.gem" |   "#{name}-#{Gem::Version.new(version).to_s}.gem" | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| def normalize_bullets(markdown) | def normalize_bullets(markdown) | ||||||
|  | @ -89,6 +89,7 @@ end | ||||||
| 
 | 
 | ||||||
| multitask :default => [:test, :features] | multitask :default => [:test, :features] | ||||||
| 
 | 
 | ||||||
|  | task :spec => :test | ||||||
| require 'rake/testtask' | require 'rake/testtask' | ||||||
| Rake::TestTask.new(:test) do |test| | Rake::TestTask.new(:test) do |test| | ||||||
|   test.libs << 'lib' << 'test' |   test.libs << 'lib' << 'test' | ||||||
|  | @ -179,33 +180,44 @@ namespace :site do | ||||||
|     # Ensure the gh-pages dir exists so we can generate into it. |     # Ensure the gh-pages dir exists so we can generate into it. | ||||||
|     puts "Checking for gh-pages dir..." |     puts "Checking for gh-pages dir..." | ||||||
|     unless File.exist?("./gh-pages") |     unless File.exist?("./gh-pages") | ||||||
|       puts "No gh-pages directory found. Run the following commands first:" |       puts "Creating gh-pages dir..." | ||||||
|       puts "  `git clone git@github.com:jekyll/jekyll gh-pages" |       sh "git clone git@github.com:jekyll/jekyll gh-pages" | ||||||
|       puts "  `cd gh-pages" |  | ||||||
|       puts "  `git checkout gh-pages`" |  | ||||||
|       exit(1) |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Ensure gh-pages branch is up to date. |     # Ensure latest gh-pages branch history. | ||||||
|     Dir.chdir('gh-pages') do |     Dir.chdir('gh-pages') do | ||||||
|  |       sh "git checkout gh-pages" | ||||||
|       sh "git pull origin gh-pages" |       sh "git pull origin gh-pages" | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Copy to gh-pages dir. |     # Proceed to purge all files in case we removed a file in this release. | ||||||
|     puts "Copying site to gh-pages branch..." |     puts "Cleaning gh-pages directory..." | ||||||
|     Dir.glob("site/*") do |path| |     purge_exclude = %w[ | ||||||
|       next if path.include? "_site" |       gh-pages/. | ||||||
|       sh "cp -R #{path} gh-pages/" |       gh-pages/.. | ||||||
|  |       gh-pages/.git | ||||||
|  |       gh-pages/.gitignore | ||||||
|  |     ] | ||||||
|  |     FileList["gh-pages/{*,.*}"].exclude(*purge_exclude).each do |path| | ||||||
|  |       sh "rm -rf #{path}" | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Change any configuration settings for production. |     # Copy site to gh-pages dir. | ||||||
|     config = YAML.load_file("gh-pages/_config.yml") |     puts "Building site into gh-pages branch..." | ||||||
|     config.merge!({'sass' => {'style' => 'compressed'}}) |     ENV['JEKYLL_ENV'] = 'production' | ||||||
|     File.write('gh-pages/_config.yml', YAML.dump(config)) |     require "jekyll" | ||||||
|  |     Jekyll::Commands::Build.process({ | ||||||
|  |       "source"       => File.expand_path("site"), | ||||||
|  |       "destination"  => File.expand_path("gh-pages"), | ||||||
|  |       "sass"         => { "style" => "compressed" }, | ||||||
|  |       "full_rebuild" => true | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     File.open('gh-pages/.nojekyll', 'wb') { |f| f.puts(":dog: food.") } | ||||||
| 
 | 
 | ||||||
|     # Commit and push. |     # Commit and push. | ||||||
|     puts "Committing and pushing to GitHub Pages..." |     puts "Committing and pushing to GitHub Pages..." | ||||||
|     sha = `git log`.match(/[a-z0-9]{40}/)[0] |     sha = `git rev-parse HEAD`.strip | ||||||
|     Dir.chdir('gh-pages') do |     Dir.chdir('gh-pages') do | ||||||
|       sh "git add ." |       sh "git add ." | ||||||
|       sh "git commit --allow-empty -m 'Updating to #{sha}.'" |       sh "git commit --allow-empty -m 'Updating to #{sha}.'" | ||||||
|  | @ -221,8 +233,7 @@ namespace :site do | ||||||
|       front_matter = { |       front_matter = { | ||||||
|         "layout" => "docs", |         "layout" => "docs", | ||||||
|         "title" => "History", |         "title" => "History", | ||||||
|         "permalink" => "/docs/history/", |         "permalink" => "/docs/history/" | ||||||
|         "prev_section" => "contributing" |  | ||||||
|       } |       } | ||||||
|       Dir.chdir('site/_docs/') do |       Dir.chdir('site/_docs/') do | ||||||
|         File.open("history.md", "w") do |file| |         File.open("history.md", "w") do |file| | ||||||
|  | @ -237,7 +248,7 @@ namespace :site do | ||||||
| 
 | 
 | ||||||
|   desc "Write the site latest_version.txt file" |   desc "Write the site latest_version.txt file" | ||||||
|   task :version_file do |   task :version_file do | ||||||
|     File.open('site/latest_version.txt', 'wb') { |f| f.write(version) } |     File.open('site/latest_version.txt', 'wb') { |f| f.puts(version) } unless version =~ /(beta|rc|alpha)/i | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   namespace :releases do |   namespace :releases do | ||||||
|  |  | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | require 'benchmark/ips' | ||||||
|  | 
 | ||||||
|  | Benchmark.ips do |x| | ||||||
|  |   path_without_ending_slash = '/some/very/very/long/path/to/a/file/i/like' | ||||||
|  |   x.report('no slash regexp')    { path_without_ending_slash =~ /\/$/ } | ||||||
|  |   x.report('no slash end_with?') { path_without_ending_slash.end_with?("/")  } | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | Benchmark.ips do |x| | ||||||
|  |   path_with_ending_slash = '/some/very/very/long/path/to/a/file/i/like/' | ||||||
|  |   x.report('slash regexp')    { path_with_ending_slash =~ /\/$/ } | ||||||
|  |   x.report('slash end_with?') { path_with_ending_slash.end_with?("/")  } | ||||||
|  | end | ||||||
|  | @ -14,4 +14,3 @@ Benchmark.ips do |x| | ||||||
|   x.report('.map.flatten with no nested arrays') { enum.map { |i| do_thing(i) }.flatten(1) } |   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) } } |   x.report('.flat_map with no nested arrays')    { enum.flat_map { |i| do_thing(i) } } | ||||||
| end | end | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -8,6 +8,6 @@ Benchmark.ips do |x| | ||||||
|   x.report('#tr')    { str.tr('some', 'a')    } |   x.report('#tr')    { str.tr('some', 'a')    } | ||||||
|   x.report('#gsub')  { str.gsub('some', 'a')  } |   x.report('#gsub')  { str.gsub('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')   } | ||||||
|   x.report('#sub!')  { str.sub!('some', 'a') } |   x.report('#sub!')  { str.sub!('some', 'a')  } | ||||||
| end | end | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								bin/jekyll
								
								
								
								
							
							
						
						
									
										10
									
								
								bin/jekyll
								
								
								
								
							|  | @ -6,12 +6,9 @@ $:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib }) | ||||||
| require 'jekyll' | require 'jekyll' | ||||||
| require 'mercenary' | require 'mercenary' | ||||||
| 
 | 
 | ||||||
| %w[jekyll-import].each do |blessed_gem| | Jekyll::External.require_if_present( | ||||||
|   begin |   Jekyll::External.blessed_gems | ||||||
|     require blessed_gem | ) | ||||||
|   rescue LoadError |  | ||||||
|   end |  | ||||||
| end |  | ||||||
| 
 | 
 | ||||||
| Jekyll::PluginManager.require_from_bundler | Jekyll::PluginManager.require_from_bundler | ||||||
| 
 | 
 | ||||||
|  | @ -32,6 +29,7 @@ Mercenary.program(:jekyll) do |p| | ||||||
| 
 | 
 | ||||||
|   p.action do |args, options| |   p.action do |args, options| | ||||||
|     if args.empty? |     if args.empty? | ||||||
|  |       Jekyll.logger.error "A subcommand is required." | ||||||
|       puts p |       puts p | ||||||
|     else |     else | ||||||
|       unless p.has_command?(args.first) |       unless p.has_command?(args.first) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,14 @@ | ||||||
|  | machine: | ||||||
|  |   timezone: UTC | ||||||
|  |   ruby: | ||||||
|  |     version: 2.1.5 | ||||||
|  |   environment: | ||||||
|  |     PROOF: true | ||||||
|  | test: | ||||||
|  |   override: | ||||||
|  |     - script/proof -f | ||||||
|  | general: | ||||||
|  |   branches: | ||||||
|  |     ignore: | ||||||
|  |       - gh-pages # no proof script here | ||||||
|  |       - master   # don't need to duplicate work | ||||||
|  | @ -9,7 +9,7 @@ Feature: Collections | ||||||
|     And I have a configuration file with "collections" set to "['methods']" |     And I have a configuration file with "collections" set to "['methods']" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Collections: <p>Use <code>Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>\n<p><code>Jekyll.sanitized_path</code> is used to make sure your path is in your source.</p>\n<p>Run your generators! default</p>\n<p>Page without title.</p>\n<p>Run your generators! default</p>" in "_site/index.html" |     And I should see "Collections: <p>Use <code>Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>\n<p>Signs are nice</p>\n<p><code>Jekyll.sanitized_path</code> is used to make sure your path is in your source.</p>\n<p>Run your generators! default</p>\n<p>Page without title.</p>\n<p>Run your generators! default</p>" in "_site/index.html" | ||||||
|     And the "_site/methods/configuration.html" file should not exist |     And the "_site/methods/configuration.html" file should not exist | ||||||
| 
 | 
 | ||||||
|   Scenario: Rendered collection |   Scenario: Rendered collection | ||||||
|  | @ -70,7 +70,7 @@ Feature: Collections | ||||||
|     """ |     """ | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Collections: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" |     And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Collections specified as an hash |   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 %}" |     Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}" | ||||||
|  | @ -82,7 +82,7 @@ Feature: Collections | ||||||
|     """ |     """ | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Collections: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" |     And I should see "Collections: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: All the documents |   Scenario: All the documents | ||||||
|     Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}" |     Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}" | ||||||
|  | @ -94,7 +94,7 @@ Feature: Collections | ||||||
|     """ |     """ | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "All documents: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" |     And I should see "All documents: _methods/configuration.md _methods/escape-\+ #%20\[\].md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Documents have an output attribute, which is the converted HTML |   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 }}" |     Given I have an "index.html" page that contains "First document's output: {{ site.documents.first.output }}" | ||||||
|  | @ -118,7 +118,7 @@ Feature: Collections | ||||||
|     """ |     """ | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Item count: 1" in "_site/index.html" |     And I should see "Item count: 2" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Sort by title |   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 }}" |     Given I have an "index.html" page that contains "{% assign items = site.methods | sort: 'title' %}1. of {{ items.size }}: {{ items.first.output }}" | ||||||
|  | @ -130,7 +130,7 @@ Feature: Collections | ||||||
|     """ |     """ | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "1. of 5: <p>Page without title.</p>" in "_site/index.html" |     And I should see "1. of 7: <p>Page without title.</p>" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Sort by relative_path |   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 %}" |     Given I have an "index.html" page that contains "Collections: {% assign methods = site.methods | sort: 'relative_path' %}{% for method in methods %}{{ method.title }}, {% endfor %}" | ||||||
|  | @ -142,4 +142,4 @@ Feature: Collections | ||||||
|     """ |     """ | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Collections: Jekyll.configuration, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html" |     And I should see "Collections: Jekyll.configuration, Jekyll.escape, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html" | ||||||
|  |  | ||||||
|  | @ -43,4 +43,4 @@ Feature: Draft Posts | ||||||
|       | Recipe | 2009-03-27 | simple | Post path: {{ page.path }} | |       | Recipe | 2009-03-27 | simple | Post path: {{ page.path }} | | ||||||
|     When I run jekyll build --drafts |     When I run jekyll build --drafts | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Post path: _drafts/recipe.textile" in "_site/recipe.html" |     And I should see "Post path: _drafts/recipe.markdown" in "_site/recipe.html" | ||||||
|  |  | ||||||
|  | @ -20,8 +20,6 @@ Feature: Embed filters | ||||||
|     And I have the following post: |     And I have the following post: | ||||||
|       | title       | date       | layout  | content                                     | |       | title       | date       | layout  | content                                     | | ||||||
|       | Star & Wars | 2009-03-27 | default | These aren't the droids you're looking for. | |       | 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 }}" |     And I have a default layout that contains "{{ page.title | xml_escape }}" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|  | @ -33,7 +31,7 @@ Feature: Embed filters | ||||||
|     And I have the following post: |     And I have the following post: | ||||||
|       | title     | date       | layout  | content                                     | |       | title     | date       | layout  | content                                     | | ||||||
|       | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. | |       | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. | | ||||||
|     And I have a default layout that contains "{{ content | xml_escape }}" |     And I have a default layout that contains "{{ content | number_of_words }}" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "7" in "_site/2009/03/27/star-wars.html" |     And I should see "7" in "_site/2009/03/27/star-wars.html" | ||||||
|  | @ -49,13 +47,13 @@ Feature: Embed filters | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html" |     And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Textilize a given string |   Scenario: Markdownify a given string | ||||||
|     Given I have a _posts directory |     Given I have a _posts directory | ||||||
|     And I have a _layouts directory |     And I have a _layouts directory | ||||||
|     And I have the following post: |     And I have the following post: | ||||||
|       | title     | date       | layout  | content                                     | |       | title     | date       | layout  | content                                     | | ||||||
|       | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. | |       | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. | | ||||||
|     And I have a default layout that contains "By {{ '_Obi-wan_' | textilize }}" |     And I have a default layout that contains "By {{ '_Obi-wan_' | markdownify }}" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html" |     And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html" | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ Feature: frontmatter defaults | ||||||
|     And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {custom: "some special data", author: "Ben"}}]" |     And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {custom: "some special data", author: "Ben"}}]" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "<p>some special data</p><div>Ben</div>" in "_site/2013/09/11/default-data.html" |     And I should see "<p>some special data</p>\n<div>Ben</div>" in "_site/2013/09/11/default-data.html" | ||||||
|     And I should see "just some special data by Ben" in "_site/index.html" |     And I should see "just some special data by Ben" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Override frontmatter defaults by path |   Scenario: Override frontmatter defaults by path | ||||||
|  | @ -54,6 +54,28 @@ Feature: frontmatter defaults | ||||||
|     And I should see "root: Overview for the webpage" in "_site/index.html" |     And I should see "root: Overview for the webpage" in "_site/index.html" | ||||||
|     And I should see "subfolder: Overview for the special section" in "_site/special/index.html" |     And I should see "subfolder: Overview for the special section" in "_site/special/index.html" | ||||||
| 
 | 
 | ||||||
|  |   Scenario: Use frontmatter variables by relative path | ||||||
|  |     Given I have a _layouts directory | ||||||
|  |     And I have a main layout that contains "main: {{ content }}" | ||||||
|  | 
 | ||||||
|  |     And I have a _posts directory | ||||||
|  |     And I have the following post: | ||||||
|  |       | title | date       | content                               | | ||||||
|  |       | about | 2013-10-14 | content of site/2013/10/14/about.html | | ||||||
|  |     And I have a special/_posts directory | ||||||
|  |     And I have the following post in "special": | ||||||
|  |       | title  | date       | path  | content                                        | | ||||||
|  |       | about1 | 2013-10-14 | local | content of site/special/2013/10/14/about1.html | | ||||||
|  |       | about2 | 2013-10-14 | local | content of site/special/2013/10/14/about2.html | | ||||||
|  | 
 | ||||||
|  |     And I have a configuration file with "defaults" set to "[{scope: {path: "special"}, values: {layout: "main"}}, {scope: {path: "special/_posts"}, values: {layout: "main"}}, {scope: {path: "_posts"}, values: {layout: "main"}}]" | ||||||
|  | 
 | ||||||
|  |     When I run jekyll build | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "main: <p>content of site/2013/10/14/about.html</p>" in "_site/2013/10/14/about.html" | ||||||
|  |     And I should see "main: <p>content of site/special/2013/10/14/about1.html</p>" in "_site/special/2013/10/14/about1.html" | ||||||
|  |     And I should see "main: <p>content of site/special/2013/10/14/about2.html</p>" in "_site/special/2013/10/14/about2.html" | ||||||
|  | 
 | ||||||
|   Scenario: Override frontmatter defaults by type |   Scenario: Override frontmatter defaults by type | ||||||
|     Given I have a _posts directory |     Given I have a _posts directory | ||||||
|     And I have the following post: |     And I have the following post: | ||||||
|  | @ -78,10 +100,19 @@ Feature: frontmatter defaults | ||||||
|     And I should see "nothing" in "_site/override.html" |     And I should see "nothing" in "_site/override.html" | ||||||
|     But the "_site/perma.html" file should not exist |     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 |   Scenario: Use frontmatter defaults in collections | ||||||
|     Given I have a _slides directory |     Given I have a _slides directory | ||||||
|     And I have a "index.html" file that contains "nothing" |     And I have a "index.html" file that contains "nothing" | ||||||
|     And I have a "_slides/slide1.html" file with content:  |     And I have a "_slides/slide1.html" file with content: | ||||||
|     """ |     """ | ||||||
|     --- |     --- | ||||||
|     --- |     --- | ||||||
|  | @ -107,7 +138,7 @@ Feature: frontmatter defaults | ||||||
|   Scenario: Override frontmatter defaults inside a collection |   Scenario: Override frontmatter defaults inside a collection | ||||||
|     Given I have a _slides directory |     Given I have a _slides directory | ||||||
|     And I have a "index.html" file that contains "nothing" |     And I have a "index.html" file that contains "nothing" | ||||||
|     And I have a "_slides/slide2.html" file with content:  |     And I have a "_slides/slide2.html" file with content: | ||||||
|     """ |     """ | ||||||
|     --- |     --- | ||||||
|     myval: Override |     myval: Override | ||||||
|  |  | ||||||
|  | @ -9,15 +9,15 @@ Feature: Include tags | ||||||
|     And I have an "_includes/params.html" file that contains "Parameters:<ul>{% for param in include %}<li>{{param[0]}} = {{param[1]}}</li>{% endfor %}</ul>" |     And I have an "_includes/params.html" file that contains "Parameters:<ul>{% for param in include %}<li>{{param[0]}} = {{param[1]}}</li>{% endfor %}</ul>" | ||||||
|     And I have an "_includes/ignore.html" file that contains "<footer>My blog footer</footer>" |     And I have an "_includes/ignore.html" file that contains "<footer>My blog footer</footer>" | ||||||
|     And I have a _posts directory |     And I have a _posts directory | ||||||
|     And I have the following post: |     And I have the following posts: | ||||||
|       | title                               | date       | layout  | content                                                                                                                 | |       | title                               | date       | type | content                                                                                                                 | | ||||||
|       | Include Files                       | 2013-03-21 | default | {% include header.html param="myparam" %}                                                                               | |       | Include Files                       | 2013-03-21 | html | {% include header.html param="myparam" %}                                                                               | | ||||||
|       | Ignore params if unused             | 2013-03-21 | default | {% include ignore.html date="today" %}                                                                                  | |       | Ignore params if unused             | 2013-03-21 | html | {% include ignore.html date="today" %}                                                                                  | | ||||||
|       | List multiple parameters            | 2013-03-21 | default | {% include params.html date="today" start="tomorrow" %}                                                                 | |       | List multiple parameters            | 2013-03-21 | html | {% include params.html date="today" start="tomorrow" %}                                                                 | | ||||||
|       | Dont keep parameters                | 2013-03-21 | default | {% include ignore.html param="test" %}\n{% include header.html %}                                                       | |       | 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 | default | {% include params.html cool="param with spaces" super="\"quoted\"" single='has "quotes"' escaped='\'single\' quotes' %} | |       | 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 | default | {% include params.html param1_or_2="value" %}                                                                           | |       | Parameter syntax                    | 2013-04-12 | html | {% include params.html param1_or_2="value" %}                                                                           | | ||||||
|       | Pass a variable                     | 2013-06-22 | default | {% assign var = 'some text' %}{% include params.html local=var layout=page.layout %}                                    | |       | Pass a variable                     | 2013-06-22 | html | {% assign var = 'some text' %}{% include params.html local=var title=page.title %}                                    | | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "<header>My awesome blog header: myparam</header>" in "_site/2013/03/21/include-files.html" |     And I should see "<header>My awesome blog header: myparam</header>" in "_site/2013/03/21/include-files.html" | ||||||
|  | @ -27,12 +27,12 @@ Feature: Include tags | ||||||
|     And I should not see "<header>My awesome blog header: myparam</header>" in "_site/2013/03/21/dont-keep-parameters.html" |     And I should not see "<header>My awesome blog header: myparam</header>" in "_site/2013/03/21/dont-keep-parameters.html" | ||||||
|     But I should see "<header>My awesome blog header: </header>" in "_site/2013/03/21/dont-keep-parameters.html" |     But I should see "<header>My awesome blog header: </header>" in "_site/2013/03/21/dont-keep-parameters.html" | ||||||
|     And I should see "<li>cool = param with spaces</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" |     And I should see "<li>cool = param with spaces</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" | ||||||
|     And I should see "<li>super = “quoted”</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" |     And I should see "<li>super = \"quoted\"</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" | ||||||
|     And I should see "<li>single = has “quotes”</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" |     And I should see "<li>single = has \"quotes\"</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" | ||||||
|     And I should see "<li>escaped = ‘single’ quotes</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" |     And I should see "<li>escaped = 'single' quotes</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html" | ||||||
|     And I should see "<li>param1_or_2 = value</li>" in "_site/2013/04/12/parameter-syntax.html" |     And I should see "<li>param1_or_2 = value</li>" in "_site/2013/04/12/parameter-syntax.html" | ||||||
|     And I should see "<li>local = some text</li>" in "_site/2013/06/22/pass-a-variable.html" |     And I should see "<li>local = some text</li>" in "_site/2013/06/22/pass-a-variable.html" | ||||||
|     And I should see "<li>layout = default</li>" in "_site/2013/06/22/pass-a-variable.html" |     And I should see "<li>title = Pass a variable</li>" in "_site/2013/06/22/pass-a-variable.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Include a file from a variable |   Scenario: Include a file from a variable | ||||||
|     Given I have an _includes directory |     Given I have an _includes directory | ||||||
|  |  | ||||||
|  | @ -0,0 +1,60 @@ | ||||||
|  | Feature: Incremental rebuild | ||||||
|  |   As an impatient hacker who likes to blog | ||||||
|  |   I want to be able to make a static site | ||||||
|  |   Without waiting too long for it to build | ||||||
|  | 
 | ||||||
|  |   Scenario: Produce correct output site | ||||||
|  |     Given I have a _layouts directory | ||||||
|  |     And I have a _posts directory | ||||||
|  |     And I have the following posts: | ||||||
|  |       | title    | date       | layout  | content                               | | ||||||
|  |       | Wargames | 2009-03-27 | default | The only winning move is not to play. | | ||||||
|  |     And I have a default layout that contains "Post Layout: {{ content }}" | ||||||
|  |     When I run jekyll build | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Post Layout: <p>The only winning move is not to play.</p>" in "_site/2009/03/27/wargames.html" | ||||||
|  |     When I run jekyll build | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Post Layout: <p>The only winning move is not to play.</p>" in "_site/2009/03/27/wargames.html" | ||||||
|  | 
 | ||||||
|  |   Scenario: Generate a metadata file | ||||||
|  |     Given I have an "index.html" file that contains "Basic Site" | ||||||
|  |     When I run jekyll build | ||||||
|  |     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 | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Basic Site" in "_site/index.html" | ||||||
|  |     When I wait 1 second | ||||||
|  |     Then I have an "index.html" file that contains "Bacon Site" | ||||||
|  |     When I run jekyll build | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Bacon Site" in "_site/index.html" | ||||||
|  | 
 | ||||||
|  |   Scenario: Rebuild when layout is changed | ||||||
|  |     Given I have a _layouts directory | ||||||
|  |     And I have an "index.html" page with layout "default" that contains "Basic Site with Layout" | ||||||
|  |     And I have a default layout that contains "Page Layout: {{ content }}" | ||||||
|  |     When I run jekyll build | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Page Layout: Basic Site with Layout" in "_site/index.html" | ||||||
|  |     When I wait 1 second | ||||||
|  |     Then I have a default layout that contains "Page Layout Changed: {{ content }}" | ||||||
|  |     When I run jekyll build --full-rebuild | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Page Layout Changed: Basic Site with Layout" in "_site/index.html" | ||||||
|  | 
 | ||||||
|  |   Scenario: Rebuild when an include is changed | ||||||
|  |     Given I have a _includes directory | ||||||
|  |     And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}" | ||||||
|  |     And I have an "_includes/about.textile" file that contains "Generated by Jekyll" | ||||||
|  |     When I run jekyll build | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html" | ||||||
|  |     When I wait 1 second | ||||||
|  |     Then I have an "_includes/about.textile" file that contains "Regenerated by Jekyll" | ||||||
|  |     When I run jekyll build | ||||||
|  |     Then the _site directory should exist | ||||||
|  |     And I should see "Basic Site with include tag: Regenerated by Jekyll" in "_site/index.html" | ||||||
|  | @ -17,7 +17,10 @@ Feature: Markdown | ||||||
|     And I should see "<h1 id=\"my-title\">My Title</h1>" in "_site/index.html" |     And I should see "<h1 id=\"my-title\">My Title</h1>" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Markdown in pagination on index |   Scenario: Markdown in pagination on index | ||||||
|     Given I have a configuration file with "paginate" set to "5" |     Given I have a configuration file with: | ||||||
|  |       | key      | value             | | ||||||
|  |       | paginate | 5                 | | ||||||
|  |       | gems     | [jekyll-paginate] | | ||||||
|     And I have an "index.html" page that contains "Index - {% for post in paginator.posts %} {{ post.content }} {% endfor %}" |     And I have an "index.html" page that contains "Index - {% for post in paginator.posts %} {{ post.content }} {% endfor %}" | ||||||
|     And I have a _posts directory |     And I have a _posts directory | ||||||
|     And I have the following post: |     And I have the following post: | ||||||
|  | @ -47,7 +50,7 @@ Feature: Markdown | ||||||
|     And I should see "My awesome code" in "_site/index.html" |     And I should see "My awesome code" in "_site/index.html" | ||||||
|     And I should see "<pre><code>My awesome code</code></pre>" in "_site/index.html" |     And I should see "<pre><code>My awesome code</code></pre>" in "_site/index.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Maruku fenced codeblocks |   Scenario: Maruku fenced codeblocks with syntax highlighting | ||||||
|     Given I have a configuration file with "markdown" set to "maruku" |     Given I have a configuration file with "markdown" set to "maruku" | ||||||
|     And I have an "index.markdown" file with content: |     And I have an "index.markdown" file with content: | ||||||
|        """ |        """ | ||||||
|  |  | ||||||
|  | @ -4,7 +4,10 @@ Feature: Site pagination | ||||||
|   I want divide the posts in several pages |   I want divide the posts in several pages | ||||||
| 
 | 
 | ||||||
|   Scenario Outline: Paginate with N posts per page |   Scenario Outline: Paginate with N posts per page | ||||||
|     Given I have a configuration file with "paginate" set to "<num>" |     Given I have a configuration file with: | ||||||
|  |       | key      | value             | | ||||||
|  |       | paginate | <num>             | | ||||||
|  |       | gems     | [jekyll-paginate] | | ||||||
|     And I have a _layouts directory |     And I have a _layouts directory | ||||||
|     And I have an "index.html" page that contains "{{ paginator.posts.size }}" |     And I have an "index.html" page that contains "{{ paginator.posts.size }}" | ||||||
|     And I have a _posts directory |     And I have a _posts directory | ||||||
|  | @ -32,6 +35,7 @@ Feature: Site pagination | ||||||
|       | paginate      | 1                              | |       | paginate      | 1                              | | ||||||
|       | paginate_path | /blog/page-:num                | |       | paginate_path | /blog/page-:num                | | ||||||
|       | permalink     | /blog/:year/:month/:day/:title | |       | permalink     | /blog/:year/:month/:day/:title | | ||||||
|  |       | gems          | [jekyll-paginate]              | | ||||||
|     And I have a blog directory |     And I have a blog directory | ||||||
|     And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}" |     And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}" | ||||||
|     And I have a _posts directory |     And I have a _posts directory | ||||||
|  | @ -59,6 +63,7 @@ Feature: Site pagination | ||||||
|       | paginate      | 1                              | |       | paginate      | 1                              | | ||||||
|       | paginate_path | /blog/page/:num                | |       | paginate_path | /blog/page/:num                | | ||||||
|       | permalink     | /blog/:year/:month/:day/:title | |       | permalink     | /blog/:year/:month/:day/:title | | ||||||
|  |       | gems          | [jekyll-paginate]              | | ||||||
|     And I have a blog directory |     And I have a blog directory | ||||||
|     And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}" |     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 an "index.html" page that contains "Don't pick me!" | ||||||
|  |  | ||||||
|  | @ -39,7 +39,7 @@ Feature: Fancy permalinks | ||||||
|     And I have the following post: |     And I have the following post: | ||||||
|       | title                   | category | date       | content         | |       | title                   | category | date       | content         | | ||||||
|       | Custom Permalink Schema | stuff    | 2009-03-27 | Totally custom. | |       | Custom Permalink Schema | stuff    | 2009-03-27 | Totally custom. | | ||||||
|     And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title" |     And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title/" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html" |     And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html" | ||||||
|  | @ -68,7 +68,7 @@ Feature: Fancy permalinks | ||||||
|     Given I have a _posts directory |     Given I have a _posts directory | ||||||
|     And I have the following post: |     And I have the following post: | ||||||
|       | title     | date       | permalink       | content | |       | title     | date       | permalink       | content | | ||||||
|       | Some post | 2013-04-14 | /custom/posts/1 | bla bla | |       | Some post | 2013-04-14 | /custom/posts/1/ | bla bla | | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And the _site/custom/posts/1 directory should exist |     And the _site/custom/posts/1 directory should exist | ||||||
|  | @ -83,13 +83,3 @@ Feature: Fancy permalinks | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And the _site/custom/posts directory should exist |     And the _site/custom/posts directory should exist | ||||||
|     And I should see "bla bla" in "_site/custom/posts/some.html" |     And I should see "bla bla" in "_site/custom/posts/some.html" | ||||||
| 
 |  | ||||||
|   Scenario: Use per-post ending in .htm |  | ||||||
|     Given I have a _posts directory |  | ||||||
|     And I have the following post: |  | ||||||
|       | title     | date       | permalink               | content | |  | ||||||
|       | Some post | 2013-04-14 | /custom/posts/some.htm  | bla bla | |  | ||||||
|     When I run jekyll build |  | ||||||
|     Then the _site directory should exist |  | ||||||
|     And the _site/custom/posts directory should exist |  | ||||||
|     And I should see "bla bla" in "_site/custom/posts/some.htm" |  | ||||||
|  |  | ||||||
|  | @ -141,7 +141,7 @@ Feature: Post data | ||||||
|     And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" |     And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html" |     And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Use post.categories variable when category is in YAML |   Scenario: Use post.categories variable when category is in YAML | ||||||
|     Given I have a _posts directory |     Given I have a _posts directory | ||||||
|  | @ -163,7 +163,7 @@ Feature: Post data | ||||||
|     And I have a simple layout that contains "Post category: {{ page.categories }}" |     And I have a simple layout that contains "Post category: {{ page.categories }}" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html" |     And I should see "Post category: Movies" in "_site/movies/2009/03/27/star-wars.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Use post.categories variable when categories are in YAML |   Scenario: Use post.categories variable when categories are in YAML | ||||||
|     Given I have a _posts directory |     Given I have a _posts directory | ||||||
|  | @ -197,8 +197,8 @@ Feature: Post data | ||||||
|     And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" |     And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html" |     And I should see "Post categories: scifi and Movies" in "_site/scifi/movies/2009/03/27/star-wars.html" | ||||||
|     And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html" |     And I should see "Post categories: SciFi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html" | ||||||
| 
 | 
 | ||||||
|   Scenario Outline: Use page.path variable |   Scenario Outline: Use page.path variable | ||||||
|     Given I have a <dir>/_posts directory |     Given I have a <dir>/_posts directory | ||||||
|  |  | ||||||
|  | @ -46,5 +46,5 @@ Feature: Post excerpts | ||||||
|     And the _site/2007/12 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 directory should exist | ||||||
|     And the "_site/2007/12/31/entry1.html" file should exist |     And the "_site/2007/12/31/entry1.html" file should exist | ||||||
|     And I should see exactly "<p>content for entry1.</p>" in "_site/index.html" |     And I should see "<p>content for entry1.</p>" in "_site/index.html" | ||||||
|     And I should see exactly "<html><head></head><body><p>content for entry1.</p></body></html>" in "_site/2007/12/31/entry1.html" |     And I should see "<html><head></head><body><p>content for entry1.</p>\n\n</body></html>" in "_site/2007/12/31/entry1.html" | ||||||
|  |  | ||||||
|  | @ -15,6 +15,7 @@ Feature: Rendering | ||||||
|   Scenario: Don't place asset files in layout |   Scenario: Don't place asset files in layout | ||||||
|     Given I have an "index.scss" page with layout "simple" that contains ".foo-bar { color:black; }" |     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 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!" |     And I have a simple layout that contains "{{ content }}Ahoy, indeed!" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|  | @ -28,8 +29,15 @@ Feature: Rendering | ||||||
|     Then the _site directory should exist |     Then the _site directory should exist | ||||||
|     And I should see ".foo-bar {\n  color: red; }" in "_site/index.css" |     And I should see ".foo-bar {\n  color: red; }" in "_site/index.css" | ||||||
| 
 | 
 | ||||||
|   Scenario: Render liquid in CoffeeScript |   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}}'" |     Given I have an "index.coffee" page with animal "cicada" that contains "hey='for {{page.animal}}'" | ||||||
|     When I run jekyll build |     When I run jekyll build | ||||||
|     Then the _site directory should exist |     Then 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 the _site directory should exist | ||||||
|     And I should see "hey = 'for cicada';" in "_site/index.js" |     And I should see "hey = 'for cicada';" in "_site/index.js" | ||||||
|  |  | ||||||
|  | @ -170,8 +170,8 @@ Feature: Site configuration | ||||||
|       When I run jekyll build |       When I run jekyll build | ||||||
|       Then the _site directory should exist |       Then the _site directory should exist | ||||||
|       And I should see "Page Layout: 2" in "_site/index.html" |       And I should see "Page Layout: 2" in "_site/index.html" | ||||||
|       And I should see "Post Layout: <p>content for entry1.</p> built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html" |       And I should see "Post Layout: <p>content for entry1.</p>\n built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html" | ||||||
|       And I should see "Post Layout: <p>content for entry2.</p> built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html" |       And I should see "Post Layout: <p>content for entry2.</p>\n built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html" | ||||||
| 
 | 
 | ||||||
|     Scenario: Generate proper dates with explicitly set timezone (different than posts' time) |     Scenario: Generate proper dates with explicitly set timezone (different than posts' time) | ||||||
|       Given I have a _layouts directory |       Given I have a _layouts directory | ||||||
|  | @ -180,19 +180,19 @@ Feature: Site configuration | ||||||
|       And I have an "index.html" page with layout "page" that contains "site index page" |       And I have an "index.html" page with layout "page" that contains "site index page" | ||||||
|       And I have a configuration file with: |       And I have a configuration file with: | ||||||
|         | key         | value               | |         | key         | value               | | ||||||
|         | timezone    | Australia/Melbourne | |         | timezone    | Pacific/Honolulu    | | ||||||
|       And I have a _posts directory |       And I have a _posts directory | ||||||
|       And I have the following posts: |       And I have the following posts: | ||||||
|         | title     | date                   | layout  | content             | |         | title     | date                   | layout  | content             | | ||||||
|         | entry1    | 2013-04-09 23:22 -0400 | post    | content for entry1. | |         | entry1    | 2013-04-09 23:22 +0400 | post    | content for entry1. | | ||||||
|         | entry2    | 2013-04-10 03:14 -0400 | post    | content for entry2. | |         | entry2    | 2013-04-10 03:14 +0400 | post    | content for entry2. | | ||||||
|       When I run jekyll build |       When I run jekyll build | ||||||
|       Then the _site directory should exist |       Then the _site directory should exist | ||||||
|       And I should see "Page Layout: 2" in "_site/index.html" |       And I should see "Page Layout: 2" in "_site/index.html" | ||||||
|       And the "_site/2013/04/10/entry1.html" file should exist |       And the "_site/2013/04/09/entry1.html" file should exist | ||||||
|       And the "_site/2013/04/10/entry2.html" file should exist |       And the "_site/2013/04/09/entry2.html" file should exist | ||||||
|       And I should see escaped "Post Layout: <p>content for entry1.</p> built at 2013-04-10T13:22:00+10:00" in "_site/2013/04/10/entry1.html" |       And I should see "Post Layout: <p>content for entry1.</p>\n built at 2013-04-09T09:22:00-10:00" in "_site/2013/04/09/entry1.html" | ||||||
|       And I should see escaped "Post Layout: <p>content for entry2.</p> built at 2013-04-10T17:14:00+10:00" in "_site/2013/04/10/entry2.html" |       And I should see "Post Layout: <p>content for entry2.</p>\n built at 2013-04-09T13:14:00-10:00" in "_site/2013/04/09/entry2.html" | ||||||
| 
 | 
 | ||||||
|   Scenario: Limit the number of posts generated by most recent date |   Scenario: Limit the number of posts generated by most recent date | ||||||
|     Given I have a _posts directory |     Given I have a _posts directory | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ def file_content_from_hash(input_hash) | ||||||
|     input_hash['content'] |     input_hash['content'] | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   <<EOF |   <<-EOF | ||||||
| --- | --- | ||||||
| #{matter} | #{matter} | ||||||
| --- | --- | ||||||
|  | @ -24,9 +24,10 @@ end | ||||||
| After do | After do | ||||||
|   FileUtils.rm_rf(TEST_DIR)   if File.exist?(TEST_DIR) |   FileUtils.rm_rf(TEST_DIR)   if File.exist?(TEST_DIR) | ||||||
|   FileUtils.rm(JEKYLL_COMMAND_OUTPUT_FILE) if File.exist?(JEKYLL_COMMAND_OUTPUT_FILE) |   FileUtils.rm(JEKYLL_COMMAND_OUTPUT_FILE) if File.exist?(JEKYLL_COMMAND_OUTPUT_FILE) | ||||||
|  |   Dir.chdir(File.dirname(TEST_DIR)) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| World(Test::Unit::Assertions) | World(Minitest::Assertions) | ||||||
| 
 | 
 | ||||||
| Given /^I have a blank site in "(.*)"$/ do |path| | Given /^I have a blank site in "(.*)"$/ do |path| | ||||||
|   FileUtils.mkdir_p(path) unless File.exist?(path) |   FileUtils.mkdir_p(path) unless File.exist?(path) | ||||||
|  | @ -39,7 +40,7 @@ end | ||||||
| # Like "I have a foo file" but gives a yaml front matter so jekyll actually processes it | # Like "I have a foo file" but gives a yaml front matter so jekyll actually processes it | ||||||
| Given /^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$/ do |file, key, value, text| | Given /^I have an? "(.*)" page(?: with (.*) "(.*)")? that contains "(.*)"$/ do |file, key, value, text| | ||||||
|   File.open(file, 'w') do |f| |   File.open(file, 'w') do |f| | ||||||
|     f.write <<EOF |     f.write <<-EOF | ||||||
| --- | --- | ||||||
| #{key || 'layout'}: #{value || 'nil'} | #{key || 'layout'}: #{value || 'nil'} | ||||||
| --- | --- | ||||||
|  | @ -83,7 +84,7 @@ end | ||||||
| Given /^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table| | Given /^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table| | ||||||
|   table.hashes.each do |input_hash| |   table.hashes.each do |input_hash| | ||||||
|     title = slug(input_hash['title']) |     title = slug(input_hash['title']) | ||||||
|     ext = input_hash['type'] || 'textile' |     ext = input_hash['type'] || 'markdown' | ||||||
|     before, after = location(folder, direction) |     before, after = location(folder, direction) | ||||||
| 
 | 
 | ||||||
|     case status |     case status | ||||||
|  | @ -133,6 +134,10 @@ Given /^I have fixture collections$/ do | ||||||
|   FileUtils.cp_r File.join(JEKYLL_SOURCE_DIR, "test", "source", "_methods"), source_dir |   FileUtils.cp_r File.join(JEKYLL_SOURCE_DIR, "test", "source", "_methods"), source_dir | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | Given /^I wait (\d+) second(s?)$/ do |time, plural| | ||||||
|  |   sleep(time.to_f) | ||||||
|  | end | ||||||
|  | 
 | ||||||
| ################## | ################## | ||||||
| # | # | ||||||
| # Changing stuff | # Changing stuff | ||||||
|  | @ -163,6 +168,12 @@ When /^I delete the file "(.*)"$/ do |file| | ||||||
|   File.delete(file) |   File.delete(file) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | ################## | ||||||
|  | # | ||||||
|  | # Checking stuff | ||||||
|  | # | ||||||
|  | ################## | ||||||
|  | 
 | ||||||
| Then /^the (.*) directory should +exist$/ do |dir| | Then /^the (.*) directory should +exist$/ do |dir| | ||||||
|   assert File.directory?(dir), "The directory \"#{dir}\" does not exist" |   assert File.directory?(dir), "The directory \"#{dir}\" does not exist" | ||||||
| end | end | ||||||
|  | @ -180,7 +191,7 @@ Then /^I should see exactly "(.*)" in "(.*)"$/ do |text, file| | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| Then /^I should not see "(.*)" in "(.*)"$/ do |text, file| | Then /^I should not see "(.*)" in "(.*)"$/ do |text, file| | ||||||
|   assert_no_match Regexp.new(text, Regexp::MULTILINE), file_contents(file) |   refute_match Regexp.new(text, Regexp::MULTILINE), file_contents(file) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file| | Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file| | ||||||
|  | @ -188,7 +199,15 @@ Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file| | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| Then /^the "(.*)" file should +exist$/ do |file| | Then /^the "(.*)" file should +exist$/ do |file| | ||||||
|   assert File.file?(file), "The file \"#{file}\" does not exist" |   file_does_exist = File.file?(file) | ||||||
|  |   unless file_does_exist | ||||||
|  |     all_steps_to_path(file).each do |dir| | ||||||
|  |       STDERR.puts "" | ||||||
|  |       STDERR.puts "Dir #{dir}:" | ||||||
|  |       STDERR.puts Dir["#{dir}/**/*"] | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  |   assert file_does_exist, "The file \"#{file}\" does not exist.\n" | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| Then /^the "(.*)" file should not exist$/ do |file| | Then /^the "(.*)" file should not exist$/ do |file| | ||||||
|  |  | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| require 'fileutils' | require 'fileutils' | ||||||
| require 'posix-spawn' | require 'posix-spawn' | ||||||
| require 'rr' | require 'minitest/assertions' | ||||||
| require 'test/unit' |  | ||||||
| require 'time' | require 'time' | ||||||
| 
 | 
 | ||||||
| JEKYLL_SOURCE_DIR = File.dirname(File.dirname(File.dirname(__FILE__))) | JEKYLL_SOURCE_DIR = File.dirname(File.dirname(File.dirname(__FILE__))) | ||||||
|  | @ -13,6 +12,17 @@ def source_dir(*files) | ||||||
|   File.join(TEST_DIR, *files) |   File.join(TEST_DIR, *files) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | def all_steps_to_path(path) | ||||||
|  |   source = Pathname.new(source_dir('_site')).expand_path | ||||||
|  |   dest   = Pathname.new(path).expand_path | ||||||
|  |   paths  = [] | ||||||
|  |   dest.ascend do |f| | ||||||
|  |     break if f.eql? source | ||||||
|  |     paths.unshift f.to_s | ||||||
|  |   end | ||||||
|  |   paths | ||||||
|  | end | ||||||
|  | 
 | ||||||
| def jekyll_output_file | def jekyll_output_file | ||||||
|   JEKYLL_COMMAND_OUTPUT_FILE |   JEKYLL_COMMAND_OUTPUT_FILE | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -5,64 +5,35 @@ require 'jekyll/version' | ||||||
| 
 | 
 | ||||||
| Gem::Specification.new do |s| | Gem::Specification.new do |s| | ||||||
|   s.specification_version = 2 if s.respond_to? :specification_version= |   s.specification_version = 2 if s.respond_to? :specification_version= | ||||||
|   s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= |   s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version= | ||||||
|   s.rubygems_version = '2.2.2' |   s.rubygems_version = '2.2.2' | ||||||
|   s.required_ruby_version = '>= 1.9.3' |   s.required_ruby_version = '>= 2.0.0' | ||||||
| 
 | 
 | ||||||
|   s.name              = 'jekyll' |   s.name          = 'jekyll' | ||||||
|   s.version           = Jekyll::VERSION |   s.version       = Jekyll::VERSION | ||||||
|   s.license           = 'MIT' |   s.license       = 'MIT' | ||||||
| 
 | 
 | ||||||
|   s.summary     = "A simple, blog aware, static site generator." |   s.summary       = 'A simple, blog aware, static site generator.' | ||||||
|   s.description = "Jekyll is a simple, blog aware, static site generator." |   s.description   = 'Jekyll is a simple, blog aware, static site generator.' | ||||||
| 
 | 
 | ||||||
|   s.authors  = ["Tom Preston-Werner"] |   s.authors       = ['Tom Preston-Werner'] | ||||||
|   s.email    = 'tom@mojombo.com' |   s.email         = 'tom@mojombo.com' | ||||||
|   s.homepage = 'https://github.com/jekyll/jekyll' |   s.homepage      = 'https://github.com/jekyll/jekyll' | ||||||
| 
 | 
 | ||||||
|   all_files       = `git ls-files -z`.split("\x0") |   all_files       = `git ls-files -z`.split("\x0") | ||||||
|   s.files         = all_files.grep(%r{^(bin|lib)/}) |   s.files         = all_files.grep(%r{^(bin|lib)/}) | ||||||
|   s.executables   = all_files.grep(%r{^bin/}) { |f| File.basename(f) } |   s.executables   = all_files.grep(%r{^bin/}) { |f| File.basename(f) } | ||||||
|   s.require_paths = ["lib"] |   s.require_paths = ['lib'] | ||||||
| 
 | 
 | ||||||
|   s.rdoc_options = ["--charset=UTF-8"] |   s.rdoc_options = ['--charset=UTF-8'] | ||||||
|   s.extra_rdoc_files = %w[README.markdown LICENSE] |   s.extra_rdoc_files = %w[README.markdown LICENSE] | ||||||
| 
 | 
 | ||||||
|   s.add_runtime_dependency('liquid',    "~> 2.6.1") |   s.add_runtime_dependency('liquid',    '~> 3.0') | ||||||
|   s.add_runtime_dependency('kramdown',  "~> 1.3") |   s.add_runtime_dependency('kramdown',  '~> 1.3') | ||||||
|   s.add_runtime_dependency('mercenary', "~> 0.3.3") |   s.add_runtime_dependency('mercenary', '~> 0.3.3') | ||||||
|   s.add_runtime_dependency('safe_yaml', "~> 1.0") |   s.add_runtime_dependency('safe_yaml', '~> 1.0') | ||||||
|   s.add_runtime_dependency('colorator', "~> 0.1") |   s.add_runtime_dependency('colorator', '~> 0.1') | ||||||
| 
 |   s.add_runtime_dependency('rouge', '~> 1.7') | ||||||
|   # Before 3.0 drops, phase the following gems out as dev dependencies |  | ||||||
|   # and gracefully handle their absence. |  | ||||||
|   s.add_runtime_dependency('pygments.rb', "~> 0.6.0") |  | ||||||
|   s.add_runtime_dependency('redcarpet', "~> 3.1") |  | ||||||
|   s.add_runtime_dependency('toml', '~> 0.1.0') |  | ||||||
|   s.add_runtime_dependency('jekyll-paginate', '~> 1.0') |  | ||||||
|   s.add_runtime_dependency('jekyll-gist', '~> 1.0') |  | ||||||
|   s.add_runtime_dependency('jekyll-coffeescript', '~> 1.0') |  | ||||||
|   s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') |   s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0') | ||||||
|   s.add_runtime_dependency('jekyll-watch', '~> 1.1') |   s.add_runtime_dependency('jekyll-watch', '~> 1.1') | ||||||
|   s.add_runtime_dependency('classifier-reborn', "~> 2.0") |  | ||||||
| 
 |  | ||||||
|   s.add_development_dependency('rake', "~> 10.1") |  | ||||||
|   s.add_development_dependency('rdoc', "~> 3.11") |  | ||||||
|   s.add_development_dependency('redgreen', "~> 1.2") |  | ||||||
|   s.add_development_dependency('shoulda', "~> 3.5") |  | ||||||
|   s.add_development_dependency('rr', "~> 1.1") |  | ||||||
|   s.add_development_dependency('cucumber', "1.3.11") |  | ||||||
|   s.add_development_dependency('RedCloth', "~> 4.2") |  | ||||||
|   s.add_development_dependency('maruku', "~> 0.7.0") |  | ||||||
|   s.add_development_dependency('rdiscount', "~> 1.6") |  | ||||||
|   s.add_development_dependency('launchy', "~> 2.3") |  | ||||||
|   s.add_development_dependency('simplecov', "~> 0.9") |  | ||||||
|   s.add_development_dependency('simplecov-gem-adapter', "~> 1.0.1") |  | ||||||
|   s.add_development_dependency('mime-types', "~> 1.5") |  | ||||||
|   s.add_development_dependency('activesupport', '~> 3.2.13') |  | ||||||
|   s.add_development_dependency('jekyll_test_plugin') |  | ||||||
|   s.add_development_dependency('jekyll_test_plugin_malicious') |  | ||||||
|   s.add_development_dependency('rouge', '~> 1.7') |  | ||||||
|   s.add_development_dependency('minitest') if RUBY_PLATFORM =~ /cygwin/ |  | ||||||
|   s.add_development_dependency('test-unit') if RUBY_PLATFORM =~ /cygwin/ |  | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ require 'time' | ||||||
| require 'English' | require 'English' | ||||||
| require 'pathname' | require 'pathname' | ||||||
| require 'logger' | require 'logger' | ||||||
|  | require 'set' | ||||||
| 
 | 
 | ||||||
| # 3rd party | # 3rd party | ||||||
| require 'safe_yaml/load' | require 'safe_yaml/load' | ||||||
|  | @ -29,6 +30,7 @@ require 'kramdown' | ||||||
| require 'colorator' | require 'colorator' | ||||||
| 
 | 
 | ||||||
| SafeYAML::OPTIONS[:suppress_warnings] = true | SafeYAML::OPTIONS[:suppress_warnings] = true | ||||||
|  | Liquid::Template.error_mode = :strict | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
| 
 | 
 | ||||||
|  | @ -43,6 +45,7 @@ module Jekyll | ||||||
|   autoload :EntryFilter,         'jekyll/entry_filter' |   autoload :EntryFilter,         'jekyll/entry_filter' | ||||||
|   autoload :Errors,              'jekyll/errors' |   autoload :Errors,              'jekyll/errors' | ||||||
|   autoload :Excerpt,             'jekyll/excerpt' |   autoload :Excerpt,             'jekyll/excerpt' | ||||||
|  |   autoload :External,            'jekyll/external' | ||||||
|   autoload :Filters,             'jekyll/filters' |   autoload :Filters,             'jekyll/filters' | ||||||
|   autoload :FrontmatterDefaults, 'jekyll/frontmatter_defaults' |   autoload :FrontmatterDefaults, 'jekyll/frontmatter_defaults' | ||||||
|   autoload :Layout,              'jekyll/layout' |   autoload :Layout,              'jekyll/layout' | ||||||
|  | @ -52,6 +55,7 @@ module Jekyll | ||||||
|   autoload :PluginManager,       'jekyll/plugin_manager' |   autoload :PluginManager,       'jekyll/plugin_manager' | ||||||
|   autoload :Post,                'jekyll/post' |   autoload :Post,                'jekyll/post' | ||||||
|   autoload :Publisher,           'jekyll/publisher' |   autoload :Publisher,           'jekyll/publisher' | ||||||
|  |   autoload :Regenerator,         'jekyll/regenerator' | ||||||
|   autoload :RelatedPosts,        'jekyll/related_posts' |   autoload :RelatedPosts,        'jekyll/related_posts' | ||||||
|   autoload :Renderer,            'jekyll/renderer' |   autoload :Renderer,            'jekyll/renderer' | ||||||
|   autoload :Site,                'jekyll/site' |   autoload :Site,                'jekyll/site' | ||||||
|  | @ -153,6 +157,9 @@ module Jekyll | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     # Conditional optimizations | ||||||
|  |     Jekyll::External.require_if_present('liquid-c') | ||||||
|  | 
 | ||||||
|   end |   end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | @ -162,11 +169,4 @@ require_all 'jekyll/converters/markdown' | ||||||
| require_all 'jekyll/generators' | require_all 'jekyll/generators' | ||||||
| require_all 'jekyll/tags' | require_all 'jekyll/tags' | ||||||
| 
 | 
 | ||||||
| # Eventually remove these for 3.0 as non-core | require 'jekyll-sass-converter' | ||||||
| Jekyll::Deprecator.gracefully_require(%w[ |  | ||||||
|   toml |  | ||||||
|   jekyll-paginate |  | ||||||
|   jekyll-gist |  | ||||||
|   jekyll-coffeescript |  | ||||||
|   jekyll-sass-converter |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
|  | @ -1,95 +1,101 @@ | ||||||
| require 'set' | require 'set' | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
|   class Site |   # Handles the cleanup of a site's destination before it is built. | ||||||
|     # Handles the cleanup of a site's destination before it is built. |   class Cleaner | ||||||
|     class Cleaner |     attr_reader :site | ||||||
|       attr_reader :site |  | ||||||
| 
 | 
 | ||||||
|       def initialize(site) |     def initialize(site) | ||||||
|         @site = site |       @site = site | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     # Cleans up the site's destination directory | ||||||
|  |     def cleanup! | ||||||
|  |       FileUtils.rm_rf(obsolete_files) | ||||||
|  |       FileUtils.rm_rf(metadata_file) if @site.full_rebuild? | ||||||
|  |     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 | ||||||
|  |       Dir.glob(site.in_dest_dir("**", "*"), File::FNM_DOTMATCH) do |file| | ||||||
|  |         files << file unless file =~ /\/\.{1,2}$/ || file =~ keep_file_regex || keep_dirs.include?(file) | ||||||
|       end |       end | ||||||
|  |       files | ||||||
|  |     end | ||||||
| 
 | 
 | ||||||
|       # Cleans up the site's destination directory |     # Private: The list of files to be created when site is built. | ||||||
|       def cleanup! |     # | ||||||
|         FileUtils.rm_rf(obsolete_files) |     # 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 | ||||||
|  |     end | ||||||
| 
 | 
 | ||||||
|       private |     # Private: The list of existing files that will be replaced by a directory during build | ||||||
|  |     # | ||||||
|  |     # Returns a Set with the file paths | ||||||
|  |     def replaced_files | ||||||
|  |       new_dirs.select { |dir| File.file?(dir) }.to_set | ||||||
|  |     end | ||||||
| 
 | 
 | ||||||
|       # Private: The list of files and directories to be deleted during cleanup process |     # Private: The list of directories that need to be kept because they are parent directories | ||||||
|       # |     # of files specified in keep_files | ||||||
|       # Returns an Array of the file and directory paths |     # | ||||||
|       def obsolete_files |     # Returns a Set with the directory paths | ||||||
|         (existing_files - new_files - new_dirs + replaced_files).to_a |     def keep_dirs | ||||||
|       end |       site.keep_files.map { |file| parent_dirs(site.in_dest_dir(file)) }.flatten.to_set | ||||||
|  |     end | ||||||
| 
 | 
 | ||||||
|       # Private: The list of existing files, apart from those included in keep_files and hidden files. |     # Private: Creates a regular expression from the config's keep_files array | ||||||
|       # |     # | ||||||
|       # Returns a Set with the file paths |     # Examples | ||||||
|       def existing_files |     #   ['.git','.svn'] creates the following regex: /\/(\.git|\/.svn)/ | ||||||
|         files = Set.new |     # | ||||||
|         Dir.glob(site.in_dest_dir("**", "*"), File::FNM_DOTMATCH) do |file| |     # Returns the regular expression | ||||||
|           files << file unless file =~ /\/\.{1,2}$/ || file =~ keep_file_regex || keep_dirs.include?(file) |     def keep_file_regex | ||||||
|         end |       or_list = site.keep_files.join("|") | ||||||
|         files |       pattern = "\/(#{or_list.gsub(".", "\.")})" | ||||||
|       end |       Regexp.new pattern | ||||||
| 
 |  | ||||||
|       # 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 |  | ||||||
|         or_list = site.keep_files.join("|") |  | ||||||
|         pattern = "\/(#{or_list.gsub(".", "\.")})" |  | ||||||
|         Regexp.new pattern |  | ||||||
|       end |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -40,7 +40,7 @@ module Jekyll | ||||||
|         if Utils.has_yaml_header? full_path |         if Utils.has_yaml_header? full_path | ||||||
|           doc = Jekyll::Document.new(full_path, { site: site, collection: self }) |           doc = Jekyll::Document.new(full_path, { site: site, collection: self }) | ||||||
|           doc.read |           doc.read | ||||||
|           docs << doc |           docs << doc if site.publisher.publish?(doc) | ||||||
|         else |         else | ||||||
|           relative_dir = Jekyll.sanitized_path(relative_directory, File.dirname(file_path)).chomp("/.") |           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) |           files << StaticFile.new(site, site.source, relative_dir, File.basename(full_path), self) | ||||||
|  | @ -170,7 +170,9 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns the URL template to render collection's documents at. |     # Returns the URL template to render collection's documents at. | ||||||
|     def url_template |     def url_template | ||||||
|       metadata.fetch('permalink', "/:collection/:path:output_ext") |       metadata.fetch('permalink') do | ||||||
|  |           Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) | ||||||
|  |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Extract options for this collection from the site configuration. |     # Extract options for this collection from the site configuration. | ||||||
|  | @ -183,6 +185,5 @@ module Jekyll | ||||||
|         {} |         {} | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 |  | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -49,6 +49,8 @@ module Jekyll | ||||||
|       # Returns nothing |       # Returns nothing | ||||||
|       def add_build_options(c) |       def add_build_options(c) | ||||||
|         c.option 'config',  '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file' |         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 '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 '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 'watch',   '-w', '--[no-]watch', 'Watch for changes and rebuild' | ||||||
|  | @ -58,6 +60,7 @@ module Jekyll | ||||||
|         c.option 'unpublished', '--unpublished', 'Render posts that were marked as unpublished' |         c.option 'unpublished', '--unpublished', 'Render posts that were marked as unpublished' | ||||||
|         c.option 'quiet',   '-q', '--quiet', 'Silence output.' |         c.option 'quiet',   '-q', '--quiet', 'Silence output.' | ||||||
|         c.option 'verbose', '-V', '--verbose', 'Print verbose output.' |         c.option 'verbose', '-V', '--verbose', 'Print verbose output.' | ||||||
|  |         c.option 'full_rebuild', '-f', '--full-rebuild', 'Disable incremental rebuild.' | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  | @ -48,13 +48,16 @@ module Jekyll | ||||||
|         # |         # | ||||||
|         # Returns nothing. |         # Returns nothing. | ||||||
|         def build(site, options) |         def build(site, options) | ||||||
|  |           t = Time.now | ||||||
|           source      = options['source'] |           source      = options['source'] | ||||||
|           destination = options['destination'] |           destination = options['destination'] | ||||||
|  |           full_build  = options['full_rebuild'] | ||||||
|           Jekyll.logger.info "Source:", source |           Jekyll.logger.info "Source:", source | ||||||
|           Jekyll.logger.info "Destination:", destination |           Jekyll.logger.info "Destination:", destination | ||||||
|  |           Jekyll.logger.info "Incremental build:", (full_build ? "disabled" : "enabled") | ||||||
|           Jekyll.logger.info "Generating..." |           Jekyll.logger.info "Generating..." | ||||||
|           process_site(site) |           process_site(site) | ||||||
|           Jekyll.logger.info "", "done." |           Jekyll.logger.info "", "done in #{(Time.now - t).round(3)} seconds." | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|         # Private: Watch for file changes and rebuild the site. |         # Private: Watch for file changes and rebuild the site. | ||||||
|  | @ -64,7 +67,7 @@ module Jekyll | ||||||
|         # |         # | ||||||
|         # Returns nothing. |         # Returns nothing. | ||||||
|         def watch(site, options) |         def watch(site, options) | ||||||
|           Deprecator.gracefully_require 'jekyll-watch' |           External.require_with_graceful_fail 'jekyll-watch' | ||||||
|           Jekyll::Watcher.watch(options) |           Jekyll::Watcher.watch(options) | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | module Jekyll | ||||||
|  |   module Commands | ||||||
|  |     class Clean < Command | ||||||
|  |       class << self | ||||||
|  | 
 | ||||||
|  |         def init_with_program(prog) | ||||||
|  |           prog.command(:clean) do |c| | ||||||
|  |             c.syntax 'clean [subcommand]' | ||||||
|  |             c.description 'Clean the site (removes site output and metadata file) without building.' | ||||||
|  | 
 | ||||||
|  |             c.action do |args, _| | ||||||
|  |               Jekyll::Commands::Clean.process({}) | ||||||
|  |             end | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         def process(options) | ||||||
|  |           options = configuration_from_options(options) | ||||||
|  |           destination = options['destination'] | ||||||
|  |           metadata_file = File.join(options['source'], '.jekyll-metadata') | ||||||
|  | 
 | ||||||
|  |           if File.directory? destination | ||||||
|  |             Jekyll.logger.info "Cleaning #{destination}..." | ||||||
|  |             FileUtils.rm_rf(destination) | ||||||
|  |             Jekyll.logger.info "", "done." | ||||||
|  |           else | ||||||
|  |             Jekyll.logger.info "Nothing to do for #{destination}." | ||||||
|  |           end | ||||||
|  | 
 | ||||||
|  |           if File.file? metadata_file | ||||||
|  |             Jekyll.logger.info "Removing #{metadata_file}..." | ||||||
|  |             FileUtils.rm_rf(metadata_file) | ||||||
|  |             Jekyll.logger.info "", "done." | ||||||
|  |           else | ||||||
|  |             Jekyll.logger.info "Nothing to do for #{metadata_file}." | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -1,30 +0,0 @@ | ||||||
| module Jekyll |  | ||||||
|   module Commands |  | ||||||
|     class Docs < Command |  | ||||||
| 
 |  | ||||||
|       class << self |  | ||||||
| 
 |  | ||||||
|         def init_with_program(prog) |  | ||||||
|           prog.command(:docs) do |c| |  | ||||||
|             c.syntax 'docs' |  | ||||||
|             c.description "Launch local server with docs for Jekyll v#{Jekyll::VERSION}" |  | ||||||
| 
 |  | ||||||
|             c.option 'port', '-P', '--port [PORT]', 'Port to listen on' |  | ||||||
|             c.option 'host', '-H', '--host [HOST]', 'Host to bind to' |  | ||||||
| 
 |  | ||||||
|             c.action do |args, options| |  | ||||||
|               options.merge!({ |  | ||||||
|                 'source'      => File.expand_path("../../../site", File.dirname(__FILE__)), |  | ||||||
|                 'destination' => File.expand_path("../../../site/_site", File.dirname(__FILE__)) |  | ||||||
|               }) |  | ||||||
|               Jekyll::Commands::Build.process(options) |  | ||||||
|               Jekyll::Commands::Serve.process(options) |  | ||||||
|             end |  | ||||||
|           end |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -39,7 +39,7 @@ module Jekyll | ||||||
|           contains_deprecated_pages = false |           contains_deprecated_pages = false | ||||||
|           site.pages.each do |page| |           site.pages.each do |page| | ||||||
|             if page.uses_relative_permalinks |             if page.uses_relative_permalinks | ||||||
|               Jekyll.logger.warn "Deprecation:", "'#{page.path}' uses relative" + |               Jekyll::Deprecator.deprecation_message "'#{page.path}' uses relative" + | ||||||
|                                   " permalinks which will be deprecated in" + |                                   " permalinks which will be deprecated in" + | ||||||
|                                   " Jekyll v2.0.0 and beyond." |                                   " Jekyll v2.0.0 and beyond." | ||||||
|               contains_deprecated_pages = true |               contains_deprecated_pages = true | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ require 'erb' | ||||||
| module Jekyll | module Jekyll | ||||||
|   module Commands |   module Commands | ||||||
|     class New < Command |     class New < Command | ||||||
|       class << self  |       class << self | ||||||
|         def init_with_program(prog) |         def init_with_program(prog) | ||||||
|           prog.command(:new) do |c| |           prog.command(:new) do |c| | ||||||
|             c.syntax 'new PATH' |             c.syntax 'new PATH' | ||||||
|  | @ -11,7 +11,7 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|             c.option 'force', '--force', 'Force creation even if PATH already exists' |             c.option 'force', '--force', 'Force creation even if PATH already exists' | ||||||
|             c.option 'blank', '--blank', 'Creates scaffolding but with empty files' |             c.option 'blank', '--blank', 'Creates scaffolding but with empty files' | ||||||
|              | 
 | ||||||
|             c.action do |args, options| |             c.action do |args, options| | ||||||
|               Jekyll::Commands::New.process(args, options) |               Jekyll::Commands::New.process(args, options) | ||||||
|             end |             end | ||||||
|  | @ -76,7 +76,7 @@ module Jekyll | ||||||
|         def scaffold_path |         def scaffold_path | ||||||
|           "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" |           "_posts/0000-00-00-welcome-to-jekyll.markdown.erb" | ||||||
|         end |         end | ||||||
|       end   |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -40,7 +40,7 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|           s.mount( |           s.mount( | ||||||
|             options['baseurl'], |             options['baseurl'], | ||||||
|             WEBrick::HTTPServlet::FileHandler, |             custom_file_handler, | ||||||
|             destination, |             destination, | ||||||
|             file_handler_options |             file_handler_options | ||||||
|           ) |           ) | ||||||
|  | @ -50,7 +50,7 @@ module Jekyll | ||||||
|           if options['detach'] # detach the server |           if options['detach'] # detach the server | ||||||
|             pid = Process.fork { s.start } |             pid = Process.fork { s.start } | ||||||
|             Process.detach(pid) |             Process.detach(pid) | ||||||
|             Jekyll.logger.info "Server detached with pid '#{pid}'.", "Run `kill -9 #{pid}' to stop the server." |             Jekyll.logger.info "Server detached with pid '#{pid}'.", "Run `pkill -f jekyll' or `kill -9 #{pid}' to stop the server." | ||||||
|           else # create a new server thread, then join it with current terminal |           else # create a new server thread, then join it with current terminal | ||||||
|             t = Thread.new { s.start } |             t = Thread.new { s.start } | ||||||
|             trap("INT") { s.shutdown } |             trap("INT") { s.shutdown } | ||||||
|  | @ -99,6 +99,21 @@ module Jekyll | ||||||
|           opts |           opts | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|  |         # Custom WEBrick FileHandler servlet for serving "/file.html" at "/file" | ||||||
|  |         # when no exact match is found. This mirrors the behavior of GitHub | ||||||
|  |         # Pages and many static web server configs. | ||||||
|  |         def custom_file_handler | ||||||
|  |           Class.new WEBrick::HTTPServlet::FileHandler do | ||||||
|  |             def search_file(req, res, basename) | ||||||
|  |               if file = super | ||||||
|  |                 file | ||||||
|  |               else | ||||||
|  |                 super(req, res, "#{basename}.html") | ||||||
|  |               end | ||||||
|  |             end | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|         def start_callback(detached) |         def start_callback(detached) | ||||||
|           unless detached |           unless detached | ||||||
|             Proc.new { Jekyll.logger.info "Server running...", "press ctrl-c to stop." } |             Proc.new { Jekyll.logger.info "Server running...", "press ctrl-c to stop." } | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ module Jekyll | ||||||
|       'keep_files'    => ['.git','.svn'], |       'keep_files'    => ['.git','.svn'], | ||||||
|       'encoding'      => 'utf-8', |       'encoding'      => 'utf-8', | ||||||
|       'markdown_ext'  => 'markdown,mkdown,mkdn,mkd,md', |       'markdown_ext'  => 'markdown,mkdown,mkdn,mkd,md', | ||||||
|       'textile_ext'   => 'textile', |       'full_rebuild'  => false, | ||||||
| 
 | 
 | ||||||
|       # Filtering Content |       # Filtering Content | ||||||
|       'show_drafts'   => nil, |       'show_drafts'   => nil, | ||||||
|  | @ -35,7 +35,7 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|       # Conversion |       # Conversion | ||||||
|       'markdown'      => 'kramdown', |       'markdown'      => 'kramdown', | ||||||
|       'highlighter'   => 'pygments', |       'highlighter'   => 'rouge', | ||||||
|       'lsi'           => false, |       'lsi'           => false, | ||||||
|       'excerpt_separator' => "\n\n", |       'excerpt_separator' => "\n\n", | ||||||
| 
 | 
 | ||||||
|  | @ -74,12 +74,12 @@ module Jekyll | ||||||
|       }, |       }, | ||||||
| 
 | 
 | ||||||
|       'kramdown' => { |       'kramdown' => { | ||||||
|         'auto_ids'      => true, |         'auto_ids'       => true, | ||||||
|         'footnote_nr'   => 1, |         'footnote_nr'    => 1, | ||||||
|         'entity_output' => 'as_char', |         'entity_output'  => 'as_char', | ||||||
|         'toc_levels'    => '1..6', |         'toc_levels'     => '1..6', | ||||||
|         'smart_quotes'  => 'lsquo,rsquo,ldquo,rdquo', |         'smart_quotes'   => 'lsquo,rsquo,ldquo,rdquo', | ||||||
|         'use_coderay'   => false, |         'enable_coderay' => false, | ||||||
| 
 | 
 | ||||||
|         'coderay' => { |         'coderay' => { | ||||||
|           'coderay_wrap'              => 'div', |           'coderay_wrap'              => 'div', | ||||||
|  | @ -89,10 +89,6 @@ module Jekyll | ||||||
|           'coderay_bold_every'        => 10, |           'coderay_bold_every'        => 10, | ||||||
|           'coderay_css'               => 'style' |           'coderay_css'               => 'style' | ||||||
|         } |         } | ||||||
|       }, |  | ||||||
| 
 |  | ||||||
|       'redcloth' => { |  | ||||||
|         'hard_breaks' => true |  | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -119,6 +115,7 @@ module Jekyll | ||||||
|     def safe_load_file(filename) |     def safe_load_file(filename) | ||||||
|       case File.extname(filename) |       case File.extname(filename) | ||||||
|       when /\.toml/i |       when /\.toml/i | ||||||
|  |         Jekyll::External.require_with_graceful_fail('toml') unless defined?(TOML) | ||||||
|         TOML.load_file(filename) |         TOML.load_file(filename) | ||||||
|       when /\.ya?ml/i |       when /\.ya?ml/i | ||||||
|         SafeYAML.load_file(filename) |         SafeYAML.load_file(filename) | ||||||
|  | @ -140,7 +137,7 @@ module Jekyll | ||||||
|       config_files = override.delete('config') |       config_files = override.delete('config') | ||||||
|       if config_files.to_s.empty? |       if config_files.to_s.empty? | ||||||
|         default = %w[yml yaml].find(Proc.new { 'yml' }) do |ext| |         default = %w[yml yaml].find(Proc.new { 'yml' }) do |ext| | ||||||
|           File.exists? Jekyll.sanitized_path(source(override), "_config.#{ext}") |           File.exist?(Jekyll.sanitized_path(source(override), "_config.#{ext}")) | ||||||
|         end |         end | ||||||
|         config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") |         config_files = Jekyll.sanitized_path(source(override), "_config.#{default}") | ||||||
|         @default_config_file = true |         @default_config_file = true | ||||||
|  | @ -209,7 +206,7 @@ module Jekyll | ||||||
|       config = clone |       config = clone | ||||||
|       # Provide backwards-compatibility |       # Provide backwards-compatibility | ||||||
|       if config.key?('auto') || config.key?('watch') |       if config.key?('auto') || config.key?('watch') | ||||||
|         Jekyll.logger.warn "Deprecation:", "Auto-regeneration can no longer" + |         Jekyll::Deprecator.deprecation_message "Auto-regeneration can no longer" + | ||||||
|                             " be set from your configuration file(s). Use the"+ |                             " be set from your configuration file(s). Use the"+ | ||||||
|                             " --[no-]watch/-w command-line option instead." |                             " --[no-]watch/-w command-line option instead." | ||||||
|         config.delete('auto') |         config.delete('auto') | ||||||
|  | @ -217,14 +214,14 @@ module Jekyll | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       if config.key? 'server' |       if config.key? 'server' | ||||||
|         Jekyll.logger.warn "Deprecation:", "The 'server' configuration option" + |         Jekyll::Deprecator.deprecation_message "The 'server' configuration option" + | ||||||
|                             " is no longer accepted. Use the 'jekyll serve'" + |                             " is no longer accepted. Use the 'jekyll serve'" + | ||||||
|                             " subcommand to serve your site with WEBrick." |                             " subcommand to serve your site with WEBrick." | ||||||
|         config.delete('server') |         config.delete('server') | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       if config.key? 'server_port' |       if config.key? 'server_port' | ||||||
|         Jekyll.logger.warn "Deprecation:", "The 'server_port' configuration option" + |         Jekyll::Deprecator.deprecation_message "The 'server_port' configuration option" + | ||||||
|                             " has been renamed to 'port'. Please update your config" + |                             " has been renamed to 'port'. Please update your config" + | ||||||
|                             " file accordingly." |                             " file accordingly." | ||||||
|         # copy but don't overwrite: |         # copy but don't overwrite: | ||||||
|  | @ -233,7 +230,7 @@ module Jekyll | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       if config.key? 'pygments' |       if config.key? 'pygments' | ||||||
|         Jekyll.logger.warn "Deprecation:", "The 'pygments' configuration option" + |         Jekyll::Deprecator.deprecation_message "The 'pygments' configuration option" + | ||||||
|                             " has been renamed to 'highlighter'. Please update your" + |                             " has been renamed to 'highlighter'. Please update your" + | ||||||
|                             " config file accordingly. The allowed values are 'rouge', " + |                             " config file accordingly. The allowed values are 'rouge', " + | ||||||
|                             "'pygments' or null." |                             "'pygments' or null." | ||||||
|  | @ -244,7 +241,7 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|       %w[include exclude].each do |option| |       %w[include exclude].each do |option| | ||||||
|         if config.fetch(option, []).is_a?(String) |         if config.fetch(option, []).is_a?(String) | ||||||
|           Jekyll.logger.warn "Deprecation:", "The '#{option}' configuration option" + |           Jekyll::Deprecator.deprecation_message "The '#{option}' configuration option" + | ||||||
|             " must now be specified as an array, but you specified" + |             " must now be specified as an array, but you specified" + | ||||||
|             " a string. For now, we've treated the string you provided" + |             " a string. For now, we've treated the string you provided" + | ||||||
|             " as a list of comma-separated values." |             " as a list of comma-separated values." | ||||||
|  | @ -253,11 +250,23 @@ module Jekyll | ||||||
|         config[option].map!(&:to_s) |         config[option].map!(&:to_s) | ||||||
|       end |       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") |       if config.fetch('markdown', 'kramdown').to_s.downcase.eql?("maruku") | ||||||
|         Jekyll::Deprecator.deprecation_message "You're using the 'maruku' " + |         Jekyll::Deprecator.deprecation_message "You're using the 'maruku' " + | ||||||
|           "Markdown processor. Maruku support has been deprecated and will " + |           "Markdown processor. Maruku support has been deprecated and will " + | ||||||
|           "be removed in 3.0.0. We recommend you switch to Kramdown." |           "be removed in 3.0.0. We recommend you switch to Kramdown." | ||||||
|       end |       end | ||||||
|  | 
 | ||||||
|  |       if config.key?('paginate') && config['paginate'] && !(config['gems'] || []).include?('jekyll-paginate') | ||||||
|  |         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 | ||||||
|       config |       config | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -46,15 +46,12 @@ module Jekyll | ||||||
|         ].map(&:to_sym) |         ].map(&:to_sym) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def extname_matches_regexp |       def extname_list | ||||||
|         @extname_matches_regexp ||= Regexp.new( |         @extname_list ||= @config['markdown_ext'].split(',').map { |e| ".#{e.downcase}" } | ||||||
|           '^\.(' + @config['markdown_ext'].gsub(',','|') +')$', |  | ||||||
|           Regexp::IGNORECASE |  | ||||||
|         ) |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def matches(ext) |       def matches(ext) | ||||||
|         ext =~ extname_matches_regexp |         extname_list.include? ext.downcase | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def output_ext(ext) |       def output_ext(ext) | ||||||
|  |  | ||||||
|  | @ -13,14 +13,14 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|         def convert(content) |         def convert(content) | ||||||
|           # Check for use of coderay |           # Check for use of coderay | ||||||
|           if @config['kramdown']['use_coderay'] |           if @config['kramdown']['enable_coderay'] | ||||||
|             %w[wrap line_numbers line_numbers_start tab_width bold_every css default_lang].each do |opt| |             %w[wrap line_numbers line_numbers_start tab_width bold_every css default_lang].each do |opt| | ||||||
|               key = "coderay_#{opt}" |               key = "coderay_#{opt}" | ||||||
|               @config['kramdown'][key] = @config['kramdown']['coderay'][key] unless @config['kramdown'].key?(key) |               @config['kramdown'][key] = @config['kramdown']['coderay'][key] unless @config['kramdown'].key?(key) | ||||||
|             end |             end | ||||||
|           end |           end | ||||||
| 
 | 
 | ||||||
|           Kramdown::Document.new(content, Utils.symbolize_hash_keys(@config["kramdown"])).to_html |           Kramdown::Document.new(content, Utils.symbolize_hash_keys(@config['kramdown'])).to_html | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|       end |       end | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ module Jekyll | ||||||
|     class Markdown |     class Markdown | ||||||
|       class RDiscountParser |       class RDiscountParser | ||||||
|         def initialize(config) |         def initialize(config) | ||||||
|           Jekyll::Deprecator.gracefully_require "rdiscount" |           Jekyll::External.require_with_graceful_fail "rdiscount" | ||||||
|           @config = config |           @config = config | ||||||
|           @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym } |           @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym } | ||||||
|         end |         end | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ module Jekyll | ||||||
|         module WithPygments |         module WithPygments | ||||||
|           include CommonMethods |           include CommonMethods | ||||||
|           def block_code(code, lang) |           def block_code(code, lang) | ||||||
|             Jekyll::Deprecator.gracefully_require("pygments") |             Jekyll::External.require_with_graceful_fail("pygments") | ||||||
|             lang = lang && lang.split.first || "text" |             lang = lang && lang.split.first || "text" | ||||||
|             add_code_tags( |             add_code_tags( | ||||||
|               Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }), |               Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }), | ||||||
|  | @ -55,7 +55,7 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         def initialize(config) |         def initialize(config) | ||||||
|           Deprecator.gracefully_require("redcarpet") |           External.require_with_graceful_fail("redcarpet") | ||||||
|           @config = config |           @config = config | ||||||
|           @redcarpet_extensions = {} |           @redcarpet_extensions = {} | ||||||
|           @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } |           @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } | ||||||
|  | @ -71,7 +71,7 @@ module Jekyll | ||||||
|             end |             end | ||||||
|           when "rouge" |           when "rouge" | ||||||
|             Class.new(Redcarpet::Render::HTML) do |             Class.new(Redcarpet::Render::HTML) do | ||||||
|               Jekyll::Deprecator.gracefully_require(%w[ |               Jekyll::External.require_with_graceful_fail(%w[ | ||||||
|                 rouge |                 rouge | ||||||
|                 rouge/plugins/redcarpet |                 rouge/plugins/redcarpet | ||||||
|               ]) |               ]) | ||||||
|  |  | ||||||
|  | @ -1,56 +0,0 @@ | ||||||
| module Jekyll |  | ||||||
|   module Converters |  | ||||||
|     class Textile < Converter |  | ||||||
|       safe true |  | ||||||
| 
 |  | ||||||
|       highlighter_prefix '<notextile>' |  | ||||||
|       highlighter_suffix '</notextile>' |  | ||||||
| 
 |  | ||||||
|       def setup |  | ||||||
|         return if @setup |  | ||||||
|         require 'redcloth' |  | ||||||
|         @setup = true |  | ||||||
|       rescue LoadError |  | ||||||
|         STDERR.puts 'You are missing a library required for Textile. Please run:' |  | ||||||
|         STDERR.puts '  $ [sudo] gem install RedCloth' |  | ||||||
|         raise Errors::FatalException.new("Missing dependency: RedCloth") |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def extname_matches_regexp |  | ||||||
|         @extname_matches_regexp ||= Regexp.new( |  | ||||||
|           '(' + @config['textile_ext'].gsub(',','|') +')$', |  | ||||||
|           Regexp::IGNORECASE |  | ||||||
|         ) |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def matches(ext) |  | ||||||
|         ext =~ extname_matches_regexp |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def output_ext(ext) |  | ||||||
|         ".html" |  | ||||||
|       end |  | ||||||
| 
 |  | ||||||
|       def convert(content) |  | ||||||
|         setup |  | ||||||
| 
 |  | ||||||
|         # Shortcut if config doesn't contain RedCloth section |  | ||||||
|         return RedCloth.new(content).to_html if @config['redcloth'].nil? |  | ||||||
| 
 |  | ||||||
|         # List of attributes defined on RedCloth |  | ||||||
|         # (from https://github.com/jgarber/redcloth/blob/master/lib/redcloth/textile_doc.rb) |  | ||||||
|         attrs = ['filter_classes', 'filter_html', 'filter_ids', 'filter_styles', |  | ||||||
|                 'hard_breaks', 'lite_mode', 'no_span_caps', 'sanitize_html'] |  | ||||||
| 
 |  | ||||||
|         r = RedCloth.new(content) |  | ||||||
| 
 |  | ||||||
|         # Set attributes in r if they are NOT nil in the config |  | ||||||
|         attrs.each do |attr| |  | ||||||
|           r.instance_variable_set("@#{attr}".to_sym, @config['redcloth'][attr]) unless @config['redcloth'][attr].nil? |  | ||||||
|         end |  | ||||||
| 
 |  | ||||||
|         r.to_html |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |  | ||||||
| end |  | ||||||
|  | @ -207,6 +207,12 @@ module Jekyll | ||||||
|                                          info, |                                          info, | ||||||
|                                          File.join(site.config['layouts'], layout.name)) |                                          File.join(site.config['layouts'], 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 layout = layouts[layout.data["layout"]] | ||||||
|           if used.include?(layout) |           if used.include?(layout) | ||||||
|             layout = nil # avoid recursive chain |             layout = nil # avoid recursive chain | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ module Jekyll | ||||||
|     def no_subcommand(args) |     def no_subcommand(args) | ||||||
|       if args.size > 0 && args.first =~ /^--/ && !%w[--help --version].include?(args.first) |       if args.size > 0 && args.first =~ /^--/ && !%w[--help --version].include?(args.first) | ||||||
|         deprecation_message "Jekyll now uses subcommands instead of just \ |         deprecation_message "Jekyll now uses subcommands instead of just \ | ||||||
|                             switches. Run `jekyll --help' to find out more." |                             switches. Run `jekyll --help` to find out more." | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -40,22 +40,5 @@ module Jekyll | ||||||
|       Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use 'type: #{current}'." |       Jekyll.logger.warn "Defaults:", "Please update your front-matter defaults to use 'type: #{current}'." | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def gracefully_require(gem_name) |  | ||||||
|       Array(gem_name).each do |name| |  | ||||||
|         begin |  | ||||||
|           require name |  | ||||||
|         rescue LoadError => e |  | ||||||
|           Jekyll.logger.error "Dependency Error:", <<-MSG |  | ||||||
|   Yikes! It looks like you don't have #{name} or one of its dependencies installed. |  | ||||||
|   In order to use Jekyll as currently 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 Errors::MissingDependencyException.new(name) |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -4,9 +4,11 @@ module Jekyll | ||||||
|   class Document |   class Document | ||||||
|     include Comparable |     include Comparable | ||||||
| 
 | 
 | ||||||
|     attr_reader   :path, :site, :extname |     attr_reader   :path, :site, :extname, :output_ext | ||||||
|     attr_accessor :content, :collection, :output |     attr_accessor :content, :collection, :output | ||||||
| 
 | 
 | ||||||
|  |     YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m | ||||||
|  | 
 | ||||||
|     # Create a new Document. |     # Create a new Document. | ||||||
|     # |     # | ||||||
|     # site - the Jekyll::Site instance to which this Document belongs |     # site - the Jekyll::Site instance to which this Document belongs | ||||||
|  | @ -17,6 +19,7 @@ module Jekyll | ||||||
|       @site = relations[:site] |       @site = relations[:site] | ||||||
|       @path = path |       @path = path | ||||||
|       @extname = File.extname(path) |       @extname = File.extname(path) | ||||||
|  |       @output_ext = Jekyll::Renderer.new(site, self).output_ext | ||||||
|       @collection = relations[:collection] |       @collection = relations[:collection] | ||||||
|       @has_yaml_header = nil |       @has_yaml_header = nil | ||||||
|     end |     end | ||||||
|  | @ -128,9 +131,9 @@ module Jekyll | ||||||
|       { |       { | ||||||
|         collection: collection.label, |         collection: collection.label, | ||||||
|         path:       cleaned_relative_path, |         path:       cleaned_relative_path, | ||||||
|         output_ext: Jekyll::Renderer.new(site, self).output_ext, |         output_ext: output_ext, | ||||||
|         name:       Utils.slugify(basename_without_ext), |         name:       Utils.slugify(basename_without_ext), | ||||||
|         title:      Utils.slugify(data['title']) || Utils.slugify(basename_without_ext) |         title:      Utils.slugify(data['slug']) || Utils.slugify(basename_without_ext) | ||||||
|       } |       } | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -160,8 +163,9 @@ module Jekyll | ||||||
|     # Returns the full path to the output file of this document. |     # Returns the full path to the output file of this document. | ||||||
|     def destination(base_directory) |     def destination(base_directory) | ||||||
|       dest = site.in_dest_dir(base_directory) |       dest = site.in_dest_dir(base_directory) | ||||||
|       path = site.in_dest_dir(dest, url) |       path = site.in_dest_dir(dest, URL.unescape_path(url)) | ||||||
|       path = File.join(path, "index.html") if url =~ /\/$/ |       path = File.join(path, "index.html") if url.end_with?("/") | ||||||
|  |       path << output_ext unless path.end_with?(output_ext) | ||||||
|       path |       path | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -210,7 +214,7 @@ module Jekyll | ||||||
|             @data = defaults |             @data = defaults | ||||||
|           end |           end | ||||||
|           @content = File.read(path, merged_file_read_opts(opts)) |           @content = File.read(path, merged_file_read_opts(opts)) | ||||||
|           if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m |           if content =~ YAML_FRONT_MATTER_REGEXP | ||||||
|             @content = $POSTMATCH |             @content = $POSTMATCH | ||||||
|             data_file = SafeYAML.load($1) |             data_file = SafeYAML.load($1) | ||||||
|             unless data_file.nil? |             unless data_file.nil? | ||||||
|  | @ -233,8 +237,8 @@ module Jekyll | ||||||
|         Utils.deep_merge_hashes data, { |         Utils.deep_merge_hashes data, { | ||||||
|           "output"        => output, |           "output"        => output, | ||||||
|           "content"       => content, |           "content"       => content, | ||||||
|           "path"          => path, |  | ||||||
|           "relative_path" => relative_path, |           "relative_path" => relative_path, | ||||||
|  |           "path"          => relative_path, | ||||||
|           "url"           => url, |           "url"           => url, | ||||||
|           "collection"    => collection.label |           "collection"    => collection.label | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -105,8 +105,7 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns excerpt String |     # Returns excerpt String | ||||||
|     def extract_excerpt(post_content) |     def extract_excerpt(post_content) | ||||||
|       separator     = site.config['excerpt_separator'] |       head, _, tail = post_content.to_s.partition(post.excerpt_separator) | ||||||
|       head, _, tail = post_content.to_s.partition(separator) |  | ||||||
| 
 | 
 | ||||||
|       "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n") |       "" << head << "\n\n" << tail.scan(/^\[[^\]]+\]:.+$/).join("\n") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | module Jekyll | ||||||
|  |   module External | ||||||
|  |     class << self | ||||||
|  | 
 | ||||||
|  |       # | ||||||
|  |       # Gems that, if installed, should be loaded. | ||||||
|  |       # Usually contain subcommands. | ||||||
|  |       # | ||||||
|  |       def blessed_gems | ||||||
|  |         %w{ | ||||||
|  |           jekyll-docs | ||||||
|  |           jekyll-import | ||||||
|  |         } | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       # | ||||||
|  |       # Require a gem or file if it's present, otherwise silently fail. | ||||||
|  |       # | ||||||
|  |       # names - a string gem name or array of gem names | ||||||
|  |       # | ||||||
|  |       def require_if_present(names) | ||||||
|  |         Array(names).each do |name| | ||||||
|  |           begin | ||||||
|  |             require name | ||||||
|  |           rescue LoadError | ||||||
|  |             Jekyll.logger.debug "Couldn't load #{name}. Skipping." | ||||||
|  |             false | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       # | ||||||
|  |       # Require a gem or gems. If it's not present, show a very nice error | ||||||
|  |       # message that explains everything and is much more helpful than the | ||||||
|  |       # normal LoadError. | ||||||
|  |       # | ||||||
|  |       # names - a string gem name or array of gem names | ||||||
|  |       # | ||||||
|  |       def require_with_graceful_fail(names) | ||||||
|  |         Array(names).each do |name| | ||||||
|  |           begin | ||||||
|  |             require name | ||||||
|  |           rescue LoadError => e | ||||||
|  |             Jekyll.logger.error "Dependency Error:", <<-MSG | ||||||
|  | Yikes! It looks like you don't have #{name} or one of its dependencies installed. | ||||||
|  | In order to use Jekyll as currently configured, you'll need to install this gem. | ||||||
|  | 
 | ||||||
|  | The full error message from Ruby is: '#{e.message}' | ||||||
|  | 
 | ||||||
|  | If you run into trouble, you can find helpful resources at http://jekyllrb.com/help/! | ||||||
|  |             MSG | ||||||
|  |             raise Jekyll::Errors::MissingDependencyException.new(name) | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -1,19 +1,9 @@ | ||||||
| require 'uri' | require 'uri' | ||||||
| require 'json' | require 'json' | ||||||
|  | require 'date' | ||||||
| 
 | 
 | ||||||
| module Jekyll | module Jekyll | ||||||
|   module Filters |   module Filters | ||||||
|     # Convert a Textile string into HTML output. |  | ||||||
|     # |  | ||||||
|     # input - The Textile String to convert. |  | ||||||
|     # |  | ||||||
|     # Returns the HTML formatted String. |  | ||||||
|     def textilize(input) |  | ||||||
|       site = @context.registers[:site] |  | ||||||
|       converter = site.getConverterImpl(Jekyll::Converters::Textile) |  | ||||||
|       converter.convert(input) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     # Convert a Markdown string into HTML output. |     # Convert a Markdown string into HTML output. | ||||||
|     # |     # | ||||||
|     # input - The Markdown String to convert. |     # input - The Markdown String to convert. | ||||||
|  | @ -21,7 +11,7 @@ module Jekyll | ||||||
|     # Returns the HTML formatted String. |     # Returns the HTML formatted String. | ||||||
|     def markdownify(input) |     def markdownify(input) | ||||||
|       site = @context.registers[:site] |       site = @context.registers[:site] | ||||||
|       converter = site.getConverterImpl(Jekyll::Converters::Markdown) |       converter = site.find_converter_instance(Jekyll::Converters::Markdown) | ||||||
|       converter.convert(input) |       converter.convert(input) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -32,7 +22,7 @@ module Jekyll | ||||||
|     # Returns the CSS formatted String. |     # Returns the CSS formatted String. | ||||||
|     def sassify(input) |     def sassify(input) | ||||||
|       site = @context.registers[:site] |       site = @context.registers[:site] | ||||||
|       converter = site.getConverterImpl(Jekyll::Converters::Sass) |       converter = site.find_converter_instance(Jekyll::Converters::Sass) | ||||||
|       converter.convert(input) |       converter.convert(input) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -43,19 +33,19 @@ module Jekyll | ||||||
|     # Returns the CSS formatted String. |     # Returns the CSS formatted String. | ||||||
|     def scssify(input) |     def scssify(input) | ||||||
|       site = @context.registers[:site] |       site = @context.registers[:site] | ||||||
|       converter = site.getConverterImpl(Jekyll::Converters::Scss) |       converter = site.find_converter_instance(Jekyll::Converters::Scss) | ||||||
|       converter.convert(input) |       converter.convert(input) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Slugify a filename or title. |     # Slugify a filename or title. | ||||||
|     # |     # | ||||||
|     # input - The filename or title to slugify. |     # input - The filename or title to slugify. | ||||||
|  |     # mode - how string is slugified | ||||||
|     # |     # | ||||||
|     # Returns the given filename or title as a lowercase String, with every |     # Returns the given filename or title as a lowercase URL String. | ||||||
|     # sequence of spaces and non-alphanumeric characters replaced with a |     # See Utils.slugify for more detail. | ||||||
|     # hyphen. |     def slugify(input, mode=nil) | ||||||
|     def slugify(input) |       Utils.slugify(input, mode) | ||||||
|       Utils.slugify(input) |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Format a date in short format e.g. "27 Jan 2011". |     # Format a date in short format e.g. "27 Jan 2011". | ||||||
|  | @ -232,6 +222,9 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns the filtered array of objects |     # Returns the filtered array of objects | ||||||
|     def sort(input, property = nil, nils = "first") |     def sort(input, property = nil, nils = "first") | ||||||
|  |       if input.nil? | ||||||
|  |           raise ArgumentError.new("Cannot sort a null object.") | ||||||
|  |       end | ||||||
|       if property.nil? |       if property.nil? | ||||||
|         input.sort |         input.sort | ||||||
|       else |       else | ||||||
|  | @ -302,6 +295,8 @@ module Jekyll | ||||||
|       case input |       case input | ||||||
|       when Time |       when Time | ||||||
|         input |         input | ||||||
|  |       when Date | ||||||
|  |         input.to_time | ||||||
|       when String |       when String | ||||||
|         Time.parse(input) rescue Time.at(input.to_i) |         Time.parse(input) rescue Time.at(input.to_i) | ||||||
|       when Numeric |       when Numeric | ||||||
|  | @ -309,7 +304,7 @@ module Jekyll | ||||||
|       else |       else | ||||||
|         Jekyll.logger.error "Invalid Date:", "'#{input}' is not a valid datetime." |         Jekyll.logger.error "Invalid Date:", "'#{input}' is not a valid datetime." | ||||||
|         exit(1) |         exit(1) | ||||||
|       end |       end.localtime | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def groupable?(element) |     def groupable?(element) | ||||||
|  | @ -328,14 +323,23 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|     def as_liquid(item) |     def as_liquid(item) | ||||||
|       case item |       case item | ||||||
|       when String, Numeric, true, false, nil |  | ||||||
|         item.to_liquid |  | ||||||
|       when Hash |       when Hash | ||||||
|         Hash[item.map { |k, v| [as_liquid(k), as_liquid(v)] }] |         pairs = item.map { |k, v| as_liquid([k, v]) } | ||||||
|  |         Hash[pairs] | ||||||
|       when Array |       when Array | ||||||
|         item.map{ |i| as_liquid(i) } |         item.map{ |i| as_liquid(i) } | ||||||
|       else |       else | ||||||
|         item.respond_to?(:to_liquid) ? as_liquid(item.to_liquid) : item |         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 | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  | @ -168,7 +168,7 @@ module Jekyll | ||||||
|       end.compact |       end.compact | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Sanitizes the given path by removing a leading and addding a trailing slash |     # Sanitizes the given path by removing a leading and adding a trailing slash | ||||||
|     def sanitize_path(path) |     def sanitize_path(path) | ||||||
|       if path.nil? || path.empty? |       if path.nil? || path.empty? | ||||||
|         "" |         "" | ||||||
|  |  | ||||||
|  | @ -8,6 +8,9 @@ module Jekyll | ||||||
|     # Gets the name of this layout. |     # Gets the name of this layout. | ||||||
|     attr_reader :name |     attr_reader :name | ||||||
| 
 | 
 | ||||||
|  |     # Gets the path to this layout. | ||||||
|  |     attr_reader :path | ||||||
|  | 
 | ||||||
|     # Gets/Sets the extension of this layout. |     # Gets/Sets the extension of this layout. | ||||||
|     attr_accessor :ext |     attr_accessor :ext | ||||||
| 
 | 
 | ||||||
|  | @ -26,6 +29,7 @@ module Jekyll | ||||||
|       @site = site |       @site = site | ||||||
|       @base = base |       @base = base | ||||||
|       @name = name |       @name = name | ||||||
|  |       @path = site.in_source_dir(base, name) | ||||||
| 
 | 
 | ||||||
|       self.data = {} |       self.data = {} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| module Jekyll | module Jekyll | ||||||
|   class LogAdapter |   class LogAdapter | ||||||
|     attr_reader :writer |     attr_reader :writer, :messages | ||||||
| 
 | 
 | ||||||
|     LOG_LEVELS = { |     LOG_LEVELS = { | ||||||
|       :debug => ::Logger::DEBUG, |       :debug => ::Logger::DEBUG, | ||||||
|  | @ -16,6 +16,7 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns nothing |     # Returns nothing | ||||||
|     def initialize(writer, level = :info) |     def initialize(writer, level = :info) | ||||||
|  |       @messages = [] | ||||||
|       @writer = writer |       @writer = writer | ||||||
|       self.log_level = level |       self.log_level = level | ||||||
|     end |     end | ||||||
|  | @ -87,7 +88,9 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns the formatted message |     # Returns the formatted message | ||||||
|     def message(topic, message) |     def message(topic, message) | ||||||
|       formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ') |       msg = formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ') | ||||||
|  |       messages << msg | ||||||
|  |       msg | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Internal: Format the topic |     # Internal: Format the topic | ||||||
|  |  | ||||||
|  | @ -63,16 +63,12 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns the template String. |     # Returns the template String. | ||||||
|     def template |     def template | ||||||
|       if site.permalink_style == :pretty |       if !html? | ||||||
|         if index? && html? |  | ||||||
|           "/:path/" |  | ||||||
|         elsif html? |  | ||||||
|           "/:path/:basename/" |  | ||||||
|         else |  | ||||||
|           "/:path/:basename:output_ext" |  | ||||||
|         end |  | ||||||
|       else |  | ||||||
|         "/:path/:basename:output_ext" |         "/:path/:basename:output_ext" | ||||||
|  |       elsif index? | ||||||
|  |         "/:path/" | ||||||
|  |       else | ||||||
|  |         Utils.add_permalink_suffix("/:path/:basename", site.permalink_style) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -141,7 +137,8 @@ module Jekyll | ||||||
|     # Returns the destination file path String. |     # Returns the destination file path String. | ||||||
|     def destination(dest) |     def destination(dest) | ||||||
|       path = site.in_dest_dir(dest, URL.unescape_path(url)) |       path = site.in_dest_dir(dest, URL.unescape_path(url)) | ||||||
|       path = File.join(path, "index.html") if url =~ /\/$/ |       path = File.join(path, "index.html") if url.end_with?("/") | ||||||
|  |       path << output_ext unless path.end_with?(output_ext) | ||||||
|       path |       path | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -23,6 +23,8 @@ module Jekyll | ||||||
|     ATTRIBUTES_FOR_LIQUID = EXCERPT_ATTRIBUTES_FOR_LIQUID + %w[ |     ATTRIBUTES_FOR_LIQUID = EXCERPT_ATTRIBUTES_FOR_LIQUID + %w[ | ||||||
|       content |       content | ||||||
|       excerpt |       excerpt | ||||||
|  |       excerpt_separator | ||||||
|  |       draft? | ||||||
|     ] |     ] | ||||||
| 
 | 
 | ||||||
|     # Post name validator. Post filenames must be like: |     # Post name validator. Post filenames must be like: | ||||||
|  | @ -52,12 +54,12 @@ module Jekyll | ||||||
|       @base = containing_dir(dir) |       @base = containing_dir(dir) | ||||||
|       @name = name |       @name = name | ||||||
| 
 | 
 | ||||||
|       self.categories = dir.downcase.split('/').reject { |x| x.empty? } |       self.categories = dir.split('/').reject { |x| x.empty? } | ||||||
|       process(name) |       process(name) | ||||||
|       read_yaml(@base, name) |       read_yaml(@base, name) | ||||||
| 
 | 
 | ||||||
|       data.default_proc = proc do |hash, key| |       data.default_proc = proc do |hash, key| | ||||||
|         site.frontmatter_defaults.find(File.join(dir, name), type, key) |         site.frontmatter_defaults.find(relative_path, type, key) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       if data.key?('date') |       if data.key?('date') | ||||||
|  | @ -80,7 +82,7 @@ module Jekyll | ||||||
|       categories_from_data = Utils.pluralized_array_from_hash(data, 'category', 'categories') |       categories_from_data = Utils.pluralized_array_from_hash(data, 'category', 'categories') | ||||||
|       self.categories = ( |       self.categories = ( | ||||||
|         Array(categories) + categories_from_data |         Array(categories) + categories_from_data | ||||||
|       ).map {|c| c.to_s.downcase}.flatten.uniq |       ).map { |c| c.to_s }.flatten.uniq | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def populate_tags |     def populate_tags | ||||||
|  | @ -118,6 +120,14 @@ module Jekyll | ||||||
|       data.fetch('title') { titleized_slug } |       data.fetch('title') { titleized_slug } | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     # Public: the Post excerpt_separator, from the YAML Front-Matter or site default | ||||||
|  |     #         excerpt_separator value | ||||||
|  |     # | ||||||
|  |     # Returns the post excerpt_separator | ||||||
|  |     def excerpt_separator | ||||||
|  |       (data['excerpt_separator'] || site.config['excerpt_separator']).to_s | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     # Turns the post slug into a suitable title |     # Turns the post slug into a suitable title | ||||||
|     def titleized_slug |     def titleized_slug | ||||||
|       slug.split('-').select {|w| w.capitalize! || w }.join(' ') |       slug.split('-').select {|w| w.capitalize! || w }.join(' ') | ||||||
|  | @ -218,7 +228,7 @@ module Jekyll | ||||||
|         :title       => slug, |         :title       => slug, | ||||||
|         :i_day       => date.strftime("%-d"), |         :i_day       => date.strftime("%-d"), | ||||||
|         :i_month     => date.strftime("%-m"), |         :i_month     => date.strftime("%-m"), | ||||||
|         :categories  => (categories || []).map { |c| c.to_s }.join('/'), |         :categories  => (categories || []).map { |c| c.to_s.downcase }.uniq.join('/'), | ||||||
|         :short_month => date.strftime("%b"), |         :short_month => date.strftime("%b"), | ||||||
|         :short_year  => date.strftime("%y"), |         :short_year  => date.strftime("%y"), | ||||||
|         :y_day       => date.strftime("%j"), |         :y_day       => date.strftime("%j"), | ||||||
|  | @ -269,7 +279,8 @@ module Jekyll | ||||||
|     def destination(dest) |     def destination(dest) | ||||||
|       # The url needs to be unescaped in order to preserve the correct filename |       # The url needs to be unescaped in order to preserve the correct filename | ||||||
|       path = site.in_dest_dir(dest, URL.unescape_path(url)) |       path = site.in_dest_dir(dest, URL.unescape_path(url)) | ||||||
|       path = File.join(path, "index.html") if path[/\.html?$/].nil? |       path = File.join(path, "index.html") if self.url.end_with?("/") | ||||||
|  |       path << output_ext unless path.end_with?(output_ext) | ||||||
|       path |       path | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -296,6 +307,11 @@ module Jekyll | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     # Returns if this Post is a Draft | ||||||
|  |     def draft? | ||||||
|  |       is_a?(Jekyll::Draft) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     protected |     protected | ||||||
| 
 | 
 | ||||||
|     def extract_excerpt |     def extract_excerpt | ||||||
|  | @ -307,7 +323,7 @@ module Jekyll | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def generate_excerpt? |     def generate_excerpt? | ||||||
|       !(site.config['excerpt_separator'].to_s.empty?) |       !excerpt_separator.empty? | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -0,0 +1,141 @@ | ||||||
|  | module Jekyll | ||||||
|  |   class Regenerator | ||||||
|  |     attr_reader :site, :metadata, :cache | ||||||
|  | 
 | ||||||
|  |     def initialize(site) | ||||||
|  |       @site = site | ||||||
|  | 
 | ||||||
|  |       # Read metadata from file | ||||||
|  |       read_metadata | ||||||
|  | 
 | ||||||
|  |       # Initialize cache to an empty hash | ||||||
|  |       @cache = {} | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     # Checks if a renderable object needs to be regenerated | ||||||
|  |     # | ||||||
|  |     # Returns a boolean. | ||||||
|  |     def regenerate?(document) | ||||||
|  |       case document | ||||||
|  |       when Post, Page | ||||||
|  |         document.asset_file? || document.data['regenerate'] || | ||||||
|  |           modified?(site.in_source_dir(document.relative_path)) | ||||||
|  |       when Document | ||||||
|  |         !document.write? || document.data['regenerate'] || modified?(document.path) | ||||||
|  |       else | ||||||
|  |         if document.respond_to?(:path) | ||||||
|  |           modified?(document.path) | ||||||
|  |         else | ||||||
|  |           true | ||||||
|  |         end | ||||||
|  |       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 = {} | ||||||
|  |       @cache = {} | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     # Checks if a path's (or one of its dependencies) | ||||||
|  |     # mtime has changed | ||||||
|  |     # | ||||||
|  |     # Returns a boolean. | ||||||
|  |     def modified?(path) | ||||||
|  |       return true if disabled? | ||||||
|  | 
 | ||||||
|  |       # Check for path in cache | ||||||
|  |       if cache.has_key? path | ||||||
|  |         return cache[path] | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|  |       # Check path that exists in metadata | ||||||
|  |       data = metadata[path] | ||||||
|  |       if data | ||||||
|  |         data["deps"].each do |dependency| | ||||||
|  |           if modified?(dependency) | ||||||
|  |             return cache[dependency] = cache[path] = true | ||||||
|  |           end | ||||||
|  |         end | ||||||
|  |         if 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) | ||||||
|  | 
 | ||||||
|  |       metadata[path]["deps"] << dependency unless metadata[path]["deps"].include? dependency | ||||||
|  |       regenerate? dependency | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     # Write the metadata to disk | ||||||
|  |     # | ||||||
|  |     # Returns nothing. | ||||||
|  |     def write_metadata | ||||||
|  |       File.open(metadata_file, 'w') do |f| | ||||||
|  |         f.write(metadata.to_yaml) | ||||||
|  |       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.full_rebuild? 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) | ||||||
|  |         SafeYAML.load(File.read(metadata_file)) | ||||||
|  |       else | ||||||
|  |         {} | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -10,7 +10,7 @@ module Jekyll | ||||||
|     def initialize(post) |     def initialize(post) | ||||||
|       @post = post |       @post = post | ||||||
|       @site = post.site |       @site = post.site | ||||||
|       require 'classifier-reborn' if site.lsi |       Jekyll::External.require_with_graceful_fail('classifier-reborn') if site.lsi | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def build |     def build | ||||||
|  |  | ||||||
|  | @ -3,11 +3,12 @@ | ||||||
| module Jekyll | module Jekyll | ||||||
|   class Renderer |   class Renderer | ||||||
| 
 | 
 | ||||||
|     attr_reader :document, :site |     attr_reader :document, :site, :site_payload | ||||||
| 
 | 
 | ||||||
|     def initialize(site, document) |     def initialize(site, document, site_payload = nil) | ||||||
|       @site     = site |       @site         = site | ||||||
|       @document = document |       @document     = document | ||||||
|  |       @site_payload = site_payload | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Determine which converters to use based on this document's |     # Determine which converters to use based on this document's | ||||||
|  | @ -32,7 +33,7 @@ module Jekyll | ||||||
|     def run |     def run | ||||||
|       payload = Utils.deep_merge_hashes({ |       payload = Utils.deep_merge_hashes({ | ||||||
|         "page" => document.to_liquid |         "page" => document.to_liquid | ||||||
|       }, site.site_payload) |       }, site_payload || site.site_payload) | ||||||
| 
 | 
 | ||||||
|       info = { |       info = { | ||||||
|         filters:   [Jekyll::Filters], |         filters:   [Jekyll::Filters], | ||||||
|  | @ -138,6 +139,12 @@ module Jekyll | ||||||
|           File.join(site.config['layouts'], layout.name) |           File.join(site.config['layouts'], 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 layout = site.layouts[layout.data["layout"]] | ||||||
|           if used.include?(layout) |           if used.include?(layout) | ||||||
|             layout = nil # avoid recursive chain |             layout = nil # avoid recursive chain | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ module Jekyll | ||||||
|                   :gems, :plugin_manager |                   :gems, :plugin_manager | ||||||
| 
 | 
 | ||||||
|     attr_accessor :converters, :generators |     attr_accessor :converters, :generators | ||||||
|  |     attr_reader   :regenerator | ||||||
| 
 | 
 | ||||||
|     # Public: Initialize a new Site. |     # Public: Initialize a new Site. | ||||||
|     # |     # | ||||||
|  | @ -27,6 +28,9 @@ module Jekyll | ||||||
|       @source              = File.expand_path(config['source']).freeze |       @source              = File.expand_path(config['source']).freeze | ||||||
|       @dest                = File.expand_path(config['destination']).freeze |       @dest                = File.expand_path(config['destination']).freeze | ||||||
| 
 | 
 | ||||||
|  |       # Initialize incremental regenerator | ||||||
|  |       @regenerator = Regenerator.new(self) | ||||||
|  | 
 | ||||||
|       self.plugin_manager = Jekyll::PluginManager.new(self) |       self.plugin_manager = Jekyll::PluginManager.new(self) | ||||||
|       self.plugins        = plugin_manager.plugins_path |       self.plugins        = plugin_manager.plugins_path | ||||||
| 
 | 
 | ||||||
|  | @ -183,6 +187,7 @@ module Jekyll | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       pages.sort_by!(&:name) |       pages.sort_by!(&:name) | ||||||
|  |       static_files.sort_by!(&:relative_path) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Read all the files in <source>/<dir>/_posts and create a new Post |     # Read all the files in <source>/<dir>/_posts and create a new Post | ||||||
|  | @ -253,16 +258,26 @@ module Jekyll | ||||||
|         if File.directory?(path) |         if File.directory?(path) | ||||||
|           read_data_to(path, data[key] = {}) |           read_data_to(path, data[key] = {}) | ||||||
|         else |         else | ||||||
|           case File.extname(path).downcase |           data[key] = read_data_file(path) | ||||||
|           when '.csv' |  | ||||||
|             data[key] = CSV.read(path, :headers => true).map(&:to_hash) |  | ||||||
|           else |  | ||||||
|             data[key] = SafeYAML.load_file(path) |  | ||||||
|           end |  | ||||||
|         end |         end | ||||||
|       end |       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 => config['encoding'] | ||||||
|  |         }).map(&:to_hash) | ||||||
|  |       else | ||||||
|  |         SafeYAML.load_file(path) | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     # Read in all collections specified in the configuration |     # Read in all collections specified in the configuration | ||||||
|     # |     # | ||||||
|     # Returns nothing. |     # Returns nothing. | ||||||
|  | @ -287,17 +302,22 @@ module Jekyll | ||||||
|     def render |     def render | ||||||
|       relative_permalinks_deprecation_method |       relative_permalinks_deprecation_method | ||||||
| 
 | 
 | ||||||
|  |       payload = site_payload | ||||||
|       collections.each do |label, collection| |       collections.each do |label, collection| | ||||||
|         collection.docs.each do |document| |         collection.docs.each do |document| | ||||||
|           document.output = Jekyll::Renderer.new(self, document).run |           if regenerator.regenerate?(document) | ||||||
|  |             document.output = Jekyll::Renderer.new(self, document, payload).run | ||||||
|  |           end | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       payload = site_payload |       payload = site_payload | ||||||
|       [posts, pages].flatten.each do |page_or_post| |       [posts, pages].flatten.each do |page_or_post| | ||||||
|         page_or_post.render(layouts, payload) |         if regenerator.regenerate?(page_or_post) | ||||||
|  |           page_or_post.render(layouts, payload) | ||||||
|  |         end | ||||||
|       end |       end | ||||||
|     rescue Errno::ENOENT => e |     rescue Errno::ENOENT | ||||||
|       # ignore missing layout dir |       # ignore missing layout dir | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -312,7 +332,10 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns nothing. |     # Returns nothing. | ||||||
|     def write |     def write | ||||||
|       each_site_file { |item| item.write(dest) } |       each_site_file { |item| | ||||||
|  |         item.write(dest) if regenerator.regenerate?(item) | ||||||
|  |       } | ||||||
|  |       regenerator.write_metadata | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Construct a Hash of Posts indexed by the specified Post attribute. |     # Construct a Hash of Posts indexed by the specified Post attribute. | ||||||
|  | @ -377,7 +400,7 @@ module Jekyll | ||||||
|             "time"         => time, |             "time"         => time, | ||||||
|             "posts"        => posts.sort { |a, b| b <=> a }, |             "posts"        => posts.sort { |a, b| b <=> a }, | ||||||
|             "pages"        => pages, |             "pages"        => pages, | ||||||
|             "static_files" => static_files.sort { |a, b| a.relative_path <=> b.relative_path }, |             "static_files" => static_files, | ||||||
|             "html_pages"   => pages.select { |page| page.html? || page.url.end_with?("/") }, |             "html_pages"   => pages.select { |page| page.html? || page.url.end_with?("/") }, | ||||||
|             "categories"   => post_attr_hash('categories'), |             "categories"   => post_attr_hash('categories'), | ||||||
|             "tags"         => post_attr_hash('tags'), |             "tags"         => post_attr_hash('tags'), | ||||||
|  | @ -405,13 +428,8 @@ module Jekyll | ||||||
|     # klass - The Class of the Converter to fetch. |     # klass - The Class of the Converter to fetch. | ||||||
|     # |     # | ||||||
|     # Returns the Converter instance implementing the given Converter. |     # Returns the Converter instance implementing the given Converter. | ||||||
|     def getConverterImpl(klass) |     def find_converter_instance(klass) | ||||||
|       matches = converters.select { |c| c.class == klass } |       converters.find { |c| c.class == klass } || proc { raise "No converter for #{klass}" }.call | ||||||
|       if impl = matches.first |  | ||||||
|         impl |  | ||||||
|       else |  | ||||||
|         raise "Converter implementation not found for #{klass}" |  | ||||||
|       end |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Create array of instances of the subclasses of the class or module |     # Create array of instances of the subclasses of the class or module | ||||||
|  | @ -453,7 +471,7 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|     def relative_permalinks_deprecation_method |     def relative_permalinks_deprecation_method | ||||||
|       if config['relative_permalinks'] && has_relative_page? |       if config['relative_permalinks'] && has_relative_page? | ||||||
|         Jekyll.logger.warn "Deprecation:", "Starting in 2.0, permalinks for pages" + |         Jekyll::Deprecator.deprecation_message "Since v2.0, permalinks for pages" + | ||||||
|                                             " in subfolders must be relative to the" + |                                             " in subfolders must be relative to the" + | ||||||
|                                             " site source directory, not the parent" + |                                             " site source directory, not the parent" + | ||||||
|                                             " directory. Check http://jekyllrb.com/docs/upgrading/"+ |                                             " directory. Check http://jekyllrb.com/docs/upgrading/"+ | ||||||
|  | @ -483,6 +501,17 @@ module Jekyll | ||||||
|       @frontmatter_defaults ||= FrontmatterDefaults.new(self) |       @frontmatter_defaults ||= FrontmatterDefaults.new(self) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  |     # Whether to perform a full rebuild without incremental regeneration | ||||||
|  |     # | ||||||
|  |     # Returns a Boolean: true for a full rebuild, false for normal build | ||||||
|  |     def full_rebuild?(override = {}) | ||||||
|  |       override['full_rebuild'] || config['full_rebuild'] | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     def publisher | ||||||
|  |       @publisher ||= Publisher.new(self) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     private |     private | ||||||
| 
 | 
 | ||||||
|     def has_relative_page? |     def has_relative_page? | ||||||
|  | @ -499,13 +528,9 @@ module Jekyll | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def sanitize_filename(name) |     def sanitize_filename(name) | ||||||
|       name.gsub!(/[^\w\s_-]+/, '') |       name.gsub!(/[^\w\s-]+/, '') | ||||||
|       name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2') |       name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2') | ||||||
|       name.gsub(/\s+/, '_') |       name.gsub(/\s+/, '_') | ||||||
|     end |     end | ||||||
| 
 |  | ||||||
|     def publisher |  | ||||||
|       @publisher ||= Publisher.new(self) |  | ||||||
|     end |  | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -3,6 +3,8 @@ module Jekyll | ||||||
|     # The cache of last modification times [path] -> mtime. |     # The cache of last modification times [path] -> mtime. | ||||||
|     @@mtimes = Hash.new |     @@mtimes = Hash.new | ||||||
| 
 | 
 | ||||||
|  |     attr_reader :relative_path | ||||||
|  | 
 | ||||||
|     # Initialize a new StaticFile. |     # Initialize a new StaticFile. | ||||||
|     # |     # | ||||||
|     # site - The Site. |     # site - The Site. | ||||||
|  | @ -15,6 +17,7 @@ module Jekyll | ||||||
|       @dir  = dir |       @dir  = dir | ||||||
|       @name = name |       @name = name | ||||||
|       @collection = collection |       @collection = collection | ||||||
|  |       @relative_path = File.join(*[@dir, @name].compact) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Returns source file path. |     # Returns source file path. | ||||||
|  | @ -22,11 +25,6 @@ module Jekyll | ||||||
|       File.join(*[@base, @dir, @name].compact) |       File.join(*[@base, @dir, @name].compact) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Returns the source file path relative to the site source |  | ||||||
|     def relative_path |  | ||||||
|       @relative_path ||= File.join(*[@dir, @name].compact) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     def extname |     def extname | ||||||
|       File.extname(path) |       File.extname(path) | ||||||
|     end |     end | ||||||
|  | @ -81,6 +79,7 @@ module Jekyll | ||||||
|       FileUtils.mkdir_p(File.dirname(dest_path)) |       FileUtils.mkdir_p(File.dirname(dest_path)) | ||||||
|       FileUtils.rm(dest_path) if File.exist?(dest_path) |       FileUtils.rm(dest_path) if File.exist?(dest_path) | ||||||
|       FileUtils.cp(path, dest_path) |       FileUtils.cp(path, dest_path) | ||||||
|  |       File.utime(@@mtimes[path], @@mtimes[path], dest_path) | ||||||
| 
 | 
 | ||||||
|       true |       true | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  | @ -42,7 +42,7 @@ eos | ||||||
|       def render(context) |       def render(context) | ||||||
|         prefix = context["highlighter_prefix"] || "" |         prefix = context["highlighter_prefix"] || "" | ||||||
|         suffix = context["highlighter_suffix"] || "" |         suffix = context["highlighter_suffix"] || "" | ||||||
|         code = super.to_s.strip |         code = super.to_s.gsub(/\A(\n|\r)+|(\n|\r)+\z/, '') | ||||||
| 
 | 
 | ||||||
|         is_safe = !!context.registers[:site].safe |         is_safe = !!context.registers[:site].safe | ||||||
| 
 | 
 | ||||||
|  | @ -75,9 +75,7 @@ eos | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def render_pygments(code, is_safe) |       def render_pygments(code, is_safe) | ||||||
|         require 'pygments' |         Jekyll::External.require_with_graceful_fail('pygments') | ||||||
| 
 |  | ||||||
|         @options[:encoding] = 'utf-8' |  | ||||||
| 
 | 
 | ||||||
|         highlighted_code = Pygments.highlight( |         highlighted_code = Pygments.highlight( | ||||||
|           code, |           code, | ||||||
|  | @ -96,26 +94,26 @@ eos | ||||||
|           raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.") |           raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.") | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|         highlighted_code |         highlighted_code.sub('<div class="highlight"><pre>', '').sub('</pre></div>', '') | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def render_rouge(code) |       def render_rouge(code) | ||||||
|         require 'rouge' |         Jekyll::External.require_with_graceful_fail('rouge') | ||||||
|         formatter = Rouge::Formatters::HTML.new(line_numbers: @options[:linenos], wrap: false) |         formatter = Rouge::Formatters::HTML.new(line_numbers: @options[:linenos], wrap: false) | ||||||
|         lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText |         lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText | ||||||
|         code = formatter.format(lexer.lex(code)) |         formatter.format(lexer.lex(code)) | ||||||
|         "<div class=\"highlight\"><pre>#{code}</pre></div>" |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def render_codehighlighter(code) |       def render_codehighlighter(code) | ||||||
|         "<div class=\"highlight\"><pre>#{h(code).strip}</pre></div>" |         h(code).strip | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def add_code_tag(code) |       def add_code_tag(code) | ||||||
|         # Add nested <code> tags to code blocks |         code_attributes = [ | ||||||
|         code = code.sub(/<pre>\n*/,'<pre><code class="language-' + @lang.to_s.gsub("+", "-") + '" data-lang="' + @lang.to_s + '">') |           "class=\"language-#{@lang.to_s.gsub('+', '-')}\"", | ||||||
|         code = code.sub(/\n*<\/pre>/,"</code></pre>") |           "data-lang=\"#{@lang.to_s}\"" | ||||||
|         code.strip |         ].join(" ") | ||||||
|  |         "<div class=\"highlight\"><pre><code #{code_attributes}>#{code.chomp}</code></pre></div>" | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  | @ -101,20 +101,29 @@ eos | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def tag_includes_dir |       def tag_includes_dir | ||||||
|         '_includes' |         '_includes'.freeze | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def render(context) |       def render(context) | ||||||
|  |         site = context.registers[:site] | ||||||
|         dir = resolved_includes_dir(context) |         dir = resolved_includes_dir(context) | ||||||
| 
 | 
 | ||||||
|         file = render_variable(context) || @file |         file = render_variable(context) || @file | ||||||
|         validate_file_name(file) |         validate_file_name(file) | ||||||
| 
 | 
 | ||||||
|         path = File.join(dir, file) |         path = File.join(dir, file) | ||||||
|         validate_path(path, dir, context.registers[:site].safe) |         validate_path(path, dir, site.safe) | ||||||
|  | 
 | ||||||
|  |         # Add include to dependency tree | ||||||
|  |         if context.registers[:page] and context.registers[:page].has_key? "path" | ||||||
|  |           site.regenerator.add_dependency( | ||||||
|  |             site.in_source_dir(context.registers[:page]["path"]), | ||||||
|  |             path | ||||||
|  |           ) | ||||||
|  |         end | ||||||
| 
 | 
 | ||||||
|         begin |         begin | ||||||
|           partial = Liquid::Template.parse(source(path, context)) |           partial = Liquid::Template.parse(read_file(path, context)) | ||||||
| 
 | 
 | ||||||
|           context.stack do |           context.stack do | ||||||
|             context['include'] = parse_params(context) if @params |             context['include'] = parse_params(context) if @params | ||||||
|  | @ -126,7 +135,7 @@ eos | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def resolved_includes_dir(context) |       def resolved_includes_dir(context) | ||||||
|         File.join(File.realpath(context.registers[:site].source), @includes_dir) |         context.registers[:site].in_source_dir(@includes_dir) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def validate_path(path, dir, safe) |       def validate_path(path, dir, safe) | ||||||
|  | @ -146,14 +155,14 @@ eos | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       # This method allows to modify the file content by inheriting from the class. |       # This method allows to modify the file content by inheriting from the class. | ||||||
|       def source(file, context) |       def read_file(file, context) | ||||||
|         File.read(file, file_read_opts(context)) |         File.read(file, file_read_opts(context)) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     class IncludeRelativeTag < IncludeTag |     class IncludeRelativeTag < IncludeTag | ||||||
|       def tag_includes_dir |       def tag_includes_dir | ||||||
|         '.' |         '.'.freeze | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def page_path(context) |       def page_path(context) | ||||||
|  |  | ||||||
|  | @ -44,12 +44,12 @@ module Jekyll | ||||||
|     # |     # | ||||||
|     # Returns the _unsanitized String URL |     # Returns the _unsanitized String URL | ||||||
|     def generated_permalink |     def generated_permalink | ||||||
|       (@generated_permlink ||= generate_url(@permalink)) if @permalink |       (@generated_permalink ||= generate_url(@permalink)) if @permalink | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Generates a URL from the template |     # Generates a URL from the template | ||||||
|     # |     # | ||||||
|     # Returns the _unsanitized String URL |     # Returns the unsanitized String URL | ||||||
|     def generated_url |     def generated_url | ||||||
|       @generated_url ||= generate_url(@template) |       @generated_url ||= generate_url(@template) | ||||||
|     end |     end | ||||||
|  | @ -57,11 +57,16 @@ module Jekyll | ||||||
|     # Internal: Generate the URL by replacing all placeholders with their |     # Internal: Generate the URL by replacing all placeholders with their | ||||||
|     # respective values in the given template |     # respective values in the given template | ||||||
|     # |     # | ||||||
|     # Returns the _unsanitizied_ String URL |     # Returns the unsanitized String URL | ||||||
|     def generate_url(template) |     def generate_url(template) | ||||||
|       @placeholders.inject(template) do |result, token| |       @placeholders.inject(template) do |result, token| | ||||||
|         break result if result.index(':').nil? |         break result if result.index(':').nil? | ||||||
|         result.gsub(/:#{token.first}/, self.class.escape_path(token.last)) |         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 | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|  | @ -76,7 +81,7 @@ module Jekyll | ||||||
|         .gsub(/\A([^\/])/, '/\1') |         .gsub(/\A([^\/])/, '/\1') | ||||||
| 
 | 
 | ||||||
|       # Append a trailing slash to the URL if the unsanitized URL had one |       # Append a trailing slash to the URL if the unsanitized URL had one | ||||||
|       url << "/" if in_url[-1].eql?('/') |       url << "/" if in_url.end_with?("/") | ||||||
| 
 | 
 | ||||||
|       url |       url | ||||||
|     end |     end | ||||||
|  | @ -102,7 +107,7 @@ module Jekyll | ||||||
|       #   pct-encoded   = "%" HEXDIG HEXDIG |       #   pct-encoded   = "%" HEXDIG HEXDIG | ||||||
|       #   sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" |       #   sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" | ||||||
|       #                 / "*" / "+" / "," / ";" / "=" |       #                 / "*" / "+" / "," / ";" / "=" | ||||||
|       URI.escape(path, /[^a-zA-Z\d\-._~!$&\'()*+,;=:@\/]/).encode('utf-8') |       URI.escape(path, /[^a-zA-Z\d\-._~!$&'()*+,;=:@\/]/).encode('utf-8') | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # Unescapes a URL path segment |     # Unescapes a URL path segment | ||||||
|  |  | ||||||
|  | @ -2,6 +2,12 @@ module Jekyll | ||||||
|   module Utils |   module Utils | ||||||
|     extend self |     extend self | ||||||
| 
 | 
 | ||||||
|  |     # 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 | ||||||
|  | 
 | ||||||
|     # Merges a master hash with another hash, recursively. |     # Merges a master hash with another hash, recursively. | ||||||
|     # |     # | ||||||
|     # master_hash - the "parent" hash whose values will be overridden |     # master_hash - the "parent" hash whose values will be overridden | ||||||
|  | @ -90,7 +96,7 @@ module Jekyll | ||||||
|     # Returns the parsed date if successful, throws a FatalException |     # Returns the parsed date if successful, throws a FatalException | ||||||
|     # if not |     # if not | ||||||
|     def parse_date(input, msg = "Input could not be parsed.") |     def parse_date(input, msg = "Input could not be parsed.") | ||||||
|       Time.parse(input) |       Time.parse(input).localtime | ||||||
|     rescue ArgumentError |     rescue ArgumentError | ||||||
|       raise Errors::FatalException.new("Invalid date '#{input}': " + msg) |       raise Errors::FatalException.new("Invalid date '#{input}': " + msg) | ||||||
|     end |     end | ||||||
|  | @ -104,21 +110,92 @@ module Jekyll | ||||||
| 
 | 
 | ||||||
|     # Slugify a filename or title. |     # Slugify a filename or title. | ||||||
|     # |     # | ||||||
|     # name - the filename or title to slugify |     # string - the filename or title to slugify | ||||||
|  |     # mode - how string is slugified | ||||||
|     # |     # | ||||||
|     # Returns the given filename or title in lowercase, with every |     # When mode is "none", return the given string in lowercase. | ||||||
|     # sequence of spaces and non-alphanumeric characters replaced with a |     # | ||||||
|     # hyphen. |     # When mode is "raw", return the given string in lowercase, | ||||||
|     def slugify(string) |     # with every sequence of spaces characters replaced with a hyphen. | ||||||
|       unless string.nil? |     # | ||||||
|         string \ |     # When mode is "default" or nil, non-alphabetic characters are | ||||||
|           # Replace each non-alphanumeric character sequence with a hyphen |     # replaced with a hyphen too. | ||||||
|           .gsub(/[^a-z0-9]+/i, '-') \ |     # | ||||||
|           # Remove leading/trailing hyphen |     # When mode is "pretty", some non-alphabetic characters (._~!$&'()+,;=@) | ||||||
|           .gsub(/^\-|\-$/i, '') \ |     # are not replaced with hyphen. | ||||||
|           # Downcase it |     # | ||||||
|           .downcase |     # Examples: | ||||||
|  |     #   slugify("The _config.yml file") | ||||||
|  |     #   # => "the-config-yml-file" | ||||||
|  |     # | ||||||
|  |     #   slugify("The _config.yml file", "pretty") | ||||||
|  |     #   # => "the-_config.yml-file" | ||||||
|  |     # | ||||||
|  |     # Returns the slugified string. | ||||||
|  |     def slugify(string, mode=nil) | ||||||
|  |       mode ||= 'default' | ||||||
|  |       return nil if string.nil? | ||||||
|  |       return string.downcase unless SLUGIFY_MODES.include?(mode) | ||||||
|  | 
 | ||||||
|  |       # 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 |       end | ||||||
|  | 
 | ||||||
|  |       string. | ||||||
|  |         # Strip according to the mode | ||||||
|  |         gsub(re, '-'). | ||||||
|  |         # Remove leading/trailing hyphen | ||||||
|  |         gsub(/^\-|\-$/i, ''). | ||||||
|  |         # Downcase | ||||||
|  |         downcase | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     # Add an appropriate suffix to template so that it matches the specified | ||||||
|  |     # permalink style. | ||||||
|  |     # | ||||||
|  |     # template - permalink template without trailing slash or file extension | ||||||
|  |     # permalink_style - permalink style, either built-in or custom | ||||||
|  |     # | ||||||
|  |     # The returned permalink template will use the same ending style as | ||||||
|  |     # specified in permalink_style.  For example, if permalink_style contains a | ||||||
|  |     # trailing slash (or is :pretty, which indirectly has a trailing slash), | ||||||
|  |     # then so will the returned template.  If permalink_style has a trailing | ||||||
|  |     # ":output_ext" (or is :none, :date, or :ordinal) then so will the returned | ||||||
|  |     # template.  Otherwise, template will be returned without modification. | ||||||
|  |     # | ||||||
|  |     # Examples: | ||||||
|  |     #   add_permalink_suffix("/:basename", :pretty) | ||||||
|  |     #   # => "/:basename/" | ||||||
|  |     # | ||||||
|  |     #   add_permalink_suffix("/:basename", :date) | ||||||
|  |     #   # => "/:basename:output_ext" | ||||||
|  |     # | ||||||
|  |     #   add_permalink_suffix("/:basename", "/:year/:month/:title/") | ||||||
|  |     #   # => "/:basename/" | ||||||
|  |     # | ||||||
|  |     #   add_permalink_suffix("/:basename", "/:year/:month/:title") | ||||||
|  |     #   # => "/:basename" | ||||||
|  |     # | ||||||
|  |     # Returns the updated permalink template | ||||||
|  |     def add_permalink_suffix(template, permalink_style) | ||||||
|  |       case permalink_style | ||||||
|  |       when :pretty | ||||||
|  |         template << "/" | ||||||
|  |       when :date, :ordinal, :none | ||||||
|  |         template << ":output_ext" | ||||||
|  |       else | ||||||
|  |         template << "/" if permalink_style.to_s.end_with?("/") | ||||||
|  |         template << ":output_ext" if permalink_style.to_s.end_with?(":output_ext") | ||||||
|  |       end | ||||||
|  |       template | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  | @ -1,3 +1,3 @@ | ||||||
| module Jekyll | module Jekyll | ||||||
|   VERSION = '2.5.2' |   VERSION = '3.0.0.beta2' | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -1,2 +1,3 @@ | ||||||
| _site | _site | ||||||
| .sass-cache | .sass-cache | ||||||
|  | .jekyll-metadata | ||||||
|  |  | ||||||
|  | @ -5,7 +5,7 @@ description: > # this means to ignore newlines until "baseurl:" | ||||||
|   Write an awesome description for your new site here. You can edit this |   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 |   line in _config.yml. It will appear in your document head meta (for | ||||||
|   Google search results) and in your feed.xml site description. |   Google search results) and in your feed.xml site description. | ||||||
| baseurl: "" # the subpath of your site, e.g. /blog/ | baseurl: "" # the subpath of your site, e.g. /blog | ||||||
| url: "http://yourdomain.com" # the base hostname & protocol for your site | url: "http://yourdomain.com" # the base hostname & protocol for your site | ||||||
| twitter_username: jekyllrb | twitter_username: jekyllrb | ||||||
| github_username:  jekyll | github_username:  jekyll | ||||||
|  |  | ||||||
|  | @ -5,19 +5,19 @@ | ||||||
|     <h2 class="footer-heading">{{ site.title }}</h2> |     <h2 class="footer-heading">{{ site.title }}</h2> | ||||||
| 
 | 
 | ||||||
|     <div class="footer-col-wrapper"> |     <div class="footer-col-wrapper"> | ||||||
|       <div class="footer-col  footer-col-1"> |       <div class="footer-col footer-col-1"> | ||||||
|         <ul class="contact-list"> |         <ul class="contact-list"> | ||||||
|           <li>{{ site.title }}</li> |           <li>{{ site.title }}</li> | ||||||
|           <li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li> |           <li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li> | ||||||
|         </ul> |         </ul> | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
|       <div class="footer-col  footer-col-2"> |       <div class="footer-col footer-col-2"> | ||||||
|         <ul class="social-media-list"> |         <ul class="social-media-list"> | ||||||
|           {% if site.github_username %} |           {% if site.github_username %} | ||||||
|           <li> |           <li> | ||||||
|             <a href="https://github.com/{{ site.github_username }}"> |             <a href="https://github.com/{{ site.github_username }}"> | ||||||
|               <span class="icon  icon--github"> |               <span class="icon icon--github"> | ||||||
|                 <svg viewBox="0 0 16 16"> |                 <svg viewBox="0 0 16 16"> | ||||||
|                   <path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/> |                   <path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/> | ||||||
|                 </svg> |                 </svg> | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
|           {% if site.twitter_username %} |           {% if site.twitter_username %} | ||||||
|           <li> |           <li> | ||||||
|             <a href="https://twitter.com/{{ site.twitter_username }}"> |             <a href="https://twitter.com/{{ site.twitter_username }}"> | ||||||
|               <span class="icon  icon--twitter"> |               <span class="icon icon--twitter"> | ||||||
|                 <svg viewBox="0 0 16 16"> |                 <svg viewBox="0 0 16 16"> | ||||||
|                   <path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809 |                   <path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809 | ||||||
|                   c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/> |                   c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/> | ||||||
|  | @ -45,8 +45,8 @@ | ||||||
|         </ul> |         </ul> | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
|       <div class="footer-col  footer-col-3"> |       <div class="footer-col footer-col-3"> | ||||||
|         <p class="text">{{ site.description }}</p> |         <p>{{ site.description }}</p> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,5 +8,5 @@ | ||||||
| 
 | 
 | ||||||
|   <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}"> |   <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}"> | ||||||
|   <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}"> |   <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}"> | ||||||
|   <link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" /> |   <link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}"> | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
|  | @ -1,14 +1,14 @@ | ||||||
| --- | --- | ||||||
| layout: default | layout: default | ||||||
| --- | --- | ||||||
| <div class="post"> | <article class="post"> | ||||||
| 
 | 
 | ||||||
|   <header class="post-header"> |   <header class="post-header"> | ||||||
|     <h1 class="post-title">{{ page.title }}</h1> |     <h1 class="post-title">{{ page.title }}</h1> | ||||||
|   </header> |   </header> | ||||||
| 
 | 
 | ||||||
|   <article class="post-content"> |   <div class="post-content"> | ||||||
|     {{ content }} |     {{ content }} | ||||||
|   </article> |   </div> | ||||||
| 
 | 
 | ||||||
| </div> | </article> | ||||||
|  |  | ||||||
|  | @ -1,15 +1,15 @@ | ||||||
| --- | --- | ||||||
| layout: default | layout: default | ||||||
| --- | --- | ||||||
| <div class="post"> | <article class="post" itemscope itemtype="http://schema.org/BlogPosting"> | ||||||
| 
 | 
 | ||||||
|   <header class="post-header"> |   <header class="post-header"> | ||||||
|     <h1 class="post-title">{{ page.title }}</h1> |     <h1 class="post-title" itemprop="name headline">{{ page.title }}</h1> | ||||||
|     <p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p> |     <p class="post-meta"><time datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished">{{ page.date | date: "%b %-d, %Y" }}</time>{% if page.author %} • <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">{{ page.author }}</span></span>{% endif %}</p> | ||||||
|   </header> |   </header> | ||||||
| 
 | 
 | ||||||
|   <article class="post-content"> |   <div class="post-content" itemprop="articleBody"> | ||||||
|     {{ content }} |     {{ content }} | ||||||
|   </article> |   </div> | ||||||
| 
 | 
 | ||||||
| </div> | </article> | ||||||
|  |  | ||||||
|  | @ -18,8 +18,8 @@ print_hi('Tom') | ||||||
| #=> prints 'Hi, Tom' to STDOUT. | #=> prints 'Hi, Tom' to STDOUT. | ||||||
| {% endhighlight %} | {% endhighlight %} | ||||||
| 
 | 
 | ||||||
| Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll’s dedicated Help repository][jekyll-help]. | 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’s dedicated Help repository][jekyll-help]. | ||||||
| 
 | 
 | ||||||
| [jekyll]:      http://jekyllrb.com | [jekyll-docs]: http://jekyllrb.com/docs/home | ||||||
| [jekyll-gh]:   https://github.com/jekyll/jekyll | [jekyll-gh]:   https://github.com/jekyll/jekyll | ||||||
| [jekyll-help]: https://github.com/jekyll/jekyll-help | [jekyll-help]: https://github.com/jekyll/jekyll-help | ||||||
|  |  | ||||||
|  | @ -14,13 +14,15 @@ dl, dd, ol, ul, figure { | ||||||
|  * Basic styling |  * Basic styling | ||||||
|  */ |  */ | ||||||
| body { | body { | ||||||
|     font-family: $base-font-family; |     font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; | ||||||
|     font-size: $base-font-size; |  | ||||||
|     line-height: $base-line-height; |  | ||||||
|     font-weight: 300; |  | ||||||
|     color: $text-color; |     color: $text-color; | ||||||
|     background-color: $background-color; |     background-color: $background-color; | ||||||
|     -webkit-text-size-adjust: 100%; |     -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; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -80,7 +82,7 @@ li { | ||||||
|  * Headings |  * Headings | ||||||
|  */ |  */ | ||||||
| h1, h2, h3, h4, h5, h6 { | h1, h2, h3, h4, h5, h6 { | ||||||
|     font-weight: 300; |     font-weight: $base-font-weight; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -139,7 +141,7 @@ code { | ||||||
| 
 | 
 | ||||||
| pre { | pre { | ||||||
|     padding: 8px 12px; |     padding: 8px 12px; | ||||||
|     overflow-x: scroll; |     overflow-x: auto; | ||||||
| 
 | 
 | ||||||
|     > code { |     > code { | ||||||
|         border: 0; |         border: 0; | ||||||
|  |  | ||||||
|  | @ -35,16 +35,16 @@ | ||||||
|         color: $text-color; |         color: $text-color; | ||||||
|         line-height: $base-line-height; |         line-height: $base-line-height; | ||||||
| 
 | 
 | ||||||
|         // Gaps between nav items, but not on the first one |         // Gaps between nav items, but not on the last one | ||||||
|         &:not(:first-child) { |         &:not(:last-child) { | ||||||
|             margin-left: 20px; |             margin-right: 20px; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @include media-query($on-palm) { |     @include media-query($on-palm) { | ||||||
|         position: absolute; |         position: absolute; | ||||||
|         top: 9px; |         top: 9px; | ||||||
|         right: 30px; |         right: $spacing-unit / 2; | ||||||
|         background-color: $background-color; |         background-color: $background-color; | ||||||
|         border: 1px solid $grey-color-light; |         border: 1px solid $grey-color-light; | ||||||
|         border-radius: 5px; |         border-radius: 5px; | ||||||
|  | @ -82,6 +82,11 @@ | ||||||
|         .page-link { |         .page-link { | ||||||
|             display: block; |             display: block; | ||||||
|             padding: 5px 10px; |             padding: 5px 10px; | ||||||
|  | 
 | ||||||
|  |             &:not(:last-child) { | ||||||
|  |                 margin-right: 0; | ||||||
|  |             } | ||||||
|  |             margin-left: 20px; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,8 +6,9 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // Our variables | // Our variables | ||||||
| $base-font-family: Helvetica, Arial, sans-serif; | $base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; | ||||||
| $base-font-size:   16px; | $base-font-size:   16px; | ||||||
|  | $base-font-weight: 300; | ||||||
| $small-font-size:  $base-font-size * 0.875; | $small-font-size:  $base-font-size * 0.875; | ||||||
| $base-line-height: 1.5; | $base-line-height: 1.5; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| #!/bin/sh | #!/bin/sh | ||||||
| 
 | 
 | ||||||
| script/branding | script/branding | ||||||
| bundle install | bundle install -j8 | ||||||
|  |  | ||||||
							
								
								
									
										39
									
								
								script/proof
								
								
								
								
							
							
						
						
									
										39
									
								
								script/proof
								
								
								
								
							|  | @ -5,20 +5,29 @@ | ||||||
| 
 | 
 | ||||||
| set -e | set -e | ||||||
| 
 | 
 | ||||||
| if [[ "$1" != "-f" ]]; then | function msg { | ||||||
|   git diff --name-only ..master | grep '^site/' || { | 	printf "\e[0;37m==> $1\e[0m\n" | ||||||
|     echo "No site files changed. We'll skip proofing. Run with -f to force." |  | ||||||
|     exit 0 |  | ||||||
|   } |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| echo "Some site files have been changed! Proofing..." |  | ||||||
| 
 |  | ||||||
| command -v htmlproof || { |  | ||||||
|     echo "Installing HTML::Proofer!" |  | ||||||
|     gem install html-proofer -- --use-system-libraries |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bundle exec jekyll build -s site -d _site --trace | INGORE_HREFS=$(ruby -e 'puts %w{ | ||||||
| printf "\e[0;36mProofing begins now!\e[0m\n" | 	Chrononaut | ||||||
| htmlproof ./_site | 	twitter.com | ||||||
|  | 	nearlyfreespeech.net | ||||||
|  | }.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 --full-rebuild --trace | ||||||
|  | 
 | ||||||
|  | # 3. | ||||||
|  | msg "Proofing..." | ||||||
|  | time bundle exec htmlproof ./$DESTINATION --href-ignore $INGORE_HREFS | ||||||
|  |  | ||||||
|  | @ -5,12 +5,12 @@ set -e | ||||||
| export BENCHMARK=true | export BENCHMARK=true | ||||||
| command -v stackprof > /dev/null || script/bootstrap | command -v stackprof > /dev/null || script/bootstrap | ||||||
| 
 | 
 | ||||||
| TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site'})" | TEST_SCRIPT="Jekyll::Commands::Build.process({'source' => 'site', 'full_rebuild' => true})" | ||||||
| PROF_OUTPUT_FILE=tmp/stackprof-$(date +%Y%m%d).dump | PROF_OUTPUT_FILE=tmp/stackprof-$(date +%Y%m%d%H%M).dump | ||||||
| 
 | 
 | ||||||
| test -f "$PROF_OUTPUT_FILE" || { | test -f "$PROF_OUTPUT_FILE" || { | ||||||
|   bundle exec ruby -r./lib/jekyll -rstackprof \ |   bundle exec ruby -r./lib/jekyll -rstackprof \ | ||||||
|     -e "StackProf.run(mode: :cpu, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" |     -e "StackProf.run(mode: :cpu, interval: 100, out: '${PROF_OUTPUT_FILE}') { ${TEST_SCRIPT} }" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bundle exec stackprof $PROF_OUTPUT_FILE $@ | bundle exec stackprof $PROF_OUTPUT_FILE $@ | ||||||
|  |  | ||||||
							
								
								
									
										17
									
								
								script/test
								
								
								
								
							
							
						
						
									
										17
									
								
								script/test
								
								
								
								
							|  | @ -4,17 +4,20 @@ | ||||||
| #   script/test | #   script/test | ||||||
| #   script/test <test_file> | #   script/test <test_file> | ||||||
| 
 | 
 | ||||||
|  | if [ ! -d tmp ]; then | ||||||
|  |   mkdir tmp | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [ -d test/dest ]; then | ||||||
|  |   rm -r test/dest | ||||||
|  | fi | ||||||
|  | 
 | ||||||
| if [ -z "$1" ]; then | if [ -z "$1" ]; then | ||||||
|   TEST_FILES="./test/test_*.rb" |   TEST_FILES=$(ruby -e "puts Dir.glob('test/test_*.rb')") | ||||||
| else | else | ||||||
|   TEST_FILES="$@" |   TEST_FILES="$@" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| RAKE_LIB_DIR=$(ruby -e "puts Gem::Specification.find_by_name('rake').gem_dir + '/lib'") |  | ||||||
| 
 |  | ||||||
| set -x | set -x | ||||||
| 
 | 
 | ||||||
| time bundle exec ruby -I"lib:test" \ | time bundle exec ruby -Ilib -Itest -rloader $TEST_FILES --profile | ||||||
|   -I"${RAKE_LIB_DIR}" \ |  | ||||||
|   "${RAKE_LIB_DIR}/rake/rake_test_loader.rb" \ |  | ||||||
|   $TEST_FILES |  | ||||||
|  |  | ||||||
|  | @ -1 +0,0 @@ | ||||||
| Jekyll's awesome website. |  | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | # 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: | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Assets | title: Assets | ||||||
| prev_section: datafiles |  | ||||||
| next_section: migrations |  | ||||||
| permalink: /docs/assets/ | permalink: /docs/assets/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,15 +1,13 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Collections | title: Collections | ||||||
| prev_section: variables |  | ||||||
| next_section: datafiles |  | ||||||
| permalink: /docs/collections/ | permalink: /docs/collections/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
| <div class="note warning"> | <div class="note warning"> | ||||||
|   <h5>Collections support is unstable and may change</h5> |   <h5>Collections support is unstable and may change</h5> | ||||||
|   <p> |   <p> | ||||||
|     This is an experimental feature and that the API may likely change until the feature stabilizes. |     This is an experimental feature and the API may change until the feature stabilizes. | ||||||
|   </p> |   </p> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
|  | @ -37,7 +35,7 @@ collections: | ||||||
| ### Step 2: Add your content | ### Step 2: Add your content | ||||||
| 
 | 
 | ||||||
| Create a corresponding folder (e.g. `<source>/_my_collection`) and add documents. | Create a corresponding folder (e.g. `<source>/_my_collection`) and add documents. | ||||||
| YAML Front Matter is read in as data if it exists, if not, then everything is just stuck in the Document's `content` attribute. | 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. | ||||||
| 
 | 
 | ||||||
| Note: the folder must be named identically to the collection you defined in your `_config.yml` file, with the addition of the preceding `_` character. | Note: the folder must be named identically to the collection you defined in your `_config.yml` file, with the addition of the preceding `_` character. | ||||||
| 
 | 
 | ||||||
|  | @ -211,8 +209,7 @@ In addition to any YAML Front Matter provided in the document's corresponding fi | ||||||
|       </td> |       </td> | ||||||
|       <td> |       <td> | ||||||
|         <p> |         <p> | ||||||
|           The (unrendered) content of the document. If no YAML Front Matter is provided, |           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 | ||||||
|           this is the entirety of the file contents. If YAML Front Matter |  | ||||||
|           is used, then this is all the contents of the file after the terminating |           is used, then this is all the contents of the file after the terminating | ||||||
|           `---` of the front matter. |           `---` of the front matter. | ||||||
|         </p> |         </p> | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Configuration | title: Configuration | ||||||
| prev_section: structure |  | ||||||
| next_section: frontmatter |  | ||||||
| permalink: /docs/configuration/ | permalink: /docs/configuration/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -155,9 +153,12 @@ class="flag">flags</code> (specified on the command-line) that control them. | ||||||
|   <h5>Destination folders are cleaned on site builds</h5> |   <h5>Destination folders are cleaned on site builds</h5> | ||||||
|   <p> |   <p> | ||||||
|     The contents of <code><destination></code> are automatically |     The contents of <code><destination></code> are automatically | ||||||
|     cleaned when the site is built. Files or folders that are not |     cleaned, by default, when the site is built. Files or folders that are not | ||||||
|     created by your site will be removed.  Do not use an important |     created by your site will be removed. Some files could be retained | ||||||
|     location for <code><destination></code>; instead, use it as |     by specifying them within the <code><keep_files></code> configuration directive. | ||||||
|  |   </p> | ||||||
|  |   <p> | ||||||
|  |     Do not use an important location for <code><destination></code>; instead, use it as | ||||||
|     a staging area and copy files from there to your web server. |     a staging area and copy files from there to your web server. | ||||||
|   </p> |   </p> | ||||||
| </div> | </div> | ||||||
|  | @ -387,7 +388,7 @@ defaults: | ||||||
|   - |   - | ||||||
|     scope: |     scope: | ||||||
|       path: "projects" |       path: "projects" | ||||||
|       type: "pages" |       type: "pages" # previously `page` in Jekyll 2.2. | ||||||
|     values: |     values: | ||||||
|       layout: "project" # overrides previous default layout |       layout: "project" # overrides previous default layout | ||||||
|       author: "Mr. Hyde" |       author: "Mr. Hyde" | ||||||
|  | @ -409,7 +410,7 @@ defaults: | ||||||
|       layout: "default" |       layout: "default" | ||||||
| {% endhighlight %} | {% endhighlight %} | ||||||
| 
 | 
 | ||||||
| In this example the `layout` is set to `default` inside the [collection](../collections) with the name `my_collection`. | In this example the `layout` is set to `default` inside the [collection](../collections/) with the name `my_collection`. | ||||||
| 
 | 
 | ||||||
| ### Precedence | ### Precedence | ||||||
| 
 | 
 | ||||||
|  | @ -447,9 +448,9 @@ The `projects/foo_project.md` would have the `layout` set to `foobar` instead of | ||||||
| 
 | 
 | ||||||
| ## Default Configuration | ## Default Configuration | ||||||
| 
 | 
 | ||||||
| Jekyll runs with the following configuration options by default. Unless | Jekyll runs with the following configuration options by default. Alternative | ||||||
| alternative settings for these options are explicitly specified in the | settings for these options can be explicitly specified in the configuration | ||||||
| configuration file or on the command-line, Jekyll will run using these options. | file or on the command-line. | ||||||
| 
 | 
 | ||||||
| <div class="note warning"> | <div class="note warning"> | ||||||
|   <h5>There are two unsupported kramdown options</h5> |   <h5>There are two unsupported kramdown options</h5> | ||||||
|  | @ -476,7 +477,6 @@ exclude:      [] | ||||||
| keep_files:   [".git", ".svn"] | keep_files:   [".git", ".svn"] | ||||||
| encoding:     "utf-8" | encoding:     "utf-8" | ||||||
| markdown_ext: "markdown,mkdown,mkdn,mkd,md" | markdown_ext: "markdown,mkdown,mkdn,mkd,md" | ||||||
| textile_ext:  "textile" |  | ||||||
| 
 | 
 | ||||||
| # Filtering Content | # Filtering Content | ||||||
| show_drafts: null | show_drafts: null | ||||||
|  | @ -490,14 +490,14 @@ gems:      [] | ||||||
| 
 | 
 | ||||||
| # Conversion | # Conversion | ||||||
| markdown:    kramdown | markdown:    kramdown | ||||||
| highlighter: pygments | highlighter: rouge | ||||||
| lsi:         false | lsi:         false | ||||||
| excerpt_separator: "\n\n" | excerpt_separator: "\n\n" | ||||||
| 
 | 
 | ||||||
| # Serving | # Serving | ||||||
| detach:  false | detach:  false | ||||||
| port:    4000 | port:    4000 | ||||||
| host:    0.0.0.0 | host:    127.0.0.1 | ||||||
| baseurl: "" # does not include hostname | baseurl: "" # does not include hostname | ||||||
| 
 | 
 | ||||||
| # Backwards-compatibility | # Backwards-compatibility | ||||||
|  | @ -527,12 +527,12 @@ redcarpet: | ||||||
|   extensions: [] |   extensions: [] | ||||||
| 
 | 
 | ||||||
| kramdown: | kramdown: | ||||||
|   auto_ids:      true |   auto_ids:       true | ||||||
|   footnote_nr:   1 |   footnote_nr:    1 | ||||||
|   entity_output: as_char |   entity_output:  as_char | ||||||
|   toc_levels:    1..6 |   toc_levels:     1..6 | ||||||
|   smart_quotes:  lsquo,rsquo,ldquo,rdquo |   smart_quotes:   lsquo,rsquo,ldquo,rdquo | ||||||
|   use_coderay:   false |   enable_coderay: false | ||||||
| 
 | 
 | ||||||
|   coderay: |   coderay: | ||||||
|     coderay_wrap:              div |     coderay_wrap:              div | ||||||
|  | @ -541,9 +541,6 @@ kramdown: | ||||||
|     coderay_tab_width:         4 |     coderay_tab_width:         4 | ||||||
|     coderay_bold_every:        10 |     coderay_bold_every:        10 | ||||||
|     coderay_css:               style |     coderay_css:               style | ||||||
| 
 |  | ||||||
| redcloth: |  | ||||||
|   hard_breaks: true |  | ||||||
| {% endhighlight %} | {% endhighlight %} | ||||||
| 
 | 
 | ||||||
| ## Markdown Options | ## Markdown Options | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Continuous Integration | title: Continuous Integration | ||||||
| prev_section: deployment-methods |  | ||||||
| next_section: troubleshooting |  | ||||||
| permalink: /docs/continuous-integration/ | permalink: /docs/continuous-integration/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -62,7 +60,7 @@ HTML::Proofer.new("./_site").run | ||||||
| {% endhighlight %} | {% endhighlight %} | ||||||
| 
 | 
 | ||||||
| Options are given as a second argument to `.new`, and are encoded in a | Options are given as a second argument to `.new`, and are encoded in a | ||||||
| symbol-keyed Ruby Hash. More information about the configuration options, | symbol-keyed Ruby Hash. For more information about the configuration options, | ||||||
| check out `html-proofer`'s README file. | check out `html-proofer`'s README file. | ||||||
| 
 | 
 | ||||||
| [2]: https://github.com/gjtorikian/html-proofer | [2]: https://github.com/gjtorikian/html-proofer | ||||||
|  | @ -71,7 +69,7 @@ check out `html-proofer`'s README file. | ||||||
| 
 | 
 | ||||||
| This file is used to configure your Travis builds. Because Jekyll is built | 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 | with Ruby and requires RubyGems to install, we use the Ruby language build | ||||||
| environment. Below is a sample `.travis.yml` file, and what follows that is | environment. Below is a sample `.travis.yml` file, followed by | ||||||
| an explanation of each line. | an explanation of each line. | ||||||
| 
 | 
 | ||||||
| {% highlight yaml %} | {% highlight yaml %} | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Contributing | title: Contributing | ||||||
| prev_section: upgrading |  | ||||||
| next_section: history |  | ||||||
| permalink: /docs/contributing/ | permalink: /docs/contributing/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -99,7 +97,7 @@ You can find the documentation for jekyllrb.com in the | ||||||
| [site]({{ site.repository }}/tree/master/site) directory of | [site]({{ site.repository }}/tree/master/site) directory of | ||||||
| Jekyll's repo on GitHub.com. | Jekyll's repo on GitHub.com. | ||||||
| 
 | 
 | ||||||
| All documentation pull requests should be directed at `master`.  Pull | All documentation pull requests should be directed at `master`. Pull | ||||||
| requests directed at another branch will not be accepted. | requests directed at another branch will not be accepted. | ||||||
| 
 | 
 | ||||||
| The [Jekyll wiki]({{ site.repository }}/wiki) on GitHub | The [Jekyll wiki]({{ site.repository }}/wiki) on GitHub | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Data Files | title: Data Files | ||||||
| prev_section: collections |  | ||||||
| next_section: assets |  | ||||||
| permalink: /docs/datafiles/ | permalink: /docs/datafiles/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Deployment methods | title: Deployment methods | ||||||
| prev_section: github-pages |  | ||||||
| next_section: continuous-integration |  | ||||||
| permalink: /docs/deployment-methods/ | permalink: /docs/deployment-methods/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -93,7 +91,7 @@ Another way to deploy your Jekyll site is to use [Rake](https://github.com/jimwe | ||||||
| 
 | 
 | ||||||
| ### rsync | ### rsync | ||||||
| 
 | 
 | ||||||
| Once you’ve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/tasks/deploy). You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run | Once you’ve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/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. | this script from within Textmate. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -109,9 +107,10 @@ If you want to maintain Jekyll inside your existing Rails app, [Jekyll-Admin](ht | ||||||
| 
 | 
 | ||||||
| ## Amazon S3 | ## Amazon S3 | ||||||
| 
 | 
 | ||||||
| If you want to host your site in Amazon S3, you can do so with | If you want to host your site in Amazon S3, you can do so by | ||||||
| [s3_website](https://github.com/laurilehmijoki/s3_website) application. It will | using the [s3_website](https://github.com/laurilehmijoki/s3_website) | ||||||
| push your site to Amazon S3 where it can be served like any web server, | 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 | dynamically scaling to almost unlimited traffic. This approach has the | ||||||
| benefit of being about the cheapest hosting option available for | benefit of being about the cheapest hosting option available for | ||||||
| low-volume blogs as you only pay for what you use. | low-volume blogs as you only pay for what you use. | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Working with drafts | title: Working with drafts | ||||||
| prev_section: posts |  | ||||||
| next_section: pages |  | ||||||
| permalink: /docs/drafts/ | permalink: /docs/drafts/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -17,5 +15,5 @@ first draft: | ||||||
| {% endhighlight %} | {% endhighlight %} | ||||||
| 
 | 
 | ||||||
| To preview your site with drafts, simply run `jekyll serve` or `jekyll build` with | 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 | 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. | for its date, and thus you will see currently edited drafts as the latest posts. | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Extras | title: Extras | ||||||
| prev_section: plugins |  | ||||||
| next_section: github-pages |  | ||||||
| permalink: /docs/extras/ | permalink: /docs/extras/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Front Matter | title: Front Matter | ||||||
| prev_section: configuration |  | ||||||
| next_section: posts |  | ||||||
| permalink: /docs/frontmatter/ | permalink: /docs/frontmatter/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -172,7 +170,9 @@ These are available out-of-the-box to be used in the front matter for a post. | ||||||
|       <td> |       <td> | ||||||
|         <p> |         <p> | ||||||
|           A date here overrides the date from the name of the post. This can be |           A date here overrides the date from the name of the post. This can be | ||||||
|           used to ensure correct sorting of posts. |           used to ensure correct sorting of posts. A date is specified in the format | ||||||
|  |           <code>YYYY-MM-DD HH:MM:SS +/-TTTT</code>; hours, minutes, seconds, and timezone offset | ||||||
|  |           are optional. | ||||||
|         </p> |         </p> | ||||||
|       </td> |       </td> | ||||||
|     </tr> |     </tr> | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: GitHub Pages | title: GitHub Pages | ||||||
| prev_section: extras |  | ||||||
| next_section: deployment-methods |  | ||||||
| permalink: /docs/github-pages/ | permalink: /docs/github-pages/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,9 +2,41 @@ | ||||||
| layout: docs | layout: docs | ||||||
| title: History | title: History | ||||||
| permalink: "/docs/history/" | permalink: "/docs/history/" | ||||||
| prev_section: contributing |  | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | ## 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 | ## 2.5.2 / 2014-11-17 | ||||||
| {: #v2-5-2} | {: #v2-5-2} | ||||||
| 
 | 
 | ||||||
|  | @ -517,7 +549,7 @@ prev_section: contributing | ||||||
| - Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy | - Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy | ||||||
|     looking up of variable values in a Liquid context. ([#2253]({{ site.repository }}/issues/2253)) |     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)) | - Remove literal lang name from class ([#2292]({{ site.repository }}/issues/2292)) | ||||||
| - Return `utf-8` encoding in header for  webrick error page response ([#2289]({{ site.repository }}/issues/2289)) | - Return `utf-8` encoding in header for webrick error page response ([#2289]({{ site.repository }}/issues/2289)) | ||||||
| - Make template site easier to customize ([#2268]({{ site.repository }}/issues/2268)) | - 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 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)) | - Add `site.documents` to Liquid payload (list of all docs) ([#2295]({{ site.repository }}/issues/2295)) | ||||||
|  |  | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Welcome | title: Welcome | ||||||
| next_section: quickstart |  | ||||||
| permalink: /docs/home/ | permalink: /docs/home/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -15,10 +14,9 @@ development of Jekyll itself. | ||||||
| 
 | 
 | ||||||
| Jekyll is a simple, blog-aware, static site generator. It takes a template | Jekyll is a simple, blog-aware, static site generator. It takes a template | ||||||
| directory containing raw text files in various formats, runs it through | directory containing raw text files in various formats, runs it through | ||||||
| [Markdown](http://daringfireball.net/projects/markdown/) (or | a converter (like [Markdown](http://daringfireball.net/projects/markdown/)) | ||||||
| [Textile](http://redcloth.org/textile)) and | and our [Liquid](https://github.com/Shopify/liquid/wiki) renderer, and | ||||||
| [Liquid](https://github.com/Shopify/liquid/wiki) | spits out a complete, ready-to-publish static website suitable | ||||||
| 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 | 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 | 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 | to host your project’s page, blog, or website from GitHub’s servers **for | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Installation | title: Installation | ||||||
| prev_section: quickstart |  | ||||||
| next_section: usage |  | ||||||
| permalink: /docs/installation/ | permalink: /docs/installation/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Blog migrations | title: Blog migrations | ||||||
| prev_section: assets |  | ||||||
| next_section: templates |  | ||||||
| permalink: /docs/migrations/ | permalink: /docs/migrations/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Creating pages | title: Creating pages | ||||||
| prev_section: drafts |  | ||||||
| next_section: variables |  | ||||||
| permalink: /docs/pages/ | permalink: /docs/pages/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -60,7 +58,7 @@ and associated URLs might look like: | ||||||
| 
 | 
 | ||||||
| ### Named folders containing index HTML files | ### Named folders containing index HTML files | ||||||
| 
 | 
 | ||||||
| There is nothing wrong with the above method, however some people like to keep | There is nothing wrong with the above method. However, some people like to keep | ||||||
| their URLs free from things like filename extensions. To achieve clean URLs for | 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 | 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 | you want, and then place an `index.html` file in each page’s folder. This way | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Pagination | title: Pagination | ||||||
| prev_section: permalinks |  | ||||||
| next_section: plugins |  | ||||||
| permalink: /docs/pagination/ | permalink: /docs/pagination/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -32,10 +30,10 @@ paginate: 5 | ||||||
| The number should be the maximum number of Posts you’d like to be displayed per- | The number should be the maximum number of Posts you’d like to be displayed per- | ||||||
| page in the generated site. | page in the generated site. | ||||||
| 
 | 
 | ||||||
| You may also specify where the destination of the pagination pages: | You may also specify the destination of the pagination pages: | ||||||
| 
 | 
 | ||||||
| {% highlight yaml %} | {% highlight yaml %} | ||||||
| paginate_path: "blog/page:num/" | paginate_path: "/blog/page:num/" | ||||||
| {% endhighlight %} | {% endhighlight %} | ||||||
| 
 | 
 | ||||||
| This will read in `blog/index.html`, send it each pagination page in Liquid as `paginator` | This will read in `blog/index.html`, send it each pagination page in Liquid as `paginator` | ||||||
|  | @ -44,6 +42,13 @@ starting with `2`. If a site has 12 posts and specifies `paginate: 5`, Jekyll wi | ||||||
| `blog/index.html` with the first 5 posts, `blog/page2/index.html` with the next 5 posts | `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. | and `blog/page3/index.html` with the last 2 posts into the destination directory. | ||||||
| 
 | 
 | ||||||
|  | <div class="note warning"> | ||||||
|  |   <h5>Don't set a permalink</h5> | ||||||
|  |   <p> | ||||||
|  |     Setting a permalink in the front matter of your blog page will cause pagination to break. Just omit the permalink. | ||||||
|  |   </p> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
| ## Liquid Attributes Available | ## Liquid Attributes Available | ||||||
| 
 | 
 | ||||||
| The pagination plugin exposes the `paginator` liquid object with the following | The pagination plugin exposes the `paginator` liquid object with the following | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| --- | --- | ||||||
| layout: docs | layout: docs | ||||||
| title: Permalinks | title: Permalinks | ||||||
| prev_section: templates |  | ||||||
| next_section: pagination |  | ||||||
| permalink: /docs/permalinks/ | permalink: /docs/permalinks/ | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -80,7 +78,10 @@ permalink is defined as `/:categories/:year/:month/:day/:title.html`. | ||||||
|         <p><code>title</code></p> |         <p><code>title</code></p> | ||||||
|       </td> |       </td> | ||||||
|       <td> |       <td> | ||||||
|         <p>Title from the Post’s filename</p> |         <p> | ||||||
|  |             Title from the document’s filename. May be overridden via the | ||||||
|  |             document’s <code>slug</code> YAML front matter. | ||||||
|  |         </p> | ||||||
|       </td> |       </td> | ||||||
|     </tr> |     </tr> | ||||||
|     <tr> |     <tr> | ||||||
|  | @ -137,6 +138,14 @@ enough to fix it all! | ||||||
|         <p><code>/:categories/:year/:month/:day/:title/</code></p> |         <p><code>/:categories/:year/:month/:day/:title/</code></p> | ||||||
|       </td> |       </td> | ||||||
|     </tr> |     </tr> | ||||||
|  |     <tr> | ||||||
|  |       <td> | ||||||
|  |         <p><code>ordinal</code></p> | ||||||
|  |       </td> | ||||||
|  |       <td> | ||||||
|  |         <p><code>/:categories/:year/:y_day/:title.html</code></p> | ||||||
|  |       </td> | ||||||
|  |     </tr> | ||||||
|     <tr> |     <tr> | ||||||
|       <td> |       <td> | ||||||
|         <p><code>none</code></p> |         <p><code>none</code></p> | ||||||
|  | @ -151,7 +160,7 @@ enough to fix it all! | ||||||
| 
 | 
 | ||||||
| ## Permalink style examples | ## Permalink style examples | ||||||
| 
 | 
 | ||||||
| Given a post named: `/2009-04-29-slap-chop.textile` | Given a post named: `/2009-04-29-slap-chop.md` | ||||||
| 
 | 
 | ||||||
| <div class="mobile-side-scroller"> | <div class="mobile-side-scroller"> | ||||||
| <table> | <table> | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue