Merge branch 'master' into permalink-special-characters

Conflicts:
	lib/jekyll/page.rb
	lib/jekyll/post.rb
This commit is contained in:
Lucas Jenss 2013-07-14 23:58:22 +02:00
commit 2ac98a7358
139 changed files with 5312 additions and 2109 deletions

View File

@ -1,11 +1,20 @@
language: ruby language: ruby
before_install:
- gem install bundler
rvm: rvm:
- 2.0.0
- 1.9.3 - 1.9.3
- 1.9.2 - 1.9.2
- 1.8.7 - 1.8.7
script: bundle exec rake script: bundle exec rake
notifications: notifications:
irc: "irc.freenode.org#jekyll" irc:
channels:
- "irc.freenode.org#jekyll"
#on_success: change
#on_failure: change
template:
- "%{repository}#%{build_number} (%{branch}) %{message} %{build_url}"
email: email:
on_success: never on_success: never
on_failure: never on_failure: never

View File

@ -15,7 +15,7 @@ following in mind:
would be appreciated, and once merged it will be transferred over to the main would be appreciated, and once merged it will be transferred over to the main
wiki. wiki.
* If your contribution changes any Jekyll behavior, make sure to update the * If your contribution changes any Jekyll behavior, make sure to update the
documentation. It lives in `site/_posts`. If the docs are missing information, documentation. It lives in `site/docs`. If the docs are missing information,
please feel free to add it in. Great docs make a great project! please feel free to add it in. Great docs make a great project!
* Please follow the [GitHub Ruby Styleguide](https://github.com/styleguide/ruby) * Please follow the [GitHub Ruby Styleguide](https://github.com/styleguide/ruby)
when modifying Ruby code. when modifying Ruby code.
@ -41,7 +41,7 @@ Workflow
Here's the most direct way to get your work merged into the project: Here's the most direct way to get your work merged into the project:
* Fork the project. * Fork the project.
* Clone down your fork ( `git clone git://github.com/<username>/jekyll.git` ). * Clone down your fork ( `git clone git@github.com:<username>/jekyll.git` ).
* Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ). * Create a topic branch to contain your change ( `git checkout -b my_awesome_feature` ).
* Hack away, add tests. Not necessarily in that order. * Hack away, add tests. Not necessarily in that order.
* Make sure everything still passes by running `rake`. * Make sure everything still passes by running `rake`.
@ -50,6 +50,24 @@ Here's the most direct way to get your work merged into the project:
* Create a pull request against mojombo/jekyll and describe what your change * Create a pull request against mojombo/jekyll and describe what your change
does and the why you think it should be merged. does and the why you think it should be merged.
Updating Documentation
----------------------
We want the Jekyll documentation to be the best it can be. We've
open-sourced our docs and we welcome any pull requests if you find it
lacking.
You can find the documentation for jekyllrb.com in the
[site](https://github.com/mojombo/jekyll/tree/master/site) directory of
Jekyll's repo on GitHub.com.
All documentation pull requests should be directed at `master`. Pull
requests directed at another branch will not be accepted.
The [Jekyll wiki](https://github.com/mojombo/jekyll/wiki) on GitHub
can be freely updated without a pull request as all
GitHub users have access.
Gotchas Gotchas
------- -------

590
History.markdown Normal file
View File

@ -0,0 +1,590 @@
## HEAD
### Major Enhancements
* Add 'docs' subcommand to read Jekyll's docs when offline. (#1046)
* Support passing parameters to templates in 'include' tag (#1204)
### Minor Enhancements
* Search the hierarchy of pagination path up to site root to determine template page for
pagination. (#1198)
* Add the ability to generate a new Jekyll site without a template (#1171)
* Use redcarpet as the default markdown engine in newly generated
sites (#1245, #1247)
* Add `redcarpet` as a runtime dependency so `jekyll build` works out-of-the-box for new
sites. (#1247)
* In the generated site, remove files that will be replaced by a
directory (#1118)
### Bug Fixes
* Fix pagination in subdirectories. (#1198)
* Fix an issue with directories and permalinks that have a plus sign
(+) in them (#1215)
* Provide better error reporting when generating sites (#1253)
* Latest posts first in non-LSI `related_posts` (#1271)
### Development Fixes
* Merge the theme and layout cucumber steps into one step (#1151)
* Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2`
* Include/exclude deprecation handling simplification (#1284)
* Convert README to Markdown. (#1267)
### Site Enhancements
* Add "News" section for release notes, along with an RSS feed (#1093, #1285, #1286)
* Add "History" page.
* Restructured docs sections to include "Meta" section.
* Add message to "Templates" page that specifies that Python must be installed in order
to use Pygments. (#1182)
* Update link to the official Maruku repo (#1175)
* Add documentation about `paginate_path` to "Templates" page in docs (#1129)
* Give the quick-start guide its own page (#1191)
* Update ProTip on Installation page in docs to point to all the info about Pygments and
the 'highlight' tag. (#1196)
* Run `site/img` through ImageOptim (thanks @qrush!) (#1208)
* Added Jade Converter to `site/docs/plugins` (#1210)
* Fix location of docs pages in Contributing pages (#1214)
* Add ReadInXMinutes plugin to the plugin list (#1222)
* Remove plugins from the plugin list that have equivalents in Jekyll
proper (#1223)
* Add jekyll-assets to the plugin list (#1225)
* Add jekyll-pandoc-mulitple-formats to the plugin list (#1229)
* Remove dead link to "Using Git to maintain your blog" (#1227)
* Tidy up the third-party plugins listing (#1228)
* Update contributor information (#1192)
* Update URL of article about Blogger migration (#1242)
* Specify that RedCarpet is the default for new Jekyll sites on Quickstart page (#1247)
* Added site.pages to Variables page in docs (#1251)
* Add Youku and Tudou Embed link on Plugins page. (#1250)
* Add note that `gist` tag supports private gists. (#1248)
* Add `jekyll-timeago` to list of third-party plugins. (#1260)
* Add `jekyll-swfobject` to list of third-party plugins. (#1263)
* Add `jekyll-picture-tag` to list of third-party plugins. (#1280)
* Update the GitHub Pages documentation regarding relative URLs
(#1291)
* Update the S3 deployment documentation (#1294)
* Add suggestion for Xcode CLT install to troubleshooting page in docs (#1296)
* Add 'Working with drafts' page to docs (#1289)
### Development Fixes
## 1.0.3 / 2013-06-07
### Minor Enhancements
* Add support to gist tag for private gists. (#1189)
* Fail loudly when MaRuKu errors out (#1190)
* Move the building of related posts into their own class (#1057)
* Removed trailing spaces in several places throughout the code (#1116)
* Add a `--force` option to `jekyll new` (#1115)
* Convert IDs in the site template to classes (#1170)
### Bug Fixes
* Fix typo in Stevenson constant "ERROR". (#1166)
* Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue (#1106)
* Exit with a non-zero exit code when dealing with a Liquid error (#1121)
* Make the `exclude` and `include` options backwards compatible with
versions of Jekyll prior to 1.0 (#1114)
* Fix pagination on Windows (#1063)
* Fix the application of Pygments' Generic Output style to Go code
(#1156)
### Site Enhancements
* Add a Pro Tip to docs about front matter variables being optional (#1147)
* Add changelog to site as History page in /docs/ (#1065)
* Add note to Upgrading page about new config options in 1.0.x (#1146)
* Documentation for `date_to_rfc822` and `uri_escape` (#1142)
* Documentation highlight boxes shouldn't show scrollbars if not necessary (#1123)
* Add link to jekyll-minibundle in the doc's plugins list (#1035)
* Quick patch for importers documentation
* Fix prefix for WordpressDotCom importer in docs (#1107)
* Add jekyll-contentblocks plugin to docs (#1068)
* Make code bits in notes look more natural, more readable (#1089)
* Fix logic for `relative_permalinks` instructions on Upgrading page (#1101)
* Add docs for post excerpt (#1072)
* Add docs for gist tag (#1072)
* Add docs indicating that Pygments does not need to be installed
separately (#1099, #1119)
* Update the migrator docs to be current (#1136)
* Add the Jekyll Gallery Plugin to the plugin list (#1143)
### Development Fixes
* Use Jekyll.logger instead of Jekyll::Stevenson to log things (#1149)
* Fix pesky Cucumber infinite loop (#1139)
* Do not write posts with timezones in Cucumber tests (#1124)
* Use ISO formatted dates in Cucumber features (#1150)
## 1.0.2 / 2013-05-12
### Major Enhancements
* Add `jekyll doctor` command to check site for any known compatibility problems (#1081)
* Backwards-compatibilize relative permalinks (#1081)
### Minor Enhancements
* Add a `data-lang="<lang>"` attribute to Redcarpet code blocks (#1066)
* Deprecate old config `server_port`, match to `port` if `port` isn't set (#1084)
* Update pygments.rb version to 0.5.0 (#1061)
* Update Kramdown version to 1.0.2 (#1067)
### Bug Fixes
* Fix issue when categories are numbers (#1078)
* Catching that Redcarpet gem isn't installed (#1059)
### Site Enhancements
* Add documentation about `relative_permalinks` (#1081)
* Remove pygments-installation instructions, as pygments.rb is bundled with it (#1079)
* Move pages to be Pages for realz (#985)
* Updated links to Liquid documentation (#1073)
## 1.0.1 / 2013-05-08
### Minor Enhancements
* Do not force use of toc_token when using generate_tok in RDiscount (#1048)
* Add newer `language-` class name prefix to code blocks (#1037)
* Commander error message now preferred over process abort with incorrect args (#1040)
### Bug Fixes
* Make Redcarpet respect the pygments configuration option (#1053)
* Fix the index build with LSI (#1045)
* Don't print deprecation warning when no arguments are specified. (#1041)
* Add missing `</div>` to site template used by `new` subcommand, fixed typos in code (#1032)
### Site Enhancements
* Changed https to http in the GitHub Pages link (#1051)
* Remove CSS cruft, fix typos, fix HTML errors (#1028)
* Removing manual install of Pip and Distribute (#1025)
* Updated URL for Markdown references plugin (#1022)
### Development Fixes
* Markdownify history file (#1027)
* Update links on README to point to new jekyllrb.com (#1018)
## 1.0.0 / 2013-05-06
### Major Enhancements
* Add `jekyll new` subcommand: generate a jekyll scaffold (#764)
* Refactored jekyll commands into subcommands: build, serve, and migrate. (#690)
* Removed importers/migrators from main project, migrated to jekyll-import sub-gem (#793)
* Added ability to render drafts in `_drafts` folder via command line (#833)
* Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) (#928)
### Minor Enhancements
* Site template HTML5-ified (#964)
* Use post's directory path when matching for the post_url tag (#998)
* Loosen dependency on Pygments so it's only required when it's needed (#1015)
* Parse strings into Time objects for date-related Liquid filters (#1014)
* Tell the user if there is no subcommand specified (#1008)
* Freak out if the destination of `jekyll new` exists and is non-empty (#981)
* Add `timezone` configuration option for compilation (#957)
* Add deprecation messages for pre-1.0 CLI options (#959)
* Refactor and colorize logging (#959)
* Refactor Markdown parsing (#955)
* Added application/vnd.apple.pkpass to mime.types served by WEBrick (#907)
* Move template site to default markdown renderer (#961)
* Expose new attribute to Liquid via `page`: `page.path` (#951)
* Accept multiple config files from command line (#945)
* Add page variable to liquid custom tags and blocks (#413)
* Add paginator.previous_page_path and paginator.next_page_path (#942)
* Backwards compatibility for 'auto' (#821, #934)
* Added date_to_rfc822 used on RSS feeds (#892)
* Upgrade version of pygments.rb to 0.4.2 (#927)
* Added short month (e.g. "Sep") to permalink style options for posts (#890)
* Expose site.baseurl to Liquid templates (#869)
* Adds excerpt attribute to posts which contains first paragraph of content (#837)
* Accept custom configuration file via CLI (#863)
* Load in GitHub Pages MIME Types on `jekyll serve` (#847, #871)
* Improve debugability of error message for a malformed highlight tag (#785)
* Allow symlinked files in unsafe mode (#824)
* Add 'gist' Liquid tag to core (#822, #861)
* New format of Jekyll output (#795)
* Reinstate --limit_posts and --future switches (#788)
* Remove ambiguity from command descriptions (#815)
* Fix SafeYAML Warnings (#807)
* Relaxed Kramdown version to 0.14 (#808)
* Aliased `jekyll server` to `jekyll serve`. (#792)
* Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. (#744)
* Refactored jekyll subcommands into Jekyll::Commands submodule, which now contains them (#768)
* Rescue from import errors in Wordpress.com migrator (#671)
* Massively accelerate LSI performance (#664)
* Truncate post slugs when importing from Tumblr (#496)
* Add glob support to include, exclude option (#743)
* Layout of Page or Post defaults to 'page' or 'post', respectively (#580)
REPEALED by (#977)
* "Keep files" feature (#685)
* Output full path & name for files that don't parse (#745)
* Add source and destination directory protection (#535)
* Better YAML error message (#718)
* Bug Fixes
* Paginate in subdirectories properly (#1016)
* Ensure post and page URLs have a leading slash (#992)
* Catch all exceptions, not just StandardError descendents (#1007)
* Bullet-proof limit_posts option (#1004)
* Read in YAML as UTF-8 to accept non-ASCII chars (#836)
* Fix the CLI option --plugins to actually accept dirs and files (#993)
* Allow 'excerpt' in YAML Front-Matter to override the extracted excerpt (#946)
* Fix cascade problem with site.baseurl, site.port and site.host. (#935)
* Filter out directories with valid post names (#875)
* Fix symlinked static files not being correctly built in unsafe mode (#909)
* Fix integration with directory_watcher 1.4.x (#916)
* Accepting strings as arguments to jekyll-import command (#910)
* Force usage of older directory_watcher gem as 1.5 is broken (#883)
* Ensure all Post categories are downcase (#842, #872)
* Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors (#555)
* Patch for multibyte URI problem with jekyll serve (#723)
* Order plugin execution by priority (#864)
* Fixed Page#dir and Page#url for edge cases (#536)
* Fix broken post_url with posts with a time in their YAML Front-Matter (#831)
* Look for plugins under the source directory (#654)
* Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long
post names (#775)
* Force Categories to be Strings (#767)
* Safe YAML plugin to prevent vulnerability (#777)
* Add SVG support to Jekyll/WEBrick. (#407, #406)
* Prevent custom destination from causing continuous regen on watch (#528, #820, #862)
### Site Enhancements
* Responsify (#860)
* Fix spelling, punctuation and phrasal errors (#989)
* Update quickstart instructions with `new` command (#966)
* Add docs for page.excerpt (#956)
* Add docs for page.path (#951)
* Clean up site docs to prepare for 1.0 release (#918)
* Bring site into master branch with better preview/deploy (#709)
* Redesigned site (#583)
### Development Fixes
* Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 (#938)
* Added "features:html" rake task for debugging purposes, cleaned up
cucumber profiles (#832)
* Explicitly require HTTPS rubygems source in Gemfile (#826)
* Changed Ruby version for development to 1.9.3-p374 from p362 (#801)
* Including a link to the GitHub Ruby style guide in CONTRIBUTING.md (#806)
* Added script/bootstrap (#776)
* Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version
of greater than 1.9 (#771)
* Switch to Simplecov for coverage report (#765)
## 0.12.1 / 2013-02-19
### Minor Enhancements
* Update Kramdown version to 0.14.1 (#744)
* Test Enhancements
* Update Rake version to 10.0.3 (#744)
* Update Shoulda version to 3.3.2 (#744)
* Update Redcarpet version to 2.2.2 (#744)
## 0.12.0 / 2012-12-22
### Minor Enhancements
* Add ability to explicitly specify included files (#261)
* Add --default-mimetype option (#279)
* Allow setting of RedCloth options (#284)
* Add post_url Liquid tag for internal post linking (#369)
* Allow multiple plugin dirs to be specified (#438)
* Inline TOC token support for RDiscount (#333)
* Add the option to specify the paginated url format (#342)
* Swap out albino for pygments.rb (#569)
* Support Redcarpet 2 and fenced code blocks (#619)
* Better reporting of Liquid errors (#624)
* Bug Fixes
* Allow some special characters in highlight names
* URL escape category names in URL generation (#360)
* Fix error with limit_posts (#442)
* Properly select dotfile during directory scan (#363, #431, #377)
* Allow setting of Kramdown smart_quotes (#482)
* Ensure front-matter is at start of file (#562)
## 0.11.2 / 2011-12-27
* Bug Fixes
* Fix gemspec
## 0.11.1 / 2011-12-27
* Bug Fixes
* Fix extra blank line in highlight blocks (#409)
* Update dependencies
## 0.11.0 / 2011-07-10
### Major Enhancements
* Add command line importer functionality (#253)
* Add Redcarpet Markdown support (#318)
* Make markdown/textile extensions configurable (#312)
* Add `markdownify` filter
### Minor Enhancements
* Switch to Albino gem
* Bundler support
* Use English library to avoid hoops (#292)
* Add Posterous importer (#254)
* Fixes for Wordpress importer (#274, #252, #271)
* Better error message for invalid post date (#291)
* Print formatted fatal exceptions to stdout on build failure
* Add Tumblr importer (#323)
* Add Enki importer (#320)
* Bug Fixes
* Secure additional path exploits
## 0.10.0 / 2010-12-16
* Bug Fixes
* Add --no-server option.
## 0.9.0 / 2010-12-15
### Minor Enhancements
* Use OptionParser's `[no-]` functionality for better boolean parsing.
* Add Drupal migrator (#245)
* Complain about YAML and Liquid errors (#249)
* Remove orphaned files during regeneration (#247)
* Add Marley migrator (#28)
## 0.8.0 / 2010-11-22
### Minor Enhancements
* Add wordpress.com importer (#207)
* Add --limit-posts cli option (#212)
* Add uri_escape filter (#234)
* Add --base-url cli option (#235)
* Improve MT migrator (#238)
* Add kramdown support (#239)
* Bug Fixes
* Fixed filename basename generation (#208)
* Set mode to UTF8 on Sequel connections (#237)
* Prevent `_includes` dir from being a symlink
## 0.7.0 / 2010-08-24
### Minor Enhancements
* Add support for rdiscount extensions (#173)
* Bug Fixes
* Highlight should not be able to render local files
* The site configuration may not always provide a 'time' setting (#184)
## 0.6.2 / 2010-06-25
* Bug Fixes
* Fix Rakefile 'release' task (tag pushing was missing origin)
* Ensure that RedCloth is loaded when textilize filter is used (#183)
* Expand source, destination, and plugin paths (#180)
* Fix page.url to include full relative path (#181)
## 0.6.1 / 2010-06-24
* Bug Fixes
* Fix Markdown Pygments prefix and suffix (#178)
## 0.6.0 / 2010-06-23
### Major Enhancements
* Proper plugin system (#19, #100)
* Add safe mode so unsafe converters/generators can be added
* Maruku is now the only processor dependency installed by default.
Other processors will be lazy-loaded when necessary (and prompt the
user to install them when necessary) (#57)
### Minor Enhancements
* Inclusion/exclusion of future dated posts (#59)
* Generation for a specific time (#59)
* Allocate site.time on render not per site_payload invocation (#59)
* Pages now present in the site payload and can be used through the
site.pages and site.html_pages variables
* Generate phase added to site#process and pagination is now a generator
* Switch to RakeGem for build/test process
* Only regenerate static files when they have changed (#142)
* Allow arbitrary options to Pygments (#31)
* Allow URL to be set via command line option (#147)
* Bug Fixes
* Render highlighted code for non markdown/textile pages (#116)
* Fix highlighting on Ruby 1.9 (#65)
* Fix extension munging when pretty permalinks are enabled (#64)
* Stop sorting categories (#33)
* Preserve generated attributes over front matter (#119)
* Fix source directory binding using Dir.pwd (#75)
## 0.5.7 / 2010-01-12
### Minor Enhancements
* Allow overriding of post date in the front matter (#62, #38)
* Bug Fixes
* Categories isn't always an array (#73)
* Empty tags causes error in read_posts (#84)
* Fix pagination to adhere to read/render/write paradigm
* Test Enhancement
* cucumber features no longer use site.posts.first where a better
alternative is available
## 0.5.6 / 2010-01-08
* Bug Fixes
* Require redcloth >= 4.2.1 in tests (#92)
* Don't break on triple dashes in yaml frontmatter (#93)
### Minor Enhancements
* Allow .mkd as markdown extension
* Use $stdout/err instead of constants (#99)
* Properly wrap code blocks (#91)
* Add javascript mime type for webrick (#98)
## 0.5.5 / 2010-01-08
* Bug Fixes
* Fix pagination % 0 bug (#78)
* Ensure all posts are processed first (#71)
## NOTE
* After this point I will no longer be giving credit in the history;
that is what the commit log is for.
## 0.5.4 / 2009-08-23
* Bug Fixes
* Do not allow symlinks (security vulnerability)
## 0.5.3 / 2009-07-14
* Bug Fixes
* Solving the permalink bug where non-html files wouldn't work
(@jeffrydegrande)
## 0.5.2 / 2009-06-24
* Enhancements
* Added --paginate option to the executable along with a paginator object
for the payload (@calavera)
* Upgraded RedCloth to 4.2.1, which makes `<notextile>` tags work once
again.
* Configuration options set in config.yml are now available through the
site payload (@vilcans)
* Posts can now have an empty YAML front matter or none at all
(@bahuvrihi)
* Bug Fixes
* Fixing Ruby 1.9 issue that requires to_s on the err object
(@Chrononaut)
* Fixes for pagination and ordering posts on the same day (@ujh)
* Made pages respect permalinks style and permalinks in yml front matter
(@eugenebolshakov)
* Index.html file should always have index.html permalink
(@eugenebolshakov)
* Added trailing slash to pretty permalink style so Apache is happy
(@eugenebolshakov)
* Bad markdown processor in config fails sooner and with better message
(@gcnovus)
* Allow CRLFs in yaml frontmatter (@juretta)
* Added Date#xmlschema for Ruby versions < 1.9
## 0.5.1 / 2009-05-06
### Major Enhancements
* Next/previous posts in site payload (@pantulis, @tomo)
* Permalink templating system
* Moved most of the README out to the GitHub wiki
* Exclude option in configuration so specified files won't be brought over
with generated site (@duritong)
* Bug Fixes
* Making sure config.yaml references are all gone, using only config.yml
* Fixed syntax highlighting breaking for UTF-8 code (@henrik)
* Worked around RDiscount bug that prevents Markdown from getting parsed
after highlight (@henrik)
* CGI escaped post titles (@Chrononaut)
## 0.5.0 / 2009-04-07
### Minor Enhancements
* Ability to set post categories via YAML (@qrush)
* Ability to set prevent a post from publishing via YAML (@qrush)
* Add textilize filter (@willcodeforfoo)
* Add 'pretty' permalink style for wordpress-like urls (@dysinger)
* Made it possible to enter categories from YAML as an array (@Chrononaut)
* Ignore Emacs autosave files (@Chrononaut)
* Bug Fixes
* Use block syntax of popen4 to ensure that subprocesses are properly disposed (@jqr)
* Close open4 streams to prevent zombies (@rtomayko)
* Only query required fields from the WP Database (@ariejan)
* Prevent `_posts` from being copied to the destination directory (@bdimcheff)
* Refactors
* Factored the filtering code into a method (@Chrononaut)
* Fix tests and convert to Shoulda (@qrush, @technicalpickles)
* Add Cucumber acceptance test suite (@qrush, @technicalpickles)
## 0.4.1
### Minor Enhancements
* Changed date format on wordpress converter (zeropadding) (@dysinger)
* Bug Fixes
* Add jekyll binary as executable to gemspec (@dysinger)
## 0.4.0 / 2009-02-03
### Major Enhancements
* Switch to Jeweler for packaging tasks
### Minor Enhancements
* Type importer (@codeslinger)
* site.topics accessor (@baz)
* Add `array_to_sentence_string` filter (@mchung)
* Add a converter for textpattern (@PerfectlyNormal)
* Add a working Mephisto / MySQL converter (@ivey)
* Allowing .htaccess files to be copied over into the generated site (@briandoll)
* Add option to not put file date in permalink URL (@mreid)
* Add line number capabilities to highlight blocks (@jcon)
* Bug Fixes
* Fix permalink behavior (@cavalle)
* Fixed an issue with pygments, markdown, and newlines (@zpinter)
* Ampersands need to be escaped (@pufuwozu, @ap)
* Test and fix the site.categories hash (@zzot)
* Fix site payload available to files (@matrix9180)
## 0.3.0 / 2008-12-24
### Major Enhancements
* Added --server option to start a simple WEBrick server on destination
directory (@johnreilly and @mchung)
### Minor Enhancements
* Added post categories based on directories containing `_posts` (@mreid)
* Added post topics based on directories underneath `_posts`
* Added new date filter that shows the full month name (@mreid)
* Merge Post's YAML front matter into its to_liquid payload (@remi)
* Restrict includes to regular files underneath `_includes`
* Bug Fixes
* Change YAML delimiter matcher so as to not chew up 2nd level markdown
headers (@mreid)
* Fix bug that meant page data (such as the date) was not available in
templates (@mreid)
* Properly reject directories in `_layouts`
## 0.2.1 / 2008-12-15
* Major Changes
* Use Maruku (pure Ruby) for Markdown by default (@mreid)
* Allow use of RDiscount with --rdiscount flag
### Minor Enhancements
* Don't load directory_watcher unless it's needed (@pjhyett)
## 0.2.0 / 2008-12-14
* Major Changes
* related_posts is now found in site.related_posts
## 0.1.6 / 2008-12-13
* Major Features
* Include files in `_includes` with `{% include x.textile %}`
## 0.1.5 / 2008-12-12
### Major Enhancements
* Code highlighting with Pygments if --pygments is specified
* Disable true LSI by default, enable with --lsi
### Minor Enhancements
* Output informative message if RDiscount is not available (@JackDanger)
* Bug Fixes
* Prevent Jekyll from picking up the output directory as a source (@JackDanger)
* Skip `related_posts` when there is only one post (@JackDanger)
## 0.1.4 / 2008-12-08
* Bug Fixes
* DATA does not work properly with rubygems
## 0.1.3 / 2008-12-06
* Major Features
* Markdown support (@vanpelt)
* Mephisto and CSV converters (@vanpelt)
* Code hilighting (@vanpelt)
* Autobuild
* Bug Fixes
* Accept both \r\n and \n in YAML header (@vanpelt)
## 0.1.2 / 2008-11-22
* Major Features
* Add a real "related posts" implementation using Classifier
* Command Line Changes
* Allow cli to be called with 0, 1, or 2 args intuiting dir paths
if they are omitted
## 0.1.1 / 2008-11-22
* Minor Additions
* Posts now support introspectional data e.g. `{{ page.url }}`
## 0.1.0 / 2008-11-05
* First release
* Converts posts written in Textile
* Converts regular site pages
* Simple copy of binary files
## 0.0.0 / 2008-10-19
* Birthday!

View File

@ -1,409 +0,0 @@
== HEAD
* Major Enhancements
* Add `jekyll new` subcommand: generate a jekyll scaffold (#764)
* Refactored jekyll commands into subcommands: build, serve, and migrate. (#690)
* Removed importers/migrators from main project, migrated to jekyll-import sub-gem (#793)
* Added ability to render drafts in _drafts folder via command line (#833)
* Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) (#928)
* Minor Enhancements
* Add paginator.previous_page_path and paginator.next_page_path (#942)
* Backwards compatibility for 'auto' (#821, #934)
* Added date_to_rfc822 used on RSS feeds (#892)
* Upgrade version of pygments.rb to 0.4.2 (#927)
* Added short month (e.g. "Sep") to permalink style options for posts (#890)
* Expose site.baseurl to Liquid templates (#869)
* Adds excerpt attribute to posts which contains first paragraph of content (#837)
* Accept custom configuration file via CLI (#863)
* Load in GitHub Pages MIME Types on `jekyll serve` (#847, #871)
* Improve debugability of error message for a malformed highlight tag (#785)
* Allow symlinked files in unsafe mode (#824)
* Add 'gist' Liquid tag to core (#822, #861)
* New format of Jekyll output (#795)
* Reinstate --limit_posts and --future switches (#788)
* Remove ambiguity from command descriptions (#815)
* Fix SafeYAML Warnings (#807)
* Relaxed Kramdown version to 0.14 (#808)
* Aliased `jekyll server` to `jekyll serve`. (#792)
* Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. (#744)
* Refactored jekyll subcommands into Jekyll::Commands submodule, which now contains them (#768)
* Rescue from import errors in Wordpress.com migrator (#671)
* Massively accelerate LSI performance (#664)
* Truncate post slugs when importing from Tumblr (#496)
* Add glob support to include, exclude option (#743)
* Layout of Page or Post defaults to 'page' or 'post', respectively (#580)
* "Keep files" feature (#685)
* Output full path & name for files that don't parse (#745)
* Add source and destination directory protection (#535)
* Better YAML error message (#718)
* Bug Fixes
* Fix cascade problem with site.baseurl, site.port and site.host. (#935)
* Filter out directories with valid post names (#875)
* Fix symlinked static files not being correctly built in unsafe mode (#909)
* Fix integration with directory_watcher 1.4.x (#916)
* Accepting strings as arguments to jekyll-import command (#910)
* Force usage of older directory_watcher gem as 1.5 is broken (#883)
* Ensure all Post categories are downcase (#842, #872)
* Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors (#555)
* Patch for multibyte URI problem with jekyll serve (#723)
* Order plugin execution by priority (#864)
* Fixed Page#dir and Page#url for edge cases (#536)
* Fix broken post_url with posts with a time in their YAML Front-Matter (#831)
* Look for plugins under the source directory (#654)
* Tumblr Migrator: finds _posts dir correctly, fixes truncation of long
post names (#775)
* Force Categories to be Strings (#767)
* Safe YAML plugin to prevent vulnerability (#777)
* Add SVG support to Jekyll/WEBrick. (#407, #406)
* Prevent custom destination from causing continuous regen on watch (#528, #820, #862)
* Site Enhancements
* Clean up site docs to prepare for 1.0 release (#918)
* Bring site into master branch with better preview/deploy (#709)
* Redesigned site (#583)
* Development fixes
* Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 (#938)
* Added "features:html" rake task for debugging purposes, cleaned up
cucumber profiles (#832)
* Explicitly require HTTPS rubygems source in Gemfile (#826)
* Changed Ruby version for development to 1.9.3-p374 from p362 (#801)
* Including a link to the GitHub Ruby style guide in CONTRIBUTING.md (#806)
* Added script/bootstrap (#776)
* Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version
of greater than 1.9 (#771)
* Switch to Simplecov for coverage report (#765)
== 0.12.1 / 2013-02-19
* Minor Enhancements
* Update Kramdown version to 0.14.1 (#744)
* Test Enhancements
* Update Rake version to 10.0.3 (#744)
* Update Shoulda version to 3.3.2 (#744)
* Update Redcarpet version to 2.2.2 (#744)
== 0.12.0 / 2012-12-22
* Minor Enhancements
* Add ability to explicitly specify included files (#261)
* Add --default-mimetype option (#279)
* Allow setting of RedCloth options (#284)
* Add post_url Liquid tag for internal post linking (#369)
* Allow multiple plugin dirs to be specified (#438)
* Inline TOC token support for RDiscount (#333)
* Add the option to specify the paginated url format (#342)
* Swap out albino for pygments.rb (#569)
* Support Redcarpet 2 and fenced code blocks (#619)
* Better reporting of Liquid errors (#624)
* Bug Fixes
* Allow some special characters in highlight names
* URL escape category names in URL generation (#360)
* Fix error with limit_posts (#442)
* Properly select dotfile during directory scan (#363, #431, #377)
* Allow setting of Kramdown smart_quotes (#482)
* Ensure front-matter is at start of file (#562)
== 0.11.2 / 2011-12-27
* Bug Fixes
* Fix gemspec
== 0.11.1 / 2011-12-27
* Bug Fixes
* Fix extra blank line in highlight blocks (#409)
* Update dependencies
== 0.11.0 / 2011-07-10
* Major Enhancements
* Add command line importer functionality (#253)
* Add Redcarpet Markdown support (#318)
* Make markdown/textile extensions configurable (#312)
* Add `markdownify` filter
* Minor Enhancements
* Switch to Albino gem
* Bundler support
* Use English library to avoid hoops (#292)
* Add Posterous importer (#254)
* Fixes for Wordpress importer (#274, #252, #271)
* Better error message for invalid post date (#291)
* Print formatted fatal exceptions to stdout on build failure
* Add Tumblr importer (#323)
* Add Enki importer (#320)
* Bug Fixes
* Secure additional path exploits
== 0.10.0 / 2010-12-16
* Bug Fixes
* Add --no-server option.
== 0.9.0 / 2010-12-15
* Minor Enhancements
* Use OptionParser's [no-] functionality for better boolean parsing.
* Add Drupal migrator (#245)
* Complain about YAML and Liquid errors (#249)
* Remove orphaned files during regeneration (#247)
* Add Marley migrator (#28)
== 0.8.0 / 2010-11-22
* Minor Enhancements
* Add wordpress.com importer (#207)
* Add --limit-posts cli option (#212)
* Add uri_escape filter (#234)
* Add --base-url cli option (#235)
* Improve MT migrator (#238)
* Add kramdown support (#239)
* Bug Fixes
* Fixed filename basename generation (#208)
* Set mode to UTF8 on Sequel connections (#237)
* Prevent _includes dir from being a symlink
== 0.7.0 / 2010-08-24
* Minor Enhancements
* Add support for rdiscount extensions (#173)
* Bug Fixes
* Highlight should not be able to render local files
* The site configuration may not always provide a 'time' setting (#184)
== 0.6.2 / 2010-06-25
* Bug Fixes
* Fix Rakefile 'release' task (tag pushing was missing origin)
* Ensure that RedCloth is loaded when textilize filter is used (#183)
* Expand source, destination, and plugin paths (#180)
* Fix page.url to include full relative path (#181)
== 0.6.1 / 2010-06-24
* Bug Fixes
* Fix Markdown Pygments prefix and suffix (#178)
== 0.6.0 / 2010-06-23
* Major Enhancements
* Proper plugin system (#19, #100)
* Add safe mode so unsafe converters/generators can be added
* Maruku is now the only processor dependency installed by default.
Other processors will be lazy-loaded when necessary (and prompt the
user to install them when necessary) (#57)
* Minor Enhancements
* Inclusion/exclusion of future dated posts (#59)
* Generation for a specific time (#59)
* Allocate site.time on render not per site_payload invocation (#59)
* Pages now present in the site payload and can be used through the
site.pages and site.html_pages variables
* Generate phase added to site#process and pagination is now a generator
* Switch to RakeGem for build/test process
* Only regenerate static files when they have changed (#142)
* Allow arbitrary options to Pygments (#31)
* Allow URL to be set via command line option (#147)
* Bug Fixes
* Render highlighted code for non markdown/textile pages (#116)
* Fix highlighting on Ruby 1.9 (#65)
* Fix extension munging when pretty permalinks are enabled (#64)
* Stop sorting categories (#33)
* Preserve generated attributes over front matter (#119)
* Fix source directory binding using Dir.pwd (#75)
== 0.5.7 / 2010-01-12
* Minor Enhancements
* Allow overriding of post date in the front matter (#62, #38)
* Bug Fixes
* Categories isn't always an array (#73)
* Empty tags causes error in read_posts (#84)
* Fix pagination to adhere to read/render/write paradigm
* Test Enhancement
* cucumber features no longer use site.posts.first where a better
alternative is available
== 0.5.6 / 2010-01-08
* Bug Fixes
* Require redcloth >= 4.2.1 in tests (#92)
* Don't break on triple dashes in yaml frontmatter (#93)
* Minor Enhancements
* Allow .mkd as markdown extension
* Use $stdout/err instead of constants (#99)
* Properly wrap code blocks (#91)
* Add javascript mime type for webrick (#98)
== 0.5.5 / 2010-01-08
* Bug Fixes
* Fix pagination % 0 bug (#78)
* Ensure all posts are processed first (#71)
== NOTE
* After this point I will no longer be giving credit in the history;
that is what the commit log is for.
== 0.5.4 / 2009-08-23
* Bug Fixes
* Do not allow symlinks (security vulnerability)
== 0.5.3 / 2009-07-14
* Bug Fixes
* Solving the permalink bug where non-html files wouldn't work
[github.com/jeffrydegrande]
== 0.5.2 / 2009-06-24
* Enhancements
* Added --paginate option to the executable along with a paginator object
for the payload [github.com/calavera]
* Upgraded RedCloth to 4.2.1, which makes <notextile> tags work once
again.
* Configuration options set in config.yml are now available through the
site payload [github.com/vilcans]
* Posts can now have an empty YAML front matter or none at all
[github.com/bahuvrihi]
* Bug Fixes
* Fixing Ruby 1.9 issue that requires to_s on the err object
[github.com/Chrononaut]
* Fixes for pagination and ordering posts on the same day [github.com/ujh]
* Made pages respect permalinks style and permalinks in yml front matter
[github.com/eugenebolshakov]
* Index.html file should always have index.html permalink
[github.com/eugenebolshakov]
* Added trailing slash to pretty permalink style so Apache is happy
[github.com/eugenebolshakov]
* Bad markdown processor in config fails sooner and with better message
[github.com/gcnovus]
* Allow CRLFs in yaml frontmatter [github.com/juretta]
* Added Date#xmlschema for Ruby versions < 1.9
== 0.5.1 / 2009-05-06
* Major Enhancements
* Next/previous posts in site payload [github.com/pantulis,
github.com/tomo]
* Permalink templating system
* Moved most of the README out to the GitHub wiki
* Exclude option in configuration so specified files won't be brought over
with generated site [github.com/duritong]
* Bug Fixes
* Making sure config.yaml references are all gone, using only config.yml
* Fixed syntax highlighting breaking for UTF-8 code [github.com/henrik]
* Worked around RDiscount bug that prevents Markdown from getting parsed
after highlight [github.com/henrik]
* CGI escaped post titles [github.com/Chrononaut]
== 0.5.0 / 2009-04-07
* Minor Enhancements
* Ability to set post categories via YAML [github.com/qrush]
* Ability to set prevent a post from publishing via YAML
[github.com/qrush]
* Add textilize filter [github.com/willcodeforfoo]
* Add 'pretty' permalink style for wordpress-like urls
[github.com/dysinger]
* Made it possible to enter categories from YAML as an array
[github.com/Chrononaut]
* Ignore Emacs autosave files [github.com/Chrononaut]
* Bug Fixes
* Use block syntax of popen4 to ensure that subprocesses are properly
disposed [github.com/jqr]
* Close open4 streams to prevent zombies [github.com/rtomayko]
* Only query required fields from the WP Database [github.com/ariejan]
* Prevent _posts from being copied to the destination directory
[github.com/bdimcheff]
* Refactors
* Factored the filtering code into a method [github.com/Chrononaut]
* Fix tests and convert to Shoulda [github.com/qrush,
github.com/technicalpickles]
* Add Cucumber acceptance test suite [github.com/qrush,
github.com/technicalpickles]
== 0.4.1
* Minor Enhancements
* Changed date format on wordpress converter (zeropadding)
[github.com/dysinger]
* Bug Fixes
* Add jekyll binary as executable to gemspec [github.com/dysinger]
== 0.4.0 / 2009-02-03
* Major Enhancements
* Switch to Jeweler for packaging tasks
* Minor Enhancements
* Type importer [github.com/codeslinger]
* site.topics accessor [github.com/baz]
* Add array_to_sentence_string filter [github.com/mchung]
* Add a converter for textpattern [github.com/PerfectlyNormal]
* Add a working Mephisto / MySQL converter [github.com/ivey]
* Allowing .htaccess files to be copied over into the generated site
[github.com/briandoll]
* Add option to not put file date in permalink URL [github.com/mreid]
* Add line number capabilities to highlight blocks [github.com/jcon]
* Bug Fixes
* Fix permalink behavior [github.com/cavalle]
* Fixed an issue with pygments, markdown, and newlines
[github.com/zpinter]
* Ampersands need to be escaped [github.com/pufuwozu, github.com/ap]
* Test and fix the site.categories hash [github.com/zzot]
* Fix site payload available to files [github.com/matrix9180]
== 0.3.0 / 2008-12-24
* Major Enhancements
* Added --server option to start a simple WEBrick server on destination
directory [github.com/johnreilly and github.com/mchung]
* Minor Enhancements
* Added post categories based on directories containing _posts
[github.com/mreid]
* Added post topics based on directories underneath _posts
* Added new date filter that shows the full month name [github.com/mreid]
* Merge Post's YAML front matter into its to_liquid payload
[github.com/remi]
* Restrict includes to regular files underneath _includes
* Bug Fixes
* Change YAML delimiter matcher so as to not chew up 2nd level markdown
headers [github.com/mreid]
* Fix bug that meant page data (such as the date) was not available in
templates [github.com/mreid]
* Properly reject directories in _layouts
== 0.2.1 / 2008-12-15
* Major Changes
* Use Maruku (pure Ruby) for Markdown by default [github.com/mreid]
* Allow use of RDiscount with --rdiscount flag
* Minor Enhancements
* Don't load directory_watcher unless it's needed [github.com/pjhyett]
== 0.2.0 / 2008-12-14
* Major Changes
* related_posts is now found in site.related_posts
== 0.1.6 / 2008-12-13
* Major Features
* Include files in _includes with {% include x.textile %}
== 0.1.5 / 2008-12-12
* Major Features
* Code highlighting with Pygments if --pygments is specified
* Disable true LSI by default, enable with --lsi
* Minor Enhancements
* Output informative message if RDiscount is not available
[github.com/JackDanger]
* Bug Fixes
* Prevent Jekyll from picking up the output directory as a source
[github.com/JackDanger]
* Skip related_posts when there is only one post [github.com/JackDanger]
== 0.1.4 / 2008-12-08
* Bug Fixes
* DATA does not work properly with rubygems
== 0.1.3 / 2008-12-06
* Major Features
* Markdown support [github.com/vanpelt]
* Mephisto and CSV converters [github.com/vanpelt]
* Code hilighting [github.com/vanpelt]
* Autobuild
* Bug Fixes
* Accept both \r\n and \n in YAML header [github.com/vanpelt]
== 0.1.2 / 2008-11-22
* Major Features
* Add a real "related posts" implementation using Classifier
* Command Line Changes
* Allow cli to be called with 0, 1, or 2 args intuiting dir paths
if they are omitted
== 0.1.1 / 2008-11-22
* Minor Additions
* Posts now support introspectional data e.g. {{ page.url }}
== 0.1.0 / 2008-11-05
* First release
* Converts posts written in Textile
* Converts regular site pages
* Simple copy of binary files
== 0.0.0 / 2008-10-19
* Birthday!

45
README.markdown Normal file
View File

@ -0,0 +1,45 @@
# Jekyll
[![Build Status](https://secure.travis-ci.org/mojombo/jekyll.png)](https://travis-ci.org/mojombo/jekyll)
[![Code Climate](https://codeclimate.com/github/mojombo/jekyll.png)](https://codeclimate.com/github/mojombo/jekyll)
By Tom Preston-Werner, Nick Quaranto, and many awesome contributors!
Jekyll is a simple, blog aware, static site generator. It takes a template directory (representing the raw form of a website), runs it through Textile or Markdown and Liquid converters, and spits out a complete, static website suitable for serving with Apache or your favorite web server. This is also the engine behind [GitHub Pages](http://pages.github.com), which you can use to host your project's page or blog right here from GitHub.
## Getting Started
* [Install](http://jekyllrb.com/docs/installation/) the gem
* Read up about its [Usage](http://jekyllrb.com/docs/usage/) and [Configuration](http://jekyllrb.com/docs/configuration/)
* Take a gander at some existing [Sites](http://wiki.github.com/mojombo/jekyll/sites)
* Fork and [Contribute](https://github.com/mojombo/jekyll/blob/master/CONTRIBUTING.md) your own modifications
* Have questions? Post them on the [Mailing List](http://groups.google.com/group/jekyll-rb)
## Diving In
* [Migrate](http://jekyllrb.com/docs/migrations/) from your previous system
* Learn how the [YAML Front Matter](http://jekyllrb.com/docs/frontmatter/) works
* Put information on your site with [Variables](http://jekyllrb.com/docs/variables/)
* Customize the [Permalinks](http://jekyllrb.com/docs/permalinks/) your posts are generated with
* Use the built-in [Liquid Extensions](http://jekyllrb.com/docs/templates/) to make your life easier
* Use custom [Plugins](http://jekyllrb.com/docs/plugins/) to generate content specific to your site
## Runtime Dependencies
* Classifier: Generating related posts (Ruby)
* Directory Watcher: Auto-regeneration of sites (Ruby)
* Kramdown: Markdown-superset converter (Ruby)
* Liquid: Templating system (Ruby)
* Maruku: Default markdown engine (Ruby)
## Developer Dependencies
* RDiscount: Discount Markdown Processor (Ruby)
* RedCloth: Textile support (Ruby)
* RedGreen: Nicer test output (Ruby)
* RR: Mocking (Ruby)
* Shoulda: Test framework (Ruby)
## License
See [LICENSE](https://github.com/mojombo/jekyll/blob/master/LICENSE).

View File

@ -1,45 +0,0 @@
h1. Jekyll
!https://travis-ci.org/mojombo/jekyll.png?branch=master!:https://travis-ci.org/mojombo/jekyll
"!https://codeclimate.com/github/mojombo/jekyll.png!":https://codeclimate.com/github/mojombo/jekyll
By Tom Preston-Werner, Nick Quaranto, and many awesome contributors!
Jekyll is a simple, blog aware, static site generator. It takes a template directory (representing the raw form of a website), runs it through Textile or Markdown and Liquid converters, and spits out a complete, static website suitable for serving with Apache or your favorite web server. This is also the engine behind "GitHub Pages":http://pages.github.com, which you can use to host your project's page or blog right here from GitHub.
h2. Getting Started
* "Install":http://wiki.github.com/mojombo/jekyll/install the gem
* Read up about its "Usage":http://wiki.github.com/mojombo/jekyll/usage and "Configuration":http://wiki.github.com/mojombo/jekyll/configuration
* Take a gander at some existing "Sites":http://wiki.github.com/mojombo/jekyll/sites
* Fork and "Contribute":http://wiki.github.com/mojombo/jekyll/contribute your own modifications
* Have questions? Post them on the "Mailing List":http://groups.google.com/group/jekyll-rb
h2. Diving In
* "Migrate":http://wiki.github.com/mojombo/jekyll/blog-migrations from your previous system
* Learn how the "YAML Front Matter":http://wiki.github.com/mojombo/jekyll/yaml-front-matter works
* Put information on your site with "Template Data":http://wiki.github.com/mojombo/jekyll/template-data
* Customize the "Permalinks":http://wiki.github.com/mojombo/jekyll/permalinks your posts are generated with
* Use the built-in "Liquid Extensions":http://wiki.github.com/mojombo/jekyll/liquid-extensions to make your life easier
* Use custom "Plugins":http://wiki.github.com/mojombo/jekyll/Plugins to generate content specific to your site
h2. Runtime Dependencies
* Classifier: Generating related posts (Ruby)
* Directory Watcher: Auto-regeneration of sites (Ruby)
* Kramdown: Markdown-superset converter (Ruby)
* Liquid: Templating system (Ruby)
* Maruku: Default markdown engine (Ruby)
h2. Developer Dependencies
* RDiscount: Discount Markdown Processor (Ruby)
* RedCloth: Textile support (Ruby)
* RedGreen: Nicer test output (Ruby)
* RR: Mocking (Ruby)
* Shoulda: Test framework (Ruby)
h2. License
See "LICENSE":https://github.com/mojombo/jekyll/blob/master/LICENSE.

View File

@ -2,6 +2,7 @@ require 'rubygems'
require 'rake' require 'rake'
require 'rdoc' require 'rdoc'
require 'date' require 'date'
require 'yaml'
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib])) $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
@ -24,6 +25,10 @@ def date
Date.today.to_s Date.today.to_s
end end
def file_date
Date.today.strftime("%F")
end
def rubyforge_project def rubyforge_project
name name
end end
@ -40,6 +45,39 @@ def replace_header(head, header_name)
head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"} head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
end end
def normalize_bullets(markdown)
markdown.gsub(/\s{2}\*{1}/, "-")
end
def linkify_prs(markdown)
markdown.gsub(/#(\d+)/) do |word|
"[#{word}](https://github.com/mojombo/jekyll/issues/#{word.delete("#")})"
end
end
def linkify_users(markdown)
markdown.gsub(/(@\w+)/) do |username|
"[#{username}](https://github.com/#{username.delete("@")})"
end
end
def linkify(markdown)
linkify_users(linkify_prs(markdown))
end
def liquid_escape(markdown)
markdown.gsub(/(`{[{%].+[}%]}`)/, "{% raw %}\\1{% endraw %}")
end
def remove_head_from_history(markdown)
index = markdown =~ /^##\s+\d+\.\d+\.\d+/
markdown[index..-1]
end
def converted_history(markdown)
remove_head_from_history(liquid_escape(linkify(normalize_bullets(markdown))))
end
############################################################################# #############################################################################
# #
# Standard tasks # Standard tasks
@ -110,11 +148,7 @@ namespace :site do
end end
desc "Commit the local site to the gh-pages branch and publish to GitHub Pages" desc "Commit the local site to the gh-pages branch and publish to GitHub Pages"
task :publish do task :publish => [:history] do
# Failsafe. Remove this once it has been done.
puts "Make sure to merge #583 into gh-pages before deploying."
exit(1)
# 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")
@ -147,6 +181,27 @@ namespace :site do
end end
puts 'Done.' puts 'Done.'
end end
desc "Create a nicely formatted history page for the jekyll site based on the repo history."
task :history do
if File.exist?("History.markdown")
history_file = File.read("History.markdown")
front_matter = {
"layout" => "docs",
"title" => "History",
"permalink" => "/docs/history/",
"prev_section" => "contributing"
}
Dir.chdir('site/docs/') do
File.open("history.md", "w") do |file|
file.write("#{front_matter.to_yaml}---\n\n")
file.write(converted_history(history_file))
end
end
else
abort "You seem to have misplaced your History.markdown file. I can haz?"
end
end
end end
############################################################################# #############################################################################

View File

@ -6,6 +6,8 @@ $:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
require 'commander/import' require 'commander/import'
require 'jekyll' require 'jekyll'
Jekyll::Deprecator.process(ARGV)
program :name, 'jekyll' program :name, 'jekyll'
program :version, Jekyll::VERSION program :version, Jekyll::VERSION
program :description, 'Jekyll is a blog-aware, static site generator in Ruby' program :description, 'Jekyll is a blog-aware, static site generator in Ruby'
@ -15,7 +17,7 @@ default_command :help
global_option '-s', '--source [DIR]', 'Source directory (defaults to ./)' global_option '-s', '--source [DIR]', 'Source directory (defaults to ./)'
global_option '-d', '--destination [DIR]', 'Destination directory (defaults to ./_site)' global_option '-d', '--destination [DIR]', 'Destination directory (defaults to ./_site)'
global_option '--safe', 'Safe mode (defaults to false)' global_option '--safe', 'Safe mode (defaults to false)'
global_option '--plugins', 'Plugins directory (defaults to ./_plugins)' global_option '-p', '--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]', Array, 'Plugins directory (defaults to ./_plugins)'
global_option '--layouts', 'Layouts directory (defaults to ./_layouts)' global_option '--layouts', 'Layouts directory (defaults to ./_layouts)'
# Option names don't always directly match the configuration value we'd like. # Option names don't always directly match the configuration value we'd like.
@ -35,8 +37,11 @@ command :new do |c|
c.syntax = 'jekyll new PATH' c.syntax = 'jekyll new PATH'
c.description = 'Creates a new Jekyll site scaffold in PATH' c.description = 'Creates a new Jekyll site scaffold in PATH'
c.option '--force', 'Force creation even if PATH already exists'
c.option '--blank', 'Creates scaffolding but with empty files'
c.action do |args, options| c.action do |args, options|
Jekyll::Commands::New.process(args) Jekyll::Commands::New.process(args, options.__hash__)
end end
end end
@ -44,15 +49,14 @@ command :build do |c|
c.syntax = 'jekyll build [options]' c.syntax = 'jekyll build [options]'
c.description = 'Build your site' c.description = 'Build your site'
c.option '--config [CONFIG_FILE]', 'Custom configuration file' c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
c.option '--future', 'Publishes posts with a future date' c.option '--future', 'Publishes posts with a future date'
c.option '--limit_posts MAX_POSTS', 'Limits the number of posts to parse and publish' c.option '--limit_posts MAX_POSTS', Integer, 'Limits the number of posts to parse and publish'
c.option '-w', '--watch', 'Watch for changes and rebuild' c.option '-w', '--watch', 'Watch for changes and rebuild'
c.option '--lsi', 'Use LSI for improved related posts' c.option '--lsi', 'Use LSI for improved related posts'
c.option '--drafts', 'Render posts in the _drafts folder' c.option '--drafts', 'Render posts in the _drafts folder'
c.action do |args, options| c.action do |args, options|
options.defaults :serving => false
options = normalize_options(options.__hash__) options = normalize_options(options.__hash__)
options = Jekyll.configuration(options) options = Jekyll.configuration(options)
Jekyll::Commands::Build.process(options) Jekyll::Commands::Build.process(options)
@ -63,15 +67,15 @@ command :serve do |c|
c.syntax = 'jekyll serve [options]' c.syntax = 'jekyll serve [options]'
c.description = 'Serve your site locally' c.description = 'Serve your site locally'
c.option '--config [CONFIG_FILE]', 'Custom configuration file' c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
c.option '--future', 'Publishes posts with a future date' c.option '--future', 'Publishes posts with a future date'
c.option '--limit_posts MAX_POSTS', 'Limits the number of posts to parse and publish' c.option '--limit_posts MAX_POSTS', Integer, 'Limits the number of posts to parse and publish'
c.option '-w', '--watch', 'Watch for changes and rebuild' c.option '-w', '--watch', 'Watch for changes and rebuild'
c.option '--lsi', 'Use LSI for improved related posts' c.option '--lsi', 'Use LSI for improved related posts'
c.option '--drafts', 'Render posts in the _drafts folder' c.option '--drafts', 'Render posts in the _drafts folder'
c.option '-p', '--port [PORT]', 'Port to listen on' c.option '-P', '--port [PORT]', 'Port to listen on'
c.option '-h', '--host [HOST]', 'Host to bind to' c.option '-H', '--host [HOST]', 'Host to bind to'
c.option '-b', '--baseurl [URL]', 'Base URL' c.option '-b', '--baseurl [URL]', 'Base URL'
c.action do |args, options| c.action do |args, options|
@ -85,6 +89,39 @@ command :serve do |c|
end end
alias_command :server, :serve alias_command :server, :serve
command :doctor do |c|
c.syntax = 'jekyll doctor'
c.description = 'Search site and print specific deprecation warnings'
c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
c.action do |args, options|
options = normalize_options(options.__hash__)
options = Jekyll.configuration(options)
Jekyll::Commands::Doctor.process(options)
end
end
alias_command :hyde, :doctor
command :docs do |c|
c.syntax = 'jekyll docs'
c.description = "Launch local server with docs for Jekyll v#{Jekyll::VERSION}"
c.option '-p', '--port [PORT]', 'Port to listen on'
c.option '-u', '--host [HOST]', 'Host to bind to'
c.action do |args, options|
options = normalize_options(options.__hash__)
options = Jekyll.configuration(options).merge({
'source' => File.expand_path("../site", File.dirname(__FILE__)),
'destination' => File.expand_path("../site/_site", File.dirname(__FILE__))
})
puts options
Jekyll::Commands::Build.process(options)
Jekyll::Commands::Serve.process(options)
end
end
command :import do |c| command :import do |c|
c.syntax = 'jekyll import <platform> [options]' c.syntax = 'jekyll import <platform> [options]'
c.description = 'Import your old blog to Jekyll' c.description = 'Import your old blog to Jekyll'

View File

@ -3,6 +3,13 @@ Feature: Create sites
I want to be able to make a static site I want to be able to make a static site
In order to share my awesome ideas with the interwebs In order to share my awesome ideas with the interwebs
Scenario: Blank site
Given I do not have a "test_blank" directory
When I call jekyll new with test_blank --blank
Then the test_blank/_layouts directory should exist
And the test_blank/_posts directory should exist
And the "test_blank/index.html" file should exist
Scenario: Basic site Scenario: Basic site
Given I have an "index.html" file that contains "Basic Site" Given I have an "index.html" file that contains "Basic Site"
When I run jekyll When I run jekyll
@ -13,7 +20,7 @@ Feature: Create sites
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 | content | | title | date | content |
| Hackers | 3/27/2009 | My First Exploit | | Hackers | 2009-03-27 | My First Exploit |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "My First Exploit" in "_site/2009/03/27/hackers.html" And I should see "My First Exploit" in "_site/2009/03/27/hackers.html"
@ -31,7 +38,7 @@ Feature: Create sites
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 |
| Wargames | 3/27/2009 | default | The only winning move is not to play. | | Wargames | 2009-03-27 | default | The only winning move is not to play. |
And I have a default layout that contains "Post Layout: {{ content }}" And I have a default layout that contains "Post Layout: {{ content }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -49,13 +56,13 @@ Feature: Create sites
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 | 3/27/2009 | post | content for entry1. | | entry1 | 2009-03-27 | post | content for entry1. |
| entry2 | 4/27/2009 | post | content for entry2. | | entry2 | 2009-04-27 | post | content for entry2. |
And I have a category/_posts directory And I have a category/_posts directory
And I have the following posts in "category": And I have the following posts in "category":
| title | date | layout | content | | title | date | layout | content |
| entry3 | 5/27/2009 | post | content for entry3. | | entry3 | 2009-05-27 | post | content for entry3. |
| entry4 | 6/27/2009 | post | content for entry4. | | entry4 | 2009-06-27 | post | content for entry4. |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Page : Site contains 2 pages and 4 posts" in "_site/index.html" And I should see "Page : Site contains 2 pages and 4 posts" in "_site/index.html"
@ -99,8 +106,8 @@ Feature: Create sites
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 | 12/31/2007 | post | content for entry1. | | entry1 | 2007-12-31 | post | content for entry1. |
| entry2 | 01/31/2020 | post | content for entry2. | | entry2 | 2020-01-31 | post | content for entry2. |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "URL: /2020/01/31/entry2/" in "_site/index.html" And I should see "URL: /2020/01/31/entry2/" in "_site/index.html"
@ -110,3 +117,14 @@ Feature: Create sites
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "SomeDirective" in "_site/.htaccess" And I should see "SomeDirective" in "_site/.htaccess"
Scenario: File was replaced by a directory
Given I have a "test" file that contains "some stuff"
When I run jekyll
Then the _site directory should exist
When I delete the file "test"
Given I have a test directory
And I have a "test/index.html" file that contains "some other stuff"
When I run jekyll
Then the _site/test directory should exist
And I should see "some other stuff" in "_site/test/index.html"

View File

@ -2,13 +2,13 @@ Feature: Draft Posts
As a hacker who likes to blog As a hacker who likes to blog
I want to be able to preview drafts locally I want to be able to preview drafts locally
In order to see if they look alright before publishing In order to see if they look alright before publishing
Scenario: Preview a draft Scenario: Preview a draft
Given I have a configuration file with "permalink" set to "none" Given I have a configuration file with "permalink" set to "none"
And I have a _drafts directory And I have a _drafts directory
And I have the following draft: And I have the following draft:
| title | date | layout | content | | title | date | layout | content |
| Recipe | 3/27/2009 | default | Not baked yet. | | Recipe | 2009-03-27 | default | Not baked yet. |
When I run jekyll with drafts When I run jekyll with drafts
Then the _site directory should exist Then the _site directory should exist
And I should see "Not baked yet." in "_site/recipe.html" And I should see "Not baked yet." in "_site/recipe.html"
@ -19,7 +19,7 @@ Feature: Draft Posts
And I have a _drafts directory And I have a _drafts directory
And I have the following draft: And I have the following draft:
| title | date | layout | content | | title | date | layout | content |
| Recipe | 3/27/2009 | default | Not baked yet. | | Recipe | 2009-03-27 | default | Not baked yet. |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And the "_site/recipe.html" file should not exist And the "_site/recipe.html" file should not exist

View File

@ -8,7 +8,7 @@ Feature: Embed filters
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 | 3/27/2009 | 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 "{{ site.time | date_to_xmlschema }}" And I have a default layout that contains "{{ site.time | date_to_xmlschema }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -19,7 +19,7 @@ Feature: Embed filters
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 | 3/27/2009 | 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 When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -30,7 +30,7 @@ Feature: Embed filters
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 | 3/27/2009 | 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 | xml_escape }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -41,7 +41,7 @@ Feature: Embed filters
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 | tags | content | | title | date | layout | tags | content |
| Star Wars | 3/27/2009 | default | [scifi, movies, force] | These aren't the droids you're looking for. | | Star Wars | 2009-03-27 | default | [scifi, movies, force] | These aren't the droids you're looking for. |
And I have a default layout that contains "{{ page.tags | array_to_sentence_string }}" And I have a default layout that contains "{{ page.tags | array_to_sentence_string }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -52,7 +52,7 @@ Feature: Embed filters
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 | 3/27/2009 | 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_' | textilize }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist

View File

@ -0,0 +1,35 @@
Feature: Include tags
In order to share their content across several pages
As a hacker who likes to blog
I want to be able to include files in my blog posts
Scenario: Include a file with parameters
Given I have an _includes directory
And I have an "_includes/header.html" file that contains "<header>My awesome blog header: {{include.param}}</header>"
And I have an "_includes/params.html" file that contains "Parameters:<ul>{% for param in include %}<li>{{param[0]}} = {{param[1]}}</li>{% endfor %}</ul>"
And I have an "_includes/ignore.html" file that contains "<footer>My blog footer</footer>"
And I have a _posts directory
And I have the following post:
| title | date | layout | content |
| Include Files | 2013-03-21 | default | {% include header.html param="myparam" %} |
| Ignore params if unused | 2013-03-21 | default | {% include ignore.html date="today" %} |
| List multiple parameters | 2013-03-21 | default | {% include params.html date="today" start="tomorrow" %} |
| Dont keep parameters | 2013-03-21 | default | {% include ignore.html param="test" %}\n{% include header.html %} |
| Allow params with spaces and quotes | 2013-04-07 | default | {% include params.html cool="param with spaces" super="\"quoted\"" single='has "quotes"' escaped='\'single\' quotes' %} |
| Parameter syntax | 2013-04-12 | default | {% include params.html param1_or_2="value" %} |
| Pass a variable | 2013-06-22 | default | {% assign var = 'some text' %}{% include params.html local=var layout=page.layout %} |
When I run jekyll
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 not see "myparam" in "_site/2013/03/21/ignore-params-if-unused.html"
And I should see "<li>date = today</li>" in "_site/2013/03/21/list-multiple-parameters.html"
And I should see "<li>start = tomorrow</li>" in "_site/2013/03/21/list-multiple-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"
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 = &#8220;quoted&#8221;</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
And I should see "<li>single = has &#8220;quotes&#8221;</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
And I should see "<li>escaped = &#8216;single&#8217; quotes</li>" in "_site/2013/04/07/allow-params-with-spaces-and-quotes.html"
And I should see "<li>param1_or_2 = value</li>" in "_site/2013/04/12/parameter-syntax.html"
And I should see "<li>local = some text</li>" in "_site/2013/06/22/pass-a-variable.html"
And I should see "<li>layout = default</li>" in "_site/2013/06/22/pass-a-variable.html"

View File

@ -9,7 +9,7 @@ Feature: Markdown
And I have a _posts directory And I have a _posts directory
And I have the following post: And I have the following post:
| title | date | content | type | | title | date | content | type |
| Hackers | 3/27/2009 | # My Title | markdown | | Hackers | 2009-03-27 | # My Title | markdown |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Index" in "_site/index.html" And I should see "Index" in "_site/index.html"
@ -22,7 +22,7 @@ Feature: Markdown
And I have a _posts directory And I have a _posts directory
And I have the following post: And I have the following post:
| title | date | content | type | | title | date | content | type |
| Hackers | 3/27/2009 | # My Title | markdown | | Hackers | 2009-03-27 | # My Title | markdown |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Index" in "_site/index.html" And I should see "Index" in "_site/index.html"

View File

@ -2,18 +2,18 @@ Feature: Site pagination
In order to paginate my blog In order to paginate my blog
As a blog's user As a blog's user
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 "paginate" set to "<num>"
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
And I have the following post: And I have the following posts:
| title | date | layout | content | | title | date | layout | content |
| Wargames | 3/27/2009 | default | The only winning move is not to play. | | Wargames | 2009-03-27 | default | The only winning move is not to play. |
| Wargames2 | 4/27/2009 | default | The only winning move is not to play2. | | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. |
| Wargames3 | 5/27/2009 | default | The only winning move is not to play3. | | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. |
| Wargames4 | 6/27/2009 | default | The only winning move is not to play4. | | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. |
When I run jekyll When I run jekyll
Then the _site/page<exist> directory should exist Then the _site/page<exist> directory should exist
And the "_site/page<exist>/index.html" file should exist And the "_site/page<exist>/index.html" file should exist
@ -32,15 +32,15 @@ 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 |
And I have a _layouts directory And I have a blog directory
And I have an "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
And I have the following post: And I have the following posts:
| title | date | layout | content | | title | date | layout | content |
| Wargames | 3/27/2009 | default | The only winning move is not to play. | | Wargames | 2009-03-27 | default | The only winning move is not to play. |
| Wargames2 | 4/27/2009 | default | The only winning move is not to play2. | | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. |
| Wargames3 | 5/27/2009 | default | The only winning move is not to play3. | | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. |
| Wargames4 | 6/27/2009 | default | The only winning move is not to play4. | | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. |
When I run jekyll When I run jekyll
Then the _site/blog/page-<exist> directory should exist Then the _site/blog/page-<exist> directory should exist
And the "_site/blog/page-<exist>/index.html" file should exist And the "_site/blog/page-<exist>/index.html" file should exist
@ -52,3 +52,31 @@ Feature: Site pagination
| 2 | 1 | 5 | | 2 | 1 | 5 |
| 3 | 1 | 6 | | 3 | 1 | 6 |
| 4 | 1 | 7 | | 4 | 1 | 7 |
Scenario Outline: Setting a custom pagination path without an index.html in it
Given I have a configuration file with:
| key | value |
| paginate | 1 |
| paginate_path | /blog/page/:num |
| permalink | /blog/:year/:month/:day/:title |
And I have a blog directory
And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}"
And I have an "index.html" page that contains "Don't pick me!"
And I have a _posts directory
And I have the following posts:
| title | date | layout | content |
| Wargames | 2009-03-27 | default | The only winning move is not to play. |
| Wargames2 | 2009-04-27 | default | The only winning move is not to play2. |
| Wargames3 | 2009-05-27 | default | The only winning move is not to play3. |
| Wargames4 | 2009-06-27 | default | The only winning move is not to play4. |
When I run jekyll
Then the _site/blog/page/<exist> directory should exist
And the "_site/blog/page/<exist>/index.html" file should exist
And I should see "<posts>" in "_site/blog/page/<exist>/index.html"
And the "_site/blog/page/<not_exist>/index.html" file should not exist
Examples:
| exist | posts | not_exist |
| 2 | 1 | 5 |
| 3 | 1 | 6 |
| 4 | 1 | 7 |

View File

@ -7,7 +7,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 | content | | title | date | content |
| None Permalink Schema | 3/27/2009 | Totally nothing. | | None Permalink Schema | 2009-03-27 | Totally nothing. |
And I have a configuration file with "permalink" set to "none" And I have a configuration file with "permalink" set to "none"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -17,7 +17,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 | content | | title | date | content |
| Pretty Permalink Schema | 3/27/2009 | Totally wordpress. | | Pretty Permalink Schema | 2009-03-27 | Totally wordpress. |
And I have a configuration file with "permalink" set to "pretty" And I have a configuration file with "permalink" set to "pretty"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -38,7 +38,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 | category | date | content | | title | category | date | content |
| Custom Permalink Schema | stuff | 3/27/2009 | 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 When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -48,7 +48,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 | category | date | content | | title | category | date | content |
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. | | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. |
And I have a configuration file with "permalink" set to "/:categories/:title.html" And I have a configuration file with "permalink" set to "/:categories/:title.html"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -58,7 +58,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 | category | date | content | | title | category | date | content |
| Custom Permalink Schema | stuff | 3/27/2009 | Totally custom. | | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. |
And I have a configuration file with "permalink" set to "/:month-:day-:year/:title.html" And I have a configuration file with "permalink" set to "/:month-:day-:year/:title.html"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist

View File

@ -8,7 +8,7 @@ Feature: Post data
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 | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
And I have a simple layout that contains "Post title: {{ page.title }}" And I have a simple layout that contains "Post title: {{ page.title }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -19,7 +19,7 @@ Feature: Post data
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 | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
And I have a simple layout that contains "Post url: {{ page.url }}" And I have a simple layout that contains "Post url: {{ page.url }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -30,7 +30,7 @@ Feature: Post data
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 | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
And I have a simple layout that contains "Post date: {{ page.date | date_to_string }}" And I have a simple layout that contains "Post date: {{ page.date | date_to_string }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -41,7 +41,7 @@ Feature: Post data
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 | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
And I have a simple layout that contains "Post id: {{ page.id }}" And I have a simple layout that contains "Post id: {{ page.id }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -52,7 +52,7 @@ Feature: Post data
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 | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
And I have a simple layout that contains "Post content: {{ content }}" And I have a simple layout that contains "Post content: {{ content }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -64,7 +64,7 @@ Feature: Post data
And I have a _layouts directory And I have a _layouts directory
And I have the following post in "movies": And I have the following post in "movies":
| title | date | layout | content | | title | date | layout | content |
| Star Wars | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
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 When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -75,7 +75,7 @@ Feature: Post data
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 | tag | content | | title | date | layout | tag | content |
| Star Wars | 5/18/2009 | simple | twist | Luke, I am your father. | | Star Wars | 2009-05-18 | simple | twist | Luke, I am your father. |
And I have a simple layout that contains "Post tags: {{ page.tags }}" And I have a simple layout that contains "Post tags: {{ page.tags }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -88,7 +88,7 @@ Feature: Post data
And I have a _layouts directory And I have a _layouts directory
And I have the following post in "scifi/movies": And I have the following post in "scifi/movies":
| title | date | layout | content | | title | date | layout | content |
| Star Wars | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -101,7 +101,7 @@ Feature: Post data
And I have a _layouts directory And I have a _layouts directory
And I have the following post in "scifi/Movies": And I have the following post in "scifi/Movies":
| title | date | layout | content | | title | date | layout | content |
| Star Wars | 3/27/2009 | simple | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -112,29 +112,29 @@ Feature: Post data
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 | category | content | | title | date | layout | category | content |
| Star Wars | 3/27/2009 | simple | movies | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. |
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 When I run jekyll
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 category is in YAML and is mixed-case Scenario: Use post.categories variable when category is in YAML and is mixed-case
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 | category | content | | title | date | layout | category | content |
| Star Wars | 3/27/2009 | simple | Movies | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Movies | Luke, I am your father. |
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 When I run jekyll
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 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
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 | category | content | | title | date | layout | category | content |
| Star Wars | 3/27/2009 | simple | movies | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. |
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 When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -145,20 +145,44 @@ Feature: Post data
And I have a _layouts directory And I have a _layouts directory
And I have the following posts: And I have the following posts:
| title | date | layout | categories | content | | title | date | layout | categories | content |
| Star Wars | 3/27/2009 | simple | ['scifi', 'Movies'] | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | ['scifi', 'Movies'] | Luke, I am your father. |
| Star Trek | 3/17/2013 | simple | ['SciFi', 'movies'] | Jean Luc, I am your father. | | Star Trek | 2013-03-17 | simple | ['SciFi', 'movies'] | Jean Luc, I am your father. |
And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}" And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
When I run jekyll When I run jekyll
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
Given I have a <dir>/_posts directory
And I have the following post in "<dir>":
| title | type | date | content |
| my-post | html | 2013-04-12 | Source path: {{ page.path }} |
When I run jekyll
Then the _site directory should exist
And I should see "Source path: <path_prefix>_posts/2013-04-12-my-post.html" in "_site/<dir>/2013/04/12/my-post.html"
Examples:
| dir | path_prefix |
| . | |
| dir | dir/ |
| dir/nested | dir/nested/ |
Scenario: Override page.path variable
Given I have a _posts directory
And I have the following post:
| title | date | path | content |
| override | 2013-04-12 | override-path.html | Custom path: {{ page.path }} |
When I run jekyll
Then the _site directory should exist
And I should see "Custom path: override-path.html" in "_site/2013/04/12/override.html"
Scenario: Disable a post from being published Scenario: Disable a post from being published
Given I have a _posts directory Given I have a _posts directory
And I have an "index.html" file that contains "Published!" And I have an "index.html" file that contains "Published!"
And I have the following post: And I have the following post:
| title | date | layout | published | content | | title | date | layout | published | content |
| Star Wars | 3/27/2009 | simple | false | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | false | Luke, I am your father. |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And the "_site/2009/03/27/star-wars.html" file should not exist And the "_site/2009/03/27/star-wars.html" file should not exist
@ -169,7 +193,7 @@ Feature: Post data
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 | author | content | | title | date | layout | author | content |
| Star Wars | 3/27/2009 | simple | Darth Vader | Luke, I am your father. | | Star Wars | 2009-03-27 | simple | Darth Vader | Luke, I am your father. |
And I have a simple layout that contains "Post author: {{ page.author }}" And I have a simple layout that contains "Post author: {{ page.author }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
@ -180,9 +204,9 @@ Feature: Post data
And I have a _layouts directory And I have a _layouts directory
And I have the following posts: And I have the following posts:
| title | date | layout | author | content | | title | date | layout | author | content |
| Star Wars | 3/27/2009 | ordered | Darth Vader | Luke, I am your father. | | Star Wars | 2009-03-27 | ordered | Darth Vader | Luke, I am your father. |
| Some like it hot | 4/27/2009 | ordered | Osgood | Nobody is perfect. | | Some like it hot | 2009-04-27 | ordered | Osgood | Nobody is perfect. |
| Terminator | 5/27/2009 | ordered | Arnold | Sayonara, baby | | Terminator | 2009-05-27 | ordered | Arnold | Sayonara, baby |
And I have a ordered layout that contains "Previous post: {{ page.previous.title }} and next post: {{ page.next.title }}" And I have a ordered layout that contains "Previous post: {{ page.previous.title }} and next post: {{ page.next.title }}"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist

View File

@ -88,8 +88,8 @@ Feature: Site configuration
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 | 12/31/2007 | post | content for entry1. | | entry1 | 2007-12-31 | post | content for entry1. |
| entry2 | 01/31/2020 | post | content for entry2. | | entry2 | 2020-01-31 | post | content for entry2. |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Page Layout: 1 on 2010-01-01" in "_site/index.html" And I should see "Page Layout: 1 on 2010-01-01" in "_site/index.html"
@ -108,14 +108,54 @@ Feature: Site configuration
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 | 12/31/2007 | post | content for entry1. | | entry1 | 2007-12-31 | post | content for entry1. |
| entry2 | 01/31/2020 | post | content for entry2. | | entry2 | 2020-01-31 | post | content for entry2. |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html" And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html"
And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html" And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
And I should see "Post Layout: <p>content for entry2.</p>" in "_site/2020/01/31/entry2.html" And I should see "Post Layout: <p>content for entry2.</p>" in "_site/2020/01/31/entry2.html"
Scenario: Generate proper dates with explicitly set timezone (same as posts' time)
Given I have a _layouts directory
And I have a page layout that contains "Page Layout: {{ site.posts.size }}"
And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}"
And I have an "index.html" page with layout "page" that contains "site index page"
And I have a configuration file with:
| key | value |
| timezone | America/New_York |
And I have a _posts directory
And I have the following posts:
| title | date | layout | content |
| entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. |
| entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. |
When I run jekyll
Then the _site directory should exist
And I should see "Page Layout: 2" in "_site/index.html"
And I should see "Post Layout: <p>content for entry1.</p> built at 2013-04-09T23:22:00-04:00" in "_site/2013/04/09/entry1.html"
And I should see "Post Layout: <p>content for entry2.</p> built at 2013-04-10T03:14:00-04:00" in "_site/2013/04/10/entry2.html"
Scenario: Generate proper dates with explicitly set timezone (different than posts' time)
Given I have a _layouts directory
And I have a page layout that contains "Page Layout: {{ site.posts.size }}"
And I have a post layout that contains "Post Layout: {{ content }} built at {{ page.date | date_to_xmlschema }}"
And I have an "index.html" page with layout "page" that contains "site index page"
And I have a configuration file with:
| key | value |
| timezone | Australia/Melbourne |
And I have a _posts directory
And I have the following posts:
| title | date | layout | content |
| entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. |
| entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. |
When I run jekyll
Then the _site directory should exist
And I should see "Page Layout: 2" in "_site/index.html"
And the "_site/2013/04/10/entry1.html" file should exist
And the "_site/2013/04/10/entry2.html" file should exist
And I should see escaped "Post Layout: <p>content for entry1.</p> built at 2013-04-10T13:22:00+10:00" in "_site/2013/04/10/entry1.html"
And I should see escaped "Post Layout: <p>content for entry2.</p> built at 2013-04-10T17:14:00+10:00" in "_site/2013/04/10/entry2.html"
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
And I have a configuration file with: And I have a configuration file with:
@ -123,9 +163,9 @@ Feature: Site configuration
| limit_posts | 2 | | limit_posts | 2 |
And I have the following posts: And I have the following posts:
| title | date | content | | title | date | content |
| Apples | 3/27/2009 | An article about apples | | Apples | 2009-03-27 | An article about apples |
| Oranges | 4/1/2009 | An article about oranges | | Oranges | 2009-04-01 | An article about oranges |
| Bananas | 4/5/2009 | An article about bananas | | Bananas | 2009-04-05 | An article about bananas |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And the "_site/2009/04/05/bananas.html" file should exist And the "_site/2009/04/05/bananas.html" file should exist
@ -157,8 +197,8 @@ Feature: Site configuration
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 | 12/31/2007 | post | content for entry1. | | entry1 | 2007-12-31 | post | content for entry1. |
| entry2 | 01/31/2020 | post | content for entry2. | | entry2 | 2020-01-31 | post | content for entry2. |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html" And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html"

View File

@ -9,6 +9,25 @@ Feature: Site data
Then the _site directory should exist Then the _site directory should exist
And I should see "Contact: email@me.com" in "_site/contact.html" And I should see "Contact: email@me.com" in "_site/contact.html"
Scenario Outline: Use page.path variable in a page
Given I have a <dir> directory
And I have a "<path>" page that contains "Source path: {{ page.path }}"
When I run jekyll
Then the _site directory should exist
And I should see "Source path: <path>" in "_site/<path>"
Examples:
| dir | path |
| . | index.html |
| dir | dir/about.html |
| dir/nested | dir/nested/page.html |
Scenario: Override page.path
Given I have an "override.html" page with path "custom-override.html" that contains "Custom path: {{ page.path }}"
When I run jekyll
Then the _site directory should exist
And I should see "Custom path: custom-override.html" in "_site/override.html"
Scenario: Use site.time variable Scenario: Use site.time variable
Given I have an "index.html" page that contains "{{ site.time }}" Given I have an "index.html" page that contains "{{ site.time }}"
When I run jekyll When I run jekyll
@ -20,9 +39,9 @@ Feature: Site data
And I have an "index.html" page that contains "{{ site.posts.first.title }}: {{ site.posts.first.url }}" And I have an "index.html" page that contains "{{ site.posts.first.title }}: {{ site.posts.first.url }}"
And I have the following posts: And I have the following posts:
| title | date | content | | title | date | content |
| First Post | 3/25/2009 | My First Post | | First Post | 2009-03-25 | My First Post |
| Second Post | 3/26/2009 | My Second Post | | Second Post | 2009-03-26 | My Second Post |
| Third Post | 3/27/2009 | My Third Post | | Third Post | 2009-03-27 | My Third Post |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Third Post: /2009/03/27/third-post.html" in "_site/index.html" And I should see "Third Post: /2009/03/27/third-post.html" in "_site/index.html"
@ -32,9 +51,9 @@ Feature: Site data
And I have an "index.html" page that contains "{% for post in site.posts %} {{ post.title }} {% endfor %}" And I have an "index.html" page that contains "{% for post in site.posts %} {{ post.title }} {% endfor %}"
And I have the following posts: And I have the following posts:
| title | date | content | | title | date | content |
| First Post | 3/25/2009 | My First Post | | First Post | 2009-03-25 | My First Post |
| Second Post | 3/26/2009 | My Second Post | | Second Post | 2009-03-26 | My Second Post |
| Third Post | 3/27/2009 | My Third Post | | Third Post | 2009-03-27 | My Third Post |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Third Post Second Post First Post" in "_site/index.html" And I should see "Third Post Second Post First Post" in "_site/index.html"
@ -44,8 +63,8 @@ Feature: Site data
And I have an "index.html" page that contains "{% for post in site.categories.code %} {{ post.title }} {% endfor %}" And I have an "index.html" page that contains "{% for post in site.categories.code %} {{ post.title }} {% endfor %}"
And I have the following posts: And I have the following posts:
| title | date | category | content | | title | date | category | content |
| Awesome Hack | 3/26/2009 | code | puts 'Hello World' | | Awesome Hack | 2009-03-26 | code | puts 'Hello World' |
| Delicious Beer | 3/26/2009 | food | 1) Yuengling | | Delicious Beer | 2009-03-26 | food | 1) Yuengling |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Awesome Hack" in "_site/index.html" And I should see "Awesome Hack" in "_site/index.html"
@ -55,7 +74,7 @@ Feature: Site data
And I have an "index.html" page that contains "{% for post in site.tags.beer %} {{ post.content }} {% endfor %}" And I have an "index.html" page that contains "{% for post in site.tags.beer %} {{ post.content }} {% endfor %}"
And I have the following posts: And I have the following posts:
| title | date | tag | content | | title | date | tag | content |
| Delicious Beer | 3/26/2009 | beer | 1) Yuengling | | Delicious Beer | 2009-03-26 | beer | 1) Yuengling |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Yuengling" in "_site/index.html" And I should see "Yuengling" in "_site/index.html"
@ -65,11 +84,11 @@ Feature: Site data
And I have an "index.html" page that contains "{% for post in site.posts %}{{ post.title }}:{{ post.previous.title}},{{ post.next.title}} {% endfor %}" And I have an "index.html" page that contains "{% for post in site.posts %}{{ post.title }}:{{ post.previous.title}},{{ post.next.title}} {% endfor %}"
And I have the following posts: And I have the following posts:
| title | date | content | | title | date | content |
| first | 2/26/2009 | first | | first | 2009-02-26 | first |
| A | 3/26/2009 | A | | A | 2009-03-26 | A |
| B | 3/26/2009 | B | | B | 2009-03-26 | B |
| C | 3/26/2009 | C | | C | 2009-03-26 | C |
| last | 4/26/2009 | last | | last | 2009-04-26 | last |
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "last:C, C:B,last B:A,C A:first,B first:,A" in "_site/index.html" And I should see "last:C, C:B,last B:A,C A:first,B first:,A" in "_site/index.html"

View File

@ -1,17 +1,17 @@
Before do Before do
FileUtils.rm_rf(TEST_DIR)
FileUtils.mkdir(TEST_DIR) FileUtils.mkdir(TEST_DIR)
Dir.chdir(TEST_DIR) Dir.chdir(TEST_DIR)
end end
After do
Dir.chdir(TEST_DIR)
FileUtils.rm_rf(TEST_DIR)
end
Given /^I have a blank site in "(.*)"$/ do |path| Given /^I have a blank site in "(.*)"$/ do |path|
FileUtils.mkdir(path) FileUtils.mkdir(path)
end end
Given /^I do not have a "(.*)" directory$/ do |path|
File.directory?("#{TEST_DIR}/#{path}")
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|
@ -30,14 +30,13 @@ Given /^I have an? "(.*)" file that contains "(.*)"$/ do |file, text|
end end
end end
Given /^I have a (.*) layout that contains "(.*)"$/ do |layout, text| Given /^I have an? (.*) (layout|theme) that contains "(.*)"$/ do |name, type, text|
File.open(File.join('_layouts', layout + '.html'), 'w') do |f| folder = if type == 'layout'
f.write(text) '_layouts'
else
'_theme'
end end
end File.open(File.join(folder, name + '.html'), 'w') do |f|
Given /^I have a (.*) theme that contains "(.*)"$/ do |layout, text|
File.open(File.join('_theme', layout + '.html'), 'w') do |f|
f.write(text) f.write(text)
end end
end end
@ -46,34 +45,33 @@ Given /^I have an? (.*) directory$/ do |dir|
FileUtils.mkdir_p(dir) FileUtils.mkdir_p(dir)
end end
Given /^I have the following (draft|post)s?(?: (.*) "(.*)")?:$/ do |status, direction, folder, table| Given /^I have the following (draft|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table|
table.hashes.each do |post| table.hashes.each do |post|
title = post['title'].downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-') title = slug(post['title'])
if direction && direction == "in"
before = folder || '.'
elsif direction && direction == "under"
after = folder || '.'
end
ext = post['type'] || 'textile' ext = post['type'] || 'textile'
before, after = location(folder, direction)
if "draft" == status if "draft" == status
path = File.join(before || '.', '_drafts', after || '.', "#{title}.#{ext}") folder_post = '_drafts'
else filename = "#{title}.#{ext}"
date = Date.strptime(post['date'], '%m/%d/%Y').strftime('%Y-%m-%d') elsif "post" == status
path = File.join(before || '.', '_posts', after || '.', "#{date}-#{title}.#{ext}") parsed_date = Time.xmlschema(post['date']) rescue Time.parse(post['date'])
folder_post = '_posts'
filename = "#{parsed_date.strftime('%Y-%m-%d')}-#{title}.#{ext}"
end end
path = File.join(before, folder_post, after, filename)
matter_hash = {} matter_hash = {}
%w(title layout tag tags category categories published author).each do |key| %w(title layout tag tags category categories published author path date).each do |key|
matter_hash[key] = post[key] if post[key] matter_hash[key] = post[key] if post[key]
end end
matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp
content = post['content'] content = if post['input'] && post['filter']
if post['input'] && post['filter'] "{{ #{post['input']} | #{post['filter']} }}"
content = "{{ #{post['input']} | #{post['filter']} }}" else
post['content']
end end
File.open(path, 'w') do |f| File.open(path, 'w') do |f|
@ -119,6 +117,10 @@ When /^I run jekyll with drafts$/ do
run_jekyll(:drafts => true) run_jekyll(:drafts => true)
end end
When /^I call jekyll new with test_blank --blank$/ do
call_jekyll_new(:path => "test_blank", :blank => true)
end
When /^I debug jekyll$/ do When /^I debug jekyll$/ do
run_jekyll(:debug => true) run_jekyll(:debug => true)
end end
@ -129,12 +131,24 @@ When /^I change "(.*)" to contain "(.*)"$/ do |file, text|
end end
end end
When /^I delete the file "(.*)"$/ do |file|
File.delete(file)
end
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
Then /^I should see "(.*)" in "(.*)"$/ do |text, file| Then /^I should see "(.*)" in "(.*)"$/ do |text, file|
assert_match Regexp.new(text), File.open(file).readlines.join assert Regexp.new(text).match(File.open(file).readlines.join)
end
Then /^I should not see "(.*)" in "(.*)"$/ do |text, file|
assert_no_match Regexp.new(text), File.read(file)
end
Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file|
assert Regexp.new(Regexp.escape(text)).match(File.open(file).readlines.join)
end end
Then /^the "(.*)" file should exist$/ do |file| Then /^the "(.*)" file should exist$/ do |file|

View File

@ -1,13 +1,10 @@
require 'fileutils' require 'fileutils'
require 'rr' require 'rr'
require 'test/unit' require 'test/unit'
require 'time'
World do
include Test::Unit::Assertions
end
TEST_DIR = File.join('/', 'tmp', 'jekyll') TEST_DIR = File.join('/', 'tmp', 'jekyll')
JEKYLL_PATH = File.join(ENV['PWD'], 'bin', 'jekyll') JEKYLL_PATH = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'jekyll')
def run_jekyll(opts = {}) def run_jekyll(opts = {})
command = JEKYLL_PATH.clone command = JEKYLL_PATH.clone
@ -17,5 +14,26 @@ def run_jekyll(opts = {})
system command system command
end end
def call_jekyll_new(opts = {})
command = JEKYLL_PATH.clone
command << " new"
command << " #{opts[:path]}" if opts[:path]
command << " --blank" if opts[:blank]
command << " >> /dev/null 2>&1" if opts[:debug].nil?
system command
end
def slug(title)
title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-')
end
def location(folder, direction)
if folder
before = folder if direction == "in"
after = folder if direction == "under"
end
[before || '.', after || '.']
end
# work around "invalid option: --format" cucumber bug (see #296) # work around "invalid option: --format" cucumber bug (see #296)
Test::Unit.run = true if RUBY_VERSION < '1.9' Test::Unit.run = true if RUBY_VERSION < '1.9'

View File

@ -4,9 +4,9 @@ Gem::Specification.new do |s|
s.rubygems_version = '1.3.5' s.rubygems_version = '1.3.5'
s.name = 'jekyll' s.name = 'jekyll'
s.version = '1.0.0.beta4' s.version = '1.0.3'
s.license = 'MIT' s.license = 'MIT'
s.date = '2013-04-09' s.date = '2013-06-07'
s.rubyforge_project = 'jekyll' s.rubyforge_project = 'jekyll'
s.summary = "A simple, blog aware, static site generator." s.summary = "A simple, blog aware, static site generator."
@ -21,37 +21,39 @@ Gem::Specification.new do |s|
s.executables = ["jekyll"] s.executables = ["jekyll"]
s.rdoc_options = ["--charset=UTF-8"] s.rdoc_options = ["--charset=UTF-8"]
s.extra_rdoc_files = %w[README.textile LICENSE] s.extra_rdoc_files = %w[README.markdown LICENSE]
s.add_runtime_dependency('liquid', "~> 2.3") s.add_runtime_dependency('liquid', "~> 2.3")
s.add_runtime_dependency('classifier', "~> 1.3") s.add_runtime_dependency('classifier', "~> 1.3")
s.add_runtime_dependency('directory_watcher', "~> 1.4.1") s.add_runtime_dependency('directory_watcher', "~> 1.4.1")
s.add_runtime_dependency('maruku', "~> 0.5") s.add_runtime_dependency('maruku', "~> 0.5")
s.add_runtime_dependency('kramdown', "~> 0.14") s.add_runtime_dependency('kramdown', "~> 1.0.2")
s.add_runtime_dependency('pygments.rb', "~> 0.4.2") s.add_runtime_dependency('pygments.rb', "~> 0.5.0")
s.add_runtime_dependency('commander', "~> 4.1.3") s.add_runtime_dependency('commander', "~> 4.1.3")
s.add_runtime_dependency('safe_yaml', "~> 0.7.0") s.add_runtime_dependency('safe_yaml', "~> 0.7.0")
s.add_runtime_dependency('colorator', "~> 0.1")
s.add_runtime_dependency('redcarpet', "~> 2.2.2")
s.add_development_dependency('rake', "~> 10.0.3") s.add_development_dependency('rake', "~> 10.0.3")
s.add_development_dependency('rdoc', "~> 3.11") s.add_development_dependency('rdoc', "~> 3.11")
s.add_development_dependency('redgreen', "~> 1.2") s.add_development_dependency('redgreen', "~> 1.2")
s.add_development_dependency('shoulda', "~> 3.3.2") s.add_development_dependency('shoulda', "~> 3.3.2")
s.add_development_dependency('rr', "~> 1.0") s.add_development_dependency('rr', "~> 1.0.0")
s.add_development_dependency('cucumber', "~> 1.2.1", '!= 1.2.4') s.add_development_dependency('cucumber', "~> 1.2.1", '!= 1.2.4')
s.add_development_dependency('RedCloth', "~> 4.2") s.add_development_dependency('RedCloth', "~> 4.2")
s.add_development_dependency('rdiscount', "~> 1.6") s.add_development_dependency('rdiscount', "~> 1.6")
s.add_development_dependency('redcarpet', "~> 2.2.2")
s.add_development_dependency('launchy', "~> 2.1.2") s.add_development_dependency('launchy', "~> 2.1.2")
s.add_development_dependency('simplecov', "~> 0.7") s.add_development_dependency('simplecov', "~> 0.7")
s.add_development_dependency('simplecov-gem-adapter', "~> 1.0.1") s.add_development_dependency('simplecov-gem-adapter', "~> 1.0.1")
s.add_development_dependency('activesupport', '~> 3.2.13')
# = MANIFEST = # = MANIFEST =
s.files = %w[ s.files = %w[
CONTRIBUTING.md CONTRIBUTING.markdown
Gemfile Gemfile
History.txt History.markdown
LICENSE LICENSE
README.textile README.markdown
Rakefile Rakefile
bin/jekyll bin/jekyll
cucumber.yml cucumber.yml
@ -70,14 +72,21 @@ Gem::Specification.new do |s|
lib/jekyll.rb lib/jekyll.rb
lib/jekyll/command.rb lib/jekyll/command.rb
lib/jekyll/commands/build.rb lib/jekyll/commands/build.rb
lib/jekyll/commands/doctor.rb
lib/jekyll/commands/new.rb lib/jekyll/commands/new.rb
lib/jekyll/commands/serve.rb lib/jekyll/commands/serve.rb
lib/jekyll/configuration.rb
lib/jekyll/converter.rb lib/jekyll/converter.rb
lib/jekyll/converters/identity.rb lib/jekyll/converters/identity.rb
lib/jekyll/converters/markdown.rb lib/jekyll/converters/markdown.rb
lib/jekyll/converters/markdown/kramdown_parser.rb
lib/jekyll/converters/markdown/maruku_parser.rb
lib/jekyll/converters/markdown/rdiscount_parser.rb
lib/jekyll/converters/markdown/redcarpet_parser.rb
lib/jekyll/converters/textile.rb lib/jekyll/converters/textile.rb
lib/jekyll/convertible.rb lib/jekyll/convertible.rb
lib/jekyll/core_ext.rb lib/jekyll/core_ext.rb
lib/jekyll/deprecator.rb
lib/jekyll/draft.rb lib/jekyll/draft.rb
lib/jekyll/errors.rb lib/jekyll/errors.rb
lib/jekyll/filters.rb lib/jekyll/filters.rb
@ -88,20 +97,21 @@ Gem::Specification.new do |s|
lib/jekyll/page.rb lib/jekyll/page.rb
lib/jekyll/plugin.rb lib/jekyll/plugin.rb
lib/jekyll/post.rb lib/jekyll/post.rb
lib/jekyll/related_posts.rb
lib/jekyll/site.rb lib/jekyll/site.rb
lib/jekyll/static_file.rb lib/jekyll/static_file.rb
lib/jekyll/stevenson.rb
lib/jekyll/tags/gist.rb lib/jekyll/tags/gist.rb
lib/jekyll/tags/highlight.rb lib/jekyll/tags/highlight.rb
lib/jekyll/tags/include.rb lib/jekyll/tags/include.rb
lib/jekyll/tags/post_url.rb lib/jekyll/tags/post_url.rb
lib/site_template/.gitignore
lib/site_template/_config.yml lib/site_template/_config.yml
lib/site_template/_layouts/default.html lib/site_template/_layouts/default.html
lib/site_template/_layouts/post.html lib/site_template/_layouts/post.html
lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
lib/site_template/css/screen.css lib/site_template/css/main.css
lib/site_template/css/syntax.css lib/site_template/css/syntax.css
lib/site_template/images/.gitkeep
lib/site_template/images/rss.png
lib/site_template/index.html lib/site_template/index.html
script/bootstrap script/bootstrap
site/.gitignore site/.gitignore
@ -110,39 +120,42 @@ Gem::Specification.new do |s|
site/_config.yml site/_config.yml
site/_includes/analytics.html site/_includes/analytics.html
site/_includes/docs_contents.html site/_includes/docs_contents.html
site/_includes/docs_contents_mobile.html
site/_includes/footer.html site/_includes/footer.html
site/_includes/header.html site/_includes/header.html
site/_includes/primary-nav-items.html
site/_includes/section_nav.html site/_includes/section_nav.html
site/_includes/top.html site/_includes/top.html
site/_layouts/default.html site/_layouts/default.html
site/_layouts/docs.html site/_layouts/docs.html
site/_posts/2012-07-01-configuration.md site/css/gridism.css
site/_posts/2012-07-01-contributing.md
site/_posts/2012-07-01-deployment-methods.md
site/_posts/2012-07-01-extras.md
site/_posts/2012-07-01-frontmatter.md
site/_posts/2012-07-01-github-pages.md
site/_posts/2012-07-01-heroku.md
site/_posts/2012-07-01-home.md
site/_posts/2012-07-01-installation.md
site/_posts/2012-07-01-migrations.md
site/_posts/2012-07-01-pages.md
site/_posts/2012-07-01-pagination.md
site/_posts/2012-07-01-permalinks.md
site/_posts/2012-07-01-plugins.md
site/_posts/2012-07-01-posts.md
site/_posts/2012-07-01-resources.md
site/_posts/2012-07-01-sites.md
site/_posts/2012-07-01-structure.md
site/_posts/2012-07-01-templates.md
site/_posts/2012-07-01-troubleshooting.md
site/_posts/2012-07-01-usage.md
site/_posts/2012-07-01-variables.md
site/css/grid.css
site/css/normalize.css site/css/normalize.css
site/css/pygments.css site/css/pygments.css
site/css/style.css site/css/style.css
site/docs/index.html site/docs/configuration.md
site/docs/contributing.md
site/docs/deployment-methods.md
site/docs/extras.md
site/docs/frontmatter.md
site/docs/github-pages.md
site/docs/heroku.md
site/docs/history.md
site/docs/index.md
site/docs/installation.md
site/docs/migrations.md
site/docs/pages.md
site/docs/pagination.md
site/docs/permalinks.md
site/docs/plugins.md
site/docs/posts.md
site/docs/resources.md
site/docs/sites.md
site/docs/structure.md
site/docs/templates.md
site/docs/troubleshooting.md
site/docs/upgrading.md
site/docs/usage.md
site/docs/variables.md
site/favicon.png site/favicon.png
site/img/article-footer.png site/img/article-footer.png
site/img/footer-arrow.png site/img/footer-arrow.png
@ -193,6 +206,9 @@ Gem::Specification.new do |s|
test/source/_posts/2013-01-12-nil-layout.textile test/source/_posts/2013-01-12-nil-layout.textile
test/source/_posts/2013-01-12-no-layout.textile test/source/_posts/2013-01-12-no-layout.textile
test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep
test/source/_posts/2013-04-11-custom-excerpt.markdown
test/source/_posts/2013-05-10-number-category.textile
test/source/_posts/es/2008-11-21-nested.textile
test/source/about.html test/source/about.html
test/source/category/_posts/2008-9-23-categories.textile test/source/category/_posts/2008-9-23-categories.textile
test/source/contacts.html test/source/contacts.html
@ -222,6 +238,7 @@ Gem::Specification.new do |s|
test/test_rdiscount.rb test/test_rdiscount.rb
test/test_redcarpet.rb test/test_redcarpet.rb
test/test_redcloth.rb test/test_redcloth.rb
test/test_related_posts.rb
test/test_site.rb test/test_site.rb
test/test_tags.rb test/test_tags.rb
] ]

View File

@ -24,10 +24,13 @@ require 'English'
# 3rd party # 3rd party
require 'liquid' require 'liquid'
require 'maruku' require 'maruku'
require 'pygments' require 'colorator'
# internal requires # internal requires
require 'jekyll/core_ext' require 'jekyll/core_ext'
require 'jekyll/stevenson'
require 'jekyll/deprecator'
require 'jekyll/configuration'
require 'jekyll/site' require 'jekyll/site'
require 'jekyll/convertible' require 'jekyll/convertible'
require 'jekyll/url' require 'jekyll/url'
@ -38,6 +41,7 @@ require 'jekyll/draft'
require 'jekyll/filters' require 'jekyll/filters'
require 'jekyll/static_file' require 'jekyll/static_file'
require 'jekyll/errors' require 'jekyll/errors'
require 'jekyll/related_posts'
# extensions # extensions
require 'jekyll/plugin' require 'jekyll/plugin'
@ -47,123 +51,45 @@ require 'jekyll/command'
require_all 'jekyll/commands' require_all 'jekyll/commands'
require_all 'jekyll/converters' require_all 'jekyll/converters'
require_all 'jekyll/converters/markdown'
require_all 'jekyll/generators' require_all 'jekyll/generators'
require_all 'jekyll/tags' require_all 'jekyll/tags'
SafeYAML::OPTIONS[:suppress_warnings] = true SafeYAML::OPTIONS[:suppress_warnings] = true
module Jekyll module Jekyll
VERSION = '1.0.0.beta4' VERSION = '1.0.3'
# Default options. Overriden by values in _config.yml.
# Strings rather than symbols are used for compatability with YAML.
DEFAULTS = {
'source' => Dir.pwd,
'destination' => File.join(Dir.pwd, '_site'),
'plugins' => '_plugins',
'layouts' => '_layouts',
'keep_files' => ['.git','.svn'],
'future' => true, # remove and make true just default
'pygments' => true, # remove and make true just default
'markdown' => 'maruku',
'permalink' => 'date',
'baseurl' => '/',
'include' => ['.htaccess'],
'paginate_path' => 'page:num',
'markdown_ext' => 'markdown,mkd,mkdn,md',
'textile_ext' => 'textile',
'port' => '4000',
'host' => '0.0.0.0',
'excerpt_separator' => "\n\n",
'maruku' => {
'use_tex' => false,
'use_divs' => false,
'png_engine' => 'blahtex',
'png_dir' => 'images/latex',
'png_url' => '/images/latex'
},
'rdiscount' => {
'extensions' => []
},
'redcarpet' => {
'extensions' => []
},
'kramdown' => {
'auto_ids' => true,
'footnote_nr' => 1,
'entity_output' => 'as_char',
'toc_levels' => '1..6',
'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo',
'use_coderay' => false,
'coderay' => {
'coderay_wrap' => 'div',
'coderay_line_numbers' => 'inline',
'coderay_line_number_start' => 1,
'coderay_tab_width' => 4,
'coderay_bold_every' => 10,
'coderay_css' => 'style'
}
},
'redcloth' => {
'hard_breaks' => true
}
}
# Public: Generate a Jekyll configuration Hash by merging the default # Public: Generate a Jekyll configuration Hash by merging the default
# options with anything in _config.yml, and adding the given options on top. # options with anything in _config.yml, and adding the given options on top.
# #
# override - A Hash of config directives that override any options in both # override - A Hash of config directives that override any options in both
# the defaults and the config file. See Jekyll::DEFAULTS for a # the defaults and the config file. See Jekyll::Configuration::DEFAULTS for a
# list of option names and their defaults. # list of option names and their defaults.
# #
# Returns the final configuration Hash. # Returns the final configuration Hash.
def self.configuration(override) def self.configuration(override)
# Convert any symbol keys to strings and remove the old key/values config = Configuration[Configuration::DEFAULTS]
override = override.reduce({}) { |hsh,(k,v)| hsh.merge(k.to_s => v) } override = Configuration[override].stringify_keys
config = config.read_config_files(config.config_files(override))
# _config.yml may override default source location, but until
# then, we need to know where to look for _config.yml
source = override['source'] || Jekyll::DEFAULTS['source']
# Get configuration from <source>/_config.yml or <source>/<config_file>
config_file = override.delete('config')
config_file = File.join(source, "_config.yml") if config_file.to_s.empty?
begin
config = YAML.safe_load_file(config_file)
raise "Configuration file: (INVALID) #{config_file}" if !config.is_a?(Hash)
$stdout.puts "Configuration file: #{config_file}"
rescue SystemCallError
# Errno:ENOENT = file not found
$stderr.puts "Configuration file: none"
config = {}
rescue => err
$stderr.puts " " +
"WARNING: Error reading configuration. " +
"Using defaults (and options)."
$stderr.puts "#{err}"
config = {}
end
# Provide backwards-compatibility
if config['auto']
$stderr.puts "Deprecation: ".rjust(20) + "'auto' has been changed to " +
"'watch'. Please update your configuration to use 'watch'."
config['watch'] = config['auto']
end
# Merge DEFAULTS < _config.yml < override # Merge DEFAULTS < _config.yml < override
Jekyll::DEFAULTS.deep_merge(config).deep_merge(override) config = config.deep_merge(override).stringify_keys
set_timezone(config['timezone']) if config['timezone']
config
end
# Static: Set the TZ environment variable to use the timezone specified
#
# timezone - the IANA Time Zone
#
# Returns nothing
def self.set_timezone(timezone)
ENV['TZ'] = timezone
end
def self.logger
@logger ||= Stevenson.new
end end
end end

View File

@ -8,5 +8,20 @@ module Jekyll
dirs += ['*'] dirs += ['*']
end end
end end
# Static: Run Site#process and catch errors
#
# site - the Jekyll::Site object
#
# Returns nothing
def self.process_site(site)
site.process
rescue Jekyll::FatalException => e
puts
Jekyll.logger.error "ERROR:", "YOUR SITE COULD NOT BE BUILT:"
Jekyll.logger.error "", "------------------------------------"
Jekyll.logger.error "", e.message
exit(1)
end
end end
end end

View File

@ -17,18 +17,10 @@ module Jekyll
def self.build(site, options) def self.build(site, options)
source = options['source'] source = options['source']
destination = options['destination'] destination = options['destination']
puts " Source: #{source}" Jekyll.logger.info "Source:", source
puts " Destination: #{destination}" Jekyll.logger.info "Destination:", destination
print " Generating... " print Jekyll.logger.formatted_topic "Generating..."
begin self.process_site(site)
site.process
rescue Jekyll::FatalException => e
puts
puts "ERROR: YOUR SITE COULD NOT BE BUILT:"
puts "------------------------------------"
puts e.message
exit(1)
end
puts "done." puts "done."
end end
@ -44,23 +36,15 @@ module Jekyll
source = options['source'] source = options['source']
destination = options['destination'] destination = options['destination']
puts " Auto-regeneration: enabled" Jekyll.logger.info "Auto-regeneration:", "enabled"
dw = DirectoryWatcher.new(source, :glob => self.globs(source, destination), :pre_load => true) dw = DirectoryWatcher.new(source, :glob => self.globs(source, destination), :pre_load => true)
dw.interval = 1 dw.interval = 1
dw.add_observer do |*args| dw.add_observer do |*args|
t = Time.now.strftime("%Y-%m-%d %H:%M:%S") t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
print " Regenerating: #{args.size} files at #{t} " print Jekyll.logger.formatted_topic("Regenerating:") + "#{args.size} files at #{t} "
begin self.process_site(site)
site.process
rescue Jekyll::FatalException => e
puts
puts "ERROR: YOUR SITE COULD NOT BE BUILT:"
puts "------------------------------------"
puts e.message
exit(1)
end
puts "...done." puts "...done."
end end

View File

@ -0,0 +1,29 @@
module Jekyll
module Commands
class Doctor < Command
class << self
def process(options)
site = Jekyll::Site.new(options)
site.read
unless deprecated_relative_permalinks(site)
Jekyll.logger.info "Your test results", "are in. Everything looks fine."
end
end
def deprecated_relative_permalinks(site)
contains_deprecated_pages = false
site.pages.each do |page|
if page.uses_relative_permalinks
Jekyll.logger.warn "Deprecation:", "'#{page.path}' uses relative" +
" permalinks which will be deprecated in" +
" Jekyll v1.1 and beyond."
contains_deprecated_pages = true
end
end
contains_deprecated_pages
end
end
end
end
end

View File

@ -3,20 +3,36 @@ require 'erb'
module Jekyll module Jekyll
module Commands module Commands
class New < Command class New < Command
def self.process(args) def self.process(args, options = {})
raise ArgumentError.new('You must specify a path.') if args.empty? raise ArgumentError.new('You must specify a path.') if args.empty?
new_blog_path = File.expand_path(args.join(" "), Dir.pwd) new_blog_path = File.expand_path(args.join(" "), Dir.pwd)
FileUtils.mkdir_p new_blog_path FileUtils.mkdir_p new_blog_path
if preserve_source_location?(new_blog_path, options)
create_sample_files new_blog_path Jekyll.logger.error "Conflict:", "#{new_blog_path} exists and is not empty."
exit(1)
File.open(File.expand_path(self.initialized_post_name, new_blog_path), "w") do |f|
f.write(self.scaffold_post_content(site_template))
end end
if options[:blank]
create_blank_site new_blog_path
else
create_sample_files new_blog_path
File.open(File.expand_path(self.initialized_post_name, new_blog_path), "w") do |f|
f.write(self.scaffold_post_content(site_template))
end
end
puts "New jekyll site installed in #{new_blog_path}." puts "New jekyll site installed in #{new_blog_path}."
end end
def self.create_blank_site(path)
Dir.chdir(path) do
FileUtils.mkdir(%w(_layouts _posts _drafts))
FileUtils.touch("index.html")
end
end
def self.scaffold_post_content(template_site) def self.scaffold_post_content(template_site)
ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result
end end
@ -29,6 +45,11 @@ module Jekyll
end end
private private
def self.preserve_source_location?(path, options)
!options[:force] && !Dir["#{path}/**/*"].empty?
end
def self.create_sample_files(path) def self.create_sample_files(path)
FileUtils.cp_r site_template + '/.', path FileUtils.cp_r site_template + '/.', path
FileUtils.rm File.expand_path(scaffold_path, path) FileUtils.rm File.expand_path(scaffold_path, path)

201
lib/jekyll/configuration.rb Normal file
View File

@ -0,0 +1,201 @@
# encoding: UTF-8
module Jekyll
class Configuration < Hash
# Default options. Overridden by values in _config.yml.
# Strings rather than symbols are used for compatibility with YAML.
DEFAULTS = {
'source' => Dir.pwd,
'destination' => File.join(Dir.pwd, '_site'),
'plugins' => '_plugins',
'layouts' => '_layouts',
'keep_files' => ['.git','.svn'],
'timezone' => nil, # use the local timezone
'safe' => false,
'show_drafts' => nil,
'limit_posts' => 0,
'lsi' => false,
'future' => true, # remove and make true just default
'pygments' => true,
'relative_permalinks' => true, # backwards-compatibility with < 1.0
# will be set to false once 1.1 hits
'markdown' => 'maruku',
'permalink' => 'date',
'baseurl' => '/',
'include' => ['.htaccess'],
'exclude' => [],
'paginate_path' => '/page:num',
'markdown_ext' => 'markdown,mkd,mkdn,md',
'textile_ext' => 'textile',
'port' => '4000',
'host' => '0.0.0.0',
'excerpt_separator' => "\n\n",
'maruku' => {
'use_tex' => false,
'use_divs' => false,
'png_engine' => 'blahtex',
'png_dir' => 'images/latex',
'png_url' => '/images/latex'
},
'rdiscount' => {
'extensions' => []
},
'redcarpet' => {
'extensions' => []
},
'kramdown' => {
'auto_ids' => true,
'footnote_nr' => 1,
'entity_output' => 'as_char',
'toc_levels' => '1..6',
'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo',
'use_coderay' => false,
'coderay' => {
'coderay_wrap' => 'div',
'coderay_line_numbers' => 'inline',
'coderay_line_number_start' => 1,
'coderay_tab_width' => 4,
'coderay_bold_every' => 10,
'coderay_css' => 'style'
}
},
'redcloth' => {
'hard_breaks' => true
}
}
# Public: Turn all keys into string
#
# Return a copy of the hash where all its keys are strings
def stringify_keys
reduce({}) { |hsh,(k,v)| hsh.merge(k.to_s => v) }
end
# Public: Directory of the Jekyll source folder
#
# override - the command-line options hash
#
# Returns the path to the Jekyll source directory
def source(override)
override['source'] || self['source'] || DEFAULTS['source']
end
# Public: Generate list of configuration files from the override
#
# override - the command-line options hash
#
# Returns an Array of config files
def config_files(override)
# Get configuration from <source>/_config.yml or <source>/<config_file>
config_files = override.delete('config')
config_files = File.join(source(override), "_config.yml") if config_files.to_s.empty?
config_files = [config_files] unless config_files.is_a? Array
config_files
end
# Public: Read configuration and return merged Hash
#
# file - the path to the YAML file to be read in
#
# Returns this configuration, overridden by the values in the file
def read_config_file(file)
next_config = YAML.safe_load_file(file)
raise "Configuration file: (INVALID) #{file}".yellow if !next_config.is_a?(Hash)
Jekyll.logger.info "Configuration file:", file
next_config
end
# Public: Read in a list of configuration files and merge with this hash
#
# files - the list of configuration file paths
#
# Returns the full configuration, with the defaults overridden by the values in the
# configuration files
def read_config_files(files)
configuration = clone
begin
files.each do |config_file|
new_config = read_config_file(config_file)
configuration = configuration.deep_merge(new_config)
end
rescue SystemCallError
# Errno:ENOENT = file not found
Jekyll.logger.warn "Configuration file:", "none"
rescue => err
Jekyll.logger.warn "WARNING:", "Error reading configuration. " +
"Using defaults (and options)."
$stderr.puts "#{err}"
end
configuration.backwards_compatibilize
end
# Public: Split a CSV string into an array containing its values
#
# csv - the string of comma-separated values
#
# Returns an array of the values contained in the CSV
def csv_to_array(csv)
csv.split(",").map(&:strip)
end
# Public: Ensure the proper options are set in the configuration to allow for
# backwards-compatibility with Jekyll pre-1.0
#
# Returns the backwards-compatible configuration
def backwards_compatibilize
config = clone
# Provide backwards-compatibility
if config.has_key?('auto') || config.has_key?('watch')
Jekyll.logger.warn "Deprecation:", "Auto-regeneration can no longer" +
" be set from your configuration file(s). Use the"+
" --watch/-w command-line option instead."
config.delete('auto')
config.delete('watch')
end
if config.has_key? 'server'
Jekyll.logger.warn "Deprecation:", "The 'server' configuration option" +
" is no longer accepted. Use the 'jekyll serve'" +
" subcommand to serve your site with WEBrick."
config.delete('server')
end
if config.has_key? 'server_port'
Jekyll.logger.warn "Deprecation:", "The 'server_port' configuration option" +
" has been renamed to 'port'. Please update your config" +
" file accordingly."
# copy but don't overwrite:
config['port'] = config['server_port'] unless config.has_key?('port')
config.delete('server_port')
end
%w[include exclude].each do |option|
if config.fetch(option, []).is_a?(String)
Jekyll.logger.warn "Deprecation:", "The '#{option}' configuration option" +
" must now be specified as an array, but you specified" +
" a string. For now, we've treated the string you provided" +
" as a list of comma-separated values."
config[option] = csv_to_array(config[option])
end
end
config
end
end
end

View File

@ -8,87 +8,23 @@ module Jekyll
def setup def setup
return if @setup return if @setup
case @config['markdown'] @parser = case @config['markdown']
when 'redcarpet' when 'redcarpet'
begin RedcarpetParser.new @config
require 'redcarpet'
@renderer ||= Class.new(Redcarpet::Render::HTML) do
def block_code(code, lang)
lang = lang && lang.split.first || "text"
output = add_code_tags(
Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),
lang
)
end
def add_code_tags(code, lang)
code = code.sub(/<pre>/,'<pre><code class="' + lang + '">')
code = code.sub(/<\/pre>/,"</code></pre>")
end
end
@redcarpet_extensions = {}
@config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true }
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install redcarpet'
raise FatalException.new("Missing dependency: redcarpet")
end
when 'kramdown' when 'kramdown'
begin KramdownParser.new @config
require 'kramdown'
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install kramdown'
raise FatalException.new("Missing dependency: kramdown")
end
when 'rdiscount' when 'rdiscount'
begin RDiscountParser.new @config
require 'rdiscount'
@rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym }
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install rdiscount'
raise FatalException.new("Missing dependency: rdiscount")
end
when 'maruku' when 'maruku'
begin MarukuParser.new @config
require 'maruku'
if @config['maruku']['use_divs']
require 'maruku/ext/div'
STDERR.puts 'Maruku: Using extended syntax for div elements.'
end
if @config['maruku']['use_tex']
require 'maruku/ext/math'
STDERR.puts "Maruku: Using LaTeX extension. Images in `#{@config['maruku']['png_dir']}`."
# Switch off MathML output
MaRuKu::Globals[:html_math_output_mathml] = false
MaRuKu::Globals[:html_math_engine] = 'none'
# Turn on math to PNG support with blahtex
# Resulting PNGs stored in `images/latex`
MaRuKu::Globals[:html_math_output_png] = true
MaRuKu::Globals[:html_png_engine] = @config['maruku']['png_engine']
MaRuKu::Globals[:html_png_dir] = @config['maruku']['png_dir']
MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url']
end
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install maruku'
raise FatalException.new("Missing dependency: maruku")
end
else else
STDERR.puts "Invalid Markdown processor: #{@config['markdown']}" STDERR.puts "Invalid Markdown processor: #{@config['markdown']}"
STDERR.puts " Valid options are [ maruku | rdiscount | kramdown ]" STDERR.puts " Valid options are [ maruku | rdiscount | kramdown | redcarpet ]"
raise FatalException.new("Invalid Markdown process: #{@config['markdown']}") raise FatalException.new("Invalid Markdown process: #{@config['markdown']}")
end end
@setup = true @setup = true
end end
def matches(ext) def matches(ext)
rgx = '(' + @config['markdown_ext'].gsub(',','|') +')' rgx = '(' + @config['markdown_ext'].gsub(',','|') +')'
ext =~ Regexp.new(rgx, Regexp::IGNORECASE) ext =~ Regexp.new(rgx, Regexp::IGNORECASE)
@ -100,49 +36,7 @@ module Jekyll
def convert(content) def convert(content)
setup setup
case @config['markdown'] @parser.convert(content)
when 'redcarpet'
@redcarpet_extensions[:fenced_code_blocks] = !@redcarpet_extensions[:no_fenced_code_blocks]
@renderer.send :include, Redcarpet::Render::SmartyPants if @redcarpet_extensions[:smart]
markdown = Redcarpet::Markdown.new(@renderer.new(@redcarpet_extensions), @redcarpet_extensions)
markdown.render(content)
when 'kramdown'
# Check for use of coderay
if @config['kramdown']['use_coderay']
Kramdown::Document.new(content, {
:auto_ids => @config['kramdown']['auto_ids'],
:footnote_nr => @config['kramdown']['footnote_nr'],
:entity_output => @config['kramdown']['entity_output'],
:toc_levels => @config['kramdown']['toc_levels'],
:smart_quotes => @config['kramdown']['smart_quotes'],
:coderay_wrap => @config['kramdown']['coderay']['coderay_wrap'],
:coderay_line_numbers => @config['kramdown']['coderay']['coderay_line_numbers'],
:coderay_line_number_start => @config['kramdown']['coderay']['coderay_line_number_start'],
:coderay_tab_width => @config['kramdown']['coderay']['coderay_tab_width'],
:coderay_bold_every => @config['kramdown']['coderay']['coderay_bold_every'],
:coderay_css => @config['kramdown']['coderay']['coderay_css']
}).to_html
else
# not using coderay
Kramdown::Document.new(content, {
:auto_ids => @config['kramdown']['auto_ids'],
:footnote_nr => @config['kramdown']['footnote_nr'],
:entity_output => @config['kramdown']['entity_output'],
:toc_levels => @config['kramdown']['toc_levels'],
:smart_quotes => @config['kramdown']['smart_quotes']
}).to_html
end
when 'rdiscount'
rd = RDiscount.new(content, *@rdiscount_extensions)
html = rd.to_html
if rd.generate_toc and html.include?(@config['rdiscount']['toc_token'])
html.gsub!(@config['rdiscount']['toc_token'], rd.toc_content.force_encoding('utf-8'))
end
html
when 'maruku'
Maruku.new(content).to_html
end
end end
end end
end end

View File

@ -0,0 +1,44 @@
module Jekyll
module Converters
class Markdown
class KramdownParser
def initialize(config)
require 'kramdown'
@config = config
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install kramdown'
raise FatalException.new("Missing dependency: kramdown")
end
def convert(content)
# Check for use of coderay
kramdown_configs = if @config['kramdown']['use_coderay']
base_kramdown_configs.merge({
:coderay_wrap => @config['kramdown']['coderay']['coderay_wrap'],
:coderay_line_numbers => @config['kramdown']['coderay']['coderay_line_numbers'],
:coderay_line_number_start => @config['kramdown']['coderay']['coderay_line_number_start'],
:coderay_tab_width => @config['kramdown']['coderay']['coderay_tab_width'],
:coderay_bold_every => @config['kramdown']['coderay']['coderay_bold_every'],
:coderay_css => @config['kramdown']['coderay']['coderay_css']
})
else
# not using coderay
base_kramdown_configs
end
Kramdown::Document.new(content, kramdown_configs).to_html
end
def base_kramdown_configs
{
:auto_ids => @config['kramdown']['auto_ids'],
:footnote_nr => @config['kramdown']['footnote_nr'],
:entity_output => @config['kramdown']['entity_output'],
:toc_levels => @config['kramdown']['toc_levels'],
:smart_quotes => @config['kramdown']['smart_quotes']
}
end
end
end
end
end

View File

@ -0,0 +1,51 @@
module Jekyll
module Converters
class Markdown
class MarukuParser
def initialize(config)
require 'maruku'
@config = config
@errors = []
load_divs_library if @config['maruku']['use_divs']
load_blahtext_library if @config['maruku']['use_tex']
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install maruku'
raise FatalException.new("Missing dependency: maruku")
end
def load_divs_library
require 'maruku/ext/div'
STDERR.puts 'Maruku: Using extended syntax for div elements.'
end
def load_blahtext_library
require 'maruku/ext/math'
STDERR.puts "Maruku: Using LaTeX extension. Images in `#{@config['maruku']['png_dir']}`."
# Switch off MathML output
MaRuKu::Globals[:html_math_output_mathml] = false
MaRuKu::Globals[:html_math_engine] = 'none'
# Turn on math to PNG support with blahtex
# Resulting PNGs stored in `images/latex`
MaRuKu::Globals[:html_math_output_png] = true
MaRuKu::Globals[:html_png_engine] = @config['maruku']['png_engine']
MaRuKu::Globals[:html_png_dir] = @config['maruku']['png_dir']
MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url']
end
def print_errors_and_fail
print @errors.join
raise MaRuKu::Exception, "MaRuKu encountered problem(s) while converting your markup."
end
def convert(content)
converted = Maruku.new(content, :error_stream => @errors).to_html
print_errors_and_fail unless @errors.empty?
converted
end
end
end
end
end

View File

@ -0,0 +1,35 @@
module Jekyll
module Converters
class Markdown
class RDiscountParser
def initialize(config)
require 'rdiscount'
@config = config
@rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym }
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install rdiscount'
raise FatalException.new("Missing dependency: rdiscount")
end
def convert(content)
rd = RDiscount.new(content, *@rdiscount_extensions)
html = rd.to_html
if @config['rdiscount']['toc_token']
html = replace_generated_toc(rd, html, @config['rdiscount']['toc_token'])
end
html
end
private
def replace_generated_toc(rd, html, toc_token)
if rd.generate_toc && html.include?(toc_token)
html.gsub(toc_token, rd.toc_content.force_encoding('utf-8'))
else
html
end
end
end
end
end
end

View File

@ -0,0 +1,70 @@
module Jekyll
module Converters
class Markdown
class RedcarpetParser
module CommonMethods
def add_code_tags(code, lang)
code = code.sub(/<pre>/, "<pre><code class=\"#{lang} language-#{lang}\" data-lang=\"#{lang}\">")
code = code.sub(/<\/pre>/,"</code></pre>")
end
end
module WithPygments
include CommonMethods
def block_code(code, lang)
require 'pygments'
lang = lang && lang.split.first || "text"
output = add_code_tags(
Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),
lang
)
end
end
module WithoutPygments
require 'cgi'
include CommonMethods
def code_wrap(code)
"<div class=\"highlight\"><pre>#{CGI::escapeHTML(code)}</pre></div>"
end
def block_code(code, lang)
lang = lang && lang.split.first || "text"
output = add_code_tags(code_wrap(code), lang)
end
end
def initialize(config)
require 'redcarpet'
@config = config
@redcarpet_extensions = {}
@config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true }
@renderer ||= if @config['pygments']
Class.new(Redcarpet::Render::HTML) do
include WithPygments
end
else
Class.new(Redcarpet::Render::HTML) do
include WithoutPygments
end
end
rescue LoadError
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install redcarpet'
raise FatalException.new("Missing dependency: redcarpet")
end
def convert(content)
@redcarpet_extensions[:fenced_code_blocks] = !@redcarpet_extensions[:no_fenced_code_blocks]
@renderer.send :include, Redcarpet::Render::SmartyPants if @redcarpet_extensions[:smart]
markdown = Redcarpet::Markdown.new(@renderer.new(@redcarpet_extensions), @redcarpet_extensions)
markdown.render(content)
end
end
end
end
end

View File

@ -1,3 +1,5 @@
# encoding: UTF-8
require 'set' require 'set'
# Convertible provides methods for converting a pagelike item # Convertible provides methods for converting a pagelike item
@ -32,10 +34,10 @@ module Jekyll
self.content = $POSTMATCH self.content = $POSTMATCH
self.data = YAML.safe_load($1) self.data = YAML.safe_load($1)
end end
rescue => e
puts "Error reading file #{File.join(base, name)}: #{e.message}"
rescue SyntaxError => e rescue SyntaxError => e
puts "YAML Exception reading #{File.join(base, name)}: #{e.message}" puts "YAML Exception reading #{File.join(base, name)}: #{e.message}"
rescue Exception => e
puts "Error reading file #{File.join(base, name)}: #{e.message}"
end end
self.data ||= {} self.data ||= {}
@ -46,6 +48,10 @@ module Jekyll
# Returns nothing. # Returns nothing.
def transform def transform
self.content = converter.convert(self.content) self.content = converter.convert(self.content)
rescue => e
Jekyll.logger.error "Conversion error:", "There was an error converting" +
" '#{self.path}'."
raise e
end end
# Determine the extension depending on content_type. # Determine the extension depending on content_type.
@ -64,34 +70,28 @@ module Jekyll
@converter ||= self.site.converters.find { |c| c.matches(self.ext) } @converter ||= self.site.converters.find { |c| c.matches(self.ext) }
end end
# Add any necessary layouts to this convertible document. # Render Liquid in the content
# #
# payload - The site payload Hash. # content - the raw Liquid content to render
# layouts - A Hash of {"name" => "layout"}. # payload - the payload for Liquid
# info - the info for Liquid
# #
# Returns nothing. # Returns the converted content
def do_layout(payload, layouts) def render_liquid(content, payload, info)
info = { :filters => [Jekyll::Filters], :registers => { :site => self.site } } Liquid::Template.parse(content).render!(payload, info)
rescue Exception => e
# render and transform content (this becomes the final content of the object) Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{payload[:file]}"
payload["pygments_prefix"] = converter.pygments_prefix raise e
payload["pygments_suffix"] = converter.pygments_suffix end
begin
self.content = Liquid::Template.parse(self.content).render!(payload, info)
rescue => e
puts "Liquid Exception: #{e.message} in #{self.name}"
e.backtrace.each do |backtrace|
puts backtrace
end
abort("Build Failed")
end
self.transform
# output keeps track of what will finally be written
self.output = self.content
# Recursively render layouts
#
# layouts - a list of the layouts
# payload - the payload for Liquid
# info - the info for Liquid
#
# Returns nothing
def render_all_layouts(layouts, payload, info)
# recursively render layouts # recursively render layouts
layout = layouts[self.data["layout"]] layout = layouts[self.data["layout"]]
used = Set.new([layout]) used = Set.new([layout])
@ -99,15 +99,9 @@ module Jekyll
while layout while layout
payload = payload.deep_merge({"content" => self.output, "page" => layout.data}) payload = payload.deep_merge({"content" => self.output, "page" => layout.data})
begin self.output = self.render_liquid(layout.content,
self.output = Liquid::Template.parse(layout.content).render!(payload, info) payload.merge({:file => layout.name}),
rescue => e info)
puts "Liquid Exception: #{e.message} in #{self.data["layout"]}"
e.backtrace.each do |backtrace|
puts backtrace
end
abort("Build Failed")
end
if layout = layouts[layout.data["layout"]] if layout = layouts[layout.data["layout"]]
if used.include?(layout) if used.include?(layout)
@ -118,5 +112,42 @@ module Jekyll
end end
end end
end end
# Add any necessary layouts to this convertible document.
#
# payload - The site payload Hash.
# layouts - A Hash of {"name" => "layout"}.
#
# Returns nothing.
def do_layout(payload, layouts)
info = { :filters => [Jekyll::Filters], :registers => { :site => self.site, :page => payload['page'] } }
# render and transform content (this becomes the final content of the object)
payload["pygments_prefix"] = converter.pygments_prefix
payload["pygments_suffix"] = converter.pygments_suffix
self.content = self.render_liquid(self.content,
payload.merge({:file => self.name}),
info)
self.transform
# output keeps track of what will finally be written
self.output = self.content
self.render_all_layouts(layouts, payload, info)
end
# Write the generated page file to the destination directory.
#
# dest - The String path to the destination dir.
#
# Returns nothing.
def write(dest)
path = destination(dest)
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') do |f|
f.write(self.output)
end
end
end end
end end

32
lib/jekyll/deprecator.rb Normal file
View File

@ -0,0 +1,32 @@
module Jekyll
class Deprecator
def self.process(args)
no_subcommand(args)
deprecation_message args, "--server", "The --server command has been replaced by the \
'serve' subcommand."
deprecation_message args, "--no-server", "To build Jekyll without launching a server, \
use the 'build' subcommand."
deprecation_message args, "--auto", "The switch '--auto' has been replaced with '--watch'."
deprecation_message args, "--no-auto", "To disable auto-replication, simply leave off \
the '--watch' switch."
deprecation_message args, "--pygments", "The 'pygments' setting can only be set in \
your config files."
deprecation_message args, "--paginate", "The 'paginate' setting can only be set in your \
config files."
deprecation_message args, "--url", "The 'url' setting can only be set in your config files."
end
def self.no_subcommand(args)
if args.size > 0 && args.first =~ /^--/ && !%w[--help --version].include?(args.first)
Jekyll.logger.error "Deprecation:", "Jekyll now uses subcommands instead of just \
switches. Run `jekyll help' to find out more."
end
end
def self.deprecation_message(args, deprecated_argument, message)
if args.include?(deprecated_argument)
Jekyll.logger.error "Deprecation:", message
end
end
end
end

View File

@ -30,7 +30,7 @@ module Jekyll
# #
# Returns the formatting String. # Returns the formatting String.
def date_to_string(date) def date_to_string(date)
date.strftime("%d %b %Y") time(date).strftime("%d %b %Y")
end end
# Format a date in long format e.g. "27 January 2011". # Format a date in long format e.g. "27 January 2011".
@ -39,7 +39,7 @@ module Jekyll
# #
# Returns the formatted String. # Returns the formatted String.
def date_to_long_string(date) def date_to_long_string(date)
date.strftime("%d %B %Y") time(date).strftime("%d %B %Y")
end end
# Format a date for use in XML. # Format a date for use in XML.
@ -53,7 +53,7 @@ module Jekyll
# #
# Returns the formatted String. # Returns the formatted String.
def date_to_xmlschema(date) def date_to_xmlschema(date)
date.xmlschema time(date).xmlschema
end end
# Format a date according to RFC-822 # Format a date according to RFC-822
@ -67,7 +67,7 @@ module Jekyll
# #
# Returns the formatted String. # Returns the formatted String.
def date_to_rfc822(date) def date_to_rfc822(date)
date.rfc822 time(date).rfc822
end end
# XML escape a string for use. Replaces any special characters with # XML escape a string for use. Replaces any special characters with
@ -99,7 +99,17 @@ module Jekyll
def cgi_escape(input) def cgi_escape(input)
CGI::escape(input) CGI::escape(input)
end end
# URI escape a string.
#
# input - The String to escape.
#
# Examples
#
# uri_escape('foo, bar \\baz?')
# # => "foo,%20bar%20%5Cbaz?"
#
# Returns the escaped String.
def uri_escape(input) def uri_escape(input)
URI.escape(input) URI.escape(input)
end end
@ -137,5 +147,18 @@ module Jekyll
"#{array[0...-1].join(', ')}, #{connector} #{array[-1]}" "#{array[0...-1].join(', ')}, #{connector} #{array[-1]}"
end end
end end
private
def time(input)
case input
when Time
input
when String
Time.parse(input)
else
Jekyll.logger.error "Invalid Date:", "'#{input}' is not a valid datetime."
exit(1)
end
end
end end
end end

View File

@ -10,8 +10,13 @@ module Jekyll
# #
# Returns nothing. # Returns nothing.
def generate(site) def generate(site)
site.pages.dup.each do |page| if Pager.pagination_enabled?(site)
paginate(site, page) if Pager.pagination_enabled?(site.config, page.name) if template = template_page(site)
paginate(site, template)
else
Jekyll.logger.warn "Pagination:", "Pagination is enabled, but I couldn't find" +
"an index.html page to use as the pagination template. Skipping pagination."
end
end end
end end
@ -33,11 +38,11 @@ module Jekyll
all_posts = site.site_payload['site']['posts'] all_posts = site.site_payload['site']['posts']
pages = Pager.calculate_pages(all_posts, site.config['paginate'].to_i) pages = Pager.calculate_pages(all_posts, site.config['paginate'].to_i)
(1..pages).each do |num_page| (1..pages).each do |num_page|
pager = Pager.new(site.config, num_page, all_posts, pages) pager = Pager.new(site, num_page, all_posts, pages)
if num_page > 1 if num_page > 1
newpage = Page.new(site, site.source, page.dir, page.name) newpage = Page.new(site, site.source, page.dir, page.name)
newpage.pager = pager newpage.pager = pager
newpage.dir = File.join(page.dir, Pager.paginate_path(site.config, num_page)) newpage.dir = Pager.paginate_path(site, num_page)
site.pages << newpage site.pages << newpage
else else
page.pager = pager page.pager = pager
@ -45,6 +50,32 @@ module Jekyll
end end
end end
# Static: Fetch the URL of the template page. Used to determine the
# path to the first pager in the series.
#
# site - the Jekyll::Site object
#
# Returns the url of the template page
def self.first_page_url(site)
if page = Pagination.new.template_page(site)
page.url
else
nil
end
end
# Public: Find the Jekyll::Page which will act as the pager template
#
# site - the Jekyll::Site object
#
# Returns the Jekyll::Page which will act as the pager template
def template_page(site)
site.pages.dup.select do |page|
Pager.pagination_candidate?(site.config, page)
end.sort do |one, two|
two.path.size <=> one.path.size
end.first
end
end end
end end
@ -62,26 +93,78 @@ module Jekyll
(all_posts.size.to_f / per_page.to_i).ceil (all_posts.size.to_f / per_page.to_i).ceil
end end
# Determine if pagination is enabled for a given file. # Determine if pagination is enabled the site.
# #
# config - The configuration Hash. # site - the Jekyll::Site object
# file - The String filename of the file.
# #
# Returns true if pagination is enabled, false otherwise. # Returns true if pagination is enabled, false otherwise.
def self.pagination_enabled?(config, file) def self.pagination_enabled?(site)
file == 'index.html' && !config['paginate'].nil? !site.config['paginate'].nil? &&
site.pages.size > 0
end
# Static: Determine if a page is a possible candidate to be a template page.
# Page's name must be `index.html` and exist in any of the directories
# between the site source and `paginate_path`.
#
# config - the site configuration hash
# page - the Jekyll::Page about which we're inquiring
#
# Returns true if the
def self.pagination_candidate?(config, page)
page_dir = File.dirname(File.expand_path(remove_leading_slash(page.path), config['source']))
paginate_path = remove_leading_slash(config['paginate_path'])
paginate_path = File.expand_path(paginate_path, config['source'])
page.name == 'index.html' &&
in_hierarchy(config['source'], page_dir, File.dirname(paginate_path))
end
# Determine if the subdirectories of the two paths are the same relative to source
#
# source - the site source
# page_dir - the directory of the Jekyll::Page
# paginate_path - the absolute paginate path (from root of FS)
#
# Returns whether the subdirectories are the same relative to source
def self.in_hierarchy(source, page_dir, paginate_path)
return false if paginate_path == File.dirname(paginate_path)
return false if paginate_path == Pathname.new(source).parent
page_dir == paginate_path ||
in_hierarchy(source, page_dir, File.dirname(paginate_path))
end end
# Static: Return the pagination path of the page # Static: Return the pagination path of the page
# #
# site_config - the site config # site - the Jekyll::Site object
# num_page - the pagination page number # num_page - the pagination page number
# #
# Returns the pagination path as a string # Returns the pagination path as a string
def self.paginate_path(site_config, num_page) def self.paginate_path(site, num_page)
return nil if num_page.nil? || num_page <= 1 return nil if num_page.nil?
format = site_config['paginate_path'] return Generators::Pagination.first_page_url(site) if num_page <= 1
format.sub(':num', num_page.to_s) format = site.config['paginate_path']
format = format.sub(':num', num_page.to_s)
ensure_leading_slash(format)
end
# Static: Return a String version of the input which has a leading slash.
# If the input already has a forward slash in position zero, it will be
# returned unchanged.
#
# path - a String path
#
# Returns the path with a leading slash
def self.ensure_leading_slash(path)
path[0..0] == "/" ? path : "/#{path}"
end
# Static: Return a String version of the input without a leading slash.
#
# path - a String path
#
# Returns the input without the leading slash
def self.remove_leading_slash(path)
ensure_leading_slash(path)[1..-1]
end end
# Initialize a new Pager. # Initialize a new Pager.
@ -91,9 +174,9 @@ module Jekyll
# all_posts - The Array of all the site's Posts. # all_posts - The Array of all the site's Posts.
# num_pages - The Integer number of pages or nil if you'd like the number # num_pages - The Integer number of pages or nil if you'd like the number
# of pages calculated. # of pages calculated.
def initialize(config, page, all_posts, num_pages = nil) def initialize(site, page, all_posts, num_pages = nil)
@page = page @page = page
@per_page = config['paginate'].to_i @per_page = site.config['paginate'].to_i
@total_pages = num_pages || Pager.calculate_pages(all_posts, @per_page) @total_pages = num_pages || Pager.calculate_pages(all_posts, @per_page)
if @page > @total_pages if @page > @total_pages
@ -106,9 +189,9 @@ module Jekyll
@total_posts = all_posts.size @total_posts = all_posts.size
@posts = all_posts[init..offset] @posts = all_posts[init..offset]
@previous_page = @page != 1 ? @page - 1 : nil @previous_page = @page != 1 ? @page - 1 : nil
@previous_page_path = Pager.paginate_path(config, @previous_page) @previous_page_path = Pager.paginate_path(site, @previous_page)
@next_page = @page != @total_pages ? @page + 1 : nil @next_page = @page != @total_pages ? @page + 1 : nil
@next_page_path = Pager.paginate_path(config, @next_page) @next_page_path = Pager.paginate_path(site, @next_page)
end end
# Convert this Pager's data to a Hash suitable for use by Liquid. # Convert this Pager's data to a Hash suitable for use by Liquid.

View File

@ -5,6 +5,9 @@ module Jekyll
# Gets the Site object. # Gets the Site object.
attr_reader :site attr_reader :site
# Gets the name of this layout.
attr_reader :name
# Gets/Sets the extension of this layout. # Gets/Sets the extension of this layout.
attr_accessor :ext attr_accessor :ext

View File

@ -35,6 +35,7 @@ application/postscript ps eps ai
application/rdf+xml rdf application/rdf+xml rdf
application/rtf rtf application/rtf rtf
text/vcard vcf vcard text/vcard vcf vcard
application/vnd.apple.pkpass pkpass
application/vnd.ms-excel xls application/vnd.ms-excel xls
application/vnd.ms-powerpoint ppt application/vnd.ms-powerpoint ppt
application/vnd.wap.wmlc wmlc application/vnd.wap.wmlc wmlc

View File

@ -24,18 +24,6 @@ module Jekyll
self.read_yaml(File.join(base, dir), name) self.read_yaml(File.join(base, dir), name)
end end
# Read the YAML frontmatter.
#
# base - The String path to the dir containing the file.
# name - The String filename of the file.
#
# Returns nothing.
def read_yaml(base, name)
super(base, name)
self.data['layout'] = 'page' unless self.data.has_key?('layout')
self.data
end
# The generated directory into which the page will be placed # The generated directory into which the page will be placed
# upon generation. This is derived from the permalink or, if # upon generation. This is derived from the permalink or, if
# permalink is absent, we be '/' # permalink is absent, we be '/'
@ -50,7 +38,12 @@ module Jekyll
# #
# Returns the String permalink or nil if none has been set. # Returns the String permalink or nil if none has been set.
def permalink def permalink
self.data && self.data['permalink'] return nil if self.data.nil? || self.data['permalink'].nil?
if site.config['relative_permalinks']
File.join(@dir, self.data['permalink'])
else
self.data['permalink']
end
end end
# The template of the permalink. # The template of the permalink.
@ -110,7 +103,15 @@ module Jekyll
def to_liquid def to_liquid
self.data.deep_merge({ self.data.deep_merge({
"url" => self.url, "url" => self.url,
"content" => self.content }) "content" => self.content,
"path" => self.data['path'] || path })
end
# The path to the source file
#
# Returns the path to the source file
def path
File.join(@dir, @name).sub(/\A\//, '')
end end
# Obtain destination path. # Obtain destination path.
@ -119,26 +120,11 @@ module Jekyll
# #
# Returns the destination file path String. # Returns the destination file path String.
def destination(dest) def destination(dest)
# The url needs to be unescaped in order to preserve the correct path = File.join(dest, self.url)
# filename.
path = File.join(dest, CGI.unescape(self.url))
path = File.join(path, "index.html") if self.url =~ /\/$/ path = File.join(path, "index.html") if self.url =~ /\/$/
path path
end end
# Write the generated page file to the destination directory.
#
# dest - The String path to the destination dir.
#
# Returns nothing.
def write(dest)
path = destination(dest)
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') do |f|
f.write(self.output)
end
end
# Returns the object as a debug String. # Returns the object as a debug String.
def inspect def inspect
"#<Jekyll:Page @name=#{self.name.inspect}>" "#<Jekyll:Page @name=#{self.name.inspect}>"
@ -153,5 +139,9 @@ module Jekyll
def index? def index?
basename == 'index' basename == 'index'
end end
def uses_relative_permalinks
permalink && @dir != "" && site.config['relative_permalinks']
end
end end
end end

View File

@ -11,6 +11,21 @@ module Jekyll
# Valid post name regex. # Valid post name regex.
MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/ MATCHER = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/
# Attributes for Liquid templates
ATTRIBUTES_FOR_LIQUID = %w[
title
url
date
id
categories
next
previous
tags
content
excerpt
path
]
# Post name validator. Post filenames must be like: # Post name validator. Post filenames must be like:
# 2008-11-05-my-awesome-post.textile # 2008-11-05-my-awesome-post.textile
# #
@ -20,7 +35,7 @@ module Jekyll
end end
attr_accessor :site attr_accessor :site
attr_accessor :data, :excerpt, :content, :output, :ext attr_accessor :data, :extracted_excerpt, :content, :output, :ext
attr_accessor :date, :slug, :published, :tags, :categories attr_accessor :date, :slug, :published, :tags, :categories
attr_reader :name attr_reader :name
@ -34,40 +49,43 @@ module Jekyll
# Returns the new Post. # Returns the new Post.
def initialize(site, source, dir, name) def initialize(site, source, dir, name)
@site = site @site = site
@dir = dir
@base = self.containing_dir(source, dir) @base = self.containing_dir(source, dir)
@name = name @name = name
self.categories = dir.downcase.split('/').reject { |x| x.empty? } self.categories = dir.downcase.split('/').reject { |x| x.empty? }
self.process(name) self.process(name)
begin self.read_yaml(@base, name)
self.read_yaml(@base, name)
rescue Exception => msg
raise FatalException.new("#{msg} in #{@base}/#{name}")
end
# If we've added a date and time to the YAML, use that instead of the
# filename date. Means we'll sort correctly.
if self.data.has_key?('date') if self.data.has_key?('date')
# ensure Time via to_s and reparse
self.date = Time.parse(self.data["date"].to_s) self.date = Time.parse(self.data["date"].to_s)
end end
self.published = self.published?
self.populate_categories
self.populate_tags
end
def published?
if self.data.has_key?('published') && self.data['published'] == false if self.data.has_key?('published') && self.data['published'] == false
self.published = false false
else else
self.published = true true
end end
end
self.tags = self.data.pluralized_array("tag", "tags") def populate_categories
if self.categories.empty? if self.categories.empty?
self.categories = self.data.pluralized_array('category', 'categories').map {|c| c.downcase} self.categories = self.data.pluralized_array('category', 'categories').map {|c| c.to_s.downcase}
end end
self.tags.flatten!
self.categories.flatten! self.categories.flatten!
end end
def populate_tags
self.tags = self.data.pluralized_array("tag", "tags").flatten
end
# Get the full path to the directory containing the post files # Get the full path to the directory containing the post files
def containing_dir(source, dir) def containing_dir(source, dir)
return File.join(source, dir, '_posts') return File.join(source, dir, '_posts')
@ -81,8 +99,36 @@ module Jekyll
# Returns nothing. # Returns nothing.
def read_yaml(base, name) def read_yaml(base, name)
super(base, name) super(base, name)
self.excerpt = self.extract_excerpt self.extracted_excerpt = self.extract_excerpt
self.data['layout'] = 'post' unless self.data.has_key?('layout') end
# The post excerpt. This is either a custom excerpt
# set in YAML front matter or the result of extract_excerpt.
#
# Returns excerpt string.
def excerpt
if self.data.has_key? 'excerpt'
self.data['excerpt']
else
self.extracted_excerpt
end
end
# Public: the Post title, from the YAML Front-Matter or from the slug
#
# Returns the post title
def title
self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' ')
end
# Public: the path to the post relative to the site source,
# from the YAML Front-Matter or from a combination of
# the directory it's in, "_posts", and the name of the
# post file
#
# Returns the path to the file relative to the site source
def path
self.data['path'] || File.join(@dir, '_posts', @name).sub(/\A\//, '')
end end
# Compares Post objects. First compares the Post date. If the dates are # Compares Post objects. First compares the Post date. If the dates are
@ -118,7 +164,7 @@ module Jekyll
# Returns nothing. # Returns nothing.
def transform def transform
super super
self.excerpt = converter.convert(self.excerpt) self.extracted_excerpt = converter.convert(self.extracted_excerpt)
end end
# The generated directory into which the post will be placed # The generated directory into which the post will be placed
@ -182,25 +228,7 @@ module Jekyll
# #
# Returns an Array of related Posts. # Returns an Array of related Posts.
def related_posts(posts) def related_posts(posts)
return [] unless posts.size > 1 Jekyll::RelatedPosts.new(self).build
if self.site.lsi
self.class.lsi ||= begin
puts "Starting the classifier..."
lsi = Classifier::LSI.new(:auto_rebuild => false)
$stdout.print(" Populating LSI... ");$stdout.flush
posts.each { |x| $stdout.print(".");$stdout.flush;lsi.add_item(x) }
$stdout.print("\n Rebuilding LSI index... ")
lsi.build_index
puts ""
lsi
end
related = self.class.lsi.find_related(self.content, 11)
related - [self]
else
(posts - [self])[0..9]
end
end end
# Add any necessary layouts to this post. # Add any necessary layouts to this post.
@ -218,7 +246,7 @@ module Jekyll
do_layout(payload, layouts) do_layout(payload, layouts)
end end
# Obtain destination path. # Obtain destination path.
# #
# dest - The String path to the destination dir. # dest - The String path to the destination dir.
@ -231,34 +259,14 @@ module Jekyll
path path
end end
# Write the generated post file to the destination directory.
#
# dest - The String path to the destination dir.
#
# Returns nothing.
def write(dest)
path = destination(dest)
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') do |f|
f.write(self.output)
end
end
# Convert this post into a Hash for use in Liquid templates. # Convert this post into a Hash for use in Liquid templates.
# #
# Returns the representative Hash. # Returns the representative Hash.
def to_liquid def to_liquid
self.data.deep_merge({ further_data = Hash[ATTRIBUTES_FOR_LIQUID.map { |attribute|
"title" => self.data["title"] || self.slug.split('-').select {|w| w.capitalize! || w }.join(' '), [attribute, send(attribute)]
"url" => self.url, }]
"date" => self.date, data.deep_merge(further_data)
"id" => self.id,
"categories" => self.categories,
"next" => self.next,
"previous" => self.previous,
"tags" => self.tags,
"content" => self.content,
"excerpt" => self.excerpt })
end end
# Returns the shorthand String identifier of this Post. # Returns the shorthand String identifier of this Post.

View File

@ -0,0 +1,59 @@
module Jekyll
class RelatedPosts
class << self
attr_accessor :lsi
end
attr_reader :post, :site
def initialize(post)
@post = post
@site = post.site
require 'classifier' if site.lsi
end
def build
return [] unless self.site.posts.size > 1
if self.site.lsi
build_index
lsi_related_posts
else
most_recent_posts
end
end
def build_index
self.class.lsi ||= begin
lsi = Classifier::LSI.new(:auto_rebuild => false)
display("Populating LSI...")
self.site.posts.each do |x|
lsi.add_item(x)
end
display("Rebuilding index...")
lsi.build_index
display("")
lsi
end
end
def lsi_related_posts
self.class.lsi.find_related(post.content, 11) - [self.post]
end
def most_recent_posts
recent_posts = self.site.posts.reverse - [self.post]
recent_posts.first(10)
end
def display(output)
$stdout.print("\n")
$stdout.print(Jekyll.logger.formatted_topic(output))
$stdout.flush
end
end
end

View File

@ -23,12 +23,12 @@ module Jekyll
self.pygments = config['pygments'] self.pygments = config['pygments']
self.baseurl = config['baseurl'] self.baseurl = config['baseurl']
self.permalink_style = config['permalink'].to_sym self.permalink_style = config['permalink'].to_sym
self.exclude = config['exclude'] || [] self.exclude = config['exclude']
self.include = config['include'] || [] self.include = config['include']
self.future = config['future'] self.future = config['future']
self.show_drafts = config['show_drafts'] || nil self.show_drafts = config['show_drafts']
self.limit_posts = config['limit_posts'] || nil self.limit_posts = config['limit_posts']
self.keep_files = config['keep_files'] || [] self.keep_files = config['keep_files']
self.reset self.reset
self.setup self.setup
@ -62,8 +62,8 @@ module Jekyll
self.categories = Hash.new { |hash, key| hash[key] = [] } self.categories = Hash.new { |hash, key| hash[key] = [] }
self.tags = Hash.new { |hash, key| hash[key] = [] } self.tags = Hash.new { |hash, key| hash[key] = [] }
if !self.limit_posts.nil? && self.limit_posts < 1 if self.limit_posts < 0
raise ArgumentError, "Limit posts must be nil or >= 1" raise ArgumentError, "limit_posts must be a non-negative number"
end end
end end
@ -71,8 +71,6 @@ module Jekyll
# #
# Returns nothing. # Returns nothing.
def setup def setup
require 'classifier' if self.lsi
# Check that the destination dir isn't the source dir or a directory # Check that the destination dir isn't the source dir or a directory
# parent to the source dir. # parent to the source dir.
if self.source =~ /^#{self.dest}/ if self.source =~ /^#{self.dest}/
@ -97,7 +95,7 @@ module Jekyll
# #
# Returns an Array of plugin search paths # Returns an Array of plugin search paths
def plugins_path def plugins_path
if (config['plugins'] == Jekyll::DEFAULTS['plugins']) if (config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
[File.join(self.source, config['plugins'])] [File.join(self.source, config['plugins'])]
else else
Array(config['plugins']).map { |d| File.expand_path(d) } Array(config['plugins']).map { |d| File.expand_path(d) }
@ -148,7 +146,7 @@ module Jekyll
self.posts.sort! self.posts.sort!
# limit the posts if :limit_posts option is set # limit the posts if :limit_posts option is set
if limit_posts if limit_posts > 0
limit = self.posts.length < limit_posts ? self.posts.length : limit_posts limit = self.posts.length < limit_posts ? self.posts.length : limit_posts
self.posts = self.posts[-limit, limit] self.posts = self.posts[-limit, limit]
end end
@ -231,6 +229,7 @@ module Jekyll
end end
self.pages.each do |page| self.pages.each do |page|
relative_permalinks_deprecation_method if page.uses_relative_permalinks
page.render(self.layouts, payload) page.render(self.layouts, payload)
end end
@ -271,7 +270,11 @@ module Jekyll
files.each { |file| dirs << File.dirname(file) } files.each { |file| dirs << File.dirname(file) }
files.merge(dirs) files.merge(dirs)
obsolete_files = dest_files - files # files that are replaced by dirs should be deleted
files_to_delete = Set.new
dirs.each { |dir| files_to_delete << dir if File.file?(dir) }
obsolete_files = dest_files - files + files_to_delete
FileUtils.rm_rf(obsolete_files.to_a) FileUtils.rm_rf(obsolete_files.to_a)
end end
@ -418,5 +421,18 @@ module Jekyll
post.categories.each { |c| self.categories[c] << post } post.categories.each { |c| self.categories[c] << post }
post.tags.each { |c| self.tags[c] << post } post.tags.each { |c| self.tags[c] << post }
end end
def relative_permalinks_deprecation_method
if config['relative_permalinks'] && !@deprecated_relative_permalinks
$stderr.puts # Places newline after "Generating..."
Jekyll.logger.warn "Deprecation:", "Starting in 1.1, permalinks for pages" +
" in subfolders must be relative to the" +
" site source directory, not the parent" +
" directory. Check http://jekyllrb.com/docs/upgrading/"+
" for more info."
$stderr.print Jekyll.logger.formatted_topic("") + "..." # for "done."
@deprecated_relative_permalinks = true
end
end
end end
end end

68
lib/jekyll/stevenson.rb Normal file
View File

@ -0,0 +1,68 @@
module Jekyll
class Stevenson
attr_accessor :log_level
DEBUG = 0
INFO = 1
WARN = 2
ERROR = 3
# Public: Create a new instance of Stevenson, Jekyll's logger
#
# level - (optional, integer) the log level
#
# Returns nothing
def initialize(level = INFO)
@log_level = level
end
# Public: Print a jekyll message to stdout
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
#
# Returns nothing
def info(topic, message)
$stdout.puts(message(topic, message)) if log_level <= INFO
end
# Public: Print a jekyll message to stderr
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
#
# Returns nothing
def warn(topic, message)
$stderr.puts(message(topic, message).yellow) if log_level <= WARN
end
# Public: Print a jekyll error message to stderr
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
#
# Returns nothing
def error(topic, message)
$stderr.puts(message(topic, message).red) if log_level <= ERROR
end
# Public: Build a Jekyll topic method
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
# message - the message detail
#
# Returns the formatted message
def message(topic, message)
formatted_topic(topic) + message.gsub(/\s+/, ' ')
end
# Public: Format the topic
#
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
#
# Returns the formatted topic statement
def formatted_topic(topic)
"#{topic} ".rjust(20)
end
end
end

View File

@ -6,9 +6,10 @@
module Jekyll module Jekyll
class GistTag < Liquid::Tag class GistTag < Liquid::Tag
def render(context) def render(context)
if tag_contents = @markup.strip.match(/\A(\d+) ?(\S*)\Z/) if tag_contents = determine_arguments(@markup.strip)
gist_id, filename = tag_contents[1].strip, tag_contents[2].strip gist_id, filename = tag_contents[0], tag_contents[1]
gist_script_tag(gist_id, filename) gist_script_tag(gist_id, filename)
else else
"Error parsing gist id" "Error parsing gist id"
@ -17,7 +18,16 @@ module Jekyll
private private
def gist_script_tag(gist_id, filename=nil) def determine_arguments(input)
matched = if input.include?("/")
input.match(/\A([a-zA-Z0-9\/\-_]+) ?(\S*)\Z/)
else
input.match(/\A(\d+) ?(\S*)\Z/)
end
[matched[1].strip, matched[2].strip] if matched && matched.length >= 3
end
def gist_script_tag(gist_id, filename = nil)
if filename.empty? if filename.empty?
"<script src=\"https://gist.github.com/#{gist_id}.js\"> </script>" "<script src=\"https://gist.github.com/#{gist_id}.js\"> </script>"
else else

View File

@ -49,6 +49,8 @@ eos
end end
def render_pygments(context, code) def render_pygments(context, code)
require 'pygments'
@options[:encoding] = 'utf-8' @options[:encoding] = 'utf-8'
output = add_code_tags( output = add_code_tags(

View File

@ -1,9 +1,51 @@
module Jekyll module Jekyll
module Tags module Tags
class IncludeTag < Liquid::Tag class IncludeTag < Liquid::Tag
def initialize(tag_name, file, tokens)
MATCHER = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/
def initialize(tag_name, markup, tokens)
super super
@file = file.strip @file, @params = markup.strip.split(' ', 2);
end
def parse_params(context)
validate_syntax
params = {}
markup = @params
while match = MATCHER.match(markup) do
markup = markup[match.end(0)..-1]
value = if match[2]
match[2].gsub(/\\"/, '"')
elsif match[3]
match[3].gsub(/\\'/, "'")
elsif match[4]
context[match[4]]
end
params[match[1]] = value
end
params
end
# ensure the entire markup string from start to end is valid syntax, and params are separated by spaces
def validate_syntax
full_matcher = Regexp.compile('\A\s*(?:' + MATCHER.to_s + '(?=\s|\z)\s*)*\z')
unless @params =~ full_matcher
raise SyntaxError.new <<-eos
Invalid syntax for include tag:
#{@params}
Valid syntax:
{% include file.ext param='value' param2="value" %}
eos
end
end end
def render(context) def render(context)
@ -22,7 +64,9 @@ module Jekyll
if choices.include?(@file) if choices.include?(@file)
source = File.read(@file) source = File.read(@file)
partial = Liquid::Template.parse(source) partial = Liquid::Template.parse(source)
context.stack do context.stack do
context['include'] = parse_params(context) if @params
partial.render(context) partial.render(context)
end end
else else

View File

@ -6,10 +6,32 @@ module Jekyll
attr_accessor :date, :slug attr_accessor :date, :slug
def initialize(name) def initialize(name)
who, cares, date, slug = *name.match(MATCHER) all, path, date, slug = *name.sub(/^\//, "").match(MATCHER)
@slug = slug @slug = path ? path + slug : slug
@date = Time.parse(date) @date = Time.parse(date)
end end
def ==(other)
slug == post_slug(other) &&
date.year == other.date.year &&
date.month == other.date.month &&
date.day == other.date.day
end
private
# Construct the directory-aware post slug for a Jekyll::Post
#
# other - the Jekyll::Post
#
# Returns the post slug with the subdirectory (relative to _posts)
def post_slug(other)
path = other.name.split("/")[0...-1].join("/")
if path.nil? || path == ""
other.slug
else
path + '/' + other.slug
end
end
end end
class PostUrl < Liquid::Tag class PostUrl < Liquid::Tag
@ -23,11 +45,7 @@ module Jekyll
site = context.registers[:site] site = context.registers[:site]
site.posts.each do |p| site.posts.each do |p|
if p.slug == @post.slug \ if @post == p
and p.date.year == @post.date.year \
and p.date.month == @post.date.month \
and p.date.day == @post.date.day
return p.url return p.url
end end
end end

View File

@ -47,6 +47,9 @@ module Jekyll
# 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 =~ /\/$/ url += "/" if in_url =~ /\/$/
# Always add a leading slash
url.gsub!(/\A([^\/])/, '/\1')
url url
end end
end end

1
lib/site_template/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
_site

View File

@ -1,2 +1,3 @@
markdown: rdiscount name: Your New Jekyll Site
markdown: redcarpet
pygments: true pygments: true

View File

@ -1,38 +1,46 @@
<!DOCTYPE html> <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us"> <html>
<head> <head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta charset="utf-8">
<title>{{ page.title }}</title> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- syntax highlighting CSS --> <title>{{ page.title }}</title>
<link rel="stylesheet" href="/css/syntax.css" type="text/css" /> <meta name="viewport" content="width=device-width">
<!-- Homepage CSS -->
<link rel="stylesheet" href="/css/screen.css" type="text/css" media="screen, projection" /> <!-- syntax highlighting CSS -->
</head> <link rel="stylesheet" href="/css/syntax.css">
<body>
<div class="site"> <!-- Custom CSS -->
<div class="title"> <link rel="stylesheet" href="/css/main.css">
<a href="/">Your Name</a>
<a class="extra" href="/">home</a> </head>
</div> <body>
{{ content }} <div class="container">
<div class="site">
<div class="footer"> <div class="header">
<div class="contact"> <h1 class="title"><a href="/">{{ site.name }}</a></h1>
<p> <a class="extra" href="/">home</a>
Your Name<br /> </div>
What You Are<br />
your@email.com {{ content }}
</p>
</div> <div class="footer">
<div class="contact"> <div class="contact">
<p> <p>
<a href="http://github.com/yourusername/">github.com/yourusername</a><br /> Your Name<br />
<a href="http://twitter.com/yourusername/">twitter.com/yourusername</a><br /> What You Are<br />
</p> your@email.com
</div> </p>
</div> </div>
</div> <div class="contact">
<a href="http://github.com/yourusername"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub" /></a> <p>
</body> <a href="http://github.com/yourusername/">github.com/yourusername</a><br />
<a href="http://twitter.com/yourusername/">twitter.com/yourusername</a><br />
</p>
</div>
</div>
</div>
</div> <!-- /container -->
</body>
</html> </html>

View File

@ -1,6 +1,9 @@
--- ---
layout: default layout: default
--- ---
<div id="post"> <h2>{{ page.title }}</h2>
<p class="meta">{{ page.date | date_to_string }}</p>
<div class="post">
{{ content }} {{ content }}
</div> </div>

165
lib/site_template/css/main.css Executable file
View File

@ -0,0 +1,165 @@
/*****************************************************************************/
/*
/* Common
/*
/*****************************************************************************/
/* Global Reset */
* {
margin: 0;
padding: 0;
}
html, body { height: 100%; }
body {
background-color: #FFF;
font: 13.34px Helvetica, Arial, sans-serif;
font-size: small;
text-align: center;
}
h1, h2, h3, h4, h5, h6 {
font-size: 100%; }
h1 { margin-bottom: 1em; }
p { margin: 1em 0; }
a { color: #00a; }
a:hover { color: #000; }
a:visited { color: #a0a; }
table {
font-size: inherit;
font: 100%;
}
/*****************************************************************************/
/*
/* Home
/*
/*****************************************************************************/
ul.posts {
list-style-type: none;
margin-bottom: 2em;
}
ul.posts li {
line-height: 1.75em;
}
ul.posts span {
color: #aaa;
font-family: Monaco, "Courier New", monospace;
font-size: 80%;
}
/*****************************************************************************/
/*
/* Site
/*
/*****************************************************************************/
.site {
font-size: 115%;
text-align: justify;
width: 42em;
margin: 3em auto 2em;
line-height: 1.5em;
}
.site .header a {
font-weight: bold;
text-decoration: none;
}
.site .header h1.title {
display: inline-block;
margin-bottom: 2em;
}
.site .header h1.title a {
color: #a00;
}
.site .header h1.title a:hover {
color: #000;
}
.site .header a.extra {
color: #aaa;
margin-left: 1em;
}
.site .header a.extra:hover {
color: #000;
}
.site .meta {
color: #aaa;
}
.site .footer {
font-size: 80%;
color: #666;
border-top: 4px solid #eee;
margin-top: 2em;
overflow: hidden;
}
.site .footer .contact {
float: left;
margin-right: 3em;
}
.site .footer .contact a {
color: #8085C1;
}
.site .footer .rss {
margin-top: 1.1em;
margin-right: -.2em;
float: right;
}
.site .footer .rss img {
border: 0;
}
/*****************************************************************************/
/*
/* Posts
/*
/*****************************************************************************/
/* standard */
.post pre {
border: 1px solid #ddd;
background-color: #eef;
padding: 0 .4em;
}
.post ul, .post ol {
margin-left: 1.35em;
}
.post code {
border: 1px solid #ddd;
background-color: #eef;
padding: 0 .2em;
}
.post pre code {
border: none;
}
/* terminal */
.post pre.terminal {
border: 1px solid #000;
background-color: #333;
color: #FFF;
}
.post pre.terminal code {
background-color: #333;
}

View File

@ -1,189 +0,0 @@
/*****************************************************************************/
/*
/* Common
/*
/*****************************************************************************/
/* Global Reset */
* {
margin: 0;
padding: 0;
}
html, body {
height: 100%;
}
body {
background-color: white;
font: 13.34px helvetica, arial, clean, sans-serif;
*font-size: small;
text-align: center;
}
h1, h2, h3, h4, h5, h6 {
font-size: 100%;
}
h1 {
margin-bottom: 1em;
}
p {
margin: 1em 0;
}
a {
color: #00a;
}
a:hover {
color: black;
}
a:visited {
color: #a0a;
}
table {
font-size: inherit;
font: 100%;
}
/*****************************************************************************/
/*
/* Home
/*
/*****************************************************************************/
ul.posts {
list-style-type: none;
margin-bottom: 2em;
}
ul.posts li {
line-height: 1.75em;
}
ul.posts span {
color: #aaa;
font-family: Monaco, "Courier New", monospace;
font-size: 80%;
}
/*****************************************************************************/
/*
/* Site
/*
/*****************************************************************************/
.site {
font-size: 110%;
text-align: justify;
width: 42em;
margin: 3em auto 2em auto;
line-height: 1.5em;
}
.title {
color: #a00;
font-weight: bold;
margin-bottom: 2em;
}
.site .title a {
color: #a00;
text-decoration: none;
}
.site .title a:hover {
color: black;
}
.site .title a.extra {
color: #aaa;
text-decoration: none;
margin-left: 1em;
}
.site .title a.extra:hover {
color: black;
}
.site .meta {
color: #aaa;
}
.site .footer {
font-size: 80%;
color: #666;
border-top: 4px solid #eee;
margin-top: 2em;
overflow: hidden;
}
.site .footer .contact {
float: left;
margin-right: 3em;
}
.site .footer .contact a {
color: #8085C1;
}
.site .footer .rss {
margin-top: 1.1em;
margin-right: -.2em;
float: right;
}
.site .footer .rss img {
border: 0;
}
/*****************************************************************************/
/*
/* Posts
/*
/*****************************************************************************/
#post {
}
/* standard */
#post pre {
border: 1px solid #ddd;
background-color: #eef;
padding: 0 .4em;
}
#post ul,
#post ol {
margin-left: 1.35em;
}
#post code {
border: 1px solid #ddd;
background-color: #eef;
font-size: 85%;
padding: 0 .2em;
}
#post pre code {
border: none;
}
/* terminal */
#post pre.terminal {
border: 1px solid black;
background-color: #333;
color: white;
}
#post pre.terminal code {
background-color: #333;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -1,5 +1,4 @@
auto: false
server: true
permalink: /docs/:categories/:title
pygments: true pygments: true
relative_permalinks: false
gauges_id: 503c5af6613f5d0f19000027 gauges_id: 503c5af6613f5d0f19000027
permalink: /news/:year/:month/:day/:title

View File

@ -1,10 +1,13 @@
<div class="grid2"> <div class="unit one-fifth hide-on-mobiles">
<aside> <aside>
<h4>Getting Started</h4> <h4>Getting Started</h4>
<ul> <ul>
<li class="{% if page.title == "Welcome" %}current{% endif %}"> <li class="{% if page.title == "Welcome" %}current{% endif %}">
<a href="{{ site.url }}/docs/home">Welcome</a> <a href="{{ site.url }}/docs/home">Welcome</a>
</li> </li>
<li class="{% if page.title == "Quick-start guide" %}current{% endif %}">
<a href="{{ site.url }}/docs/quickstart">Quick-start guide</a>
</li>
<li class="{% if page.title == "Installation" %}current{% endif %}"> <li class="{% if page.title == "Installation" %}current{% endif %}">
<a href="{{ site.url }}/docs/installation">Installation</a> <a href="{{ site.url }}/docs/installation">Installation</a>
</li> </li>
@ -26,6 +29,9 @@
<li class="{% if page.title == "Writing posts" %}current{% endif %}"> <li class="{% if page.title == "Writing posts" %}current{% endif %}">
<a href="{{ site.url }}/docs/posts">Writing posts</a> <a href="{{ site.url }}/docs/posts">Writing posts</a>
</li> </li>
<li class="{% if page.title == "Working with drafts" %}current{% endif %}">
<a href="{{ site.url }}/docs/drafts">Working with drafts</a>
</li>
<li class="{% if page.title == "Creating pages" %}current{% endif %}"> <li class="{% if page.title == "Creating pages" %}current{% endif %}">
<a href="{{ site.url }}/docs/pages">Creating pages</a> <a href="{{ site.url }}/docs/pages">Creating pages</a>
</li> </li>
@ -65,9 +71,6 @@
</ul> </ul>
<h4>Miscellaneous</h4> <h4>Miscellaneous</h4>
<ul> <ul>
<li class="{% if page.title == "Contributing" %}current{% endif %}">
<a href="{{ site.url }}/docs/contributing">Contributing</a>
</li>
<li class="{% if page.title == "Troubleshooting" %}current{% endif %}"> <li class="{% if page.title == "Troubleshooting" %}current{% endif %}">
<a href="{{ site.url }}/docs/troubleshooting">Troubleshooting</a> <a href="{{ site.url }}/docs/troubleshooting">Troubleshooting</a>
</li> </li>
@ -77,6 +80,18 @@
<li class="{% if page.title == "Resources" %}current{% endif %}"> <li class="{% if page.title == "Resources" %}current{% endif %}">
<a href="{{ site.url }}/docs/resources">Resources</a> <a href="{{ site.url }}/docs/resources">Resources</a>
</li> </li>
<li class="{% if page.title == "Upgrading" %}current{% endif %}">
<a href="{{ site.url }}/docs/upgrading">Upgrading</a>
</li>
</ul>
<h4>Meta</h4>
<ul>
<li class="{% if page.title == "Contributing" %}current{% endif %}">
<a href="{{ site.url }}/docs/contributing">Contributing</a>
</li>
<li class="{% if page.title == "History" %}current{% endif %}">
<a href="{{ site.url }}/docs/history">History</a>
</li>
</ul> </ul>
</aside> </aside>
</div> </div>

View File

@ -0,0 +1,42 @@
<div class="docs-nav-mobile unit whole show-on-mobiles">
<select onchange="if (this.value) window.location.href=this.value">
<option value="">Navigate the docs…</option>
<optgroup label="Getting started">
<option value="{{ site.url }}/docs/home">Welcome</option>
<option value="{{ site.url }}/docs/quickstart">Quick-start guide</option>
<option value="{{ site.url }}/docs/installation">Installation</option>
<option value="{{ site.url }}/docs/usage">Basic Usage</option>
<option value="{{ site.url }}/docs/structure">Directory structure</option>
<option value="{{ site.url }}/docs/configuration">Configuration</option>
</optgroup>
<optgroup label="Your Content">
<option value="{{ site.url }}/docs/frontmatter">Front-matter</option>
<option value="{{ site.url }}/docs/posts">Writing posts</option>
<option value="{{ site.url }}/docs/drafts">Working with drafts</option>
<option value="{{ site.url }}/docs/pages">Creating pages</option>
<option value="{{ site.url }}/docs/variables">Variables</option>
<option value="{{ site.url }}/docs/migrations">Blog migrations</option>
</optgroup>
<optgroup label="Customization">
<option value="{{ site.url }}/docs/templates">Templates</option>
<option value="{{ site.url }}/docs/permalinks">Permalinks</option>
<option value="{{ site.url }}/docs/pagination">Pagination</option>
<option value="{{ site.url }}/docs/plugins">Plugins</option>
<option value="{{ site.url }}/docs/extras">Extras</option>
</optgroup>
<optgroup label="Deployment">
<option value="{{ site.url }}/docs/github-pages">GitHub Pages</option>
<option value="{{ site.url }}/docs/deployment-methods">Other methods</option>
</optgroup>
<optgroup label="Miscellaneous">
<option value="{{ site.url }}/docs/troubleshooting">Troubleshooting</option>
<option value="{{ site.url }}/docs/sites">Sites using Jekyll</option>
<option value="{{ site.url }}/docs/resources">Resources</option>
<option value="{{ site.url }}/docs/upgrading">Upgrading</option>
</optgroup>
<optgroup label="Meta">
<option value="{{ site.url }}/docs/contributing">Contributing</option>
<option value="{{ site.url }}/docs/history">History</option>
</optgroup>
</select>
</div>

View File

@ -1,15 +1,15 @@
<footer> <footer>
<div class="content"> <div class="grid">
<div class="grid4 first"> <div class="unit one-third center-on-mobiles">
<p>By <a href="http://tom.preston-werner.com">Tom Preston-Werner</a>, <a href="http://quaran.to/">Nick Quaranto</a>, and many more <a href="https://github.com/mojombo/jekyll/graphs/contributors">awesome contributors</a>.</p> <p>By <a href="http://tom.preston-werner.com">Tom Preston-Werner</a>, <a href="http://quaran.to/">Nick Quaranto</a>, and many more <a href="https://github.com/mojombo/jekyll/graphs/contributors">awesome&nbsp;contributors</a>.</p>
</div> </div>
<div class="grid8 align-right"> <div class="unit two-thirds align-right center-on-mobiles">
<p>Proudly hosted by</p> <p>
<a href="https://github.com"> Proudly hosted by
<img src="{{ site.url }}/img/footer-logo.png" alt="GitHub • Social coding"> <a href="https://github.com">
</a> <img src="{{ site.url }}/img/footer-logo.png" alt="GitHub • Social coding">
</a>
</p>
</div> </div>
<div class="clear"></div>
</div> </div>
</footer> </footer>
<div class="clear"></div>

View File

@ -1,6 +1,9 @@
<header> <header>
<div class="content"> <nav class="mobile-nav show-on-mobiles">
<div class="grid3 first"> {% include primary-nav-items.html %}
</nav>
<div class="grid">
<div class="unit one-third center-on-mobiles">
<h1> <h1>
<a href="{{ site.url }}/"> <a href="{{ site.url }}/">
<span>Jekyll</span> <span>Jekyll</span>
@ -8,19 +11,8 @@
</a> </a>
</h1> </h1>
</div> </div>
<nav class="grid6"> <nav class="main-nav unit two-thirds hide-on-mobiles">
<ul> {% include primary-nav-items.html %}
<li {% if page.overview %}class="current"{% endif %}>
<a href="{{ site.url }}/">Overview</a>
</li>
<li {% unless page.overview %}class="current"{% endunless %}>
<a href="{{ site.url }}/docs">Documentation</a>
</li>
<li class="">
<a href="https://github.com/mojombo/jekyll">View on GitHub</a>
</li>
</ul>
</nav> </nav>
<div class="clear"></div>
</div> </div>
</header> </header>

View File

@ -0,0 +1,23 @@
<div class="unit one-fifth hide-on-mobiles">
<aside>
<ul>
<li class="{% if page.title == 'News' %}current{% endif %}">
<a href="/news/">All News</a>
</li>
<li class="{% if page.title == 'Releases' %}current{% endif %}">
<a href="/news/releases/">Jekyll Releases</a>
</li>
</ul>
<h4>Recent Releases</h4>
<ul>
{% for post in site.posts limit:5 %}
<li class="{% if page.title == post.title %}current{% endif %}">
<a href="{{ post.url }}">Version {{ post.version }}</a>
</li>
{% endfor %}
<li>
<a href="/docs/history/">History »</a>
</li>
</ul>
</aside>
</div>

View File

@ -0,0 +1,11 @@
<div class="docs-nav-mobile unit whole show-on-mobiles">
<select onchange="if (this.value) window.location.href=this.value">
<option value="">Navigate the blog…</option>
<option value="/news/">Home</option>
<optgroup label="v1.x">
{% for post in site.posts %}
<option value="{{ post.url }}">{{ post.title }}</option>
{% endfor %}
</optgroup>
</select>
</div>

View File

@ -0,0 +1,24 @@
<article>
<h2>
<a href="{{ post.url }}">
{{ post.title }}
</a>
</h2>
<span class="post-category">
{% for category in post.categories %}
<span class="label">{{ category }}</span>
{% endfor %}
</span>
<div class="post-meta">
<span class="post-date">
{{ post.date | date_to_string }}
</span>
<a href="https://github.com/{{ post.author }}" class="post-author">
<img src="https://github.com/{{ post.author }}.png" class="avatar" />
{{ post.author }}
</a>
</div>
<p class="post-content">
{{ post.content }}
</p>
</article>

View File

@ -0,0 +1,14 @@
<ul>
<li class="{% if page.overview %}current{% endif %}">
<a href="{{ site.url }}/">Overview</a>
</li>
<li class="{% if page.url contains '/docs/' %}current{% endif %}">
<a href="{{ site.url }}/docs/home">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
</li>
<li class="{% if page.author %}current{% endif %}">
<a href="{{ site.url }}/news">News</a>
</li>
<li class="">
<a href="https://github.com/mojombo/jekyll"><span class="hide-on-mobiles">View on </span>GitHub</a>
</li>
</ul>

View File

@ -3,10 +3,12 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>{{ page.title }}</title> <title>{{ page.title }}</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="alternate" type="application/rss+xml" title="Jekyll • Simple, blog-aware, static sites - Feed" href="/feed.xml" />
<link href='http://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic' rel='stylesheet' type='text/css'> <link href='http://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Arizonia' rel='stylesheet' type='text/css'> <link href='http://fonts.googleapis.com/css?family=Arizonia' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="{{ site.url }}/css/normalize.css" /> <link rel="stylesheet" href="{{ site.url }}/css/normalize.css" />
<link rel="stylesheet" href="{{ site.url }}/css/grid.css" /> <link rel="stylesheet" href="{{ site.url }}/css/gridism.css" />
<link rel="stylesheet" href="{{ site.url }}/css/style.css" /> <link rel="stylesheet" href="{{ site.url }}/css/style.css" />
<link rel="stylesheet" href="{{ site.url }}/css/pygments.css" /> <link rel="stylesheet" href="{{ site.url }}/css/pygments.css" />
<link rel="icon" type="image/x-icon" href="{{ site.url }}/favicon.png" /> <link rel="icon" type="image/x-icon" href="{{ site.url }}/favicon.png" />

View File

@ -1,6 +1,6 @@
{% include top.html %} {% include top.html %}
<body> <body class="wrap">
{% include header.html %} {% include header.html %}
{{ content }} {{ content }}

View File

@ -3,9 +3,11 @@ layout: default
--- ---
<section class="docs"> <section class="docs">
<div class="content"> <div class="grid">
<div class="grid10 first"> {% include docs_contents_mobile.html %}
<div class="unit four-fifths">
<article> <article>
<h1>{{ page.title }}</h1> <h1>{{ page.title }}</h1>
{{ content }} {{ content }}

19
site/_layouts/news.html Normal file
View File

@ -0,0 +1,19 @@
---
layout: default
---
<section class="news">
<div class="grid">
{% include news_contents_mobile.html %}
<div class="unit four-fifths">
{{ content }}
</div>
{% include news_contents.html %}
<div class="clear"></div>
</div>
</section>

View File

@ -0,0 +1,27 @@
---
layout: news
---
<article>
<h2>
{{ page.title }}
<a href="{{ page.url }}" class="permalink" title="Permalink"></a>
</h2>
<span class="post-category">
{% for category in page.categories %}
<span class="label">{{ category }}</span>
{% endfor %}
</span>
<div class="post-meta">
<span class="post-date">
{{ page.date | date_to_string }}
</span>
<a href="https://github.com/{{ page.author }}" class="post-author">
<img src="https://github.com/{{ page.author }}.png" class="avatar" />
{{ page.author }}
</a>
</div>
<p class="post-content">
{{ content }}
</p>
</article>

View File

@ -1,115 +0,0 @@
---
layout: docs
title: Extras
prev_section: plugins
next_section: github-pages
---
There are a number of (optional) extra features that Jekyll supports that you
may want to install, depending on how you plan to use Jekyll.
## Pygments
If you want syntax highlighting via the `{% raw %}{% highlight %}{% endraw %}`
tag in your posts, youll need to install [Pygments](http://pygments.org/).
### Installing Pygments on OSX
Mac OS X (Leopard onwards) comes preinstalled with Python, so on just about any
OS X machine you can install Pygments simply by running:
{% highlight bash %}
$ sudo easy_install Pygments
{% endhighlight %}
#### Installing Pygments using Homebrew
Alternatively, you can install Pygments with
[Homebrew](http://mxcl.github.com/homebrew/), an excellent package manager for
OS X:
{% highlight bash %}
$ brew install python
# export PATH="/usr/local/share/python:${PATH}"
$ easy_install pip
$ pip install --upgrade distribute
$ pip install pygments
{% endhighlight %}
<div class="note">
<h5>Homebrew's executable paths</h5>
<p>
Homebrew doesnt symlink the executables for you. For the Homebrew default
Cellar location and Python 2.7, be sure to add `/usr/local/share/python` to
your `PATH`. For more information, check out [the Homebrew
wiki](https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python).
</p>
</div>
#### Installing Pygments using MacPorts
If you use MacPorts, you can install Pygments by running:
{% highlight bash %}
$ sudo port install python25 py25-pygments
{% endhighlight %}
Seriously though, you should check out
[Homebrew](http://mxcl.github.com/homebrew/)—its awesome.
### Installing Pygments on Arch Linux
You can install Pygments using the pacman package manager as follows:
{% highlight bash %}
$ sudo pacman -S python-pygments
{% endhighlight %}
Or to use python2 for Pygments:
{% highlight bash %}
$ sudo pacman -S python2-pygments
{% endhighlight %}
### Installing Pygments on Ubuntu and Debian
{% highlight bash %}
$ sudo apt-get install python-pygments
{% endhighlight %}
### Installing Pygments on RedHat, Fedora, and CentOS
{% highlight bash %}
$ sudo yum install python-pygments
{% endhighlight %}
### Installing Pygments on Gentoo
{% highlight bash %}
$ sudo emerge -av dev-python/pygments
{% endhighlight %}
## LaTeX Support
Maruku comes with optional support for LaTeX to PNG rendering via blahtex
(Version 0.6) which must be in your `$PATH` along with `dvips`. If you need
Maruku to not assume a fixed location for `dvips`, check out [Remis Maruku
fork](http://github.com/remi/maruku).
## RDiscount
If you prefer to use [RDiscount](http://github.com/rtomayko/rdiscount) instead
of [Maruku](http://maruku.rubyforge.org/) for markdown, just make sure you have
it installed:
{% highlight bash %}
$ sudo gem install rdiscount
{% endhighlight %}
And then specify RDiscount as the Markdown engine in your `_config.yml` file to
have Jekyll run with that option.
{% highlight bash %}
# In _config.yml
markdown: rdiscount
{% endhighlight %}

View File

@ -1,204 +0,0 @@
---
layout: docs
title: Blog migrations
prev_section: variables
next_section: templates
---
If youre switching to Jekyll from another blogging system, Jekylls importers
can help you with the move. Most methods listed on this page require read access
to the database to generate posts from your old system. Each method generates
`.markdown` posts in the `_posts` directory based on the entries in the foreign
system.
## Preparing for migrations
Because the importers have many of their own dependencies, they are made
available via a separate gem called `jekyll-import`. To use them, all you need
to do is install the gem, and they will become available as part of Jekyll's
standard command line interface.
{% highlight bash %}
$ gem install jekyll-import
{% endhighlight %}
You should now be all set to run the importers below. If you ever get stuck, you
can see help for each importer:
{% highlight bash %}
$ jekyll help import # => See list of importers
$ jekyll help import IMPORTER # => See importer specific help
{% endhighlight %}
Where IMPORTER is the name of the specific importer.
<div class="note info">
<h5>Note: Always double-check migrated content</h5>
<p>
Importers may not distinguish between published or private posts, so
you should always check that the content Jekyll generates for you appears as
you intended.
</p>
</div>
<!-- TODO all these need to be fixed -->
## WordPress
### Wordpress export files
If hpricot is not already installed, you will need to run `gem install hpricot`.
Next, export your blog using the Wordpress export utility. Assuming that the
exported file is saved as `wordpress.xml`, here is the command you need to run:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/wordpressdotcom";
Jekyll::WordpressDotCom.process("wordpress.xml")'
{% endhighlight %}
<div class="note">
<h5>ProTip™: Wordpress.com Export Tool</h5>
<p>If you are migrating from a Wordpress.com account, you can access the export tool at the following URL: `https://YOUR-USER-NAME.wordpress.com/wp-admin/export.php`.</p>
</div>
### Using Wordpress MySQL server connection
If you want to import using a direct connection to the Wordpress MySQL server, here's how:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/wordpress";
Jekyll::WordPress.process("database", "user", "pass")'
{% endhighlight %}
If you are using Webfaction and have to set up an [SSH tunnel](http://docs.webfaction.com/user-guide/databases.html?highlight=mysql#starting-an-ssh-tunnel-with-ssh), be sure to make the hostname (`127.0.0.1`) explicit, otherwise MySQL may block your access based on `localhost` and `127.0.0.1` not being equivalent in its authentication system:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/wordpress";
Jekyll::WordPress.process("database", "user", "pass", "127.0.0.1")'
{% endhighlight %}
### Further Wordpress migration alternatives
While the above methods work, they do not import much of the metadata that is usually stored in Wordpress posts and pages. If you need to export things like pages, tags, custom fields, image attachments and so on, the following resources might be useful to you:
- [Exitwp](https://github.com/thomasf/exitwp) is a configurable tool written in Python for migrating one or more Wordpress blogs into Jekyll (Markdown) format while keeping as much metadata as possible. Exitwp also downloads attachments and pages.
- [A great article](http://vitobotta.com/how-to-migrate-from-wordpress-to-jekyll/) with a step-by-step guide for migrating a Wordpress blog to Jekyll while keeping most of the structure and metadata.
- [wpXml2Jekyll](https://github.com/theaob/wpXml2Jekyll) is an executable windows application for creating Markdown posts from your Wordpress XML file.
## Drupal
If youre migrating from [Drupal](http://drupal.org), there is [a migrator](https://github.com/mojombo/jekyll/blob/master/lib/jekyll/migrators/drupal.rb) for you too:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/drupal";
Jekyll::Drupal.process("database", "user", "pass")'
{% endhighlight %}
<div class="note warning">
<h5>Warning: Drupal Version Compatibility</h5>
<p>This migrator was written for Drupal 6.1 and may not work as expected on future versions of Drupal. Please update it and send us a pull request if necessary.</p>
</div>
## Movable Type
To import posts from Movable Type:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/mt";
Jekyll::MT.process("database", "user", "pass")'
{% endhighlight %}
## Typo
To import posts from Typo:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/typo";
Jekyll::Typo.process("database", "user", "pass")'
{% endhighlight %}
This code also has only been tested with Typo version 4+.
## TextPattern
To import posts from TextPattern:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/textpattern";
Jekyll::TextPattern.process("database_name", "username", "password", "hostname")'
{% endhighlight %}
You will need to run the above from the parent directory of your `_import` folder. For example, if `_import` is located in `/path/source/_import`, you will need to run this code from `/path/source`. The hostname defaults to `localhost`, all other variables are required. You may need to adjust the code used to filter entries. Left alone, it will attempt to pull all entries that are live or sticky.
## Mephisto
To import posts from Mephisto:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/mephisto";
Jekyll::Mephisto.process("database", "user", "password")'
{% endhighlight %}
If your data is in Postgres, you should do this instead:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/mephisto";
Jekyll::Mephisto.postgres({:database => "database", :username=>"username", :password =>"password"})'
{% endhighlight %}
## Blogger (Blogspot)
To import posts from Blogger, see [this post about migrating from Blogger to Jekyll](http://coolaj86.info/articles/migrate-from-blogger-to-jekyll.html). If that doesnt work for you, you might want to try some of the following alternatives:
- [@kennym](https://github.com/kennym) created a [little migration script](https://gist.github.com/1115810), because the solutions in the previous article didn't work out for him.
- [@ngauthier](https://github.com/ngauthier) created [another importer](https://gist.github.com/1506614) that imports comments, and does so via bloggers archive instead of the RSS feed.
- [@juniorz](https://github.com/juniorz) created [yet another importer](https://gist.github.com/1564581) that works for [Octopress](http://octopress.org). It is like [@ngauthiers version](https://gist.github.com/1506614) but separates drafts from posts, as well as importing tags and permalinks.
## Posterous
To import posts from your primary Posterous blog:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/posterous";
Jekyll::Posterous.process("my_email", "my_pass")'
{% endhighlight %}
For any other Posterous blog on your account, you will need to specify the `blog_id` for the blog:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/posterous";
Jekyll::Posterous.process("my_email", "my_pass", "blog_id")'
{% endhighlight %}
There is also an [alternative Posterous migrator](https://github.com/pepijndevos/jekyll/blob/patch-1/lib/jekyll/migrators/posterous.rb) that maintains permalinks and attempts to import images too.
## Tumblr
To import posts from Tumblr:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/tumblr";
Jekyll::Tumblr.process("http://www.your_blog_url.com", true)'
{% endhighlight %}
There is also [a modified Tumblr migrator](https://github.com/stephenmcd/jekyll/blob/master/lib/jekyll/migrators/tumblr.rb) that exports posts as Markdown and preserves post tags.
The migrator above requires the `json` gem and Python's `html2text` to be installed as follows:
{% highlight bash %}
$ gem install json
$ pip install html2text
{% endhighlight %}
Once installed, simply use the format argument:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/migrators/tumblr";
Jekyll::Tumblr.process("http://www.your_blog_url.com", format="md")'
{% endhighlight %}
## Other Systems
If you have a system that there isnt currently a migrator for, you should consider writing one and sending us a pull request.

View File

@ -0,0 +1,23 @@
---
layout: news_item
title: "Jekyll 1.0.0 Released"
date: "2013-05-06 02:12:52 +0200"
author: parkr
version: 1.0.0
categories: [release]
---
Hey! After many months of hard work by Jekyll's contributors, we're excited
to announce the first major release of the project in a long while. v1.0.0 is
finally here! While the list of improvements and bug fixes is [quite lengthy][history],
here are the highlights (thanks to [@benbalter](http://twitter.com/BenBalter) for the
examples and for compiling this list):
- Support for the Gist tag for easily embedding Gists ([example](https://gist.github.com/benbalter/5555251))
- Automatically generated post excerpts ([example](https://gist.github.com/benbalter/5555369))
- Save and preview drafts before publishing ([example](https://gist.github.com/benbalter/5555992))
Take a look at the [Upgrading][] page in the docs for more detailed information.
[history]: /docs/history/#100__20130506
[Upgrading]: /docs/upgrading/

View File

@ -0,0 +1,27 @@
---
layout: news_item
title: "Jekyll 1.0.1 Released"
date: "2013-05-08 23:46:11 +0200"
author: parkr
version: 1.0.1
categories: [release]
---
Hot on the trails of v1.0, v1.0.1 is out! Here are the highlights:
* Add newer `language-` class name prefix to code blocks ([#1037][])
* Commander error message now preferred over process abort with incorrect args ([#1040][])
* Do not force use of toc_token when using generate_toc in RDiscount ([#1048][])
* Make Redcarpet respect the pygments configuration option ([#1053][])
* Fix the index build with LSI ([#1045][])
* Don't print deprecation warning when no arguments are specified. ([#1041][])
* Add missing `</div>` to site template used by `new` subcommand, fixed typos in code ([#1032][])
See the [History][] page for more information on this release.
{% assign issue_numbers = "1037|1040|1048|1053|1045|1041|1032" | split: "|" %}
{% for issue in issue_numbers %}
[#{{ issue }}]: https://github.com/mojombo/jekyll/issues/{{ issue }}
{% endfor %}
[History]: /docs/history/#101__20130508

View File

@ -0,0 +1,28 @@
---
layout: news_item
title: "Jekyll 1.0.2 Released"
date: "2013-05-12 14:45:00 +0200"
author: parkr
version: 1.0.2
categories: [release]
---
v1.0.2 has some key bugfixes that optionally restore some behaviour from pre-1.0
releases, and fix some other annoying bugs:
* Backwards-compatibilize relative permalinks ([#1081][])
* Add `jekyll doctor` command to check site for any known compatibility problems ([#1081][])
* Deprecate old config `server_port`, match to `port` if `port` isn't set ([#1084][])
* Update pygments.rb and kramdon versions to 0.5.0 and 1.0.2, respectively ([#1061][], [#1067][])
* Fix issue when post categories are numbers ([#1078][])
* Add a `data-lang="<lang>"` attribute to Redcarpet code blocks ([#1066][])
* Catching that Redcarpet gem isn't installed ([#1059][])
See the [History][] page for more information on this release.
{% assign issue_numbers = "1059|1061|1066|1067|1078|1081|1084" | split: "|" %}
{% for issue in issue_numbers %}
[#{{ issue }}]: https://github.com/mojombo/jekyll/issues/{{ issue }}
{% endfor %}
[History]: /docs/history/#102__20130512

View File

@ -0,0 +1,25 @@
---
layout: news_item
title: "Jekyll 1.0.3 Released"
date: "2013-06-07 21:02:13 +0200"
author: parkr
version: 1.0.3
categories: [release]
---
v1.0.3 contains some key enhancements and bug fixes:
- Fail with non-zero exit code when MaRuKu errors ([#1190][]) or Liquid errors ([#1121][])
- Add support for private gists to `gist` tag ([#1189][])
- Add `--force` option to `jekyll new` ([#1115][])
- Fix compatibility with `exclude` and `include` with pre-1.0 Jekyll ([#1114][])
- Fix pagination issue regarding `File.basename` and `page:num` ([#1063][])
See the [History][] page for more information on this release.
{% assign issue_numbers = "1190|1121|1189|1115|1114|1063" | split: "|" %}
{% for issue in issue_numbers %}
[#{{ issue }}]: https://github.com/mojombo/jekyll/issues/{{ issue }}
{% endfor %}
[History]: /docs/history/#103__20130607

View File

@ -1,62 +0,0 @@
.content {
width: 978px;
margin: 0 auto;
}
.grid1, .grid2, .grid3, .grid4, .grid5, .grid6, .grid7, .grid8, .grid9, .grid10, .grid11 {
float: left;
display: inline;
margin-left: 30px;
}
.grid1 {
width: 54px;
}
.grid2 {
width: 138px;
}
.grid3 {
width: 222px;
}
.grid4 {
width: 306px;
}
.grid5 {
width: 390px;
}
.grid6 {
width: 474px;
}
.grid7 {
width: 558px;
}
.grid8 {
width: 642px;
}
.grid9 {
width: 726px;
}
.grid10 {
width: 810px;
}
.grid11 {
width: 894px;
}
.first {
margin-left: 0;
clear: left;
}
/* clearfix */
.clear:after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
}
* html .clear {
zoom: 1;
} /* IE6 */
*:first-child+html .clear {
zoom: 1;
} /* IE7 */

110
site/css/gridism.css Normal file
View File

@ -0,0 +1,110 @@
/*
* Gridism
* A simple, responsive, and handy CSS grid by @cobyism
* https://github.com/cobyism/gridism
*/
/* Preserve some sanity */
.grid,
.unit {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
/* Set up some rules to govern the grid */
.grid {
display: block;
clear: both;
}
.grid .unit {
float: left;
width: 100%;
padding: 10px;
}
/* This ensures the outer gutters are equal to the (doubled) inner gutters. */
.grid .unit:first-child { padding-left: 20px; }
.grid .unit:last-child { padding-right: 20px; }
/* Nested grids already have padding though, so lets nuke it */
.unit .unit:first-child { padding-left: 0; }
.unit .unit:last-child { padding-right: 0; }
.unit .grid:first-child > .unit { padding-top: 0; }
.unit .grid:last-child > .unit { padding-bottom: 0; }
/* Let people nuke the gutters/padding completely in a couple of ways */
.no-gutters .unit,
.unit.no-gutters {
padding: 0 !important;
}
/* Wrapping at a maximum width is optional */
.wrap .grid,
.grid.wrap {
max-width: 978px;
margin: 0 auto;
}
/* Width classes also have shorthand versions numbered as fractions
* For example: for a grid unit 1/3 (one third) of the parent width,
* simply apply class="w-1-3" to the element. */
.grid .whole, .grid .w-1-1 { width: 100%; }
.grid .half, .grid .w-1-2 { width: 50%; }
.grid .one-third, .grid .w-1-3 { width: 33.3332%; }
.grid .two-thirds, .grid .w-2-3 { width: 66.6665%; }
.grid .one-quarter, .grid .w-1-4 { width: 25%; }
.grid .three-quarters, .grid .w-3-4 { width: 75%; }
.grid .one-fifth, .grid .w-1-5 { width: 20%; }
.grid .two-fifths, .grid .w-2-5 { width: 40%; }
.grid .three-fifths, .grid .w-3-5 { width: 60%; }
.grid .four-fifths, .grid .w-4-5 { width: 80%; }
.grid .golden-small, .grid .w-g-s { width: 38.2716%; } /* Golden section: smaller piece */
.grid .golden-large, .grid .w-g-l { width: 61.7283%; } /* Golden section: larger piece */
/* Utility classes */
.align-center { text-align: center; }
.align-left { text-align: left; }
.align-right { text-align: right; }
.pull-left { float: left; }
.pull-right { float: right; }
.show-on-mobiles {
display: none;
}
/* Responsive Stuff */
@media screen and (max-width: 568px) {
/* Stack anything that isnt full-width on smaller screens */
.grid .unit {
width: 100% !important;
padding-left: 20px;
padding-right: 20px;
}
.unit .grid .unit {
padding-left: 0px;
padding-right: 0px;
}
/* Sometimes, you just want to be different on small screens */
.center-on-mobiles {
text-align: center !important;
}
.hide-on-mobiles {
display: none !important;
}
.show-on-mobiles {
display: block !important;
}
a .show-on-mobiles {
display: inline !important;
}
}
/* Expand the wrap a bit further on larger screens */
/*@media screen and (min-width: 1180px) {
.wrap .grid {
max-width: 1180px;
margin: 0 auto;
}
}*/

View File

@ -18,7 +18,7 @@
.highlight .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */ .highlight .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */
.highlight .gh { color: #cd5c5c} /* Generic.Heading */ .highlight .gh { color: #cd5c5c} /* Generic.Heading */
.highlight .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */ .highlight .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */
.highlight .go { color: #add8e6; font-weight: bold; background-color: #4d4d4d } /* Generic.Output */ .highlight span.go { color: #add8e6; font-weight: bold; background-color: #4d4d4d } /* Generic.Output, qualified with span to prevent applying this style to the Go language, see #1153. */
.highlight .gp { color: #ffffff} /* Generic.Prompt */ .highlight .gp { color: #ffffff} /* Generic.Prompt */
.highlight .gs { color: #ffffff} /* Generic.Strong */ .highlight .gs { color: #ffffff} /* Generic.Strong */
.highlight .gu { color: #cd5c5c} /* Generic.Subheading */ .highlight .gu { color: #cd5c5c} /* Generic.Subheading */

View File

@ -1,5 +1,11 @@
/* Base */ /* Base */
* {
box-sizing: border-box;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
}
body { body {
font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 21px; font-size: 21px;
@ -11,6 +17,18 @@ body {
text-shadow: 0 1px 3px rgba(0,0,0,.5); text-shadow: 0 1px 3px rgba(0,0,0,.5);
} }
.clear {
display: block;
}
.clear:after {
content: " ";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
/* Sections */ /* Sections */
body > header, body > section, body > footer { body > header, body > section, body > footer {
@ -19,34 +37,16 @@ body > header, body > section, body > footer {
clear: both; clear: both;
} }
.content {
padding: 20px 0;
}
/* Header */ /* Header */
body > header { body > header h1, body > header nav {
padding: 40px 0 10px; display: inline-block;
}
body > header .content {
padding: 0;
}
body > header h1 img {
margin-left: -30px;
} }
body > header h1 span { body > header h1 span {
display: none; display: none;
} }
/* Navigation */
nav {
margin-top: 52px;
}
nav ul { nav ul {
padding: 0; padding: 0;
margin: 0; margin: 0;
@ -54,10 +54,17 @@ nav ul {
nav li { nav li {
display: inline-block; display: inline-block;
margin-left: 10px;
} }
nav li a { .main-nav {
margin-top: 52px;
}
.main-nav li {
margin-right: 10px;
}
.main-nav li a {
border-radius: 5px; border-radius: 5px;
font-weight: 800; font-weight: 800;
font-size: 14px; font-size: 14px;
@ -69,19 +76,65 @@ nav li a {
-webkit-transition: all .25s; -webkit-transition: all .25s;
} }
nav li a:hover { .main-nav li a:hover {
background: #252525; background: #252525;
box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1); box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
text-shadow: 0 1px 3px rgba(0,0,0,.5); text-shadow: 0 1px 3px rgba(0,0,0,.5);
} }
nav li.current a { .main-nav li.current a {
background: #fc0; background: #fc0;
color: #222; color: #222;
box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5); box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
text-shadow: 0 1px 0 rgba(255,255,255,.3); text-shadow: 0 1px 0 rgba(255,255,255,.3);
} }
.mobile-nav ul {
overflow: hidden;
width: 100%;
display: table;
}
.mobile-nav a {
float: left;
width: 100%;
background: #333;
color: #fc0;
text-align: center;
text-transform: uppercase;
font-size: 14px;
font-weight: 800;
padding: 5px;
border-radius: 5px;
}
.mobile-nav .current a {
background: #fc0;
color: #222;
box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
text-shadow: 0 1px 0 rgba(255,255,255,.3);
}
.mobile-nav li {
display: table-cell;
width: 25%;
padding: 8px;
}
@media (max-width: 768px){
.main-nav ul {
text-align: right;
}
}
@media (max-width: 830px){
.main-nav .show-on-mobiles {
display: inline;
}
.main-nav .hide-on-mobiles {
display: none;
}
}
/* Footer */ /* Footer */
body > footer { body > footer {
@ -96,50 +149,60 @@ body > footer a {
color: #fff; color: #fff;
} }
body > footer .align-right p, body > footer .align-right img { body > footer .align-right p, body > footer img {
display: inline-block; display: inline-block;
} }
body > footer .align-right img { body > footer img {
position: relative; position: relative;
top: 14px; top: 8px;
margin-left: 5px; margin-left: 5px;
width: 100px;
height: 30px;
opacity: .8;
padding: 1px;
-webkit-transition: opacity .2s;
-moz-transition: opacity .2s;
transition: opacity .2s;
} }
/* Utilities */ body > footer a:hover img {
opacity: 1;
.align-left {
text-align: left;
} }
.align-right { @media (max-width: 568px){
text-align: right; footer .one-third p {
margin-bottom: 0;
}
footer .two-thirds p {
margin-top: -20px;
}
} }
.align-center { /* Intro */
text-align: center;
}
/* Sections */ .intro .unit {
.intro .content {
padding: 10px 0 40px; padding: 10px 0 40px;
} }
.intro p { .intro p {
font-size: 3.2em; font-size: 1.75em;
line-height: 1em; line-height: 1em;
margin: 0; margin: 0;
} }
.features .content { @media (min-width: 569px){
padding: 20px 0 40px; .intro p {
font-size: 3.2em;
}
} }
/* Quickstart */
.quickstart { .quickstart {
background: #3F1F1F; background: #3F1F1F;
color: #fff; color: #fff;
margin: 60px 0 80px; margin: 60px 0;
box-shadow: inset 0 3px 10px rgba(0,0,0,.4); box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
} }
@ -147,81 +210,47 @@ body > footer .align-right img {
padding: 0px 0; padding: 0px 0;
} }
.quickstart .code {
margin: -30px 0;
float: right;
}
.quickstart h4 { .quickstart h4 {
margin: 48px 0 0; font-size: 24px;
font-size: 28px; line-height: 24px;
margin-top: 20px;
text-shadow: 0 1px 3px rgba(0,0,0,.8); text-shadow: 0 1px 3px rgba(0,0,0,.8);
} }
.free-hosting .content { .quickstart .code {
/*margin-bottom: 40px;*/ font-size: 12px;
position: relative; display: block;
margin: 0 0 -30px;
} }
.free-hosting .pane { @media (min-width: 768px){
background: #444; .quickstart .code {
border-radius: 10px; font-size: 18px;
padding: 40px 70px 30px; margin: -30px 0;
/*color: #222;*/ float: right;
text-shadow: none; }
} .quickstart h4 {
margin: 50px 0 0;
.free-hosting img { text-align: center;
float: left; }
margin: -20px 40px -40px -20px;
}
.free-hosting h2 {
/*font-weight: 800;*/
}
.free-hosting p,
.free-hosting a {
font-weight: inherit;
}
.free-hosting p {
margin: 0.75em;
}
.free-hosting a {
/*color: #c00;*/
}
.free-hosting .content:after {
content: " ";
float: right;
background: url(../img/footer-arrow.png) top left no-repeat;
width: 73px;
height: 186px;
position: absolute;
right: 30px;
bottom: -60px;
} }
/* Code */ /* Code */
.quickstart .code { .quickstart .code {
display: block; display: block;
background: #3d3d3d; padding: 0;
border-radius: 5px;
font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace; font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
line-height: 1.3em; line-height: 1.3em;
box-shadow: 0 5px 30px rgba(0,0,0,.3);
} }
.quickstart .code .title { .quickstart .code .title {
display: block; display: block;
text-align: center; text-align: center;
margin: 0; margin: 0 20px;
padding: 5px 0; padding: 5px 0;
border-top-left-radius: 5px; border-radius: 5px 5px 0 0;
border-top-right-radius: 5px; box-shadow: 0 3px 10px rgba(0,0,0,.5);
box-shadow: box-shadow: 0 3px 10px rgba(0,0,0,.5);
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 16px; font-size: 16px;
font-weight: normal; font-weight: normal;
@ -242,6 +271,10 @@ body > footer .align-right img {
.quickstart .code .shell { .quickstart .code .shell {
padding: 20px; padding: 20px;
text-shadow: none; text-shadow: none;
margin: 0 20px;
background: #3d3d3d;
border-radius: 0 0 5px 5px;
box-shadow: 0 5px 30px rgba(0,0,0,.3);
} }
.quickstart .code .line { .quickstart .code .line {
@ -270,25 +303,100 @@ body > footer .align-right img {
color: #888; color: #888;
} }
/* Documentation */ /* Free Hosting */
.docs .content { .free-hosting .pane {
padding: 0;
}
.docs article {
background: #444; background: #444;
border-radius: 10px; border-radius: 10px;
padding: 40px 40px 30px; text-shadow: none;
box-shadow: 0 3px 10px rgba(0,0,0,.1); position: relative;
min-height: 800px; padding: 0 20px 30px;
} }
.docs aside { .free-hosting img {
margin: -30px 0 0;
width: 180px;
height: 150px;
}
.free-hosting h2 {
font-size: 28px;
}
.free-hosting p,
.free-hosting a {
font-size: 16px;
}
.free-hosting p {
margin: .75em 0;
}
@media (min-width: 768px){
.free-hosting img {
float: left;
margin: -20px -30px -30px -50px;
width: 300px;
height: 251px;
}
.free-hosting .pane-content {
margin-top: 35px;
padding-right: 30px;
}
.free-hosting p,
.free-hosting a {
font-size: 18px;
}
.free-hosting .pane:after {
content: " ";
float: right;
background: url(../img/footer-arrow.png) top left no-repeat;
width: 73px;
height: 186px;
position: absolute;
right: 0;
bottom: -30px;
}
}
/* Article - Used for both docs and news */
article {
background: #444;
border-radius: 10px;
padding: 20px;
margin: 0 10px;
box-shadow: 0 3px 10px rgba(0,0,0,.1);
font-size: 16px;
}
@media (max-width: 480px){
article ul {
padding-left: 20px;
}
}
@media (max-width: 568px){
article {
margin: 0;
}
}
@media (min-width: 768px){
article {
padding: 40px 40px 30px;
font-size: 21px;
}
}
/* Right-side nav - used by both docs and news */
aside {
padding-top: 30px; padding-top: 30px;
} }
.docs aside h4 { aside h4 {
text-transform: uppercase; text-transform: uppercase;
font-size: 14px; font-size: 14px;
font-weight: 700; font-weight: 700;
@ -298,20 +406,24 @@ body > footer .align-right img {
border-bottom: 1px solid #c00; border-bottom: 1px solid #c00;
} }
.docs aside ul { aside ul {
padding-left: 0; padding-left: 0;
} }
.docs aside li { aside ul:first-child {
margin-top: 0;
}
aside li {
list-style-type: none; list-style-type: none;
} }
.docs aside li a { aside li a {
font-size: 16px; font-size: 16px;
position: relative position: relative
} }
.docs aside li.current a:before { aside li.current a:before {
content: ""; content: "";
border-color: transparent transparent transparent #444; border-color: transparent transparent transparent #444;
border-style: solid; border-style: solid;
@ -323,11 +435,22 @@ body > footer .align-right img {
left: -30px; left: -30px;
} }
/* Documentation */
.docs article {
min-height: 800px;
}
.docs .content {
padding: 0;
}
.section-nav { .section-nav {
text-align: center; text-align: center;
padding-top: 40px; padding-top: 40px;
position: relative; position: relative;
background: url(../img/article-footer.png) top center no-repeat; background: url(../img/article-footer.png) top center no-repeat;
margin: 40px -20px 10px;
} }
.section-nav > div { .section-nav > div {
@ -342,7 +465,6 @@ body > footer .align-right img {
padding: 8px 12px 10px; padding: 8px 12px 10px;
border-radius: 5px; border-radius: 5px;
/*border: 1px solid #333;*/ /*border: 1px solid #333;*/
background: #999;
box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5); box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
background: #777; background: #777;
} }
@ -391,6 +513,99 @@ body > footer .align-right img {
cursor: default; cursor: default;
} }
.docs-nav-mobile select {
width: 100%;
}
/* News */
article h2:first-child {
margin-top: 0;
}
.post-category,
.post-meta {
display: inline-block;
vertical-align: middle;
font-size: .8em;
}
.post-category {
display: inline-block;
margin-left: -30px;
padding: 6px 10px 8px;
padding-left: 50px;
border-radius: 0 5px 5px 0;
position: relative;
box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
background: #9e2812;
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
background: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9e2812), color-stop(100%,#6f0d0d));
background: -webkit-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
background: -o-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
background: -ms-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
background: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
}
.label {
float: left;
text-transform: uppercase;
font-weight: bold;
text-shadow: 0 -1px 0 rgba(0,0,0,.5);
}
@media (max-width: 568px){
.post-category {
padding-left: 30px;
}
}
@media (min-width: 768px){
.post-category {
margin-left: -50px;
}
}
.post-category:before {
content: "";
position: absolute;
top: -10px;
left: 0px;
border-color: transparent #6f0d0d #6f0d0d transparent;
border-style: solid;
border-width: 5px;
width: 0;
height: 0;
}
.avatar {
width: 24px;
height: 24px;
border-radius: 3px;
display: inline-block;
vertical-align: middle;
}
.post-meta {
padding: 5px 0;
color: #aaa;
font-weight: 600;
text-shadow: 0 -1px 0 #000;
}
.post-date,
.post-author {
margin-left: 10px;
}
.news article + article {
margin-top: -10px;
border-radius: 0 0 10px 10px;
border-top: 1px solid #555;
box-shadow: 0 -1px 0 #2f2f2f;
}
/* Code Highlighting */ /* Code Highlighting */
@ -401,12 +616,18 @@ pre, code {
margin: 0; margin: 0;
padding: 0; padding: 0;
font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace; font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
font-size: 16px; font-size: 14px;
padding: 0 .5em; padding: 0 .5em;
line-height: 1.8em; line-height: 1.8em;
} }
.highlight, p > pre, p > code, p > nobr > code, li > code { @media (min-width: 768px){
pre, code {
font-size: 16px;
}
}
.highlight, p > pre, p > code, p > nobr > code, li > code, h5 > code, .note > code {
background: #333; background: #333;
color: #fff; color: #fff;
border-radius: 5px; border-radius: 5px;
@ -415,13 +636,19 @@ pre, code {
0 -1px 0 rgba(0,0,0,.5); 0 -1px 0 rgba(0,0,0,.5);
} }
.note code {
background-color: rgba(0,0,0,0.2);
margin-left: 2.5px;
margin-right: 2.5px;
font-size: 0.8em;
}
.highlight { .highlight {
padding: 10px 0; padding: 10px 0;
width: 100%; width: 100%;
overflow: scroll; overflow: auto;
} }
/* HTML Elements */ /* HTML Elements */
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
@ -586,10 +813,10 @@ code.option, code.flag, code.filter, code.output {
.note { .note {
margin: 30px 0; margin: 30px 0;
margin-left: -50px; margin-left: -30px;
padding: 20px 20px 24px; padding: 20px 20px 24px;
padding-left: 50px; padding-left: 50px;
border-radius: 0px 5px 5px 0px; border-radius: 0 5px 5px 0;
position: relative; position: relative;
box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3); box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
background: #7e6d42; background: #7e6d42;
@ -603,6 +830,18 @@ code.option, code.flag, code.filter, code.output {
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7e6d42', endColorstr='#5c4e35',GradientType=0 ); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7e6d42', endColorstr='#5c4e35',GradientType=0 );
} }
@media (max-width: 568px){
.note {
margin-right: -30px;
}
}
@media (min-width: 768px){
.note {
margin-left: -50px;
}
}
.note:before { .note:before {
content: ""; content: "";
position: absolute; position: absolute;
@ -695,3 +934,13 @@ code.option, code.flag, code.filter, code.output {
font-weight: bold; font-weight: bold;
text-shadow: 0 -1px 0 rgba(0,0,0,.5); text-shadow: 0 -1px 0 rgba(0,0,0,.5);
} }
/* Responsive tables */
@media (max-width: 768px){
.mobile-side-scroller {
overflow-x: scroll;
margin: 0 -40px;
padding: 0 10px;
}
}

View File

@ -3,6 +3,7 @@ layout: docs
title: Configuration title: Configuration
prev_section: structure prev_section: structure
next_section: frontmatter next_section: frontmatter
permalink: /docs/configuration/
--- ---
Jekyll allows you to concoct your sites in any way you can dream up, and its Jekyll allows you to concoct your sites in any way you can dream up, and its
@ -16,9 +17,10 @@ in the terminal.
### Global Configuration ### Global Configuration
The table below lists the available settings for Jekyll, and the various <code The table below lists the available settings for Jekyll, and the various <code
class="option">options</code> (specifed in the configuration file) and <code class="option">options</code> (specified in the configuration file) and <code
class="flag">flags</code> (specified on the command-line) that control them. class="flag">flags</code> (specified on the command-line) that control them.
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -81,11 +83,29 @@ class="flag">flags</code> (specified on the command-line) that control them.
<p><code class="option">include: [DIR, FILE, ...]</code></p> <p><code class="option">include: [DIR, FILE, ...]</code></p>
</td> </td>
</tr> </tr>
<tr class='setting'>
<td>
<p class='name'><strong>Time Zone</strong></p>
<p class="description">
Set the time zone for site generation. This sets the <code>TZ</code>
environment variable, which Ruby uses to handle time and date
creation and manipulation. Any entry from the
<a href="http://en.wikipedia.org/wiki/Tz_database">IANA Time Zone
Database</a> is valid, e.g. <code>America/New_York</code>. The default
is the local time zone, as set by your operating system.
</p>
</td>
<td class='align-center'>
<p><code class="option">timezone: TIMEZONE</code></p>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div>
### Build Command Options ### Build Command Options
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -153,6 +173,7 @@ class="flag">flags</code> (specified on the command-line) that control them.
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
### Serve Command Options ### Serve Command Options
@ -160,6 +181,7 @@ In addition to the options below, the `serve` sub-command can accept any of the
for the `build` sub-command, which are then applied to the site build which occurs right for the `build` sub-command, which are then applied to the site build which occurs right
before your site is served. before your site is served.
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -191,7 +213,7 @@ before your site is served.
<tr class='setting'> <tr class='setting'>
<td> <td>
<p class='name'><strong>Base URL</strong></p> <p class='name'><strong>Base URL</strong></p>
<p class='description'>Serve website with the given base URL</p> <p class='description'>Serve the website from the given base URL</p>
</td> </td>
<td class="align-center"> <td class="align-center">
<p><code class="option">baseurl: URL</code></p> <p><code class="option">baseurl: URL</code></p>
@ -200,6 +222,7 @@ before your site is served.
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
<div class="note warning"> <div class="note warning">
<h5>Do not use tabs in configuration files</h5> <h5>Do not use tabs in configuration files</h5>
@ -220,24 +243,30 @@ source: .
destination: ./_site destination: ./_site
plugins: ./_plugins plugins: ./_plugins
layouts: ./_layouts layouts: ./_layouts
include: ['.htaccess']
exclude: []
keep_files: ['.git','.svn'] keep_files: ['.git','.svn']
timezone: nil
future: true future: true
pygments: false show_drafts: nil
limit_posts: 0
pygments: true
relative_permalinks: true
markdown: maruku
permalink: date permalink: date
include: ['.htaccess']
paginate_path: 'page:num' paginate_path: 'page:num'
markdown_ext: markdown,mkd,mkdn,md markdown: maruku
textile_ext: textile markdown_ext: markdown,mkd,mkdn,md
textile_ext: textile
excerpt_separator: "\n\n" excerpt_separator: "\n\n"
safe: false safe: false
watch: false watch: false # deprecated
server: false server: false # deprecated
host: 0.0.0.0 host: 0.0.0.0
port: 4000 port: 4000
baseurl: / baseurl: /

View File

@ -1,8 +1,9 @@
--- ---
layout: docs layout: docs
title: Contributing title: Contributing
prev_section: deployment-methods prev_section: upgrading
next_section: troubleshooting next_section: history
permalink: /docs/contributing/
--- ---
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
@ -14,11 +15,11 @@ following in mind:
[RR](http://github.com/btakita/rr/tree/master). [RR](http://github.com/btakita/rr/tree/master).
* If it's a brand new feature, make sure to create a new * If it's a brand new feature, make sure to create a new
[Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps [Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps
where appropriate. Also, whipping up some documentation in your fork's wiki where appropriate. Also, whipping up some documentation in your fork's `site`
would be appreciated, and once merged it will be transferred over to the main directory would be appreciated, and once merged it will also appear in
wiki. the next update of the main site.
* If your contribution adds or changes any Jekyll behavior, make sure to update * If your contribution adds or changes any Jekyll behavior, make sure to update
the documentation. It lives in `site/_posts`. If the docs are missing the documentation. It lives in `site/docs`. If the docs are missing
information, please feel free to add it in. Great docs make a great project! information, please feel free to add it in. Great docs make a great project!
* Please follow the [GitHub Ruby Styleguide](https://github.com/styleguide/ruby) * Please follow the [GitHub Ruby Styleguide](https://github.com/styleguide/ruby)
when modifying Ruby code. when modifying Ruby code.
@ -56,15 +57,49 @@ Workflow
Here's the most direct way to get your work merged into the project: Here's the most direct way to get your work merged into the project:
* Fork the project. * Fork the project.
* Clone down your fork: `git clone git://github.com/<username>/jekyll.git` * Clone down your fork:
* Create a topic branch to contain your change: `git checkout -b my_awesome_feature`
{% highlight bash %}
git clone git://github.com/<username>/jekyll.git
{% endhighlight %}
* Create a topic branch to contain your change:
{% highlight bash %}
git checkout -b my_awesome_feature
{% endhighlight %}
* Hack away, add tests. Not necessarily in that order. * Hack away, add tests. Not necessarily in that order.
* Make sure everything still passes by running `rake`. * Make sure everything still passes by running `rake`.
* If necessary, rebase your commits into logical chunks, without errors. * If necessary, rebase your commits into logical chunks, without errors.
* Push the branch up: `git push origin my_awesome_feature` * Push the branch up:
{% highlight bash %}
git push origin my_awesome_feature
{% endhighlight %}
* Create a pull request against mojombo/jekyll and describe what your change * Create a pull request against mojombo/jekyll and describe what your change
does and the why you think it should be merged. does and the why you think it should be merged.
Updating Documentation
----------------------
We want the Jekyll documentation to be the best it can be. We've
open-sourced our docs and we welcome any pull requests if you find it
lacking.
You can find the documentation for jekyllrb.com in the
[site](https://github.com/mojombo/jekyll/tree/master/site) directory of
Jekyll's repo on GitHub.com.
All documentation pull requests should be directed at `master`. Pull
requests directed at another branch will not be accepted.
The [Jekyll wiki](https://github.com/mojombo/jekyll/wiki) on GitHub
can be freely updated without a pull request as all
GitHub users have access.
Gotchas Gotchas
------- -------

View File

@ -2,7 +2,8 @@
layout: docs layout: docs
title: Deployment methods title: Deployment methods
prev_section: github-pages prev_section: github-pages
next_section: contributing next_section: troubleshooting
permalink: /docs/deployment-methods/
--- ---
Sites built using Jekyll can be deployed in a large number of ways due to the static nature of the generated output. A few of the most common deployment techniques are described below. Sites built using Jekyll can be deployed in a large number of ways due to the static nature of the generated output. A few of the most common deployment techniques are described below.
@ -53,7 +54,7 @@ TMP_GIT_CLONE=$HOME/tmp/myrepo
PUBLIC_WWW=/var/www/myrepo PUBLIC_WWW=/var/www/myrepo
git clone $GIT_REPO $TMP_GIT_CLONE git clone $GIT_REPO $TMP_GIT_CLONE
jekyll build $TMP_GIT_CLONE $PUBLIC_WWW jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW
rm -Rf $TMP_GIT_CLONE rm -Rf $TMP_GIT_CLONE
exit exit
{% endhighlight %} {% endhighlight %}
@ -96,7 +97,7 @@ 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 with
[jekyll-s3](https://github.com/laurilehmijoki/jekyll-s3) application. It will [s3_website](https://github.com/laurilehmijoki/s3_website) application. It will
push your site to Amazon S3 where it can be served like any web server, 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

20
site/docs/drafts.md Normal file
View File

@ -0,0 +1,20 @@
---
layout: docs
title: Working with drafts
permalink: /docs/drafts/
---
Drafts are posts without a date. They're posts you're still working on and don't want to
publish yet. To get up and running with drafts, create a `_drafts` folder in your site's
root (as described in the [site structure](/docs/structure/) section) and create your
first draft:
{% highlight text %}
|-- _drafts/
| |-- a-draft-post.md
{% endhighlight %}
To preview your site with drafts, simply run `jekyll serve` or `jekyll build` with
the `--drafts` switch. Each will be assigned the value of `Time.now`
for its date, and thus you will see them generated as the latest posts.

35
site/docs/extras.md Normal file
View File

@ -0,0 +1,35 @@
---
layout: docs
title: Extras
prev_section: plugins
next_section: github-pages
permalink: /docs/extras/
---
There are a number of (optional) extra features that Jekyll supports that you
may want to install, depending on how you plan to use Jekyll.
## LaTeX Support
Maruku comes with optional support for LaTeX to PNG rendering via blahtex
(Version 0.6) which must be in your `$PATH` along with `dvips`. If you need
Maruku to not assume a fixed location for `dvips`, check out [Remis Maruku
fork](http://github.com/remi/maruku).
## RDiscount
If you prefer to use [RDiscount](http://github.com/rtomayko/rdiscount) instead
of [Maruku](http://github.com/bhollis/maruku) for markdown, just make sure you have
it installed:
{% highlight bash %}
$ sudo gem install rdiscount
{% endhighlight %}
And then specify RDiscount as the Markdown engine in your `_config.yml` file to
have Jekyll run with that option.
{% highlight bash %}
# In _config.yml
markdown: rdiscount
{% endhighlight %}

View File

@ -3,6 +3,7 @@ layout: docs
title: Front-matter title: Front-matter
prev_section: configuration prev_section: configuration
next_section: posts next_section: posts
permalink: /docs/frontmatter/
--- ---
The front-matter is where Jekyll starts to get really cool. Any file that The front-matter is where Jekyll starts to get really cool. Any file that
@ -33,10 +34,22 @@ relies on.
</p> </p>
</div> </div>
<div class="note">
<h5>ProTip™: Front Matter Variables Are Optional</h5>
<p>
If you want to use <a href="../variables">Liquid tags and variables</a> but
don't need anything in your front-matter, just leave it empty! The set of
triple-dashed lines with nothing in between will still get Jekyll to process
your file. (This is useful for things like CSS and RSS feeds!)
</p>
</div>
## Predefined Global Variables ## Predefined Global Variables
There are a number of predefined global variables that you can set in the front-matter of a page or post. There are a number of predefined global variables that you can set in the
front-matter of a page or post.
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -53,7 +66,7 @@ There are a number of predefined global variables that you can set in the front-
<p> <p>
If set, this specifies the layout file to use. Use the layout file If set, this specifies the layout file to use. Use the layout file
name without file extension. Layout files must be placed in the name without the file extension. Layout files must be placed in the
<code>_layouts</code> directory. <code>_layouts</code> directory.
</p> </p>
@ -118,6 +131,7 @@ There are a number of predefined global variables that you can set in the front-
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
## Custom Variables ## Custom Variables
@ -141,6 +155,7 @@ title:
These are available out-of-the-box to be used in the front-matter for a post. These are available out-of-the-box to be used in the front-matter for a post.
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -162,3 +177,4 @@ These are available out-of-the-box to be used in the front-matter for a post.
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>

View File

@ -3,9 +3,10 @@ layout: docs
title: GitHub Pages title: GitHub Pages
prev_section: extras prev_section: extras
next_section: deployment-methods next_section: deployment-methods
permalink: /docs/github-pages/
--- ---
[GitHub Pages](https://pages.github.com) are public web pages for users, [GitHub Pages](http://pages.github.com) are public web pages for users,
organizations, and repositories, that are freely hosted on GitHub's organizations, and repositories, that are freely hosted on GitHub's
[github.io]() domain or on a custom domain name of your choice. GitHub Pages are [github.io]() domain or on a custom domain name of your choice. GitHub Pages are
powered by Jekyll behind the scenes, so in addition to supporting regular HTML powered by Jekyll behind the scenes, so in addition to supporting regular HTML
@ -53,6 +54,31 @@ actual software project for Jekyll, however the Jekyll website (that youre
looking at right now) is contained in the [gh-pages looking at right now) is contained in the [gh-pages
branch](https://github.com/mojombo/jekyll/tree/gh-pages) of the same repository. branch](https://github.com/mojombo/jekyll/tree/gh-pages) of the same repository.
### Project Page URL Structure
Sometimes it's nice to preview your Jekyll site before you push your `gh-pages`
branch to GitHub. However, the subdirectory-like URL structure GitHub uses for
Project Pages complicates the proper resolution of URLs. Here is an approach to
utilizing the GitHub Project Page URL structure (`username.github.io/project-name/`)
whilst maintaining the ability to preview your Jekyll site locally.
1. In `_config.yml`, set the `baseurl` option to `/project-name` -- note the
leading slash and the **absence** of a trailing slash.
2. When referencing JS or CSS files, do it like this:
`{% raw %}{{ site.baseurl}}/path/to/css.css{% endraw %}` -- note the slash
immediately following the variable (just before "path").
3. When doing permalinks or internal links, do it like this:
`{% raw %}{{ site.baseurl }}{{ post.url }}{% endraw %}` -- note that there
is **no** slash between the two variables.
4. Finally, if you'd like to preview your site before committing/deploying using
`jekyll serve`, be sure to pass an **empty string** to the `--baseurl` option,
so that you can view everything at `localhost:4000` normally (without
`/project-name` at the beginning): `jekyll serve --baseurl ''`
This way you can preview your site locally from the site root on localhost,
but when GitHub generates your pages from the gh-pages branch all the URLs
will start with `/project-name` and resolve properly.
<div class="note"> <div class="note">
<h5>GitHub Pages Documentation, Help, and Support</h5> <h5>GitHub Pages Documentation, Help, and Support</h5>
<p> <p>

View File

@ -3,6 +3,7 @@ layout: docs
title: Heroku title: Heroku
prev_section: github-pages prev_section: github-pages
next_section: manual-deployment next_section: manual-deployment
permalink: /docs/heroku/
--- ---
Move along, people. Nothing to see here. Move along, people. Nothing to see here.

529
site/docs/history.md Normal file
View File

@ -0,0 +1,529 @@
---
layout: docs
title: History
permalink: /docs/history/
prev_section: contributing
---
## 1.0.3 / 2013-06-07
### Minor Enhancements
- Add support to gist tag for private gists. ([#1189](https://github.com/mojombo/jekyll/issues/1189))
- Fail loudly when MaRuKu errors out ([#1190](https://github.com/mojombo/jekyll/issues/1190))
- Move the building of related posts into their own class ([#1057](https://github.com/mojombo/jekyll/issues/1057))
- Removed trailing spaces in several places throughout the code ([#1116](https://github.com/mojombo/jekyll/issues/1116))
- Add a `--force` option to `jekyll new` ([#1115](https://github.com/mojombo/jekyll/issues/1115))
- Convert IDs in the site template to classes ([#1170](https://github.com/mojombo/jekyll/issues/1170))
### Bug Fixes
- Fix typo in Stevenson constant "ERROR". ([#1166](https://github.com/mojombo/jekyll/issues/1166))
- Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue ([#1106](https://github.com/mojombo/jekyll/issues/1106))
- Exit with a non-zero exit code when dealing with a Liquid error ([#1121](https://github.com/mojombo/jekyll/issues/1121))
- Make the `exclude` and `include` options backwards compatible with
versions of Jekyll prior to 1.0 ([#1114](https://github.com/mojombo/jekyll/issues/1114))
- Fix pagination on Windows ([#1063](https://github.com/mojombo/jekyll/issues/1063))
- Fix the application of Pygments' Generic Output style to Go code
([#1156](https://github.com/mojombo/jekyll/issues/1156))
### Site Enhancements
- Add a Pro Tip to docs about front matter variables being optional ([#1147](https://github.com/mojombo/jekyll/issues/1147))
- Add changelog to site as History page in /docs/ ([#1065](https://github.com/mojombo/jekyll/issues/1065))
- Add note to Upgrading page about new config options in 1.0.x ([#1146](https://github.com/mojombo/jekyll/issues/1146))
- Documentation for `date_to_rfc822` and `uri_escape` ([#1142](https://github.com/mojombo/jekyll/issues/1142))
- Documentation highlight boxes shouldn't show scrollbars if not necessary ([#1123](https://github.com/mojombo/jekyll/issues/1123))
- Add link to jekyll-minibundle in the doc's plugins list ([#1035](https://github.com/mojombo/jekyll/issues/1035))
- Quick patch for importers documentation
- Fix prefix for WordpressDotCom importer in docs ([#1107](https://github.com/mojombo/jekyll/issues/1107))
- Add jekyll-contentblocks plugin to docs ([#1068](https://github.com/mojombo/jekyll/issues/1068))
- Make code bits in notes look more natural, more readable ([#1089](https://github.com/mojombo/jekyll/issues/1089))
- Fix logic for `relative_permalinks` instructions on Upgrading page ([#1101](https://github.com/mojombo/jekyll/issues/1101))
- Add docs for post excerpt ([#1072](https://github.com/mojombo/jekyll/issues/1072))
- Add docs for gist tag ([#1072](https://github.com/mojombo/jekyll/issues/1072))
- Add docs indicating that Pygments does not need to be installed
separately ([#1099](https://github.com/mojombo/jekyll/issues/1099), [#1119](https://github.com/mojombo/jekyll/issues/1119))
- Update the migrator docs to be current ([#1136](https://github.com/mojombo/jekyll/issues/1136))
- Add the Jekyll Gallery Plugin to the plugin list ([#1143](https://github.com/mojombo/jekyll/issues/1143))
### Development Fixes
- Use Jekyll.logger instead of Jekyll::Stevenson to log things ([#1149](https://github.com/mojombo/jekyll/issues/1149))
- Fix pesky Cucumber infinite loop ([#1139](https://github.com/mojombo/jekyll/issues/1139))
- Do not write posts with timezones in Cucumber tests ([#1124](https://github.com/mojombo/jekyll/issues/1124))
- Use ISO formatted dates in Cucumber features ([#1150](https://github.com/mojombo/jekyll/issues/1150))
## 1.0.2 / 2013-05-12
### Major Enhancements
- Add `jekyll doctor` command to check site for any known compatibility problems ([#1081](https://github.com/mojombo/jekyll/issues/1081))
- Backwards-compatibilize relative permalinks ([#1081](https://github.com/mojombo/jekyll/issues/1081))
### Minor Enhancements
- Add a `data-lang="<lang>"` attribute to Redcarpet code blocks ([#1066](https://github.com/mojombo/jekyll/issues/1066))
- Deprecate old config `server_port`, match to `port` if `port` isn't set ([#1084](https://github.com/mojombo/jekyll/issues/1084))
- Update pygments.rb version to 0.5.0 ([#1061](https://github.com/mojombo/jekyll/issues/1061))
- Update Kramdown version to 1.0.2 ([#1067](https://github.com/mojombo/jekyll/issues/1067))
### Bug Fixes
- Fix issue when categories are numbers ([#1078](https://github.com/mojombo/jekyll/issues/1078))
- Catching that Redcarpet gem isn't installed ([#1059](https://github.com/mojombo/jekyll/issues/1059))
### Site Enhancements
- Add documentation about `relative_permalinks` ([#1081](https://github.com/mojombo/jekyll/issues/1081))
- Remove pygments-installation instructions, as pygments.rb is bundled with it ([#1079](https://github.com/mojombo/jekyll/issues/1079))
- Move pages to be Pages for realz ([#985](https://github.com/mojombo/jekyll/issues/985))
- Updated links to Liquid documentation ([#1073](https://github.com/mojombo/jekyll/issues/1073))
## 1.0.1 / 2013-05-08
### Minor Enhancements
- Do not force use of toc_token when using generate_tok in RDiscount ([#1048](https://github.com/mojombo/jekyll/issues/1048))
- Add newer `language-` class name prefix to code blocks ([#1037](https://github.com/mojombo/jekyll/issues/1037))
- Commander error message now preferred over process abort with incorrect args ([#1040](https://github.com/mojombo/jekyll/issues/1040))
### Bug Fixes
- Make Redcarpet respect the pygments configuration option ([#1053](https://github.com/mojombo/jekyll/issues/1053))
- Fix the index build with LSI ([#1045](https://github.com/mojombo/jekyll/issues/1045))
- Don't print deprecation warning when no arguments are specified. ([#1041](https://github.com/mojombo/jekyll/issues/1041))
- Add missing `</div>` to site template used by `new` subcommand, fixed typos in code ([#1032](https://github.com/mojombo/jekyll/issues/1032))
### Site Enhancements
- Changed https to http in the GitHub Pages link ([#1051](https://github.com/mojombo/jekyll/issues/1051))
- Remove CSS cruft, fix typos, fix HTML errors ([#1028](https://github.com/mojombo/jekyll/issues/1028))
- Removing manual install of Pip and Distribute ([#1025](https://github.com/mojombo/jekyll/issues/1025))
- Updated URL for Markdown references plugin ([#1022](https://github.com/mojombo/jekyll/issues/1022))
### Development Fixes
- Markdownify history file ([#1027](https://github.com/mojombo/jekyll/issues/1027))
- Update links on README to point to new jekyllrb.com ([#1018](https://github.com/mojombo/jekyll/issues/1018))
## 1.0.0 / 2013-05-06
### Major Enhancements
- Add `jekyll new` subcommand: generate a jekyll scaffold ([#764](https://github.com/mojombo/jekyll/issues/764))
- Refactored jekyll commands into subcommands: build, serve, and migrate. ([#690](https://github.com/mojombo/jekyll/issues/690))
- Removed importers/migrators from main project, migrated to jekyll-import sub-gem ([#793](https://github.com/mojombo/jekyll/issues/793))
- Added ability to render drafts in `_drafts` folder via command line ([#833](https://github.com/mojombo/jekyll/issues/833))
- Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) ([#928](https://github.com/mojombo/jekyll/issues/928))
### Minor Enhancements
- Site template HTML5-ified ([#964](https://github.com/mojombo/jekyll/issues/964))
- Use post's directory path when matching for the post_url tag ([#998](https://github.com/mojombo/jekyll/issues/998))
- Loosen dependency on Pygments so it's only required when it's needed ([#1015](https://github.com/mojombo/jekyll/issues/1015))
- Parse strings into Time objects for date-related Liquid filters ([#1014](https://github.com/mojombo/jekyll/issues/1014))
- Tell the user if there is no subcommand specified ([#1008](https://github.com/mojombo/jekyll/issues/1008))
- Freak out if the destination of `jekyll new` exists and is non-empty ([#981](https://github.com/mojombo/jekyll/issues/981))
- Add `timezone` configuration option for compilation ([#957](https://github.com/mojombo/jekyll/issues/957))
- Add deprecation messages for pre-1.0 CLI options ([#959](https://github.com/mojombo/jekyll/issues/959))
- Refactor and colorize logging ([#959](https://github.com/mojombo/jekyll/issues/959))
- Refactor Markdown parsing ([#955](https://github.com/mojombo/jekyll/issues/955))
- Added application/vnd.apple.pkpass to mime.types served by WEBrick ([#907](https://github.com/mojombo/jekyll/issues/907))
- Move template site to default markdown renderer ([#961](https://github.com/mojombo/jekyll/issues/961))
- Expose new attribute to Liquid via `page`: `page.path` ([#951](https://github.com/mojombo/jekyll/issues/951))
- Accept multiple config files from command line ([#945](https://github.com/mojombo/jekyll/issues/945))
- Add page variable to liquid custom tags and blocks ([#413](https://github.com/mojombo/jekyll/issues/413))
- Add paginator.previous_page_path and paginator.next_page_path ([#942](https://github.com/mojombo/jekyll/issues/942))
- Backwards compatibility for 'auto' ([#821](https://github.com/mojombo/jekyll/issues/821), [#934](https://github.com/mojombo/jekyll/issues/934))
- Added date_to_rfc822 used on RSS feeds ([#892](https://github.com/mojombo/jekyll/issues/892))
- Upgrade version of pygments.rb to 0.4.2 ([#927](https://github.com/mojombo/jekyll/issues/927))
- Added short month (e.g. "Sep") to permalink style options for posts ([#890](https://github.com/mojombo/jekyll/issues/890))
- Expose site.baseurl to Liquid templates ([#869](https://github.com/mojombo/jekyll/issues/869))
- Adds excerpt attribute to posts which contains first paragraph of content ([#837](https://github.com/mojombo/jekyll/issues/837))
- Accept custom configuration file via CLI ([#863](https://github.com/mojombo/jekyll/issues/863))
- Load in GitHub Pages MIME Types on `jekyll serve` ([#847](https://github.com/mojombo/jekyll/issues/847), [#871](https://github.com/mojombo/jekyll/issues/871))
- Improve debugability of error message for a malformed highlight tag ([#785](https://github.com/mojombo/jekyll/issues/785))
- Allow symlinked files in unsafe mode ([#824](https://github.com/mojombo/jekyll/issues/824))
- Add 'gist' Liquid tag to core ([#822](https://github.com/mojombo/jekyll/issues/822), [#861](https://github.com/mojombo/jekyll/issues/861))
- New format of Jekyll output ([#795](https://github.com/mojombo/jekyll/issues/795))
- Reinstate --limit_posts and --future switches ([#788](https://github.com/mojombo/jekyll/issues/788))
- Remove ambiguity from command descriptions ([#815](https://github.com/mojombo/jekyll/issues/815))
- Fix SafeYAML Warnings ([#807](https://github.com/mojombo/jekyll/issues/807))
- Relaxed Kramdown version to 0.14 ([#808](https://github.com/mojombo/jekyll/issues/808))
- Aliased `jekyll server` to `jekyll serve`. ([#792](https://github.com/mojombo/jekyll/issues/792))
- Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. ([#744](https://github.com/mojombo/jekyll/issues/744))
- Refactored jekyll subcommands into Jekyll::Commands submodule, which now contains them ([#768](https://github.com/mojombo/jekyll/issues/768))
- Rescue from import errors in Wordpress.com migrator ([#671](https://github.com/mojombo/jekyll/issues/671))
- Massively accelerate LSI performance ([#664](https://github.com/mojombo/jekyll/issues/664))
- Truncate post slugs when importing from Tumblr ([#496](https://github.com/mojombo/jekyll/issues/496))
- Add glob support to include, exclude option ([#743](https://github.com/mojombo/jekyll/issues/743))
- Layout of Page or Post defaults to 'page' or 'post', respectively ([#580](https://github.com/mojombo/jekyll/issues/580))
REPEALED by ([#977](https://github.com/mojombo/jekyll/issues/977))
- "Keep files" feature ([#685](https://github.com/mojombo/jekyll/issues/685))
- Output full path & name for files that don't parse ([#745](https://github.com/mojombo/jekyll/issues/745))
- Add source and destination directory protection ([#535](https://github.com/mojombo/jekyll/issues/535))
- Better YAML error message ([#718](https://github.com/mojombo/jekyll/issues/718))
- Bug Fixes
- Paginate in subdirectories properly ([#1016](https://github.com/mojombo/jekyll/issues/1016))
- Ensure post and page URLs have a leading slash ([#992](https://github.com/mojombo/jekyll/issues/992))
- Catch all exceptions, not just StandardError descendents ([#1007](https://github.com/mojombo/jekyll/issues/1007))
- Bullet-proof limit_posts option ([#1004](https://github.com/mojombo/jekyll/issues/1004))
- Read in YAML as UTF-8 to accept non-ASCII chars ([#836](https://github.com/mojombo/jekyll/issues/836))
- Fix the CLI option --plugins to actually accept dirs and files ([#993](https://github.com/mojombo/jekyll/issues/993))
- Allow 'excerpt' in YAML Front-Matter to override the extracted excerpt ([#946](https://github.com/mojombo/jekyll/issues/946))
- Fix cascade problem with site.baseurl, site.port and site.host. ([#935](https://github.com/mojombo/jekyll/issues/935))
- Filter out directories with valid post names ([#875](https://github.com/mojombo/jekyll/issues/875))
- Fix symlinked static files not being correctly built in unsafe mode ([#909](https://github.com/mojombo/jekyll/issues/909))
- Fix integration with directory_watcher 1.4.x ([#916](https://github.com/mojombo/jekyll/issues/916))
- Accepting strings as arguments to jekyll-import command ([#910](https://github.com/mojombo/jekyll/issues/910))
- Force usage of older directory_watcher gem as 1.5 is broken ([#883](https://github.com/mojombo/jekyll/issues/883))
- Ensure all Post categories are downcase ([#842](https://github.com/mojombo/jekyll/issues/842), [#872](https://github.com/mojombo/jekyll/issues/872))
- Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors ([#555](https://github.com/mojombo/jekyll/issues/555))
- Patch for multibyte URI problem with jekyll serve ([#723](https://github.com/mojombo/jekyll/issues/723))
- Order plugin execution by priority ([#864](https://github.com/mojombo/jekyll/issues/864))
- Fixed Page#dir and Page#url for edge cases ([#536](https://github.com/mojombo/jekyll/issues/536))
- Fix broken post_url with posts with a time in their YAML Front-Matter ([#831](https://github.com/mojombo/jekyll/issues/831))
- Look for plugins under the source directory ([#654](https://github.com/mojombo/jekyll/issues/654))
- Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long
post names ([#775](https://github.com/mojombo/jekyll/issues/775))
- Force Categories to be Strings ([#767](https://github.com/mojombo/jekyll/issues/767))
- Safe YAML plugin to prevent vulnerability ([#777](https://github.com/mojombo/jekyll/issues/777))
- Add SVG support to Jekyll/WEBrick. ([#407](https://github.com/mojombo/jekyll/issues/407), [#406](https://github.com/mojombo/jekyll/issues/406))
- Prevent custom destination from causing continuous regen on watch ([#528](https://github.com/mojombo/jekyll/issues/528), [#820](https://github.com/mojombo/jekyll/issues/820), [#862](https://github.com/mojombo/jekyll/issues/862))
### Site Enhancements
- Responsify ([#860](https://github.com/mojombo/jekyll/issues/860))
- Fix spelling, punctuation and phrasal errors ([#989](https://github.com/mojombo/jekyll/issues/989))
- Update quickstart instructions with `new` command ([#966](https://github.com/mojombo/jekyll/issues/966))
- Add docs for page.excerpt ([#956](https://github.com/mojombo/jekyll/issues/956))
- Add docs for page.path ([#951](https://github.com/mojombo/jekyll/issues/951))
- Clean up site docs to prepare for 1.0 release ([#918](https://github.com/mojombo/jekyll/issues/918))
- Bring site into master branch with better preview/deploy ([#709](https://github.com/mojombo/jekyll/issues/709))
- Redesigned site ([#583](https://github.com/mojombo/jekyll/issues/583))
### Development Fixes
- Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 ([#938](https://github.com/mojombo/jekyll/issues/938))
- Added "features:html" rake task for debugging purposes, cleaned up
cucumber profiles ([#832](https://github.com/mojombo/jekyll/issues/832))
- Explicitly require HTTPS rubygems source in Gemfile ([#826](https://github.com/mojombo/jekyll/issues/826))
- Changed Ruby version for development to 1.9.3-p374 from p362 ([#801](https://github.com/mojombo/jekyll/issues/801))
- Including a link to the GitHub Ruby style guide in CONTRIBUTING.md ([#806](https://github.com/mojombo/jekyll/issues/806))
- Added script/bootstrap ([#776](https://github.com/mojombo/jekyll/issues/776))
- Running Simplecov under 2 conditions: ENV(COVERAGE)=true and with Ruby version
of greater than 1.9 ([#771](https://github.com/mojombo/jekyll/issues/771))
- Switch to Simplecov for coverage report ([#765](https://github.com/mojombo/jekyll/issues/765))
## 0.12.1 / 2013-02-19
### Minor Enhancements
- Update Kramdown version to 0.14.1 ([#744](https://github.com/mojombo/jekyll/issues/744))
- Test Enhancements
- Update Rake version to 10.0.3 ([#744](https://github.com/mojombo/jekyll/issues/744))
- Update Shoulda version to 3.3.2 ([#744](https://github.com/mojombo/jekyll/issues/744))
- Update Redcarpet version to 2.2.2 ([#744](https://github.com/mojombo/jekyll/issues/744))
## 0.12.0 / 2012-12-22
### Minor Enhancements
- Add ability to explicitly specify included files ([#261](https://github.com/mojombo/jekyll/issues/261))
- Add --default-mimetype option ([#279](https://github.com/mojombo/jekyll/issues/279))
- Allow setting of RedCloth options ([#284](https://github.com/mojombo/jekyll/issues/284))
- Add post_url Liquid tag for internal post linking ([#369](https://github.com/mojombo/jekyll/issues/369))
- Allow multiple plugin dirs to be specified ([#438](https://github.com/mojombo/jekyll/issues/438))
- Inline TOC token support for RDiscount ([#333](https://github.com/mojombo/jekyll/issues/333))
- Add the option to specify the paginated url format ([#342](https://github.com/mojombo/jekyll/issues/342))
- Swap out albino for pygments.rb ([#569](https://github.com/mojombo/jekyll/issues/569))
- Support Redcarpet 2 and fenced code blocks ([#619](https://github.com/mojombo/jekyll/issues/619))
- Better reporting of Liquid errors ([#624](https://github.com/mojombo/jekyll/issues/624))
- Bug Fixes
- Allow some special characters in highlight names
- URL escape category names in URL generation ([#360](https://github.com/mojombo/jekyll/issues/360))
- Fix error with limit_posts ([#442](https://github.com/mojombo/jekyll/issues/442))
- Properly select dotfile during directory scan ([#363](https://github.com/mojombo/jekyll/issues/363), [#431](https://github.com/mojombo/jekyll/issues/431), [#377](https://github.com/mojombo/jekyll/issues/377))
- Allow setting of Kramdown smart_quotes ([#482](https://github.com/mojombo/jekyll/issues/482))
- Ensure front-matter is at start of file ([#562](https://github.com/mojombo/jekyll/issues/562))
## 0.11.2 / 2011-12-27
- Bug Fixes
- Fix gemspec
## 0.11.1 / 2011-12-27
- Bug Fixes
- Fix extra blank line in highlight blocks ([#409](https://github.com/mojombo/jekyll/issues/409))
- Update dependencies
## 0.11.0 / 2011-07-10
### Major Enhancements
- Add command line importer functionality ([#253](https://github.com/mojombo/jekyll/issues/253))
- Add Redcarpet Markdown support ([#318](https://github.com/mojombo/jekyll/issues/318))
- Make markdown/textile extensions configurable ([#312](https://github.com/mojombo/jekyll/issues/312))
- Add `markdownify` filter
### Minor Enhancements
- Switch to Albino gem
- Bundler support
- Use English library to avoid hoops ([#292](https://github.com/mojombo/jekyll/issues/292))
- Add Posterous importer ([#254](https://github.com/mojombo/jekyll/issues/254))
- Fixes for Wordpress importer ([#274](https://github.com/mojombo/jekyll/issues/274), [#252](https://github.com/mojombo/jekyll/issues/252), [#271](https://github.com/mojombo/jekyll/issues/271))
- Better error message for invalid post date ([#291](https://github.com/mojombo/jekyll/issues/291))
- Print formatted fatal exceptions to stdout on build failure
- Add Tumblr importer ([#323](https://github.com/mojombo/jekyll/issues/323))
- Add Enki importer ([#320](https://github.com/mojombo/jekyll/issues/320))
- Bug Fixes
- Secure additional path exploits
## 0.10.0 / 2010-12-16
- Bug Fixes
- Add --no-server option.
## 0.9.0 / 2010-12-15
### Minor Enhancements
- Use OptionParser's `[no-]` functionality for better boolean parsing.
- Add Drupal migrator ([#245](https://github.com/mojombo/jekyll/issues/245))
- Complain about YAML and Liquid errors ([#249](https://github.com/mojombo/jekyll/issues/249))
- Remove orphaned files during regeneration ([#247](https://github.com/mojombo/jekyll/issues/247))
- Add Marley migrator ([#28](https://github.com/mojombo/jekyll/issues/28))
## 0.8.0 / 2010-11-22
### Minor Enhancements
- Add wordpress.com importer ([#207](https://github.com/mojombo/jekyll/issues/207))
- Add --limit-posts cli option ([#212](https://github.com/mojombo/jekyll/issues/212))
- Add uri_escape filter ([#234](https://github.com/mojombo/jekyll/issues/234))
- Add --base-url cli option ([#235](https://github.com/mojombo/jekyll/issues/235))
- Improve MT migrator ([#238](https://github.com/mojombo/jekyll/issues/238))
- Add kramdown support ([#239](https://github.com/mojombo/jekyll/issues/239))
- Bug Fixes
- Fixed filename basename generation ([#208](https://github.com/mojombo/jekyll/issues/208))
- Set mode to UTF8 on Sequel connections ([#237](https://github.com/mojombo/jekyll/issues/237))
- Prevent `_includes` dir from being a symlink
## 0.7.0 / 2010-08-24
### Minor Enhancements
- Add support for rdiscount extensions ([#173](https://github.com/mojombo/jekyll/issues/173))
- Bug Fixes
- Highlight should not be able to render local files
- The site configuration may not always provide a 'time' setting ([#184](https://github.com/mojombo/jekyll/issues/184))
## 0.6.2 / 2010-06-25
- Bug Fixes
- Fix Rakefile 'release' task (tag pushing was missing origin)
- Ensure that RedCloth is loaded when textilize filter is used ([#183](https://github.com/mojombo/jekyll/issues/183))
- Expand source, destination, and plugin paths ([#180](https://github.com/mojombo/jekyll/issues/180))
- Fix page.url to include full relative path ([#181](https://github.com/mojombo/jekyll/issues/181))
## 0.6.1 / 2010-06-24
- Bug Fixes
- Fix Markdown Pygments prefix and suffix ([#178](https://github.com/mojombo/jekyll/issues/178))
## 0.6.0 / 2010-06-23
### Major Enhancements
- Proper plugin system ([#19](https://github.com/mojombo/jekyll/issues/19), [#100](https://github.com/mojombo/jekyll/issues/100))
- Add safe mode so unsafe converters/generators can be added
- Maruku is now the only processor dependency installed by default.
Other processors will be lazy-loaded when necessary (and prompt the
user to install them when necessary) ([#57](https://github.com/mojombo/jekyll/issues/57))
### Minor Enhancements
- Inclusion/exclusion of future dated posts ([#59](https://github.com/mojombo/jekyll/issues/59))
- Generation for a specific time ([#59](https://github.com/mojombo/jekyll/issues/59))
- Allocate site.time on render not per site_payload invocation ([#59](https://github.com/mojombo/jekyll/issues/59))
- Pages now present in the site payload and can be used through the
site.pages and site.html_pages variables
- Generate phase added to site#process and pagination is now a generator
- Switch to RakeGem for build/test process
- Only regenerate static files when they have changed ([#142](https://github.com/mojombo/jekyll/issues/142))
- Allow arbitrary options to Pygments ([#31](https://github.com/mojombo/jekyll/issues/31))
- Allow URL to be set via command line option ([#147](https://github.com/mojombo/jekyll/issues/147))
- Bug Fixes
- Render highlighted code for non markdown/textile pages ([#116](https://github.com/mojombo/jekyll/issues/116))
- Fix highlighting on Ruby 1.9 ([#65](https://github.com/mojombo/jekyll/issues/65))
- Fix extension munging when pretty permalinks are enabled ([#64](https://github.com/mojombo/jekyll/issues/64))
- Stop sorting categories ([#33](https://github.com/mojombo/jekyll/issues/33))
- Preserve generated attributes over front matter ([#119](https://github.com/mojombo/jekyll/issues/119))
- Fix source directory binding using Dir.pwd ([#75](https://github.com/mojombo/jekyll/issues/75))
## 0.5.7 / 2010-01-12
### Minor Enhancements
- Allow overriding of post date in the front matter ([#62](https://github.com/mojombo/jekyll/issues/62), [#38](https://github.com/mojombo/jekyll/issues/38))
- Bug Fixes
- Categories isn't always an array ([#73](https://github.com/mojombo/jekyll/issues/73))
- Empty tags causes error in read_posts ([#84](https://github.com/mojombo/jekyll/issues/84))
- Fix pagination to adhere to read/render/write paradigm
- Test Enhancement
- cucumber features no longer use site.posts.first where a better
alternative is available
## 0.5.6 / 2010-01-08
- Bug Fixes
- Require redcloth >= 4.2.1 in tests ([#92](https://github.com/mojombo/jekyll/issues/92))
- Don't break on triple dashes in yaml frontmatter ([#93](https://github.com/mojombo/jekyll/issues/93))
### Minor Enhancements
- Allow .mkd as markdown extension
- Use $stdout/err instead of constants ([#99](https://github.com/mojombo/jekyll/issues/99))
- Properly wrap code blocks ([#91](https://github.com/mojombo/jekyll/issues/91))
- Add javascript mime type for webrick ([#98](https://github.com/mojombo/jekyll/issues/98))
## 0.5.5 / 2010-01-08
- Bug Fixes
- Fix pagination % 0 bug ([#78](https://github.com/mojombo/jekyll/issues/78))
- Ensure all posts are processed first ([#71](https://github.com/mojombo/jekyll/issues/71))
## NOTE
- After this point I will no longer be giving credit in the history;
that is what the commit log is for.
## 0.5.4 / 2009-08-23
- Bug Fixes
- Do not allow symlinks (security vulnerability)
## 0.5.3 / 2009-07-14
- Bug Fixes
- Solving the permalink bug where non-html files wouldn't work
([@jeffrydegrande](https://github.com/jeffrydegrande))
## 0.5.2 / 2009-06-24
- Enhancements
- Added --paginate option to the executable along with a paginator object
for the payload ([@calavera](https://github.com/calavera))
- Upgraded RedCloth to 4.2.1, which makes `<notextile>` tags work once
again.
- Configuration options set in config.yml are now available through the
site payload ([@vilcans](https://github.com/vilcans))
- Posts can now have an empty YAML front matter or none at all
([@bahuvrihi](https://github.com/bahuvrihi))
- Bug Fixes
- Fixing Ruby 1.9 issue that requires to_s on the err object
([@Chrononaut](https://github.com/Chrononaut))
- Fixes for pagination and ordering posts on the same day ([@ujh](https://github.com/ujh))
- Made pages respect permalinks style and permalinks in yml front matter
([@eugenebolshakov](https://github.com/eugenebolshakov))
- Index.html file should always have index.html permalink
([@eugenebolshakov](https://github.com/eugenebolshakov))
- Added trailing slash to pretty permalink style so Apache is happy
([@eugenebolshakov](https://github.com/eugenebolshakov))
- Bad markdown processor in config fails sooner and with better message
([@gcnovus](https://github.com/gcnovus))
- Allow CRLFs in yaml frontmatter ([@juretta](https://github.com/juretta))
- Added Date#xmlschema for Ruby versions < 1.9
## 0.5.1 / 2009-05-06
### Major Enhancements
- Next/previous posts in site payload ([@pantulis](https://github.com/pantulis), [@tomo](https://github.com/tomo))
- Permalink templating system
- Moved most of the README out to the GitHub wiki
- Exclude option in configuration so specified files won't be brought over
with generated site ([@duritong](https://github.com/duritong))
- Bug Fixes
- Making sure config.yaml references are all gone, using only config.yml
- Fixed syntax highlighting breaking for UTF-8 code ([@henrik](https://github.com/henrik))
- Worked around RDiscount bug that prevents Markdown from getting parsed
after highlight ([@henrik](https://github.com/henrik))
- CGI escaped post titles ([@Chrononaut](https://github.com/Chrononaut))
## 0.5.0 / 2009-04-07
### Minor Enhancements
- Ability to set post categories via YAML ([@qrush](https://github.com/qrush))
- Ability to set prevent a post from publishing via YAML ([@qrush](https://github.com/qrush))
- Add textilize filter ([@willcodeforfoo](https://github.com/willcodeforfoo))
- Add 'pretty' permalink style for wordpress-like urls ([@dysinger](https://github.com/dysinger))
- Made it possible to enter categories from YAML as an array ([@Chrononaut](https://github.com/Chrononaut))
- Ignore Emacs autosave files ([@Chrononaut](https://github.com/Chrononaut))
- Bug Fixes
- Use block syntax of popen4 to ensure that subprocesses are properly disposed ([@jqr](https://github.com/jqr))
- Close open4 streams to prevent zombies ([@rtomayko](https://github.com/rtomayko))
- Only query required fields from the WP Database ([@ariejan](https://github.com/ariejan))
- Prevent `_posts` from being copied to the destination directory ([@bdimcheff](https://github.com/bdimcheff))
- Refactors
- Factored the filtering code into a method ([@Chrononaut](https://github.com/Chrononaut))
- Fix tests and convert to Shoulda ([@qrush](https://github.com/qrush), [@technicalpickles](https://github.com/technicalpickles))
- Add Cucumber acceptance test suite ([@qrush](https://github.com/qrush), [@technicalpickles](https://github.com/technicalpickles))
## 0.4.1
### Minor Enhancements
- Changed date format on wordpress converter (zeropadding) ([@dysinger](https://github.com/dysinger))
- Bug Fixes
- Add jekyll binary as executable to gemspec ([@dysinger](https://github.com/dysinger))
## 0.4.0 / 2009-02-03
### Major Enhancements
- Switch to Jeweler for packaging tasks
### Minor Enhancements
- Type importer ([@codeslinger](https://github.com/codeslinger))
- site.topics accessor ([@baz](https://github.com/baz))
- Add `array_to_sentence_string` filter ([@mchung](https://github.com/mchung))
- Add a converter for textpattern ([@PerfectlyNormal](https://github.com/PerfectlyNormal))
- Add a working Mephisto / MySQL converter ([@ivey](https://github.com/ivey))
- Allowing .htaccess files to be copied over into the generated site ([@briandoll](https://github.com/briandoll))
- Add option to not put file date in permalink URL ([@mreid](https://github.com/mreid))
- Add line number capabilities to highlight blocks ([@jcon](https://github.com/jcon))
- Bug Fixes
- Fix permalink behavior ([@cavalle](https://github.com/cavalle))
- Fixed an issue with pygments, markdown, and newlines ([@zpinter](https://github.com/zpinter))
- Ampersands need to be escaped ([@pufuwozu](https://github.com/pufuwozu), [@ap](https://github.com/ap))
- Test and fix the site.categories hash ([@zzot](https://github.com/zzot))
- Fix site payload available to files ([@matrix9180](https://github.com/matrix9180))
## 0.3.0 / 2008-12-24
### Major Enhancements
- Added --server option to start a simple WEBrick server on destination
directory ([@johnreilly](https://github.com/johnreilly) and [@mchung](https://github.com/mchung))
### Minor Enhancements
- Added post categories based on directories containing `_posts` ([@mreid](https://github.com/mreid))
- Added post topics based on directories underneath `_posts`
- Added new date filter that shows the full month name ([@mreid](https://github.com/mreid))
- Merge Post's YAML front matter into its to_liquid payload ([@remi](https://github.com/remi))
- Restrict includes to regular files underneath `_includes`
- Bug Fixes
- Change YAML delimiter matcher so as to not chew up 2nd level markdown
headers ([@mreid](https://github.com/mreid))
- Fix bug that meant page data (such as the date) was not available in
templates ([@mreid](https://github.com/mreid))
- Properly reject directories in `_layouts`
## 0.2.1 / 2008-12-15
- Major Changes
- Use Maruku (pure Ruby) for Markdown by default ([@mreid](https://github.com/mreid))
- Allow use of RDiscount with --rdiscount flag
### Minor Enhancements
- Don't load directory_watcher unless it's needed ([@pjhyett](https://github.com/pjhyett))
## 0.2.0 / 2008-12-14
- Major Changes
- related_posts is now found in site.related_posts
## 0.1.6 / 2008-12-13
- Major Features
- Include files in `_includes` with {% raw %}`{% include x.textile %}`{% endraw %}
## 0.1.5 / 2008-12-12
### Major Enhancements
- Code highlighting with Pygments if --pygments is specified
- Disable true LSI by default, enable with --lsi
### Minor Enhancements
- Output informative message if RDiscount is not available ([@JackDanger](https://github.com/JackDanger))
- Bug Fixes
- Prevent Jekyll from picking up the output directory as a source ([@JackDanger](https://github.com/JackDanger))
- Skip `related_posts` when there is only one post ([@JackDanger](https://github.com/JackDanger))
## 0.1.4 / 2008-12-08
- Bug Fixes
- DATA does not work properly with rubygems
## 0.1.3 / 2008-12-06
- Major Features
- Markdown support ([@vanpelt](https://github.com/vanpelt))
- Mephisto and CSV converters ([@vanpelt](https://github.com/vanpelt))
- Code hilighting ([@vanpelt](https://github.com/vanpelt))
- Autobuild
- Bug Fixes
- Accept both \r\n and \n in YAML header ([@vanpelt](https://github.com/vanpelt))
## 0.1.2 / 2008-11-22
- Major Features
- Add a real "related posts" implementation using Classifier
- Command Line Changes
- Allow cli to be called with 0, 1, or 2 args intuiting dir paths
if they are omitted
## 0.1.1 / 2008-11-22
- Minor Additions
- Posts now support introspectional data e.g. {% raw %}`{{ page.url }}`{% endraw %}
## 0.1.0 / 2008-11-05
- First release
- Converts posts written in Textile
- Converts regular site pages
- Simple copy of binary files
## 0.0.0 / 2008-10-19
- Birthday!

View File

@ -1,11 +0,0 @@
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0;url=home">
<title>Jekyll</title>
</head>
<body style="background: #333;">
</body>
</html>

View File

@ -1,43 +1,29 @@
--- ---
layout: docs layout: docs
title: Welcome title: Welcome
next_section: installation next_section: quickstart
permalink: /docs/home/
--- ---
This site aims to be a comprehensive guide to Jekyll. Well cover everything This site aims to be a comprehensive guide to Jekyll. Well cover topics such
from getting your site up and running, creating and managing your content, as getting your site up and running, creating and managing your content,
customizing the way your site works and looks, deploying to various customizing the way your site works and looks, deploying to various
environments, as well as some advice on participating in the future development environments, and give you some advice on participating in the future
of Jekyll itself. development of Jekyll itself.
## So what is Jekyll, exactly? ## So what is Jekyll, exactly?
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 [Markdown](http://daringfireball.net/projects/markdown/) (or
[Textile](http://textile.sitemonks.com/)) and [Liquid](http://liquidmarkup.org/) [Textile](http://textile.sitemonks.com/)) and
[Liquid](http://wiki.shopify.com/Liquid)
converters, and 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 projects page, blog, or website from GitHubs servers **for to host your projects page, blog, or website from GitHubs servers **for
free**. free**.
## Quick-start guide
For the impatient, here's how to get a boilerplate Jekyll site up and running.
{% highlight bash %}
~ $ gem install jekyll
~ $ jekyll new myblog
~ $ cd myblog
~/myblog $ jekyll serve
# => Now browse to http://localhost:4000
{% endhighlight %}
That's nothing, though. The real magic happens when you start creating blog
posts, using the front-matter to control templates and layouts, and taking
advantage of all the awesome configuration options Jekyll makes available.
## ProTips™, Notes, and Warnings ## ProTips™, Notes, and Warnings
Throughout this guide there are a number of small-but-handy pieces of Throughout this guide there are a number of small-but-handy pieces of

View File

@ -1,14 +1,15 @@
--- ---
layout: docs layout: docs
title: Installation title: Installation
prev_section: home prev_section: quickstart
next_section: usage next_section: usage
permalink: /docs/installation/
--- ---
Getting Jekyll installed and ready-to-go should only take a few minutes. If it Getting Jekyll installed and ready-to-go should only take a few minutes. If it
ever becomes a pain in the ass, please [file an ever becomes a pain in the ass, please [file an
issue](https://github.com/mojombo/jekyll/issues/new) (or submit a pull request) issue](https://github.com/mojombo/jekyll/issues/new) (or submit a pull request)
describing the issue you encountered, and how we might make the process easier. describing the issue you encountered and how we might make the process easier.
### Requirements ### Requirements
@ -39,27 +40,26 @@ simply run the following command to install Jekyll:
$ gem install jekyll $ gem install jekyll
{% endhighlight %} {% endhighlight %}
All Jekylls gem dependencies are automatically installed by the above command, All of Jekylls gem dependencies are automatically installed by the above
so you wont have to worry about them at all. If you have problems installing command, so you wont have to worry about them at all. If you have problems
Jekyll, check out the [troubleshooting](../troubleshooting) page or [report an installing Jekyll, check out the [troubleshooting](../troubleshooting) page or
issue](https://github.com/mojombo/jekyll/issues/new) so the Jekyll community can [report an issue](https://github.com/mojombo/jekyll/issues/new) so the Jekyll
improve the experience for everyone. community can improve the experience for everyone.
## Optional Extras ## Optional Extras
There are a number of (optional) extra features that Jekyll supports that you There are a number of (optional) extra features that Jekyll supports that you
may want to install, depending on how you plan to use Jekyll. These extras may want to install, depending on how you plan to use Jekyll. These extras
include syntax highlighting of code snippets using include LaTeX support, and the use of alternative content rendering engines.
[Pygments](http://pygments.org/), LaTeX support, and the use of alternative Check out [the extras page](../extras) for more information.
content rendering engines. Check out [the extras page](../extras) for more
information.
<div class="note"> <div class="note">
<h5>ProTip™: Enable Syntax Highlighting</h5> <h5>ProTip™: Enable Syntax Highlighting</h5>
<p> <p>
If youre the kind of person who is using Jekyll, then chances are youll If youre the kind of person who is using Jekyll, then chances are youll
want to enable syntax highlighting using Pygments. You should really want to enable syntax highlighting using Pygments. You should really
<a href="../extras">check out how to do that</a> before you go any further. <a href="../templates/#code_snippet_highlighting">check out how to do
that</a> before you go any further.
</p> </p>
</div> </div>

245
site/docs/migrations.md Normal file
View File

@ -0,0 +1,245 @@
---
layout: docs
title: Blog migrations
prev_section: variables
next_section: templates
permalink: /docs/migrations/
---
If youre switching to Jekyll from another blogging system, Jekylls importers
can help you with the move. Most methods listed on this page require read access
to the database from your old system to generate posts for Jekyll. Each method
generates `.markdown` posts in the `_posts` directory based on the entries in
the foreign system.
## Preparing for migrations
Because the importers have many of their own dependencies, they are made
available via a separate gem called
[`jekyll-import`](https://github.com/jekyll/jekyll-import). To use them, all
you need to do is install the gem, and they will become available as part of
Jekyll's standard command line interface.
{% highlight bash %}
$ gem install jekyll-import --pre
{% endhighlight %}
You should now be all set to run the importers below. If you ever get stuck, you
can see help for each importer:
{% highlight bash %}
$ jekyll help import # => See list of importers
$ jekyll help import IMPORTER # => See importer specific help
{% endhighlight %}
Where IMPORTER is the name of the specific importer.
<div class="note info">
<h5>Note: Always double-check migrated content</h5>
<p>
Importers may not distinguish between published or private posts, so
you should always check that the content Jekyll generates for you appears as
you intended.
</p>
</div>
<!-- TODO all these need to be fixed -->
## WordPress
### Wordpress export files
If hpricot is not already installed, you will need to run `gem install hpricot`.
Next, export your blog using the Wordpress export utility. Assuming that the
exported file is saved as `wordpress.xml`, here is the command you need to run:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/wordpressdotcom";
JekyllImport::WordpressDotCom.process({ :source => "wordpress.xml" })'
{% endhighlight %}
<div class="note">
<h5>ProTip™: Wordpress.com Export Tool</h5>
<p markdown="1">If you are migrating from a Wordpress.com account, you can access the export tool at the following URL: `https://YOUR-USER-NAME.wordpress.com/wp-admin/export.php`.</p>
</div>
### Using Wordpress MySQL server connection
If you want to import using a direct connection to the Wordpress MySQL server, here's how:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/wordpress";
JekyllImport::WordPress.process("database", "user", "pass")'
{% endhighlight %}
If you are using Webfaction and have to set up an [SSH
tunnel](http://docs.webfaction.com/user-guide/databases.html?highlight=mysql#starting-an-ssh-tunnel-with-ssh),
be sure to make the hostname (`127.0.0.1`) explicit, otherwise MySQL may block
your access based on `localhost` and `127.0.0.1` not being equivalent in its
authentication system:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/wordpress";
JekyllImport::WordPress.process("database", "user", "pass", "127.0.0.1")'
{% endhighlight %}
### Further Wordpress migration alternatives
While the above methods work, they do not import much of the metadata that is
usually stored in Wordpress posts and pages. If you need to export things like
pages, tags, custom fields, image attachments and so on, the following resources
might be useful to you:
- [Exitwp](https://github.com/thomasf/exitwp) is a configurable tool written in
Python for migrating one or more Wordpress blogs into Jekyll (Markdown) format
while keeping as much metadata as possible. Exitwp also downloads attachments
and pages.
- [A great
article](http://vitobotta.com/how-to-migrate-from-wordpress-to-jekyll/) with a
step-by-step guide for migrating a Wordpress blog to Jekyll while keeping most
of the structure and metadata.
- [wpXml2Jekyll](https://github.com/theaob/wpXml2Jekyll) is an executable
windows application for creating Markdown posts from your Wordpress XML file.
## Drupal
If youre migrating from [Drupal](http://drupal.org), there are two migrators
for you, depending upon your Drupal version:
- [Drupal 6](https://github.com/jekyll/jekyll-import/blob/v0.1.0.beta1/lib/jekyll/jekyll-import/drupal6.rb)
- [Drupal 7](https://github.com/jekyll/jekyll-import/blob/v0.1.0.beta1/lib/jekyll/jekyll-import/drupal7.rb)
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/drupal6";
JekyllImport::Drupal6.process("dbname", "user", "pass")'
# ... or ...
$ ruby -rubygems -e 'require "jekyll/jekyll-import/drupal7";
JekyllImport::Drupal7.process("dbname", "user", "pass")'
{% endhighlight %}
If you are connecting to a different host or need to specify a table prefix for
your database, you may optionally add those two parameters to the end of either
Drupal migrator execution:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/drupal6";
JekyllImport::Drupal6.process("dbname", "user", "pass", "host", "table_prefix")'
# ... or ...
$ ruby -rubygems -e 'require "jekyll/jekyll-import/drupal7";
JekyllImport::Drupal7.process("dbname", "user", "pass", "host", "table_prefix")'
{% endhighlight %}
## Movable Type
To import posts from Movable Type:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/mt";
JekyllImport::MT.process("database", "user", "pass")'
{% endhighlight %}
## Typo
To import posts from Typo:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/typo";
JekyllImport::Typo.process("database", "user", "pass")'
{% endhighlight %}
This code has only been tested with Typo version 4+.
## TextPattern
To import posts from TextPattern:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/textpattern";
JekyllImport::TextPattern.process("database_name", "username", "password", "hostname")'
{% endhighlight %}
You will need to run the above from the parent directory of your `_import`
folder. For example, if `_import` is located in `/path/source/_import`, you will
need to run this code from `/path/source`. The hostname defaults to `localhost`,
all other variables are required. You may need to adjust the code used to filter
entries. Left alone, it will attempt to pull all entries that are live or
sticky.
## Mephisto
To import posts from Mephisto:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/mephisto";
JekyllImport::Mephisto.process("database", "user", "password")'
{% endhighlight %}
If your data is in Postgres, you should do this instead:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/mephisto";
JekyllImport::Mephisto.postgres({:database => "database", :username=>"username", :password =>"password"})'
{% endhighlight %}
## Blogger (Blogspot)
To import posts from Blogger, see [this post about migrating from Blogger to
Jekyll](http://blog.coolaj86.com/articles/migrate-from-blogger-to-jekyll.html). If
that doesnt work for you, you might want to try some of the following
alternatives:
- [@kennym](https://github.com/kennym) created a [little migration
script](https://gist.github.com/1115810), because the solutions in the
previous article didn't work out for him.
- [@ngauthier](https://github.com/ngauthier) created [another
importer](https://gist.github.com/1506614) that imports comments, and does so
via bloggers archive instead of the RSS feed.
- [@juniorz](https://github.com/juniorz) created [yet another
importer](https://gist.github.com/1564581) that works for
[Octopress](http://octopress.org). It is like [@ngauthiers
version](https://gist.github.com/1506614) but separates drafts from posts, as
well as importing tags and permalinks.
## Posterous
To import posts from your primary Posterous blog:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/posterous";
JekyllImport::Posterous.process("my_email", "my_pass")'
{% endhighlight %}
For any other Posterous blog on your account, you will need to specify the
`blog_id` for the blog:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/posterous";
JekyllImport::Posterous.process("my_email", "my_pass", "blog_id")'
{% endhighlight %}
There is also an [alternative Posterous
migrator](https://github.com/pepijndevos/jekyll/blob/patch-1/lib/jekyll/migrators/posterous.rb)
that maintains permalinks and attempts to import images too.
## Tumblr
To import posts from Tumblr:
{% highlight bash %}
$ ruby -rubygems -e 'require "jekyll/jekyll-import/tumblr";
JekyllImport::Tumblr.process(url, format, grab_images, add_highlights, rewrite_urls)'
# url - String: your blog's URL
# format - String: the output file extension. Use "md" to have your content
# converted from HTML to Markdown. Defaults to "html".
# grab_images - Boolean: whether to download images as well. Defaults to false.
# add_highlights - Boolean: whether to wrap code blocks (indented 4 spaces) in a Liquid
"highlight" tag. Defaults to false.
# rewrite_urls - Boolean: whether to write pages that redirect from the old Tumblr paths
to the new Jekyll paths. Defaults to false.
{% endhighlight %}
## Other Systems
If you have a system for which there is currently no migrator, consider writing
one and sending us [a pull request](https://github.com/jekyll/jekyll-import).

View File

@ -3,6 +3,7 @@ layout: docs
title: Creating pages title: Creating pages
prev_section: posts prev_section: posts
next_section: variables next_section: variables
permalink: /docs/pages/
--- ---
In addition to [writing posts](../posts), another thing you may want to do with In addition to [writing posts](../posts), another thing you may want to do with
@ -35,8 +36,8 @@ There are two main ways of creating pages:
- Create a folder in the site's root for each page, and place an index.html file - Create a folder in the site's root for each page, and place an index.html file
in each page folder. in each page folder.
Both methods work fine (and can be used in conjunction with each other), with the Both methods work fine (and can be used in conjunction with each other),
only real difference being the resulting URLs. with the only real difference being the resulting URLs.
### Named HTML files ### Named HTML files

View File

@ -3,6 +3,7 @@ layout: docs
title: Pagination title: Pagination
prev_section: permalinks prev_section: permalinks
next_section: plugins next_section: plugins
permalink: /docs/pagination/
--- ---
With many websites—especially blogs—its very common to break the main listing With many websites—especially blogs—its very common to break the main listing
@ -31,11 +32,24 @@ paginate: 5
The number should be the maximum number of Posts youd like to be displayed per- The number should be the maximum number of Posts youd 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:
{% highlight yaml %}
paginate_path: "blog/page:num"
{% endhighlight %}
This will read in `blog/index.html`, send it each pagination page in Liquid as `paginator`
and write the output to `blog/page:num`, where `:num` is the pagination page number,
starting with `2`. If a site has 12 posts and specifies `paginate: 5`, Jekyll will write
`blog/index.html` with the first 5 posts, `blog/page2/index.html` with the next 5 posts
and `blog/page3/index.html` with the last 2 posts into the destination directory.
## 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
attributes: attributes:
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -102,10 +116,14 @@ attributes:
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
<div class="note info"> <div class="note info">
<h5>Pagination does not support tags or categories</h5> <h5>Pagination does not support tags or categories</h5>
<p>Pagination pages through every post in the <code>posts</code> variable regardless of variables defined in the YAML Front Matter of each. It does not currently allow paging over groups of posts linked by a common tag or category.</p> <p>Pagination pages through every post in the <code>posts</code>
variable regardless of variables defined in the YAML Front Matter of
each. It does not currently allow paging over groups of posts linked
by a common tag or category.</p>
</div> </div>
## Render the paginated Posts ## Render the paginated Posts

View File

@ -3,6 +3,7 @@ layout: docs
title: Permalinks title: Permalinks
prev_section: templates prev_section: templates
next_section: pagination next_section: pagination
permalink: /docs/permalinks/
--- ---
Jekyll supports a flexible way to build your sites URLs. You can specify the Jekyll supports a flexible way to build your sites URLs. You can specify the
@ -17,6 +18,7 @@ permalink is defined as `/:categories/:year/:month/:day/:title.html`.
## Template variables ## Template variables
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -87,9 +89,11 @@ permalink is defined as `/:categories/:year/:month/:day/:title.html`.
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
## Built-in permalink styles ## Built-in permalink styles
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -124,11 +128,13 @@ permalink is defined as `/:categories/:year/:month/:day/:title.html`.
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
## 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.textile`
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -171,3 +177,4 @@ Given a post named: `/2009-04-29-slap-chop.textile`
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>

View File

@ -3,6 +3,7 @@ layout: docs
title: Plugins title: Plugins
prev_section: assets prev_section: assets
next_section: extras next_section: extras
permalink: /docs/plugins/
--- ---
Jekyll has a plugin system with hooks that allow you to create custom generated Jekyll has a plugin system with hooks that allow you to create custom generated
@ -80,6 +81,7 @@ using the `category_index.html` layout.
Generators are only required to implement one method: Generators are only required to implement one method:
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -98,6 +100,7 @@ Generators are only required to implement one method:
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
## Converters ## Converters
@ -139,6 +142,7 @@ end
Converters should implement at a minimum 3 methods: Converters should implement at a minimum 3 methods:
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -178,6 +182,7 @@ Converters should implement at a minimum 3 methods:
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
In our example, `UpcaseConverter#matches` checks if our filename extension is In our example, `UpcaseConverter#matches` checks if our filename extension is
`.upcase`, and will render using the converter if it is. It will call `.upcase`, and will render using the converter if it is. It will call
@ -212,6 +217,7 @@ Liquid::Template.register_tag('render_time', Jekyll::RenderTimeTag)
At a minimum, liquid tags must implement: At a minimum, liquid tags must implement:
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -230,6 +236,7 @@ At a minimum, liquid tags must implement:
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
You must also register the custom tag with the Liquid template engine as You must also register the custom tag with the Liquid template engine as
follows: follows:
@ -286,6 +293,7 @@ Liquid::Template.register_filter(Jekyll::AssetFilter)
There are two flags to be aware of when writing a plugin: There are two flags to be aware of when writing a plugin:
<div class="mobile-side-scroller">
<table> <table>
<thead> <thead>
<tr> <tr>
@ -325,6 +333,7 @@ There are two flags to be aware of when writing a plugin:
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
To use one of the example plugins above as an illustration, here is how youd To use one of the example plugins above as an illustration, here is how youd
specify these two flags: specify these two flags:
@ -344,13 +353,12 @@ end
There are a few useful, prebuilt plugins at the following locations: There are a few useful, prebuilt plugins at the following locations:
- [Truncate HTML while preserving markup structure](https://github.com/MattHall/truncatehtml) by [Matt Hall](http://codebeef.com) - [Truncate HTML while preserving markup structure](https://github.com/MattHall/truncatehtml) by [Matt Hall](http://codebeef.com)
- [Generic Blog Plugins by Jose Diaz-Gonzalez](https://github.com/josegonzalez/josediazgonzalez.com/tree/master/_plugins): Contains plugins for tags, categories, archives, as well as a few Liquid extensions
- [Domain Name Filter by Lawrence Woodman](https://github.com/LawrenceWoodman/domain_name-liquid_filter): Filters the input text so that just the domain name is left - [Domain Name Filter by Lawrence Woodman](https://github.com/LawrenceWoodman/domain_name-liquid_filter): Filters the input text so that just the domain name is left
- [Jekyll Plugins by Recursive Design](http://recursive-design.com/projects/jekyll-plugins/): Plugin to generate Project pages from GitHub readmes, a Category page plugin, and a Sitemap generator - [Jekyll Plugins by Recursive Design](http://recursive-design.com/projects/jekyll-plugins/): Plugin to generate Project pages from GitHub readmes, a Category page plugin, and a Sitemap generator
- [Tag Cloud Plugin from a Jekyll walk-through](http://vitobotta.com/how-to-migrate-from-wordpress-to-jekyll/): Plugin to generate a tag cloud
- [Pygments Cache Path by Raimonds Simanovskis](https://github.com/rsim/blog.rayapps.com/blob/master/_plugins/pygments_cache_patch.rb): Plugin to cache syntax-highlighted code from Pygments - [Pygments Cache Path by Raimonds Simanovskis](https://github.com/rsim/blog.rayapps.com/blob/master/_plugins/pygments_cache_patch.rb): Plugin to cache syntax-highlighted code from Pygments
- [Delicious Plugin by Christian Hellsten](https://github.com/christianhellsten/jekyll-plugins): Fetches and renders bookmarks from delicious.com. - [Delicious Plugin by Christian Hellsten](https://github.com/christianhellsten/jekyll-plugins): Fetches and renders bookmarks from delicious.com.
- [Ultraviolet plugin by Steve Alex](https://gist.github.com/480380): Jekyll Plugin for Ultraviolet - [Ultraviolet plugin by Steve Alex](https://gist.github.com/480380): Jekyll Plugin for Ultraviolet
- [Jade plugin by John Papandriopoulos](https://github.com/snappylabs/jade-jekyll-plugin): Jade Converter plugin for Jekyll
- [HAML plugin by Sam Z](https://gist.github.com/517556): HAML plugin for jekyll - [HAML plugin by Sam Z](https://gist.github.com/517556): HAML plugin for jekyll
- [ArchiveGenerator by Ilkka Laukkanen](https://gist.github.com/707909): Uses [this archive page](https://gist.github.com/707020) to generate archives - [ArchiveGenerator by Ilkka Laukkanen](https://gist.github.com/707909): Uses [this archive page](https://gist.github.com/707020) to generate archives
- [Tag Cloud Plugin by Ilkka Laukkanen](https://gist.github.com/710577): Jekyll tag cloud / tag pages plugin - [Tag Cloud Plugin by Ilkka Laukkanen](https://gist.github.com/710577): Jekyll tag cloud / tag pages plugin
@ -374,18 +382,18 @@ There are a few useful, prebuilt plugins at the following locations:
- [CoffeeScript converter by phaer](https://gist.github.com/959938): Put this file in `plugins` and write a YAML header to your .coffee files. See [http://coffeescript.org](http://coffeescript.org) for more info - [CoffeeScript converter by phaer](https://gist.github.com/959938): Put this file in `plugins` and write a YAML header to your .coffee files. See [http://coffeescript.org](http://coffeescript.org) for more info
- [Raw Tag by phaer.](https://gist.github.com/1020852): Keeps liquid from parsing text betweeen `{{ "{% raw " }}%}` and `{{ "{% endraw " }}%}` - [Raw Tag by phaer.](https://gist.github.com/1020852): Keeps liquid from parsing text betweeen `{{ "{% raw " }}%}` and `{{ "{% endraw " }}%}`
- [URL encoding by James An](https://gist.github.com/919275) - [URL encoding by James An](https://gist.github.com/919275)
- [Sitemap.xml Generator by Michael Levin](http://www.kinnetica.com/projects/jekyll-sitemap-generator/) - [Sitemap.xml Generator by Michael
- [Markdown references by Olov Lassus](https://gist.github.com/961336): Keep all your markdown reference-style link definitions in one file (_references.md) Levin](https://github.com/kinnetica/jekyll-plugins)
- [Markdown references by Olov Lassus](https://github.com/olov/jekyll-references): Keep all your markdown reference-style link definitions in one file (_references.md)
- [Full-text search by Pascal Widdershoven](https://github.com/PascalW/jekyll_indextank): Add full-text search to your Jekyll site with this plugin and a bit of JavaScript. - [Full-text search by Pascal Widdershoven](https://github.com/PascalW/jekyll_indextank): Add full-text search to your Jekyll site with this plugin and a bit of JavaScript.
- [Stylus Converter](https://gist.github.com/988201) Convert .styl to .css. - [Stylus Converter](https://gist.github.com/988201) Convert .styl to .css.
- [Embed.ly client by Robert Böhnke](https://github.com/robb/jekyll-embedly-client) Autogenerate embeds from URLs using oEmbed. - [Embed.ly client by Robert Böhnke](https://github.com/robb/jekyll-embedly-client) Autogenerate embeds from URLs using oEmbed.
- [Logarithmic Tag Cloud](https://gist.github.com/2290195): Flexible. Logarithmic distribution. Usage eg: `{{ "{% tag_cloud font-size: 50 - 150%, threshold: 2 " }}%}`. Documentation inline. - [Logarithmic Tag Cloud](https://gist.github.com/2290195): Flexible. Logarithmic distribution. Documentation inline.
- [Related Posts by Lawrence Woodman](https://github.com/LawrenceWoodman/related_posts-jekyll_plugin): Overrides `site.related_posts` to use categories to assess relationship - [Related Posts by Lawrence Woodman](https://github.com/LawrenceWoodman/related_posts-jekyll_plugin): Overrides `site.related_posts` to use categories to assess relationship
- [AliasGenerator by Thomas Mango](https://github.com/tsmango/jekyll_alias_generator): Generates redirect pages for posts when an alias configuration is specified in the YAML Front Matter. - [AliasGenerator by Thomas Mango](https://github.com/tsmango/jekyll_alias_generator): Generates redirect pages for posts when an alias configuration is specified in the YAML Front Matter.
- [FlickrSetTag by Thomas Mango](https://github.com/tsmango/jekyll_flickr_set_tag): Generates image galleries from Flickr sets. - [FlickrSetTag by Thomas Mango](https://github.com/tsmango/jekyll_flickr_set_tag): Generates image galleries from Flickr sets.
- [Projectlist by Frederic Hemberger](https://github.com/fhemberger/jekyll-projectlist): Loads all files from a directory and renders the entries into a single page, instead of creating separate posts. - [Projectlist by Frederic Hemberger](https://github.com/fhemberger/jekyll-projectlist): Loads all files from a directory and renders the entries into a single page, instead of creating separate posts.
- [Tiered Archives by Eli Naeher](https://gist.github.com/88cda643aa7e3b0ca1e5): creates a tiered template variable that allows you to create archives grouped by year and month. - [Tiered Archives by Eli Naeher](https://gist.github.com/88cda643aa7e3b0ca1e5): creates a tiered template variable that allows you to create archives grouped by year and month.
- [Jammit generator by Vladimir Andrijevik](https://gist.github.com/1224971): enables use of [Jammit](http://documentcloud.github.com/jammit/) for JavaScript and CSS packaging.
- [oEmbed Tag by Tammo van Lessen](https://gist.github.com/1455726): enables easy content embedding (e.g. from YouTube, Flickr, Slideshare) via oEmbed. - [oEmbed Tag by Tammo van Lessen](https://gist.github.com/1455726): enables easy content embedding (e.g. from YouTube, Flickr, Slideshare) via oEmbed.
- [Company website and blog plugins](https://github.com/flatterline/jekyll-plugins) by Flatterline, a [Ruby on Rails development company](http://flatterline.com/): portfolio/project page generator, team/individual page generator, author bio liquid template tag for use on posts and a few other smaller plugins. - [Company website and blog plugins](https://github.com/flatterline/jekyll-plugins) by Flatterline, a [Ruby on Rails development company](http://flatterline.com/): portfolio/project page generator, team/individual page generator, author bio liquid template tag for use on posts and a few other smaller plugins.
- [Transform Layouts](https://gist.github.com/1472645) Monkey patching allowing HAML layouts (you need a HAML Converter plugin for this to work) - [Transform Layouts](https://gist.github.com/1472645) Monkey patching allowing HAML layouts (you need a HAML Converter plugin for this to work)
@ -395,11 +403,11 @@ There are a few useful, prebuilt plugins at the following locations:
- [jekyll-rendering](https://github.com/blackwinter/jekyll-rendering): Jekyll plugin to provide alternative rendering engines. - [jekyll-rendering](https://github.com/blackwinter/jekyll-rendering): Jekyll plugin to provide alternative rendering engines.
- [jekyll-pagination](https://github.com/blackwinter/jekyll-pagination): Jekyll plugin to extend the pagination generator. - [jekyll-pagination](https://github.com/blackwinter/jekyll-pagination): Jekyll plugin to extend the pagination generator.
- [jekyll-tagging](https://github.com/pattex/jekyll-tagging): Jekyll plugin to automatically generate a tag cloud and tag pages. - [jekyll-tagging](https://github.com/pattex/jekyll-tagging): Jekyll plugin to automatically generate a tag cloud and tag pages.
- [jekyll-contentblocks](https://github.com/rustygeldmacher/jekyll-contentblocks): Lets you use Rails-like content_for tags in your templates, for passing content from your posts up to your layouts.
- [Generate YouTube Embed (tag)](https://gist.github.com/1805814) by [joelverhagen](https://github.com/joelverhagen): Jekyll plugin which allows you to embed a YouTube video in your page with the YouTube ID. Optionally specify width and height dimensions. Like “oEmbed Tag” but just for YouTube. - [Generate YouTube Embed (tag)](https://gist.github.com/1805814) by [joelverhagen](https://github.com/joelverhagen): Jekyll plugin which allows you to embed a YouTube video in your page with the YouTube ID. Optionally specify width and height dimensions. Like “oEmbed Tag” but just for YouTube.
- [JSON Filter](https://gist.github.com/1850654) by [joelverhagen](https://github.com/joelverhagen): filter that takes input text and outputs it as JSON. Great for rendering JavaScript. - [JSON Filter](https://gist.github.com/1850654) by [joelverhagen](https://github.com/joelverhagen): filter that takes input text and outputs it as JSON. Great for rendering JavaScript.
- [jekyll-beastiepress](https://github.com/okeeblow/jekyll-beastiepress): FreeBSD utility tags for Jekyll sites. - [jekyll-beastiepress](https://github.com/okeeblow/jekyll-beastiepress): FreeBSD utility tags for Jekyll sites.
- [jsonball](https://gist.github.com/1895282): reads json files and produces maps for use in jekylled files - [jsonball](https://gist.github.com/1895282): reads json files and produces maps for use in jekylled files
- [redcarpet2](https://github.com/nono/Jekyll-plugins): use Redcarpet2 for rendering markdown
- [bibjekyll](https://github.com/pablooliveira/bibjekyll): render BibTeX-formatted bibliographies/citations included in posts/pages using bibtex2html - [bibjekyll](https://github.com/pablooliveira/bibjekyll): render BibTeX-formatted bibliographies/citations included in posts/pages using bibtex2html
- [jekyll-citation](https://github.com/archome/jekyll-citation): render BibTeX-formatted bibliographies/citations included in posts/pages (pure Ruby) - [jekyll-citation](https://github.com/archome/jekyll-citation): render BibTeX-formatted bibliographies/citations included in posts/pages (pure Ruby)
- [jekyll-scholar](https://github.com/inukshuk/jekyll-scholar): Jekyll extensions for the blogging scholar - [jekyll-scholar](https://github.com/inukshuk/jekyll-scholar): Jekyll extensions for the blogging scholar
@ -409,14 +417,24 @@ There are a few useful, prebuilt plugins at the following locations:
- [refheap_tag](https://github.com/aburdette/refheap_tag): Liquid tag that allows embedding pastes from [refheap](https://refheap.com) - [refheap_tag](https://github.com/aburdette/refheap_tag): Liquid tag that allows embedding pastes from [refheap](https://refheap.com)
- [i18n_filter](https://github.com/gacha/gacha.id.lv/blob/master/_plugins/i18n_filter.rb): Liquid filter to use I18n localization. - [i18n_filter](https://github.com/gacha/gacha.id.lv/blob/master/_plugins/i18n_filter.rb): Liquid filter to use I18n localization.
- [singlepage-jekyll](https://github.com/JCB-K/singlepage-jekyll) by [JCB-K](https://github.com/JCB-K): turns Jekyll into a dynamic one-page website. - [singlepage-jekyll](https://github.com/JCB-K/singlepage-jekyll) by [JCB-K](https://github.com/JCB-K): turns Jekyll into a dynamic one-page website.
- [flickr](http://jonasforsberg.se/2012/04/15/flickr-plugin-for-jekyll/): Embed photos from flickr right into your posts. - [flickr](https://github.com/reagent/fleakr): Embed photos from flickr right into your posts.
- [jekyll-devonly_tag](https://gist.github.com/2403522): A block tag for including markup only during development. - [jekyll-devonly_tag](https://gist.github.com/2403522): A block tag for including markup only during development.
- [Jekyll plugins by Aucor](https://github.com/aucor/jekyll-plugins): Plugins for eg. trimming unwanted newlines/whitespace and sorting pages by weight attribute. - [Jekyll plugins by Aucor](https://github.com/aucor/jekyll-plugins): Plugins for eg. trimming unwanted newlines/whitespace and sorting pages by weight attribute.
- [Only first paragraph](https://github.com/sebcioz/jekyll-only_first_p): Show only first paragrpaph of page/post.
- [jekyll-pandoc-plugin](https://github.com/dsanson/jekyll-pandoc-plugin): use pandoc for rendering markdown. - [jekyll-pandoc-plugin](https://github.com/dsanson/jekyll-pandoc-plugin): use pandoc for rendering markdown.
- [File compressor](https://gist.github.com/2758691) by [mytharcher](https://github.com/mytharcher): Compress HTML (\*.html) and JavaScript(\*.js) files when output. - [File compressor](https://gist.github.com/2758691) by [mytharcher](https://github.com/mytharcher): Compress HTML (\*.html) and JavaScript(\*.js) files when output.
- [smilify](https://github.com/SaswatPadhi/jekyll_smilify) by [SaswatPadhi](https://github.com/SaswatPadhi): Convert text emoticons in your content to themeable smiley pics. [Demo](http://saswatpadhi.github.com/) - [smilify](https://github.com/SaswatPadhi/jekyll_smilify) by [SaswatPadhi](https://github.com/SaswatPadhi): Convert text emoticons in your content to themeable smiley pics. [Demo](http://saswatpadhi.github.com/)
- [excerpts](http://blog.darkrefraction.com/2012/jekyll-excerpt-plugin.html) by [drawoc](https://github.com/drawoc): provides a nice way to implement page excerpts. - [jekyll-minibundle](https://github.com/tkareine/jekyll-minibundle): Asset bundling and cache busting using external minification tool of your choice, no gem dependencies.
- [JekyllGalleryTag](https://github.com/redwallhp/JekyllGalleryTag) by [redwallhp](https://github.com/redwallhp): Generates thumbnails from a directory of images and displays them in a grid with a Liquid tag.
- [Read in X Minutes](https://gist.github.com/zachleat/5792681) by [zachleat](https://github.com/zachleat): Estimates the reading time of a string (use for blog post content).
- [jekyll-assets](http://ixti.net/jekyll-assets/) by [ixti](https://github.com/ixti): Rails-alike assets pipeline (write assets in CoffeeScript, SASS, LESS etc; specify dependencies for automatic bundling using simple declarative comments in assets; minify and compress; use JST templates; cache bust; and many-many more).
- [jekyll-pandoc-multiple-formats](https://github.com/fauno/jekyll-pandoc-multiple-formats)
by [edsl](https://github.com/edsl): Use pandoc to generate your site in
multiple formats plus support for pandoc's markdown extensions.
- [Youku and Tudou Embed](https://gist.github.com/Yexiaoxing/5891929): Liquid plugin for
embedding Youku and Tudou videos
- [jekyll-timeago](https://github.com/markets/jekyll-timeago): Time-ago Liquid filter
- [jekyll-swfobject](https://github.com/sectore/jekyll-swfobject): Liquid plugin for embedding Adobe Flash files (`*.swf`) using [SWFObject](http://code.google.com/p/swfobject/)
- [Jekyll Picture Tag](https://github.com/robwierzbowski/jekyll-picture-tag): Easy responsive images for Jekyll. Based on the proposed [`<picture>`](http://picture.responsiveimages.org/) element, polyfilled with Scott Jelh's [Picturefill](https://github.com/scottjehl/picturefill).
<div class="note info"> <div class="note info">
<h5>Jekyll Plugins Wanted</h5> <h5>Jekyll Plugins Wanted</h5>

View File

@ -3,6 +3,7 @@ layout: docs
title: Writing posts title: Writing posts
prev_section: frontmatter prev_section: frontmatter
next_section: pages next_section: pages
permalink: /docs/posts/
--- ---
One of Jekylls best aspects is that it is “blog aware”. What does this mean, One of Jekylls best aspects is that it is “blog aware”. What does this mean,
@ -95,7 +96,7 @@ Linking to a PDF for readers to download:
Its all well and good to have posts in a folder, but a blog is no use unless Its all well and good to have posts in a folder, but a blog is no use unless
you have a list of posts somewhere. Creating an index of posts on another page you have a list of posts somewhere. Creating an index of posts on another page
(or in a [template](../templates)) is easy, thanks to the [Liquid template (or in a [template](../templates)) is easy, thanks to the [Liquid template
language](http://liquidmarkup.org/) and its tags. Heres a basic example of how language](http://wiki.shopify.com/Liquid) and its tags. Heres a basic example of how
to create a list of links to your blog posts: to create a list of links to your blog posts:
{% highlight html %} {% highlight html %}
@ -112,11 +113,33 @@ Of course, you have full control over how (and where) you display your posts,
and how you structure your site. You should read more about [how templates and how you structure your site. You should read more about [how templates
work](../templates) with Jekyll if you want to know more. work](../templates) with Jekyll if you want to know more.
## Post excerpts
Each post automatically takes the first block of text, from the beginning of the content
to the first occurrence of `excerpt_separator`, and sets it as the `post.excerpt`.
Take the above example of an index of posts. Perhaps you want to include
a little hint about the post's content by adding the first paragraph of each of your
posts:
{% highlight html %}
<ul>
{% raw %}{% for post in site.posts %}{% endraw %}
<li>
<a href="{% raw %}{{ post.url }}{% endraw %}">{% raw %}{{ post.title }}{% endraw %}</a>
<p>{% raw %}{{ post.excerpt }}{% endraw %}</p>
</li>
{% raw %}{% endfor %}{% endraw %}
</ul>
{% endhighlight %}
If you don't like the automatically-generated post excerpt, it can be overridden by adding
`excerpt` to your post's YAML front-matter.
## Highlighting code snippets ## Highlighting code snippets
Jekyll also has built-in support for syntax highlighting of code snippets using Jekyll also has built-in support for syntax highlighting of code snippets using
[Pygments](../extras), and including a code snippet in any post is easy. Just Pygments, and including a code snippet in any post is easy. Just use the
use the dedicated Liquid tag as follows: dedicated Liquid tag as follows:
{% highlight text %} {% highlight text %}
{% raw %}{% highlight ruby %}{% endraw %} {% raw %}{% highlight ruby %}{% endraw %}

27
site/docs/quickstart.md Normal file
View File

@ -0,0 +1,27 @@
---
layout: docs
title: Quick-start guide
prev_section: home
next_section: installation
permalink: /docs/quickstart/
---
For the impatient, here's how to get a boilerplate Jekyll site up and running.
{% highlight bash %}
~ $ gem install jekyll
~ $ jekyll new myblog
~ $ cd myblog
~/myblog $ jekyll serve
# => Now browse to http://localhost:4000
{% endhighlight %}
That's nothing, though. The real magic happens when you start creating blog
posts, using the front-matter to control templates and layouts, and taking
advantage of all the awesome configuration options Jekyll makes available.
<div class="note info">
<h5>Redcarpet is the default Markdown engine for new sites</h5>
<p>In Jekyll 1.1, we switched the default markdown engine for sites
generated with <code>jekyll new</code> to Redcarpet</p>
</div>

View File

@ -2,16 +2,14 @@
layout: docs layout: docs
title: Resources title: Resources
prev_section: sites prev_section: sites
next_section: upgrading
permalink: /docs/resources/
--- ---
Jekylls growing use is producing a wide variety of tutorials, frameworks, extensions, examples, and other resources that can be very helpful. Below is a collection of links to some of the most popular Jekyll resources. Jekylls growing use is producing a wide variety of tutorials, frameworks, extensions, examples, and other resources that can be very helpful. Below is a collection of links to some of the most popular Jekyll resources.
### Jekyll tips & tricks, and examples ### Jekyll tips & tricks, and examples
- [A simple way to add draft posts](https://gist.github.com/2870636)
No plugins required.
- [Tips for working with GitHub Pages Integration](https://gist.github.com/2890453) - [Tips for working with GitHub Pages Integration](https://gist.github.com/2890453)
Code example reuse, and keeping documentation up to date. Code example reuse, and keeping documentation up to date.
@ -28,7 +26,6 @@ Jekylls growing use is producing a wide variety of tutorials, frameworks, ext
#### Integrating Jekyll with Git #### Integrating Jekyll with Git
- [Blogging with Git, Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) - [Blogging with Git, Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/)
- [Using Git to maintain your blog](http://matedriven.com.ar/2009/04/28/using-git-to-maintain-your-blog.html) (step by step guide)
#### Other hacks #### Other hacks
@ -44,6 +41,6 @@ Jekylls growing use is producing a wide variety of tutorials, frameworks, ext
- [Jekyll Extensions -= Pain](http://rfelix.com/2010/01/19/jekyll-extensions-minus-equal-pain/) - [Jekyll Extensions -= Pain](http://rfelix.com/2010/01/19/jekyll-extensions-minus-equal-pain/)
A way to [extend Jekyll](http://github.com/rfelix/jekyll_ext) without forking and modifying the Jekyll gem codebase and some [portable Jekyll extensions](http://wiki.github.com/rfelix/jekyll_ext/extensions) that can be reutilized and shared. A way to [extend Jekyll](http://github.com/rfelix/jekyll_ext) without forking and modifying the Jekyll gem codebase and some [portable Jekyll extensions](http://wiki.github.com/rfelix/jekyll_ext/extensions) that can be reused and shared.
- [Using your Rails layouts in Jekyll](http://numbers.brighterplanet.com/2010/08/09/sharing-rails-views-with-jekyll) - [Using your Rails layouts in Jekyll](http://numbers.brighterplanet.com/2010/08/09/sharing-rails-views-with-jekyll)

Some files were not shown because too many files have changed in this diff Show More