Codebase list jekyll / 3b62e27
Imported Upstream version 2.2.0+dfsg Signed-off-by: Youhei SASAKI <uwabami@gfd-dennou.org> Youhei SASAKI 9 years ago
252 changed file(s) with 11674 addition(s) and 4736 deletion(s). Raw diff Collapse all Expand all
0 Gemfile.lock
1 test/dest
2 *.gem
3 pkg/
4 *.swp
5 *~
6 _site/
7 .bundle/
8 .DS_Store
9 bbin/
10 gh-pages/
11 site/_site/
12 coverage
13 .ruby-version
14 .sass-cache
0 language: ruby
1 cache: bundler
2 install:
3 - script/rebund download
4 - travis_retry bundle install --path vendor/bundle
5 rvm:
6 - 2.1
7 - 2.0
8 - 1.9.3
9 script: script/cibuild
10 after_script:
11 - script/rebund upload
12 notifications:
13 irc:
14 on_success: change
15 on_failure: change
16 channels:
17 - irc.freenode.org#jekyll
18 template:
19 - '%{repository}#%{build_number} (%{branch}) %{message} %{build_url}'
20 email:
21 on_success: never
22 on_failure: never
23 env:
24 global:
25 - secure: bt5nglPTdsc0N5fB1dOJz2WbM81dGpDuVD8PnhEsxgUfoo6xavhU4+pNrUADlSUqQ1aJrdU+MKW4x+JZ2ZnJS8vOpNzRymuMZSbFaljK4pgFGiKFgBdMKxVikvoYcxKCjLAl7NJZ11W6hUw+JtJScClDZwrJJAQB6I7Isp/LsdM=
26 - secure: Ym8nx7nbfGYGo47my92M+deJykaiMkdZdb615EO51liv/xy/0aQ919Jpfieugc9d3zVnm+zFGPbpv4YzRpsik6OlVBNa4lP+BnQ27ptf5YcLWD8Hksi7845WFLecXMoaTCoYer/TvYZsIWJb2nSDMH9qbfZhnd1YZKuvUpK0rEU=
33 So you've got an awesome idea to throw into Jekyll. Great! Please keep the
44 following in mind:
55
6 * **Contributions will not be accepted without tests.**
6 * **Contributions will not be accepted without tests or necessary documentation updates.**
77 * If you're creating a small fix or patch to an existing feature, just a simple
88 test will do. Please stay in the confines of the current test suite and use
9 [Shoulda](http://github.com/thoughtbot/shoulda/tree/master) and
10 [RR](http://github.com/btakita/rr/tree/master).
9 [Shoulda](https://github.com/thoughtbot/shoulda/tree/master) and
10 [RR](https://github.com/rr/rr).
1111 * If it's a brand new feature, make sure to create a new
1212 [Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps
1313 where appropriate. Also, whipping up some documentation in your fork's `site`
5252 * Make sure everything still passes by running `rake`.
5353 * If necessary, rebase your commits into logical chunks, without errors.
5454 * Push the branch up ( `git push origin my_awesome_feature` ).
55 * Create a pull request against mojombo/jekyll and describe what your change
55 * Create a pull request against jekyll/jekyll and describe what your change
5656 does and the why you think it should be merged.
5757
5858 Updating Documentation
6262 open-sourced our docs and we welcome any pull requests if you find it
6363 lacking.
6464
65 You can find the documentation for jekyllrb.com in the
66 [site](https://github.com/mojombo/jekyll/tree/master/site) directory of
65 You can find the documentation for jekyllrb.com in the
66 [site](https://github.com/jekyll/jekyll/tree/master/site) directory of
6767 Jekyll's repo on GitHub.com.
6868
6969 All documentation pull requests should be directed at `master`. Pull
70 requests directed at another branch will not be accepted.
70 requests directed at another branch will not be accepted.
7171
72 The [Jekyll wiki](https://github.com/mojombo/jekyll/wiki) on GitHub
72 The [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) on GitHub
7373 can be freely updated without a pull request as all GitHub users have access.
7474
7575 Gotchas
7777
7878 * If you want to bump the gem version, please put that in a separate commit.
7979 This way, the maintainers can control when the gem gets released.
80 * Try to keep your patch(es) based from the latest commit on mojombo/jekyll.
80 * Try to keep your patch(es) based from the latest commit on jekyll/jekyll.
8181 The easier it is to apply your work, the less work the maintainers have to do,
8282 which is always a good thing.
8383 * Please don't tag your GitHub issue with [fix], [feature], etc. The maintainers
99
1010 ### Site Enhancements
1111
12 ## 2.2.0 / 2014-07-29
13
14 ### Minor Enhancements
15
16 * Throw a warning if the specified layout does not exist (#2620)
17 * Whitelist Pygments options in safe mode (#2642)
18
19 ### Bug Fixes
20
21 * Remove unnecessary `Jekyll::Tags::IncludeTag#blank?` method (#2625)
22 * Categories in the path are ignored (#2633)
23
24 ### Development Fixes
25
26 * Refactoring Errors & Requires of Third-Party stuff (#2591)
27 * Add further tests for categories (#2584)
28 * Proof site with html-proofer on change (#2605)
29 * Fix up bug in #2605 which caused proofing the site not to function (#2608)
30 * Use `bundle exec` in `script/proof` (#2610)
31
32 ### Site Enhancements
33
34 * Update Kramdown urls (#2588)
35 * Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of
36 third-party plugins (#2596)
37 * Fix a bunch of broken links in the site (#2601)
38 * Replace dead links with working links (#2611)
39 * Add jekyll-hook to deployment methods (#2617)
40 * Added kramdown-with-pygments plugin to the list of third-party plugins (#2623)
41 * Update outdated "Extras" page and remove duplicate documentation (#2622)
42 * Add co2 plugin to list of third-party plugins (#2639)
43 * Attempt to clarify the way Sass imports happen (#2642)
44
45 ## 2.1.1 / 2014-07-01
46
47 ### Bug Fixes
48
49 * Patch read vulnerabilities for data & confirm none for layouts (#2563)
50 * Update Maruku dependency to allow use of the latest version (#2576)
51 * Remove conditional assignment from document URL to prevent stale urls (#2575)
52
53 ### Site Enhancements
54
55 * Add vertical margin to `highlight` to separate code blocks (#2558)
56 * Add `html_pages` to Variables docs (#2567)
57 * Fixed broken link to Permalinks page (#2572)
58 * Update link to Windows installation guide (#2578)
59
60 ## 2.1.0 / 2014-06-28
61
62 ### Minor Enhancements
63
64 * Bump to the latest Liquid version, 2.6.1 (#2495)
65 * Add support for JSON files in the `_data` directory (#2369)
66 * Allow subclasses to override `EXCERPT_ATTRIBUTES_FOR_LIQUID` (#2408)
67 * Add `Jekyll.env` and `jekyll.environment` (the Liquid var) (#2417)
68 * Use `_config.yaml` or `_config.yml` (`.yml` takes precedence) (#2406)
69 * Override collection url template (#2418)
70 * Allow subdirectories in `_data` (#2395)
71 * Extract Pagination Generator into gem: `jekyll-paginate` (#2455)
72 * Utilize `date_to_rfc822` filter in site template (#2437)
73 * Add categories, last build datetime, and generator to site template
74 feed (#2438)
75 * Configurable, replaceable Logger-compliant logger (#2444)
76 * Extract `gist` tag into a separate gem (#2469)
77 * Add `collection` attribute to `Document#to_liquid` to access the
78 document's collection label. (#2436)
79 * Upgrade listen to `2.7.6 <= x < 3.0.0` (#2492)
80 * Allow configuration of different Twitter and GitHub usernames in site template (#2485)
81 * Bump Pygments to v0.6.0 (#2504)
82 * Front-matter defaults for documents in collections (#2419)
83 * Include files with a url which ends in `/` in the `site.html_pages` list (#2524)
84 * Make `highlight` tag use `language-` prefix in CSS class (#2511)
85 * Lookup item property via `item#to_liquid` before `#data` or `#[]` in filters (#2493)
86 * Skip initial build of site on serve with flag (#2477)
87 * Add support for `hl_lines` in `highlight` tag (#2532)
88 * Spike out `--watch` flag into a separate gem (#2550)
89
90 ### Bug Fixes
91
92 * Liquid `sort` filter should sort even if one of the values is `nil` (#2345)
93 * Remove padding on `pre code` in the site template CSS (#2383)
94 * Set `log_level` earlier to silence info level configuration output (#2393)
95 * Only list pages which have `title` in site template (#2411)
96 * Accept `Numeric` values for dates, not `Number` values (#2377)
97 * Prevent code from overflowing container in site template (#2429)
98 * Encode URLs in UTF-8 when escaping and unescaping (#2420)
99 * No Layouts or Liquid for Asset Files (#2431)
100 * Allow front-matter defaults to set post categories (#2373)
101 * Fix command in subcommand deprecation warning (#2457)
102 * Keep all parent directories of files/dirs in `keep_files` (#2458)
103 * When using RedCarpet and Rouge without Rouge installed, fixed erroneous
104 error which stated that redcarpet was missing, not rouge. (#2464)
105 * Ignore *all* directories and files that merit it on auto-generation (#2459)
106 * Before copying file, explicitly remove the old one (#2535)
107 * Merge file system categories with categories from YAML. (#2531)
108 * Deep merge front matter defaults (#2490)
109 * Ensure exclude and include arrays are arrays of strings (#2542)
110 * Allow collections to have dots in their filenames (#2552)
111 * Collections shouldn't try to read in directories as files (#2552)
112 * Be quiet very quickly. (#2520)
113
114 ### Development Fixes
115
116 * Test Ruby 2.1.2 instead of 2.1.1 (#2374)
117 * Add test for sorting UTF-8 characters (#2384)
118 * Use `https` for GitHub links in documentation (#2470)
119 * Remove coverage reporting with Coveralls (#2494)
120 * Fix a bit of missing TomDoc to `Jekyll::Commands::Build#build` (#2554)
121
122 ### Site Enhancements
123
124 * Set `timezone` to `America/Los_Angeles` (#2394)
125 * Improve JavaScript in `anchor_links.html` (#2368)
126 * Remove note on Quickstart page about default markdown converter (#2387)
127 * Remove broken link in extras.md to a Maruku fork (#2401)
128 * Update Font Awesome to v4.1.0. (#2410)
129 * Fix broken link on Installation page to Templates page (#2421)
130 * Prevent table from extending parent width in permalink style table (#2424)
131 * Add collections to info about pagination support (#2389)
132 * Add `jekyll_github_sample` plugin to list of third-party plugins (#2463)
133 * Clarify documentation around front-matter defaults and add details
134 about defaults for collections. (#2439)
135 * Add Jekyll Project Version Tag to list of third-party plugins (#2468)
136 * Use `https` for GitHub links across whole site (#2470)
137 * Add StickerMule + Jekyll post (#2476)
138 * Add Jekyll Asset Pipeline Reborn to list of third-party plugins (#2479)
139 * Add link to jekyll-compress-html to list of third-party plugins (#2514)
140 * Add Piwigo Gallery to list of third-party plugins (#2526)
141 * Set `show_drafts` to `false` in default configuration listing (#2536)
142 * Provide an updated link for Windows installation instructions (#2544)
143 * Remove `url` from configuration docs (#2547)
144 * Documentation for Continuous Integration for your Jekyll Site (#2432)
145
146 ## 2.0.3 / 2014-05-08
147
148 ### Bug Fixes
149
150 * Properly prefix links in site template with URL or baseurl depending upon
151 need. (#2319)
152 * Update gist tag comments and error message to require username (#2326)
153 * Fix `permalink` setting in site template (#2331)
154 * Don't fail if any of the path objects are nil (#2325)
155 * Instantiate all descendants for converters and generators, not just
156 direct subclasses (#2334)
157 * Replace all instances of `site.name` with `site.title` in site template (#2324)
158 * `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form (#2339)
159 * Use `item_property` for `where` filter so it doesn't break on collections (#2359)
160 * Rescue errors thrown so `--watch` doesn't fail (#2364)
161
162 ### Site Enhancements
163
164 * Add missing "as" to assets docs page (#2337)
165 * Update docs to reflect new `baseurl` default (#2341)
166 * Add links to headers who have an ID. (#2342)
167 * Use symbol instead of HTML number in `upgrading.md` (#2351)
168 * Fix link to frontmatter defaults docs (#2353)
169 * Fix for `History.markdown` in order to fix history page in docs (#2363)
170
171 ## 2.0.2 / 2014-05-07
172
173 ### Bug Fixes
174
175 * Correct use of `url` and `baseurl` in the site template. (#2317)
176 * Default `baseurl` to `""` (#2317)
177
178 ### Site Enhancements
179
180 * Correct docs for the `gist` plugin so it always includes the username. (#2314)
181 * Clarify new (defaults, `where` filter) features in docs (#2316)
182
183 ## 2.0.1 / 2014-05-06
184
185 ### Bug Fixes
186
187 * Require `kramdown` gem instead of `maruku` gem
188
189 ## 2.0.0 / 2014-05-06
190
191 ### Major Enhancements
192 * Add "Collections" feature (#2199)
193 * Add gem-based plugin whitelist to safe mode (#1657)
194 * Replace the commander command line parser with a more robust
195 solution for our needs called `mercenary` (#1706)
196 * Remove support for Ruby 1.8.x (#1780)
197 * Move to jekyll/jekyll from mojombo/jekyll (#1817)
198 * Allow custom markdown processors (#1872)
199 * Provide support for the Rouge syntax highlighter (#1859)
200 * Provide support for Sass (#1932)
201 * Provide a 300% improvement when generating sites that use
202 `Post#next` or `Post#previous` (#1983)
203 * Provide support for CoffeeScript (#1991)
204 * Replace Maruku with Kramdown as Default Markdown Processor (#1988)
205 * Expose `site.static_files` to Liquid (#2075)
206 * Complete redesign of the template site generated by `jekyll new` (#2050)
207 * Update Listen from 1.x to 2.x (#2097)
208 * Front-matter defaults (#2205)
209 * Deprecate `relative_permalinks` configuration option (default to `false`) (#2307)
210 * Exclude files based on prefix as well as `fnmatch?` (#2303)
211
212 ### Minor Enhancements
213 * Move the EntryFilter class into the Jekyll module to avoid polluting the
214 global namespace (#1800)
215 * Add `group_by` Liquid filter create lists of items grouped by a common
216 property's value (#1788)
217 * Add support for Maruku's `fenced_code_blocks` option (#1799)
218 * Update Redcarpet dependency to ~> 3.0 (#1815)
219 * Automatically sort all pages by name (#1848)
220 * Better error message when time is not parseable (#1847)
221 * Allow `include` tag variable arguments to use filters (#1841)
222 * `post_url` tag should raise `ArgumentError` for invalid name (#1825)
223 * Bump dependency `mercenary` to `~> 0.2.0` (#1879)
224 * Bump dependency `safe_yaml` to `~> 1.0` (#1886)
225 * Allow sorting of content by custom properties (#1849)
226 * Add `--quiet` flag to silence output during build and serve (#1898)
227 * Add a `where` filter to filter arrays based on a key/value pair
228 (#1875)
229 * Route 404 errors to a custom 404 page in development (#1899)
230 * Excludes are now relative to the site source (#1916)
231 * Bring MIME Types file for `jekyll serve` to complete parity with GH Pages
232 servers (#1993)
233 * Adding Breakpoint to make new site template more responsive (#2038)
234 * Default to using the UTF-8 encoding when reading files. (#2031)
235 * Update Redcarpet dependency to ~> 3.1 (#2044)
236 * Remove support for Ruby 1.9.2 (#2045)
237 * Add `.mkdown` as valid Markdown extension (#2048)
238 * Add `index.xml` to the list of WEBrick directory index files (#2041)
239 * Make the `layouts` config key relative to CWD or to source (#2058)
240 * Update Kramdown to `~> 1.3` (#1894)
241 * Remove unnecessary references to `self` (#2090)
242 * Update to Mercenary v0.3.x (#2085)
243 * Ship Sass support as a separate gem (#2098)
244 * Extract core extensions into a Utils module (#2112)
245 * Refactor CLI & Commands For Greater Happiness (#2143)
246 * Provide useful error when Pygments returns `nil` and error out (#2148)
247 * Add support for unpublished drafts (#2164)
248 * Add `force_polling` option to the `serve` command (#2165)
249 * Clean up the `<head>` in the site template (#2186)
250 * Permit YAML blocks to end with three dots to better conform with the
251 YAML spec (#2110)
252 * Use `File.exist?` instead of deprecated `File.exists?` (#2214)
253 * Require newline after start of YAML front-matter header (#2211)
254 * Add the ability for pages to be marked as `published: false` (#1492)
255 * Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy
256 looking up of variable values in a Liquid context. (#2253)
257 * Remove literal lang name from class (#2292)
258 * Return `utf-8` encoding in header for webrick error page response (#2289)
259 * Make template site easier to customize (#2268)
260 * Add two-digit year to permalink template option (#2301)
261 * Add `site.documents` to Liquid payload (list of all docs) (#2295)
262 * Take into account missing values in the Liquid sort filter (#2299)
263
264 ### Bug Fixes
265 * Don't allow nil entries when loading posts (#1796)
266 * Remove the scrollbar that's always displayed in new sites generated
267 from the site template (#1805)
268 * Add `#path` to required methods in `Jekyll::Convertible` (#1866)
269 * Default Maruku fenced code blocks to ON for 2.0.0-dev (#1831)
270 * Change short opts for host and port for `jekyll docs` to be consistent with
271 other subcommands (#1877)
272 * Fix typos (#1910)
273 * Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 (#1958)
274 * Fixes full path leak to source directory when using include tag (#1951)
275 * Don't generate pages that aren't being published (#1931)
276 * Use `SafeYAML.load` to avoid conflicts with other projects (#1982)
277 * Relative posts should never fail to build (#1976)
278 * Remove executable bits of non executable files (#2056)
279 * `#path` for a draft is now `_drafts` instead of `_posts` (#2042)
280 * Patch a couple show-stopping security vulnerabilities (#1946)
281 * Sanitize paths uniformly, in a Windows-friendly way (#2065, #2109)
282 * Update gem build steps to work correctly on Windows (#2118)
283 * Remove obsolete `normalize_options` method call from `bin/jekyll` (#2121).
284 * Remove `+` characters from Pygments lexer names when adding as a CSS
285 class (#994)
286 * Remove some code that caused Ruby interpreter warnings (#2178)
287 * Only strip the drive name if it begins the string (#2175)
288 * Remove default post with invalid date from site template (#2200)
289 * Fix `Post#url` and `Page#url` escape (#1568)
290 * Strip newlines from the `{% highlight %}` block content (#1823)
291 * Load in `rouge` only when it's been requested as the highlighter (#2189)
292 * Convert input to string before XML escaping (`xml_escape` liquid filter) (#2244)
293 * Modify configuration key for Collections and reset properly. (#2238)
294 * Avoid duplicated output using `highlight` tag (#2264)
295 * Only use Jekyll.logger for output (#2307)
296 * Close the file descriptor in `has_yaml_header?` (#2310)
297 * Add `output` to `Document` liquid output hash (#2309)
298
299 ### Development Fixes
300 * Add a link to the site in the README.md file (#1795)
301 * Add in History and site changes from `v1-stable` branch (#1836)
302 * Testing additions on the Excerpt class (#1893)
303 * Fix the `highlight` tag feature (#1859)
304 * Test Jekyll under Ruby 2.1.0 (#1900)
305 * Add script/cibuild for fun and profit (#1912)
306 * Use `Forwardable` for delegation between `Excerpt` and `Post`
307 (#1927)
308 * Rename `read_things` to `read_content` (#1928)
309 * Add `script/branding` script for ASCII art lovin' (#1936)
310 * Update the README to reflect the repo move (#1943)
311 * Add the project vision to the README (#1935)
312 * Speed up Travis CI builds by using Rebund (#1985)
313 * Use Yarp as a Gem proxy for Travis CI (#1984)
314 * Remove Yarp as a Gem proxy for Travis CI (#2004)
315 * Move the reading of layouts into its own class (#2020)
316 * Test Sass import (#2009)
317 * Switch Maruku and Kramdown in lists of Runtime vs. Development dependencies (#2049)
318 * Clean up the gemspec for the project (#2095)
319 * Add Japanese translation of README and CONTRIBUTING docs. (#2081)
320 * Re-align the tables in Cucumber (#2108)
321 * Trim trailing spaces and convert tabs to spaces (#2122)
322 * Fix the failing Travis scenarios due to Cucumber issues (#2155)
323 * Wrap `bundle install` in `travis_retry` to retry when RubyGems fails (#2160)
324 * Refactor tags and categories (#1639)
325 * Extract plugin management into its own class (#2197)
326 * Add missing tests for `Command` (#2216)
327 * Update `rr` link in CONTRIBUTING doc (#2247)
328 * Streamline Cucumber execution of `jekyll` subcommands (#2258)
329 * Refactor `Commands::Serve`. (#2269)
330 * Refactor `highlight` tag (#2154)
331 * Update `Util` hash functions with latest from Rails (#2273)
332 * Workaround for Travis bug (#2290)
333
334 ### Site Enhancements
335 * Document Kramdown's GFM parser option (#1791)
336 * Move CSS to includes & update normalize.css to v2.1.3 (#1787)
337 * Minify CSS only in production (#1803)
338 * Fix broken link to installation of Ruby on Mountain Lion blog post on
339 Troubleshooting docs page (#1797)
340 * Fix issues with 1.4.1 release blog post (#1804)
341 * Add note about deploying to OpenShift (#1812)
342 * Collect all Windows-related docs onto one page (#1818)
343 * Fixed typo in datafiles doc page (#1854)
344 * Clarify how to access `site` in docs (#1864)
345 * Add closing `<code>` tag to `context.registers[:site]` note (#1867)
346 * Fix link to @mojombo's site source (#1897)
347 * Add `paginate: nil` to default configuration in docs (#1896)
348 * Add link to our License in the site footer (#1889)
349 * Add a charset note in "Writing Posts" doc page (#1902)
350 * Disallow selection of path and prompt in bash examples
351 * Add jekyll-compass to the plugin list (#1923)
352 * Add note in Posts docs about stripping `<p>` tags from excerpt (#1933)
353 * Add additional info about the new exclude behavior (#1938)
354 * Linkify 'awesome contributors' to point to the contributors graph on
355 GitHub (#1940)
356 * Update `docs/sites.md` link to GitHub Training materials (#1949)
357 * Update `master` with the release info from 1.4.3 (#1947)
358 * Define docs nav in datafile (#1953)
359 * Clarify the docs around the naming convention for posts (#1971)
360 * Add missing `next` and `previous` docs for post layouts and templates (#1970)
361 * Add note to `Writing posts` page about how to strip html from excerpt (#1962)
362 * Add `jekyll-humanize` plugin to plugin list (#1998)
363 * Add `jekyll-font-awesome` plugin to plugin list (#1999)
364 * Add `sublime-jekyll` to list of Editor plugins (#2001)
365 * Add `vim-jekyll` to the list of Editor plugins (#2005)
366 * Fix non-semantic nesting of `p` tags in `news_item` layout (#2013)
367 * Document destination folder cleaning (#2016)
368 * Updated instructions for NearlyFreeSpeech.NET installation (#2015)
369 * Update link to rack-jekyll on "Deployment Methods" page (#2047)
370 * Fix typo in /docs/configuration (#2073)
371 * Fix count in docs for `site.static_files` (#2077)
372 * Update configuration docs to indicate utf-8 is the default for 2.0.0
373 and ASCII for 1.9.3 (#2074)
374 * Add info about unreleased feature to the site (#2061)
375 * Add whitespace to liquid example in GitHub Pages docs (#2084)
376 * Clarify the way Sass and CoffeeScript files are read in and output (#2067)
377 * Add lyche gallery tag plugin link to list of plugins (#2094)
378 * Add Jekyll Pages Directory plugin to list of plugins (#2096)
379 * Update Configuration docs page with new markdown extension (#2102)
380 * Add `jekyll-image-set` to the list of third-party plugins (#2105)
381 * Losslessly compress images (#2128)
382 * Update normalize.css to 3.0.0 (#2126)
383 * Update modernizr to v2.7.1 (#2129)
384 * Add `jekyll-ordinal` to list of third-party plugins (#2150)
385 * Add `jekyll_figure` to list of third-party plugins (#2158)
386 * Clarify the documentation for safe mode (#2163)
387 * Some HTML tidying (#2130)
388 * Remove modernizr and use html5shiv.js directly for IE less than v9 (#2131)
389 * Remove unused images (#2187)
390 * Use `array_to_sentence_string` filter when outputting news item
391 categories (#2191)
392 * Add link to Help repo in primary navigation bar (#2177)
393 * Switch to using an ico file for the shortcut icon (#2193)
394 * Use numbers to specify font weights and only bring in font weights used (#2185)
395 * Add a link to the list of all tz database time zones (#1824)
396 * Clean-up and improve documentation `feed.xml` (#2192)
397 * Remove duplicate entry in list of third-party plugins (#2206)
398 * Reduce the whitespace in the favicon. (#2213)
399 * Add `jekyll-page-collections` to list of third-party plugins (#2215)
400 * Add a cross-reference about `post_url` (#2243)
401 * Add `jekyll-live-tiles` to list of third-party plugins (#2250)
402 * Fixed broken link to GitHub training material site source (#2257)
403 * Update link to help repo, now called `jekyll-help` (#2277)
404 * Fix capitalization of 'Jekyll' on Deployment Methods page (#2291)
405 * Include plugins by sonnym in list of third-party plugins (#2297)
406 * Add deprecated articles keeper filter to list of third-party plugins (#2300)
407 * Simplify and improve our CSS. (#2127)
408 * Use black text color for the mobile navbar (#2306)
409 * Use the built in date filter and `site.time` for the copyright year. (#2305)
410 * Update html5shiv to v3.7.2 (#2304)
411 * Add 2.0.0 release post (#2298)
412 * Add docs for custom markdown processors (#2298)
413 * Add docs for `where` and `group_by` Liquid filters (#2298)
414 * Remove notes in docs for unreleased features (#2309)
415
12416 ## 1.5.1 / 2014-03-27
13417
14418 ### Bug Fixes
15419
16 * Only strip the drive name if it begins the string (#2176)
420 * Only strip the drive name if it begins the string (#2176)
17421
18422 ## 1.5.0 / 2014-03-24
19423
29433
30434 ### Development Fixes
31435
32 * Lock `cucmber` at `1.3.11` (#2167)
436 * Lock `cucumber` at `1.3.11` (#2167)
33437
34438 ## 1.4.3 / 2014-01-13
35439
36440 ### Bug Fixes
37
38441 * Patch show-stopping security vulnerabilities (#1944)
39442
40443 ## 1.4.2 / 2013-12-16
154557 * Refactor Site#render (#1638)
155558 * Remove duplication in command line options (#1637)
156559 * Add tests for all the coderay options (#1543)
157 * Improve some of the cucumber test code (#1493)
560 * Improve some of the Cucumber test code (#1493)
158561 * Improve comparisons of timestamps by ignoring the seconds (#1582)
159562
160563 ### Site Enhancements
324727 * Latest posts first in non-LSI `related_posts` (#1271)
325728
326729 ### Development Fixes
327 * Merge the theme and layout cucumber steps into one step (#1151)
730 * Merge the theme and layout Cucumber steps into one step (#1151)
328731 * Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2`
329732 * Include/exclude deprecation handling simplification (#1284)
330733 * Convert README to Markdown. (#1267)
354757 * Update contributor information (#1192)
355758 * Update URL of article about Blogger migration (#1242)
356759 * Specify that RedCarpet is the default for new Jekyll sites on Quickstart page (#1247)
357 * Added site.pages to Variables page in docs (#1251)
760 * Added `site.pages` to Variables page in docs (#1251)
358761 * Add Youku and Tudou Embed link on Plugins page. (#1250)
359762 * Add note that `gist` tag supports private gists. (#1248)
360763 * Add `jekyll-timeago` to list of third-party plugins. (#1260)
372775
373776 ### Minor Enhancements
374777 * Add support to gist tag for private gists. (#1189)
375 * Fail loudly when MaRuKu errors out (#1190)
778 * Fail loudly when Maruku errors out (#1190)
376779 * Move the building of related posts into their own class (#1057)
377780 * Removed trailing spaces in several places throughout the code (#1116)
378781 * Add a `--force` option to `jekyll new` (#1115)
438841 ## 1.0.1 / 2013-05-08
439842
440843 ### Minor Enhancements
441 * Do not force use of toc_token when using generate_tok in RDiscount (#1048)
844 * Do not force use of `toc_token` when using `generate_tok` in RDiscount (#1048)
442845 * Add newer `language-` class name prefix to code blocks (#1037)
443846 * Commander error message now preferred over process abort with incorrect args (#1040)
444847
461864 ## 1.0.0 / 2013-05-06
462865
463866 ### Major Enhancements
464 * Add `jekyll new` subcommand: generate a jekyll scaffold (#764)
465 * Refactored jekyll commands into subcommands: build, serve, and migrate. (#690)
867 * Add `jekyll new` subcommand: generate a Jekyll scaffold (#764)
868 * Refactored Jekyll commands into subcommands: build, serve, and migrate. (#690)
466869 * Removed importers/migrators from main project, migrated to jekyll-import sub-gem (#793)
467870 * Added ability to render drafts in `_drafts` folder via command line (#833)
468871 * Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) (#928)
469872
470873 ### Minor Enhancements
471874 * Site template HTML5-ified (#964)
472 * Use post's directory path when matching for the post_url tag (#998)
875 * Use post's directory path when matching for the `post_url` tag (#998)
473876 * Loosen dependency on Pygments so it's only required when it's needed (#1015)
474877 * Parse strings into Time objects for date-related Liquid filters (#1014)
475878 * Tell the user if there is no subcommand specified (#1008)
483886 * Expose new attribute to Liquid via `page`: `page.path` (#951)
484887 * Accept multiple config files from command line (#945)
485888 * Add page variable to liquid custom tags and blocks (#413)
486 * Add paginator.previous_page_path and paginator.next_page_path (#942)
889 * Add `paginator.previous_page_path` and `paginator.next_page_path` (#942)
487890 * Backwards compatibility for 'auto' (#821, #934)
488891 * Added date_to_rfc822 used on RSS feeds (#892)
489892 * Upgrade version of pygments.rb to 0.4.2 (#927)
502905 * Relaxed Kramdown version to 0.14 (#808)
503906 * Aliased `jekyll server` to `jekyll serve`. (#792)
504907 * Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. (#744)
505 * Refactored jekyll subcommands into Jekyll::Commands submodule, which now contains them (#768)
908 * Refactored Jekyll subcommands into Jekyll::Commands submodule, which now contains them (#768)
506909 * Rescue from import errors in Wordpress.com migrator (#671)
507910 * Massively accelerate LSI performance (#664)
508911 * Truncate post slugs when importing from Tumblr (#496)
517920 * Paginate in subdirectories properly (#1016)
518921 * Ensure post and page URLs have a leading slash (#992)
519922 * Catch all exceptions, not just StandardError descendents (#1007)
520 * Bullet-proof limit_posts option (#1004)
923 * Bullet-proof `limit_posts` option (#1004)
521924 * Read in YAML as UTF-8 to accept non-ASCII chars (#836)
522925 * Fix the CLI option `--plugins` to actually accept dirs and files (#993)
523926 * Allow 'excerpt' in YAML Front-Matter to override the extracted excerpt (#946)
529932 * Force usage of older directory_watcher gem as 1.5 is broken (#883)
530933 * Ensure all Post categories are downcase (#842, #872)
531934 * Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors (#555)
532 * Patch for multibyte URI problem with jekyll serve (#723)
935 * Patch for multibyte URI problem with `jekyll serve` (#723)
533936 * Order plugin execution by priority (#864)
534937 * Fixed Page#dir and Page#url for edge cases (#536)
535 * Fix broken post_url with posts with a time in their YAML Front-Matter (#831)
938 * Fix broken `post_url` with posts with a time in their YAML Front-Matter (#831)
536939 * Look for plugins under the source directory (#654)
537940 * Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long
538941 post names (#775)
554957 ### Development Fixes
555958 * Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 (#938)
556959 * Added "features:html" rake task for debugging purposes, cleaned up
557 cucumber profiles (#832)
960 Cucumber profiles (#832)
558961 * Explicitly require HTTPS rubygems source in Gemfile (#826)
559962 * Changed Ruby version for development to 1.9.3-p374 from p362 (#801)
560963 * Including a link to the GitHub Ruby style guide in CONTRIBUTING.md (#806)
564967 * Switch to Simplecov for coverage report (#765)
565968
566969 ## 0.12.1 / 2013-02-19
970
567971 ### Minor Enhancements
568972 * Update Kramdown version to 0.14.1 (#744)
569973 * Test Enhancements
572976 * Update Redcarpet version to 2.2.2 (#744)
573977
574978 ## 0.12.0 / 2012-12-22
979
575980 ### Minor Enhancements
576981 * Add ability to explicitly specify included files (#261)
577 * Add --default-mimetype option (#279)
982 * Add `--default-mimetype` option (#279)
578983 * Allow setting of RedCloth options (#284)
579 * Add post_url Liquid tag for internal post linking (#369)
984 * Add `post_url` Liquid tag for internal post linking (#369)
580985 * Allow multiple plugin dirs to be specified (#438)
581986 * Inline TOC token support for RDiscount (#333)
582987 * Add the option to specify the paginated url format (#342)
586991 * Bug Fixes
587992 * Allow some special characters in highlight names
588993 * URL escape category names in URL generation (#360)
589 * Fix error with limit_posts (#442)
994 * Fix error with `limit_posts` (#442)
590995 * Properly select dotfile during directory scan (#363, #431, #377)
591 * Allow setting of Kramdown smart_quotes (#482)
996 * Allow setting of Kramdown `smart_quotes` (#482)
592997 * Ensure front-matter is at start of file (#562)
593998
594999 ## 0.11.2 / 2011-12-27
6011006 * Update dependencies
6021007
6031008 ## 0.11.0 / 2011-07-10
1009
6041010 ### Major Enhancements
6051011 * Add command line importer functionality (#253)
6061012 * Add Redcarpet Markdown support (#318)
6221028
6231029 ## 0.10.0 / 2010-12-16
6241030 * Bug Fixes
625 * Add --no-server option.
1031 * Add `--no-server` option.
6261032
6271033 ## 0.9.0 / 2010-12-15
1034
6281035 ### Minor Enhancements
6291036 * Use OptionParser's `[no-]` functionality for better boolean parsing.
6301037 * Add Drupal migrator (#245)
6331040 * Add Marley migrator (#28)
6341041
6351042 ## 0.8.0 / 2010-11-22
1043
6361044 ### Minor Enhancements
6371045 * Add wordpress.com importer (#207)
638 * Add --limit-posts cli option (#212)
639 * Add uri_escape filter (#234)
640 * Add --base-url cli option (#235)
1046 * Add `--limit-posts` cli option (#212)
1047 * Add `uri_escape` filter (#234)
1048 * Add `--base-url` cli option (#235)
6411049 * Improve MT migrator (#238)
6421050 * Add kramdown support (#239)
6431051 * Bug Fixes
6461054 * Prevent `_includes` dir from being a symlink
6471055
6481056 ## 0.7.0 / 2010-08-24
1057
6491058 ### Minor Enhancements
6501059 * Add support for rdiscount extensions (#173)
6511060 * Bug Fixes
6571066 * Fix Rakefile 'release' task (tag pushing was missing origin)
6581067 * Ensure that RedCloth is loaded when textilize filter is used (#183)
6591068 * Expand source, destination, and plugin paths (#180)
660 * Fix page.url to include full relative path (#181)
1069 * Fix `page.url` to include full relative path (#181)
6611070
6621071 ## 0.6.1 / 2010-06-24
6631072 * Bug Fixes
6641073 * Fix Markdown Pygments prefix and suffix (#178)
6651074
6661075 ## 0.6.0 / 2010-06-23
1076
6671077 ### Major Enhancements
6681078 * Proper plugin system (#19, #100)
6691079 * Add safe mode so unsafe converters/generators can be added
6741084 ### Minor Enhancements
6751085 * Inclusion/exclusion of future dated posts (#59)
6761086 * Generation for a specific time (#59)
677 * Allocate site.time on render not per site_payload invocation (#59)
1087 * Allocate `site.time` on render not per site_payload invocation (#59)
6781088 * Pages now present in the site payload and can be used through the
679 site.pages and site.html_pages variables
1089 `site.pages` and `site.html_pages` variables
6801090 * Generate phase added to site#process and pagination is now a generator
6811091 * Switch to RakeGem for build/test process
6821092 * Only regenerate static files when they have changed (#142)
6881098 * Fix extension munging when pretty permalinks are enabled (#64)
6891099 * Stop sorting categories (#33)
6901100 * Preserve generated attributes over front matter (#119)
691 * Fix source directory binding using Dir.pwd (#75)
1101 * Fix source directory binding using `Dir.pwd` (#75)
6921102
6931103 ## 0.5.7 / 2010-01-12
1104
6941105 ### Minor Enhancements
6951106 * Allow overriding of post date in the front matter (#62, #38)
6961107 * Bug Fixes
6981109 * Empty tags causes error in read_posts (#84)
6991110 * Fix pagination to adhere to read/render/write paradigm
7001111 * Test Enhancement
701 * cucumber features no longer use site.posts.first where a better
1112 * Cucumber features no longer use site.posts.first where a better
7021113 alternative is available
7031114
7041115 ## 0.5.6 / 2010-01-08
7391150 * Configuration options set in config.yml are now available through the
7401151 site payload (@vilcans)
7411152 * Posts can now have an empty YAML front matter or none at all
742 (@bahuvrihi)
743 * Bug Fixes
744 * Fixing Ruby 1.9 issue that requires to_s on the err object
1153 (@ bahuvrihi)
1154 * Bug Fixes
1155 * Fixing Ruby 1.9 issue that requires `#to_s` on the err object
7451156 (@Chrononaut)
7461157 * Fixes for pagination and ordering posts on the same day (@ujh)
7471158 * Made pages respect permalinks style and permalinks in yml front matter
7511162 * Added trailing slash to pretty permalink style so Apache is happy
7521163 (@eugenebolshakov)
7531164 * Bad markdown processor in config fails sooner and with better message
754 (@gcnovus)
1165 (@ gcnovus)
7551166 * Allow CRLFs in yaml frontmatter (@juretta)
7561167 * Added Date#xmlschema for Ruby versions < 1.9
7571168
7581169 ## 0.5.1 / 2009-05-06
1170
7591171 ### Major Enhancements
7601172 * Next/previous posts in site payload (@pantulis, @tomo)
7611173 * Permalink templating system
7701182 * CGI escaped post titles (@Chrononaut)
7711183
7721184 ## 0.5.0 / 2009-04-07
1185
7731186 ### Minor Enhancements
7741187 * Ability to set post categories via YAML (@qrush)
7751188 * Ability to set prevent a post from publishing via YAML (@qrush)
7881201 * Add Cucumber acceptance test suite (@qrush, @technicalpickles)
7891202
7901203 ## 0.4.1
1204
7911205 ### Minor Enhancements
7921206 * Changed date format on wordpress converter (zeropadding) (@dysinger)
7931207 * Bug Fixes
794 * Add jekyll binary as executable to gemspec (@dysinger)
1208 * Add Jekyll binary as executable to gemspec (@dysinger)
7951209
7961210 ## 0.4.0 / 2009-02-03
1211
7971212 ### Major Enhancements
7981213 * Switch to Jeweler for packaging tasks
7991214
8001215 ### Minor Enhancements
8011216 * Type importer (@codeslinger)
802 * site.topics accessor (@baz)
1217 * `site.topics` accessor (@baz)
8031218 * Add `array_to_sentence_string` filter (@mchung)
8041219 * Add a converter for textpattern (@PerfectlyNormal)
8051220 * Add a working Mephisto / MySQL converter (@ivey)
8141229 * Fix site payload available to files (@matrix9180)
8151230
8161231 ## 0.3.0 / 2008-12-24
1232
8171233 ### Major Enhancements
818 * Added --server option to start a simple WEBrick server on destination
1234 * Added `--server` option to start a simple WEBrick server on destination
8191235 directory (@johnreilly and @mchung)
8201236
8211237 ### Minor Enhancements
8341250 ## 0.2.1 / 2008-12-15
8351251 * Major Changes
8361252 * Use Maruku (pure Ruby) for Markdown by default (@mreid)
837 * Allow use of RDiscount with --rdiscount flag
1253 * Allow use of RDiscount with `--rdiscount` flag
8381254
8391255 ### Minor Enhancements
8401256 * Don't load directory_watcher unless it's needed (@pjhyett)
8411257
8421258 ## 0.2.0 / 2008-12-14
8431259 * Major Changes
844 * related_posts is now found in site.related_posts
1260 * related_posts is now found in `site.related_posts`
8451261
8461262 ## 0.1.6 / 2008-12-13
8471263 * Major Features
8481264 * Include files in `_includes` with `{% include x.textile %}`
8491265
8501266 ## 0.1.5 / 2008-12-12
1267
8511268 ### Major Enhancements
852 * Code highlighting with Pygments if --pygments is specified
853 * Disable true LSI by default, enable with --lsi
1269 * Code highlighting with Pygments if `--pygments` is specified
1270 * Disable true LSI by default, enable with `--lsi`
8541271
8551272 ### Minor Enhancements
8561273 * Output informative message if RDiscount is not available (@JackDanger)
8691286 * Code hilighting (@vanpelt)
8701287 * Autobuild
8711288 * Bug Fixes
872 * Accept both \r\n and \n in YAML header (@vanpelt)
1289 * Accept both `\r\n` and `\n` in YAML header (@vanpelt)
8731290
8741291 ## 0.1.2 / 2008-11-22
8751292 * Major Features
00 (The MIT License)
11
2 Copyright (c) 2008 Tom Preston-Werner
2 Copyright (c) 2008-2014 Tom Preston-Werner
33
44 Permission is hereby granted, free of charge, to any person obtaining a copy
55 of this software and associated documentation files (the 'Software'), to deal
1717 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1818 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1919 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 SOFTWARE.
20 SOFTWARE.
0 # Jekyll
0 # [Jekyll](http://jekyllrb.com/)
11
2 [![Gem Version](https://badge.fury.io/rb/jekyll.png)](http://badge.fury.io/rb/jekyll)
2 [![Gem Version](https://badge.fury.io/rb/jekyll.svg)](https://rubygems.org/gems/jekyll)
3 [![Build Status](https://secure.travis-ci.org/jekyll/jekyll.svg?branch=master)](https://travis-ci.org/jekyll/jekyll)
4 [![Code Climate](http://img.shields.io/codeclimate/github/jekyll/jekyll.svg)](https://codeclimate.com/github/jekyll/jekyll)
5 [![Dependency Status](https://gemnasium.com/jekyll/jekyll.svg)](https://gemnasium.com/jekyll/jekyll)
36
4 [![Build Status](https://secure.travis-ci.org/jekyll/jekyll.png?branch=master)](https://travis-ci.org/jekyll/jekyll)
5 [![Code Climate](https://codeclimate.com/github/jekyll/jekyll.png)](https://codeclimate.com/github/jekyll/jekyll)
6 [![Dependency Status](https://gemnasium.com/jekyll/jekyll.png)](https://gemnasium.com/jekyll/jekyll)
7 [![Coverage Status](https://coveralls.io/repos/jekyll/jekyll/badge.png)](https://coveralls.io/r/jekyll/jekyll)
7 By Tom Preston-Werner, Nick Quaranto, and many [awesome contributors](https://github.com/jekyll/jekyll/graphs/contributors)!
88
9 By Tom Preston-Werner, Nick Quaranto, and many awesome contributors!
9 Jekyll is a simple, blog-aware, static site generator perfect for personal, project, or organization sites. Think of it like a file-based CMS, without all the complexity. Jekyll takes your content, renders Markdown and Liquid templates, and spits out a complete, static website ready to be served by Apache, Nginx or another web server. Jekyll is the engine behind [GitHub Pages](http://pages.github.com), which you can use to host sites right from your GitHub repositories.
1010
11 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.
11 ## Philosophy
12
13 Jekyll does what you tell it to do — no more, no less. It doesn't try to outsmart users by making bold assumptions, nor does it burden them with needless complexity and configuration. Put simply, Jekyll gets out of your way and allows you to concentrate on what truly matters: your content.
1214
1315 ## Getting Started
1416
1517 * [Install](http://jekyllrb.com/docs/installation/) the gem
1618 * Read up about its [Usage](http://jekyllrb.com/docs/usage/) and [Configuration](http://jekyllrb.com/docs/configuration/)
17 * Take a gander at some existing [Sites](http://wiki.github.com/jekyll/jekyll/sites)
19 * Take a gander at some existing [Sites](https://wiki.github.com/jekyll/jekyll/sites)
1820 * Fork and [Contribute](http://jekyllrb.com/docs/contributing/) your own modifications
19 * Have questions? Check out `#jekyll` on irc.freenode.net.
21 * Have questions? Check out [`#jekyll` on irc.freenode.net](https://botbot.me/freenode/jekyll/).
2022
2123 ## Diving In
2224
23 * [Migrate](http://jekyllrb.com/docs/migrations/) from your previous system
25 * [Migrate](http://import.jekyllrb.com/docs/home/) from your previous system
2426 * Learn how the [YAML Front Matter](http://jekyllrb.com/docs/frontmatter/) works
2527 * Put information on your site with [Variables](http://jekyllrb.com/docs/variables/)
2628 * Customize the [Permalinks](http://jekyllrb.com/docs/permalinks/) your posts are generated with
2729 * Use the built-in [Liquid Extensions](http://jekyllrb.com/docs/templates/) to make your life easier
2830 * Use custom [Plugins](http://jekyllrb.com/docs/plugins/) to generate content specific to your site
2931
30 ## Runtime Dependencies
31
32 * Commander: Command-line interface constructor (Ruby)
33 * Colorator: Colorizes command line output (Ruby)
34 * Classifier: Generating related posts (Ruby)
35 * Directory Watcher: Auto-regeneration of sites (Ruby)
36 * Liquid: Templating system (Ruby)
37 * Maruku: Default markdown engine (Ruby)
38 * Pygments.rb: Syntax highlighting (Ruby/Python)
39 * RedCarpet: Markdown engine (Ruby)
40 * Safe YAML: YAML Parser built for security (Ruby)
41
42 ## Developer Dependencies
43
44 * Kramdown: Markdown-superset converter (Ruby)
45 * Launchy: Cross-platform file launcher (Ruby)
46 * RDiscount: Discount Markdown Processor (Ruby)
47 * RedCloth: Textile support (Ruby)
48 * RedGreen: Nicer test output (Ruby)
49 * RR: Mocking (Ruby)
50 * Shoulda: Test framework (Ruby)
51 * SimpleCov: Coverage framework (Ruby)
52
5332 ## License
5433
5534 See [LICENSE](https://github.com/jekyll/jekyll/blob/master/LICENSE).
44 require 'yaml'
55
66 $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
7 require 'jekyll/version'
78
89 #############################################################################
910 #
1213 #############################################################################
1314
1415 def name
15 @name ||= Dir['*.gemspec'].first.split('.').first
16 @name ||= File.basename(Dir['*.gemspec'].first, ".*")
1617 end
1718
1819 def version
19 line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
20 line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
21 end
22
23 def date
24 Date.today.to_s
25 end
26
27 def file_date
28 Date.today.strftime("%F")
29 end
30
31 def rubyforge_project
32 name
20 Jekyll::VERSION
3321 end
3422
3523 def gemspec_file
4028 "#{name}-#{version}.gem"
4129 end
4230
43 def replace_header(head, header_name)
44 head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
45 end
46
4731 def normalize_bullets(markdown)
48 markdown.gsub(/\s{2}\*{1}/, "-")
32 markdown.gsub(/\n\s{2}\*{1}/, "\n-")
4933 end
5034
5135 def linkify_prs(markdown)
6852 markdown.gsub(/(`{[{%].+[}%]}`)/, "{% raw %}\\1{% endraw %}")
6953 end
7054
55 def custom_release_header_anchors(markdown)
56 header_regexp = /^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}/
57 section_regexp = /^### \w+ \w+$/
58 markdown.split(/^##\s/).map do |release_notes|
59 _, major, minor, patch = *release_notes.match(header_regexp)
60 release_notes
61 .gsub(header_regexp, "\\0\n{: #v\\1-\\2-\\3}")
62 .gsub(section_regexp) { |section| "#{section}\n{: ##{sluffigy(section)}-v#{major}-#{minor}-#{patch}}" }
63 end.join("\n## ")
64 end
65
66 def sluffigy(header)
67 header.gsub(/#/, '').strip.downcase.gsub(/\s+/, '-')
68 end
69
7170 def remove_head_from_history(markdown)
7271 index = markdown =~ /^##\s+\d+\.\d+\.\d+/
7372 markdown[index..-1]
7473 end
7574
7675 def converted_history(markdown)
77 remove_head_from_history(liquid_escape(linkify(normalize_bullets(markdown))))
76 remove_head_from_history(
77 custom_release_header_anchors(
78 liquid_escape(
79 linkify(
80 normalize_bullets(markdown)))))
7881 end
7982
8083 #############################################################################
8386 #
8487 #############################################################################
8588
86 if RUBY_VERSION > '1.9' && ENV["TRAVIS"] == "true"
87 require 'coveralls/rake/task'
88 Coveralls::RakeTask.new
89
90 task :default => [:test, :features, 'coveralls:push']
91 else
92 task :default => [:test, :features]
93 end
89 task :default => [:test, :features]
9490
9591 require 'rake/testtask'
9692 Rake::TestTask.new(:test) do |test|
155151
156152 desc "Update normalize.css library to the latest version and minify"
157153 task :update_normalize_css do
158 Dir.chdir("site/css") do
154 Dir.chdir("site/_includes/css") do
159155 sh 'curl "http://necolas.github.io/normalize.css/latest/normalize.css" -o "normalize.scss"'
160156 sh 'sass "normalize.scss":"normalize.css" --style compressed'
161157 sh 'rm "normalize.scss"'
168164 puts "Checking for gh-pages dir..."
169165 unless File.exist?("./gh-pages")
170166 puts "No gh-pages directory found. Run the following commands first:"
171 puts " `git clone git@github.com:mojombo/jekyll gh-pages"
167 puts " `git clone git@github.com:jekyll/jekyll gh-pages"
172168 puts " `cd gh-pages"
173169 puts " `git checkout gh-pages`"
174170 exit(1)
191187 sha = `git log`.match(/[a-z0-9]{40}/)[0]
192188 Dir.chdir('gh-pages') do
193189 sh "git add ."
194 sh "git commit -m 'Updating to #{sha}.'"
190 sh "git commit --allow-empty -m 'Updating to #{sha}.'"
195191 sh "git push origin gh-pages"
196192 end
197193 puts 'Done.'
250246 #
251247 #############################################################################
252248
249 desc "Release #{name} v#{version}"
253250 task :release => :build do
254 unless `git branch` =~ /^(\* master|\* v1-stable)$/
255 puts "You must be on the master branch or the v1-stable branch to release!"
251 unless `git branch` =~ /^\* master$/
252 puts "You must be on the master branch to release!"
256253 exit!
257254 end
258255 sh "git commit --allow-empty -m 'Release #{version}'"
262259 sh "gem push pkg/#{name}-#{version}.gem"
263260 end
264261
265 task :build => :gemspec do
266 sh "mkdir -p pkg"
262 desc "Build #{name} v#{version} into pkg/"
263 task :build do
264 mkdir_p "pkg"
267265 sh "gem build #{gemspec_file}"
268266 sh "mv #{gem_file} pkg"
269267 end
270
271 task :gemspec do
272 # read spec file and split out manifest section
273 spec = File.read(gemspec_file)
274 head, manifest, tail = spec.split(" # = MANIFEST =\n")
275
276 # replace name version and date
277 replace_header(head, :name)
278 replace_header(head, :version)
279 replace_header(head, :date)
280 #comment this out if your rubyforge_project has a different name
281 replace_header(head, :rubyforge_project)
282
283 # determine file list from git ls-files
284 files = `git ls-files`.
285 split("\n").
286 sort.
287 reject { |file| file =~ /^\./ }.
288 reject { |file| file =~ /^(rdoc|pkg|coverage)/ }.
289 map { |file| " #{file}" }.
290 join("\n")
291
292 # piece file back together and write
293 manifest = " s.files = %w[\n#{files}\n ]\n"
294 spec = [head, manifest, tail].join(" # = MANIFEST =\n")
295 File.open(gemspec_file, 'w') { |io| io.write(spec) }
296 puts "Updated #{gemspec_file}"
297 end
22
33 $:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
44
5 require 'commander/import'
65 require 'jekyll'
6 require 'mercenary'
7
8 %w[jekyll-import].each do |blessed_gem|
9 begin
10 require blessed_gem
11 rescue LoadError
12 end
13 end
714
815 Jekyll::Deprecator.process(ARGV)
916
10 program :name, 'jekyll'
11 program :version, Jekyll::VERSION
12 program :description, 'Jekyll is a blog-aware, static site generator in Ruby'
17 Mercenary.program(:jekyll) do |p|
18 p.version Jekyll::VERSION
19 p.description 'Jekyll is a blog-aware, static site generator in Ruby'
20 p.syntax 'jekyll <subcommand> [options]'
1321
14 default_command :default
22 p.option 'source', '-s', '--source [DIR]', 'Source directory (defaults to ./)'
23 p.option 'destination', '-d', '--destination [DIR]', 'Destination directory (defaults to ./_site)'
24 p.option 'safe', '--safe', 'Safe mode (defaults to false)'
25 p.option 'plugins', '-p', '--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]', Array, 'Plugins directory (defaults to ./_plugins)'
26 p.option 'layouts', '--layouts DIR', String, 'Layouts directory (defaults to ./_layouts)'
1527
16 global_option '-s', '--source [DIR]', 'Source directory (defaults to ./)'
17 global_option '-d', '--destination [DIR]', 'Destination directory (defaults to ./_site)'
18 global_option '--safe', 'Safe mode (defaults to false)'
19 global_option '-p', '--plugins PLUGINS_DIR1[,PLUGINS_DIR2[,...]]', Array, 'Plugins directory (defaults to ./_plugins)'
20 global_option '--layouts DIR', String, 'Layouts directory (defaults to ./_layouts)'
28 Jekyll::Command.subclasses.each { |c| c.init_with_program(p) }
2129
22 # Option names don't always directly match the configuration value we'd like.
23 # This method will rename options to match what Jekyll configuration expects.
24 #
25 # options - The Hash of options from Commander.
26 #
27 # Returns the normalized Hash.
28 def normalize_options(options)
29 if drafts_state = options.delete(:drafts)
30 options[:show_drafts] = drafts_state
31 end
32 options
33 end
34
35 def add_build_options(c)
36 c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
37 c.option '--future', 'Publishes posts with a future date'
38 c.option '--limit_posts MAX_POSTS', Integer, 'Limits the number of posts to parse and publish'
39 c.option '-w', '--watch', 'Watch for changes and rebuild'
40 c.option '--lsi', 'Use LSI for improved related posts'
41 c.option '-D', '--drafts', 'Render posts in the _drafts folder'
42 c.option '-V', '--verbose', 'Print verbose output.'
43 end
44
45 command :default do |c|
46 c.action do |args, options|
30 p.action do |args, options|
4731 if args.empty?
48 command(:help).run
32 puts p
4933 else
50 Jekyll.logger.abort_with "Invalid command. Use --help for more information"
34 unless p.has_command?(args.first)
35 Jekyll.logger.abort_with "Invalid command. Use --help for more information"
36 end
5137 end
5238 end
5339 end
54
55 command :new do |c|
56 c.syntax = 'jekyll new PATH'
57 c.description = 'Creates a new Jekyll site scaffold in PATH'
58
59 c.option '--force', 'Force creation even if PATH already exists'
60 c.option '--blank', 'Creates scaffolding but with empty files'
61
62 c.action do |args, options|
63 Jekyll::Commands::New.process(args, options.__hash__)
64 end
65 end
66
67 command :build do |c|
68 c.syntax = 'jekyll build [options]'
69 c.description = 'Build your site'
70
71 add_build_options(c)
72
73 c.action do |args, options|
74 options = normalize_options(options.__hash__)
75 options = Jekyll.configuration(options)
76 Jekyll::Commands::Build.process(options)
77 end
78 end
79
80 command :serve do |c|
81 c.syntax = 'jekyll serve [options]'
82 c.description = 'Serve your site locally'
83
84 add_build_options(c)
85
86 c.option '-B', '--detach', 'Run the server in the background (detach)'
87 c.option '-P', '--port [PORT]', 'Port to listen on'
88 c.option '-H', '--host [HOST]', 'Host to bind to'
89 c.option '-b', '--baseurl [URL]', 'Base URL'
90
91 c.action do |args, options|
92 options.default :serving => true
93
94 options = normalize_options(options.__hash__)
95 options = Jekyll.configuration(options)
96 Jekyll::Commands::Build.process(options)
97 Jekyll::Commands::Serve.process(options)
98 end
99 end
100 alias_command :server, :serve
101
102 command :doctor do |c|
103 c.syntax = 'jekyll doctor'
104 c.description = 'Search site and print specific deprecation warnings'
105
106 c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
107
108 c.action do |args, options|
109 options = normalize_options(options.__hash__)
110 options = Jekyll.configuration(options)
111 Jekyll::Commands::Doctor.process(options)
112 end
113 end
114 alias_command :hyde, :doctor
115
116 command :docs do |c|
117 c.syntax = 'jekyll docs'
118 c.description = "Launch local server with docs for Jekyll v#{Jekyll::VERSION}"
119
120 c.option '-p', '--port [PORT]', 'Port to listen on'
121 c.option '-u', '--host [HOST]', 'Host to bind to'
122
123 c.action do |args, options|
124 options = normalize_options(options.__hash__)
125 options = Jekyll.configuration(options.merge!({
126 'source' => File.expand_path("../site", File.dirname(__FILE__)),
127 'destination' => File.expand_path("../site/_site", File.dirname(__FILE__))
128 }))
129 puts options
130 Jekyll::Commands::Build.process(options)
131 Jekyll::Commands::Serve.process(options)
132 end
133 end
134
135 command :import do |c|
136 c.syntax = 'jekyll import <platform> [options]'
137 c.description = 'Import your old blog to Jekyll'
138
139 c.option '--source STRING', 'Source file or URL to migrate from'
140 c.option '--file STRING', 'File to migrate from'
141 c.option '--dbname STRING', 'Database name to migrate from'
142 c.option '--user STRING', 'Username to use when migrating'
143 c.option '--pass STRING', 'Password to use when migrating'
144 c.option '--host STRING', 'Host address to use when migrating'
145 c.option '--prefix STRING', 'Database table prefix to use when migrating'
146
147 c.action do |args, options|
148 begin
149 require 'jekyll-import'
150 rescue LoadError
151 msg = "You must install the 'jekyll-import' gem before continuing.\n"
152 msg += "* Please see the documentation at http://jekyllrb.com/docs/migrations/ for instructions.\n"
153 abort msg
154 end
155 Jekyll::Commands::Import.process(args.first, options)
156 end
157 end
Binary diff not shown
0 コントリビュート
1 ==========
2
3 あなたは Jekyll に投じるすばらしいアイディアを持っています。
4 すばらしいことです!次の事柄を心に留めてください。
5
6 * **テストなしではコントリビュートはできません。**
7 * もし、既存の機能への小さな修正やパッチを作成したなら、シンプルなテストを行います。
8 現在のテストスイートの範囲にとどまり、そして
9 [Shoulda](https://github.com/thoughtbot/shoulda/tree/master) や
10 [RR](https://github.com/btakita/rr/tree/master) を使用してください。
11 * もし、それが新しい機能の場合は、必ず新しい
12 [Cucumber](https://github.com/cucumber/cucumber/) の機能を作成し、
13 必要に応じて手順を再利用します。
14 また、あなたがフォークした `site` に
15 急ぎいくつかのドキュメントを用意し、一度マージを行い
16 メイン `site` の jekyllrb.com に転送していただければ幸いです。
17 * あなたのコントリビュートによって Jekyll の振る舞いが変わった場合、ドキュメントを更新すべきです。
18 それは `site/docs` にあります。
19 もし、 docs に情報の誤りがあった場合、遠慮なく追加してください。
20 すばらしいドキュメントはすばらしいプロジェクトを作ります!
21 * Ruby のコードを変更するときは、 [GitHub Ruby Styleguide](https://github.com/styleguide/ruby)
22 に従ってください。
23 * **小さなプルリクエスト** に最善を尽くしてください。
24 簡単に提案された変更はレビューされ、マージされる可能性が高いです。
25 * プルリクエストを送信するとき、プルリクエストのボディを賢明に使用してください。
26 変更されたかどうかの記述、変更の背後にある動機、 [完了したかどうかのタスクリスト](http://git.io/gfm-tasks)
27 もレビュー時間を早めます。
28
29 テストの依存関係
30 -----------------
31
32 テストスイートの実行や gem のビルドのために、
33 Jekyll の依存ツールをインストールする必要があります。
34 Jekyll は Bundler を使用しており、 `bundle` コマンドを実行すると全ての設定が迅速に行われます!
35
36 $ bundle
37
38 はじめる前に、テストを実行し、必ずテストが通ることを
39 確認してください(あなたの環境が適切に設定されているかを確認するために):
40
41 $ bundle exec rake test
42 $ bundle exec rake features
43
44 ワークフロー
45 --------
46
47 これは、あなたの作業がプロジェクトにマージされるもっとも直接的な方法です:
48
49 * プロジェクトをフォークします。
50 * あなたのフォークプロジェクトをクローンします ( `git clone git@github.com:<username>/jekyll.git` )。
51 * トピックブランチを作成し、あなたの変更を含んでください ( `git checkout -b my_awesome_feature` )。
52 * ハックし、テストを追加します。必ずしもこの順番でなくてかまいません
53 * `rake` を実行し、テストが必ず全て通ることを確認してください
54 * 必要に応じて、エラーがないようにコミットを論理的な塊にリベースしてください
55 * ブランチをプッシュしてください ( `git push origin my_awesome_feature` ).
56 * jekyll/jekyll プロジェクトの master ブランチに対してプルリクエストを作成し、
57 あなたの変更内容と、なぜそれをマージすべきかを記述してください
58
59 ドキュメントの更新
60 ----------------------
61
62 私たちは Jekyll のドキュメントについて最善を尽くしたいです。
63 私たちはドキュメントをオープンソース化しました、そして
64 あなたが Jekyll に欠けているものを見つけた場合、私たちはプルリクエストを歓迎しています。
65
66 あなたは、 GitHub.com 上の Jekyll リポジトリの [site]({{ site.repository }}/tree/master/site) で
67 jekyllrb.comのドキュメントを見つけることができます。
68
69 全てのドキュメントのプルリクエストは `master` に向けられる必要があります。
70 他のブランチに向けたプルリクエストは受け入れられません。
71
72 GitHub の [Jekyll wiki](https://github.com/jekyll/jekyll/wiki) は、
73 自由に更新することができるように、プルリクエストなしで
74 全ての GitHub ユーザがアクセス権を持つことができます。
75
76 落とし穴
77 -------
78
79 * もし、 gem のバージョンがかちあった場合、コミットを分けてください。
80 この方法だと、メンテナが gem をリリースするときに制御できます。
81 * jekyll/jekyll の最新コミットに基づいて(複数の)パッチを維持してください。
82 それは適用するためのあなたの仕事で、メンテナがしなければならないことを少なくするのは
83 とてもよいことです。
84 * あなたの GitHub issue で [fix], [feature] などのタグをつけないでください。
85 メンテナは積極的に issue を読み、彼らが問題に出くわしたらラベルをつけるでしょう。
86
87 最後に…
88 ----------
89
90 ありがとう! Jekyll のハックは楽しいものでなければなりません。
91 もし、あなたがこのハードを理解するための何かを発見した場合、知らせてください。
92 我々のプロセスやドキュメントを改善することができます!
0 # [Jekyll](http://jekyllrb.com/)
1
2 [![Gem Version](https://badge.fury.io/rb/jekyll.png)](http://badge.fury.io/rb/jekyll)
3
4 [![Build Status](https://secure.travis-ci.org/jekyll/jekyll.png?branch=master)](https://travis-ci.org/jekyll/jekyll)
5 [![Code Climate](https://codeclimate.com/github/jekyll/jekyll.png)](https://codeclimate.com/github/jekyll/jekyll)
6 [![Dependency Status](https://gemnasium.com/jekyll/jekyll.png)](https://gemnasium.com/jekyll/jekyll)
7
8 Tom Preston-Werner, Nick Quaranto や多くの[素晴らしいコントリビュータ](https://github.com/jekyll/jekyll/graphs/contributors)によって作成されています!
9
10 Jekyll は個人プロジェクトや組織のサイトに最適な、シンプルで、ブログを意識した静的サイトジェネレータです。
11 複雑さを排除したファイルベースのCMSのようなものと考えてください。
12 Jekyll はコンテンツを受け取り、 Markdown や Liquid テンプレート をレンダリングし、
13 Apache や Nginx やその他の Web サーバに提供する準備ができた静的な Web サイトを完全に出力してくれます。
14 Jekyll は [GitHub Pages](http://pages.github.com) の背後にあるエンジンなので、
15 あなたの GitHub リポジトリからサイトをホストするために使用する事ができます。
16
17 ## 原理
18
19 Jekyll あなたがするように伝えたことをします ― それ以上でもそれ以下でもありません。
20 それは、大胆な仮定によってユーザの裏をかこうとせず、
21 また、不必要な複雑さや設定をユーザに負担しません。
22 簡単に言えば、 Jekyll はあなたの道を開け、
23 真に重要なもの: コンテンツに集中することができます。
24
25 ## 開始方法
26
27 * gem を[インストール](http://jekyllrb.com/docs/installation/)します
28 * [使用方法](http://jekyllrb.com/docs/usage/) と [設定方法](http://jekyllrb.com/docs/configuration/) を読みます
29 * 既存の [Jekyll で作られたサイト](https://wiki.github.com/jekyll/jekyll/sites) をチラッと見ます
30 * Fork し、あなたの変更を [コントリビュート](http://jekyllrb.com/docs/contributing/) します
31 * 質問があったら? irc.freenode.net の `#jekyll` チャンネルをチェックしてください
32
33 ## より深く
34
35 * 以前のシステムからの[移行](http://jekyllrb.com/docs/migrations/)
36 * [YAML Front Matter](http://jekyllrb.com/docs/frontmatter/) がどのように働くかを学ぶ
37 * [変数](http://jekyllrb.com/docs/variables/)を使ってサイトに情報を表示する
38 * posts が生成される時の[パーマリンク](http://jekyllrb.com/docs/permalinks/)をカスタマイズ
39 * 人生を容易にするために、組み込みの [Liquid 拡張](http://jekyllrb.com/docs/templates/)を使用する
40 * あなたのサイト固有のコンテンツを生成するために、カスタム[プラグイン](http://jekyllrb.com/docs/plugins/)を使用する
41
42 ## 実行時の依存関係
43
44 * Commander: コマンドラインインターフェース構築 (Ruby)
45 * Colorator: コマンドライン出力に色付け (Ruby)
46 * Classifier: posts の関連を生成 (Ruby)
47 * Directory Watcher: サイトの自動再生成 (Ruby)
48 * Kramdown: デフォルトの Markdown エンジン (Ruby)
49 * Liquid: テンプレートシステム (Ruby)
50 * Pygments.rb: シンタックスハイライト (Ruby/Python)
51 * RedCarpet: Markdown エンジン (Ruby)
52 * Safe YAML: セキュリティのために構築された YAML パーサ (Ruby)
53
54 ## 開発時の依存関係
55
56 * Launchy: クロスプラットフォーム ファイルランチャ (Ruby)
57 * Maruku: Markdown スーパーセット インタプリタ (Ruby)
58 * RDiscount: Discount Markdown プロセッサ (Ruby)
59 * RedCloth: Textile サポート (Ruby)
60 * RedGreen: よりよいテスト出力 (Ruby)
61 * RR: モック (Ruby)
62 * Shoulda: テストフレームワーク (Ruby)
63 * SimpleCov: カバレッジフレームワーク (Ruby)
64
65 ## ライセンス
66
67 [ライセンス](https://github.com/jekyll/jekyll/blob/master/LICENSE)を見てください。
0 Feature: Collections
1 As a hacker who likes to structure content
2 I want to be able to create collections of similar information
3 And render them
4
5 Scenario: Unrendered collection
6 Given I have an "index.html" page that contains "Collections: {{ site.methods }}"
7 And I have fixture collections
8 And I have a configuration file with "collections" set to "['methods']"
9 When I run jekyll build
10 Then the _site directory should exist
11 And I should see "Collections: <p>Use <code>Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>\n<p><code>Jekyll.sanitized_path</code> is used to make sure your path is in your source.</p>\n<p>Run your generators! default</p>\n<p>Page without title.</p>\n<p>Run your generators! default</p>" in "_site/index.html"
12 And the "_site/methods/configuration.html" file should not exist
13
14 Scenario: Rendered collection
15 Given I have an "index.html" page that contains "Collections: {{ site.collections }}"
16 And I have an "collection_metadata.html" page that contains "Methods metadata: {{ site.collections.methods.foo }} {{ site.collections.methods }}"
17 And I have fixture collections
18 And I have a "_config.yml" file with content:
19 """
20 collections:
21 methods:
22 output: true
23 foo: bar
24 """
25 When I run jekyll build
26 Then the _site directory should exist
27 And I should see "Collections: {\"methods" in "_site/index.html"
28 And I should see "Methods metadata: bar" in "_site/collection_metadata.html"
29 And I should see "<p>Whatever: foo.bar</p>" in "_site/methods/configuration.html"
30
31 Scenario: Rendered collection at a custom URL
32 Given I have an "index.html" page that contains "Collections: {{ site.collections }}"
33 And I have fixture collections
34 And I have a "_config.yml" file with content:
35 """
36 collections:
37 methods:
38 output: true
39 permalink: /:collection/:path/
40 """
41 When I run jekyll build
42 Then the _site directory should exist
43 And I should see "<p>Whatever: foo.bar</p>" in "_site/methods/configuration/index.html"
44
45 Scenario: Rendered document in a layout
46 Given I have an "index.html" page that contains "Collections: {{ site.collections }}"
47 And I have a default layout that contains "<div class='title'>Tom Preston-Werner</div> {{content}}"
48 And I have fixture collections
49 And I have a "_config.yml" file with content:
50 """
51 collections:
52 methods:
53 output: true
54 foo: bar
55 """
56 When I run jekyll build
57 Then the _site directory should exist
58 And I should see "Collections: {\"methods" in "_site/index.html"
59 And I should see "<p>Run your generators! default</p>" in "_site/methods/site/generate.html"
60 And I should see "<div class='title'>Tom Preston-Werner</div>" in "_site/methods/site/generate.html"
61
62 Scenario: Collections specified as an array
63 Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}"
64 And I have fixture collections
65 And I have a "_config.yml" file with content:
66 """
67 collections:
68 - methods
69 """
70 When I run jekyll build
71 Then the _site directory should exist
72 And I should see "Collections: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
73
74 Scenario: Collections specified as an hash
75 Given I have an "index.html" page that contains "Collections: {% for method in site.methods %}{{ method.relative_path }} {% endfor %}"
76 And I have fixture collections
77 And I have a "_config.yml" file with content:
78 """
79 collections:
80 - methods
81 """
82 When I run jekyll build
83 Then the _site directory should exist
84 And I should see "Collections: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
85
86 Scenario: All the documents
87 Given I have an "index.html" page that contains "All documents: {% for doc in site.documents %}{{ doc.relative_path }} {% endfor %}"
88 And I have fixture collections
89 And I have a "_config.yml" file with content:
90 """
91 collections:
92 - methods
93 """
94 When I run jekyll build
95 Then the _site directory should exist
96 And I should see "All documents: _methods/configuration.md _methods/sanitized_path.md _methods/site/generate.md _methods/site/initialize.md _methods/um_hi.md" in "_site/index.html"
97
98 Scenario: Documents have an output attribute, which is the converted HTML
99 Given I have an "index.html" page that contains "First document's output: {{ site.documents.first.output }}"
100 And I have fixture collections
101 And I have a "_config.yml" file with content:
102 """
103 collections:
104 - methods
105 """
106 When I run jekyll build
107 Then the _site directory should exist
108 And I should see "First document's output: <p>Use <code>Jekyll.configuration</code> to build a full configuration for use w/Jekyll.</p>\n\n<p>Whatever: foo.bar</p>" in "_site/index.html"
109
110 Scenario: Filter documents by where
111 Given I have an "index.html" page that contains "{% assign items = site.methods | where: 'whatever','foo.bar' %}Item count: {{ items.size }}"
112 And I have fixture collections
113 And I have a "_config.yml" file with content:
114 """
115 collections:
116 - methods
117 """
118 When I run jekyll build
119 Then the _site directory should exist
120 And I should see "Item count: 1" in "_site/index.html"
121
122 Scenario: Sort by title
123 Given I have an "index.html" page that contains "{% assign items = site.methods | sort: 'title' %}1. of {{ items.size }}: {{ items.first.output }}"
124 And I have fixture collections
125 And I have a "_config.yml" file with content:
126 """
127 collections:
128 - methods
129 """
130 When I run jekyll build
131 Then the _site directory should exist
132 And I should see "1. of 5: <p>Page without title.</p>" in "_site/index.html"
133
134 Scenario: Sort by relative_path
135 Given I have an "index.html" page that contains "Collections: {% assign methods = site.methods | sort: 'relative_path' %}{% for method in methods %}{{ method.title }}, {% endfor %}"
136 And I have fixture collections
137 And I have a "_config.yml" file with content:
138 """
139 collections:
140 - methods
141 """
142 When I run jekyll build
143 Then the _site directory should exist
144 And I should see "Collections: Jekyll.configuration, Jekyll.sanitized_path, Site#generate, , Site#generate," in "_site/index.html"
44
55 Scenario: Blank site
66 Given I do not have a "test_blank" directory
7 When I call jekyll new with test_blank --blank
7 When I run jekyll new test_blank --blank
88 Then the test_blank/_layouts directory should exist
99 And the test_blank/_posts directory should exist
1010 And the "test_blank/index.html" file should exist
1111
1212 Scenario: Basic site
1313 Given I have an "index.html" file that contains "Basic Site"
14 When I run jekyll
14 When I run jekyll build
1515 Then the _site directory should exist
1616 And I should see "Basic Site" in "_site/index.html"
1717
1818 Scenario: Basic site with a post
1919 Given I have a _posts directory
2020 And I have the following post:
21 | title | date | content |
21 | title | date | content |
2222 | Hackers | 2009-03-27 | My First Exploit |
23 When I run jekyll
23 When I run jekyll build
2424 Then the _site directory should exist
2525 And I should see "My First Exploit" in "_site/2009/03/27/hackers.html"
2626
2828 Given I have a _layouts directory
2929 And I have an "index.html" page with layout "default" that contains "Basic Site with Layout"
3030 And I have a default layout that contains "Page Layout: {{ content }}"
31 When I run jekyll
31 When I run jekyll build
3232 Then the _site directory should exist
3333 And I should see "Page Layout: Basic Site with Layout" in "_site/index.html"
3434
3636 Given I have a _layouts directory
3737 And I have a _posts directory
3838 And I have the following posts:
39 | title | date | layout | content |
39 | title | date | layout | content |
4040 | Wargames | 2009-03-27 | default | The only winning move is not to play. |
4141 And I have a default layout that contains "Post Layout: {{ content }}"
42 When I run jekyll
42 When I run jekyll build
4343 Then the _site directory should exist
4444 And I should see "Post Layout: <p>The only winning move is not to play.</p>" in "_site/2009/03/27/wargames.html"
4545
4747 Given I have a _layouts directory
4848 And I have a _posts directory
4949 And I have the following posts:
50 | title | date | layout | content |
50 | title | date | layout | content |
5151 | Wargames | 2009-03-27 | post/simple | The only winning move is not to play. |
5252 And I have a post/simple layout that contains "Post Layout: {{ content }}"
53 When I run jekyll
53 When I run jekyll build
5454 Then the _site directory should exist
5555 And I should see "Post Layout: <p>The only winning move is not to play.</p>" in "_site/2009/03/27/wargames.html"
5656
6565 And I have an "another_file" file that contains ""
6666 And I have a _posts directory
6767 And I have the following posts:
68 | title | date | layout | content |
69 | entry1 | 2009-03-27 | post | content for entry1. |
70 | entry2 | 2009-04-27 | post | content for entry2. |
68 | title | date | layout | content |
69 | entry1 | 2009-03-27 | post | content for entry1. |
70 | entry2 | 2009-04-27 | post | content for entry2. |
7171 And I have a category/_posts directory
7272 And I have the following posts in "category":
73 | title | date | layout | content |
74 | entry3 | 2009-05-27 | post | content for entry3. |
75 | entry4 | 2009-06-27 | post | content for entry4. |
76 When I run jekyll
73 | title | date | layout | content |
74 | entry3 | 2009-05-27 | post | content for entry3. |
75 | entry4 | 2009-06-27 | post | content for entry4. |
76 When I run jekyll build
7777 Then the _site directory should exist
7878 And I should see "Page : Site contains 2 pages and 4 posts" in "_site/index.html"
7979 And I should see "No replacement \{\{ site.posts.size \}\}" in "_site/about.html"
8888 Given I have a _includes directory
8989 And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}"
9090 And I have an "_includes/about.textile" file that contains "Generated by Jekyll"
91 When I run jekyll
91 When I run jekyll build
9292 Then the _site directory should exist
9393 And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html"
9494
9797 And I have an "_includes/about.textile" file that contains "Generated by Jekyll"
9898 And I have an info directory
9999 And I have an "info/index.html" page that contains "Basic Site with subdir include tag: {% include about.textile %}"
100 When I run jekyll
100 When I run jekyll build
101101 Then the _site directory should exist
102102 And I should see "Basic Site with subdir include tag: Generated by Jekyll" in "_site/info/index.html"
103103
106106 And I have an "_includes/about.textile" file that contains "Generated by {% include jekyll.textile %}"
107107 And I have an "_includes/jekyll.textile" file that contains "Jekyll"
108108 And I have an "index.html" page that contains "Basic Site with include tag: {% include about.textile %}"
109 When I run jekyll
109 When I run jekyll build
110110 Then the _site directory should exist
111111 And I should see "Basic Site with include tag: Generated by Jekyll" in "_site/index.html"
112112
115115 And I have a configuration file with "permalink" set to "pretty"
116116 And I have a _posts directory
117117 And I have the following posts:
118 | title | date | layout | content |
119 | entry1 | 2007-12-31 | post | content for entry1. |
120 | entry2 | 2020-01-31 | post | content for entry2. |
121 When I run jekyll
118 | title | date | layout | content |
119 | entry1 | 2007-12-31 | post | content for entry1. |
120 | entry2 | 2020-01-31 | post | content for entry2. |
121 When I run jekyll build
122122 Then the _site directory should exist
123123 And I should see "URL: /2020/01/31/entry2/" in "_site/index.html"
124124
125125 Scenario: Basic site with whitelisted dotfile
126126 Given I have an ".htaccess" file that contains "SomeDirective"
127 When I run jekyll
127 When I run jekyll build
128128 Then the _site directory should exist
129129 And I should see "SomeDirective" in "_site/.htaccess"
130130
131131 Scenario: File was replaced by a directory
132132 Given I have a "test" file that contains "some stuff"
133 When I run jekyll
133 When I run jekyll build
134134 Then the _site directory should exist
135135 When I delete the file "test"
136136 Given I have a test directory
137137 And I have a "test/index.html" file that contains "some other stuff"
138 When I run jekyll
138 When I run jekyll build
139139 Then the _site/test directory should exist
140140 And I should see "some other stuff" in "_site/test/index.html"
141
142 Scenario: Basic site with unpublished page
143 Given I have an "index.html" page with title "index" that contains "Published page"
144 And I have a "public.html" page with published "true" that contains "Explicitly published page"
145 And I have a "secret.html" page with published "false" that contains "Unpublished page"
146
147 When I run jekyll build
148 Then the _site directory should exist
149 And the "_site/index.html" file should exist
150 And the "_site/public.html" file should exist
151 But the "_site/secret.html" file should not exist
152
153 When I run jekyll build --unpublished
154 Then the _site directory should exist
155 And the "_site/index.html" file should exist
156 And the "_site/public.html" file should exist
157 And the "_site/secret.html" file should exist
1212 price: 2.5
1313 """
1414 And I have an "index.html" page that contains "{% for product in site.data.products %}{{product.name}}{% endfor %}"
15 When I run jekyll
15 When I run jekyll build
1616 Then the "_site/index.html" file should exist
1717 And I should see "sugar" in "_site/index.html"
1818 And I should see "salt" in "_site/index.html"
2727 age: 34
2828 """
2929 And I have an "index.html" page that contains "{% for member in site.data.members %}{{member.name}}{% endfor %}"
30 When I run jekyll
30 When I run jekyll build
31 Then the "_site/index.html" file should exist
32 And I should see "Jack" in "_site/index.html"
33 And I should see "Leon" in "_site/index.html"
34
35 Scenario: autoload *.json files in _data directory
36 Given I have a _data directory
37 And I have a "_data/members.json" file with content:
38 """
39 [{"name": "Jack", "age": 28},{"name": "Leon", "age": 34}]
40 """
41 And I have an "index.html" page that contains "{% for member in site.data.members %}{{member.name}}{% endfor %}"
42 When I run jekyll build
3143 Then the "_site/index.html" file should exist
3244 And I should see "Jack" in "_site/index.html"
3345 And I should see "Leon" in "_site/index.html"
4254 age: 34
4355 """
4456 And I have an "index.html" page that contains "{% for member in site.data.team_members %}{{member.name}}{% endfor %}"
45 When I run jekyll
57 When I run jekyll build
4658 Then the "_site/index.html" file should exist
4759 And I should see "Jack" in "_site/index.html"
4860 And I should see "Leon" in "_site/index.html"
61
62 Scenario: autoload *.yaml files in subdirectories in _data directory
63 Given I have a _data directory
64 And I have a _data/categories directory
65 And I have a "_data/categories/dairy.yaml" file with content:
66 """
67 name: Dairy Products
68 """
69 And I have an "index.html" page that contains "{{ site.data.categories.dairy.name }}"
70 When I run jekyll build
71 Then the "_site/index.html" file should exist
72 And I should see "Dairy Products" in "_site/index.html"
73
74 Scenario: folders should have precedence over files with the same name
75 Given I have a _data directory
76 And I have a _data/categories directory
77 And I have a "_data/categories/dairy.yaml" file with content:
78 """
79 name: Dairy Products
80 """
81 And I have a "_data/categories.yaml" file with content:
82 """
83 dairy:
84 name: Should not display this
85 """
86 And I have an "index.html" page that contains "{{ site.data.categories.dairy.name }}"
87 When I run jekyll build
88 Then the "_site/index.html" file should exist
89 And I should see "Dairy Products" in "_site/index.html"
4990
5091 Scenario: should be backward compatible with site.data in _config.yml
5192 Given I have a "_config.yml" file with content:
5798 age: 34
5899 """
59100 And I have an "index.html" page that contains "{% for member in site.data %}{{member.name}}{% endfor %}"
60 When I run jekyll
101 When I run jekyll build
61102 Then the "_site/index.html" file should exist
62103 And I should see "Jack" in "_site/index.html"
63104 And I should see "Leon" in "_site/index.html"
64
66 Given I have a configuration file with "permalink" set to "none"
77 And I have a _drafts directory
88 And I have the following draft:
9 | title | date | layout | content |
9 | title | date | layout | content |
1010 | Recipe | 2009-03-27 | default | Not baked yet. |
11 When I run jekyll with drafts
11 When I run jekyll build --drafts
1212 Then the _site directory should exist
1313 And I should see "Not baked yet." in "_site/recipe.html"
1414
1717 And I have an "index.html" page that contains "Totally index"
1818 And I have a _drafts directory
1919 And I have the following draft:
20 | title | date | layout | content |
20 | title | date | layout | content |
2121 | Recipe | 2009-03-27 | default | Not baked yet. |
22 When I run jekyll
22 When I run jekyll build
2323 Then the _site directory should exist
2424 And the "_site/recipe.html" file should not exist
25
26 Scenario: Don't preview a draft that is not published
27 Given I have a configuration file with "permalink" set to "none"
28 And I have an "index.html" page that contains "Totally index"
29 And I have a _drafts directory
30 And I have the following draft:
31 | title | date | layout | published | content |
32 | Recipe | 2009-03-27 | default | false | Not baked yet. |
33 When I run jekyll build --drafts
34 Then the _site directory should exist
35 And the "_site/recipe.html" file should not exist
36
37 Scenario: Use page.path variable
38 Given I have a configuration file with "permalink" set to "none"
39 And I have a _drafts directory
40 And I have the following draft:
41 | title | date | layout | content |
42 | Recipe | 2009-03-27 | simple | Post path: {{ page.path }} |
43 When I run jekyll build --drafts
44 Then the _site directory should exist
45 And I should see "Post path: _drafts/recipe.textile" in "_site/recipe.html"
66 Given I have a _posts directory
77 And I have a _layouts directory
88 And I have the following post:
9 | title | date | layout | content |
9 | title | date | layout | content |
1010 | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. |
1111 And I have a default layout that contains "{{ site.time | date_to_xmlschema }}"
12 When I run jekyll
12 When I run jekyll build
1313 Then the _site directory should exist
1414 And I should see today's date in "_site/2009/03/27/star-wars.html"
1515
1717 Given I have a _posts directory
1818 And I have a _layouts directory
1919 And I have the following post:
20 | title | date | layout | content |
20 | title | date | layout | content |
2121 | Star & Wars | 2009-03-27 | default | These aren't the droids you're looking for. |
22
23
2224 And I have a default layout that contains "{{ page.title | xml_escape }}"
23 When I run jekyll
25 When I run jekyll build
2426 Then the _site directory should exist
2527 And I should see "Star &amp; Wars" in "_site/2009/03/27/star-wars.html"
2628
2830 Given I have a _posts directory
2931 And I have a _layouts directory
3032 And I have the following post:
31 | title | date | layout | content |
33 | title | date | layout | content |
3234 | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. |
3335 And I have a default layout that contains "{{ content | xml_escape }}"
34 When I run jekyll
36 When I run jekyll build
3537 Then the _site directory should exist
3638 And I should see "7" in "_site/2009/03/27/star-wars.html"
3739
3941 Given I have a _posts directory
4042 And I have a _layouts directory
4143 And I have the following post:
42 | title | date | layout | tags | content |
44 | title | date | layout | tags | content |
4345 | Star Wars | 2009-03-27 | default | [scifi, movies, force] | These aren't the droids you're looking for. |
4446 And I have a default layout that contains "{{ page.tags | array_to_sentence_string }}"
45 When I run jekyll
47 When I run jekyll build
4648 Then the _site directory should exist
4749 And I should see "scifi, movies, and force" in "_site/2009/03/27/star-wars.html"
4850
5052 Given I have a _posts directory
5153 And I have a _layouts directory
5254 And I have the following post:
53 | title | date | layout | content |
55 | title | date | layout | content |
5456 | Star Wars | 2009-03-27 | default | These aren't the droids you're looking for. |
5557 And I have a default layout that contains "By {{ '_Obi-wan_' | textilize }}"
56 When I run jekyll
58 When I run jekyll build
5759 Then the _site directory should exist
5860 And I should see "By <p><em>Obi-wan</em></p>" in "_site/2009/03/27/star-wars.html"
5961
62 Scenario: Sort by an arbitrary variable
63 Given I have a _layouts directory
64 And I have the following page:
65 | title | layout | value | content |
66 | Page-1 | default | 8 | Something |
67 And I have the following page:
68 | title | layout | value | content |
69 | Page-2 | default | 6 | Something |
70 And I have a default layout that contains "{{ site.pages | sort:'value' | map:'title' | join:', ' }}"
71 When I run jekyll build
72 Then the _site directory should exist
73 And I should see exactly "Page-2, Page-1" in "_site/page-1.html"
74 And I should see exactly "Page-2, Page-1" in "_site/page-2.html"
75
76 Scenario: Sort pages by the title
77 Given I have a _layouts directory
78 And I have the following page:
79 | title | layout | content |
80 | Dog | default | Run |
81 And I have the following page:
82 | title | layout | content |
83 | Bird | default | Fly |
84 And I have the following page:
85 | layout | content |
86 | default | Jump |
87 And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}"
88 When I run jekyll build
89 Then the _site directory should exist
90 And I should see exactly "The rule of 3: Jump, Fly, Run," in "_site/bird.html"
91
92 Scenario: Sort pages by the title ordering pages without title last
93 Given I have a _layouts directory
94 And I have the following page:
95 | title | layout | content |
96 | Dog | default | Run |
97 And I have the following page:
98 | title | layout | content |
99 | Bird | default | Fly |
100 And I have the following page:
101 | layout | content |
102 | default | Jump |
103 And I have a default layout that contains "{% assign sorted_pages = site.pages | sort: 'title', 'last' %}The rule of {{ sorted_pages.size }}: {% for p in sorted_pages %}{{ p.content | strip_html | strip_newlines }}, {% endfor %}"
104 When I run jekyll build
105 Then the _site directory should exist
106 And I should see exactly "The rule of 3: Fly, Run, Jump," in "_site/bird.html"
0 Feature: frontmatter defaults
1 Scenario: Use default for frontmatter variables internally
2 Given I have a _layouts directory
3 And I have a pretty layout that contains "THIS IS THE LAYOUT: {{content}}"
4
5 And I have a _posts directory
6 And I have the following post:
7 | title | date | content |
8 | default layout | 2013-09-11 | just some post |
9 And I have an "index.html" page with title "some title" that contains "just some page"
10
11 And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {layout: "pretty"}}]"
12
13 When I run jekyll build
14 Then the _site directory should exist
15 And I should see "THIS IS THE LAYOUT: <p>just some post</p>" in "_site/2013/09/11/default-layout.html"
16 And I should see "THIS IS THE LAYOUT: just some page" in "_site/index.html"
17
18 Scenario: Use default for frontmatter variables in Liquid
19 Given I have a _posts directory
20 And I have the following post:
21 | title | date | content |
22 | default data | 2013-09-11 | <p>{{page.custom}}</p><div>{{page.author}}</div> |
23 And I have an "index.html" page that contains "just {{page.custom}} by {{page.author}}"
24 And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {custom: "some special data", author: "Ben"}}]"
25 When I run jekyll build
26 Then the _site directory should exist
27 And I should see "<p>some special data</p><div>Ben</div>" in "_site/2013/09/11/default-data.html"
28 And I should see "just some special data by Ben" in "_site/index.html"
29
30 Scenario: Override frontmatter defaults by path
31 Given I have a _layouts directory
32 And I have a root layout that contains "root: {{ content }}"
33 And I have a subfolder layout that contains "subfolder: {{ content }}"
34
35 And I have a _posts directory
36 And I have the following post:
37 | title | date | content |
38 | about | 2013-10-14 | info on {{page.description}} |
39 And I have a special/_posts directory
40 And I have the following post in "special":
41 | title | date | path | content |
42 | about | 2013-10-14 | local | info on {{page.description}} |
43
44 And I have an "index.html" page with title "overview" that contains "Overview for {{page.description}}"
45 And I have an "special/index.html" page with title "section overview" that contains "Overview for {{page.description}}"
46
47 And I have a configuration file with "defaults" set to "[{scope: {path: "special"}, values: {layout: "subfolder", description: "the special section"}}, {scope: {path: ""}, values: {layout: "root", description: "the webpage"}}]"
48
49 When I run jekyll build
50 Then the _site directory should exist
51 And I should see "root: <p>info on the webpage</p>" in "_site/2013/10/14/about.html"
52 And I should see "subfolder: <p>info on the special section</p>" in "_site/special/2013/10/14/about.html"
53 And I should see "root: Overview for the webpage" in "_site/index.html"
54 And I should see "subfolder: Overview for the special section" in "_site/special/index.html"
55
56 Scenario: Override frontmatter defaults by type
57 Given I have a _posts directory
58 And I have the following post:
59 | title | date | content |
60 | this is a post | 2013-10-14 | blabla |
61 And I have an "index.html" page that contains "interesting stuff"
62 And I have a configuration file with "defaults" set to "[{scope: {path: "", type: "post"}, values: {permalink: "/post.html"}}, {scope: {path: "", type: "page"}, values: {permalink: "/page.html"}}, {scope: {path: ""}, values: {permalink: "/perma.html"}}]"
63 When I run jekyll build
64 Then I should see "blabla" in "_site/post.html"
65 And I should see "interesting stuff" in "_site/page.html"
66 But the "_site/perma.html" file should not exist
67
68 Scenario: Actual frontmatter overrides defaults
69 Given I have a _posts directory
70 And I have the following post:
71 | title | date | permalink | author | content |
72 | override | 2013-10-14 | /frontmatter.html | some guy | a blog by {{page.author}} |
73 And I have an "index.html" page with permalink "override.html" that contains "nothing"
74 And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {permalink: "/perma.html", author: "Chris"}}]"
75 When I run jekyll build
76 Then I should see "a blog by some guy" in "_site/frontmatter.html"
77 And I should see "nothing" in "_site/override.html"
78 But the "_site/perma.html" file should not exist
79
80 Scenario: Use frontmatter defaults in collections
81 Given I have a _slides directory
82 And I have a "index.html" file that contains "nothing"
83 And I have a "_slides/slide1.html" file with content:
84 """
85 Value: {{ page.myval }}
86 """
87 And I have a "_config.yml" file with content:
88 """
89 collections:
90 slides:
91 output: true
92 defaults:
93 -
94 scope:
95 path: ""
96 type: slides
97 values:
98 myval: "Test"
99 """
100 When I run jekyll build
101 Then the _site directory should exist
102 And I should see "Value: Test" in "_site/slides/slide1.html"
103
104 Scenario: Override frontmatter defaults inside a collection
105 Given I have a _slides directory
106 And I have a "index.html" file that contains "nothing"
107 And I have a "_slides/slide2.html" file with content:
108 """
109 ---
110 myval: Override
111 ---
112 Value: {{ page.myval }}
113 """
114 And I have a "_config.yml" file with content:
115 """
116 collections:
117 slides:
118 output: true
119 defaults:
120 -
121 scope:
122 path: ""
123 type: slides
124 values:
125 myval: "Test"
126 """
127 When I run jekyll build
128 Then the _site directory should exist
129 And I should see "Value: Override" in "_site/slides/slide2.html"
130
131 Scenario: Deep merge frontmatter defaults
132 Given I have an "index.html" page with fruit "{orange: 1}" that contains "Fruits: {{ page.fruit.orange | plus: page.fruit.apple }}"
133 And I have a configuration file with "defaults" set to "[{scope: {path: ""}, values: {fruit: {apple: 2}}}]"
134 When I run jekyll build
135 Then I should see "Fruits: 3" in "_site/index.html"
99 And I have an "_includes/ignore.html" file that contains "<footer>My blog footer</footer>"
1010 And I have a _posts directory
1111 And I have the following post:
12 | title | date | layout | content |
13 | Include Files | 2013-03-21 | default | {% include header.html param="myparam" %} |
14 | Ignore params if unused | 2013-03-21 | default | {% include ignore.html date="today" %} |
15 | List multiple parameters | 2013-03-21 | default | {% include params.html date="today" start="tomorrow" %} |
16 | Dont keep parameters | 2013-03-21 | default | {% include ignore.html param="test" %}\n{% include header.html %} |
12 | title | date | layout | content |
13 | Include Files | 2013-03-21 | default | {% include header.html param="myparam" %} |
14 | Ignore params if unused | 2013-03-21 | default | {% include ignore.html date="today" %} |
15 | List multiple parameters | 2013-03-21 | default | {% include params.html date="today" start="tomorrow" %} |
16 | Dont keep parameters | 2013-03-21 | default | {% include ignore.html param="test" %}\n{% include header.html %} |
1717 | 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' %} |
18 | Parameter syntax | 2013-04-12 | default | {% include params.html param1_or_2="value" %} |
19 | Pass a variable | 2013-06-22 | default | {% assign var = 'some text' %}{% include params.html local=var layout=page.layout %} |
20 When I run jekyll
18 | Parameter syntax | 2013-04-12 | default | {% include params.html param1_or_2="value" %} |
19 | Pass a variable | 2013-06-22 | default | {% assign var = 'some text' %}{% include params.html local=var layout=page.layout %} |
20 When I run jekyll build
2121 Then the _site directory should exist
2222 And I should see "<header>My awesome blog header: myparam</header>" in "_site/2013/03/21/include-files.html"
2323 And I should not see "myparam" in "_site/2013/03/21/ignore-params-if-unused.html"
4242 | include_file1 | snippet.html |
4343 | include_file2 | parametrized.html |
4444 And I have an "index.html" page that contains "{% include {{site.include_file1}} %} that {% include {{site.include_file2}} what='parameters' %}"
45 When I run jekyll
45 When I run jekyll build
4646 Then the _site directory should exist
4747 And I should see "a snippet that works with parameters" in "_site/index.html"
4848
5151 And I have an "_includes/one.html" file that contains "one"
5252 And I have an "_includes/two.html" file that contains "two"
5353 And I have an "index.html" page with files "[one.html, two.html]" that contains "{% for file in page.files %}{% include {{file}} %} {% endfor %}"
54 When I run jekyll
54 When I run jekyll build
5555 Then the _site directory should exist
5656 And I should see "one two" in "_site/index.html"
57
58 Scenario: Include a file with variables and filters
59 Given I have an _includes directory
60 And I have an "_includes/one.html" file that contains "one included"
61 And I have a configuration file with:
62 | key | value |
63 | include_file | one |
64 And I have an "index.html" page that contains "{% include {{ site.include_file | append: '.html' }} %}"
65 When I run jekyll build
66 Then the _site directory should exist
67 And I should see "one included" in "_site/index.html"
77 And I have an "index.html" page that contains "Index - {% for post in site.posts %} {{ post.content }} {% endfor %}"
88 And I have a _posts directory
99 And I have the following post:
10 | title | date | content | type |
10 | title | date | content | type |
1111 | Hackers | 2009-03-27 | # My Title | markdown |
12 When I run jekyll
12 When I run jekyll build
1313 Then the _site directory should exist
1414 And I should see "Index" in "_site/index.html"
15 And I should see "<h1 id=\"my_title\">My Title</h1>" in "_site/2009/03/27/hackers.html"
16 And I should see "<h1 id=\"my_title\">My Title</h1>" in "_site/index.html"
15 And I should see "<h1 id=\"my-title\">My Title</h1>" in "_site/2009/03/27/hackers.html"
16 And I should see "<h1 id=\"my-title\">My Title</h1>" in "_site/index.html"
1717
1818 Scenario: Markdown in pagination on index
1919 Given I have a configuration file with "paginate" set to "5"
2020 And I have an "index.html" page that contains "Index - {% for post in paginator.posts %} {{ post.content }} {% endfor %}"
2121 And I have a _posts directory
2222 And I have the following post:
23 | title | date | content | type |
23 | title | date | content | type |
2424 | Hackers | 2009-03-27 | # My Title | markdown |
25 When I run jekyll
25 When I run jekyll build
2626 Then the _site directory should exist
2727 And I should see "Index" in "_site/index.html"
28 And I should see "<h1 id=\"my_title\">My Title</h1>" in "_site/index.html"
29
28 And I should see "<h1 id=\"my-title\">My Title</h1>" in "_site/index.html"
29
3030 Scenario: Maruku fenced codeblocks
3131 Given I have a configuration file with "markdown" set to "maruku"
3232 And I have an "index.markdown" file with content:
4141 My awesome code
4242 ```
4343 """
44 When I run jekyll
44 When I run jekyll build
4545 Then the _site directory should exist
4646 And I should see "My awesome code" in "_site/index.html"
47 And I should see "<pre><code>\nMy awesome code\n</code></pre>" in "_site/index.html"
48
47 And I should see "<pre><code>My awesome code</code></pre>" in "_site/index.html"
48
4949 Scenario: Maruku fenced codeblocks
5050 Given I have a configuration file with "markdown" set to "maruku"
5151 And I have an "index.markdown" file with content:
6060 puts "My awesome string"
6161 ```
6262 """
63 When I run jekyll
63 When I run jekyll build
6464 Then the _site directory should exist
6565 And I should see "My awesome string" in "_site/index.html"
66 And I should see "<pre class="ruby"><code class="ruby">\nputs &quot;My awesome string&quot;\n</code></pre>" in "_site/index.html"
66 And I should see "<pre class="ruby"><code class="ruby">puts &quot;My awesome string&quot;</code></pre>" in "_site/index.html"
88 And I have an "index.html" page that contains "{{ paginator.posts.size }}"
99 And I have a _posts directory
1010 And I have the following posts:
11 | title | date | layout | content |
11 | title | date | layout | content |
1212 | Wargames | 2009-03-27 | default | The only winning move is not to play. |
1313 | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. |
1414 | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. |
1515 | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. |
16 When I run jekyll
16 When I run jekyll build
1717 Then the _site/page<exist> directory should exist
1818 And the "_site/page<exist>/index.html" file should exist
1919 And I should see "<posts>" in "_site/page<exist>/index.html"
3535 And I have an "blog/index.html" page that contains "{{ paginator.posts.size }}"
3636 And I have a _posts directory
3737 And I have the following posts:
38 | title | date | layout | content |
38 | title | date | layout | content |
3939 | Wargames | 2009-03-27 | default | The only winning move is not to play. |
4040 | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. |
4141 | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. |
4242 | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. |
43 When I run jekyll
43 When I run jekyll build
4444 Then the _site/blog/page-<exist> directory should exist
4545 And the "_site/blog/page-<exist>/index.html" file should exist
4646 And I should see "<posts>" in "_site/blog/page-<exist>/index.html"
6868 | Wargames2 | 2009-04-27 | default | The only winning move is not to play2. |
6969 | Wargames3 | 2009-05-27 | default | The only winning move is not to play3. |
7070 | Wargames4 | 2009-06-27 | default | The only winning move is not to play4. |
71 When I run jekyll
71 When I run jekyll build
7272 Then the _site/blog/page/<exist> directory should exist
7373 And the "_site/blog/page/<exist>/index.html" file should exist
7474 And I should see "<posts>" in "_site/blog/page/<exist>/index.html"
55 Scenario: Use none permalink schema
66 Given I have a _posts directory
77 And I have the following post:
8 | title | date | content |
8 | title | date | content |
99 | None Permalink Schema | 2009-03-27 | Totally nothing. |
1010 And I have a configuration file with "permalink" set to "none"
11 When I run jekyll
11 When I run jekyll build
1212 Then the _site directory should exist
1313 And I should see "Totally nothing." in "_site/none-permalink-schema.html"
1414
1515 Scenario: Use pretty permalink schema
1616 Given I have a _posts directory
1717 And I have the following post:
18 | title | date | content |
18 | title | date | content |
1919 | Pretty Permalink Schema | 2009-03-27 | Totally wordpress. |
2020 And I have a configuration file with "permalink" set to "pretty"
21 When I run jekyll
21 When I run jekyll build
2222 Then the _site directory should exist
2323 And I should see "Totally wordpress." in "_site/2009/03/27/pretty-permalink-schema/index.html"
2424
2727 And I have an "awesome.html" page that contains "Totally awesome"
2828 And I have an "sitemap.xml" page that contains "Totally uhm, sitemap"
2929 And I have a configuration file with "permalink" set to "pretty"
30 When I run jekyll
30 When I run jekyll build
3131 Then the _site directory should exist
3232 And I should see "Totally index" in "_site/index.html"
3333 And I should see "Totally awesome" in "_site/awesome/index.html"
3636 Scenario: Use custom permalink schema with prefix
3737 Given I have a _posts directory
3838 And I have the following post:
39 | title | category | date | content |
39 | title | category | date | content |
4040 | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. |
4141 And I have a configuration file with "permalink" set to "/blog/:year/:month/:day/:title"
42 When I run jekyll
42 When I run jekyll build
4343 Then the _site directory should exist
4444 And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html"
4545
4646 Scenario: Use custom permalink schema with category
4747 Given I have a _posts directory
4848 And I have the following post:
49 | title | category | date | content |
49 | title | category | date | content |
5050 | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. |
5151 And I have a configuration file with "permalink" set to "/:categories/:title.html"
52 When I run jekyll
52 When I run jekyll build
5353 Then the _site directory should exist
5454 And I should see "Totally custom." in "_site/stuff/custom-permalink-schema.html"
5555
5656 Scenario: Use custom permalink schema with squished date
5757 Given I have a _posts directory
5858 And I have the following post:
59 | title | category | date | content |
59 | title | category | date | content |
6060 | Custom Permalink Schema | stuff | 2009-03-27 | Totally custom. |
6161 And I have a configuration file with "permalink" set to "/:month-:day-:year/:title.html"
62 When I run jekyll
62 When I run jekyll build
6363 Then the _site directory should exist
6464 And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-schema.html"
6565
6666 Scenario: Use per-post permalink
6767 Given I have a _posts directory
6868 And I have the following post:
69 | title | date | permalink | content |
69 | title | date | permalink | content |
7070 | Some post | 2013-04-14 | /custom/posts/1 | bla bla |
71 When I run jekyll
71 When I run jekyll build
7272 Then the _site directory should exist
7373 And the _site/custom/posts/1 directory should exist
7474 And I should see "bla bla" in "_site/custom/posts/1/index.html"
7676 Scenario: Use per-post ending in .html
7777 Given I have a _posts directory
7878 And I have the following post:
79 | title | date | permalink | content |
79 | title | date | permalink | content |
8080 | Some post | 2013-04-14 | /custom/posts/some.html | bla bla |
81 When I run jekyll
81 When I run jekyll build
8282 Then the _site directory should exist
8383 And the _site/custom/posts directory should exist
8484 And I should see "bla bla" in "_site/custom/posts/some.html"
66 Given I have a _posts directory
77 And I have a _layouts directory
88 And I have the following post:
9 | title | date | layout | content |
9 | title | date | layout | content |
1010 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
1111 And I have a simple layout that contains "Post title: {{ page.title }}"
12 When I run jekyll
12 When I run jekyll build
1313 Then the _site directory should exist
1414 And I should see "Post title: Star Wars" in "_site/2009/03/27/star-wars.html"
1515
1717 Given I have a _posts directory
1818 And I have a _layouts directory
1919 And I have the following post:
20 | title | date | layout | content |
20 | title | date | layout | content |
2121 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
2222 And I have a simple layout that contains "Post url: {{ page.url }}"
23 When I run jekyll
23 When I run jekyll build
2424 Then the _site directory should exist
2525 And I should see "Post url: /2009/03/27/star-wars.html" in "_site/2009/03/27/star-wars.html"
2626
2828 Given I have a _posts directory
2929 And I have a _layouts directory
3030 And I have the following post:
31 | title | date | layout | content |
31 | title | date | layout | content |
3232 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
3333 And I have a simple layout that contains "Post date: {{ page.date | date_to_string }}"
34 When I run jekyll
34 When I run jekyll build
3535 Then the _site directory should exist
3636 And I should see "Post date: 27 Mar 2009" in "_site/2009/03/27/star-wars.html"
3737
3939 Given I have a _posts directory
4040 And I have a _layouts directory
4141 And I have the following post:
42 | title | date | layout | content |
42 | title | date | layout | content |
4343 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
4444 And I have a simple layout that contains "Post id: {{ page.id }}"
45 When I run jekyll
45 When I run jekyll build
4646 Then the _site directory should exist
4747 And I should see "Post id: /2009/03/27/star-wars" in "_site/2009/03/27/star-wars.html"
4848
5050 Given I have a _posts directory
5151 And I have a _layouts directory
5252 And I have the following post:
53 | title | date | layout | content |
53 | title | date | layout | content |
5454 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
5555 And I have a simple layout that contains "Post content: {{ content }}"
56 When I run jekyll
56 When I run jekyll build
5757 Then the _site directory should exist
5858 And I should see "Post content: <p>Luke, I am your father.</p>" in "_site/2009/03/27/star-wars.html"
5959
6262 And I have a movies/_posts directory
6363 And I have a _layouts directory
6464 And I have the following post in "movies":
65 | title | date | layout | content |
66 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
67 And I have a simple layout that contains "Post category: {{ page.categories }}"
68 When I run jekyll
65 | title | date | layout | content |
66 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
67 And I have a simple layout that contains "Post category: {{ page.categories }}"
68 When I run jekyll build
69 Then the _site directory should exist
70 And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
71
72 Scenario: Use post.categories variable when category is in a folder and has category in YAML
73 Given I have a movies directory
74 And I have a movies/_posts directory
75 And I have a _layouts directory
76 And I have the following post in "movies":
77 | title | date | layout | category | content |
78 | Star Wars | 2009-03-27 | simple | film | Luke, I am your father. |
79 And I have a simple layout that contains "Post category: {{ page.categories }}"
80 When I run jekyll build
81 Then the _site directory should exist
82 And I should see "Post category: movies" in "_site/movies/film/2009/03/27/star-wars.html"
83
84 Scenario: Use post.categories variable when category is in a folder and has categories in YAML
85 Given I have a movies directory
86 And I have a movies/_posts directory
87 And I have a _layouts directory
88 And I have the following post in "movies":
89 | title | date | layout | categories | content |
90 | Star Wars | 2009-03-27 | simple | [film, scifi] | Luke, I am your father. |
91 And I have a simple layout that contains "Post category: {{ page.categories }}"
92 When I run jekyll build
93 Then the _site directory should exist
94 And I should see "Post category: movies" in "_site/movies/film/scifi/2009/03/27/star-wars.html"
95
96 Scenario: Use post.categories variable when category is in a folder and duplicated category is in YAML
97 Given I have a movies directory
98 And I have a movies/_posts directory
99 And I have a _layouts directory
100 And I have the following post in "movies":
101 | title | date | layout | category | content |
102 | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. |
103 And I have a simple layout that contains "Post category: {{ page.categories }}"
104 When I run jekyll build
69105 Then the _site directory should exist
70106 And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
71107
73109 Given I have a _posts directory
74110 And I have a _layouts directory
75111 And I have the following post:
76 | title | date | layout | tag | content |
112 | title | date | layout | tag | content |
77113 | Star Wars | 2009-05-18 | simple | twist | Luke, I am your father. |
78114 And I have a simple layout that contains "Post tags: {{ page.tags }}"
79 When I run jekyll
115 When I run jekyll build
80116 Then the _site directory should exist
81117 And I should see "Post tags: twist" in "_site/2009/05/18/star-wars.html"
82118
86122 And I have a scifi/movies/_posts directory
87123 And I have a _layouts directory
88124 And I have the following post in "scifi/movies":
89 | title | date | layout | content |
90 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
91 And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
92 When I run jekyll
125 | title | date | layout | content |
126 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
127 And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
128 When I run jekyll build
93129 Then the _site directory should exist
94130 And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
95131
99135 And I have a scifi/Movies/_posts directory
100136 And I have a _layouts directory
101137 And I have the following post in "scifi/Movies":
102 | title | date | layout | content |
103 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
104 And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
105 When I run jekyll
138 | title | date | layout | content |
139 | Star Wars | 2009-03-27 | simple | Luke, I am your father. |
140 And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
141 When I run jekyll build
106142 Then the _site directory should exist
107143 And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
108144
110146 Given I have a _posts directory
111147 And I have a _layouts directory
112148 And I have the following post:
113 | title | date | layout | category | content |
149 | title | date | layout | category | content |
114150 | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. |
115151 And I have a simple layout that contains "Post category: {{ page.categories }}"
116 When I run jekyll
152 When I run jekyll build
117153 Then the _site directory should exist
118154 And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
119155
121157 Given I have a _posts directory
122158 And I have a _layouts directory
123159 And I have the following post:
124 | title | date | layout | category | content |
160 | title | date | layout | category | content |
125161 | Star Wars | 2009-03-27 | simple | Movies | Luke, I am your father. |
126162 And I have a simple layout that contains "Post category: {{ page.categories }}"
127 When I run jekyll
128 Then the _site directory should exist
129 And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
130
131 Scenario: Use post.categories variable when category is in YAML
132 Given I have a _posts directory
133 And I have a _layouts directory
134 And I have the following post:
135 | title | date | layout | category | content |
136 | Star Wars | 2009-03-27 | simple | movies | Luke, I am your father. |
137 And I have a simple layout that contains "Post category: {{ page.categories }}"
138 When I run jekyll
163 When I run jekyll build
164 Then the _site directory should exist
165 And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
166
167 Scenario: Use post.categories variable when categories are in YAML
168 Given I have a _posts directory
169 And I have a _layouts directory
170 And I have the following post:
171 | title | date | layout | categories | content |
172 | Star Wars | 2009-03-27 | simple | ['scifi', 'movies'] | Luke, I am your father. |
173 And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
174 When I run jekyll build
175 Then the _site directory should exist
176 And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
177
178 Scenario: Use post.categories variable when categories are in YAML and are duplicated
179 Given I have a _posts directory
180 And I have a _layouts directory
181 And I have the following post:
182 | title | date | layout | categories | content |
183 | Star Wars | 2009-03-27 | simple | ['movies', 'movies'] | Luke, I am your father. |
184 And I have a simple layout that contains "Post category: {{ page.categories }}"
185 When I run jekyll build
139186 Then the _site directory should exist
140187 And I should see "Post category: movies" in "_site/movies/2009/03/27/star-wars.html"
141188
143190 Given I have a _posts directory
144191 And I have a _layouts directory
145192 And I have the following posts:
146 | title | date | layout | categories | content |
193 | title | date | layout | categories | content |
147194 | Star Wars | 2009-03-27 | simple | ['scifi', 'Movies'] | Luke, I am your father. |
148195 | Star Trek | 2013-03-17 | simple | ['SciFi', 'movies'] | Jean Luc, I am your father. |
149196 And I have a simple layout that contains "Post categories: {{ page.categories | array_to_sentence_string }}"
150 When I run jekyll
197 When I run jekyll build
151198 Then the _site directory should exist
152199 And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2009/03/27/star-wars.html"
153200 And I should see "Post categories: scifi and movies" in "_site/scifi/movies/2013/03/17/star-trek.html"
155202 Scenario Outline: Use page.path variable
156203 Given I have a <dir>/_posts directory
157204 And I have the following post in "<dir>":
158 | title | type | date | content |
205 | title | type | date | content |
159206 | my-post | html | 2013-04-12 | Source path: {{ page.path }} |
160 When I run jekyll
207 When I run jekyll build
161208 Then the _site directory should exist
162209 And I should see "Source path: <path_prefix>_posts/2013-04-12-my-post.html" in "_site/<dir>/2013/04/12/my-post.html"
163210
164211 Examples:
165 | dir | path_prefix |
166 | . | |
167 | dir | dir/ |
212 | dir | path_prefix |
213 | . | |
214 | dir | dir/ |
168215 | dir/nested | dir/nested/ |
169216
170217 Scenario: Override page.path variable
171218 Given I have a _posts directory
172219 And I have the following post:
173 | title | date | path | content |
220 | title | date | path | content |
174221 | override | 2013-04-12 | override-path.html | Custom path: {{ page.path }} |
175 When I run jekyll
222 When I run jekyll build
176223 Then the _site directory should exist
177224 And I should see "Custom path: override-path.html" in "_site/2013/04/12/override.html"
178225
180227 Given I have a _posts directory
181228 And I have an "index.html" file that contains "Published!"
182229 And I have the following post:
183 | title | date | layout | published | content |
230 | title | date | layout | published | content |
184231 | Star Wars | 2009-03-27 | simple | false | Luke, I am your father. |
185 When I run jekyll
232 When I run jekyll build
186233 Then the _site directory should exist
187234 And the "_site/2009/03/27/star-wars.html" file should not exist
188235 And I should see "Published!" in "_site/index.html"
191238 Given I have a _posts directory
192239 And I have a _layouts directory
193240 And I have the following post:
194 | title | date | layout | author | content |
241 | title | date | layout | author | content |
195242 | Star Wars | 2009-03-27 | simple | Darth Vader | Luke, I am your father. |
196243 And I have a simple layout that contains "Post author: {{ page.author }}"
197 When I run jekyll
244 When I run jekyll build
198245 Then the _site directory should exist
199246 And I should see "Post author: Darth Vader" in "_site/2009/03/27/star-wars.html"
200247
202249 Given I have a _posts directory
203250 And I have a _layouts directory
204251 And I have the following posts:
205 | title | date | layout | author | content |
252 | title | date | layout | author | content |
206253 | Star Wars | 2009-03-27 | ordered | Darth Vader | Luke, I am your father. |
207254 | Some like it hot | 2009-04-27 | ordered | Osgood | Nobody is perfect. |
208255 | Terminator | 2009-05-27 | ordered | Arnold | Sayonara, baby |
209256 And I have a ordered layout that contains "Previous post: {{ page.previous.title }} and next post: {{ page.next.title }}"
210 When I run jekyll
257 When I run jekyll build
211258 Then the _site directory should exist
212259 And I should see "next post: Some like it hot" in "_site/2009/03/27/star-wars.html"
213260 And I should see "Previous post: Some like it hot" in "_site/2009/05/27/terminator.html"
88 Given I have an "index.html" page that contains "{% for post in site.posts %}{{ post.excerpt }}{% endfor %}"
99 And I have a _posts directory
1010 And I have the following posts:
11 | title | date | layout | content |
12 | entry1 | 2007-12-31 | post | content for entry1. |
13 When I run jekyll
11 | title | date | layout | content |
12 | entry1 | 2007-12-31 | post | content for entry1. |
13 When I run jekyll build
1414 Then the _site directory should exist
1515 And I should see exactly "<p>content for entry1.</p>" in "_site/index.html"
1616
2020 And I have a _layouts directory
2121 And I have a post layout that contains "{{ page.excerpt }}"
2222 And I have the following posts:
23 | title | date | layout | content |
24 | entry1 | 2007-12-31 | post | content for entry1. |
25 When I run jekyll
23 | title | date | layout | content |
24 | entry1 | 2007-12-31 | post | content for entry1. |
25 When I run jekyll build
2626 Then the _site directory should exist
2727 And the _site/2007 directory should exist
2828 And the _site/2007/12 directory should exist
3737 And I have a _layouts directory
3838 And I have a post layout that contains "<html><head></head><body>{{ page.excerpt }}</body></html>"
3939 And I have the following posts:
40 | title | date | layout | content |
41 | entry1 | 2007-12-31 | post | content for entry1. |
42 When I run jekyll
40 | title | date | layout | content |
41 | entry1 | 2007-12-31 | post | content for entry1. |
42 When I run jekyll build
4343 Then the _site directory should exist
4444 And the _site/2007 directory should exist
4545 And the _site/2007/12 directory should exist
0 Feature: Rendering
1 As a hacker who likes to blog
2 I want to be able to make a static site
3 In order to share my awesome ideas with the interwebs
4 But I want to make it as simply as possible
5 So render with Liquid and place in Layouts
6
7 Scenario: Render Liquid and place in layout
8 Given I have a "index.html" page with layout "simple" that contains "Hi there, Jekyll {{ jekyll.environment }}!"
9 And I have a simple layout that contains "{{ content }}Ahoy, indeed!"
10 When I run jekyll build
11 Then the _site directory should exist
12 And I should see "Hi there, Jekyll development!\nAhoy, indeed" in "_site/index.html"
13
14 Scenario: Don't place asset files in layout
15 Given I have an "index.scss" page with layout "simple" that contains ".foo-bar { color:black; }"
16 And I have an "index.coffee" page with layout "simple" that contains "whatever()"
17 And I have a simple layout that contains "{{ content }}Ahoy, indeed!"
18 When I run jekyll build
19 Then the _site directory should exist
20 And I should not see "Ahoy, indeed!" in "_site/index.css"
21 And I should not see "Ahoy, indeed!" in "_site/index.js"
22
23 Scenario: Don't render liquid in Sass
24 Given I have an "index.scss" page that contains ".foo-bar { color:{{site.color}}; }"
25 When I run jekyll build
26 Then the _site directory should not exist
27 And I should see "Invalid CSS after" in the build output
28
29 Scenario: Don't render liquid in CoffeeScript
30 Given I have an "index.coffee" page that contains "hey='for {{site.animal}}'"
31 When I run jekyll build
32 Then the _site directory should exist
33 And I should see "hey = 'for {{site.animal}}';" in "_site/index.js"
66 Given I have a blank site in "_sourcedir"
77 And I have an "_sourcedir/index.html" file that contains "Changing source directory"
88 And I have a configuration file with "source" set to "_sourcedir"
9 When I run jekyll
9 When I run jekyll build
1010 Then the _site directory should exist
1111 And I should see "Changing source directory" in "_site/index.html"
1212
1313 Scenario: Change destination directory
1414 Given I have an "index.html" file that contains "Changing destination directory"
1515 And I have a configuration file with "destination" set to "_mysite"
16 When I run jekyll
16 When I run jekyll build
1717 Then the _mysite directory should exist
1818 And I should see "Changing destination directory" in "_mysite/index.html"
1919
2424 | key | value |
2525 | source | <source> |
2626 | destination | <dest> |
27 When I run jekyll
27 When I run jekyll build
2828 Then the <source> directory should exist
2929 And the "<dest>/index.html" file should <file_exist> exist
3030 And I should see "markdown" in "<source>/index.md"
4343 And I have an "README" file that contains "I want to be excluded"
4444 And I have an "index.html" file that contains "I want to be included"
4545 And I have a configuration file with "exclude" set to "['Rakefile', 'README']"
46 When I run jekyll
46 When I run jekyll build
4747 Then I should see "I want to be included" in "_site/index.html"
4848 And the "_site/Rakefile" file should not exist
4949 And the "_site/README" file should not exist
5656 | value |
5757 | README |
5858 | Rakefile |
59 When I run jekyll
59 When I run jekyll build
6060 Then I should see "I want to be included" in "_site/index.html"
6161 And the "_site/Rakefile" file should not exist
6262 And the "_site/README" file should not exist
6464 Scenario: Use RDiscount for markup
6565 Given I have an "index.markdown" page that contains "[Google](http://google.com)"
6666 And I have a configuration file with "markdown" set to "rdiscount"
67 When I run jekyll
67 When I run jekyll build
6868 Then the _site directory should exist
6969 And I should see "<a href=\"http://google.com\">Google</a>" in "_site/index.html"
7070
7171 Scenario: Use Kramdown for markup
7272 Given I have an "index.markdown" page that contains "[Google](http://google.com)"
7373 And I have a configuration file with "markdown" set to "kramdown"
74 When I run jekyll
74 When I run jekyll build
7575 Then the _site directory should exist
7676 And I should see "<a href=\"http://google.com\">Google</a>" in "_site/index.html"
7777
7878 Scenario: Use Redcarpet for markup
7979 Given I have an "index.markdown" page that contains "[Google](http://google.com)"
8080 And I have a configuration file with "markdown" set to "redcarpet"
81 When I run jekyll
81 When I run jekyll build
8282 Then the _site directory should exist
8383 And I should see "<a href=\"http://google.com\">Google</a>" in "_site/index.html"
8484
8585 Scenario: Use Maruku for markup
8686 Given I have an "index.markdown" page that contains "[Google](http://google.com)"
8787 And I have a configuration file with "markdown" set to "maruku"
88 When I run jekyll
88 When I run jekyll build
8989 Then the _site directory should exist
9090 And I should see "<a href=\"http://google.com\">Google</a>" in "_site/index.html"
9191
9292 Scenario: Highlight code with pygments
93 Given I have an "index.html" file that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}"
94 And I have a configuration file with "pygments" set to "true"
95 When I run jekyll
96 Then the _site directory should exist
97 And I should see "puts 'Hello world!'" in "_site/index.html"
93 Given I have an "index.html" page that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}"
94 When I run jekyll build
95 Then the _site directory should exist
96 And I should see "Hello world!" in "_site/index.html"
97 And I should see "class=\"highlight\"" in "_site/index.html"
98
99 Scenario: Highlight code with rouge
100 Given I have an "index.html" page that contains "{% highlight ruby %} puts 'Hello world!' {% endhighlight %}"
101 And I have a configuration file with "highlighter" set to "rouge"
102 When I run jekyll build
103 Then the _site directory should exist
104 And I should see "Hello world!" in "_site/index.html"
105 And I should see "class=\"highlight\"" in "_site/index.html"
106
107 Scenario: Rouge renders code block once
108 Given I have a configuration file with "highlighter" set to "rouge"
109 And I have a _posts directory
110 And I have the following post:
111 | title | date | layout | content |
112 | foo | 2014-04-27 11:34 | default | {% highlight text %} test {% endhighlight %} |
113 When I run jekyll build
114 Then I should not see "highlight(.*)highlight" in "_site/2014/04/27/foo.html"
98115
99116 Scenario: Set time and no future dated posts
100117 Given I have a _layouts directory
107124 | future | false |
108125 And I have a _posts directory
109126 And I have the following posts:
110 | title | date | layout | content |
111 | entry1 | 2007-12-31 | post | content for entry1. |
112 | entry2 | 2020-01-31 | post | content for entry2. |
113 When I run jekyll
127 | title | date | layout | content |
128 | entry1 | 2007-12-31 | post | content for entry1. |
129 | entry2 | 2020-01-31 | post | content for entry2. |
130 When I run jekyll build
114131 Then the _site directory should exist
115132 And I should see "Page Layout: 1 on 2010-01-01" in "_site/index.html"
116133 And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
127144 | future | true |
128145 And I have a _posts directory
129146 And I have the following posts:
130 | title | date | layout | content |
131 | entry1 | 2007-12-31 | post | content for entry1. |
132 | entry2 | 2020-01-31 | post | content for entry2. |
133 When I run jekyll
147 | title | date | layout | content |
148 | entry1 | 2007-12-31 | post | content for entry1. |
149 | entry2 | 2020-01-31 | post | content for entry2. |
150 When I run jekyll build
134151 Then the _site directory should exist
135152 And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html"
136153 And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
149166 | title | date | layout | content |
150167 | entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. |
151168 | entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. |
152 When I run jekyll
169 When I run jekyll build
153170 Then the _site directory should exist
154171 And I should see "Page Layout: 2" in "_site/index.html"
155172 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"
168185 | title | date | layout | content |
169186 | entry1 | 2013-04-09 23:22 -0400 | post | content for entry1. |
170187 | entry2 | 2013-04-10 03:14 -0400 | post | content for entry2. |
171 When I run jekyll
188 When I run jekyll build
172189 Then the _site directory should exist
173190 And I should see "Page Layout: 2" in "_site/index.html"
174191 And the "_site/2013/04/10/entry1.html" file should exist
182199 | key | value |
183200 | limit_posts | 2 |
184201 And I have the following posts:
185 | title | date | content |
186 | Apples | 2009-03-27 | An article about apples |
187 | Oranges | 2009-04-01 | An article about oranges |
188 | Bananas | 2009-04-05 | An article about bananas |
189 When I run jekyll
202 | title | date | content |
203 | Apples | 2009-03-27 | An article about apples |
204 | Oranges | 2009-04-01 | An article about oranges |
205 | Bananas | 2009-04-05 | An article about bananas |
206 When I run jekyll build
190207 Then the _site directory should exist
191208 And the "_site/2009/04/05/bananas.html" file should exist
192209 And the "_site/2009/04/01/oranges.html" file should exist
199216 | value |
200217 | .gitignore |
201218 | .foo |
202 When I run jekyll
219 When I run jekyll build
203220 Then the _site directory should exist
204221 And I should see ".DS_Store" in "_site/.gitignore"
205222 And the "_site/.htaccess" file should not exist
216233 | layouts | _theme |
217234 And I have a _posts directory
218235 And I have the following posts:
219 | title | date | layout | content |
220 | entry1 | 2007-12-31 | post | content for entry1. |
221 | entry2 | 2020-01-31 | post | content for entry2. |
222 When I run jekyll
236 | title | date | layout | content |
237 | entry1 | 2007-12-31 | post | content for entry1. |
238 | entry2 | 2020-01-31 | post | content for entry2. |
239 When I run jekyll build
223240 Then the _site directory should exist
224241 And I should see "Page Layout: 2 on 2010-01-01" in "_site/index.html"
225242 And I should see "Post Layout: <p>content for entry1.</p>" in "_site/2007/12/31/entry1.html"
228245 Scenario: Add a gem-based plugin
229246 Given I have an "index.html" file that contains "Whatever"
230247 And I have a configuration file with "gems" set to "[jekyll_test_plugin]"
231 When I run jekyll
248 When I run jekyll build
232249 Then the _site directory should exist
233250 And I should see "Whatever" in "_site/index.html"
234251 And I should see "this is a test" in "_site/test.txt"
252
253 Scenario: Add an empty whitelist to restrict all gems
254 Given I have an "index.html" file that contains "Whatever"
255 And I have a configuration file with:
256 | key | value |
257 | gems | [jekyll_test_plugin] |
258 | whitelist | [] |
259 When I run jekyll build --safe
260 Then the _site directory should exist
261 And I should see "Whatever" in "_site/index.html"
262 And the "_site/test.txt" file should not exist
263
264 Scenario: Add a whitelist to restrict some gems but allow others
265 Given I have an "index.html" file that contains "Whatever"
266 And I have a configuration file with:
267 | key | value |
268 | gems | [jekyll_test_plugin, jekyll_test_plugin_malicious] |
269 | whitelist | [jekyll_test_plugin] |
270 When I run jekyll build --safe
271 Then the _site directory should exist
272 And I should see "Whatever" in "_site/index.html"
273 And the "_site/test.txt" file should exist
274 And I should see "this is a test" in "_site/test.txt"
275
276 Scenario: arbitrary file reads via layouts
277 Given I have an "index.html" page with layout "page" that contains "FOO"
278 And I have a "_config.yml" file that contains "layouts: '../../../../../../../../../../../../../../usr/include'"
279 When I run jekyll build
280 Then the _site directory should exist
281 And I should see "FOO" in "_site/index.html"
282 And I should not see " " in "_site/index.html"
44
55 Scenario: Use page variable in a page
66 Given I have an "contact.html" page with title "Contact" that contains "{{ page.title }}: email@example.com"
7 When I run jekyll
7 When I run jekyll build
88 Then the _site directory should exist
99 And I should see "Contact: email@example.com" in "_site/contact.html"
1010
1111 Scenario Outline: Use page.path variable in a page
1212 Given I have a <dir> directory
1313 And I have a "<path>" page that contains "Source path: {{ page.path }}"
14 When I run jekyll
14 When I run jekyll build
1515 Then the _site directory should exist
1616 And I should see "Source path: <path>" in "_site/<path>"
1717
1818 Examples:
19 | dir | path |
20 | . | index.html |
21 | dir | dir/about.html |
19 | dir | path |
20 | . | index.html |
21 | dir | dir/about.html |
2222 | dir/nested | dir/nested/page.html |
2323
2424 Scenario: Override page.path
2525 Given I have an "override.html" page with path "custom-override.html" that contains "Custom path: {{ page.path }}"
26 When I run jekyll
26 When I run jekyll build
2727 Then the _site directory should exist
2828 And I should see "Custom path: custom-override.html" in "_site/override.html"
2929
3030 Scenario: Use site.time variable
3131 Given I have an "index.html" page that contains "{{ site.time }}"
32 When I run jekyll
32 When I run jekyll build
3333 Then the _site directory should exist
3434 And I should see today's time in "_site/index.html"
3535
3737 Given I have a _posts directory
3838 And I have an "index.html" page that contains "{{ site.posts.first.title }}: {{ site.posts.first.url }}"
3939 And I have the following posts:
40 | title | date | content |
41 | First Post | 2009-03-25 | My First Post |
42 | Second Post | 2009-03-26 | My Second Post |
43 | Third Post | 2009-03-27 | My Third Post |
44 When I run jekyll
40 | title | date | content |
41 | First Post | 2009-03-25 | My First Post |
42 | Second Post | 2009-03-26 | My Second Post |
43 | Third Post | 2009-03-27 | My Third Post |
44 When I run jekyll build
4545 Then the _site directory should exist
4646 And I should see "Third Post: /2009/03/27/third-post.html" in "_site/index.html"
4747
4949 Given I have a _posts directory
5050 And I have an "index.html" page that contains "{% for post in site.posts %} {{ post.title }} {% endfor %}"
5151 And I have the following posts:
52 | title | date | content |
53 | First Post | 2009-03-25 | My First Post |
54 | Second Post | 2009-03-26 | My Second Post |
55 | Third Post | 2009-03-27 | My Third Post |
56 When I run jekyll
52 | title | date | content |
53 | First Post | 2009-03-25 | My First Post |
54 | Second Post | 2009-03-26 | My Second Post |
55 | Third Post | 2009-03-27 | My Third Post |
56 When I run jekyll build
5757 Then the _site directory should exist
5858 And I should see "Third Post Second Post First Post" in "_site/index.html"
5959
6161 Given I have a _posts directory
6262 And I have an "index.html" page that contains "{% for post in site.categories.code %} {{ post.title }} {% endfor %}"
6363 And I have the following posts:
64 | title | date | category | content |
64 | title | date | category | content |
6565 | Awesome Hack | 2009-03-26 | code | puts 'Hello World' |
6666 | Delicious Beer | 2009-03-26 | food | 1) Yuengling |
67 When I run jekyll
67 When I run jekyll build
6868 Then the _site directory should exist
6969 And I should see "Awesome Hack" in "_site/index.html"
7070
7272 Given I have a _posts directory
7373 And I have an "index.html" page that contains "{% for post in site.tags.beer %} {{ post.content }} {% endfor %}"
7474 And I have the following posts:
75 | title | date | tag | content |
76 | Delicious Beer | 2009-03-26 | beer | 1) Yuengling |
77 When I run jekyll
75 | title | date | tag | content |
76 | Delicious Beer | 2009-03-26 | beer | 1) Yuengling |
77 When I run jekyll build
7878 Then the _site directory should exist
7979 And I should see "Yuengling" in "_site/index.html"
8080
8282 Given I have a _posts directory
8383 And I have an "index.html" page that contains "{% for post in site.posts %}{{ post.title }}:{{ post.previous.title}},{{ post.next.title}} {% endfor %}"
8484 And I have the following posts:
85 | title | date | content |
85 | title | date | content |
8686 | first | 2009-02-26 | first |
8787 | A | 2009-03-26 | A |
8888 | B | 2009-03-26 | B |
8989 | C | 2009-03-26 | C |
9090 | last | 2009-04-26 | last |
91 When I run jekyll
91 When I run jekyll build
9292 Then the _site directory should exist
9393 And I should see "last:C, C:B,last B:A,C A:first,B first:,A" in "_site/index.html"
9494
9595 Scenario: Use configuration date in site payload
9696 Given I have an "index.html" page that contains "{{ site.url }}"
9797 And I have a configuration file with "url" set to "http://example.com"
98 When I run jekyll
98 When I run jekyll build
9999 Then the _site directory should exist
100100 And I should see "http://example.com" in "_site/index.html"
101101
102102 Scenario: Access Jekyll version via jekyll.version
103103 Given I have an "index.html" page that contains "{{ jekyll.version }}"
104 When I run jekyll
104 When I run jekyll build
105105 Then the _site directory should exist
106106 And I should see "\d+\.\d+\.\d+" in "_site/index.html"
0 def file_content_from_hash(input_hash)
1 matter_hash = input_hash.reject { |k, v| k == "content" }
2 matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp
3
4 content = if input_hash['input'] && input_hash['filter']
5 "{{ #{input_hash['input']} | #{input_hash['filter']} }}"
6 else
7 input_hash['content']
8 end
9
10 <<EOF
11 ---
12 #{matter}
13 ---
14 #{content}
15 EOF
16 end
17
018 Before do
1 FileUtils.rm_rf(TEST_DIR)
2 FileUtils.mkdir(TEST_DIR)
19 FileUtils.mkdir_p(TEST_DIR) unless File.exist?(TEST_DIR)
320 Dir.chdir(TEST_DIR)
421 end
522
23 After do
24 FileUtils.rm_rf(TEST_DIR) if File.exists?(TEST_DIR)
25 FileUtils.rm(JEKYLL_COMMAND_OUTPUT_FILE) if File.exists?(JEKYLL_COMMAND_OUTPUT_FILE)
26 end
27
628 World(Test::Unit::Assertions)
729
830 Given /^I have a blank site in "(.*)"$/ do |path|
9 FileUtils.mkdir_p(path)
31 FileUtils.mkdir_p(path) unless File.exist?(path)
1032 end
1133
1234 Given /^I do not have a "(.*)" directory$/ do |path|
5779 FileUtils.mkdir_p(dir)
5880 end
5981
60 Given /^I have the following (draft|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table|
61 table.hashes.each do |post|
62 title = slug(post['title'])
63 ext = post['type'] || 'textile'
82 Given /^I have the following (draft|page|post)s?(?: (in|under) "([^"]+)")?:$/ do |status, direction, folder, table|
83 table.hashes.each do |input_hash|
84 title = slug(input_hash['title'])
85 ext = input_hash['type'] || 'textile'
6486 before, after = location(folder, direction)
6587
66 if "draft" == status
67 folder_post = '_drafts'
88 case status
89 when "draft"
90 dest_folder = '_drafts'
6891 filename = "#{title}.#{ext}"
69 elsif "post" == status
70 parsed_date = Time.xmlschema(post['date']) rescue Time.parse(post['date'])
71 folder_post = '_posts'
92 when "page"
93 dest_folder = ''
94 filename = "#{title}.#{ext}"
95 when "post"
96 parsed_date = Time.xmlschema(input_hash['date']) rescue Time.parse(input_hash['date'])
97 dest_folder = '_posts'
7298 filename = "#{parsed_date.strftime('%Y-%m-%d')}-#{title}.#{ext}"
7399 end
74100
75 path = File.join(before, folder_post, after, filename)
76
77 matter_hash = {}
78 %w(title layout tag tags category categories published author path date permalink).each do |key|
79 matter_hash[key] = post[key] if post[key]
80 end
81 matter = matter_hash.map { |k, v| "#{k}: #{v}\n" }.join.chomp
82
83 content = if post['input'] && post['filter']
84 "{{ #{post['input']} | #{post['filter']} }}"
85 else
86 post['content']
87 end
88
101 path = File.join(before, dest_folder, after, filename)
89102 File.open(path, 'w') do |f|
90 f.write <<EOF
91 ---
92 #{matter}
93 ---
94 #{content}
95 EOF
103 f.write file_content_from_hash(input_hash)
96104 end
97105 end
98106 end
120128 end
121129 end
122130
123
124 When /^I run jekyll$/ do
125 run_jekyll
126 end
127
128 When /^I run jekyll with drafts$/ do
129 run_jekyll(:drafts => true)
130 end
131
132 When /^I call jekyll new with test_blank --blank$/ do
133 call_jekyll_new(:path => "test_blank", :blank => true)
134 end
135
136 When /^I debug jekyll$/ do
137 run_jekyll(:debug => true)
131 Given /^I have fixture collections$/ do
132 FileUtils.cp_r File.join(JEKYLL_SOURCE_DIR, "test", "source", "_methods"), source_dir
133 end
134
135 ##################
136 #
137 # Changing stuff
138 #
139 ##################
140
141 When /^I run jekyll(.*)$/ do |args|
142 status = run_jekyll(args)
143 if args.include?("--verbose") || ENV['DEBUG']
144 puts jekyll_run_output
145 end
138146 end
139147
140148 When /^I change "(.*)" to contain "(.*)"$/ do |file, text|
156164 end
157165
158166 Then /^I should see "(.*)" in "(.*)"$/ do |text, file|
159 assert_match Regexp.new(text), file_contents(file)
167 assert_match Regexp.new(text, Regexp::MULTILINE), file_contents(file)
160168 end
161169
162170 Then /^I should see exactly "(.*)" in "(.*)"$/ do |text, file|
164172 end
165173
166174 Then /^I should not see "(.*)" in "(.*)"$/ do |text, file|
167 assert_no_match Regexp.new(text), file_contents(file)
175 assert_no_match Regexp.new(text, Regexp::MULTILINE), file_contents(file)
168176 end
169177
170178 Then /^I should see escaped "(.*)" in "(.*)"$/ do |text, file|
176184 end
177185
178186 Then /^the "(.*)" file should not exist$/ do |file|
179 assert !File.exists?(file), "The file \"#{file}\" exists"
187 assert !File.exist?(file), "The file \"#{file}\" exists"
180188 end
181189
182190 Then /^I should see today's time in "(.*)"$/ do |file|
186194 Then /^I should see today's date in "(.*)"$/ do |file|
187195 assert_match Regexp.new(Date.today.to_s), file_contents(file)
188196 end
197
198 Then /^I should see "(.*)" in the build output$/ do |text|
199 assert_match Regexp.new(text), jekyll_run_output
200 end
0 if RUBY_VERSION > '1.9'
1 require 'coveralls'
2 Coveralls.wear_merged!
3 end
4
50 require 'fileutils'
61 require 'rr'
72 require 'test/unit'
83 require 'time'
94
10 TEST_DIR = File.join('/', 'tmp', 'jekyll')
5 JEKYLL_SOURCE_DIR = File.dirname(File.dirname(File.dirname(__FILE__)))
6 TEST_DIR = File.expand_path(File.join('..', '..', 'tmp', 'jekyll'), File.dirname(__FILE__))
117 JEKYLL_PATH = File.join(File.dirname(__FILE__), '..', '..', 'bin', 'jekyll')
8 JEKYLL_COMMAND_OUTPUT_FILE = File.join(File.dirname(TEST_DIR), 'jekyll_output.txt')
129
13 def run_jekyll(opts = {})
14 command = JEKYLL_PATH.clone
15 command << " build --trace"
16 command << " --drafts" if opts[:drafts]
17 command << " >> /dev/null 2>&1" if opts[:debug].nil?
18 system command
10 def source_dir(*files)
11 File.join(TEST_DIR, *files)
1912 end
2013
21 def call_jekyll_new(opts = {})
22 command = JEKYLL_PATH.clone
23 command << " new --trace"
24 command << " #{opts[:path]}" if opts[:path]
25 command << " --blank" if opts[:blank]
26 command << " >> /dev/null 2>&1" if opts[:debug].nil?
27 system command
14 def jekyll_output_file
15 JEKYLL_COMMAND_OUTPUT_FILE
16 end
17
18 def jekyll_run_output
19 File.read(jekyll_output_file)
20 end
21
22 def run_jekyll(args)
23 system "#{JEKYLL_PATH} #{args} --trace > #{jekyll_output_file} 2>&1"
2824 end
2925
3026 def slug(title)
31 title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-')
27 if title
28 title.downcase.gsub(/[^\w]/, " ").strip.gsub(/\s+/, '-')
29 else
30 Time.now.strftime("%s%9N") # nanoseconds since the Epoch
31 end
3232 end
3333
3434 def location(folder, direction)
4646 end
4747
4848 def seconds_agnostic_datetime(datetime = Time.now)
49 pieces = datetime.to_s.split(" ")
50 if pieces.size == 6 # Ruby 1.8.7
51 date = pieces[0..2].join(" ")
52 time = seconds_agnostic_time(pieces[3])
53 zone = pieces[4..5].join(" ")
54 else # Ruby 1.9.1 or greater
55 date, time, zone = pieces
56 time = seconds_agnostic_time(time)
57 end
49 date, time, zone = datetime.to_s.split(" ")
50 time = seconds_agnostic_time(time)
5851 [
5952 Regexp.escape(date),
6053 "#{time}:\\d{2}",
6962 hour, minutes, _ = time.split(":")
7063 "#{hour}:#{minutes}"
7164 end
72
73 # work around "invalid option: --format" cucumber bug (see #296)
74 Test::Unit.run = true if RUBY_VERSION < '1.9'
0 # coding: utf-8
1 lib = File.expand_path('../lib', __FILE__)
2 $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3 require 'jekyll/version'
4
05 Gem::Specification.new do |s|
16 s.specification_version = 2 if s.respond_to? :specification_version=
27 s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
3 s.rubygems_version = '1.3.5'
8 s.rubygems_version = '2.2.2'
9 s.required_ruby_version = '>= 1.9.3'
410
511 s.name = 'jekyll'
6 s.version = '1.5.1'
12 s.version = Jekyll::VERSION
713 s.license = 'MIT'
8 s.date = '2014-03-28'
9 s.rubyforge_project = 'jekyll'
1014
1115 s.summary = "A simple, blog aware, static site generator."
1216 s.description = "Jekyll is a simple, blog aware, static site generator."
1317
1418 s.authors = ["Tom Preston-Werner"]
1519 s.email = 'tom@mojombo.com'
16 s.homepage = 'http://github.com/mojombo/jekyll'
20 s.homepage = 'https://github.com/jekyll/jekyll'
1721
18 s.require_paths = %w[lib]
19
20 s.executables = ["jekyll"]
22 s.files = `git ls-files`.split($/)
23 s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
24 s.test_files = s.files.grep(%r{^(test|spec|features)/})
25 s.require_paths = ["lib"]
2126
2227 s.rdoc_options = ["--charset=UTF-8"]
2328 s.extra_rdoc_files = %w[README.markdown LICENSE]
2429
25 s.add_runtime_dependency('liquid', "~> 2.5.5")
26 s.add_runtime_dependency('classifier', "~> 1.3")
27 s.add_runtime_dependency('listen', "~> 1.3")
28 s.add_runtime_dependency('maruku', "0.7.0")
29 s.add_runtime_dependency('pygments.rb', "~> 0.5.0")
30 s.add_runtime_dependency('commander', "~> 4.1.3")
30 s.add_runtime_dependency('liquid', "~> 2.6.1")
31 s.add_runtime_dependency('kramdown', "~> 1.3")
32 s.add_runtime_dependency('mercenary', "~> 0.3.3")
3133 s.add_runtime_dependency('safe_yaml', "~> 1.0")
3234 s.add_runtime_dependency('colorator', "~> 0.1")
33 s.add_runtime_dependency('redcarpet', "~> 2.3.0")
35
36 # Before 3.0 drops, phase the following gems out as dev dependencies
37 # and gracefully handle their absence.
38 s.add_runtime_dependency('classifier', "~> 1.3")
39 s.add_runtime_dependency('pygments.rb', "~> 0.6.0")
40 s.add_runtime_dependency('redcarpet', "~> 3.1")
3441 s.add_runtime_dependency('toml', '~> 0.1.0')
42 s.add_runtime_dependency('jekyll-paginate', '~> 1.0')
43 s.add_runtime_dependency('jekyll-gist', '~> 1.0')
44 s.add_runtime_dependency('jekyll-coffeescript', '~> 1.0')
45 s.add_runtime_dependency('jekyll-sass-converter', '~> 1.0')
46 s.add_runtime_dependency('jekyll-watch', '~> 1.0')
3547
3648 s.add_development_dependency('rake', "~> 10.1")
3749 s.add_development_dependency('rdoc', "~> 3.11")
3850 s.add_development_dependency('redgreen', "~> 1.2")
39 s.add_development_dependency('shoulda', "~> 3.3.2")
51 s.add_development_dependency('shoulda', "~> 3.5")
4052 s.add_development_dependency('rr', "~> 1.1")
4153 s.add_development_dependency('cucumber', "1.3.11")
4254 s.add_development_dependency('RedCloth', "~> 4.2")
43 s.add_development_dependency('kramdown', "~> 1.2")
55 s.add_development_dependency('maruku', "~> 0.7.0")
4456 s.add_development_dependency('rdiscount', "~> 1.6")
4557 s.add_development_dependency('launchy', "~> 2.3")
4658 s.add_development_dependency('simplecov', "~> 0.7")
4759 s.add_development_dependency('simplecov-gem-adapter', "~> 1.0.1")
48 s.add_development_dependency('coveralls', "~> 0.7.0")
4960 s.add_development_dependency('mime-types', "~> 1.5")
5061 s.add_development_dependency('activesupport', '~> 3.2.13')
5162 s.add_development_dependency('jekyll_test_plugin')
52
53 # = MANIFEST =
54 s.files = %w[
55 CONTRIBUTING.markdown
56 Gemfile
57 History.markdown
58 LICENSE
59 README.markdown
60 Rakefile
61 bin/jekyll
62 cucumber.yml
63 features/create_sites.feature
64 features/data.feature
65 features/drafts.feature
66 features/embed_filters.feature
67 features/include_tag.feature
68 features/markdown.feature
69 features/pagination.feature
70 features/permalinks.feature
71 features/post_data.feature
72 features/post_excerpts.feature
73 features/site_configuration.feature
74 features/site_data.feature
75 features/step_definitions/jekyll_steps.rb
76 features/support/env.rb
77 jekyll.gemspec
78 lib/jekyll.rb
79 lib/jekyll/cleaner.rb
80 lib/jekyll/command.rb
81 lib/jekyll/commands/build.rb
82 lib/jekyll/commands/doctor.rb
83 lib/jekyll/commands/new.rb
84 lib/jekyll/commands/serve.rb
85 lib/jekyll/configuration.rb
86 lib/jekyll/converter.rb
87 lib/jekyll/converters/identity.rb
88 lib/jekyll/converters/markdown.rb
89 lib/jekyll/converters/markdown/kramdown_parser.rb
90 lib/jekyll/converters/markdown/maruku_parser.rb
91 lib/jekyll/converters/markdown/rdiscount_parser.rb
92 lib/jekyll/converters/markdown/redcarpet_parser.rb
93 lib/jekyll/converters/textile.rb
94 lib/jekyll/convertible.rb
95 lib/jekyll/core_ext.rb
96 lib/jekyll/deprecator.rb
97 lib/jekyll/draft.rb
98 lib/jekyll/entry_filter.rb
99 lib/jekyll/errors.rb
100 lib/jekyll/excerpt.rb
101 lib/jekyll/filters.rb
102 lib/jekyll/generator.rb
103 lib/jekyll/generators/pagination.rb
104 lib/jekyll/layout.rb
105 lib/jekyll/mime.types
106 lib/jekyll/page.rb
107 lib/jekyll/plugin.rb
108 lib/jekyll/post.rb
109 lib/jekyll/related_posts.rb
110 lib/jekyll/site.rb
111 lib/jekyll/static_file.rb
112 lib/jekyll/stevenson.rb
113 lib/jekyll/tags/gist.rb
114 lib/jekyll/tags/highlight.rb
115 lib/jekyll/tags/include.rb
116 lib/jekyll/tags/post_url.rb
117 lib/jekyll/url.rb
118 lib/site_template/.gitignore
119 lib/site_template/_config.yml
120 lib/site_template/_layouts/default.html
121 lib/site_template/_layouts/post.html
122 lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
123 lib/site_template/css/main.css
124 lib/site_template/css/syntax.css
125 lib/site_template/index.html
126 script/bootstrap
127 site/.gitignore
128 site/CNAME
129 site/README
130 site/_config.yml
131 site/_includes/analytics.html
132 site/_includes/docs_contents.html
133 site/_includes/docs_contents_mobile.html
134 site/_includes/docs_option.html
135 site/_includes/docs_ul.html
136 site/_includes/footer.html
137 site/_includes/header.html
138 site/_includes/news_contents.html
139 site/_includes/news_contents_mobile.html
140 site/_includes/news_item.html
141 site/_includes/primary-nav-items.html
142 site/_includes/section_nav.html
143 site/_includes/top.html
144 site/_layouts/default.html
145 site/_layouts/docs.html
146 site/_layouts/news.html
147 site/_layouts/news_item.html
148 site/_posts/2013-05-06-jekyll-1-0-0-released.markdown
149 site/_posts/2013-05-08-jekyll-1-0-1-released.markdown
150 site/_posts/2013-05-12-jekyll-1-0-2-released.markdown
151 site/_posts/2013-06-07-jekyll-1-0-3-released.markdown
152 site/_posts/2013-07-14-jekyll-1-1-0-released.markdown
153 site/_posts/2013-07-24-jekyll-1-1-1-released.markdown
154 site/_posts/2013-07-25-jekyll-1-0-4-released.markdown
155 site/_posts/2013-07-25-jekyll-1-1-2-released.markdown
156 site/_posts/2013-09-06-jekyll-1-2-0-released.markdown
157 site/_posts/2013-09-14-jekyll-1-2-1-released.markdown
158 site/_posts/2013-10-28-jekyll-1-3-0-rc1-released.markdown
159 site/_posts/2013-11-04-jekyll-1-3-0-released.markdown
160 site/_posts/2013-11-26-jekyll-1-3-1-released.markdown
161 site/_posts/2013-12-07-jekyll-1-4-0-released.markdown
162 site/_posts/2013-12-16-jekyll-1-4-2-released.markdown
163 site/_posts/2014-01-13-jekyll-1-4-3-released.markdown
164 site/_posts/2014-03-24-jekyll-1-5-0-released.markdown
165 site/_posts/2014-03-27-jekyll-1-5-1-released.markdown
166 site/css/gridism.css
167 site/css/normalize.css
168 site/css/pygments.css
169 site/css/style.css
170 site/docs/configuration.md
171 site/docs/contributing.md
172 site/docs/datafiles.md
173 site/docs/deployment-methods.md
174 site/docs/drafts.md
175 site/docs/extras.md
176 site/docs/frontmatter.md
177 site/docs/github-pages.md
178 site/docs/heroku.md
179 site/docs/history.md
180 site/docs/index.md
181 site/docs/installation.md
182 site/docs/migrations.md
183 site/docs/pages.md
184 site/docs/pagination.md
185 site/docs/permalinks.md
186 site/docs/plugins.md
187 site/docs/posts.md
188 site/docs/quickstart.md
189 site/docs/resources.md
190 site/docs/sites.md
191 site/docs/structure.md
192 site/docs/templates.md
193 site/docs/troubleshooting.md
194 site/docs/upgrading.md
195 site/docs/usage.md
196 site/docs/variables.md
197 site/favicon.png
198 site/feed.xml
199 site/freenode.txt
200 site/img/article-footer.png
201 site/img/footer-arrow.png
202 site/img/footer-logo.png
203 site/img/logo-2x.png
204 site/img/octojekyll.png
205 site/img/tube.png
206 site/img/tube1x.png
207 site/index.html
208 site/js/modernizr-2.5.3.min.js
209 site/news/index.html
210 site/news/releases/index.html
211 test/fixtures/broken_front_matter1.erb
212 test/fixtures/broken_front_matter2.erb
213 test/fixtures/broken_front_matter3.erb
214 test/fixtures/exploit_front_matter.erb
215 test/fixtures/front_matter.erb
216 test/helper.rb
217 test/source/+/foo.md
218 test/source/.htaccess
219 test/source/_config.dev.toml
220 test/source/_data/languages.yml
221 test/source/_data/members.yaml
222 test/source/_data/products.yml
223 test/source/_includes/params.html
224 test/source/_includes/sig.markdown
225 test/source/_includes/tmp
226 test/source/_layouts/default.html
227 test/source/_layouts/post/simple.html
228 test/source/_layouts/simple.html
229 test/source/_plugins/dummy.rb
230 test/source/_posts/2008-02-02-not-published.textile
231 test/source/_posts/2008-02-02-published.textile
232 test/source/_posts/2008-10-18-foo-bar.textile
233 test/source/_posts/2008-11-21-complex.textile
234 test/source/_posts/2008-12-03-permalinked-post.textile
235 test/source/_posts/2008-12-13-include.markdown
236 test/source/_posts/2009-01-27-array-categories.textile
237 test/source/_posts/2009-01-27-categories.textile
238 test/source/_posts/2009-01-27-category.textile
239 test/source/_posts/2009-01-27-empty-categories.textile
240 test/source/_posts/2009-01-27-empty-category.textile
241 test/source/_posts/2009-03-12-hash-#1.markdown
242 test/source/_posts/2009-05-18-empty-tag.textile
243 test/source/_posts/2009-05-18-empty-tags.textile
244 test/source/_posts/2009-05-18-tag.textile
245 test/source/_posts/2009-05-18-tags.textile
246 test/source/_posts/2009-06-22-empty-yaml.textile
247 test/source/_posts/2009-06-22-no-yaml.textile
248 test/source/_posts/2010-01-08-triple-dash.markdown
249 test/source/_posts/2010-01-09-date-override.textile
250 test/source/_posts/2010-01-09-time-override.textile
251 test/source/_posts/2010-01-09-timezone-override.textile
252 test/source/_posts/2010-01-16-override-data.textile
253 test/source/_posts/2011-04-12-md-extension.md
254 test/source/_posts/2011-04-12-text-extension.text
255 test/source/_posts/2013-01-02-post-excerpt.markdown
256 test/source/_posts/2013-01-12-nil-layout.textile
257 test/source/_posts/2013-01-12-no-layout.textile
258 test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep
259 test/source/_posts/2013-04-11-custom-excerpt.markdown
260 test/source/_posts/2013-05-10-number-category.textile
261 test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
262 test/source/_posts/2013-08-01-mkdn-extension.mkdn
263 test/source/_posts/2014-01-06-permalink-traversal.md
264 test/source/_posts/es/2008-11-21-nested.textile
265 test/source/about.html
266 test/source/category/_posts/2008-9-23-categories.textile
267 test/source/contacts.html
268 test/source/contacts/bar.html
269 test/source/contacts/index.html
270 test/source/css/screen.css
271 test/source/deal.with.dots.html
272 test/source/exploit.md
273 test/source/foo/_posts/bar/2008-12-12-topical-post.textile
274 test/source/index.html
275 test/source/products.yml
276 test/source/sitemap.xml
277 test/source/symlink-test/_data
278 test/source/symlink-test/symlinked-dir
279 test/source/symlink-test/symlinked-file
280 test/source/win/_posts/2009-05-24-yaml-linebreak.markdown
281 test/source/z_category/_posts/2008-9-23-categories.textile
282 test/suite.rb
283 test/test_command.rb
284 test/test_configuration.rb
285 test/test_convertible.rb
286 test/test_core_ext.rb
287 test/test_entry_filter.rb
288 test/test_excerpt.rb
289 test/test_filters.rb
290 test/test_generated_site.rb
291 test/test_kramdown.rb
292 test/test_new_command.rb
293 test/test_page.rb
294 test/test_pager.rb
295 test/test_path_sanitization.rb
296 test/test_post.rb
297 test/test_rdiscount.rb
298 test/test_redcarpet.rb
299 test/test_redcloth.rb
300 test/test_related_posts.rb
301 test/test_site.rb
302 test/test_tags.rb
303 test/test_url.rb
304 ]
305 # = MANIFEST =
306
307 s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
63 s.add_development_dependency('jekyll_test_plugin_malicious')
64 s.add_development_dependency('rouge', '~> 1.3')
30865 end
33 class Site
44 # Handles the cleanup of a site's destination before it is built.
55 class Cleaner
6 attr_reader :site
7
68 def initialize(site)
79 @site = site
810 end
2628 # Returns a Set with the file paths
2729 def existing_files
2830 files = Set.new
29 Dir.glob(File.join(@site.dest, "**", "*"), File::FNM_DOTMATCH) do |file|
30 files << file unless file =~ /\/\.{1,2}$/ || file =~ keep_file_regex
31 Dir.glob(File.join(site.dest, "**", "*"), File::FNM_DOTMATCH) do |file|
32 files << file unless file =~ /\/\.{1,2}$/ || file =~ keep_file_regex || keep_dirs.include?(file)
3133 end
3234 files
3335 end
3739 # Returns a Set with the file paths
3840 def new_files
3941 files = Set.new
40 @site.each_site_file { |item| files << item.destination(@site.dest) }
42 site.each_site_file { |item| files << item.destination(site.dest) }
4143 files
4244 end
4345
4648 #
4749 # Returns a Set with the directory paths
4850 def new_dirs
49 new_files.map { |file| File.dirname(file) }.to_set
51 new_files.map { |file| parent_dirs(file) }.flatten.to_set
52 end
53
54 # Private: The list of parent directories of a given file
55 #
56 # Returns an Array with the directory paths
57 def parent_dirs(file)
58 parent_dir = File.dirname(file)
59 if parent_dir == site.dest
60 []
61 else
62 [parent_dir] + parent_dirs(parent_dir)
63 end
5064 end
5165
5266 # Private: The list of existing files that will be replaced by a directory during build
5670 new_dirs.select { |dir| File.file?(dir) }.to_set
5771 end
5872
73 # Private: The list of directories that need to be kept because they are parent directories
74 # of files specified in keep_files
75 #
76 # Returns a Set with the directory paths
77 def keep_dirs
78 site.keep_files.map{|file| parent_dirs(File.join(site.dest, file))}.flatten.to_set
79 end
80
5981 # Private: Creates a regular expression from the config's keep_files array
6082 #
6183 # Examples
6385 #
6486 # Returns the regular expression
6587 def keep_file_regex
66 or_list = @site.keep_files.join("|")
88 or_list = site.keep_files.join("|")
6789 pattern = "\/(#{or_list.gsub(".", "\.")})"
6890 Regexp.new pattern
6991 end
0 module Jekyll
1 class Collection
2 attr_reader :site, :label, :metadata
3
4 # Create a new Collection.
5 #
6 # site - the site to which this collection belongs.
7 # label - the name of the collection
8 #
9 # Returns nothing.
10 def initialize(site, label)
11 @site = site
12 @label = sanitize_label(label)
13 @metadata = extract_metadata
14 end
15
16 # Fetch the Documents in this collection.
17 # Defaults to an empty array if no documents have been read in.
18 #
19 # Returns an array of Jekyll::Document objects.
20 def docs
21 @docs ||= []
22 end
23
24 # Read the allowed documents into the collection's array of docs.
25 #
26 # Returns the sorted array of docs.
27 def read
28 filtered_entries.each do |file_path|
29 doc = Jekyll::Document.new(Jekyll.sanitized_path(directory, file_path), { site: site, collection: self })
30 doc.read
31 docs << doc
32 end
33 docs.sort!
34 end
35
36 # All the entries in this collection.
37 #
38 # Returns an Array of file paths to the documents in this collection
39 # relative to the collection's directory
40 def entries
41 return Array.new unless exists?
42 Dir.glob(File.join(directory, "**", "*.*")).map do |entry|
43 entry[File.join(directory, "")] = ''; entry
44 end
45 end
46
47 # Filtered version of the entries in this collection.
48 # See `Jekyll::EntryFilter#filter` for more information.
49 #
50 # Returns a list of filtered entry paths.
51 def filtered_entries
52 return Array.new unless exists?
53 Dir.chdir(directory) do
54 entry_filter.filter(entries).reject { |f| File.directory?(f) }
55 end
56 end
57
58 # The directory for this Collection, relative to the site source.
59 #
60 # Returns a String containing the directory name where the collection
61 # is stored on the filesystem.
62 def relative_directory
63 "_#{label}"
64 end
65
66 # The full path to the directory containing the
67 #
68 # Returns a String containing th directory name where the collection
69 # is stored on the filesystem.
70 def directory
71 Jekyll.sanitized_path(site.source, relative_directory)
72 end
73
74 # Checks whether the directory "exists" for this collection.
75 # The directory must exist on the filesystem and must not be a symlink
76 # if in safe mode.
77 #
78 # Returns false if the directory doesn't exist or if it's a symlink
79 # and we're in safe mode.
80 def exists?
81 File.directory?(directory) && !(File.symlink?(directory) && site.safe)
82 end
83
84 # The entry filter for this collection.
85 # Creates an instance of Jekyll::EntryFilter.
86 #
87 # Returns the instance of Jekyll::EntryFilter for this collection.
88 def entry_filter
89 @entry_filter ||= Jekyll::EntryFilter.new(site, relative_directory)
90 end
91
92 # An inspect string.
93 #
94 # Returns the inspect string
95 def inspect
96 "#<Jekyll::Collection @label=#{label} docs=#{docs}>"
97 end
98
99 # Produce a sanitized label name
100 # Label names may not contain anything but alphanumeric characters,
101 # underscores, and hyphens.
102 #
103 # label - the possibly-unsafe label
104 #
105 # Returns a sanitized version of the label.
106 def sanitize_label(label)
107 label.gsub(/[^a-z0-9_\-\.]/i, '')
108 end
109
110 # Produce a representation of this Collection for use in Liquid.
111 # Exposes two attributes:
112 # - label
113 # - docs
114 #
115 # Returns a representation of this collection for use in Liquid.
116 def to_liquid
117 metadata.merge({
118 "label" => label,
119 "docs" => docs,
120 "directory" => directory,
121 "output" => write?,
122 "relative_directory" => relative_directory
123 })
124 end
125
126 # Whether the collection's documents ought to be written as individual
127 # files in the output.
128 #
129 # Returns true if the 'write' metadata is true, false otherwise.
130 def write?
131 !!metadata['output']
132 end
133
134 # The URL template to render collection's documents at.
135 #
136 # Returns the URL template to render collection's documents at.
137 def url_template
138 metadata.fetch('permalink', "/:collection/:path:output_ext")
139 end
140
141 # Extract options for this collection from the site configuration.
142 #
143 # Returns the metadata for this collection
144 def extract_metadata
145 if site.config['collections'].is_a?(Hash)
146 site.config['collections'][label] || Hash.new
147 else
148 {}
149 end
150 end
151
152 end
153 end
00 module Jekyll
11 class Command
2 def self.globs(source, destination)
3 Dir.chdir(source) do
4 dirs = Dir['*'].select { |x| File.directory?(x) }
5 dirs -= [destination, File.expand_path(destination), File.basename(destination)]
6 dirs = dirs.map { |x| "#{x}/**/*" }
7 dirs += ['*']
2
3 class << self
4
5 # A list of subclasses of Jekyll::Command
6 def subclasses
7 @subclasses ||= []
88 end
9
10 # Keep a list of subclasses of Jekyll::Command every time it's inherited
11 # Called automatically.
12 #
13 # base - the subclass
14 #
15 # Returns nothing
16 def inherited(base)
17 subclasses << base
18 super(base)
19 end
20
21 # Paths to ignore for the watch option
22 #
23 # options - A Hash of options passed to the command
24 #
25 # Returns a list of relative paths from source that should be ignored
26 def ignore_paths(options)
27 source = options['source']
28 destination = options['destination']
29 config_files = Configuration[options].config_files(options)
30 paths = config_files + Array(destination)
31 ignored = []
32
33 source_abs = Pathname.new(source).expand_path
34 paths.each do |p|
35 path_abs = Pathname.new(p).expand_path
36 begin
37 rel_path = path_abs.relative_path_from(source_abs).to_s
38 ignored << Regexp.new(Regexp.escape(rel_path)) unless rel_path.start_with?('../')
39 rescue ArgumentError
40 # Could not find a relative path
41 end
42 end
43 ignored
44 end
45
46 # Run Site#process and catch errors
47 #
48 # site - the Jekyll::Site object
49 #
50 # Returns nothing
51 def process_site(site)
52 site.process
53 rescue Jekyll::Errors::FatalException => e
54 Jekyll.logger.error "ERROR:", "YOUR SITE COULD NOT BE BUILT:"
55 Jekyll.logger.error "", "------------------------------------"
56 Jekyll.logger.error "", e.message
57 exit(1)
58 end
59
60 # Create a full Jekyll configuration with the options passed in as overrides
61 #
62 # options - the configuration overrides
63 #
64 # Returns a full Jekyll configuration
65 def configuration_from_options(options)
66 Jekyll.configuration(options)
67 end
68
69 # Add common options to a command for building configuration
70 #
71 # c - the Jekyll::Command to add these options to
72 #
73 # Returns nothing
74 def add_build_options(c)
75 c.option 'config', '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
76 c.option 'future', '--future', 'Publishes posts with a future date'
77 c.option 'limit_posts', '--limit_posts MAX_POSTS', Integer, 'Limits the number of posts to parse and publish'
78 c.option 'watch', '-w', '--watch', 'Watch for changes and rebuild'
79 c.option 'force_polling', '--force_polling', 'Force watch to use polling'
80 c.option 'lsi', '--lsi', 'Use LSI for improved related posts'
81 c.option 'show_drafts', '-D', '--drafts', 'Render posts in the _drafts folder'
82 c.option 'unpublished', '--unpublished', 'Render posts that were marked as unpublished'
83 c.option 'quiet', '-q', '--quiet', 'Silence output.'
84 c.option 'verbose', '-V', '--verbose', 'Print verbose output.'
85 end
86
987 end
1088
11 # Static: Run Site#process and catch errors
12 #
13 # site - the Jekyll::Site object
14 #
15 # Returns nothing
16 def self.process_site(site)
17 site.process
18 rescue Jekyll::FatalException => e
19 puts
20 Jekyll.logger.error "ERROR:", "YOUR SITE COULD NOT BE BUILT:"
21 Jekyll.logger.error "", "------------------------------------"
22 Jekyll.logger.error "", e.message
23 exit(1)
24 end
2589 end
2690 end
00 module Jekyll
11 module Commands
22 class Build < Command
3 def self.process(options)
4 site = Jekyll::Site.new(options)
53
6 self.build(site, options)
7 self.watch(site, options) if options['watch']
8 end
4 class << self
95
10 # Private: Build the site from source into destination.
11 #
12 # site - A Jekyll::Site instance
13 # options - A Hash of options passed to the command
14 #
15 # Returns nothing.
16 def self.build(site, options)
17 source = options['source']
18 destination = options['destination']
19 Jekyll.logger.info "Source:", source
20 Jekyll.logger.info "Destination:", destination
21 print Jekyll.logger.formatted_topic "Generating..."
22 self.process_site(site)
23 puts "done."
24 end
6 # Create the Mercenary command for the Jekyll CLI for this Command
7 def init_with_program(prog)
8 prog.command(:build) do |c|
9 c.syntax 'build [options]'
10 c.description 'Build your site'
2511
26 # Private: Watch for file changes and rebuild the site.
27 #
28 # site - A Jekyll::Site instance
29 # options - A Hash of options passed to the command
30 #
31 # Returns nothing.
32 def self.watch(site, options)
33 require 'listen'
12 add_build_options(c)
3413
35 source = options['source']
36 destination = options['destination']
37
38 begin
39 dest = Pathname.new(destination).relative_path_from(Pathname.new(source)).to_s
40 ignored = Regexp.new(Regexp.escape(dest))
41 rescue ArgumentError
42 # Destination is outside the source, no need to ignore it.
43 ignored = nil
14 c.action do |args, options|
15 options["serving"] = false
16 Jekyll::Commands::Build.process(options)
17 end
18 end
4419 end
4520
46 Jekyll.logger.info "Auto-regeneration:", "enabled"
21 # Build your jekyll site
22 # Continuously watch if `watch` is set to true in the config.
23 def process(options)
24 Jekyll.logger.log_level = :error if options['quiet']
4725
48 listener = Listen::Listener.new(source, :ignore => ignored) do |modified, added, removed|
49 t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
50 n = modified.length + added.length + removed.length
51 print Jekyll.logger.formatted_topic("Regenerating:") + "#{n} files at #{t} "
52 self.process_site(site)
53 puts "...done."
26 options = configuration_from_options(options)
27 site = Jekyll::Site.new(options)
28
29 if options.fetch('skip_initial_build', false)
30 Jekyll.logger.warn "Build Warning:", "Skipping the initial build. This may result in an out-of-date site."
31 else
32 build(site, options)
33 end
34 watch(site, options) if options['watch']
5435 end
55 listener.start
5636
57 unless options['serving']
58 trap("INT") do
59 listener.stop
60 puts " Halting auto-regeneration."
61 exit 0
62 end
37 # Build your Jekyll site.
38 #
39 # site - the Jekyll::Site instance to build
40 # options - A Hash of options passed to the command
41 #
42 # Returns nothing.
43 def build(site, options)
44 source = options['source']
45 destination = options['destination']
46 Jekyll.logger.info "Source:", source
47 Jekyll.logger.info "Destination:", destination
48 Jekyll.logger.info "Generating..."
49 process_site(site)
50 Jekyll.logger.info "", "done."
51 end
6352
64 loop { sleep 1000 }
53 # Private: Watch for file changes and rebuild the site.
54 #
55 # site - A Jekyll::Site instance
56 # options - A Hash of options passed to the command
57 #
58 # Returns nothing.
59 def watch(site, options)
60 Deprecator.gracefully_require 'jekyll-watch'
61 Jekyll::Commands::Watch.watch(site, options)
6562 end
66 end
63
64 end # end of class << self
65
6766 end
6867 end
6968 end
0 module Jekyll
1 module Commands
2 class Docs < Command
3
4 class << self
5
6 def init_with_program(prog)
7 prog.command(:docs) do |c|
8 c.syntax 'docs'
9 c.description "Launch local server with docs for Jekyll v#{Jekyll::VERSION}"
10
11 c.option 'port', '-P', '--port [PORT]', 'Port to listen on'
12 c.option 'host', '-H', '--host [HOST]', 'Host to bind to'
13
14 c.action do |args, options|
15 options.merge!({
16 'source' => File.expand_path("../../../site", File.dirname(__FILE__)),
17 'destination' => File.expand_path("../../../site/_site", File.dirname(__FILE__))
18 })
19 Jekyll::Commands::Build.process(options)
20 Jekyll::Commands::Serve.process(options)
21 end
22 end
23 end
24
25 end
26
27 end
28 end
29 end
11 module Commands
22 class Doctor < Command
33 class << self
4
5 def init_with_program(prog)
6 prog.command(:doctor) do |c|
7 c.syntax 'doctor'
8 c.description 'Search site and print specific deprecation warnings'
9 c.alias(:hyde)
10
11 c.option '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
12
13 c.action do |args, options|
14 Jekyll::Commands::Doctor.process(options)
15 end
16 end
17 end
18
419 def process(options)
5 site = Jekyll::Site.new(options)
20 site = Jekyll::Site.new(configuration_from_options(options))
621 site.read
722
823 if healthy?(site)
2540 if page.uses_relative_permalinks
2641 Jekyll.logger.warn "Deprecation:", "'#{page.path}' uses relative" +
2742 " permalinks which will be deprecated in" +
28 " Jekyll v1.2 and beyond."
43 " Jekyll v2.0.0 and beyond."
2944 contains_deprecated_pages = true
3045 end
3146 end
6075 end
6176 urls
6277 end
78
6379 end
80
6481 end
6582 end
6683 end
22 module Jekyll
33 module Commands
44 class New < Command
5 def self.init_with_program(prog)
6 prog.command(:new) do |c|
7 c.syntax 'new PATH'
8 c.description 'Creates a new Jekyll site scaffold in PATH'
9
10 c.option 'force', '--force', 'Force creation even if PATH already exists'
11 c.option 'blank', '--blank', 'Creates scaffolding but with empty files'
12
13 c.action do |args, options|
14 Jekyll::Commands::New.process(args, options)
15 end
16 end
17 end
18
519 def self.process(args, options = {})
620 raise ArgumentError.new('You must specify a path.') if args.empty?
721
822 new_blog_path = File.expand_path(args.join(" "), Dir.pwd)
923 FileUtils.mkdir_p new_blog_path
1024 if preserve_source_location?(new_blog_path, options)
11 Jekyll.logger.error "Conflict:", "#{new_blog_path} exists and is not empty."
12 exit(1)
25 Jekyll.logger.abort_with "Conflict:", "#{new_blog_path} exists and is not empty."
1326 end
1427
15 if options[:blank]
28 if options["blank"]
1629 create_blank_site new_blog_path
1730 else
1831 create_sample_files new_blog_path
1932
20 File.open(File.expand_path(self.initialized_post_name, new_blog_path), "w") do |f|
21 f.write(self.scaffold_post_content)
33 File.open(File.expand_path(initialized_post_name, new_blog_path), "w") do |f|
34 f.write(scaffold_post_content)
2235 end
2336 end
2437
25 puts "New jekyll site installed in #{new_blog_path}."
38 Jekyll.logger.info "New jekyll site installed in #{new_blog_path}."
2639 end
2740
2841 def self.create_blank_site(path)
4659 private
4760
4861 def self.preserve_source_location?(path, options)
49 !options[:force] && !Dir["#{path}/**/*"].empty?
62 !options["force"] && !Dir["#{path}/**/*"].empty?
5063 end
5164
5265 def self.create_sample_files(path)
11 module Jekyll
22 module Commands
33 class Serve < Command
4 def self.process(options)
5 require 'webrick'
6 include WEBrick
74
8 destination = options['destination']
5 class << self
96
10 FileUtils.mkdir_p(destination)
7 def init_with_program(prog)
8 prog.command(:serve) do |c|
9 c.syntax 'serve [options]'
10 c.description 'Serve your site locally'
11 c.alias :server
12
13 add_build_options(c)
14
15 c.option 'detach', '-B', '--detach', 'Run the server in the background (detach)'
16 c.option 'port', '-P', '--port [PORT]', 'Port to listen on'
17 c.option 'host', '-H', '--host [HOST]', 'Host to bind to'
18 c.option 'baseurl', '-b', '--baseurl [URL]', 'Base URL'
19 c.option 'skip_initial_build', '--skip-initial-build', 'Skips the initial site build which occurs before the server is started.'
20
21 c.action do |args, options|
22 options["serving"] ||= true
23 Jekyll::Commands::Build.process(options)
24 Jekyll::Commands::Serve.process(options)
25 end
26 end
27 end
28
29 # Boot up a WEBrick server which points to the compiled site's root.
30 def process(options)
31 options = configuration_from_options(options)
32 destination = options['destination']
33 setup(destination)
34
35 s = WEBrick::HTTPServer.new(webrick_options(options))
36 s.unmount("")
37
38 s.mount(
39 options['baseurl'],
40 WEBrick::HTTPServlet::FileHandler,
41 destination,
42 file_handler_options
43 )
44
45 Jekyll.logger.info "Server address:", server_address(s, options)
46
47 if options['detach'] # detach the server
48 pid = Process.fork { s.start }
49 Process.detach(pid)
50 Jekyll.logger.info "Server detached with pid '#{pid}'.", "Run `kill -9 #{pid}' to stop the server."
51 else # create a new server thread, then join it with current terminal
52 t = Thread.new { s.start }
53 trap("INT") { s.shutdown }
54 t.join
55 end
56 end
57
58 def setup(destination)
59 require 'webrick'
60
61 FileUtils.mkdir_p(destination)
62
63 # monkey patch WEBrick using custom 404 page (/404.html)
64 if File.exist?(File.join(destination, '404.html'))
65 WEBrick::HTTPResponse.class_eval do
66 def create_error_page
67 @header['content-type'] = "text/html; charset=UTF-8"
68 @body = IO.read(File.join(@config[:DocumentRoot], '404.html'))
69 end
70 end
71 end
72 end
73
74 def webrick_options(config)
75 opts = {
76 :DocumentRoot => config['destination'],
77 :Port => config['port'],
78 :BindAddress => config['host'],
79 :MimeTypes => mime_types,
80 :DoNotReverseLookup => true,
81 :StartCallback => start_callback(config['detach']),
82 :DirectoryIndex => %w(index.html index.htm index.cgi index.rhtml index.xml)
83 }
84
85 if !config['verbose']
86 opts.merge!({
87 :AccessLog => [],
88 :Logger => WEBrick::Log.new([], WEBrick::Log::WARN)
89 })
90 end
91
92 opts
93 end
94
95 def start_callback(detached)
96 unless detached
97 Proc.new { Jekyll.logger.info "Server running...", "press ctrl-c to stop." }
98 end
99 end
100
101 def mime_types
102 mime_types_file = File.expand_path('../mime.types', File.dirname(__FILE__))
103 WEBrick::HTTPUtils::load_mime_types(mime_types_file)
104 end
105
106 def server_address(server, options)
107 baseurl = "#{options['baseurl']}/" if options['baseurl']
108 [
109 "http://",
110 server.config[:BindAddress],
111 ":",
112 server.config[:Port],
113 baseurl || ""
114 ].map(&:to_s).join("")
115 end
11116
12117 # recreate NondisclosureName under utf-8 circumstance
13 fh_option = WEBrick::Config::FileHandler
14 fh_option[:NondisclosureName] = ['.ht*','~*']
118 def file_handler_options
119 fh_option = WEBrick::Config::FileHandler
120 fh_option[:NondisclosureName] = ['.ht*','~*']
121 fh_option
122 end
15123
16 s = HTTPServer.new(webrick_options(options))
17
18 s.mount(options['baseurl'], HTTPServlet::FileHandler, destination, fh_option)
19
20 Jekyll.logger.info "Server address:", "http://#{s.config[:BindAddress]}:#{s.config[:Port]}"
21
22 if options['detach'] # detach the server
23 pid = Process.fork { s.start }
24 Process.detach(pid)
25 Jekyll.logger.info "Server detatched with pid '#{pid}'.", "Run `kill -9 #{pid}' to stop the server."
26 else # create a new server thread, then join it with current terminal
27 t = Thread.new { s.start }
28 trap("INT") { s.shutdown }
29 t.join()
30 end
31124 end
32125
33 def self.webrick_options(config)
34 opts = {
35 :Port => config['port'],
36 :BindAddress => config['host'],
37 :MimeTypes => self.mime_types,
38 :DoNotReverseLookup => true,
39 :StartCallback => start_callback(config['detach'])
40 }
41
42 if !config['verbose']
43 opts.merge!({
44 :AccessLog => [],
45 :Logger => Log::new([], Log::WARN)
46 })
47 end
48
49 opts
50 end
51
52 def self.start_callback(detached)
53 unless detached
54 Proc.new { Jekyll.logger.info "Server running...", "press ctrl-c to stop." }
55 end
56 end
57
58 def self.mime_types
59 mime_types_file = File.expand_path('../mime.types', File.dirname(__FILE__))
60 WEBrick::HTTPUtils::load_mime_types(mime_types_file)
61 end
62126 end
63127 end
64128 end
1212 'data_source' => '_data',
1313 'keep_files' => ['.git','.svn'],
1414 'gems' => [],
15 'collections' => nil,
1516
1617 'timezone' => nil, # use the local timezone
1718
18 'encoding' => nil, # use the system encoding
19 'encoding' => 'utf-8', # always use utf-8 encoding. NEVER FORGET
1920
2021 'safe' => false,
2122 'detach' => false, # default to not detaching the server
2324 'limit_posts' => 0,
2425 'lsi' => false,
2526 'future' => true, # remove and make true just default
26 'pygments' => true,
27
28 'relative_permalinks' => true, # backwards-compatibility with < 1.0
29 # will be set to false once 2.0 hits
30
31 'markdown' => 'maruku',
27 'unpublished' => false,
28
29 'relative_permalinks' => false,
30
31 'markdown' => 'kramdown',
32 'highlighter' => 'pygments',
3233 'permalink' => 'date',
33 'baseurl' => '/',
34 'baseurl' => '',
3435 'include' => ['.htaccess'],
3536 'exclude' => [],
3637 'paginate_path' => '/page:num',
3738
38 'markdown_ext' => 'markdown,mkd,mkdn,md',
39 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md',
3940 'textile_ext' => 'textile',
4041
42 'quiet' => false,
4143 'port' => '4000',
4244 'host' => '0.0.0.0',
4345
4446 'excerpt_separator' => "\n\n",
4547
48 'defaults' => [],
49
4650 'maruku' => {
47 'fenced_code_blocks' => true,
4851 'use_tex' => false,
4952 'use_divs' => false,
5053 'png_engine' => 'blahtex',
5154 'png_dir' => 'images/latex',
52 'png_url' => '/images/latex'
55 'png_url' => '/images/latex',
56 'fenced_code_blocks' => true
5357 },
5458
5559 'rdiscount' => {
99103 override['source'] || self['source'] || DEFAULTS['source']
100104 end
101105
106 def quiet?(override = {})
107 override['quiet'] || self['quiet'] || DEFAULTS['quiet']
108 end
109
102110 def safe_load_file(filename)
103111 case File.extname(filename)
104112 when '.toml'
105113 TOML.load_file(filename)
106114 when /\.y(a)?ml/
107 YAML.safe_load_file(filename)
115 SafeYAML.load_file(filename)
108116 else
109117 raise ArgumentError, "No parser for '#{filename}' is available. Use a .toml or .y(a)ml file instead."
110118 end
116124 #
117125 # Returns an Array of config files
118126 def config_files(override)
127 # Be quiet quickly.
128 Jekyll.logger.log_level = :error if quiet?(override)
129
119130 # Get configuration from <source>/_config.yml or <source>/<config_file>
120131 config_files = override.delete('config')
121132 if config_files.to_s.empty?
122 config_files = File.join(source(override), "_config.yml")
133 default = %w[yml yaml].find(Proc.new { 'yml' }) do |ext|
134 File.exists? Jekyll.sanitized_path(source(override), "_config.#{ext}")
135 end
136 config_files = Jekyll.sanitized_path(source(override), "_config.#{default}")
123137 @default_config_file = true
124138 end
125139 config_files = [config_files] unless config_files.is_a? Array
158172 begin
159173 files.each do |config_file|
160174 new_config = read_config_file(config_file)
161 configuration = configuration.deep_merge(new_config)
175 configuration = Utils.deep_merge_hashes(configuration, new_config)
162176 end
163177 rescue ArgumentError => err
164178 Jekyll.logger.warn "WARNING:", "Error reading configuration. " +
209223 config.delete('server_port')
210224 end
211225
226 if config.has_key? 'pygments'
227 Jekyll.logger.warn "Deprecation:", "The 'pygments' configuration option" +
228 " has been renamed to 'highlighter'. Please update your" +
229 " config file accordingly. The allowed values are 'rouge', " +
230 "'pygments' or null."
231
232 config['highlighter'] = 'pygments' if config['pygments']
233 config.delete('pygments')
234 end
235
212236 %w[include exclude].each do |option|
213237 if config.fetch(option, []).is_a?(String)
214238 Jekyll.logger.warn "Deprecation:", "The '#{option}' configuration option" +
217241 " as a list of comma-separated values."
218242 config[option] = csv_to_array(config[option])
219243 end
244 config[option].map!(&:to_s)
245 end
246
247 if config.fetch('markdown', 'kramdown').to_s.downcase.eql?("maruku")
248 Jekyll::Deprecator.deprecation_message "You're using the 'maruku' " +
249 "Markdown processor. Maruku support has been deprecated and will " +
250 "be removed in 3.0.0. We recommend you switch to Kramdown."
220251 end
221252 config
222253 end
232263
233264 config
234265 end
235
236266 end
237267 end
00 module Jekyll
11 class Converter < Plugin
2 # Public: Get or set the pygments prefix. When an argument is specified,
2 # Public: Get or set the highlighter prefix. When an argument is specified,
33 # the prefix will be set. If no argument is specified, the current prefix
44 # will be returned.
55 #
6 # pygments_prefix - The String prefix (default: nil).
6 # highlighter_prefix - The String prefix (default: nil).
77 #
88 # Returns the String prefix.
9 def self.pygments_prefix(pygments_prefix = nil)
10 @pygments_prefix = pygments_prefix if pygments_prefix
11 @pygments_prefix
9 def self.highlighter_prefix(highlighter_prefix = nil)
10 @highlighter_prefix = highlighter_prefix if highlighter_prefix
11 @highlighter_prefix
1212 end
1313
14 # Public: Get or set the pygments suffix. When an argument is specified,
14 # Public: Get or set the highlighter suffix. When an argument is specified,
1515 # the suffix will be set. If no argument is specified, the current suffix
1616 # will be returned.
1717 #
18 # pygments_suffix - The String suffix (default: nil).
18 # highlighter_suffix - The String suffix (default: nil).
1919 #
2020 # Returns the String suffix.
21 def self.pygments_suffix(pygments_suffix = nil)
22 @pygments_suffix = pygments_suffix if pygments_suffix
23 @pygments_suffix
21 def self.highlighter_suffix(highlighter_suffix = nil)
22 @highlighter_suffix = highlighter_suffix if highlighter_suffix
23 @highlighter_suffix
2424 end
2525
2626 # Initialize the converter.
3030 @config = config
3131 end
3232
33 # Get the pygments prefix.
33 # Get the highlighter prefix.
3434 #
3535 # Returns the String prefix.
36 def pygments_prefix
37 self.class.pygments_prefix
36 def highlighter_prefix
37 self.class.highlighter_prefix
3838 end
3939
40 # Get the pygments suffix.
40 # Get the highlighter suffix.
4141 #
4242 # Returns the String suffix.
43 def pygments_suffix
44 self.class.pygments_suffix
43 def highlighter_suffix
44 self.class.highlighter_suffix
4545 end
4646 end
4747 end
77 rescue LoadError
88 STDERR.puts 'You are missing a library required for Markdown. Please run:'
99 STDERR.puts ' $ [sudo] gem install kramdown'
10 raise FatalException.new("Missing dependency: kramdown")
10 raise Errors::FatalException.new("Missing dependency: kramdown")
1111 end
1212
1313 def convert(content)
1919 end
2020 end
2121
22 Kramdown::Document.new(content, @config["kramdown"].symbolize_keys).to_html
22 Kramdown::Document.new(content, Utils.symbolize_hash_keys(@config["kramdown"])).to_html
2323 end
2424
2525 end
77 @errors = []
88 load_divs_library if @config['maruku']['use_divs']
99 load_blahtext_library if @config['maruku']['use_tex']
10 enable_fenced_code_blocks if @config['maruku']['fenced_code_blocks']
10
11 # allow fenced code blocks (new in Maruku 0.7.0)
12 MaRuKu::Globals[:fenced_code_blocks] = !!@config['maruku']['fenced_code_blocks']
13
1114 rescue LoadError
1215 STDERR.puts 'You are missing a library required for Markdown. Please run:'
1316 STDERR.puts ' $ [sudo] gem install maruku'
14 raise FatalException.new("Missing dependency: maruku")
17 raise Errors::FatalException.new("Missing dependency: maruku")
1518 end
1619
1720 def load_divs_library
3538 MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url']
3639 end
3740
38 def enable_fenced_code_blocks
39 MaRuKu::Globals[:fenced_code_blocks] = true
40 end
41
4241 def print_errors_and_fail
4342 print @errors.join
4443 raise MaRuKu::Exception, "MaRuKu encountered problem(s) while converting your markup."
22 class Markdown
33 class RDiscountParser
44 def initialize(config)
5 require 'rdiscount'
5 Jekyll::Deprecator.gracefully_require "rdiscount"
66 @config = config
77 @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym }
8 rescue LoadError
9 STDERR.puts 'You are missing a library required for Markdown. Please run:'
10 STDERR.puts ' $ [sudo] gem install rdiscount'
11 raise FatalException.new("Missing dependency: rdiscount")
128 end
139
1410 def convert(content)
44
55 module CommonMethods
66 def add_code_tags(code, lang)
7 code = code.sub(/<pre>/, "<pre><code class=\"#{lang} language-#{lang}\" data-lang=\"#{lang}\">")
7 code = code.to_s
8 code = code.sub(/<pre>/, "<pre><code class=\"language-#{lang}\" data-lang=\"#{lang}\">")
89 code = code.sub(/<\/pre>/,"</code></pre>")
910 end
1011 end
1213 module WithPygments
1314 include CommonMethods
1415 def block_code(code, lang)
15 require 'pygments'
16 Jekyll::Deprecator.gracefully_require("pygments")
1617 lang = lang && lang.split.first || "text"
17 output = add_code_tags(
18 add_code_tags(
1819 Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),
1920 lang
2021 )
2122 end
2223 end
2324
24 module WithoutPygments
25 module WithoutHighlighting
2526 require 'cgi'
2627
2728 include CommonMethods
3233
3334 def block_code(code, lang)
3435 lang = lang && lang.split.first || "text"
35 output = add_code_tags(code_wrap(code), lang)
36 add_code_tags(code_wrap(code), lang)
3637 end
3738 end
3839
40 module WithRouge
41 def block_code(code, lang)
42 code = "<pre>#{super}</pre>"
43
44 output = "<div class=\"highlight\">"
45 output << add_code_tags(code, lang)
46 output << "</div>"
47 end
48
49 protected
50 def rouge_formatter(opts = {})
51 Rouge::Formatters::HTML.new(opts.merge(wrap: false))
52 end
53 end
54
55
3956 def initialize(config)
40 require 'redcarpet'
57 Deprecator.gracefully_require("redcarpet")
4158 @config = config
4259 @redcarpet_extensions = {}
4360 @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true }
4461
45 @renderer ||= if @config['pygments']
46 Class.new(Redcarpet::Render::HTML) do
47 include WithPygments
48 end
49 else
50 Class.new(Redcarpet::Render::HTML) do
51 include WithoutPygments
52 end
53 end
54 rescue LoadError
55 STDERR.puts 'You are missing a library required for Markdown. Please run:'
56 STDERR.puts ' $ [sudo] gem install redcarpet'
57 raise FatalException.new("Missing dependency: redcarpet")
62 @renderer ||= class_with_proper_highlighter(@config['highlighter'])
63 end
64
65 def class_with_proper_highlighter(highlighter)
66 case highlighter
67 when "pygments"
68 Class.new(Redcarpet::Render::HTML) do
69 include WithPygments
70 end
71 when "rouge"
72 Class.new(Redcarpet::Render::HTML) do
73 Jekyll::Deprecator.gracefully_require(%w[
74 rouge
75 rouge/plugins/redcarpet
76 ])
77
78 if Rouge.version < '1.3.0'
79 abort "Please install Rouge 1.3.0 or greater and try running Jekyll again."
80 end
81
82 include Rouge::Plugins::Redcarpet
83 include CommonMethods
84 include WithRouge
85 end
86 else
87 Class.new(Redcarpet::Render::HTML) do
88 include WithoutHighlighting
89 end
90 end
5891 end
5992
6093 def convert(content)
22 class Markdown < Converter
33 safe true
44
5 pygments_prefix "\n"
6 pygments_suffix "\n"
5 highlighter_prefix "\n"
6 highlighter_suffix "\n"
77
88 def setup
99 return if @setup
10 @parser = case @config['markdown']
11 when 'redcarpet'
12 RedcarpetParser.new @config
13 when 'kramdown'
14 KramdownParser.new @config
15 when 'rdiscount'
16 RDiscountParser.new @config
17 when 'maruku'
18 MarukuParser.new @config
10 @parser =
11 case @config['markdown'].downcase
12 when 'redcarpet' then RedcarpetParser.new(@config)
13 when 'kramdown' then KramdownParser.new(@config)
14 when 'rdiscount' then RDiscountParser.new(@config)
15 when 'maruku' then MarukuParser.new(@config)
1916 else
20 STDERR.puts "Invalid Markdown processor: #{@config['markdown']}"
21 STDERR.puts " Valid options are [ maruku | rdiscount | kramdown | redcarpet ]"
22 raise FatalException.new("Invalid Markdown process: #{@config['markdown']}")
23 end
17 # So they can't try some tricky bullshit or go down the ancestor chain, I hope.
18 if allowed_custom_class?(@config['markdown'])
19 self.class.const_get(@config['markdown']).new(@config)
20 else
21 Jekyll.logger.error "Invalid Markdown Processor:", "#{@config['markdown']}"
22 Jekyll.logger.error "", "Valid options are [ #{valid_processors.join(" | ")} ]"
23 raise Errors::FatalException, "Invalid Markdown Processor: #{@config['markdown']}"
24 end
25 end
2426 @setup = true
27 end
28
29 def valid_processors
30 %w[
31 maruku
32 rdiscount
33 kramdown
34 redcarpet
35 ] + third_party_processors
36 end
37
38 def third_party_processors
39 self.class.constants - %w[
40 KramdownParser
41 MarukuParser
42 RDiscountParser
43 RedcarpetParser
44 PRIORITIES
45 ].map(&:to_sym)
2546 end
2647
2748 def matches(ext)
3758 setup
3859 @parser.convert(content)
3960 end
61
62 private
63
64 # Private: Determine whether a class name is an allowed custom markdown
65 # class name
66 #
67 # parser_name - the name of the parser class
68 #
69 # Returns true if the parser name contains only alphanumeric characters
70 # and is defined within Jekyll::Converters::Markdown
71 def allowed_custom_class?(parser_name)
72 parser_name !~ /[^A-Za-z0-9]/ && self.class.constants.include?(parser_name.to_sym)
73 end
4074 end
4175 end
4276 end
22 class Textile < Converter
33 safe true
44
5 pygments_prefix '<notextile>'
6 pygments_suffix '</notextile>'
5 highlighter_prefix '<notextile>'
6 highlighter_suffix '</notextile>'
77
88 def setup
99 return if @setup
1212 rescue LoadError
1313 STDERR.puts 'You are missing a library required for Textile. Please run:'
1414 STDERR.puts ' $ [sudo] gem install RedCloth'
15 raise FatalException.new("Missing dependency: RedCloth")
15 raise Errors::FatalException.new("Missing dependency: RedCloth")
1616 end
1717
1818 def matches(ext)
3131 return RedCloth.new(content).to_html if @config['redcloth'].nil?
3232
3333 # List of attributes defined on RedCloth
34 # (from http://redcloth.rubyforge.org/classes/RedCloth/TextileDoc.html)
34 # (from https://github.com/jgarber/redcloth/blob/master/lib/redcloth/textile_doc.rb)
3535 attrs = ['filter_classes', 'filter_html', 'filter_ids', 'filter_styles',
3636 'hard_breaks', 'lite_mode', 'no_span_caps', 'sanitize_html']
3737
1212 # self.ext=
1313 # self.output=
1414 # self.name
15 # self.path
16 # self.type -> :page, :post or :draft
17
1518 module Jekyll
1619 module Convertible
1720 # Returns the contents as a String.
1821 def to_s
19 self.content || ''
20 end
21
22 # Returns merged optin hash for File.read of self.site (if exists)
22 content || ''
23 end
24
25 # Whether the file is published or not, as indicated in YAML front-matter
26 def published?
27 !(data.has_key?('published') && data['published'] == false)
28 end
29
30 # Returns merged option hash for File.read of self.site (if exists)
2331 # and a given param
2432 def merged_file_read_opts(opts)
25 (self.site ? self.site.file_read_opts : {}).merge(opts)
33 (site ? site.file_read_opts : {}).merge(opts)
2634 end
2735
2836 # Read the YAML frontmatter.
3442 # Returns nothing.
3543 def read_yaml(base, name, opts = {})
3644 begin
37 self.content = File.read_with_options(File.join(base, name),
38 merged_file_read_opts(opts))
39 if self.content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
45 self.content = File.read(Jekyll.sanitized_path(base, name),
46 merged_file_read_opts(opts))
47 if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
4048 self.content = $POSTMATCH
41 self.data = YAML.safe_load($1)
49 self.data = SafeYAML.load($1)
4250 end
4351 rescue SyntaxError => e
44 puts "YAML Exception reading #{File.join(base, name)}: #{e.message}"
52 Jekyll.logger.warn "YAML Exception reading #{File.join(base, name)}: #{e.message}"
4553 rescue Exception => e
46 puts "Error reading file #{File.join(base, name)}: #{e.message}"
54 Jekyll.logger.warn "Error reading file #{File.join(base, name)}: #{e.message}"
4755 end
4856
4957 self.data ||= {}
5361 #
5462 # Returns nothing.
5563 def transform
56 self.content = converter.convert(self.content)
64 self.content = converter.convert(content)
5765 rescue => e
5866 Jekyll.logger.error "Conversion error:", "There was an error converting" +
59 " '#{self.path}'."
67 " '#{path}'."
6068 raise e
6169 end
6270
6573 # Returns the String extension for the output file.
6674 # e.g. ".html" for an HTML output file.
6775 def output_ext
68 converter.output_ext(self.ext)
76 converter.output_ext(ext)
6977 end
7078
7179 # Determine which converter to use based on this convertible's
7381 #
7482 # Returns the Converter instance.
7583 def converter
76 @converter ||= self.site.converters.find { |c| c.matches(self.ext) }
84 @converter ||= site.converters.find { |c| c.matches(ext) }
7785 end
7886
7987 # Render Liquid in the content
100108 further_data = Hash[(attrs || self.class::ATTRIBUTES_FOR_LIQUID).map { |attribute|
101109 [attribute, send(attribute)]
102110 }]
103 data.deep_merge(further_data)
111
112 defaults = site.frontmatter_defaults.all(relative_path, type)
113 Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data)
114 end
115
116 # The type of a document,
117 # i.e., its classname downcase'd and to_sym'd.
118 #
119 # Returns the type of self.
120 def type
121 if is_a?(Post)
122 :post
123 elsif is_a?(Page)
124 :page
125 elsif is_a?(Draft)
126 :draft
127 end
128 end
129
130 # Determine whether the document is an asset file.
131 # Asset files include CoffeeScript files and Sass/SCSS files.
132 #
133 # Returns true if the extname belongs to the set of extensions
134 # that asset files use.
135 def asset_file?
136 %w[.sass .scss .coffee].include?(ext)
137 end
138
139 # Determine whether the file should be rendered with Liquid.
140 #
141 # Returns false if the document is either an asset file or a yaml file,
142 # true otherwise.
143 def render_with_liquid?
144 !asset_file?
145 end
146
147 # Determine whether the file should be placed into layouts.
148 #
149 # Returns false if the document is either an asset file or a yaml file,
150 # true otherwise.
151 def place_in_layout?
152 !asset_file?
153 end
154
155 # Checks if the layout specified in the document actually exists
156 #
157 # layout - the layout to check
158 #
159 # Returns true if the layout is invalid, false if otherwise
160 def invalid_layout?(layout)
161 !data["layout"].nil? && data["layout"] != "none" && layout.nil? && !(self.is_a? Jekyll::Excerpt)
104162 end
105163
106164 # Recursively render layouts
112170 # Returns nothing
113171 def render_all_layouts(layouts, payload, info)
114172 # recursively render layouts
115 layout = layouts[self.data["layout"]]
173 layout = layouts[data["layout"]]
174
175 Jekyll.logger.warn("Build Warning:", "Layout '#{data["layout"]}' requested in #{path} does not exist.") if invalid_layout? layout
176
116177 used = Set.new([layout])
117178
118179 while layout
119 payload = payload.deep_merge({"content" => self.output, "page" => layout.data})
120
121 self.output = self.render_liquid(layout.content,
180 payload = Utils.deep_merge_hashes(payload, {"content" => output, "page" => layout.data})
181
182 self.output = render_liquid(layout.content,
122183 payload,
123184 info,
124 File.join(self.site.config['layouts'], layout.name))
185 File.join(site.config['layouts'], layout.name))
125186
126187 if layout = layouts[layout.data["layout"]]
127188 if used.include?(layout)
140201 #
141202 # Returns nothing.
142203 def do_layout(payload, layouts)
143 info = { :filters => [Jekyll::Filters], :registers => { :site => self.site, :page => payload['page'] } }
204 info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload['page'] } }
144205
145206 # render and transform content (this becomes the final content of the object)
146 payload["pygments_prefix"] = converter.pygments_prefix
147 payload["pygments_suffix"] = converter.pygments_suffix
148
149 self.content = self.render_liquid(self.content,
150 payload,
151 info)
152 self.transform
207 payload["highlighter_prefix"] = converter.highlighter_prefix
208 payload["highlighter_suffix"] = converter.highlighter_suffix
209
210 self.content = render_liquid(content, payload, info) if render_with_liquid?
211 transform
153212
154213 # output keeps track of what will finally be written
155 self.output = self.content
156
157 self.render_all_layouts(layouts, payload, info)
214 self.output = content
215
216 render_all_layouts(layouts, payload, info) if place_in_layout?
158217 end
159218
160219 # Write the generated page file to the destination directory.
166225 path = destination(dest)
167226 FileUtils.mkdir_p(File.dirname(path))
168227 File.open(path, 'wb') do |f|
169 f.write(self.output)
228 f.write(output)
229 end
230 end
231
232 # Accessor for data properties by Liquid.
233 #
234 # property - The String name of the property to retrieve.
235 #
236 # Returns the String value or nil if the property isn't included.
237 def [](property)
238 if self.class::ATTRIBUTES_FOR_LIQUID.include?(property)
239 send(property)
240 else
241 data[property]
170242 end
171243 end
172244 end
+0
-90
lib/jekyll/core_ext.rb less more
0 class Hash
1 # Merges self with another hash, recursively.
2 #
3 # This code was lovingly stolen from some random gem:
4 # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
5 #
6 # Thanks to whoever made it.
7 def deep_merge(hash)
8 target = dup
9
10 hash.keys.each do |key|
11 if hash[key].is_a? Hash and self[key].is_a? Hash
12 target[key] = target[key].deep_merge(hash[key])
13 next
14 end
15
16 target[key] = hash[key]
17 end
18
19 target
20 end
21
22 # Read array from the supplied hash favouring the singular key
23 # and then the plural key, and handling any nil entries.
24 # +hash+ the hash to read from
25 # +singular_key+ the singular key
26 # +plural_key+ the plural key
27 #
28 # Returns an array
29 def pluralized_array(singular_key, plural_key)
30 hash = self
31 if hash.has_key?(singular_key)
32 array = [hash[singular_key]] if hash[singular_key]
33 elsif hash.has_key?(plural_key)
34 case hash[plural_key]
35 when String
36 array = hash[plural_key].split
37 when Array
38 array = hash[plural_key].compact
39 end
40 end
41 array || []
42 end
43
44 def symbolize_keys!
45 keys.each do |key|
46 self[(key.to_sym rescue key) || key] = delete(key)
47 end
48 self
49 end
50
51 def symbolize_keys
52 dup.symbolize_keys!
53 end
54 end
55
56 # Thanks, ActiveSupport!
57 class Date
58 # Converts datetime to an appropriate format for use in XML
59 def xmlschema
60 strftime("%Y-%m-%dT%H:%M:%S%Z")
61 end if RUBY_VERSION < '1.9'
62 end
63
64 module Enumerable
65 # Returns true if path matches against any glob pattern.
66 # Look for more detail about glob pattern in method File::fnmatch.
67 def glob_include?(e)
68 any? { |exp| File.fnmatch?(exp, e) }
69 end
70 end
71
72 # Ruby 1.8's File.read don't support option.
73 # read_with_options ignore optional parameter for 1.8,
74 # and act as alias for 1.9 or later.
75 class File
76 if RUBY_VERSION < '1.9'
77 def self.read_with_options(path, opts = {})
78 self.read(path)
79 end
80
81 def self.realpath(filename)
82 Pathname.new(filename).realpath.to_s
83 end
84 else
85 def self.read_with_options(path, opts = {})
86 self.read(path, opts)
87 end
88 end
89 end
00 module Jekyll
1 class Deprecator
1 module Deprecator
22 def self.process(args)
33 no_subcommand(args)
44 arg_is_present? args, "--server", "The --server command has been replaced by the \
88 arg_is_present? args, "--auto", "The switch '--auto' has been replaced with '--watch'."
99 arg_is_present? args, "--no-auto", "To disable auto-replication, simply leave off \
1010 the '--watch' switch."
11 arg_is_present? args, "--pygments", "The 'pygments' setting can only be set in \
12 your config files."
11 arg_is_present? args, "--pygments", "The 'pygments'settings has been removed in \
12 favour of 'highlighter'."
1313 arg_is_present? args, "--paginate", "The 'paginate' setting can only be set in your \
1414 config files."
1515 arg_is_present? args, "--url", "The 'url' setting can only be set in your config files."
1818 def self.no_subcommand(args)
1919 if args.size > 0 && args.first =~ /^--/ && !%w[--help --version].include?(args.first)
2020 Jekyll.logger.error "Deprecation:", "Jekyll now uses subcommands instead of just \
21 switches. Run `jekyll help' to find out more."
21 switches. Run `jekyll --help' to find out more."
2222 end
2323 end
2424
3131 def self.deprecation_message(message)
3232 Jekyll.logger.error "Deprecation:", message
3333 end
34
35 def self.gracefully_require(gem_name)
36 Array(gem_name).each do |name|
37 begin
38 require name
39 rescue LoadError => e
40 Jekyll.logger.error "Dependency Error:", <<-MSG
41 Yikes! It looks like you don't have #{name} or one of its dependencies installed.
42 In order to use Jekyll as currently contfigured, you'll need to install this gem.
43
44 The full error message from Ruby is: '#{e.message}'
45
46 If you run into trouble, you can find helpful resources at http://jekyllrb.com/help/!
47 MSG
48 raise Errors::MissingDependencyException.new(name)
49 end
50 end
51 end
3452 end
3553 end
0 module Jekyll
1 class Document
2 include Comparable
3
4 attr_reader :path, :site
5 attr_accessor :content, :collection, :output
6
7 # Create a new Document.
8 #
9 # site - the Jekyll::Site instance to which this Document belongs
10 # path - the path to the file
11 #
12 # Returns nothing.
13 def initialize(path, relations)
14 @site = relations[:site]
15 @path = path
16 @collection = relations[:collection]
17 end
18
19 # Fetch the Document's data.
20 #
21 # Returns a Hash containing the data. An empty hash is returned if
22 # no data was read.
23 def data
24 @data ||= Hash.new
25 end
26
27 # The path to the document, relative to the site source.
28 #
29 # Returns a String path which represents the relative path
30 # from the site source to this document
31 def relative_path
32 Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s
33 end
34
35 # The base filename of the document.
36 #
37 # suffix - (optional) the suffix to be removed from the end of the filename
38 #
39 # Returns the base filename of the document.
40 def basename(suffix = "")
41 File.basename(path, suffix)
42 end
43
44 # The extension name of the document.
45 #
46 # Returns the extension name of the document.
47 def extname
48 File.extname(path)
49 end
50
51 # Produces a "cleaned" relative path.
52 # The "cleaned" relative path is the relative path without the extname
53 # and with the collection's directory removed as well.
54 # This method is useful when building the URL of the document.
55 #
56 # Examples:
57 # When relative_path is "_methods/site/generate.md":
58 # cleaned_relative_path
59 # # => "/site/generate"
60 #
61 # Returns the cleaned relative path of the document.
62 def cleaned_relative_path
63 relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "")
64 end
65
66 # Determine whether the document is a YAML file.
67 #
68 # Returns true if the extname is either .yml or .yaml, false otherwise.
69 def yaml_file?
70 %w[.yaml .yml].include?(extname)
71 end
72
73 # Determine whether the document is an asset file.
74 # Asset files include CoffeeScript files and Sass/SCSS files.
75 #
76 # Returns true if the extname belongs to the set of extensions
77 # that asset files use.
78 def asset_file?
79 %w[.sass .scss .coffee].include?(extname)
80 end
81
82 # Determine whether the file should be rendered with Liquid.
83 #
84 # Returns false if the document is either an asset file or a yaml file,
85 # true otherwise.
86 def render_with_liquid?
87 !(asset_file? || yaml_file?)
88 end
89
90 # Determine whether the file should be placed into layouts.
91 #
92 # Returns false if the document is either an asset file or a yaml file,
93 # true otherwise.
94 def place_in_layout?
95 !(asset_file? || yaml_file?)
96 end
97
98 # The URL template where the document would be accessible.
99 #
100 # Returns the URL template for the document.
101 def url_template
102 collection.url_template
103 end
104
105 # Construct a Hash of key-value pairs which contain a mapping between
106 # a key in the URL template and the corresponding value for this document.
107 #
108 # Returns the Hash of key-value pairs for replacement in the URL.
109 def url_placeholders
110 {
111 collection: collection.label,
112 path: cleaned_relative_path,
113 output_ext: Jekyll::Renderer.new(site, self).output_ext
114 }
115 end
116
117 # The permalink for this Document.
118 # Permalink is set via the data Hash.
119 #
120 # Returns the permalink or nil if no permalink was set in the data.
121 def permalink
122 data && data.is_a?(Hash) && data['permalink']
123 end
124
125 # The computed URL for the document. See `Jekyll::URL#to_s` for more details.
126 #
127 # Returns the computed URL for the document.
128 def url
129 @url = URL.new({
130 template: url_template,
131 placeholders: url_placeholders,
132 permalink: permalink
133 }).to_s
134 end
135
136 # The full path to the output file.
137 #
138 # base_directory - the base path of the output directory
139 #
140 # Returns the full path to the output file of this document.
141 def destination(base_directory)
142 path = Jekyll.sanitized_path(base_directory, url)
143 path = File.join(path, "index.html") if url =~ /\/$/
144 path
145 end
146
147 # Write the generated Document file to the destination directory.
148 #
149 # dest - The String path to the destination dir.
150 #
151 # Returns nothing.
152 def write(dest)
153 path = destination(dest)
154 FileUtils.mkdir_p(File.dirname(path))
155 File.open(path, 'wb') do |f|
156 f.write(output)
157 end
158 end
159
160 # Returns merged option hash for File.read of self.site (if exists)
161 # and a given param
162 #
163 # opts - override options
164 #
165 # Return the file read options hash.
166 def merged_file_read_opts(opts)
167 site ? site.file_read_opts.merge(opts) : opts
168 end
169
170 # Whether the file is published or not, as indicated in YAML front-matter
171 #
172 # Returns true if the 'published' key is specified in the YAML front-matter and not `false`.
173 def published?
174 !(data.has_key?('published') && data['published'] == false)
175 end
176
177 # Read in the file and assign the content and data based on the file contents.
178 # Merge the frontmatter of the file with the frontmatter default
179 # values
180 #
181 # Returns nothing.
182 def read(opts = {})
183 if yaml_file?
184 @data = SafeYAML.load_file(path)
185 else
186 begin
187 defaults = @site.frontmatter_defaults.all(url, collection.label.to_sym)
188 unless defaults.empty?
189 @data = defaults
190 end
191 @content = File.read(path, merged_file_read_opts(opts))
192 if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
193 @content = $POSTMATCH
194 data_file = SafeYAML.load($1)
195 unless data_file.nil?
196 @data = Utils.deep_merge_hashes(defaults, data_file)
197 end
198 end
199 rescue SyntaxError => e
200 puts "YAML Exception reading #{path}: #{e.message}"
201 rescue Exception => e
202 puts "Error reading file #{path}: #{e.message}"
203 end
204 end
205 end
206
207 # Create a Liquid-understandable version of this Document.
208 #
209 # Returns a Hash representing this Document's data.
210 def to_liquid
211 if data.is_a?(Hash)
212 Utils.deep_merge_hashes data, {
213 "output" => output,
214 "content" => content,
215 "path" => path,
216 "relative_path" => relative_path,
217 "url" => url,
218 "collection" => collection.label
219 }
220 else
221 data
222 end
223 end
224
225 # The inspect string for this document.
226 # Includes the relative path and the collection label.
227 #
228 # Returns the inspect string for this document.
229 def inspect
230 "#<Jekyll::Document #{relative_path} collection=#{collection.label}>"
231 end
232
233 # The string representation for this document.
234 #
235 # Returns the content of the document
236 def to_s
237 output || content
238 end
239
240 # Compare this document against another document.
241 # Comparison is a comparison between the 2 paths of the documents.
242 #
243 # Returns -1, 0, +1 or nil depending on whether this doc's path is less than,
244 # equal or greater than the other doc's path. See String#<=> for more details.
245 def <=>(anotherDocument)
246 path <=> anotherDocument.path
247 end
248
249 # Determine whether this document should be written.
250 # Based on the Collection to which it belongs.
251 #
252 # True if the document has a collection and if that collection's #write?
253 # method returns true, otherwise false.
254 def write?
255 collection && collection.write?
256 end
257
258 end
259 end
1717 File.join(source, dir, '_drafts')
1818 end
1919
20 # The path to the draft source file, relative to the site source
21 def relative_path
22 File.join(@dir, '_drafts', @name)
23 end
24
2025 # Extract information from the post filename.
2126 #
2227 # name - The String filename of the post file.
0 class EntryFilter
1 attr_reader :site
2 def initialize(site)
3 @site = site
4 end
0 module Jekyll
1 class EntryFilter
2 SPECIAL_LEADING_CHARACTERS = ['.', '_', '#'].freeze
53
6 def filter(entries)
7 entries.reject do |e|
8 unless included?(e)
9 special?(e) || backup?(e) || excluded?(e) || symlink?(e)
4 attr_reader :site
5
6 def initialize(site, base_directory = nil)
7 @site = site
8 @base_directory = derive_base_directory(@site, base_directory.to_s.dup)
9 end
10
11 def base_directory
12 @base_directory.to_s
13 end
14
15 def derive_base_directory(site, base_dir)
16 if base_dir.start_with?(site.source)
17 base_dir[site.source] = ""
18 end
19 base_dir
20 end
21
22 def relative_to_source(entry)
23 File.join(base_directory, entry)
24 end
25
26 def filter(entries)
27 entries.reject do |e|
28 unless included?(e)
29 special?(e) || backup?(e) || excluded?(e) || symlink?(e)
30 end
31 end
32 end
33
34 def included?(entry)
35 glob_include?(site.include, entry)
36 end
37
38 def special?(entry)
39 SPECIAL_LEADING_CHARACTERS.include?(entry[0..0]) ||
40 SPECIAL_LEADING_CHARACTERS.include?(File.basename(entry)[0..0])
41 end
42
43 def backup?(entry)
44 entry[-1..-1] == '~'
45 end
46
47 def excluded?(entry)
48 excluded = glob_include?(site.exclude, relative_to_source(entry))
49 Jekyll.logger.debug "excluded?(#{relative_to_source(entry)}) ==> #{excluded}"
50 excluded
51 end
52
53 def symlink?(entry)
54 File.symlink?(entry) && site.safe
55 end
56
57 def ensure_leading_slash(path)
58 path[0..0] == "/" ? path : "/#{path}"
59 end
60
61 # Returns true if path matches against any glob pattern.
62 # Look for more detail about glob pattern in method File::fnmatch.
63 def glob_include?(enum, e)
64 entry = ensure_leading_slash(e)
65 enum.any? do |exp|
66 item = ensure_leading_slash(exp)
67 File.fnmatch?(item, entry) || entry.start_with?(item)
1068 end
1169 end
1270 end
13
14 def included?(entry)
15 site.include.glob_include?(entry)
16 end
17
18 def special?(entry)
19 ['.', '_', '#'].include?(entry[0..0])
20 end
21
22 def backup?(entry)
23 entry[-1..-1] == '~'
24 end
25
26 def excluded?(entry)
27 site.exclude.glob_include?(entry)
28 end
29
30 def symlink?(entry)
31 File.symlink?(entry) && site.safe
32 end
33
3471 end
00 module Jekyll
1 class FatalException < StandardError
1 module Errors
2 class FatalException < RuntimeError
3 end
4
5 class MissingDependencyException < FatalException
6 end
27 end
38 end
0 require 'forwardable'
1
02 module Jekyll
13 class Excerpt
24 include Convertible
5 extend Forwardable
36
47 attr_accessor :post
58 attr_accessor :content, :output, :ext
9
10 def_delegator :@post, :site, :site
11 def_delegator :@post, :name, :name
12 def_delegator :@post, :ext, :ext
613
714 # Initialize this Post instance.
815 #
1623 self.content = extract_excerpt(post.content)
1724 end
1825
19 %w[site name ext].each do |meth|
20 define_method(meth) do
21 post.send(meth)
22 end
23 end
24
2526 def to_liquid
26 post.to_liquid(Post::EXCERPT_ATTRIBUTES_FOR_LIQUID)
27 post.to_liquid(post.class::EXCERPT_ATTRIBUTES_FOR_LIQUID)
2728 end
2829
2930 # Fetch YAML front-matter data from related post, without layout key
3637 end
3738
3839 # 'Path' of the excerpt.
39 #
40 #
4041 # Returns the path for the post this excerpt belongs to with #excerpt appended
4142 def path
4243 File.join(post.path, "#excerpt")
4445
4546 # Check if excerpt includes a string
4647 #
47 # Returns true if the string passed in
48 # Returns true if the string passed in
4849 def include?(something)
49 (self.output && self.output.include?(something)) || self.content.include?(something)
50 (output && output.include?(something)) || content.include?(something)
5051 end
5152
5253 # The UID for this post (useful in feeds).
5859 end
5960
6061 def to_s
61 self.output || self.content
62 output || content
6263 end
6364
6465 # Returns the shorthand String identifier of this Post.
8282 #
8383 # Returns the escaped String.
8484 def xml_escape(input)
85 CGI.escapeHTML(input)
85 CGI.escapeHTML(input.to_s)
8686 end
8787
8888 # CGI escape a string for use in a URL. Replaces any special characters
9999 def cgi_escape(input)
100100 CGI::escape(input)
101101 end
102
102
103103 # URI escape a string.
104104 #
105105 # input - The String to escape.
123123 input.split.length
124124 end
125125
126 # Join an array of things into a string by separating with commes and the
126 # Join an array of things into a string by separating with commas and the
127127 # word "and" for the last one.
128128 #
129129 # array - The Array of Strings to join.
157157 input.to_json
158158 end
159159
160 # Group an array of items by a property
161 #
162 # input - the inputted Enumerable
163 # property - the property
164 #
165 # Returns an array of Hashes, each looking something like this:
166 # {"name" => "larry"
167 # "items" => [...] } # all the items where `property` == "larry"
168 def group_by(input, property)
169 if groupable?(input)
170 input.group_by do |item|
171 item_property(item, property).to_s
172 end.inject([]) do |memo, i|
173 memo << {"name" => i.first, "items" => i.last}
174 end
175 else
176 input
177 end
178 end
179
180 # Filter an array of objects
181 #
182 # input - the object array
183 # key - key within each object to filter by
184 # value - desired value
185 #
186 # Returns the filtered array of objects
187 def where(input, property, value)
188 return input unless input.is_a?(Array)
189 input.select { |object| item_property(object, property) == value }
190 end
191
192 # Sort an array of objects
193 #
194 # input - the object array
195 # property - property within each object to filter by
196 # nils ('first' | 'last') - nils appear before or after non-nil values
197 #
198 # Returns the filtered array of objects
199 def sort(input, property = nil, nils = "first")
200 if property.nil?
201 input.sort
202 else
203 case
204 when nils == "first"
205 order = - 1
206 when nils == "last"
207 order = + 1
208 else
209 raise ArgumentError.new("Invalid nils order: " +
210 "'#{nils}' is not a valid nils order. It must be 'first' or 'last'.")
211 end
212
213 input.sort { |apple, orange|
214 apple_property = item_property(apple, property)
215 orange_property = item_property(orange, property)
216
217 if !apple_property.nil? && orange_property.nil?
218 - order
219 elsif apple_property.nil? && !orange_property.nil?
220 + order
221 else
222 apple_property <=> orange_property
223 end
224 }
225 end
226 end
227
160228 private
161229 def time(input)
162230 case input
163231 when Time
164232 input
165233 when String
166 Time.parse(input)
234 Time.parse(input) rescue Time.at(input.to_i)
235 when Numeric
236 Time.at(input)
167237 else
168238 Jekyll.logger.error "Invalid Date:", "'#{input}' is not a valid datetime."
169239 exit(1)
170240 end
171241 end
242
243 def groupable?(element)
244 element.respond_to?(:group_by)
245 end
246
247 def item_property(item, property)
248 if item.respond_to?(:to_liquid)
249 item.to_liquid[property.to_s]
250 elsif item.respond_to?(:data)
251 item.data[property.to_s]
252 else
253 item[property.to_s]
254 end
255 end
172256 end
173257 end
0 module Jekyll
1 # This class handles custom defaults for YAML frontmatter settings.
2 # These are set in _config.yml and apply both to internal use (e.g. layout)
3 # and the data available to liquid.
4 #
5 # It is exposed via the frontmatter_defaults method on the site class.
6 class FrontmatterDefaults
7 # Initializes a new instance.
8 def initialize(site)
9 @site = site
10 end
11
12 # Finds a default value for a given setting, filtered by path and type
13 #
14 # path - the path (relative to the source) of the page, post or :draft the default is used in
15 # type - a symbol indicating whether a :page, a :post or a :draft calls this method
16 #
17 # Returns the default value or nil if none was found
18 def find(path, type, setting)
19 value = nil
20 old_scope = nil
21
22 matching_sets(path, type).each do |set|
23 if set['values'].has_key?(setting) && has_precedence?(old_scope, set['scope'])
24 value = set['values'][setting]
25 old_scope = set['scope']
26 end
27 end
28 value
29 end
30
31 # Collects a hash with all default values for a page or post
32 #
33 # path - the relative path of the page or post
34 # type - a symbol indicating the type (:post, :page or :draft)
35 #
36 # Returns a hash with all default values (an empty hash if there are none)
37 def all(path, type)
38 defaults = {}
39 old_scope = nil
40 matching_sets(path, type).each do |set|
41 if has_precedence?(old_scope, set['scope'])
42 defaults = Utils.deep_merge_hashes(defaults, set['values'])
43 old_scope = set['scope']
44 else
45 defaults = Utils.deep_merge_hashes(set['values'], defaults)
46 end
47 end
48 defaults
49 end
50
51 private
52
53 # Checks if a given default setting scope matches the given path and type
54 #
55 # scope - the hash indicating the scope, as defined in _config.yml
56 # path - the path to check for
57 # type - the type (:post, :page or :draft) to check for
58 #
59 # Returns true if the scope applies to the given path and type
60 def applies?(scope, path, type)
61 applies_path?(scope, path) && applies_type?(scope, type)
62 end
63
64 def applies_path?(scope, path)
65 return true if scope['path'].empty?
66
67 scope_path = Pathname.new(scope['path'])
68 Pathname.new(sanitize_path(path)).ascend do |path|
69 if path == scope_path
70 return true
71 end
72 end
73 end
74
75 def applies_type?(scope, type)
76 !scope.has_key?('type') || scope['type'] == type.to_s
77 end
78
79 # Checks if a given set of default values is valid
80 #
81 # set - the default value hash, as defined in _config.yml
82 #
83 # Returns true if the set is valid and can be used in this class
84 def valid?(set)
85 set.is_a?(Hash) && set['scope'].is_a?(Hash) && set['scope']['path'].is_a?(String) && set['values'].is_a?(Hash)
86 end
87
88 # Determines if a new scope has precedence over an old one
89 #
90 # old_scope - the old scope hash, or nil if there's none
91 # new_scope - the new scope hash
92 #
93 # Returns true if the new scope has precedence over the older
94 def has_precedence?(old_scope, new_scope)
95 return true if old_scope.nil?
96
97 new_path = sanitize_path(new_scope['path'])
98 old_path = sanitize_path(old_scope['path'])
99
100 if new_path.length != old_path.length
101 new_path.length >= old_path.length
102 elsif new_scope.has_key? 'type'
103 true
104 else
105 !old_scope.has_key? 'type'
106 end
107 end
108
109 # Collects a list of sets that match the given path and type
110 #
111 # Returns an array of hashes
112 def matching_sets(path, type)
113 valid_sets.select do |set|
114 applies?(set['scope'], path, type)
115 end
116 end
117
118 # Returns a list of valid sets
119 #
120 # This is not cached to allow plugins to modify the configuration
121 # and have their changes take effect
122 #
123 # Returns an array of hashes
124 def valid_sets
125 sets = @site.config['defaults']
126 return [] unless sets.is_a?(Array)
127
128 sets.select do |set|
129 unless valid?(set)
130 Jekyll.logger.warn "Default:", "An invalid default set was found"
131 end
132 valid?(set)
133 end
134 end
135
136 # Sanitizes the given path by removing a leading and addding a trailing slash
137 def sanitize_path(path)
138 if path.nil? || path.empty?
139 ""
140 else
141 path.gsub(/\A\//, '').gsub(/([^\/])\z/, '\1/')
142 end
143 end
144 end
145 end
+0
-217
lib/jekyll/generators/pagination.rb less more
0 module Jekyll
1 module Generators
2 class Pagination < Generator
3 # This generator is safe from arbitrary code execution.
4 safe true
5
6 # This generator should be passive with regard to its execution
7 priority :lowest
8
9 # Generate paginated pages if necessary.
10 #
11 # site - The Site.
12 #
13 # Returns nothing.
14 def generate(site)
15 if Pager.pagination_enabled?(site)
16 if template = template_page(site)
17 paginate(site, template)
18 else
19 Jekyll.logger.warn "Pagination:", "Pagination is enabled, but I couldn't find " +
20 "an index.html page to use as the pagination template. Skipping pagination."
21 end
22 end
23 end
24
25 # Paginates the blog's posts. Renders the index.html file into paginated
26 # directories, e.g.: page2/index.html, page3/index.html, etc and adds more
27 # site-wide data.
28 #
29 # site - The Site.
30 # page - The index.html Page that requires pagination.
31 #
32 # {"paginator" => { "page" => <Number>,
33 # "per_page" => <Number>,
34 # "posts" => [<Post>],
35 # "total_posts" => <Number>,
36 # "total_pages" => <Number>,
37 # "previous_page" => <Number>,
38 # "next_page" => <Number> }}
39 def paginate(site, page)
40 all_posts = site.site_payload['site']['posts']
41 pages = Pager.calculate_pages(all_posts, site.config['paginate'].to_i)
42 (1..pages).each do |num_page|
43 pager = Pager.new(site, num_page, all_posts, pages)
44 if num_page > 1
45 newpage = Page.new(site, site.source, page.dir, page.name)
46 newpage.pager = pager
47 newpage.dir = Pager.paginate_path(site, num_page)
48 site.pages << newpage
49 else
50 page.pager = pager
51 end
52 end
53 end
54
55 # Static: Fetch the URL of the template page. Used to determine the
56 # path to the first pager in the series.
57 #
58 # site - the Jekyll::Site object
59 #
60 # Returns the url of the template page
61 def self.first_page_url(site)
62 if page = Pagination.new.template_page(site)
63 page.url
64 else
65 nil
66 end
67 end
68
69 # Public: Find the Jekyll::Page which will act as the pager template
70 #
71 # site - the Jekyll::Site object
72 #
73 # Returns the Jekyll::Page which will act as the pager template
74 def template_page(site)
75 site.pages.dup.select do |page|
76 Pager.pagination_candidate?(site.config, page)
77 end.sort do |one, two|
78 two.path.size <=> one.path.size
79 end.first
80 end
81 end
82 end
83
84 class Pager
85 attr_reader :page, :per_page, :posts, :total_posts, :total_pages,
86 :previous_page, :previous_page_path, :next_page, :next_page_path
87
88 # Calculate the number of pages.
89 #
90 # all_posts - The Array of all Posts.
91 # per_page - The Integer of entries per page.
92 #
93 # Returns the Integer number of pages.
94 def self.calculate_pages(all_posts, per_page)
95 (all_posts.size.to_f / per_page.to_i).ceil
96 end
97
98 # Determine if pagination is enabled the site.
99 #
100 # site - the Jekyll::Site object
101 #
102 # Returns true if pagination is enabled, false otherwise.
103 def self.pagination_enabled?(site)
104 !site.config['paginate'].nil? &&
105 site.pages.size > 0
106 end
107
108 # Static: Determine if a page is a possible candidate to be a template page.
109 # Page's name must be `index.html` and exist in any of the directories
110 # between the site source and `paginate_path`.
111 #
112 # config - the site configuration hash
113 # page - the Jekyll::Page about which we're inquiring
114 #
115 # Returns true if the
116 def self.pagination_candidate?(config, page)
117 page_dir = File.dirname(File.expand_path(remove_leading_slash(page.path), config['source']))
118 paginate_path = remove_leading_slash(config['paginate_path'])
119 paginate_path = File.expand_path(paginate_path, config['source'])
120 page.name == 'index.html' &&
121 in_hierarchy(config['source'], page_dir, File.dirname(paginate_path))
122 end
123
124 # Determine if the subdirectories of the two paths are the same relative to source
125 #
126 # source - the site source
127 # page_dir - the directory of the Jekyll::Page
128 # paginate_path - the absolute paginate path (from root of FS)
129 #
130 # Returns whether the subdirectories are the same relative to source
131 def self.in_hierarchy(source, page_dir, paginate_path)
132 return false if paginate_path == File.dirname(paginate_path)
133 return false if paginate_path == Pathname.new(source).parent
134 page_dir == paginate_path ||
135 in_hierarchy(source, page_dir, File.dirname(paginate_path))
136 end
137
138 # Static: Return the pagination path of the page
139 #
140 # site - the Jekyll::Site object
141 # num_page - the pagination page number
142 #
143 # Returns the pagination path as a string
144 def self.paginate_path(site, num_page)
145 return nil if num_page.nil?
146 return Generators::Pagination.first_page_url(site) if num_page <= 1
147 format = site.config['paginate_path']
148 format = format.sub(':num', num_page.to_s)
149 ensure_leading_slash(format)
150 end
151
152 # Static: Return a String version of the input which has a leading slash.
153 # If the input already has a forward slash in position zero, it will be
154 # returned unchanged.
155 #
156 # path - a String path
157 #
158 # Returns the path with a leading slash
159 def self.ensure_leading_slash(path)
160 path[0..0] == "/" ? path : "/#{path}"
161 end
162
163 # Static: Return a String version of the input without a leading slash.
164 #
165 # path - a String path
166 #
167 # Returns the input without the leading slash
168 def self.remove_leading_slash(path)
169 ensure_leading_slash(path)[1..-1]
170 end
171
172 # Initialize a new Pager.
173 #
174 # site - the Jekyll::Site object
175 # page - The Integer page number.
176 # all_posts - The Array of all the site's Posts.
177 # num_pages - The Integer number of pages or nil if you'd like the number
178 # of pages calculated.
179 def initialize(site, page, all_posts, num_pages = nil)
180 @page = page
181 @per_page = site.config['paginate'].to_i
182 @total_pages = num_pages || Pager.calculate_pages(all_posts, @per_page)
183
184 if @page > @total_pages
185 raise RuntimeError, "page number can't be greater than total pages: #{@page} > #{@total_pages}"
186 end
187
188 init = (@page - 1) * @per_page
189 offset = (init + @per_page - 1) >= all_posts.size ? all_posts.size : (init + @per_page - 1)
190
191 @total_posts = all_posts.size
192 @posts = all_posts[init..offset]
193 @previous_page = @page != 1 ? @page - 1 : nil
194 @previous_page_path = Pager.paginate_path(site, @previous_page)
195 @next_page = @page != @total_pages ? @page + 1 : nil
196 @next_page_path = Pager.paginate_path(site, @next_page)
197 end
198
199 # Convert this Pager's data to a Hash suitable for use by Liquid.
200 #
201 # Returns the Hash representation of this Pager.
202 def to_liquid
203 {
204 'page' => page,
205 'per_page' => per_page,
206 'posts' => posts,
207 'total_posts' => total_posts,
208 'total_pages' => total_pages,
209 'previous_page' => previous_page,
210 'previous_page_path' => previous_page_path,
211 'next_page' => next_page,
212 'next_page_path' => next_page_path
213 }
214 end
215 end
216 end
2828
2929 self.data = {}
3030
31 self.process(name)
32 self.read_yaml(base, name)
31 process(name)
32 read_yaml(base, name)
3333 end
3434
3535 # Extract information from the layout filename.
0 module Jekyll
1 class LayoutReader
2 attr_reader :site
3 def initialize(site)
4 @site = site
5 @layouts = {}
6 end
7
8 def read
9 layout_entries.each do |f|
10 @layouts[layout_name(f)] = Layout.new(site, layout_directory, f)
11 end
12
13 @layouts
14 end
15
16 def layout_directory
17 @layout_directory ||= (layout_directory_in_cwd || layout_directory_inside_source)
18 end
19
20 private
21
22 def layout_entries
23 entries = []
24 within(layout_directory) do
25 entries = EntryFilter.new(site).filter(Dir['**/*.*'])
26 end
27 entries
28 end
29
30 def layout_name(file)
31 file.split(".")[0..-2].join(".")
32 end
33
34 def within(directory)
35 return unless File.exist?(directory)
36 Dir.chdir(directory) { yield }
37 end
38
39 def layout_directory_inside_source
40 Jekyll.sanitized_path(site.source, site.config['layouts'])
41 end
42
43 def layout_directory_in_cwd
44 dir = Jekyll.sanitized_path(Dir.pwd, site.config['layouts'])
45 if File.directory?(dir)
46 dir
47 else
48 nil
49 end
50 end
51 end
52 end
0 module Jekyll
1 module LiquidExtensions
2
3 # Lookup a Liquid variable in the given context.
4 #
5 # context - the Liquid context in question.
6 # variable - the variable name, as a string.
7 #
8 # Returns the value of the variable in the context
9 # or the variable name if not found.
10 def lookup_variable(context, variable)
11 lookup = context
12
13 variable.split(".").each do |value|
14 lookup = lookup[value]
15 end
16
17 lookup || variable
18 end
19
20 end
21 end
0 module Jekyll
1 class LogAdapter
2 attr_reader :writer
3
4 LOG_LEVELS = {
5 :debug => ::Logger::DEBUG,
6 :info => ::Logger::INFO,
7 :warn => ::Logger::WARN,
8 :error => ::Logger::ERROR
9 }
10
11 # Public: Create a new instance of Jekyll's log writer
12 #
13 # writer - Logger compatible instance
14 # log_level - (optional, symbol) the log level
15 #
16 # Returns nothing
17 def initialize(writer, level = :info)
18 @writer = writer
19 self.log_level = level
20 end
21
22 # Public: Set the log level on the writer
23 #
24 # level - (symbol) the log level
25 #
26 # Returns nothing
27 def log_level=(level)
28 writer.level = LOG_LEVELS.fetch(level)
29 end
30
31 # Public: Print a jekyll debug message
32 #
33 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
34 # message - the message detail
35 #
36 # Returns nothing
37 def debug(topic, message = nil)
38 writer.debug(message(topic, message))
39 end
40
41 # Public: Print a jekyll message
42 #
43 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
44 # message - the message detail
45 #
46 # Returns nothing
47 def info(topic, message = nil)
48 writer.info(message(topic, message))
49 end
50
51 # Public: Print a jekyll message
52 #
53 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
54 # message - the message detail
55 #
56 # Returns nothing
57 def warn(topic, message = nil)
58 writer.warn(message(topic, message))
59 end
60
61 # Public: Print a jekyll error message
62 #
63 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
64 # message - the message detail
65 #
66 # Returns nothing
67 def error(topic, message = nil)
68 writer.error(message(topic, message))
69 end
70
71 # Public: Print a Jekyll error message and immediately abort the process
72 #
73 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
74 # message - the message detail (can be omitted)
75 #
76 # Returns nothing
77 def abort_with(topic, message = nil)
78 error(topic, message)
79 abort
80 end
81
82 # Internal: Build a Jekyll topic method
83 #
84 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
85 # message - the message detail
86 #
87 # Returns the formatted message
88 def message(topic, message)
89 formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ')
90 end
91
92 # Internal: Format the topic
93 #
94 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
95 #
96 # Returns the formatted topic statement
97 def formatted_topic(topic)
98 "#{topic} ".rjust(20)
99 end
100 end
101 end
0 # These are the same MIME types that GitHub Pages uses as of 17 Mar 2013.
0 -# These are the same MIME types that GitHub Pages uses as of 26 January 2014
11
22 text/html html htm shtml
33 text/css css
4 text/xml xml rss xsl
4 text/xml xml rss xsl xsd
55 image/gif gif
66 image/jpeg jpeg jpg
77 application/x-javascript js
88 application/atom+xml atom
9 application/json json geojson topojson
910
1011 text/mathml mml
1112 text/plain txt
1617 text/coffeescript coffee
1718 text/plain pde
1819 text/plain md markdown
20 text/vcard vcf vcard
1921
2022 image/png png
2123 image/svg+xml svg
24 image/svg+xml svgz
2225 image/tiff tif tiff
2326 image/vnd.wap.wbmp wbmp
2427 image/x-icon ico
2528 image/x-jng jng
2629 image/x-ms-bmp bmp
2730
28 application/json json
31 application/vnd.ms-fontobject eot
32 application/x-font-ttf ttf
33 application/x-font-woff woff
34 font/opentype otf
35
2936 application/java-archive jar ear
3037 application/mac-binhex40 hqx
3138 application/msword doc
3340 application/postscript ps eps ai
3441 application/rdf+xml rdf
3542 application/rtf rtf
36 text/vcard vcf vcard
3743 application/vnd.apple.pkpass pkpass
3844 application/vnd.ms-excel xls
3945 application/vnd.ms-powerpoint ppt
4046 application/vnd.wap.wmlc wmlc
4147 application/xhtml+xml xhtml
48 application/x-cocoa cco
4249 application/x-chrome-extension crx
43 application/x-cocoa cco
44 application/x-font-ttf ttf
4550 application/x-java-archive-diff jardiff
4651 application/x-java-jnlp-file jnlp
4752 application/x-makeself run
53 application/x-ms-application application
54 application/x-ms-manifest manifest
55 application/x-ms-vsto vsto
4856 application/x-ns-proxy-autoconfig pac
4957 application/x-perl pl pm
5058 application/x-pilot prc pdb
6270
6371 application/octet-stream bin exe dll
6472 application/octet-stream deb
73 application/octet-stream deploy
6574 application/octet-stream dmg
66 application/octet-stream eot
6775 application/octet-stream iso img
6876 application/octet-stream msi msp msm
6977
7381 audio/ogg ogg
7482
7583 video/3gpp 3gpp 3gp
84 video/m4v m4v
85 video/mp4 mp4
7686 video/mpeg mpeg mpg
87 video/ogg ogg ogv
7788 video/quicktime mov
89 video/webm webm
7890 video/x-flv flv
7991 video/x-mng mng
8092 video/x-ms-asf asx asf
8193 video/x-ms-wmv wmv
8294 video/x-msvideo avi
83 video/ogg ogv
84 video/webm webm
88
99 # Attributes for Liquid templates
1010 ATTRIBUTES_FOR_LIQUID = %w[
11 content
12 dir
13 name
14 path
1115 url
12 content
13 path
1416 ]
1517
1618 # Initialize a new Page.
2527 @dir = dir
2628 @name = name
2729
28 self.process(name)
29 self.read_yaml(File.join(base, dir), name)
30
31 process(name)
32 read_yaml(File.join(base, dir), name)
33
34 data.default_proc = proc do |hash, key|
35 site.frontmatter_defaults.find(File.join(dir, name), type, key)
36 end
3037 end
3138
3239 # The generated directory into which the page will be placed
4350 #
4451 # Returns the String permalink or nil if none has been set.
4552 def permalink
46 return nil if self.data.nil? || self.data['permalink'].nil?
53 return nil if data.nil? || data['permalink'].nil?
4754 if site.config['relative_permalinks']
48 File.join(@dir, self.data['permalink'])
55 File.join(@dir, data['permalink'])
4956 else
50 self.data['permalink']
57 data['permalink']
5158 end
5259 end
5360
5562 #
5663 # Returns the template String.
5764 def template
58 if self.site.permalink_style == :pretty
65 if site.permalink_style == :pretty
5966 if index? && html?
6067 "/:path/"
6168 elsif html?
8491 def url_placeholders
8592 {
8693 :path => @dir,
87 :basename => self.basename,
88 :output_ext => self.output_ext
94 :basename => basename,
95 :output_ext => output_ext
8996 }
9097 end
9198
96103 # Returns nothing.
97104 def process(name)
98105 self.ext = File.extname(name)
99 self.basename = name[0 .. -self.ext.length-1]
106 self.basename = name[0 .. -ext.length - 1]
100107 end
101108
102109 # Add any necessary layouts to this post
106113 #
107114 # Returns nothing.
108115 def render(layouts, site_payload)
109 payload = {
110 "page" => self.to_liquid,
116 payload = Utils.deep_merge_hashes({
117 "page" => to_liquid,
111118 'paginator' => pager.to_liquid
112 }.deep_merge(site_payload)
119 }, site_payload)
113120
114121 do_layout(payload, layouts)
115122 end
118125 #
119126 # Returns the path to the source file
120127 def path
121 self.data.fetch('path', self.relative_path.sub(/\A\//, ''))
128 data.fetch('path', relative_path.sub(/\A\//, ''))
122129 end
123130
124131 # The path to the page source file, relative to the site source
125132 def relative_path
126 File.join(@dir, @name)
133 File.join(*[@dir, @name].map(&:to_s).reject(&:empty?))
127134 end
128135
129136 # Obtain destination path.
132139 #
133140 # Returns the destination file path String.
134141 def destination(dest)
135 path = Jekyll.sanitized_path(dest, url)
142 path = Jekyll.sanitized_path(dest, URL.unescape_path(url))
136143 path = File.join(path, "index.html") if url =~ /\/$/
137144 path
138145 end
139146
140147 # Returns the object as a debug String.
141148 def inspect
142 "#<Jekyll:Page @name=#{self.name.inspect}>"
149 "#<Jekyll:Page @name=#{name.inspect}>"
143150 end
144151
145152 # Returns the Boolean of whether this Page is HTML or not.
153160 end
154161
155162 def uses_relative_permalinks
156 permalink && @dir != "" && site.config['relative_permalinks']
163 permalink && !@dir.empty? && site.config['relative_permalinks']
157164 end
158165 end
159166 end
55 :high => 10,
66 :highest => 100 }
77
8 # Install a hook so that subclasses are recorded. This method is only
9 # ever called by Ruby itself.
8 # Fetch all the subclasses of this class and its subclasses' subclasses.
109 #
11 # base - The Class subclass.
12 #
13 # Returns nothing.
14 def self.inherited(base)
15 subclasses << base
16 subclasses.sort!
17 end
18
19 # The list of Classes that have been subclassed.
20 #
21 # Returns an Array of Class objects.
22 def self.subclasses
23 @subclasses ||= []
10 # Returns an array of descendant classes.
11 def self.descendants
12 descendants = []
13 ObjectSpace.each_object(singleton_class) do |k|
14 descendants.unshift k unless k == self
15 end
16 descendants
2417 end
2518
2619 # Get or set the priority of this plugin. When called without an
0 module Jekyll
1 class PluginManager
2 attr_reader :site
3
4 # Create an instance of this class.
5 #
6 # site - the instance of Jekyll::Site we're concerned with
7 #
8 # Returns nothing
9 def initialize(site)
10 @site = site
11 end
12
13 # Require all the plugins which are allowed.
14 #
15 # Returns nothing
16 def conscientious_require
17 require_plugin_files
18 require_gems
19 end
20
21 # Require each of the gem plugins specified.
22 #
23 # Returns nothing.
24 def require_gems
25 site.gems.each do |gem|
26 if plugin_allowed?(gem)
27 require gem
28 end
29 end
30 end
31
32 # Check whether a gem plugin is allowed to be used during this build.
33 #
34 # gem_name - the name of the gem
35 #
36 # Returns true if the gem name is in the whitelist or if the site is not
37 # in safe mode.
38 def plugin_allowed?(gem_name)
39 !site.safe || whitelist.include?(gem_name)
40 end
41
42 # Build an array of allowed plugin gem names.
43 #
44 # Returns an array of strings, each string being the name of a gem name
45 # that is allowed to be used.
46 def whitelist
47 @whitelist ||= Array[site.config['whitelist']].flatten
48 end
49
50 # Require all .rb files if safe mode is off
51 #
52 # Returns nothing.
53 def require_plugin_files
54 unless site.safe
55 plugins_path.each do |plugins|
56 Dir[File.join(plugins, "**", "*.rb")].sort.each do |f|
57 require f
58 end
59 end
60 end
61 end
62
63 # Public: Setup the plugin search path
64 #
65 # Returns an Array of plugin search paths
66 def plugins_path
67 if (site.config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
68 [Jekyll.sanitized_path(site.source, site.config['plugins'])]
69 else
70 Array(site.config['plugins']).map { |d| File.expand_path(d) }
71 end
72 end
73
74 end
75 end
88 EXCERPT_ATTRIBUTES_FOR_LIQUID = %w[
99 title
1010 url
11 dir
1112 date
1213 id
1314 categories
3334
3435 attr_accessor :site
3536 attr_accessor :data, :extracted_excerpt, :content, :output, :ext
36 attr_accessor :date, :slug, :published, :tags, :categories
37 attr_accessor :date, :slug, :tags, :categories
3738
3839 attr_reader :name
3940
4748 def initialize(site, source, dir, name)
4849 @site = site
4950 @dir = dir
50 @base = self.containing_dir(source, dir)
51 @base = containing_dir(source, dir)
5152 @name = name
5253
5354 self.categories = dir.downcase.split('/').reject { |x| x.empty? }
54 self.process(name)
55 self.read_yaml(@base, name)
56
57 if self.data.has_key?('date')
58 self.date = Time.parse(self.data["date"].to_s)
59 end
60
61 self.published = self.published?
62
63 self.populate_categories
64 self.populate_tags
55 process(name)
56 read_yaml(@base, name)
57
58 data.default_proc = proc do |hash, key|
59 site.frontmatter_defaults.find(File.join(dir, name), type, key)
60 end
61
62 if data.has_key?('date')
63 self.date = Time.parse(data["date"].to_s)
64 end
65
66 populate_categories
67 populate_tags
6568 end
6669
6770 def published?
68 if self.data.has_key?('published') && self.data['published'] == false
71 if data.has_key?('published') && data['published'] == false
6972 false
7073 else
7174 true
7376 end
7477
7578 def populate_categories
76 if self.categories.empty?
77 self.categories = self.data.pluralized_array('category', 'categories').map {|c| c.to_s.downcase}
78 end
79 self.categories.flatten!
79 categories_from_data = Utils.pluralized_array_from_hash(data, 'category', 'categories')
80 self.categories = (
81 Array(categories) + categories_from_data
82 ).map {|c| c.to_s.downcase}.flatten.uniq
8083 end
8184
8285 def populate_tags
83 self.tags = self.data.pluralized_array("tag", "tags").flatten
86 self.tags = Utils.pluralized_array_from_hash(data, "tag", "tags").flatten
8487 end
8588
8689 # Get the full path to the directory containing the post files
8790 def containing_dir(source, dir)
88 File.join(source, dir, '_posts')
91 return File.join(source, dir, '_posts')
8992 end
9093
9194 # Read the YAML frontmatter.
9699 # Returns nothing.
97100 def read_yaml(base, name)
98101 super(base, name)
99 self.extracted_excerpt = self.extract_excerpt
102 self.extracted_excerpt = extract_excerpt
100103 end
101104
102105 # The post excerpt. This is either a custom excerpt
104107 #
105108 # Returns excerpt string.
106109 def excerpt
107 self.data.fetch('excerpt', self.extracted_excerpt.to_s)
110 data.fetch('excerpt', extracted_excerpt.to_s)
108111 end
109112
110113 # Public: the Post title, from the YAML Front-Matter or from the slug
111114 #
112115 # Returns the post title
113116 def title
114 self.data.fetch("title", self.titleized_slug)
117 data.fetch("title", titleized_slug)
115118 end
116119
117120 # Turns the post slug into a suitable title
118121 def titleized_slug
119 self.slug.split('-').select {|w| w.capitalize! || w }.join(' ')
122 slug.split('-').select {|w| w.capitalize! || w }.join(' ')
120123 end
121124
122125 # Public: the path to the post relative to the site source,
126129 #
127130 # Returns the path to the file relative to the site source
128131 def path
129 self.data.fetch('path', self.relative_path.sub(/\A\//, ''))
132 data.fetch('path', relative_path.sub(/\A\//, ''))
130133 end
131134
132135 # The path to the post source file, relative to the site source
133136 def relative_path
134 File.join(@dir, '_posts', @name)
137 File.join(*[@dir, "_posts", @name].map(&:to_s).reject(&:empty?))
135138 end
136139
137140 # Compares Post objects. First compares the Post date. If the dates are
155158 # Returns nothing.
156159 def process(name)
157160 m, cats, date, slug, ext = *name.match(MATCHER)
161 self.categories ||= []
162 self.categories += (cats || '').downcase.split('/')
158163 self.date = Time.parse(date)
159164 self.slug = slug
160165 self.ext = ext
161166 rescue ArgumentError
162 raise FatalException.new("Post #{name} does not have a valid date.")
167 path = File.join(@dir || "", name)
168 msg = "Post '#{path}' does not have a valid date.\n"
169 msg << "Fix the date, or exclude the file or directory from being processed"
170 raise Errors::FatalException.new(msg)
163171 end
164172
165173 # The generated directory into which the post will be placed
177185 #
178186 # Returns the String permalink.
179187 def permalink
180 self.data && self.data['permalink']
188 data && data['permalink']
181189 end
182190
183191 def template
184 case self.site.permalink_style
192 case site.permalink_style
185193 when :pretty
186194 "/:categories/:year/:month/:day/:title/"
187195 when :none
191199 when :ordinal
192200 "/:categories/:year/:y_day/:title.html"
193201 else
194 self.site.permalink_style.to_s
202 site.permalink_style.to_s
195203 end
196204 end
197205
213221 :year => date.strftime("%Y"),
214222 :month => date.strftime("%m"),
215223 :day => date.strftime("%d"),
216 :title => CGI.escape(slug),
224 :title => slug,
217225 :i_day => date.strftime("%d").to_i.to_s,
218226 :i_month => date.strftime("%m").to_i.to_s,
219 :categories => (categories || []).map { |c| URI.escape(c.to_s) }.join('/'),
227 :categories => (categories || []).map { |c| c.to_s }.join('/'),
220228 :short_month => date.strftime("%b"),
229 :short_year => date.strftime("%y"),
221230 :y_day => date.strftime("%j"),
222 :output_ext => self.output_ext
231 :output_ext => output_ext
223232 }
224233 end
225234
228237 #
229238 # Returns the String UID.
230239 def id
231 File.join(self.dir, self.slug)
240 File.join(dir, slug)
232241 end
233242
234243 # Calculate related posts.
246255 # Returns nothing.
247256 def render(layouts, site_payload)
248257 # construct payload
249 payload = {
258 payload = Utils.deep_merge_hashes({
250259 "site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) },
251 "page" => self.to_liquid(EXCERPT_ATTRIBUTES_FOR_LIQUID)
252 }.deep_merge(site_payload)
260 "page" => to_liquid(self.class::EXCERPT_ATTRIBUTES_FOR_LIQUID)
261 }, site_payload)
253262
254263 if generate_excerpt?
255 self.extracted_excerpt.do_layout(payload, {})
256 end
257
258 do_layout(payload.merge({"page" => self.to_liquid}), layouts)
264 extracted_excerpt.do_layout(payload, {})
265 end
266
267 do_layout(payload.merge({"page" => to_liquid}), layouts)
259268 end
260269
261270 # Obtain destination path.
265274 # Returns destination file path String.
266275 def destination(dest)
267276 # The url needs to be unescaped in order to preserve the correct filename
268 path = Jekyll.sanitized_path(dest, CGI.unescape(url))
277 path = Jekyll.sanitized_path(dest, URL.unescape_path(url))
269278 path = File.join(path, "index.html") if path[/\.html$/].nil?
270279 path
271280 end
272281
273282 # Returns the shorthand String identifier of this Post.
274283 def inspect
275 "<Post: #{self.id}>"
284 "<Post: #{id}>"
276285 end
277286
278287 def next
279 pos = self.site.posts.index(self)
280
281 if pos && pos < self.site.posts.length-1
282 self.site.posts[pos+1]
288 pos = site.posts.index {|post| post.equal?(self) }
289 if pos && pos < site.posts.length - 1
290 site.posts[pos + 1]
283291 else
284292 nil
285293 end
286294 end
287295
288296 def previous
289 pos = self.site.posts.index(self)
297 pos = site.posts.index {|post| post.equal?(self) }
290298 if pos && pos > 0
291 self.site.posts[pos-1]
299 site.posts[pos - 1]
292300 else
293301 nil
294302 end
0 module Jekyll
1 class Publisher
2 def initialize(site)
3 @site = site
4 end
5
6 def publish?(thing)
7 can_be_published?(thing) && !hidden_in_the_future?(thing)
8 end
9
10 private
11
12 def can_be_published?(thing)
13 thing.data.fetch('published', true) || @site.unpublished
14 end
15
16 def hidden_in_the_future?(thing)
17 thing.is_a?(Post) && !@site.future && thing.date > @site.time
18 end
19 end
20 end
1313 end
1414
1515 def build
16 return [] unless self.site.posts.size > 1
16 return [] unless site.posts.size > 1
1717
18 if self.site.lsi
18 if site.lsi
1919 build_index
2020 lsi_related_posts
2121 else
2929 lsi = Classifier::LSI.new(:auto_rebuild => false)
3030 display("Populating LSI...")
3131
32 self.site.posts.each do |x|
32 site.posts.each do |x|
3333 lsi.add_item(x)
3434 end
3535
4141 end
4242
4343 def lsi_related_posts
44 self.class.lsi.find_related(post.content, 11) - [self.post]
44 self.class.lsi.find_related(post.content, 11) - [post]
4545 end
4646
4747 def most_recent_posts
48 recent_posts = self.site.posts.reverse - [self.post]
48 recent_posts = site.posts.reverse - [post]
4949 recent_posts.first(10)
5050 end
5151
0 module Jekyll
1 class Renderer
2
3 attr_reader :document, :site
4
5 def initialize(site, document)
6 @site = site
7 @document = document
8 end
9
10 # Determine which converters to use based on this document's
11 # extension.
12 #
13 # Returns an array of Converter instances.
14 def converters
15 @converters ||= site.converters.select { |c| c.matches(document.extname) }
16 end
17
18 # Determine the extname the outputted file should have
19 #
20 # Returns the output extname including the leading period.
21 def output_ext
22 converters.first.output_ext(document.extname)
23 end
24
25 ######################
26 ## DAT RENDER THO
27 ######################
28
29 def run
30 payload = Utils.deep_merge_hashes({
31 "page" => document.to_liquid
32 }, site.site_payload)
33
34 info = {
35 filters: [Jekyll::Filters],
36 registers: { :site => site, :page => payload['page'] }
37 }
38
39 # render and transform content (this becomes the final content of the object)
40 payload["highlighter_prefix"] = converters.first.highlighter_prefix
41 payload["highlighter_suffix"] = converters.first.highlighter_suffix
42
43 output = document.content
44
45 if document.render_with_liquid?
46 output = render_liquid(output, payload, info)
47 end
48
49 if document.place_in_layout?
50 place_in_layouts(
51 convert(output),
52 payload,
53 info
54 )
55 else
56 convert(output)
57 end
58 end
59
60 # Convert the given content using the converters which match this renderer's document.
61 #
62 # content - the raw, unconverted content
63 #
64 # Returns the converted content.
65 def convert(content)
66 converters.reduce(content) do |output, converter|
67 begin
68 converter.convert output
69 rescue => e
70 Jekyll.logger.error "Conversion error:", "#{converter.class} encountered an error converting '#{document.relative_path}'."
71 raise e
72 end
73 end
74 end
75
76 # Render the given content with the payload and info
77 #
78 # content -
79 # payload -
80 # info -
81 # path - (optional) the path to the file, for use in ex
82 #
83 # Returns the content, rendered by Liquid.
84 def render_liquid(content, payload, info, path = nil)
85 Liquid::Template.parse(content).render!(payload, info)
86 rescue Tags::IncludeTagError => e
87 Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{e.path}, included in #{path || document.relative_path}"
88 raise e
89 rescue Exception => e
90 Jekyll.logger.error "Liquid Exception:", "#{e.message} in #{path || document.relative_path}"
91 raise e
92 end
93
94 # Checks if the layout specified in the document actually exists
95 #
96 # layout - the layout to check
97 #
98 # Returns true if the layout is invalid, false if otherwise
99 def invalid_layout?(layout)
100 !document.data["layout"].nil? && layout.nil?
101 end
102
103 # Render layouts and place given content inside.
104 #
105 # content - the content to be placed in the layout
106 #
107 #
108 # Returns the content placed in the Liquid-rendered layouts
109 def place_in_layouts(content, payload, info)
110 output = content.dup
111 layout = site.layouts[document.data["layout"]]
112
113 Jekyll.logger.warn("Build Warning:", "Layout '#{document.data["layout"]}' requested in #{document.relative_path} does not exist.") if invalid_layout? layout
114
115 used = Set.new([layout])
116
117 while layout
118 payload = Utils.deep_merge_hashes(
119 payload,
120 {
121 "content" => output,
122 "page" => document.to_liquid,
123 "layout" => layout.data
124 }
125 )
126
127 output = render_liquid(
128 layout.content,
129 payload,
130 info,
131 File.join(site.config['layouts'], layout.name)
132 )
133
134 if layout = site.layouts[layout.data["layout"]]
135 if used.include?(layout)
136 layout = nil # avoid recursive chain
137 else
138 used << layout
139 end
140 end
141 end
142
143 output
144 end
145
146 end
147 end
00 module Jekyll
11 class Site
22 attr_accessor :config, :layouts, :posts, :pages, :static_files,
3 :categories, :exclude, :include, :source, :dest, :lsi, :pygments,
4 :permalink_style, :tags, :time, :future, :safe, :plugins, :limit_posts,
5 :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems
3 :exclude, :include, :source, :dest, :lsi, :highlighter,
4 :permalink_style, :time, :future, :unpublished, :safe, :plugins, :limit_posts,
5 :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems,
6 :plugin_manager
67
78 attr_accessor :converters, :generators
89
1011 #
1112 # config - A Hash containing site configuration details.
1213 def initialize(config)
13 self.config = config.clone
14
15 %w[safe lsi pygments baseurl exclude include future show_drafts limit_posts keep_files gems].each do |opt|
14 self.config = config.clone
15
16 %w[safe lsi highlighter baseurl exclude include future unpublished
17 show_drafts limit_posts keep_files gems].each do |opt|
1618 self.send("#{opt}=", config[opt])
1719 end
1820
1921 self.source = File.expand_path(config['source'])
2022 self.dest = File.expand_path(config['destination'])
21 self.plugins = plugins_path
2223 self.permalink_style = config['permalink'].to_sym
24
25 self.plugin_manager = Jekyll::PluginManager.new(self)
26 self.plugins = plugin_manager.plugins_path
2327
2428 self.file_read_opts = {}
2529 self.file_read_opts[:encoding] = config['encoding'] if config['encoding']
2630
27 self.reset
28 self.setup
31 reset
32 setup
2933 end
3034
3135 # Public: Read, process, and write this Site to output.
3236 #
3337 # Returns nothing.
3438 def process
35 self.reset
36 self.read
37 self.generate
38 self.render
39 self.cleanup
40 self.write
39 reset
40 read
41 generate
42 render
43 cleanup
44 write
4145 end
4246
4347 # Reset Site details.
4448 #
4549 # Returns nothing
4650 def reset
47 self.time = if self.config['time']
48 Time.parse(self.config['time'].to_s)
49 else
50 Time.now
51 end
52 self.layouts = {}
53 self.posts = []
54 self.pages = []
55 self.static_files = []
56 self.categories = Hash.new { |hash, key| hash[key] = [] }
57 self.tags = Hash.new { |hash, key| hash[key] = [] }
58 self.data = {}
59
60 if self.limit_posts < 0
51 self.time = (config['time'] ? Time.parse(config['time'].to_s) : Time.now)
52 self.layouts = {}
53 self.posts = []
54 self.pages = []
55 self.static_files = []
56 self.data = {}
57 @collections = nil
58
59 if limit_posts < 0
6160 raise ArgumentError, "limit_posts must be a non-negative number"
6261 end
6362 end
6867 def setup
6968 ensure_not_in_dest
7069
71 # If safe mode is off, load in any Ruby files under the plugins
72 # directory.
73 unless self.safe
74 self.plugins.each do |plugins|
75 Dir[File.join(plugins, "**/*.rb")].sort.each do |f|
76 require f
77 end
78 end
79 self.gems.each do |gem|
80 require gem
81 end
82 end
70 plugin_manager.conscientious_require
8371
8472 self.converters = instantiate_subclasses(Jekyll::Converter)
8573 self.generators = instantiate_subclasses(Jekyll::Generator)
8876 # Check that the destination dir isn't the source dir or a directory
8977 # parent to the source dir.
9078 def ensure_not_in_dest
91 dest = Pathname.new(self.dest)
92 Pathname.new(self.source).ascend do |path|
93 if path == dest
94 raise FatalException.new "Destination directory cannot be or contain the Source directory."
95 end
96 end
97 end
98
99 # Internal: Setup the plugin search path
100 #
101 # Returns an Array of plugin search paths
102 def plugins_path
103 if (config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
104 [File.join(self.source, config['plugins'])]
79 dest_pathname = Pathname.new(dest)
80 Pathname.new(source).ascend do |path|
81 if path == dest_pathname
82 raise Errors::FatalException.new "Destination directory cannot be or contain the Source directory."
83 end
84 end
85 end
86
87 # The list of collections and their corresponding Jekyll::Collection instances.
88 # If config['collections'] is set, a new instance is created for each item in the collection.
89 # If config['collections'] is not set, a new hash is returned.
90 #
91 # Returns a Hash containing collection name-to-instance pairs.
92 def collections
93 @collections ||= Hash[collection_names.map { |coll| [coll, Jekyll::Collection.new(self, coll)] } ]
94 end
95
96 # The list of collection names.
97 #
98 # Returns an array of collection names from the configuration,
99 # or an empty array if the `collections` key is not set.
100 def collection_names
101 case config['collections']
102 when Hash
103 config['collections'].keys
104 when Array
105 config['collections']
106 when nil
107 []
105108 else
106 Array(config['plugins']).map { |d| File.expand_path(d) }
109 raise ArgumentError, "Your `collections` key must be a hash or an array."
107110 end
108111 end
109112
111114 #
112115 # Returns nothing.
113116 def read
114 self.read_layouts
115 self.read_directories
116 self.read_data(config['data_source'])
117 end
118
119 # Read all the files in <source>/<layouts> and create a new Layout object
120 # with each one.
121 #
122 # Returns nothing.
123 def read_layouts
124 base = File.join(self.source, self.config['layouts'])
125 return unless File.exists?(base)
126 entries = []
127 Dir.chdir(base) { entries = filter_entries(Dir['**/*.*']) }
128
129 entries.each do |f|
130 name = f.split(".")[0..-2].join(".")
131 self.layouts[name] = Layout.new(self, base, f)
132 end
117 self.layouts = LayoutReader.new(self).read
118 read_directories
119 read_data(config['data_source'])
120 read_collections
133121 end
134122
135123 # Recursively traverse directories to find posts, pages and static files
140128 #
141129 # Returns nothing.
142130 def read_directories(dir = '')
143 base = File.join(self.source, dir)
144 entries = Dir.chdir(base) { filter_entries(Dir.entries('.')) }
145
146 self.read_posts(dir)
147 self.read_drafts(dir) if self.show_drafts
148 self.posts.sort!
131 base = File.join(source, dir)
132 entries = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) }
133
134 read_posts(dir)
135 read_drafts(dir) if show_drafts
136 posts.sort!
149137 limit_posts! if limit_posts > 0 # limit the posts if :limit_posts option is set
150138
151139 entries.each do |f|
152140 f_abs = File.join(base, f)
153141 if File.directory?(f_abs)
154142 f_rel = File.join(dir, f)
155 read_directories(f_rel) unless self.dest.sub(/\/$/, '') == f_abs
143 read_directories(f_rel) unless dest.sub(/\/$/, '') == f_abs
156144 elsif has_yaml_header?(f_abs)
157 pages << Page.new(self, self.source, dir, f)
145 page = Page.new(self, source, dir, f)
146 pages << page if publisher.publish?(page)
158147 else
159 static_files << StaticFile.new(self, self.source, dir, f)
160 end
161 end
148 static_files << StaticFile.new(self, source, dir, f)
149 end
150 end
151
152 pages.sort_by!(&:name)
162153 end
163154
164155 # Read all the files in <source>/<dir>/_posts and create a new Post
168159 #
169160 # Returns nothing.
170161 def read_posts(dir)
171 posts = read_things(dir, '_posts', Post)
162 posts = read_content(dir, '_posts', Post)
172163
173164 posts.each do |post|
174 if post.published && (self.future || post.date <= self.time)
175 aggregate_post_info(post)
176 end
177 end
178 end
165 aggregate_post_info(post) if publisher.publish?(post)
166 end
167 end
179168
180169 # Read all the files in <source>/<dir>/_drafts and create a new Post
181170 # object with each one.
184173 #
185174 # Returns nothing.
186175 def read_drafts(dir)
187 drafts = read_things(dir, '_drafts', Draft)
176 drafts = read_content(dir, '_drafts', Draft)
188177
189178 drafts.each do |draft|
190 aggregate_post_info(draft)
191 end
192 end
193
194 def read_things(dir, magic_dir, klass)
179 if draft.published?
180 aggregate_post_info(draft)
181 end
182 end
183 end
184
185 def read_content(dir, magic_dir, klass)
195186 get_entries(dir, magic_dir).map do |entry|
196 klass.new(self, self.source, dir, entry) if klass.valid?(entry)
187 klass.new(self, source, dir, entry) if klass.valid?(entry)
197188 end.reject do |entry|
198189 entry.nil?
199190 end
203194 #
204195 # Returns nothing
205196 def read_data(dir)
206 base = File.join(self.source, dir)
207 return unless File.directory?(base) && (!self.safe || !File.symlink?(base))
208
209 entries = Dir.chdir(base) { Dir['*.{yaml,yml}'] }
210 entries.delete_if { |e| File.directory?(File.join(base, e)) }
197 base = Jekyll.sanitized_path(source, dir)
198 read_data_to(base, self.data)
199 end
200
201 # Read and parse all yaml files under <dir> and add them to the
202 # <data> variable.
203 #
204 # dir - The string absolute path of the directory to read.
205 # data - The variable to which data will be added.
206 #
207 # Returns nothing
208 def read_data_to(dir, data)
209 return unless File.directory?(dir) && (!safe || !File.symlink?(dir))
210
211 entries = Dir.chdir(dir) do
212 Dir['*.{yaml,yml,json}'] + Dir['*'].select { |fn| File.directory?(fn) }
213 end
211214
212215 entries.each do |entry|
213 path = File.join(self.source, dir, entry)
214 next if File.symlink?(path) && self.safe
216 path = Jekyll.sanitized_path(dir, entry)
217 next if File.symlink?(path) && safe
215218
216219 key = sanitize_filename(File.basename(entry, '.*'))
217 self.data[key] = YAML.safe_load_file(path)
220 if File.directory?(path)
221 read_data_to(path, data[key] = {})
222 else
223 data[key] = SafeYAML.load_file(path)
224 end
225 end
226 end
227
228 # Read in all collections specified in the configuration
229 #
230 # Returns nothing.
231 def read_collections
232 collections.each do |_, collection|
233 collection.read unless collection.label.eql?("data")
218234 end
219235 end
220236
222238 #
223239 # Returns nothing.
224240 def generate
225 self.generators.each do |generator|
241 generators.each do |generator|
226242 generator.generate(self)
227243 end
228244 end
233249 def render
234250 relative_permalinks_deprecation_method
235251
252 collections.each do |label, collection|
253 collection.docs.each do |document|
254 document.output = Jekyll::Renderer.new(self, document).run
255 end
256 end
257
236258 payload = site_payload
237 [self.posts, self.pages].flatten.each do |page_or_post|
238 page_or_post.render(self.layouts, payload)
239 end
240
241 self.categories.values.map { |ps| ps.sort! { |a, b| b <=> a } }
242 self.tags.values.map { |ps| ps.sort! { |a, b| b <=> a } }
259 [posts, pages].flatten.each do |page_or_post|
260 page_or_post.render(layouts, payload)
261 end
243262 rescue Errno::ENOENT => e
244263 # ignore missing layout dir
245264 end
255274 #
256275 # Returns nothing.
257276 def write
258 each_site_file { |item| item.write(self.dest) }
277 each_site_file { |item| item.write(dest) }
259278 end
260279
261280 # Construct a Hash of Posts indexed by the specified Post attribute.
274293 def post_attr_hash(post_attr)
275294 # Build a hash map based on the specified post attribute ( post attr =>
276295 # array of posts ) then sort each array in reverse order.
277 hash = Hash.new { |hsh, key| hsh[key] = Array.new }
278 self.posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } }
279 hash.values.map { |sortme| sortme.sort! { |a, b| b <=> a } }
296 hash = Hash.new { |h, key| h[key] = [] }
297 posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } }
298 hash.values.each { |posts| posts.sort!.reverse! }
280299 hash
300 end
301
302 def tags
303 post_attr_hash('tags')
304 end
305
306 def categories
307 post_attr_hash('categories')
281308 end
282309
283310 # Prepare site data for site payload. The method maintains backward compatibility
285312 #
286313 # Returns the Hash to be hooked to site.data.
287314 def site_data
288 self.config['data'] || self.data
315 config['data'] || data
289316 end
290317
291318 # The Hash payload containing site-wide data.
302329 # "tags" - The Hash of tag values and Posts.
303330 # See Site#post_attr_hash for type info.
304331 def site_payload
305 {"jekyll" => { "version" => Jekyll::VERSION },
306 "site" => self.config.merge({
307 "time" => self.time,
308 "posts" => self.posts.sort { |a, b| b <=> a },
309 "pages" => self.pages,
310 "html_pages" => self.pages.reject { |page| !page.html? },
311 "categories" => post_attr_hash('categories'),
312 "tags" => post_attr_hash('tags'),
313 "data" => site_data})}
332 {
333 "jekyll" => {
334 "version" => Jekyll::VERSION,
335 "environment" => Jekyll.env
336 },
337 "site" => Utils.deep_merge_hashes(config,
338 Utils.deep_merge_hashes(Hash[collections.map{|label, coll| [label, coll.docs]}], {
339 "time" => time,
340 "posts" => posts.sort { |a, b| b <=> a },
341 "pages" => pages,
342 "static_files" => static_files.sort { |a, b| a.relative_path <=> b.relative_path },
343 "html_pages" => pages.select { |page| page.html? || page.url.end_with?("/") },
344 "categories" => post_attr_hash('categories'),
345 "tags" => post_attr_hash('tags'),
346 "collections" => collections,
347 "documents" => documents,
348 "data" => site_data
349 }))
350 }
314351 end
315352
316353 # Filter out any files/directories that are hidden or backup files (start
321358 # entries - The Array of String file/directory entries to filter.
322359 #
323360 # Returns the Array of filtered entries.
324 def filter_entries(entries)
325 EntryFilter.new(self).filter(entries)
361 def filter_entries(entries, base_directory = nil)
362 EntryFilter.new(self, base_directory).filter(entries)
326363 end
327364
328365 # Get the implementation class for the given Converter.
331368 #
332369 # Returns the Converter instance implementing the given Converter.
333370 def getConverterImpl(klass)
334 matches = self.converters.select { |c| c.class == klass }
371 matches = converters.select { |c| c.class == klass }
335372 if impl = matches.first
336373 impl
337374 else
347384 #
348385 # Returns array of instances of subclasses of parameter
349386 def instantiate_subclasses(klass)
350 klass.subclasses.select do |c|
351 !self.safe || c.safe
387 klass.descendants.select do |c|
388 !safe || c.safe
352389 end.sort.map do |c|
353 c.new(self.config)
390 c.new(config)
354391 end
355392 end
356393
361398 #
362399 # Returns the list of entries to process
363400 def get_entries(dir, subfolder)
364 base = File.join(self.source, dir, subfolder)
365 return [] unless File.exists?(base)
366 entries = Dir.chdir(base) { filter_entries(Dir['**/*']) }
401 base = File.join(source, dir, subfolder)
402 return [] unless File.exist?(base)
403 entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) }
367404 entries.delete_if { |e| File.directory?(File.join(base, e)) }
368405 end
369406
373410 #
374411 # Returns nothing
375412 def aggregate_post_info(post)
376 self.posts << post
377 post.categories.each { |c| self.categories[c] << post }
378 post.tags.each { |c| self.tags[c] << post }
413 posts << post
379414 end
380415
381416 def relative_permalinks_deprecation_method
382417 if config['relative_permalinks'] && has_relative_page?
383 $stderr.puts # Places newline after "Generating..."
384418 Jekyll.logger.warn "Deprecation:", "Starting in 2.0, permalinks for pages" +
385419 " in subfolders must be relative to the" +
386420 " site source directory, not the parent" +
387421 " directory. Check http://jekyllrb.com/docs/upgrading/"+
388422 " for more info."
389 $stderr.print Jekyll.logger.formatted_topic("") + "..." # for "done."
390 end
423 end
424 end
425
426 def docs_to_write
427 documents.select(&:write?)
428 end
429
430 def documents
431 collections.reduce(Set.new) do |docs, (_, collection)|
432 docs.merge(collection.docs)
433 end.to_a
391434 end
392435
393436 def each_site_file
394 %w(posts pages static_files).each do |type|
395 self.send(type).each do |item|
437 %w(posts pages static_files docs_to_write).each do |type|
438 send(type).each do |item|
396439 yield item
397440 end
398441 end
399442 end
400443
444 def frontmatter_defaults
445 @frontmatter_defaults ||= FrontmatterDefaults.new(self)
446 end
447
401448 private
402449
403450 def has_relative_page?
404 self.pages.any? { |page| page.uses_relative_permalinks }
451 pages.any? { |page| page.uses_relative_permalinks }
405452 end
406453
407454 def has_yaml_header?(file)
408 "---" == File.open(file) { |fd| fd.read(3) }
455 !!(File.open(file, 'rb') { |f| f.read(5) } =~ /\A---\r?\n/)
409456 end
410457
411458 def limit_posts!
412 limit = self.posts.length < limit_posts ? self.posts.length : limit_posts
413 self.posts = self.posts[-limit, limit]
459 limit = posts.length < limit_posts ? posts.length : limit_posts
460 self.posts = posts[-limit, limit]
414461 end
415462
416463 def site_cleaner
418465 end
419466
420467 def sanitize_filename(name)
421 name = name.gsub(/[^\w\s_-]+/, '')
422 name = name.gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
423 name = name.gsub(/\s+/, '_')
468 name.gsub!(/[^\w\s_-]+/, '')
469 name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
470 name.gsub(/\s+/, '_')
471 end
472
473 def publisher
474 @publisher ||= Publisher.new(self)
424475 end
425476 end
426477 end
1717
1818 # Returns source file path.
1919 def path
20 File.join(@base, @dir, @name)
20 File.join(*[@base, @dir, @name].compact)
21 end
22
23 # Returns the source file path relative to the site source
24 def relative_path
25 @relative_path ||= path.sub(/\A#{@site.source}/, '')
2126 end
2227
2328 # Obtain destination path.
2631 #
2732 # Returns destination file path.
2833 def destination(dest)
29 File.join(dest, @dir, @name)
34 File.join(*[dest, @dir, @name].compact)
3035 end
3136
3237 # Returns last modification time for this file.
5358 @@mtimes[path] = mtime
5459
5560 FileUtils.mkdir_p(File.dirname(dest_path))
61 FileUtils.rm(dest_path) if File.exist?(dest_path)
5662 FileUtils.cp(path, dest_path)
5763
5864 true
6571 @@mtimes = Hash.new
6672 nil
6773 end
74
75 def to_liquid
76 {
77 "path" => relative_path,
78 "modified_time" => mtime.to_s,
79 "extname" => File.extname(relative_path)
80 }
81 end
6882 end
6983 end
00 module Jekyll
1 class Stevenson
2 attr_accessor :log_level
3
4 DEBUG = 0
5 INFO = 1
6 WARN = 2
7 ERROR = 3
8
9 # Public: Create a new instance of Stevenson, Jekyll's logger
10 #
11 # level - (optional, integer) the log level
12 #
13 # Returns nothing
14 def initialize(level = INFO)
15 @log_level = level
16 end
17
18 # Public: Print a jekyll debug message to stdout
19 #
20 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
21 # message - the message detail
22 #
23 # Returns nothing
24 def debug(topic, message = nil)
25 $stdout.puts(message(topic, message)) if log_level <= DEBUG
1 class Stevenson < ::Logger
2 def initialize
3 @progname = nil
4 @level = DEBUG
5 @default_formatter = Formatter.new
6 @logdev = $stdout
7 @formatter = proc do |severity, datetime, progname, msg|
8 "#{msg}"
9 end
2610 end
2711
28 # Public: Print a jekyll message to stdout
29 #
30 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
31 # message - the message detail
32 #
33 # Returns nothing
34 def info(topic, message = nil)
35 $stdout.puts(message(topic, message)) if log_level <= INFO
12 def add(severity, message = nil, progname = nil, &block)
13 severity ||= UNKNOWN
14 @logdev = set_logdevice(severity)
15
16 if @logdev.nil? or severity < @level
17 return true
18 end
19 progname ||= @progname
20 if message.nil?
21 if block_given?
22 message = yield
23 else
24 message = progname
25 progname = @progname
26 end
27 end
28 @logdev.puts(
29 format_message(format_severity(severity), Time.now, progname, message))
30 true
3631 end
3732
38 # Public: Print a jekyll message to stderr
39 #
40 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
41 # message - the message detail
42 #
43 # Returns nothing
44 def warn(topic, message = nil)
45 $stderr.puts(message(topic, message).yellow) if log_level <= WARN
33 # Log a +WARN+ message
34 def warn(progname = nil, &block)
35 add(WARN, nil, progname.yellow, &block)
4636 end
4737
48 # Public: Print a jekyll error message to stderr
49 #
50 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
51 # message - the message detail
52 #
53 # Returns nothing
54 def error(topic, message = nil)
55 $stderr.puts(message(topic, message).red) if log_level <= ERROR
38 # Log an +ERROR+ message
39 def error(progname = nil, &block)
40 add(ERROR, nil, progname.red, &block)
5641 end
5742
58 # Public: Print a Jekyll error message to stderr and immediately abort the process
59 #
60 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
61 # message - the message detail (can be omitted)
62 #
63 # Returns nothing
64 def abort_with(topic, message = nil)
65 error(topic, message)
66 abort
43 def close
44 # No LogDevice in use
6745 end
6846
69 # Public: Build a Jekyll topic method
70 #
71 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
72 # message - the message detail
73 #
74 # Returns the formatted message
75 def message(topic, message)
76 formatted_topic(topic) + message.to_s.gsub(/\s+/, ' ')
77 end
47 private
7848
79 # Public: Format the topic
80 #
81 # topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
82 #
83 # Returns the formatted topic statement
84 def formatted_topic(topic)
85 "#{topic} ".rjust(20)
49 def set_logdevice(severity)
50 if severity > INFO
51 $stderr
52 else
53 $stdout
54 end
8655 end
8756 end
8857 end
+0
-48
lib/jekyll/tags/gist.rb less more
0 # Gist Liquid Tag
1 #
2 # Example:
3 # {% gist 1234567 %}
4 # {% gist 1234567 file.rb %}
5
6 module Jekyll
7 class GistTag < Liquid::Tag
8
9 def render(context)
10 if tag_contents = determine_arguments(@markup.strip)
11 gist_id, filename = tag_contents[0], tag_contents[1]
12 gist_script_tag(gist_id, filename)
13 else
14 raise ArgumentError.new <<-eos
15 Syntax error in tag 'gist' while parsing the following markup:
16
17 #{@markup}
18
19 Valid syntax:
20 for public gists: {% gist 1234567 %}
21 for private gists: {% gist user/1234567 %}
22 eos
23 end
24 end
25
26 private
27
28 def determine_arguments(input)
29 matched = if input.include?("/")
30 input.match(/\A([a-zA-Z0-9\/\-_]+) ?(\S*)\Z/)
31 else
32 input.match(/\A(\d+) ?(\S*)\Z/)
33 end
34 [matched[1].strip, matched[2].strip] if matched && matched.length >= 3
35 end
36
37 def gist_script_tag(gist_id, filename = nil)
38 if filename.empty?
39 "<script src=\"https://gist.github.com/#{gist_id}.js\"> </script>"
40 else
41 "<script src=\"https://gist.github.com/#{gist_id}.js?file=#{filename}\"> </script>"
42 end
43 end
44 end
45 end
46
47 Liquid::Template.register_tag('gist', Jekyll::GistTag)
33 include Liquid::StandardFilters
44
55 # The regular expression syntax checker. Start with the language specifier.
6 # Follow that by zero or more space separated options that take one of two
7 # forms:
6 # Follow that by zero or more space separated options that take one of three
7 # forms: name, name=value, or name="<quoted list>"
88 #
9 # 1. name
10 # 2. name=value
11 SYNTAX = /^([a-zA-Z0-9.+#-]+)((\s+\w+(=\w+)?)*)$/
9 # <quoted list> is a space-separated list of numbers
10 SYNTAX = /^([a-zA-Z0-9.+#-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$/
1211
1312 def initialize(tag_name, markup, tokens)
1413 super
1615 @lang = $1.downcase
1716 @options = {}
1817 if defined?($2) && $2 != ''
19 $2.split.each do |opt|
18 # Split along 3 possible forms -- key="<quoted list>", key=value, or key
19 $2.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt|
2020 key, value = opt.split('=')
21 if value.nil?
22 if key == 'linenos'
23 value = 'inline'
24 else
25 value = true
26 end
21 # If a quoted list, convert to array
22 if value && value.include?("\"")
23 value.gsub!(/"/, "")
24 value = value.split
2725 end
28 @options[key] = value
26 @options[key.to_sym] = value || true
2927 end
3028 end
29 @options[:linenos] = "inline" if @options.key?(:linenos) and @options[:linenos] == true
3130 else
3231 raise SyntaxError.new <<-eos
3332 Syntax Error in tag 'highlight' while parsing the following markup:
4039 end
4140
4241 def render(context)
43 if context.registers[:site].pygments
44 render_pygments(context, super)
42 prefix = context["highlighter_prefix"] || ""
43 suffix = context["highlighter_suffix"] || ""
44 code = super.to_s.strip
45
46 is_safe = !!context.registers[:site].safe
47
48 output = case context.registers[:site].highlighter
49 when 'pygments'
50 render_pygments(code, is_safe)
51 when 'rouge'
52 render_rouge(code)
4553 else
46 render_codehighlighter(context, super)
54 render_codehighlighter(code)
55 end
56
57 rendered_output = add_code_tag(output)
58 prefix + rendered_output + suffix
59 end
60
61 def sanitized_opts(opts, is_safe)
62 if is_safe
63 Hash[[
64 [:startinline, opts.fetch(:startinline, nil)],
65 [:hl_linenos, opts.fetch(:hl_linenos, nil)],
66 [:linenos, opts.fetch(:linenos, nil)],
67 [:encoding, opts.fetch(:encoding, 'utf-8')],
68 [:cssclass, opts.fetch(:cssclass, nil)]
69 ].reject {|f| f.last.nil? }]
70 else
71 opts
4772 end
4873 end
4974
50 def render_pygments(context, code)
75 def render_pygments(code, is_safe)
5176 require 'pygments'
5277
5378 @options[:encoding] = 'utf-8'
5479
55 output = add_code_tags(
56 Pygments.highlight(code, :lexer => @lang, :options => @options),
57 @lang
80 highlighted_code = Pygments.highlight(
81 code,
82 :lexer => @lang,
83 :options => sanitized_opts(@options, is_safe)
5884 )
5985
60 output = context["pygments_prefix"] + output if context["pygments_prefix"]
61 output = output + context["pygments_suffix"] if context["pygments_suffix"]
62 output
86 if highlighted_code.nil?
87 Jekyll.logger.error "There was an error highlighting your code:"
88 puts
89 Jekyll.logger.error code
90 puts
91 Jekyll.logger.error "While attempting to convert the above code, Pygments.rb" +
92 " returned an unacceptable value."
93 Jekyll.logger.error "This is usually a timeout problem solved by running `jekyll build` again."
94 raise ArgumentError.new("Pygments.rb returned an unacceptable value when attempting to highlight some code.")
95 end
96
97 highlighted_code
6398 end
6499
65 def render_codehighlighter(context, code)
66 #The div is required because RDiscount blows ass
67 <<-HTML
68 <div>
69 <pre><code class='#{@lang}'>#{h(code).strip}</code></pre>
70 </div>
71 HTML
100 def render_rouge(code)
101 require 'rouge'
102 formatter = Rouge::Formatters::HTML.new(line_numbers: @options[:linenos], wrap: false)
103 lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText
104 code = formatter.format(lexer.lex(code))
105 "<div class=\"highlight\"><pre>#{code}</pre></div>"
72106 end
73107
74 def add_code_tags(code, lang)
108 def render_codehighlighter(code)
109 "<div class=\"highlight\"><pre>#{h(code).strip}</pre></div>"
110 end
111
112 def add_code_tag(code)
75113 # Add nested <code> tags to code blocks
76 code = code.sub(/<pre>/,'<pre><code class="' + lang + '">')
77 code = code.sub(/<\/pre>/,"</code></pre>")
114 code = code.sub(/<pre>\n*/,'<pre><code class="language-' + @lang.to_s.gsub("+", "-") + '" data-lang="' + @lang.to_s + '">')
115 code = code.sub(/\n*<\/pre>/,"</code></pre>")
116 code.strip
78117 end
79118
80119 end
1313 SYNTAX_EXAMPLE = "{% include file.ext param='value' param2='value' %}"
1414
1515 VALID_SYNTAX = /([\w-]+)\s*=\s*(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([\w\.-]+))/
16 VARIABLE_SYNTAX = /(?<variable>\{\{\s*(?<name>[\w\-\.]+)\s*(\|.*)?\}\})(?<params>.*)/
1617
1718 INCLUDES_DIR = '_includes'
1819
1920 def initialize(tag_name, markup, tokens)
2021 super
21 @file, @params = markup.strip.split(' ', 2);
22 matched = markup.strip.match(VARIABLE_SYNTAX)
23 if matched
24 @file = matched['variable'].strip
25 @params = matched['params'].strip
26 else
27 @file, @params = markup.strip.split(' ', 2);
28 end
2229 validate_params if @params
2330 end
2431
4754 raise ArgumentError.new <<-eos
4855 Invalid syntax for include tag. File contains invalid characters or sequences:
4956
50 #{@file}
57 #{file}
5158
5259 Valid syntax:
5360
54 #{SYNTAX_EXAMPLE}
61 #{SYNTAX_EXAMPLE}
5562
5663 eos
5764 end
6370 raise ArgumentError.new <<-eos
6471 Invalid syntax for include tag:
6572
66 #{@params}
73 #{@params}
6774
6875 Valid syntax:
6976
70 #{SYNTAX_EXAMPLE}
77 #{SYNTAX_EXAMPLE}
7178
7279 eos
7380 end
7885 context.registers[:site].file_read_opts
7986 end
8087
81 def retrieve_variable(context)
82 if /\{\{([\w\-\.]+)\}\}/ =~ @file
83 raise ArgumentError.new("No variable #{$1} was found in include tag") if context[$1].nil?
84 context[$1]
88 # Render the variable if required
89 def render_variable(context)
90 if @file.match(VARIABLE_SYNTAX)
91 partial = Liquid::Template.parse(@file)
92 partial.render!(context)
8593 end
8694 end
8795
8896 def render(context)
8997 dir = File.join(File.realpath(context.registers[:site].source), INCLUDES_DIR)
9098
91 file = retrieve_variable(context) || @file
99 file = render_variable(context) || @file
92100 validate_file_name(file)
93101
94102 path = File.join(dir, file)
110118 if safe && !realpath_prefixed_with?(path, dir)
111119 raise IOError.new "The included file '#{path}' should exist and should not be a symlink"
112120 elsif !File.exist?(path)
113 raise IOError.new "Included file '#{path}' not found"
121 raise IOError.new "Included file '#{path_relative_to_source(dir, path)}' not found"
114122 end
123 end
124
125 def path_relative_to_source(dir, path)
126 File.join(INCLUDES_DIR, path.sub(Regexp.new("^#{dir}"), ""))
115127 end
116128
117129 def realpath_prefixed_with?(path, dir)
118130 File.exist?(path) && File.realpath(path).start_with?(dir)
119131 end
120132
121 def blank?
122 false
123 end
124
125133 # This method allows to modify the file content by inheriting from the class.
126134 def source(file, context)
127 File.read_with_options(file, file_read_opts(context))
135 File.read(file, file_read_opts(context))
128136 end
129137 end
130138 end
66
77 def initialize(name)
88 all, path, date, slug = *name.sub(/^\//, "").match(MATCHER)
9 raise ArgumentError.new("'#{name}' does not contain valid date and/or title") unless all
910 @slug = path ? path + slug : slug
1011 @date = Time.parse(date)
1112 end
3738 def initialize(tag_name, post, tokens)
3839 super
3940 @orig_post = post.strip
40 @post = PostComparer.new(@orig_post)
41 begin
42 @post = PostComparer.new(@orig_post)
43 rescue
44 raise ArgumentError.new <<-eos
45 Could not parse name of post "#{@orig_post}" in tag 'post_url'.
46
47 Make sure the post exists and the name is correct.
48 eos
49 end
4150 end
4251
4352 def render(context)
0 require 'uri'
1
02 # Public: Methods that generate a URL for a resource such as a Post or a Page.
13 #
24 # Examples
2123 # template. Instead, the given permalink will be
2224 # used as URL.
2325 def initialize(options)
24 @template = options[:template]
26 @template = options[:template]
2527 @placeholders = options[:placeholders] || {}
26 @permalink = options[:permalink]
28 @permalink = options[:permalink]
2729
2830 if (@template || @permalink).nil?
2931 raise ArgumentError, "One of :template or :permalink must be supplied."
4345 # Returns the _unsanitizied_ String URL
4446 def generate_url
4547 @placeholders.inject(@template) do |result, token|
46 result.gsub(/:#{token.first}/, token.last)
48 result.gsub(/:#{token.first}/, self.class.escape_path(token.last))
4749 end
4850 end
4951
6466
6567 url
6668 end
69
70 # Escapes a path to be a valid URL path segment
71 #
72 # path - The path to be escaped.
73 #
74 # Examples:
75 #
76 # URL.escape_path("/a b")
77 # # => "/a%20b"
78 #
79 # Returns the escaped path.
80 def self.escape_path(path)
81 # Because URI.escape doesn't escape '?', '[' and ']' by defaut,
82 # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/").
83 #
84 # URI path segment is defined in RFC 3986 as follows:
85 # segment = *pchar
86 # pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
87 # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
88 # pct-encoded = "%" HEXDIG HEXDIG
89 # sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
90 # / "*" / "+" / "," / ";" / "="
91 URI.escape(path, /[^a-zA-Z\d\-._~!$&\'()*+,;=:@\/]/).encode('utf-8')
92 end
93
94 # Unescapes a URL path segment
95 #
96 # path - The path to be unescaped.
97 #
98 # Examples:
99 #
100 # URL.unescape_path("/a%20b")
101 # # => "/a b"
102 #
103 # Returns the unescaped path.
104 def self.unescape_path(path)
105 URI.unescape(path.encode('utf-8'))
106 end
67107 end
68108 end
0 module Jekyll
1 module Utils
2 class << self
3
4 # Merges a master hash with another hash, recursively.
5 #
6 # master_hash - the "parent" hash whose values will be overridden
7 # other_hash - the other hash whose values will be persisted after the merge
8 #
9 # This code was lovingly stolen from some random gem:
10 # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
11 #
12 # Thanks to whoever made it.
13 def deep_merge_hashes(master_hash, other_hash)
14 target = master_hash.dup
15
16 other_hash.keys.each do |key|
17 if other_hash[key].is_a? Hash and target[key].is_a? Hash
18 target[key] = Utils.deep_merge_hashes(target[key], other_hash[key])
19 next
20 end
21
22 target[key] = other_hash[key]
23 end
24
25 target
26 end
27
28 # Read array from the supplied hash favouring the singular key
29 # and then the plural key, and handling any nil entries.
30 #
31 # hash - the hash to read from
32 # singular_key - the singular key
33 # plural_key - the plural key
34 #
35 # Returns an array
36 def pluralized_array_from_hash(hash, singular_key, plural_key)
37 [].tap do |array|
38 array << (value_from_singular_key(hash, singular_key) || value_from_plural_key(hash, plural_key))
39 end.flatten.compact
40 end
41
42 def value_from_singular_key(hash, key)
43 hash[key] if (hash.has_key?(key) || (hash.default_proc && hash[key]))
44 end
45
46 def value_from_plural_key(hash, key)
47 if hash.has_key?(key) || (hash.default_proc && hash[key])
48 val = hash[key]
49 case val
50 when String
51 val.split
52 when Array
53 val.compact
54 end
55 end
56 end
57
58 def transform_keys(hash)
59 result = {}
60 hash.each_key do |key|
61 result[yield(key)] = hash[key]
62 end
63 result
64 end
65
66 # Apply #to_sym to all keys in the hash
67 #
68 # hash - the hash to which to apply this transformation
69 #
70 # Returns a new hash with symbolized keys
71 def symbolize_hash_keys(hash)
72 transform_keys(hash) { |key| key.to_sym rescue key }
73 end
74
75 # Apply #to_s to all keys in the Hash
76 #
77 # hash - the hash to which to apply this transformation
78 #
79 # Returns a new hash with stringified keys
80 def stringify_hash_keys(hash)
81 transform_keys(hash) { |key| key.to_s rescue key }
82 end
83
84 end
85 end
86 end
0 module Jekyll
1 VERSION = '2.2.0'
2 end
1717 # stdlib
1818 require 'fileutils'
1919 require 'time'
20 require 'safe_yaml'
2120 require 'English'
2221 require 'pathname'
22 require 'logger'
2323
2424 # 3rd party
25 require 'safe_yaml/load'
2526 require 'liquid'
26 require 'maruku'
27 require 'kramdown'
2728 require 'colorator'
28 require 'toml'
29
30 # internal requires
31 require 'jekyll/core_ext'
32 require 'jekyll/stevenson'
33 require 'jekyll/deprecator'
34 require 'jekyll/configuration'
35 require 'jekyll/site'
36 require 'jekyll/convertible'
37 require 'jekyll/url'
38 require 'jekyll/layout'
39 require 'jekyll/page'
40 require 'jekyll/post'
41 require 'jekyll/excerpt'
42 require 'jekyll/draft'
43 require 'jekyll/filters'
44 require 'jekyll/static_file'
45 require 'jekyll/errors'
46 require 'jekyll/related_posts'
47 require 'jekyll/cleaner'
48 require 'jekyll/entry_filter'
49
50 # extensions
51 require 'jekyll/plugin'
52 require 'jekyll/converter'
53 require 'jekyll/generator'
54 require 'jekyll/command'
55
56 require_all 'jekyll/commands'
57 require_all 'jekyll/converters'
58 require_all 'jekyll/converters/markdown'
59 require_all 'jekyll/generators'
60 require_all 'jekyll/tags'
6129
6230 SafeYAML::OPTIONS[:suppress_warnings] = true
6331
6432 module Jekyll
65 VERSION = '1.5.1'
33
34 # internal requires
35 autoload :Cleaner, 'jekyll/cleaner'
36 autoload :Collection, 'jekyll/collection'
37 autoload :Configuration, 'jekyll/configuration'
38 autoload :Convertible, 'jekyll/convertible'
39 autoload :Deprecator, 'jekyll/deprecator'
40 autoload :Document, 'jekyll/document'
41 autoload :Draft, 'jekyll/draft'
42 autoload :EntryFilter, 'jekyll/entry_filter'
43 autoload :Errors, 'jekyll/errors'
44 autoload :Excerpt, 'jekyll/excerpt'
45 autoload :Filters, 'jekyll/filters'
46 autoload :FrontmatterDefaults, 'jekyll/frontmatter_defaults'
47 autoload :Layout, 'jekyll/layout'
48 autoload :LayoutReader, 'jekyll/layout_reader'
49 autoload :LogAdapter, 'jekyll/log_adapter'
50 autoload :Page, 'jekyll/page'
51 autoload :PluginManager, 'jekyll/plugin_manager'
52 autoload :Post, 'jekyll/post'
53 autoload :Publisher, 'jekyll/publisher'
54 autoload :RelatedPosts, 'jekyll/related_posts'
55 autoload :Renderer, 'jekyll/renderer'
56 autoload :Site, 'jekyll/site'
57 autoload :StaticFile, 'jekyll/static_file'
58 autoload :Stevenson, 'jekyll/stevenson'
59 autoload :URL, 'jekyll/url'
60 autoload :Utils, 'jekyll/utils'
61 autoload :VERSION, 'jekyll/version'
62
63 # extensions
64 require 'jekyll/plugin'
65 require 'jekyll/converter'
66 require 'jekyll/generator'
67 require 'jekyll/command'
68 require 'jekyll/liquid_extensions'
69
70 # Public: Tells you which Jekyll environment you are building in so you can skip tasks
71 # if you need to. This is useful when doing expensive compression tasks on css and
72 # images and allows you to skip that when working in development.
73
74 def self.env
75 ENV["JEKYLL_ENV"] || "development"
76 end
6677
6778 # Public: Generate a Jekyll configuration Hash by merging the default
6879 # options with anything in _config.yml, and adding the given options on top.
7889 config = config.read_config_files(config.config_files(override))
7990
8091 # Merge DEFAULTS < _config.yml < override
81 config = config.deep_merge(override).stringify_keys
92 config = Utils.deep_merge_hashes(config, override).stringify_keys
8293 set_timezone(config['timezone']) if config['timezone']
8394
8495 config
94105 end
95106
96107 def self.logger
97 @logger ||= Stevenson.new
108 @logger ||= LogAdapter.new(Stevenson.new)
98109 end
99110
100 # Get a subpath without any of the traversal nonsense.
111 def self.logger=(writer)
112 @logger = LogAdapter.new(writer)
113 end
114
115 # Public: File system root
101116 #
102 # Returns a pure and clean path
117 # Returns the root of the filesystem as a Pathname
118 def self.fs_root
119 @fs_root ||= "/"
120 end
121
103122 def self.sanitized_path(base_directory, questionable_path)
104 clean_path = File.expand_path(questionable_path, "/")
123 clean_path = File.expand_path(questionable_path, fs_root)
105124 clean_path.gsub!(/\A\w\:\//, '/')
106125 unless clean_path.start_with?(base_directory)
107126 File.join(base_directory, clean_path)
110129 end
111130 end
112131 end
132
133 require_all 'jekyll/commands'
134 require_all 'jekyll/converters'
135 require_all 'jekyll/converters/markdown'
136 require_all 'jekyll/generators'
137 require_all 'jekyll/tags'
138
139 # Eventually remove these for 3.0 as non-core
140 Jekyll::Deprecator.gracefully_require(%w[
141 classifier
142 toml
143 jekyll-paginate
144 jekyll-gist
145 jekyll-coffeescript
146 jekyll-sass-converter
147 ])
0 name: Your New Jekyll Site
1 markdown: redcarpet
2 pygments: true
0 # Site settings
1 title: Your awesome title
2 email: your-email@domain.com
3 description: "Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description."
4 baseurl: ""
5 url: "http://yourdomain.com"
6 twitter_username: jekyllrb
7 github_username: jekyll
8
9 # Build settings
10 markdown: kramdown
11 permalink: pretty
0 <footer class="site-footer">
1
2 <div class="wrap">
3
4 <h2 class="footer-heading">{{ site.title }}</h2>
5
6 <div class="footer-col-1 column">
7 <ul>
8 <li>{{ site.title }}</li>
9 <li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
10 </ul>
11 </div>
12
13 <div class="footer-col-2 column">
14 <ul>
15 {% if site.github_username %}<li>
16 <a href="https://github.com/{{ site.github_username }}">
17 <span class="icon github">
18 <svg version="1.1" class="github-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
19 viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
20 <path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C2C2" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761
21 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32
22 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472
23 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037
24 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65
25 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261
26 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082
27 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129
28 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
29 </svg>
30 </span>
31 <span class="username">{{ site.github_username }}</span>
32 </a>
33 </li>{% endif %}
34 {% if site.twitter_username %}<li>
35 <a href="https://twitter.com/{{ site.twitter_username }}">
36 <span class="icon twitter">
37 <svg version="1.1" class="twitter-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
38 viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
39 <path fill="#C2C2C2" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
40 c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27
41 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767
42 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206
43 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271
44 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469
45 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
46 </svg>
47 </span>
48 <span class="username">{{ site.twitter_username }}</span>
49 </a>
50 </li>{% endif %}
51 </ul>
52 </div>
53
54 <div class="footer-col-3 column">
55 <p class="text">{{ site.description }}</p>
56 </div>
57
58 </div>
59
60 </footer>
0 <head>
1 <meta charset="utf-8">
2 <meta http-equiv="X-UA-Compatible" content="IE=edge">
3 <title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
4 <meta name="viewport" content="width=device-width">
5 <meta name="description" content="{{ site.description }}">
6 <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
7
8 <!-- Custom CSS -->
9 <link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
10
11 </head>
0 <header class="site-header">
1
2 <div class="wrap">
3
4 <a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
5
6 <nav class="site-nav">
7 <a href="#" class="menu-icon">
8 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
9 viewBox="0 0 18 15" enable-background="new 0 0 18 15" xml:space="preserve">
10 <path fill="#505050" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0
11 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
12 <path fill="#505050" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484
13 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
14 <path fill="#505050" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0
15 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
16 </svg>
17 </a>
18 <div class="trigger">
19 {% for page in site.pages %}
20 {% if page.title %}<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>{% endif %}
21 {% endfor %}
22 </div>
23 </nav>
24
25 </div>
26
27 </header>
00 <!DOCTYPE html>
11 <html>
2 <head>
3 <meta charset="utf-8">
4 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
5 <title>{{ page.title }}</title>
6 <meta name="viewport" content="width=device-width">
72
8 <!-- syntax highlighting CSS -->
9 <link rel="stylesheet" href="/css/syntax.css">
3 {% include head.html %}
104
11 <!-- Custom CSS -->
12 <link rel="stylesheet" href="/css/main.css">
13
14 </head>
155 <body>
166
17 <div class="site">
18 <div class="header">
19 <h1 class="title"><a href="/">{{ site.name }}</a></h1>
20 <a class="extra" href="/">home</a>
21 </div>
7 {% include header.html %}
228
23 {{ content }}
9 <div class="page-content">
10 <div class="wrap">
11 {{ content }}
12 </div>
13 </div>
2414
25 <div class="footer">
26 <div class="contact">
27 <p>
28 Your Name<br />
29 What You Are<br />
30 you@example.com
31 </p>
32 </div>
33 <div class="contact">
34 <p>
35 <a href="https://github.com/yourusername">github.com/yourusername</a><br />
36 <a href="https://twitter.com/yourusername">twitter.com/yourusername</a><br />
37 </p>
38 </div>
39 </div>
40 </div>
15 {% include footer.html %}
4116
4217 </body>
43 </html>
18 </html>
0 ---
1 layout: default
2 ---
3 <div class="post">
4
5 <header class="post-header">
6 <h1>{{ page.title }}</h1>
7 </header>
8
9 <article class="post-content">
10 {{ content }}
11 </article>
12
13 </div>
00 ---
11 layout: default
22 ---
3 <h2>{{ page.title }}</h2>
4 <p class="meta">{{ page.date | date_to_string }}</p>
3 <div class="post">
54
6 <div class="post">
7 {{ content }}
8 </div>
5 <header class="post-header">
6 <h1>{{ page.title }}</h1>
7 <p class="meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
8 </header>
9
10 <article class="post-content">
11 {{ content }}
12 </article>
13
14 </div>
1919
2020 Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll's GitHub repo][jekyll-gh].
2121
22 [jekyll-gh]: https://github.com/mojombo/jekyll
22 [jekyll-gh]: https://github.com/jekyll/jekyll
2323 [jekyll]: http://jekyllrb.com
0 ---
1 layout: page
2 title: About
3 permalink: /about/
4 ---
5
6 This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](http://jekyllrb.com/)
7
8 You can find the source code for the Jekyll new theme at: [github.com/jglovier/jekyll-new](https://github.com/jglovier/jekyll-new)
9
10 You can find the source code for Jekyll at [github.com/jekyll/jekyll](https://github.com/jekyll/jekyll)
0 /*****************************************************************************/
1 /*
2 /* Common
3 /*
4 /*****************************************************************************/
5
6 /* Global Reset */
0 /* Base */
1 /* ----------------------------------------------------------*/
2
73 * {
84 margin: 0;
95 padding: 0;
128 html, body { height: 100%; }
139
1410 body {
15 background-color: #FFF;
16 font: 13.34px Helvetica, Arial, sans-serif;
17 font-size: small;
18 text-align: center;
19 }
20
21 h1, h2, h3, h4, h5, h6 {
22 font-size: 100%; }
23
24 h1 { margin-bottom: 1em; }
25 p { margin: 1em 0; }
26
27 a { color: #00a; }
28 a:hover { color: #000; }
29 a:visited { color: #a0a; }
30
31 /*****************************************************************************/
32 /*
33 /* Home
34 /*
35 /*****************************************************************************/
36 .posts {
37 list-style-type: none;
38 margin-bottom: 2em;
39 }
40
41 .posts li {
42 line-height: 1.75em;
43 }
44
45 .posts span {
46 color: #aaa;
47 font-family: Monaco, "Courier New", monospace;
48 font-size: 80%;
49 }
50
51 /*****************************************************************************/
52 /*
53 /* Site
54 /*
55 /*****************************************************************************/
56
57 .site {
58 font-size: 115%;
59 text-align: justify;
60 width: 42em;
61 margin: 3em auto 2em;
62 line-height: 1.5em;
63 }
64
65 .header a {
66 font-weight: bold;
67 text-decoration: none;
68 }
69
70 .title {
11 font-family: Helvetica, Arial, sans-serif;
12 font-size: 16px;
13 line-height: 1.5;
14 font-weight: 300;
15 background-color: #fdfdfd;
16 }
17
18 h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: 400; }
19
20 a { color: #2a7ae2; text-decoration: none; }
21 a:hover { color: #000; text-decoration: underline; }
22 a:visited { color: #205caa; }
23
24 /* Utility */
25
26 .wrap:before,
27 .wrap:after { content:""; display:table; }
28 .wrap:after { clear: both; }
29 .wrap {
30 max-width: 800px;
31 padding: 0 30px;
32 margin: 0 auto;
33 zoom: 1;
34 }
35
36
37 /* Layout Styles */
38 /* ----------------------------------------------------------*/
39
40 /* Site header */
41
42 .site-header {
43 border-top: 5px solid #333;
44 border-bottom: 1px solid #e8e8e8;
45 min-height: 56px;
46 background-color: white;
47 }
48
49 .site-title,
50 .site-title:hover,
51 .site-title:visited {
52 display: block;
53 color: #333;
54 font-size: 26px;
55 letter-spacing: -1px;
56 float: left;
57 line-height: 56px;
58 position: relative;
59 z-index: 1;
60 }
61
62 .site-nav {
63 float: right;
64 line-height: 56px;
65 }
66
67 .site-nav .menu-icon { display: none; }
68
69 .site-nav .page-link {
70 margin-left: 20px;
71 color: #727272;
72 letter-spacing: -.5px;
73 }
74
75 /* Site footer */
76
77 .site-footer {
78 border-top: 1px solid #e8e8e8;
79 padding: 30px 0;
80 }
81
82 .footer-heading {
83 font-size: 18px;
84 font-weight: 300;
85 letter-spacing: -.5px;
86 margin-bottom: 15px;
87 }
88
89 .site-footer .column { float: left; margin-bottom: 15px; }
90
91 .footer-col-1 {
92 width: 270px; /*fallback*/
93 width: -webkit-calc(35% - 10px);
94 width: -moz-calc(35% - 10px);
95 width: -o-calc(35% - 10px);
96 width: calc(35% - 10px);
97 margin-right: 10px
98 }
99 .footer-col-2 {
100 width: 175px; /*fallback*/
101 width: -webkit-calc(23.125% - 10px);
102 width: -moz-calc(23.125% - 10px);
103 width: -o-calc(23.125% - 10px);
104 width: calc(23.125% - 10px);
105 margin-right: 10px
106 }
107 .footer-col-3 {
108 width: 335px; /*fallback*/
109 width: -webkit-calc(41.875%);
110 width: -moz-calc(41.875%);
111 width: -o-calc(41.875%);
112 width: calc(41.875%);
113 }
114
115 .site-footer ul { list-style: none; }
116
117 .site-footer li,
118 .site-footer p {
119 font-size: 15px;
120 letter-spacing: -.3px;
121 color: #828282;
122 }
123
124 .github-icon-svg,
125 .twitter-icon-svg {
71126 display: inline-block;
72 margin-bottom: 2em;
73 }
74
75 .title a {
76 color: #a00;
77 }
78
79 .title a:hover {
80 color: #000;
81 }
82
83 .header a.extra {
84 color: #aaa;
85 margin-left: 1em;
86 }
87
88 .header a.extra:hover {
89 color: #000;
90 }
91
92 .meta {
93 color: #aaa;
94 }
95
96 .footer {
97 font-size: 80%;
98 color: #666;
99 border-top: 4px solid #eee;
100 margin-top: 2em;
101 overflow: hidden;
102 }
103
104 .footer .contact {
105 float: left;
106 margin-right: 3em;
107 }
108
109 .footer .contact a {
110 color: #8085C1;
111 }
112
113 .footer .rss {
114 margin-top: 1.1em;
115 margin-right: -.2em;
116 float: right;
117 }
118
119 .footer .rss img {
127 width: 16px;
128 height: 16px;
129 position: relative;
130 top: 3px;
131 }
132
133
134 /* Page Content styles */
135 /* ----------------------------------------------------------*/
136
137 .page-content {
138 padding: 30px 0;
139 background-color: #fff;
140 }
141
142
143 /* Home styles */
144 /* ----------------------------------------------------------*/
145
146 .home h1 { margin-bottom: 25px; }
147
148 .posts { list-style-type: none; }
149
150 .posts li { margin-bottom: 30px; }
151
152 .posts .post-link {
153 font-size: 24px;
154 letter-spacing: -1px;
155 line-height: 1;
156 }
157
158 .posts .post-date {
159 display: block;
160 font-size: 15px;
161 color: #818181;
162 }
163
164
165 /* Post styles */
166 /* ----------------------------------------------------------*/
167
168 .post-header { margin: 10px 0 30px; }
169
170 .post-header h1 {
171 font-size: 42px;
172 letter-spacing: -1.75px;
173 line-height: 1;
174 font-weight: 300;
175 }
176
177 .post-header .meta {
178 font-size: 15px;
179 color: #818181;
180 margin-top: 5px;
181 }
182
183 .post-content { margin: 0 0 30px; }
184
185 .post-content > * { margin: 20px 0; }
186
187
188 .post-content h1,
189 .post-content h2,
190 .post-content h3,
191 .post-content h4,
192 .post-content h5,
193 .post-content h6 {
194 line-height: 1;
195 font-weight: 300;
196 margin: 40px 0 20px;
197 }
198
199 .post-content h2 {
200 font-size: 32px;
201 letter-spacing: -1.25px;
202 }
203
204 .post-content h3 {
205 font-size: 26px;
206 letter-spacing: -1px;
207 }
208
209 .post-content h4 {
210 font-size: 20px;
211 letter-spacing: -1px;
212 }
213
214 .post-content blockquote {
215 border-left: 4px solid #e8e8e8;
216 padding-left: 20px;
217 font-size: 18px;
218 opacity: .6;
219 letter-spacing: -1px;
220 font-style: italic;
221 margin: 30px 0;
222 }
223
224 .post-content ul,
225 .post-content ol { padding-left: 20px; }
226
227 .post pre,
228 .post code {
229 border: 1px solid #d5d5e9;
230 background-color: #eef;
231 padding: 8px 12px;
232 -webkit-border-radius: 3px;
233 -moz-border-radius: 3px;
234 border-radius: 3px;
235 font-size: 15px;
236 overflow:scroll;
237 }
238
239 .post code { padding: 1px 5px; }
240
241 .post ul,
242 .post ol { margin-left: 1.35em; }
243
244 .post pre code {
120245 border: 0;
121 }
122
123 /*****************************************************************************/
124 /*
125 /* Posts
126 /*
127 /*****************************************************************************/
128
129 /* standard */
130 .post pre {
131 border: 1px solid #ddd;
132 background-color: #eef;
133 padding: 0 .4em;
134 }
135
136 .post ul, .post ol {
137 margin-left: 1.35em;
138 }
139
140 .post code {
141 border: 1px solid #ddd;
142 background-color: #eef;
143 padding: 0 .2em;
144 }
145
146 .post pre code {
147 border: none;
246 padding-right: 0;
247 padding-left: 0;
148248 }
149249
150250 /* terminal */
152252 border: 1px solid #000;
153253 background-color: #333;
154254 color: #FFF;
155 }
156
157 .post pre.terminal code {
158 background-color: #333;
159 }
255 -webkit-border-radius: 3px;
256 -moz-border-radius: 3px;
257 border-radius: 3px;
258 }
259
260 .post pre.terminal code { background-color: #333; }
261
262 /* Syntax highlighting styles */
263 /* ----------------------------------------------------------*/
264
265 .highlight { background: #ffffff; }
266 .highlight .c { color: #999988; font-style: italic } /* Comment */
267 .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
268 .highlight .k { font-weight: bold } /* Keyword */
269 .highlight .o { font-weight: bold } /* Operator */
270 .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
271 .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
272 .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
273 .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
274 .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
275 .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
276 .highlight .ge { font-style: italic } /* Generic.Emph */
277 .highlight .gr { color: #aa0000 } /* Generic.Error */
278 .highlight .gh { color: #999999 } /* Generic.Heading */
279 .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
280 .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
281 .highlight .go { color: #888888 } /* Generic.Output */
282 .highlight .gp { color: #555555 } /* Generic.Prompt */
283 .highlight .gs { font-weight: bold } /* Generic.Strong */
284 .highlight .gu { color: #aaaaaa } /* Generic.Subheading */
285 .highlight .gt { color: #aa0000 } /* Generic.Traceback */
286 .highlight .kc { font-weight: bold } /* Keyword.Constant */
287 .highlight .kd { font-weight: bold } /* Keyword.Declaration */
288 .highlight .kp { font-weight: bold } /* Keyword.Pseudo */
289 .highlight .kr { font-weight: bold } /* Keyword.Reserved */
290 .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
291 .highlight .m { color: #009999 } /* Literal.Number */
292 .highlight .s { color: #d14 } /* Literal.String */
293 .highlight .na { color: #008080 } /* Name.Attribute */
294 .highlight .nb { color: #0086B3 } /* Name.Builtin */
295 .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
296 .highlight .no { color: #008080 } /* Name.Constant */
297 .highlight .ni { color: #800080 } /* Name.Entity */
298 .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
299 .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
300 .highlight .nn { color: #555555 } /* Name.Namespace */
301 .highlight .nt { color: #000080 } /* Name.Tag */
302 .highlight .nv { color: #008080 } /* Name.Variable */
303 .highlight .ow { font-weight: bold } /* Operator.Word */
304 .highlight .w { color: #bbbbbb } /* Text.Whitespace */
305 .highlight .mf { color: #009999 } /* Literal.Number.Float */
306 .highlight .mh { color: #009999 } /* Literal.Number.Hex */
307 .highlight .mi { color: #009999 } /* Literal.Number.Integer */
308 .highlight .mo { color: #009999 } /* Literal.Number.Oct */
309 .highlight .sb { color: #d14 } /* Literal.String.Backtick */
310 .highlight .sc { color: #d14 } /* Literal.String.Char */
311 .highlight .sd { color: #d14 } /* Literal.String.Doc */
312 .highlight .s2 { color: #d14 } /* Literal.String.Double */
313 .highlight .se { color: #d14 } /* Literal.String.Escape */
314 .highlight .sh { color: #d14 } /* Literal.String.Heredoc */
315 .highlight .si { color: #d14 } /* Literal.String.Interpol */
316 .highlight .sx { color: #d14 } /* Literal.String.Other */
317 .highlight .sr { color: #009926 } /* Literal.String.Regex */
318 .highlight .s1 { color: #d14 } /* Literal.String.Single */
319 .highlight .ss { color: #990073 } /* Literal.String.Symbol */
320 .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
321 .highlight .vc { color: #008080 } /* Name.Variable.Class */
322 .highlight .vg { color: #008080 } /* Name.Variable.Global */
323 .highlight .vi { color: #008080 } /* Name.Variable.Instance */
324 .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
325
326
327 /* media queries */
328 /* ----------------------------------------------------------*/
329
330
331 @media screen and (max-width: 750px) {
332
333 .footer-col-1 { width: 50%; }
334
335 .footer-col-2 {
336 width: 45%; /*fallback*/
337 width: -webkit-calc(50% - 10px);
338 width: -moz-calc(50% - 10px);
339 width: -o-calc(50% - 10px);
340 width: calc(50% - 10px);
341 margin-right: 0;
342 }
343
344 .site-footer .column.footer-col-3 {
345 width: auto;
346 float: none;
347 clear: both;
348 }
349
350 }
351
352 @media screen and (max-width: 600px) {
353
354 .wrap { padding: 0 12px; }
355
356 .site-nav {
357 position: fixed;
358 z-index: 10;
359 top: 14px; right: 8px;
360 background-color: white;
361 -webkit-border-radius: 5px;
362 -moz-border-radius: 5px;
363 border-radius: 5px;
364 border: 1px solid #e8e8e8;
365 }
366
367 .site-nav .menu-icon {
368 display: block;
369 font-size: 24px;
370 color: #505050;
371 float: right;
372 width: 36px;
373 text-align: center;
374 line-height: 36px;
375 }
376
377 .site-nav .menu-icon svg { width: 18px; height: 16px; }
378
379 .site-nav .trigger {
380 clear: both;
381 margin-bottom: 5px;
382 display: none;
383 }
384
385 .site-nav:hover .trigger { display: block; }
386
387 .site-nav .page-link {
388 display: block;
389 text-align: right;
390 line-height: 1.25;
391 padding: 5px 10px;
392 margin: 0;
393 }
394
395 .post-header h1 { font-size: 36px; }
396 .post-content h2 { font-size: 28px; }
397 .post-content h3 { font-size: 22px; }
398 .post-content h4 { font-size: 18px; }
399 .post-content blockquote { padding-left: 10px; }
400 .post-content ul,
401 .post-content ol { padding-left: 10px; }
402
403 .site-footer .column {
404 float: none;
405 clear: both;
406 width: auto;
407 margin: 0 0 15px; }
408
409 }
+0
-60
lib/site_template/css/syntax.css less more
0 .highlight { background: #ffffff; }
1 .highlight .c { color: #999988; font-style: italic } /* Comment */
2 .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
3 .highlight .k { font-weight: bold } /* Keyword */
4 .highlight .o { font-weight: bold } /* Operator */
5 .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
6 .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
7 .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
8 .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
9 .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
10 .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
11 .highlight .ge { font-style: italic } /* Generic.Emph */
12 .highlight .gr { color: #aa0000 } /* Generic.Error */
13 .highlight .gh { color: #999999 } /* Generic.Heading */
14 .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
15 .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
16 .highlight .go { color: #888888 } /* Generic.Output */
17 .highlight .gp { color: #555555 } /* Generic.Prompt */
18 .highlight .gs { font-weight: bold } /* Generic.Strong */
19 .highlight .gu { color: #aaaaaa } /* Generic.Subheading */
20 .highlight .gt { color: #aa0000 } /* Generic.Traceback */
21 .highlight .kc { font-weight: bold } /* Keyword.Constant */
22 .highlight .kd { font-weight: bold } /* Keyword.Declaration */
23 .highlight .kp { font-weight: bold } /* Keyword.Pseudo */
24 .highlight .kr { font-weight: bold } /* Keyword.Reserved */
25 .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
26 .highlight .m { color: #009999 } /* Literal.Number */
27 .highlight .s { color: #d14 } /* Literal.String */
28 .highlight .na { color: #008080 } /* Name.Attribute */
29 .highlight .nb { color: #0086B3 } /* Name.Builtin */
30 .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
31 .highlight .no { color: #008080 } /* Name.Constant */
32 .highlight .ni { color: #800080 } /* Name.Entity */
33 .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
34 .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
35 .highlight .nn { color: #555555 } /* Name.Namespace */
36 .highlight .nt { color: #000080 } /* Name.Tag */
37 .highlight .nv { color: #008080 } /* Name.Variable */
38 .highlight .ow { font-weight: bold } /* Operator.Word */
39 .highlight .w { color: #bbbbbb } /* Text.Whitespace */
40 .highlight .mf { color: #009999 } /* Literal.Number.Float */
41 .highlight .mh { color: #009999 } /* Literal.Number.Hex */
42 .highlight .mi { color: #009999 } /* Literal.Number.Integer */
43 .highlight .mo { color: #009999 } /* Literal.Number.Oct */
44 .highlight .sb { color: #d14 } /* Literal.String.Backtick */
45 .highlight .sc { color: #d14 } /* Literal.String.Char */
46 .highlight .sd { color: #d14 } /* Literal.String.Doc */
47 .highlight .s2 { color: #d14 } /* Literal.String.Double */
48 .highlight .se { color: #d14 } /* Literal.String.Escape */
49 .highlight .sh { color: #d14 } /* Literal.String.Heredoc */
50 .highlight .si { color: #d14 } /* Literal.String.Interpol */
51 .highlight .sx { color: #d14 } /* Literal.String.Other */
52 .highlight .sr { color: #009926 } /* Literal.String.Regex */
53 .highlight .s1 { color: #d14 } /* Literal.String.Single */
54 .highlight .ss { color: #990073 } /* Literal.String.Symbol */
55 .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
56 .highlight .vc { color: #008080 } /* Name.Variable.Class */
57 .highlight .vg { color: #008080 } /* Name.Variable.Global */
58 .highlight .vi { color: #008080 } /* Name.Variable.Instance */
59 .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
0 ---
1 layout: none
2 ---
3 <?xml version="1.0" encoding="UTF-8"?>
4 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
5 <channel>
6 <title>{{ site.title | xml_escape }}</title>
7 <description>{{ site.description | xml_escape }}</description>
8 <link>{{ site.url }}{{ site.baseurl }}/</link>
9 <atom:link href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" rel="self" type="application/rss+xml" />
10 <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
11 <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
12 <generator>Jekyll v{{ jekyll.version }}</generator>
13 {% for post in site.posts limit:10 %}
14 <item>
15 <title>{{ post.title | xml_escape }}</title>
16 <description>{{ post.content | xml_escape }}</description>
17 <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
18 <link>{{ post.url | prepend: site.baseurl | prepend: site.url }}</link>
19 <guid isPermaLink="true">{{ post.url | prepend: site.baseurl | prepend: site.url }}</guid>
20 {% for tag in post.tags %}
21 <category>{{ tag | xml_escape }}</category>
22 {% endfor %}
23 {% for cat in post.categories %}
24 <category>{{ cat | xml_escape }}</category>
25 {% endfor %}
26 </item>
27 {% endfor %}
28 </channel>
29 </rss>
00 ---
11 layout: default
2 title: Your New Jekyll Site
32 ---
43
5 <div id="home">
6 <h1>Blog Posts</h1>
4 <div class="home">
5
6 <h1>Posts</h1>
7
78 <ul class="posts">
89 {% for post in site.posts %}
9 <li><span>{{ post.date | date_to_string }}</span> &raquo; <a href="{{ post.url }}">{{ post.title }}</a></li>
10 <li>
11 <span class="post-date">{{ post.date | date: "%b %-d, %Y" }}</span>
12 <a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
13 </li>
1014 {% endfor %}
1115 </ul>
12 </div>
16
17 <p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | prepend: site.baseurl }}">via RSS</a></p>
18
19 </div>
00 --- !ruby/object:Gem::Specification
11 name: jekyll
22 version: !ruby/object:Gem::Version
3 version: 1.5.1
3 version: 2.2.0
44 platform: ruby
55 authors:
66 - Tom Preston-Werner
77 autorequire:
88 bindir: bin
99 cert_chain: []
10 date: 2014-03-28 00:00:00.000000000 Z
10 date: 2014-07-29 00:00:00.000000000 Z
1111 dependencies:
1212 - !ruby/object:Gem::Dependency
1313 name: liquid
1515 requirements:
1616 - - "~>"
1717 - !ruby/object:Gem::Version
18 version: 2.5.5
19 type: :runtime
20 prerelease: false
21 version_requirements: !ruby/object:Gem::Requirement
22 requirements:
23 - - "~>"
24 - !ruby/object:Gem::Version
25 version: 2.5.5
18 version: 2.6.1
19 type: :runtime
20 prerelease: false
21 version_requirements: !ruby/object:Gem::Requirement
22 requirements:
23 - - "~>"
24 - !ruby/object:Gem::Version
25 version: 2.6.1
26 - !ruby/object:Gem::Dependency
27 name: kramdown
28 requirement: !ruby/object:Gem::Requirement
29 requirements:
30 - - "~>"
31 - !ruby/object:Gem::Version
32 version: '1.3'
33 type: :runtime
34 prerelease: false
35 version_requirements: !ruby/object:Gem::Requirement
36 requirements:
37 - - "~>"
38 - !ruby/object:Gem::Version
39 version: '1.3'
40 - !ruby/object:Gem::Dependency
41 name: mercenary
42 requirement: !ruby/object:Gem::Requirement
43 requirements:
44 - - "~>"
45 - !ruby/object:Gem::Version
46 version: 0.3.3
47 type: :runtime
48 prerelease: false
49 version_requirements: !ruby/object:Gem::Requirement
50 requirements:
51 - - "~>"
52 - !ruby/object:Gem::Version
53 version: 0.3.3
54 - !ruby/object:Gem::Dependency
55 name: safe_yaml
56 requirement: !ruby/object:Gem::Requirement
57 requirements:
58 - - "~>"
59 - !ruby/object:Gem::Version
60 version: '1.0'
61 type: :runtime
62 prerelease: false
63 version_requirements: !ruby/object:Gem::Requirement
64 requirements:
65 - - "~>"
66 - !ruby/object:Gem::Version
67 version: '1.0'
68 - !ruby/object:Gem::Dependency
69 name: colorator
70 requirement: !ruby/object:Gem::Requirement
71 requirements:
72 - - "~>"
73 - !ruby/object:Gem::Version
74 version: '0.1'
75 type: :runtime
76 prerelease: false
77 version_requirements: !ruby/object:Gem::Requirement
78 requirements:
79 - - "~>"
80 - !ruby/object:Gem::Version
81 version: '0.1'
2682 - !ruby/object:Gem::Dependency
2783 name: classifier
2884 requirement: !ruby/object:Gem::Requirement
3894 - !ruby/object:Gem::Version
3995 version: '1.3'
4096 - !ruby/object:Gem::Dependency
41 name: listen
97 name: pygments.rb
98 requirement: !ruby/object:Gem::Requirement
99 requirements:
100 - - "~>"
101 - !ruby/object:Gem::Version
102 version: 0.6.0
103 type: :runtime
104 prerelease: false
105 version_requirements: !ruby/object:Gem::Requirement
106 requirements:
107 - - "~>"
108 - !ruby/object:Gem::Version
109 version: 0.6.0
110 - !ruby/object:Gem::Dependency
111 name: redcarpet
112 requirement: !ruby/object:Gem::Requirement
113 requirements:
114 - - "~>"
115 - !ruby/object:Gem::Version
116 version: '3.1'
117 type: :runtime
118 prerelease: false
119 version_requirements: !ruby/object:Gem::Requirement
120 requirements:
121 - - "~>"
122 - !ruby/object:Gem::Version
123 version: '3.1'
124 - !ruby/object:Gem::Dependency
125 name: toml
126 requirement: !ruby/object:Gem::Requirement
127 requirements:
128 - - "~>"
129 - !ruby/object:Gem::Version
130 version: 0.1.0
131 type: :runtime
132 prerelease: false
133 version_requirements: !ruby/object:Gem::Requirement
134 requirements:
135 - - "~>"
136 - !ruby/object:Gem::Version
137 version: 0.1.0
138 - !ruby/object:Gem::Dependency
139 name: jekyll-paginate
140 requirement: !ruby/object:Gem::Requirement
141 requirements:
142 - - "~>"
143 - !ruby/object:Gem::Version
144 version: '1.0'
145 type: :runtime
146 prerelease: false
147 version_requirements: !ruby/object:Gem::Requirement
148 requirements:
149 - - "~>"
150 - !ruby/object:Gem::Version
151 version: '1.0'
152 - !ruby/object:Gem::Dependency
153 name: jekyll-gist
154 requirement: !ruby/object:Gem::Requirement
155 requirements:
156 - - "~>"
157 - !ruby/object:Gem::Version
158 version: '1.0'
159 type: :runtime
160 prerelease: false
161 version_requirements: !ruby/object:Gem::Requirement
162 requirements:
163 - - "~>"
164 - !ruby/object:Gem::Version
165 version: '1.0'
166 - !ruby/object:Gem::Dependency
167 name: jekyll-coffeescript
168 requirement: !ruby/object:Gem::Requirement
169 requirements:
170 - - "~>"
171 - !ruby/object:Gem::Version
172 version: '1.0'
173 type: :runtime
174 prerelease: false
175 version_requirements: !ruby/object:Gem::Requirement
176 requirements:
177 - - "~>"
178 - !ruby/object:Gem::Version
179 version: '1.0'
180 - !ruby/object:Gem::Dependency
181 name: jekyll-sass-converter
182 requirement: !ruby/object:Gem::Requirement
183 requirements:
184 - - "~>"
185 - !ruby/object:Gem::Version
186 version: '1.0'
187 type: :runtime
188 prerelease: false
189 version_requirements: !ruby/object:Gem::Requirement
190 requirements:
191 - - "~>"
192 - !ruby/object:Gem::Version
193 version: '1.0'
194 - !ruby/object:Gem::Dependency
195 name: jekyll-watch
196 requirement: !ruby/object:Gem::Requirement
197 requirements:
198 - - "~>"
199 - !ruby/object:Gem::Version
200 version: '1.0'
201 type: :runtime
202 prerelease: false
203 version_requirements: !ruby/object:Gem::Requirement
204 requirements:
205 - - "~>"
206 - !ruby/object:Gem::Version
207 version: '1.0'
208 - !ruby/object:Gem::Dependency
209 name: rake
210 requirement: !ruby/object:Gem::Requirement
211 requirements:
212 - - "~>"
213 - !ruby/object:Gem::Version
214 version: '10.1'
215 type: :development
216 prerelease: false
217 version_requirements: !ruby/object:Gem::Requirement
218 requirements:
219 - - "~>"
220 - !ruby/object:Gem::Version
221 version: '10.1'
222 - !ruby/object:Gem::Dependency
223 name: rdoc
224 requirement: !ruby/object:Gem::Requirement
225 requirements:
226 - - "~>"
227 - !ruby/object:Gem::Version
228 version: '3.11'
229 type: :development
230 prerelease: false
231 version_requirements: !ruby/object:Gem::Requirement
232 requirements:
233 - - "~>"
234 - !ruby/object:Gem::Version
235 version: '3.11'
236 - !ruby/object:Gem::Dependency
237 name: redgreen
238 requirement: !ruby/object:Gem::Requirement
239 requirements:
240 - - "~>"
241 - !ruby/object:Gem::Version
242 version: '1.2'
243 type: :development
244 prerelease: false
245 version_requirements: !ruby/object:Gem::Requirement
246 requirements:
247 - - "~>"
248 - !ruby/object:Gem::Version
249 version: '1.2'
250 - !ruby/object:Gem::Dependency
251 name: shoulda
252 requirement: !ruby/object:Gem::Requirement
253 requirements:
254 - - "~>"
255 - !ruby/object:Gem::Version
256 version: '3.5'
257 type: :development
258 prerelease: false
259 version_requirements: !ruby/object:Gem::Requirement
260 requirements:
261 - - "~>"
262 - !ruby/object:Gem::Version
263 version: '3.5'
264 - !ruby/object:Gem::Dependency
265 name: rr
266 requirement: !ruby/object:Gem::Requirement
267 requirements:
268 - - "~>"
269 - !ruby/object:Gem::Version
270 version: '1.1'
271 type: :development
272 prerelease: false
273 version_requirements: !ruby/object:Gem::Requirement
274 requirements:
275 - - "~>"
276 - !ruby/object:Gem::Version
277 version: '1.1'
278 - !ruby/object:Gem::Dependency
279 name: cucumber
280 requirement: !ruby/object:Gem::Requirement
281 requirements:
282 - - '='
283 - !ruby/object:Gem::Version
284 version: 1.3.11
285 type: :development
286 prerelease: false
287 version_requirements: !ruby/object:Gem::Requirement
288 requirements:
289 - - '='
290 - !ruby/object:Gem::Version
291 version: 1.3.11
292 - !ruby/object:Gem::Dependency
293 name: RedCloth
294 requirement: !ruby/object:Gem::Requirement
295 requirements:
296 - - "~>"
297 - !ruby/object:Gem::Version
298 version: '4.2'
299 type: :development
300 prerelease: false
301 version_requirements: !ruby/object:Gem::Requirement
302 requirements:
303 - - "~>"
304 - !ruby/object:Gem::Version
305 version: '4.2'
306 - !ruby/object:Gem::Dependency
307 name: maruku
308 requirement: !ruby/object:Gem::Requirement
309 requirements:
310 - - "~>"
311 - !ruby/object:Gem::Version
312 version: 0.7.0
313 type: :development
314 prerelease: false
315 version_requirements: !ruby/object:Gem::Requirement
316 requirements:
317 - - "~>"
318 - !ruby/object:Gem::Version
319 version: 0.7.0
320 - !ruby/object:Gem::Dependency
321 name: rdiscount
322 requirement: !ruby/object:Gem::Requirement
323 requirements:
324 - - "~>"
325 - !ruby/object:Gem::Version
326 version: '1.6'
327 type: :development
328 prerelease: false
329 version_requirements: !ruby/object:Gem::Requirement
330 requirements:
331 - - "~>"
332 - !ruby/object:Gem::Version
333 version: '1.6'
334 - !ruby/object:Gem::Dependency
335 name: launchy
336 requirement: !ruby/object:Gem::Requirement
337 requirements:
338 - - "~>"
339 - !ruby/object:Gem::Version
340 version: '2.3'
341 type: :development
342 prerelease: false
343 version_requirements: !ruby/object:Gem::Requirement
344 requirements:
345 - - "~>"
346 - !ruby/object:Gem::Version
347 version: '2.3'
348 - !ruby/object:Gem::Dependency
349 name: simplecov
350 requirement: !ruby/object:Gem::Requirement
351 requirements:
352 - - "~>"
353 - !ruby/object:Gem::Version
354 version: '0.7'
355 type: :development
356 prerelease: false
357 version_requirements: !ruby/object:Gem::Requirement
358 requirements:
359 - - "~>"
360 - !ruby/object:Gem::Version
361 version: '0.7'
362 - !ruby/object:Gem::Dependency
363 name: simplecov-gem-adapter
364 requirement: !ruby/object:Gem::Requirement
365 requirements:
366 - - "~>"
367 - !ruby/object:Gem::Version
368 version: 1.0.1
369 type: :development
370 prerelease: false
371 version_requirements: !ruby/object:Gem::Requirement
372 requirements:
373 - - "~>"
374 - !ruby/object:Gem::Version
375 version: 1.0.1
376 - !ruby/object:Gem::Dependency
377 name: mime-types
378 requirement: !ruby/object:Gem::Requirement
379 requirements:
380 - - "~>"
381 - !ruby/object:Gem::Version
382 version: '1.5'
383 type: :development
384 prerelease: false
385 version_requirements: !ruby/object:Gem::Requirement
386 requirements:
387 - - "~>"
388 - !ruby/object:Gem::Version
389 version: '1.5'
390 - !ruby/object:Gem::Dependency
391 name: activesupport
392 requirement: !ruby/object:Gem::Requirement
393 requirements:
394 - - "~>"
395 - !ruby/object:Gem::Version
396 version: 3.2.13
397 type: :development
398 prerelease: false
399 version_requirements: !ruby/object:Gem::Requirement
400 requirements:
401 - - "~>"
402 - !ruby/object:Gem::Version
403 version: 3.2.13
404 - !ruby/object:Gem::Dependency
405 name: jekyll_test_plugin
406 requirement: !ruby/object:Gem::Requirement
407 requirements:
408 - - ">="
409 - !ruby/object:Gem::Version
410 version: '0'
411 type: :development
412 prerelease: false
413 version_requirements: !ruby/object:Gem::Requirement
414 requirements:
415 - - ">="
416 - !ruby/object:Gem::Version
417 version: '0'
418 - !ruby/object:Gem::Dependency
419 name: jekyll_test_plugin_malicious
420 requirement: !ruby/object:Gem::Requirement
421 requirements:
422 - - ">="
423 - !ruby/object:Gem::Version
424 version: '0'
425 type: :development
426 prerelease: false
427 version_requirements: !ruby/object:Gem::Requirement
428 requirements:
429 - - ">="
430 - !ruby/object:Gem::Version
431 version: '0'
432 - !ruby/object:Gem::Dependency
433 name: rouge
42434 requirement: !ruby/object:Gem::Requirement
43435 requirements:
44436 - - "~>"
45437 - !ruby/object:Gem::Version
46438 version: '1.3'
47 type: :runtime
439 type: :development
48440 prerelease: false
49441 version_requirements: !ruby/object:Gem::Requirement
50442 requirements:
51443 - - "~>"
52444 - !ruby/object:Gem::Version
53445 version: '1.3'
54 - !ruby/object:Gem::Dependency
55 name: maruku
56 requirement: !ruby/object:Gem::Requirement
57 requirements:
58 - - '='
59 - !ruby/object:Gem::Version
60 version: 0.7.0
61 type: :runtime
62 prerelease: false
63 version_requirements: !ruby/object:Gem::Requirement
64 requirements:
65 - - '='
66 - !ruby/object:Gem::Version
67 version: 0.7.0
68 - !ruby/object:Gem::Dependency
69 name: pygments.rb
70 requirement: !ruby/object:Gem::Requirement
71 requirements:
72 - - "~>"
73 - !ruby/object:Gem::Version
74 version: 0.5.0
75 type: :runtime
76 prerelease: false
77 version_requirements: !ruby/object:Gem::Requirement
78 requirements:
79 - - "~>"
80 - !ruby/object:Gem::Version
81 version: 0.5.0
82 - !ruby/object:Gem::Dependency
83 name: commander
84 requirement: !ruby/object:Gem::Requirement
85 requirements:
86 - - "~>"
87 - !ruby/object:Gem::Version
88 version: 4.1.3
89 type: :runtime
90 prerelease: false
91 version_requirements: !ruby/object:Gem::Requirement
92 requirements:
93 - - "~>"
94 - !ruby/object:Gem::Version
95 version: 4.1.3
96 - !ruby/object:Gem::Dependency
97 name: safe_yaml
98 requirement: !ruby/object:Gem::Requirement
99 requirements:
100 - - "~>"
101 - !ruby/object:Gem::Version
102 version: '1.0'
103 type: :runtime
104 prerelease: false
105 version_requirements: !ruby/object:Gem::Requirement
106 requirements:
107 - - "~>"
108 - !ruby/object:Gem::Version
109 version: '1.0'
110 - !ruby/object:Gem::Dependency
111 name: colorator
112 requirement: !ruby/object:Gem::Requirement
113 requirements:
114 - - "~>"
115 - !ruby/object:Gem::Version
116 version: '0.1'
117 type: :runtime
118 prerelease: false
119 version_requirements: !ruby/object:Gem::Requirement
120 requirements:
121 - - "~>"
122 - !ruby/object:Gem::Version
123 version: '0.1'
124 - !ruby/object:Gem::Dependency
125 name: redcarpet
126 requirement: !ruby/object:Gem::Requirement
127 requirements:
128 - - "~>"
129 - !ruby/object:Gem::Version
130 version: 2.3.0
131 type: :runtime
132 prerelease: false
133 version_requirements: !ruby/object:Gem::Requirement
134 requirements:
135 - - "~>"
136 - !ruby/object:Gem::Version
137 version: 2.3.0
138 - !ruby/object:Gem::Dependency
139 name: toml
140 requirement: !ruby/object:Gem::Requirement
141 requirements:
142 - - "~>"
143 - !ruby/object:Gem::Version
144 version: 0.1.0
145 type: :runtime
146 prerelease: false
147 version_requirements: !ruby/object:Gem::Requirement
148 requirements:
149 - - "~>"
150 - !ruby/object:Gem::Version
151 version: 0.1.0
152 - !ruby/object:Gem::Dependency
153 name: rake
154 requirement: !ruby/object:Gem::Requirement
155 requirements:
156 - - "~>"
157 - !ruby/object:Gem::Version
158 version: '10.1'
159 type: :development
160 prerelease: false
161 version_requirements: !ruby/object:Gem::Requirement
162 requirements:
163 - - "~>"
164 - !ruby/object:Gem::Version
165 version: '10.1'
166 - !ruby/object:Gem::Dependency
167 name: rdoc
168 requirement: !ruby/object:Gem::Requirement
169 requirements:
170 - - "~>"
171 - !ruby/object:Gem::Version
172 version: '3.11'
173 type: :development
174 prerelease: false
175 version_requirements: !ruby/object:Gem::Requirement
176 requirements:
177 - - "~>"
178 - !ruby/object:Gem::Version
179 version: '3.11'
180 - !ruby/object:Gem::Dependency
181 name: redgreen
182 requirement: !ruby/object:Gem::Requirement
183 requirements:
184 - - "~>"
185 - !ruby/object:Gem::Version
186 version: '1.2'
187 type: :development
188 prerelease: false
189 version_requirements: !ruby/object:Gem::Requirement
190 requirements:
191 - - "~>"
192 - !ruby/object:Gem::Version
193 version: '1.2'
194 - !ruby/object:Gem::Dependency
195 name: shoulda
196 requirement: !ruby/object:Gem::Requirement
197 requirements:
198 - - "~>"
199 - !ruby/object:Gem::Version
200 version: 3.3.2
201 type: :development
202 prerelease: false
203 version_requirements: !ruby/object:Gem::Requirement
204 requirements:
205 - - "~>"
206 - !ruby/object:Gem::Version
207 version: 3.3.2
208 - !ruby/object:Gem::Dependency
209 name: rr
210 requirement: !ruby/object:Gem::Requirement
211 requirements:
212 - - "~>"
213 - !ruby/object:Gem::Version
214 version: '1.1'
215 type: :development
216 prerelease: false
217 version_requirements: !ruby/object:Gem::Requirement
218 requirements:
219 - - "~>"
220 - !ruby/object:Gem::Version
221 version: '1.1'
222 - !ruby/object:Gem::Dependency
223 name: cucumber
224 requirement: !ruby/object:Gem::Requirement
225 requirements:
226 - - '='
227 - !ruby/object:Gem::Version
228 version: 1.3.11
229 type: :development
230 prerelease: false
231 version_requirements: !ruby/object:Gem::Requirement
232 requirements:
233 - - '='
234 - !ruby/object:Gem::Version
235 version: 1.3.11
236 - !ruby/object:Gem::Dependency
237 name: RedCloth
238 requirement: !ruby/object:Gem::Requirement
239 requirements:
240 - - "~>"
241 - !ruby/object:Gem::Version
242 version: '4.2'
243 type: :development
244 prerelease: false
245 version_requirements: !ruby/object:Gem::Requirement
246 requirements:
247 - - "~>"
248 - !ruby/object:Gem::Version
249 version: '4.2'
250 - !ruby/object:Gem::Dependency
251 name: kramdown
252 requirement: !ruby/object:Gem::Requirement
253 requirements:
254 - - "~>"
255 - !ruby/object:Gem::Version
256 version: '1.2'
257 type: :development
258 prerelease: false
259 version_requirements: !ruby/object:Gem::Requirement
260 requirements:
261 - - "~>"
262 - !ruby/object:Gem::Version
263 version: '1.2'
264 - !ruby/object:Gem::Dependency
265 name: rdiscount
266 requirement: !ruby/object:Gem::Requirement
267 requirements:
268 - - "~>"
269 - !ruby/object:Gem::Version
270 version: '1.6'
271 type: :development
272 prerelease: false
273 version_requirements: !ruby/object:Gem::Requirement
274 requirements:
275 - - "~>"
276 - !ruby/object:Gem::Version
277 version: '1.6'
278 - !ruby/object:Gem::Dependency
279 name: launchy
280 requirement: !ruby/object:Gem::Requirement
281 requirements:
282 - - "~>"
283 - !ruby/object:Gem::Version
284 version: '2.3'
285 type: :development
286 prerelease: false
287 version_requirements: !ruby/object:Gem::Requirement
288 requirements:
289 - - "~>"
290 - !ruby/object:Gem::Version
291 version: '2.3'
292 - !ruby/object:Gem::Dependency
293 name: simplecov
294 requirement: !ruby/object:Gem::Requirement
295 requirements:
296 - - "~>"
297 - !ruby/object:Gem::Version
298 version: '0.7'
299 type: :development
300 prerelease: false
301 version_requirements: !ruby/object:Gem::Requirement
302 requirements:
303 - - "~>"
304 - !ruby/object:Gem::Version
305 version: '0.7'
306 - !ruby/object:Gem::Dependency
307 name: simplecov-gem-adapter
308 requirement: !ruby/object:Gem::Requirement
309 requirements:
310 - - "~>"
311 - !ruby/object:Gem::Version
312 version: 1.0.1
313 type: :development
314 prerelease: false
315 version_requirements: !ruby/object:Gem::Requirement
316 requirements:
317 - - "~>"
318 - !ruby/object:Gem::Version
319 version: 1.0.1
320 - !ruby/object:Gem::Dependency
321 name: coveralls
322 requirement: !ruby/object:Gem::Requirement
323 requirements:
324 - - "~>"
325 - !ruby/object:Gem::Version
326 version: 0.7.0
327 type: :development
328 prerelease: false
329 version_requirements: !ruby/object:Gem::Requirement
330 requirements:
331 - - "~>"
332 - !ruby/object:Gem::Version
333 version: 0.7.0
334 - !ruby/object:Gem::Dependency
335 name: mime-types
336 requirement: !ruby/object:Gem::Requirement
337 requirements:
338 - - "~>"
339 - !ruby/object:Gem::Version
340 version: '1.5'
341 type: :development
342 prerelease: false
343 version_requirements: !ruby/object:Gem::Requirement
344 requirements:
345 - - "~>"
346 - !ruby/object:Gem::Version
347 version: '1.5'
348 - !ruby/object:Gem::Dependency
349 name: activesupport
350 requirement: !ruby/object:Gem::Requirement
351 requirements:
352 - - "~>"
353 - !ruby/object:Gem::Version
354 version: 3.2.13
355 type: :development
356 prerelease: false
357 version_requirements: !ruby/object:Gem::Requirement
358 requirements:
359 - - "~>"
360 - !ruby/object:Gem::Version
361 version: 3.2.13
362 - !ruby/object:Gem::Dependency
363 name: jekyll_test_plugin
364 requirement: !ruby/object:Gem::Requirement
365 requirements:
366 - - ">="
367 - !ruby/object:Gem::Version
368 version: '0'
369 type: :development
370 prerelease: false
371 version_requirements: !ruby/object:Gem::Requirement
372 requirements:
373 - - ">="
374 - !ruby/object:Gem::Version
375 version: '0'
376446 description: Jekyll is a simple, blog aware, static site generator.
377447 email: tom@mojombo.com
378448 executables:
382452 - README.markdown
383453 - LICENSE
384454 files:
455 - ".gitignore"
456 - ".travis.yml"
385457 - CONTRIBUTING.markdown
386458 - Gemfile
387459 - History.markdown
390462 - Rakefile
391463 - bin/jekyll
392464 - cucumber.yml
465 - docs/jp/CONTRIBUTING.jp.markdown
466 - docs/jp/README.jp.markdown
467 - features/collections.feature
393468 - features/create_sites.feature
394469 - features/data.feature
395470 - features/drafts.feature
396471 - features/embed_filters.feature
472 - features/frontmatter_defaults.feature
397473 - features/include_tag.feature
398474 - features/markdown.feature
399475 - features/pagination.feature
400476 - features/permalinks.feature
401477 - features/post_data.feature
402478 - features/post_excerpts.feature
479 - features/rendering.feature
403480 - features/site_configuration.feature
404481 - features/site_data.feature
405482 - features/step_definitions/jekyll_steps.rb
407484 - jekyll.gemspec
408485 - lib/jekyll.rb
409486 - lib/jekyll/cleaner.rb
487 - lib/jekyll/collection.rb
410488 - lib/jekyll/command.rb
411489 - lib/jekyll/commands/build.rb
490 - lib/jekyll/commands/docs.rb
412491 - lib/jekyll/commands/doctor.rb
413492 - lib/jekyll/commands/new.rb
414493 - lib/jekyll/commands/serve.rb
422501 - lib/jekyll/converters/markdown/redcarpet_parser.rb
423502 - lib/jekyll/converters/textile.rb
424503 - lib/jekyll/convertible.rb
425 - lib/jekyll/core_ext.rb
426504 - lib/jekyll/deprecator.rb
505 - lib/jekyll/document.rb
427506 - lib/jekyll/draft.rb
428507 - lib/jekyll/entry_filter.rb
429508 - lib/jekyll/errors.rb
430509 - lib/jekyll/excerpt.rb
431510 - lib/jekyll/filters.rb
511 - lib/jekyll/frontmatter_defaults.rb
432512 - lib/jekyll/generator.rb
433 - lib/jekyll/generators/pagination.rb
434513 - lib/jekyll/layout.rb
514 - lib/jekyll/layout_reader.rb
515 - lib/jekyll/liquid_extensions.rb
516 - lib/jekyll/log_adapter.rb
435517 - lib/jekyll/mime.types
436518 - lib/jekyll/page.rb
437519 - lib/jekyll/plugin.rb
520 - lib/jekyll/plugin_manager.rb
438521 - lib/jekyll/post.rb
522 - lib/jekyll/publisher.rb
439523 - lib/jekyll/related_posts.rb
524 - lib/jekyll/renderer.rb
440525 - lib/jekyll/site.rb
441526 - lib/jekyll/static_file.rb
442527 - lib/jekyll/stevenson.rb
443 - lib/jekyll/tags/gist.rb
444528 - lib/jekyll/tags/highlight.rb
445529 - lib/jekyll/tags/include.rb
446530 - lib/jekyll/tags/post_url.rb
447531 - lib/jekyll/url.rb
532 - lib/jekyll/utils.rb
533 - lib/jekyll/version.rb
448534 - lib/site_template/.gitignore
449535 - lib/site_template/_config.yml
536 - lib/site_template/_includes/footer.html
537 - lib/site_template/_includes/head.html
538 - lib/site_template/_includes/header.html
450539 - lib/site_template/_layouts/default.html
540 - lib/site_template/_layouts/page.html
451541 - lib/site_template/_layouts/post.html
452542 - lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb
543 - lib/site_template/about.md
453544 - lib/site_template/css/main.css
454 - lib/site_template/css/syntax.css
545 - lib/site_template/feed.xml
455546 - lib/site_template/index.html
456547 - script/bootstrap
548 - script/branding
549 - script/cibuild
550 - script/console
551 - script/proof
552 - script/rebund
553 - script/test
457554 - site/.gitignore
458555 - site/CNAME
459556 - site/README
460557 - site/_config.yml
558 - site/_data/docs.yml
461559 - site/_includes/analytics.html
560 - site/_includes/anchor_links.html
561 - site/_includes/css/font-awesome.css
562 - site/_includes/css/gridism.css
563 - site/_includes/css/normalize.css
564 - site/_includes/css/pygments.css
565 - site/_includes/css/style.css
462566 - site/_includes/docs_contents.html
463567 - site/_includes/docs_contents_mobile.html
464568 - site/_includes/docs_option.html
489593 - site/_posts/2013-11-04-jekyll-1-3-0-released.markdown
490594 - site/_posts/2013-11-26-jekyll-1-3-1-released.markdown
491595 - site/_posts/2013-12-07-jekyll-1-4-0-released.markdown
596 - site/_posts/2013-12-09-jekyll-1-4-1-released.markdown
492597 - site/_posts/2013-12-16-jekyll-1-4-2-released.markdown
493598 - site/_posts/2014-01-13-jekyll-1-4-3-released.markdown
494599 - site/_posts/2014-03-24-jekyll-1-5-0-released.markdown
495600 - site/_posts/2014-03-27-jekyll-1-5-1-released.markdown
496 - site/css/gridism.css
497 - site/css/normalize.css
498 - site/css/pygments.css
499 - site/css/style.css
601 - site/_posts/2014-05-06-jekyll-turns-2-0-0.markdown
602 - site/_posts/2014-05-08-jekyll-2-0-3-released.markdown
603 - site/_posts/2014-06-04-jekyll-stickers-1-dollar-stickermule.markdown
604 - site/_posts/2014-06-28-jekyll-turns-21-i-mean-2-1-0.markdown
605 - site/_posts/2014-07-01-jekyll-2-1-1-released.markdown
606 - site/_posts/2014-07-29-jekyll-2-2-0-released.markdown
607 - site/css/screen.css
608 - site/docs/assets.md
609 - site/docs/collections.md
500610 - site/docs/configuration.md
611 - site/docs/continuous-integration.md
501612 - site/docs/contributing.md
502613 - site/docs/datafiles.md
503614 - site/docs/deployment-methods.md
505616 - site/docs/extras.md
506617 - site/docs/frontmatter.md
507618 - site/docs/github-pages.md
508 - site/docs/heroku.md
509619 - site/docs/history.md
510620 - site/docs/index.md
511621 - site/docs/installation.md
524634 - site/docs/upgrading.md
525635 - site/docs/usage.md
526636 - site/docs/variables.md
527 - site/favicon.png
637 - site/docs/windows.md
638 - site/favicon.ico
528639 - site/feed.xml
640 - site/fonts/FontAwesome.otf
641 - site/fonts/fontawesome-webfont.eot
642 - site/fonts/fontawesome-webfont.svg
643 - site/fonts/fontawesome-webfont.ttf
644 - site/fonts/fontawesome-webfont.woff
529645 - site/freenode.txt
530646 - site/img/article-footer.png
531647 - site/img/footer-arrow.png
532648 - site/img/footer-logo.png
649 - site/img/jekyll-sticker.jpg
533650 - site/img/logo-2x.png
651 - site/img/logo-rss.png
534652 - site/img/octojekyll.png
535 - site/img/tube.png
536 - site/img/tube1x.png
537653 - site/index.html
538 - site/js/modernizr-2.5.3.min.js
654 - site/js/html5shiv.min.js
655 - site/js/respond.min.js
539656 - site/news/index.html
540657 - site/news/releases/index.html
541658 - test/fixtures/broken_front_matter1.erb
544661 - test/fixtures/exploit_front_matter.erb
545662 - test/fixtures/front_matter.erb
546663 - test/helper.rb
664 - test/source/+/%# +.md
547665 - test/source/+/foo.md
548666 - test/source/.htaccess
549667 - test/source/_config.dev.toml
668 - test/source/_data/categories/dairy.yaml
550669 - test/source/_data/languages.yml
670 - test/source/_data/members.json
551671 - test/source/_data/members.yaml
552672 - test/source/_data/products.yml
673 - test/source/_drafts/draft-properties.text
674 - test/source/_includes/include.html
553675 - test/source/_includes/params.html
554676 - test/source/_includes/sig.markdown
555677 - test/source/_layouts/default.html
556678 - test/source/_layouts/post/simple.html
557679 - test/source/_layouts/simple.html
680 - test/source/_methods/_do_not_read_me.md
681 - test/source/_methods/configuration.md
682 - test/source/_methods/sanitized_path.md
683 - test/source/_methods/site/_dont_include_me_either.md
684 - test/source/_methods/site/generate.md
685 - test/source/_methods/site/initialize.md
686 - test/source/_methods/um_hi.md
558687 - test/source/_plugins/dummy.rb
559688 - test/source/_posts/2008-02-02-not-published.textile
560689 - test/source/_posts/2008-02-02-published.textile
567696 - test/source/_posts/2009-01-27-category.textile
568697 - test/source/_posts/2009-01-27-empty-categories.textile
569698 - test/source/_posts/2009-01-27-empty-category.textile
699 - test/source/_posts/2009-01-27-no-category.textile
570700 - test/source/_posts/2009-03-12-hash-#1.markdown
571701 - test/source/_posts/2009-05-18-empty-tag.textile
572702 - test/source/_posts/2009-05-18-empty-tags.textile
589719 - test/source/_posts/2013-05-10-number-category.textile
590720 - test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
591721 - test/source/_posts/2013-08-01-mkdn-extension.mkdn
722 - test/source/_posts/2013-12-17-include-variable-filters.markdown
723 - test/source/_posts/2013-12-20-properties.text
592724 - test/source/_posts/2014-01-06-permalink-traversal.md
725 - test/source/_posts/2014-03-03-yaml-with-dots.md
726 - test/source/_posts/2014-03-22-escape-+ %20[].markdown
593727 - test/source/_posts/es/2008-11-21-nested.textile
728 - test/source/_sass/_grid.scss
729 - test/source/_slides/example-slide-1.html
730 - test/source/_slides/example-slide-2.html
731 - test/source/_slides/example-slide-3.html
732 - test/source/_with.dots/all.dots/2.4.0.md
733 - test/source/_with.dots/file.with.dots.md
594734 - test/source/about.html
595735 - test/source/category/_posts/2008-9-23-categories.textile
596736 - test/source/contacts.html
597737 - test/source/contacts/bar.html
598738 - test/source/contacts/index.html
739 - test/source/css/main.scss
599740 - test/source/css/screen.css
600741 - test/source/deal.with.dots.html
742 - test/source/environment.html
601743 - test/source/exploit.md
602744 - test/source/foo/_posts/bar/2008-12-12-topical-post.textile
603745 - test/source/index.html
746 - test/source/js/coffeescript.coffee
747 - test/source/pgp.key
604748 - test/source/products.yml
749 - test/source/properties.html
605750 - test/source/sitemap.xml
751 - test/source/static_files.html
606752 - test/source/symlink-test/symlinked-file
753 - test/source/unpublished.html
607754 - test/source/win/_posts/2009-05-24-yaml-linebreak.markdown
608755 - test/source/z_category/_posts/2008-9-23-categories.textile
609756 - test/suite.rb
757 - test/test_cleaner.rb
758 - test/test_coffeescript.rb
759 - test/test_collections.rb
610760 - test/test_command.rb
611761 - test/test_configuration.rb
612762 - test/test_convertible.rb
613 - test/test_core_ext.rb
763 - test/test_document.rb
764 - test/test_draft.rb
614765 - test/test_entry_filter.rb
615766 - test/test_excerpt.rb
616767 - test/test_filters.rb
617768 - test/test_generated_site.rb
618769 - test/test_kramdown.rb
770 - test/test_layout_reader.rb
771 - test/test_liquid_extensions.rb
772 - test/test_log_adapter.rb
619773 - test/test_new_command.rb
620774 - test/test_page.rb
621 - test/test_pager.rb
622775 - test/test_path_sanitization.rb
623776 - test/test_post.rb
624777 - test/test_rdiscount.rb
625778 - test/test_redcarpet.rb
626779 - test/test_redcloth.rb
627780 - test/test_related_posts.rb
781 - test/test_sass.rb
628782 - test/test_site.rb
629783 - test/test_tags.rb
630784 - test/test_url.rb
631 homepage: http://github.com/mojombo/jekyll
785 - test/test_utils.rb
786 homepage: https://github.com/jekyll/jekyll
632787 licenses:
633788 - MIT
634789 metadata: {}
641796 requirements:
642797 - - ">="
643798 - !ruby/object:Gem::Version
644 version: '0'
799 version: 1.9.3
645800 required_rubygems_version: !ruby/object:Gem::Requirement
646801 requirements:
647802 - - ">="
648803 - !ruby/object:Gem::Version
649804 version: '0'
650805 requirements: []
651 rubyforge_project: jekyll
806 rubyforge_project:
652807 rubygems_version: 2.2.2
653808 signing_key:
654809 specification_version: 2
655810 summary: A simple, blog aware, static site generator.
656811 test_files:
812 - features/collections.feature
813 - features/create_sites.feature
814 - features/data.feature
815 - features/drafts.feature
816 - features/embed_filters.feature
817 - features/frontmatter_defaults.feature
818 - features/include_tag.feature
819 - features/markdown.feature
820 - features/pagination.feature
821 - features/permalinks.feature
822 - features/post_data.feature
823 - features/post_excerpts.feature
824 - features/rendering.feature
825 - features/site_configuration.feature
826 - features/site_data.feature
827 - features/step_definitions/jekyll_steps.rb
828 - features/support/env.rb
829 - test/fixtures/broken_front_matter1.erb
830 - test/fixtures/broken_front_matter2.erb
831 - test/fixtures/broken_front_matter3.erb
832 - test/fixtures/exploit_front_matter.erb
833 - test/fixtures/front_matter.erb
834 - test/helper.rb
835 - test/source/+/%# +.md
836 - test/source/+/foo.md
837 - test/source/.htaccess
838 - test/source/_config.dev.toml
839 - test/source/_data/categories/dairy.yaml
840 - test/source/_data/languages.yml
841 - test/source/_data/members.json
842 - test/source/_data/members.yaml
843 - test/source/_data/products.yml
844 - test/source/_drafts/draft-properties.text
845 - test/source/_includes/include.html
846 - test/source/_includes/params.html
847 - test/source/_includes/sig.markdown
848 - test/source/_layouts/default.html
849 - test/source/_layouts/post/simple.html
850 - test/source/_layouts/simple.html
851 - test/source/_methods/_do_not_read_me.md
852 - test/source/_methods/configuration.md
853 - test/source/_methods/sanitized_path.md
854 - test/source/_methods/site/_dont_include_me_either.md
855 - test/source/_methods/site/generate.md
856 - test/source/_methods/site/initialize.md
857 - test/source/_methods/um_hi.md
858 - test/source/_plugins/dummy.rb
859 - test/source/_posts/2008-02-02-not-published.textile
860 - test/source/_posts/2008-02-02-published.textile
861 - test/source/_posts/2008-10-18-foo-bar.textile
862 - test/source/_posts/2008-11-21-complex.textile
863 - test/source/_posts/2008-12-03-permalinked-post.textile
864 - test/source/_posts/2008-12-13-include.markdown
865 - test/source/_posts/2009-01-27-array-categories.textile
866 - test/source/_posts/2009-01-27-categories.textile
867 - test/source/_posts/2009-01-27-category.textile
868 - test/source/_posts/2009-01-27-empty-categories.textile
869 - test/source/_posts/2009-01-27-empty-category.textile
870 - test/source/_posts/2009-01-27-no-category.textile
871 - test/source/_posts/2009-03-12-hash-#1.markdown
872 - test/source/_posts/2009-05-18-empty-tag.textile
873 - test/source/_posts/2009-05-18-empty-tags.textile
874 - test/source/_posts/2009-05-18-tag.textile
875 - test/source/_posts/2009-05-18-tags.textile
876 - test/source/_posts/2009-06-22-empty-yaml.textile
877 - test/source/_posts/2009-06-22-no-yaml.textile
878 - test/source/_posts/2010-01-08-triple-dash.markdown
879 - test/source/_posts/2010-01-09-date-override.textile
880 - test/source/_posts/2010-01-09-time-override.textile
881 - test/source/_posts/2010-01-09-timezone-override.textile
882 - test/source/_posts/2010-01-16-override-data.textile
883 - test/source/_posts/2011-04-12-md-extension.md
884 - test/source/_posts/2011-04-12-text-extension.text
885 - test/source/_posts/2013-01-02-post-excerpt.markdown
886 - test/source/_posts/2013-01-12-nil-layout.textile
887 - test/source/_posts/2013-01-12-no-layout.textile
888 - test/source/_posts/2013-03-19-not-a-post.markdown/.gitkeep
889 - test/source/_posts/2013-04-11-custom-excerpt.markdown
890 - test/source/_posts/2013-05-10-number-category.textile
891 - test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown
892 - test/source/_posts/2013-08-01-mkdn-extension.mkdn
893 - test/source/_posts/2013-12-17-include-variable-filters.markdown
894 - test/source/_posts/2013-12-20-properties.text
895 - test/source/_posts/2014-01-06-permalink-traversal.md
896 - test/source/_posts/2014-03-03-yaml-with-dots.md
897 - test/source/_posts/2014-03-22-escape-+ %20[].markdown
898 - test/source/_posts/es/2008-11-21-nested.textile
899 - test/source/_sass/_grid.scss
900 - test/source/_slides/example-slide-1.html
901 - test/source/_slides/example-slide-2.html
902 - test/source/_slides/example-slide-3.html
903 - test/source/_with.dots/all.dots/2.4.0.md
904 - test/source/_with.dots/file.with.dots.md
905 - test/source/about.html
906 - test/source/category/_posts/2008-9-23-categories.textile
907 - test/source/contacts.html
908 - test/source/contacts/bar.html
909 - test/source/contacts/index.html
910 - test/source/css/main.scss
911 - test/source/css/screen.css
912 - test/source/deal.with.dots.html
913 - test/source/environment.html
914 - test/source/exploit.md
915 - test/source/foo/_posts/bar/2008-12-12-topical-post.textile
916 - test/source/index.html
917 - test/source/js/coffeescript.coffee
918 - test/source/pgp.key
919 - test/source/products.yml
920 - test/source/properties.html
921 - test/source/sitemap.xml
922 - test/source/static_files.html
923 - test/source/symlink-test/symlinked-file
924 - test/source/unpublished.html
925 - test/source/win/_posts/2009-05-24-yaml-linebreak.markdown
926 - test/source/z_category/_posts/2008-9-23-categories.textile
927 - test/suite.rb
928 - test/test_cleaner.rb
929 - test/test_coffeescript.rb
930 - test/test_collections.rb
657931 - test/test_command.rb
658932 - test/test_configuration.rb
659933 - test/test_convertible.rb
660 - test/test_core_ext.rb
934 - test/test_document.rb
935 - test/test_draft.rb
661936 - test/test_entry_filter.rb
662937 - test/test_excerpt.rb
663938 - test/test_filters.rb
664939 - test/test_generated_site.rb
665940 - test/test_kramdown.rb
941 - test/test_layout_reader.rb
942 - test/test_liquid_extensions.rb
943 - test/test_log_adapter.rb
666944 - test/test_new_command.rb
667945 - test/test_page.rb
668 - test/test_pager.rb
669946 - test/test_path_sanitization.rb
670947 - test/test_post.rb
671948 - test/test_rdiscount.rb
672949 - test/test_redcarpet.rb
673950 - test/test_redcloth.rb
674951 - test/test_related_posts.rb
952 - test/test_sass.rb
675953 - test/test_site.rb
676954 - test/test_tags.rb
677955 - test/test_url.rb
956 - test/test_utils.rb
00 #!/bin/sh
1
2 script/branding
13 bundle install
0 #! /bin/bash
1
2 echo " ---------------------------------------------------------- "
3 echo " _ ______ _ __ __ __ _ _ "
4 echo " | | | ____| | |/ / \ \ / / | | | | "
5 echo " | | | |__ | ' / \ \_/ / | | | | "
6 echo " _ | | | __| | < \ / | | | | "
7 echo " | |__| | | |____ | . \ | | | |____ | |____ "
8 echo " \____/ |______| |_|\_\ |_| |______| |______| "
9 echo " "
10 echo " ---------------------------------------------------------- "
0 #! /bin/bash
1
2 set -e
3
4 script/branding
5 script/proof
6 script/test
0 #!/usr/bin/env ruby
1
2 require 'pry'
3 $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
4 require 'jekyll'
5
6 TEST_DIR = File.expand_path(File.join(File.dirname(__FILE__), *%w{ .. test }))
7
8 def fixture_site(overrides = {})
9 Jekyll::Site.new(site_configuration(overrides))
10 end
11
12 def build_configs(overrides, base_hash = Jekyll::Configuration::DEFAULTS)
13 Jekyll::Utils.deep_merge_hashes(base_hash, overrides)
14 end
15
16 def site_configuration(overrides = {})
17 build_configs({
18 "source" => source_dir,
19 "destination" => dest_dir
20 }, build_configs(overrides))
21 end
22
23 def dest_dir(*subdirs)
24 test_dir('dest', *subdirs)
25 end
26
27 def source_dir(*subdirs)
28 test_dir('source', *subdirs)
29 end
30
31 def test_dir(*subdirs)
32 File.join(TEST_DIR, *subdirs)
33 end
34
35 module Jekyll
36 binding.pry
37 end
0 #! /bin/bash
1 #
2 # Usage:
3 # script/proof
4
5 set -e
6
7 git diff --name-only origin $(git log --pretty=format:"%h" -2 | tail -1) | grep '^site/' || {
8 echo "No site files changed. We'll skip proofing."
9 exit 0
10 }
11
12 echo "Some site files have been changed! Proofing..."
13
14 command -v htmlproof || {
15 echo "Installing HTML::Proofer!"
16 gem install html-proofer -- --use-system-libraries
17 }
18
19 bundle exec jekyll build -s site -d _site --trace
20 printf "\e[0;36mProofing begins now!\e[0m\n"
21 htmlproof ./_site
0 #!/bin/bash
1 #
2 # rebund(1)
3 #
4 # Author: Julien Letessier
5 # Homepage: https://github.com/mezis/rebund
6 # License:
7 #
8 # Copyright (c) 2014 HouseTrip Ltd
9 #
10 # MIT License
11 #
12 # Permission is hereby granted, free of charge, to any person obtaining
13 # a copy of this software and associated documentation files (the
14 # "Software"), to deal in the Software without restriction, including
15 # without limitation the rights to use, copy, modify, merge, publish,
16 # distribute, sublicense, and/or sell copies of the Software, and to
17 # permit persons to whom the Software is furnished to do so, subject to
18 # the following conditions:
19 #
20 # The above copyright notice and this permission notice shall be
21 # included in all copies or substantial portions of the Software.
22 #
23 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
31
32 # Configuration
33 : ${REBUND_CREDENTIALS:=user:secret}
34 : ${REBUND_ENDPOINT=http://keyfile-production.herokuapp.com}
35 : ${REBUND_TARBALL:=bundle.tbz}
36 : ${REBUND_BUNDLE_DIR:=vendor/bundle}
37
38
39
40 log() {
41 echo "rebund: $*" > /dev/stderr
42 }
43
44 die() {
45 echo "fatal: $*" > /dev/stderr
46 exit 1
47 }
48
49 success() {
50 log "$*"
51 exit 0
52 }
53
54 on_error() {
55 die 'unknown error.'
56 }
57
58 get_ruby_version() {
59 bundle exec ruby --version
60 }
61
62 get_gemfile() {
63 bundle exec sh -c 'echo $BUNDLE_GEMFILE'
64 }
65
66 calculate_hash() {
67 (get_ruby_version ; cat $(get_gemfile)) | openssl sha256 | sed -e 's/.* //'
68 }
69
70 build_tarball() {
71 test -e $REBUND_BUNDLE_DIR || die "cannot find bundle directory in ${REBUND_BUNDLE_DIR}"
72 test -e $REBUND_TARBALL && success 'bundle already uploaded'
73 tar jcf $REBUND_TARBALL $REBUND_BUNDLE_DIR
74 }
75
76 upload_tarball() {
77 curl --fail \
78 -F filedata=@${REBUND_TARBALL} \
79 --digest --user $REBUND_CREDENTIALS \
80 ${REBUND_ENDPOINT}/$(calculate_hash) \
81 || success "could not upload bundle"
82 }
83
84 expand_tarball() {
85 test -e $REBUND_TARBALL || success "no tarball"
86 tar jxf $REBUND_TARBALL
87 }
88
89 download_tarball() {
90 curl --fail \
91 --location \
92 -o ${REBUND_TARBALL} \
93 --digest --user $REBUND_CREDENTIALS \
94 ${REBUND_ENDPOINT}/$(calculate_hash) \
95 || success "could not download bundle"
96 }
97
98 rebund_upload() {
99 build_tarball
100 upload_tarball
101 }
102
103 rebund_download() {
104 download_tarball
105 expand_tarball
106 }
107
108 rebund_usage() {
109 success "usage: $0 [-v] [upload|download]"
110 }
111
112 # cath errors
113 trap on_error ERR
114
115 # inherit the ERR trap in subprocesses
116 set -E
117
118 while test $# -gt 0 ; do
119 case $1 in
120 -v)
121 set -x
122 ;;
123 upload)
124 rebund_upload
125 exit 0
126 ;;
127 download)
128 rebund_download
129 exit 0
130 ;;
131 *)
132 rebund_usage
133 exit 1
134 ;;
135 esac
136 shift
137 done
138
139 rebund_usage
0 #! /bin/bash
1 #
2 # Usage:
3 # script/test
4 # script/test <hi>
5
6 set -x
7
8 if [ -z "$1" ]; then
9 TEST_FILES="test/test_*.rb"
10 else
11 TEST_FILES="$@"
12 fi
13
14 set -x
15
16 bundle exec rake
0 pygments: true
0 markdown: kramdown
1 highlighter: pygments
12 relative_permalinks: false
23 gauges_id: 503c5af6613f5d0f19000027
34 permalink: /news/:year/:month/:day/:title/
45 excerpt_separator: noifniof3nioaniof3nioafafinoafnoif
5 repository: https://github.com/mojombo/jekyll
6 repository: https://github.com/jekyll/jekyll
7 help_url: https://github.com/jekyll/jekyll-help
8 google_analytics_id: UA-50755011-1
0 - title: Getting Started
1 docs:
2 - home
3 - quickstart
4 - installation
5 - usage
6 - structure
7 - configuration
8
9 - title: Your Content
10 docs:
11 - frontmatter
12 - posts
13 - drafts
14 - pages
15 - variables
16 - collections
17 - datafiles
18 - assets
19 - migrations
20
21 - title: Customization
22 docs:
23 - templates
24 - permalinks
25 - pagination
26 - plugins
27 - extras
28
29 - title: Deployment
30 docs:
31 - github-pages
32 - deployment-methods
33 - continuous-integration
34
35 - title: Miscellaneous
36 docs:
37 - troubleshooting
38 - sites
39 - resources
40 - upgrading
41
42 - title: Meta
43 docs:
44 - contributing
45 - history
00 {% if site.gauges_id %}
11 <!-- Gauges (http://gaug.es/) -->
2 <script type="text/javascript">
2 <script>
33 var _gauges = _gauges || [];
44 (function() {
55 var t = document.createElement('script');
1616
1717 {% if site.google_analytics_id %}
1818 <!-- Google Analytics (http://google.com/analytics) -->
19 <script type="text/javascript">
20 var _gaq = _gaq || [];
21 _gaq.push(['_setAccount', '{{ site.google_analytics_id }}']);
22 _gaq.push(['_setDomainName', '{{ site.url }}']); // Multiple sub-domains
23 _gaq.push(['_setAllowLinker', true]); // Multiple TLDs
24 _gaq.push(['_trackPageview']);
25 (function() {
26 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
27 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
28 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
29 })();
19 <script>
20 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
21 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
22 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
23 })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
24
25 ga('create', '{{ site.google_analytics_id }}', 'jekyllrb.com');
26 ga('send', 'pageview');
27
3028 </script>
3129 {% endif %}
0 <script>
1 var anchorForId = function (id) {
2 var anchor = document.createElement("a");
3 anchor.className = "header-link";
4 anchor.href = "#" + id;
5 anchor.innerHTML = "<i class=\"fa fa-link\"></i>";
6 return anchor;
7 };
8
9 var linkifyAnchors = function (level, containingElement) {
10 var headers = containingElement.getElementsByTagName("h" + level);
11 for (var h = 0; h < headers.length; h++) {
12 var header = headers[h];
13
14 if (typeof header.id !== "undefined" && header.id !== "") {
15 header.appendChild(anchorForId(header.id));
16 }
17 }
18 };
19
20 document.onreadystatechange = function () {
21 if (this.readyState === "complete") {
22 var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
23 if (!contentBlock) {
24 return;
25 }
26 for (var level = 1; level <= 6; level++) {
27 linkifyAnchors(level, contentBlock);
28 }
29 }
30 };
31 </script>
0 /*!
1 * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome
2 * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
3 */
4 @font-face {
5 font-family: 'FontAwesome';
6 src: url('../fonts/fontawesome-webfont.eot?v=4.1.0');
7 src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');
8 font-weight: normal;
9 font-style: normal;
10 }
11 .fa {
12 display: inline-block;
13 font-family: FontAwesome;
14 font-style: normal;
15 font-weight: normal;
16 line-height: 1;
17 -webkit-font-smoothing: antialiased;
18 -moz-osx-font-smoothing: grayscale;
19 }
20 .fa-link:before {
21 content: "\f0c1";
22 }
23 /*
24 * This code is courtesy Ben Balter, modified by Parker Moore for jekyllrb.com
25 * http://ben.balter.com/2014/03/13/pages-anchor-links/
26 */
27 .header-link {
28 position: relative;
29 left: 0.5em;
30 opacity: 0;
31 font-size: 0.8em;
32
33 -webkit-transition: opacity 0.2s ease-in-out 0.1s;
34 -moz-transition: opacity 0.2s ease-in-out 0.1s;
35 -ms-transition: opacity 0.2s ease-in-out 0.1s;
36 }
37 h2:hover .header-link,
38 h3:hover .header-link,
39 h4:hover .header-link,
40 h5:hover .header-link,
41 h6:hover .header-link {
42 opacity: 1;
43 }
0 /*
1 * Gridism
2 * A simple, responsive, and handy CSS grid by @cobyism
3 * https://github.com/cobyism/gridism
4 */
5
6 /* Preserve some sanity */
7 .grid,
8 .unit {
9 -webkit-box-sizing: border-box;
10 -moz-box-sizing: border-box;
11 box-sizing: border-box;
12 }
13
14 /* Set up some rules to govern the grid */
15 .grid {
16 display: block;
17 clear: both;
18 }
19 .grid .unit {
20 float: left;
21 width: 100%;
22 padding: 10px;
23 }
24
25 /* This ensures the outer gutters are equal to the (doubled) inner gutters. */
26 .grid .unit:first-child { padding-left: 20px; }
27 .grid .unit:last-child { padding-right: 20px; }
28
29 /* Nested grids already have padding though, so let’s nuke it */
30 .unit .unit:first-child { padding-left: 0; }
31 .unit .unit:last-child { padding-right: 0; }
32 .unit .grid:first-child > .unit { padding-top: 0; }
33 .unit .grid:last-child > .unit { padding-bottom: 0; }
34
35 /* Let people nuke the gutters/padding completely in a couple of ways */
36 .no-gutters .unit,
37 .unit.no-gutters {
38 padding: 0 !important;
39 }
40
41 /* Wrapping at a maximum width is optional */
42 .wrap .grid,
43 .grid.wrap {
44 max-width: 978px;
45 margin: 0 auto;
46 }
47
48 /* Width classes also have shorthand versions numbered as fractions
49 * For example: for a grid unit 1/3 (one third) of the parent width,
50 * simply apply class="w-1-3" to the element. */
51 .grid .whole, .grid .w-1-1 { width: 100%; }
52 .grid .half, .grid .w-1-2 { width: 50%; }
53 .grid .one-third, .grid .w-1-3 { width: 33.3332%; }
54 .grid .two-thirds, .grid .w-2-3 { width: 66.6665%; }
55 .grid .one-quarter, .grid .w-1-4 { width: 25%; }
56 .grid .three-quarters, .grid .w-3-4 { width: 75%; }
57 .grid .one-fifth, .grid .w-1-5 { width: 20%; }
58 .grid .two-fifths, .grid .w-2-5 { width: 40%; }
59 .grid .three-fifths, .grid .w-3-5 { width: 60%; }
60 .grid .four-fifths, .grid .w-4-5 { width: 80%; }
61 .grid .golden-small, .grid .w-g-s { width: 38.2716%; } /* Golden section: smaller piece */
62 .grid .golden-large, .grid .w-g-l { width: 61.7283%; } /* Golden section: larger piece */
63
64 /* Utility classes */
65 .align-center { text-align: center; }
66 .align-left { text-align: left; }
67 .align-right { text-align: right; }
68 .pull-left { float: left; }
69 .pull-right { float: right; }
70
71 .show-on-mobiles {
72 display: none;
73 }
74
75 /* Responsive Stuff */
76 @media screen and (max-width: 568px) {
77 /* Stack anything that isn’t full-width on smaller screens */
78 .grid .unit {
79 width: 100% !important;
80 padding-left: 20px;
81 padding-right: 20px;
82 }
83 .unit .grid .unit {
84 padding-left: 0px;
85 padding-right: 0px;
86 }
87
88 /* Sometimes, you just want to be different on small screens */
89 .center-on-mobiles {
90 text-align: center !important;
91 }
92 .hide-on-mobiles {
93 display: none !important;
94 }
95 .show-on-mobiles {
96 display: block !important;
97 }
98 a .show-on-mobiles {
99 display: inline !important;
100 }
101 }
102
103 /* Expand the wrap a bit further on larger screens */
104 /*@media screen and (min-width: 1180px) {
105 .wrap .grid {
106 max-width: 1180px;
107 margin: 0 auto;
108 }
109 }*/
0 /*.highlight { background: #333333; color: #ffffff}*/
1 .highlight .hll { background-color: #ffffcc }
2 .highlight .c { color: #87ceeb} /* Comment */
3 .highlight .err { color: #ffffff} /* Error */
4 .highlight .g { color: #ffffff} /* Generic */
5 .highlight .k { color: #f0e68c} /* Keyword */
6 .highlight .l { color: #ffffff} /* Literal */
7 .highlight .n { color: #ffffff} /* Name */
8 .highlight .o { color: #ffffff} /* Operator */
9 .highlight .x { color: #ffffff} /* Other */
10 .highlight .p { color: #ffffff} /* Punctuation */
11 .highlight .cm { color: #87ceeb} /* Comment.Multiline */
12 .highlight .cp { color: #cd5c5c} /* Comment.Preproc */
13 .highlight .c1 { color: #87ceeb} /* Comment.Single */
14 .highlight .cs { color: #87ceeb} /* Comment.Special */
15 .highlight .gd { color: #0000c0; font-weight: bold; background-color: #008080 } /* Generic.Deleted */
16 .highlight .ge { color: #c000c0; text-decoration: underline} /* Generic.Emph */
17 .highlight .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */
18 .highlight .gh { color: #cd5c5c} /* Generic.Heading */
19 .highlight .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */
20 .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. */
21 .highlight .gp { color: #ffffff} /* Generic.Prompt */
22 .highlight .gs { color: #ffffff} /* Generic.Strong */
23 .highlight .gu { color: #cd5c5c} /* Generic.Subheading */
24 .highlight .gt { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Traceback */
25 .highlight .kc { color: #f0e68c} /* Keyword.Constant */
26 .highlight .kd { color: #f0e68c} /* Keyword.Declaration */
27 .highlight .kn { color: #f0e68c} /* Keyword.Namespace */
28 .highlight .kp { color: #f0e68c} /* Keyword.Pseudo */
29 .highlight .kr { color: #f0e68c} /* Keyword.Reserved */
30 .highlight .kt { color: #bdb76b} /* Keyword.Type */
31 .highlight .ld { color: #ffffff} /* Literal.Date */
32 .highlight .m { color: #ffffff} /* Literal.Number */
33 .highlight .s { color: #ffffff} /* Literal.String */
34 .highlight .na { color: #ffffff} /* Name.Attribute */
35 .highlight .nb { color: #ffffff} /* Name.Builtin */
36 .highlight .nc { color: #ffffff} /* Name.Class */
37 .highlight .no { color: #ffa0a0} /* Name.Constant */
38 .highlight .nd { color: #ffffff} /* Name.Decorator */
39 .highlight .ni { color: #ffdead} /* Name.Entity */
40 .highlight .ne { color: #ffffff} /* Name.Exception */
41 .highlight .nf { color: #ffffff} /* Name.Function */
42 .highlight .nl { color: #ffffff} /* Name.Label */
43 .highlight .nn { color: #ffffff} /* Name.Namespace */
44 .highlight .nx { color: #ffffff} /* Name.Other */
45 .highlight .py { color: #ffffff} /* Name.Property */
46 .highlight .nt { color: #f0e68c} /* Name.Tag */
47 .highlight .nv { color: #98fb98} /* Name.Variable */
48 .highlight .ow { color: #ffffff} /* Operator.Word */
49 .highlight .w { color: #ffffff} /* Text.Whitespace */
50 .highlight .mf { color: #ffffff} /* Literal.Number.Float */
51 .highlight .mh { color: #ffffff} /* Literal.Number.Hex */
52 .highlight .mi { color: #ffffff} /* Literal.Number.Integer */
53 .highlight .mo { color: #ffffff} /* Literal.Number.Oct */
54 .highlight .sb { color: #ffffff} /* Literal.String.Backtick */
55 .highlight .sc { color: #ffffff} /* Literal.String.Char */
56 .highlight .sd { color: #ffffff} /* Literal.String.Doc */
57 .highlight .s2 { color: #ffffff} /* Literal.String.Double */
58 .highlight .se { color: #ffffff} /* Literal.String.Escape */
59 .highlight .sh { color: #ffffff} /* Literal.String.Heredoc */
60 .highlight .si { color: #ffffff} /* Literal.String.Interpol */
61 .highlight .sx { color: #ffffff} /* Literal.String.Other */
62 .highlight .sr { color: #ffffff} /* Literal.String.Regex */
63 .highlight .s1 { color: #ffffff} /* Literal.String.Single */
64 .highlight .ss { color: #ffffff} /* Literal.String.Symbol */
65 .highlight .bp { color: #ffffff} /* Name.Builtin.Pseudo */
66 .highlight .vc { color: #98fb98} /* Name.Variable.Class */
67 .highlight .vg { color: #98fb98} /* Name.Variable.Global */
68 .highlight .vi { color: #98fb98} /* Name.Variable.Instance */
69 .highlight .il { color: #ffffff} /* Literal.Number.Integer.Long */
70
71 .highlight .bash .nv {-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; }
0 /* Base */
1
2 * {
3 -webkit-box-sizing: border-box;
4 -moz-box-sizing: border-box;
5 box-sizing: border-box;
6 }
7
8 body {
9 font: 300 21px Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;
10 color: #ddd;
11 background-color: #333;
12 border-top: 5px solid #fc0;
13 -webkit-box-shadow: inset 0 3px 30px rgba(0,0,0,.3);
14 -moz-box-shadow: inset 0 3px 30px rgba(0,0,0,.3);
15 box-shadow: inset 0 3px 30px rgba(0,0,0,.3);
16 text-shadow: 0 1px 3px rgba(0,0,0,.5);
17 }
18
19 .clear {
20 display: block;
21 }
22
23 .clear:after {
24 content: " ";
25 display: block;
26 height: 0;
27 clear: both;
28 visibility: hidden;
29 }
30
31 /* Sections */
32
33 header, section, footer {
34 float: left;
35 width: 100%;
36 clear: both;
37 }
38
39 /* Header */
40
41 header h1, header nav {
42 display: inline-block;
43 }
44
45 header h1 span {
46 display: none;
47 }
48
49 nav ul {
50 padding: 0;
51 margin: 0;
52 }
53
54 nav li {
55 display: inline-block;
56 }
57
58 .main-nav {
59 margin-top: 52px;
60 }
61
62 .main-nav li {
63 margin-right: 10px;
64 }
65
66 .main-nav li a {
67 -webkit-border-radius: 5px;
68 -moz-border-radius: 5px;
69 border-radius: 5px;
70 font-weight: 900;
71 font-size: 14px;
72 padding: 0.5em 1em;
73 text-shadow: none;
74 text-transform: uppercase;
75 -webkit-transition: all .25s;
76 -moz-transition: all .25s;
77 -o-transition: all .25s;
78 transition: all .25s;
79 }
80
81 .main-nav li a:hover {
82 background-color: #252525;
83 -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
84 -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
85 box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
86 text-shadow: 0 1px 3px rgba(0,0,0,.5);
87 }
88
89 .main-nav li.current a {
90 background-color: #fc0;
91 color: #222;
92 -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
93 -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
94 box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
95 text-shadow: 0 1px 0 rgba(255,255,255,.3);
96 }
97
98 .mobile-nav ul {
99 overflow: hidden;
100 width: 100%;
101 display: table;
102 }
103
104 .mobile-nav a {
105 float: left;
106 width: 100%;
107 background-color: #333;
108 color: #fc0;
109 text-align: center;
110 text-transform: uppercase;
111 font-size: 14px;
112 font-weight: 900;
113 padding: 5px;
114 -webkit-border-radius: 5px;
115 -moz-border-radius: 5px;
116 border-radius: 5px;
117 }
118
119 .mobile-nav .current a {
120 background-color: #fc0;
121 color: #222;
122 -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
123 -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
124 box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
125 text-shadow: 0 1px 0 rgba(255,255,255,.3);
126 }
127
128 .mobile-nav li {
129 display: table-cell;
130 width: 20%;
131 padding: 8px 2px;
132 }
133
134 @media (max-width: 768px) {
135 .main-nav ul {
136 text-align: right;
137 }
138 }
139 @media (max-width: 830px) {
140 .main-nav .show-on-mobiles {
141 display: inline;
142 }
143 .main-nav .hide-on-mobiles {
144 display: none;
145 }
146 }
147
148 /* Footer */
149
150 footer {
151 background-color: #222;
152 font-size: 16px;
153 padding-bottom: 5px;
154 color: #888;
155 margin-top: 40px;
156 }
157
158 footer a {
159 color: #fff;
160 }
161
162 footer .align-right p, footer img {
163 display: inline-block;
164 }
165
166 footer img {
167 position: relative;
168 top: 8px;
169 margin-left: 5px;
170 opacity: .8;
171 padding: 1px;
172 -webkit-transition: opacity .2s;
173 -moz-transition: opacity .2s;
174 -o-transition: opacity .2s;
175 transition: opacity .2s;
176 }
177
178 footer a:hover img {
179 opacity: 1;
180 }
181
182 @media (max-width: 568px) {
183 footer .one-third p {
184 margin-bottom: 0;
185 }
186 footer .two-thirds p {
187 margin-top: -20px;
188 }
189 }
190
191 /* Intro */
192
193 .intro .unit {
194 padding: 10px 0 40px;
195 }
196
197 .intro p {
198 font-size: 1.75em;
199 line-height: 1em;
200 margin: 0;
201 }
202
203 @media (min-width: 569px) {
204 .intro p {
205 font-size: 3.2em;
206 }
207 }
208
209 /* Quickstart */
210
211 .quickstart {
212 background-color: #3F1F1F;
213 color: #fff;
214 margin: 60px 0;
215 -webkit-box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
216 -moz-box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
217 box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
218 }
219
220 .quickstart .content {
221 padding: 0;
222 }
223
224 .quickstart h4 {
225 font-size: 24px;
226 line-height: 24px;
227 margin-top: 20px;
228 text-shadow: 0 1px 3px rgba(0,0,0,.8);
229 }
230
231 .quickstart .code {
232 font-size: 12px;
233 display: block;
234 margin: 0 0 -30px;
235 }
236
237 @media (min-width: 768px) {
238 .quickstart .code {
239 font-size: 18px;
240 margin: -30px 0;
241 float: right;
242 }
243 .quickstart h4 {
244 margin: 50px 0 0;
245 text-align: center;
246 }
247 }
248
249 /* Code */
250
251 .quickstart .code {
252 display: block;
253 padding: 0;
254 font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
255 line-height: 1.3em;
256 }
257
258 .quickstart .code .title {
259 display: block;
260 text-align: center;
261 margin: 0 20px;
262 padding: 5px 0;
263 -webkit-border-radius: 5px 5px 0 0;
264 -moz-border-radius: 5px 5px 0 0;
265 border-radius: 5px 5px 0 0;
266 -webkit-box-shadow: 0 3px 10px rgba(0,0,0,.5);
267 -moz-box-shadow: 0 3px 10px rgba(0,0,0,.5);
268 box-shadow: 0 3px 10px rgba(0,0,0,.5);
269 font: 400 16px/24px 'Helvetica Neue', Helvetica, Arial, sans-serif;
270 color: #444;
271 text-shadow: 0 1px 0 rgba(255,255,255,.5);
272 background-color: #f7f7f7;
273 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjclIiBzdG9wLWNvbG9yPSIjY2ZjZmNmIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2FhYWFhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=);
274 background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f7f7), color-stop(7%, #cfcfcf), to(#aaaaaa));
275 background-image: -webkit-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
276 background-image: -moz-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
277 background-image: -o-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
278 background-image: linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%);
279 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#aaaaaa',GradientType=0 );
280 border-bottom: 1px solid #111;
281 }
282
283 .quickstart .code .shell {
284 padding: 20px;
285 text-shadow: none;
286 margin: 0 20px;
287 background-color: #3d3d3d;
288 -webkit-border-radius: 0 0 5px 5px;
289 -moz-border-radius: 0 0 5px 5px;
290 border-radius: 0 0 5px 5px;
291 -webkit-box-shadow: 0 5px 30px rgba(0,0,0,.3);
292 -moz-box-shadow: 0 5px 30px rgba(0,0,0,.3);
293 box-shadow: 0 5px 30px rgba(0,0,0,.3);
294 }
295
296 .quickstart .code .line {
297 display: block;
298 margin: 0;
299 padding: 0;
300 }
301
302 .quickstart .code .line span {
303 display: inline-block;
304 }
305
306 .quickstart .code .path {
307 color: #87ceeb;
308 -webkit-user-select: none; /* Chrome all / Safari all */
309 -moz-user-select: none; /* Firefox all */
310 -ms-user-select: none; /* IE 10+ */
311 -o-user-select: none;
312 user-select: none;
313 }
314
315 .quickstart .code .prompt {
316 color: #cd5c5c;
317 -webkit-user-select: none; /* Chrome all / Safari all */
318 -moz-user-select: none; /* Firefox all */
319 -ms-user-select: none; /* IE 10+ */
320 -o-user-select: none;
321 user-select: none;
322 }
323
324 .quickstart .code .command {
325 color: #f0e68c;
326 }
327
328 .quickstart .code .output {
329 color: #888;
330 }
331
332 /* Free Hosting */
333
334 .free-hosting .pane {
335 background-color: #444;
336 -webkit-border-radius: 10px;
337 -moz-border-radius: 10px;
338 border-radius: 10px;
339 text-shadow: none;
340 position: relative;
341 padding: 0 20px 30px;
342 }
343
344 .free-hosting img {
345 margin: -30px 0 0;
346 width: 180px;
347 height: 150px;
348 }
349
350 .free-hosting h2 {
351 font-size: 28px;
352 }
353
354 .free-hosting p,
355 .free-hosting a {
356 font-size: 16px;
357 }
358
359 .free-hosting p {
360 margin: .75em 0;
361 }
362
363 @media (min-width: 768px) {
364 .free-hosting img {
365 float: left;
366 margin: -20px -30px -30px -50px;
367 width: 300px;
368 height: 251px;
369 }
370 .free-hosting .pane-content {
371 margin-top: 35px;
372 padding-right: 30px;
373 }
374 .free-hosting p,
375 .free-hosting a {
376 font-size: 18px;
377 }
378 .free-hosting .pane:after {
379 content: " ";
380 float: right;
381 background: url(../img/footer-arrow.png) top left no-repeat;
382 width: 73px;
383 height: 186px;
384 position: absolute;
385 right: 0;
386 bottom: -30px;
387 }
388 }
389
390 /* Article - Used for both docs and news */
391
392
393 article {
394 background-color: #444;
395 -webkit-border-radius: 10px;
396 -moz-border-radius: 10px;
397 border-radius: 10px;
398 padding: 20px;
399 margin: 0 10px;
400 -webkit-box-shadow: 0 3px 10px rgba(0,0,0,.1);
401 -moz-box-shadow: 0 3px 10px rgba(0,0,0,.1);
402 box-shadow: 0 3px 10px rgba(0,0,0,.1);
403 font-size: 16px;
404 }
405
406 @media (max-width: 480px) {
407 article ul {
408 padding-left: 20px;
409 }
410 }
411
412 @media (max-width: 568px) {
413 article {
414 margin: 0;
415 }
416 }
417
418 @media (min-width: 768px) {
419 article {
420 padding: 40px 40px 30px;
421 font-size: 21px;
422 }
423 }
424
425 /* Right-side nav - used by both docs and news */
426
427 aside {
428 padding-top: 30px;
429 }
430
431 aside h4 {
432 text-transform: uppercase;
433 font-size: 14px;
434 font-weight: 700;
435 padding: 0 0 10px 30px;
436 margin-left: -30px;
437 display: inline-block;
438 border-bottom: 1px solid #c00;
439 }
440
441 aside ul {
442 padding-left: 0;
443 }
444
445 aside ul:first-child {
446 margin-top: 0;
447 }
448
449 aside li {
450 list-style-type: none;
451 }
452
453 aside li a {
454 font-size: 16px;
455 position: relative
456 }
457
458 aside li.current a:before {
459 content: "";
460 border-color: transparent transparent transparent #444;
461 border-style: solid;
462 border-width: 10px;
463 width: 0;
464 height: 0;
465 position: absolute;
466 top: 0;
467 left: -30px;
468 }
469
470 /* Documentation */
471
472 .docs article {
473 min-height: 800px;
474 }
475
476 .docs .content {
477 padding: 0;
478 }
479
480 .section-nav {
481 text-align: center;
482 padding-top: 40px;
483 position: relative;
484 background: url(../img/article-footer.png) top center no-repeat;
485 margin: 40px -20px 10px;
486 }
487
488 .section-nav > div {
489 width: 49.5%;
490 }
491
492 .section-nav a, .section-nav span {
493 color: #fff;
494 font-size: 16px;
495 text-transform: uppercase;
496 font-weight: 700;
497 padding: 8px 12px 10px;
498 -webkit-border-radius: 5px;
499 -moz-border-radius: 5px;
500 border-radius: 5px;
501 /*border: 1px solid #333;*/
502 -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
503 -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
504 box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
505 background-color: #777;
506 }
507
508 .section-nav a:hover {
509 color: #fff;
510 background-color: #888;
511 }
512
513 .section-nav .next, .section-nav .prev {
514 position: relative;
515 }
516
517 .section-nav .next:after, .section-nav .prev:before {
518 font-size: 36px;
519 color: #222;
520 font-weight: 900;
521 text-shadow: 0 1px 0 rgba(255,255,255,.4);
522 position: absolute;
523 top: -7px;
524 }
525
526 .section-nav .next:after {
527 content: "›";
528 right: 10px;
529 }
530
531 .section-nav .prev:before {
532 content: "‹";
533 left: 10px;
534 }
535
536 .section-nav .prev, .section-nav .prev:hover {
537 /*float: left;*/
538 padding-left: 30px;
539 }
540
541 .section-nav .next, .section-nav .next:hover {
542 /*float: right;*/
543 padding-right: 30px;
544 }
545
546 .section-nav .disabled {
547 opacity: .5;
548 /*filter: alpha*/
549 cursor: default;
550 }
551
552 .docs-nav-mobile select {
553 color: #000;
554 width: 100%;
555 }
556
557 /* News */
558
559 article h2:first-child {
560 margin-top: 0;
561 }
562
563 .post-category,
564 .post-meta {
565 display: inline-block;
566 vertical-align: middle;
567 font-size: .8em;
568 }
569
570 .post-category {
571 display: inline-block;
572 margin-left: -30px;
573 padding: 6px 10px 8px;
574 padding-left: 50px;
575 -webkit-border-radius: 0 5px 5px 0;
576 -moz-border-radius: 0 5px 5px 0;
577 border-radius: 0 5px 5px 0;
578 position: relative;
579 -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
580 -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
581 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);
582 background-color: #9e2812;
583 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
584 background-image: -webkit-gradient(linear, left top, left bottom, from(#9e2812), to(#6f0d0d));
585 background-image: -webkit-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
586 background-image: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
587 background-image: -o-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
588 background-image: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
589 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
590 }
591
592 .post-content img {
593 max-width: 100%
594 }
595
596 .label {
597 float: left;
598 text-transform: uppercase;
599 font-weight: 700;
600 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
601 }
602
603 @media (max-width: 568px) {
604 .post-category {
605 padding-left: 30px;
606 }
607 }
608
609 @media (min-width: 768px) {
610 .post-category {
611 margin-left: -50px;
612 }
613 }
614
615 .post-category:before {
616 content: "";
617 position: absolute;
618 top: -10px;
619 left: 0;
620 border-color: transparent #6f0d0d #6f0d0d transparent;
621 border-style: solid;
622 border-width: 5px;
623 width: 0;
624 height: 0;
625 }
626
627 .avatar {
628 -webkit-border-radius: 3px;
629 -moz-border-radius: 3px;
630 border-radius: 3px;
631 display: inline-block;
632 vertical-align: middle;
633 }
634
635 .post-meta {
636 padding: 5px 0;
637 color: #aaa;
638 font-weight: 600;
639 text-shadow: 0 -1px 0 #000;
640 }
641
642 .post-date,
643 .post-author {
644 margin-left: 10px;
645 }
646
647 .news article + article {
648 margin-top: -10px;
649 -webkit-border-radius: 0 0 10px 10px;
650 -moz-border-radius: 0 0 10px 10px;
651 border-radius: 0 0 10px 10px;
652 border-top: 1px solid #555;
653 -webkit-box-shadow: 0 -1px 0 #2f2f2f;
654 -moz-box-shadow: 0 -1px 0 #2f2f2f;
655 box-shadow: 0 -1px 0 #2f2f2f;
656 }
657
658 /* Code Highlighting */
659
660
661 pre, code {
662 white-space: pre;
663 display: inline-block;
664 margin: 0;
665 font: 14px/1.8em Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
666 padding: 0 0.5em;
667 }
668
669 @media (min-width: 768px) {
670 pre, code {
671 font-size: 16px;
672 }
673 }
674
675 .highlight, p > pre, p > code, p > nobr > code, li > code, h5 > code, .note > code {
676 background-color: #333;
677 color: #fff;
678 -webkit-border-radius: 5px;
679 -moz-border-radius: 5px;
680 border-radius: 5px;
681 -webkit-box-shadow: inset 0 1px 10px rgba(0,0,0,.3),
682 0 1px 0 rgba(255,255,255,.1),
683 0 -1px 0 rgba(0,0,0,.5);
684 -moz-box-shadow: inset 0 1px 10px rgba(0,0,0,.3),
685 0 1px 0 rgba(255,255,255,.1),
686 0 -1px 0 rgba(0,0,0,.5);
687 box-shadow: inset 0 1px 10px rgba(0,0,0,.3),
688 0 1px 0 rgba(255,255,255,.1),
689 0 -1px 0 rgba(0,0,0,.5);
690 }
691
692 .note code {
693 background-color: #333;
694 background-color: rgba(0,0,0,0.2);
695 margin-left: 2.5px;
696 margin-right: 2.5px;
697 font-size: 0.8em;
698 }
699
700 .highlight {
701 margin: 1em 0;
702 padding: 10px 0;
703 width: 100%;
704 overflow: auto;
705 }
706
707 /* HTML Elements */
708
709 h1, h2, h3, h4, h5, h6 {
710 margin: 0;
711 }
712
713 a {
714 color: #fc0;
715 text-decoration: none;
716 -webkit-transition: all .25s;
717 -moz-transition: all .25s;
718 -o-transition: all .25s;
719 transition: all .25s;
720 }
721
722 a:hover {
723 color: #f90;
724 }
725
726 strong {
727 font-weight: 700;
728 }
729
730 p {
731 line-height: 1.5em;
732 }
733
734 .left { float: left; }
735 .right { float: right; }
736 .align-right { text-align: right; }
737 .align-left { text-align: left; }
738 .align-center { text-align: center; }
739
740 /* Article HTML */
741
742 article h2,
743 article h3,
744 article h4,
745 article h5,
746 article h6 {
747 margin: 1em 0;
748 }
749
750 article h4 {
751 color: #fff;
752 }
753
754 h5, h6 {
755 font-size: 1em;
756 font-style: italic;
757 }
758
759 article ul li p {
760 margin: 0;
761 }
762
763 article ul li, article ol li {
764 line-height: 1.5em;
765 margin-bottom: 0.5em;
766 }
767
768 article ul li blockquote {
769 margin: 10px 0;
770 }
771
772 blockquote {
773 border-left: 2px solid #777;
774 padding-left: 20px;
775 font-style: italic;
776 font-size: 18px;
777 font-weight: 500;
778 }
779
780
781 /* Tables */
782
783 table {
784 width: 100%;
785 background-color: #555;
786 margin: .5em 0;
787 -webkit-border-radius: 5px;
788 -moz-border-radius: 5px;
789 border-radius: 5px;
790 -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
791 -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
792 box-shadow: 0 1px 3px rgba(0,0,0,.3);
793 }
794
795 thead {
796 -webkit-border-top-left-radius: 5px;
797 -moz-border-radius-topleft: 5px;
798 border-top-left-radius: 5px;
799 -webkit-border-top-right-radius: 5px;
800 -moz-border-radius-topright: 5px;
801 border-top-right-radius: 5px;
802 color: #fff;
803 background-color: #3a3a3a;
804 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzNhM2EzYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxZTFlMWUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
805 background-image: -webkit-gradient(linear, left top, left bottom, from(#3a3a3a), to(#1e1e1e));
806 background-image: -webkit-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
807 background-image: -moz-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
808 background-image: -o-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
809 background-image: linear-gradient(to bottom, #3a3a3a 0%,#1e1e1e 100%);
810 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3a3a3a', endColorstr='#1e1e1e',GradientType=0 );
811 }
812
813 thead th {
814 position: relative;
815 -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
816 -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
817 box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
818 }
819
820 thead th:first-child {
821 -webkit-border-top-left-radius: 5px;
822 -moz-border-radius-topleft: 5px;
823 border-top-left-radius: 5px;
824 }
825
826 thead th:last-child {
827 -webkit-border-top-right-radius: 5px;
828 -moz-border-radius-topright: 5px;
829 border-top-right-radius: 5px;
830 }
831
832 td {
833 padding: .5em .75em;
834 }
835
836 td p {
837 margin: 0;
838 }
839
840 th {
841 text-transform: uppercase;
842 font-size: 16px;
843 padding: .5em .75em;
844 text-shadow: 0 -1px 0 rgba(0,0,0,.9);
845 color: #888;
846 }
847
848 tbody td {
849 border-top: 1px solid #747474;
850 border-top: 1px solid rgba(0,0,0,.1);
851 -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
852 -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
853 box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
854 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=);
855 background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,0.1)), to(rgba(255,255,255,0)));
856 background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
857 background-image: -moz-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
858 background-image: -o-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
859 background-image: linear-gradient(to bottom, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%);
860 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1affffff', endColorstr='#00ffffff',GradientType=0 );
861 }
862
863 td p {
864 font-size: 16px;
865 }
866
867 td p code {
868 font-size: 14px;
869 }
870
871 code.option, th .option, code.filter, th .filter {
872 color: #50B600;
873 }
874
875 code.flag, th .flag, code.output, th .output {
876 color: #049DCE;
877 }
878
879 code.option, code.flag, code.filter, code.output {
880 margin-bottom: 2px;
881 }
882
883 /* Note types */
884
885 .note {
886 margin: 30px 0;
887 margin-left: -30px;
888 padding: 20px 20px 24px;
889 padding-left: 50px;
890 -webkit-border-radius: 0 5px 5px 0;
891 -moz-border-radius: 0 5px 5px 0;
892 border-radius: 0 5px 5px 0;
893 position: relative;
894 -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
895 -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, .3), inset 0 1px 0 rgba(255,255,255,.2), inset 0 -1px 0 rgba(0,0,0,.3);
896 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);
897 background-color: #7e6d42;
898 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdlNmQ0MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1YzRlMzUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
899 background-image: -webkit-gradient(linear, left top, left bottom, from(#7e6d42), to(#5c4e35));
900 background-image: -webkit-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
901 background-image: -moz-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
902 background-image: -o-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
903 background-image: linear-gradient(to bottom, #7e6d42 0%,#5c4e35 100%);
904 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7e6d42', endColorstr='#5c4e35',GradientType=0 );
905 }
906
907 @media (max-width: 568px) {
908 .note {
909 margin-right: -30px;
910 }
911 }
912
913 @media (min-width: 768px) {
914 .note {
915 margin-left: -50px;
916 }
917 }
918
919 .note:before {
920 content: "";
921 position: absolute;
922 top: -10px;
923 left: 0;
924 border-color: transparent #222 #222 transparent;
925 border-style: solid;
926 border-width: 5px;
927 width: 0;
928 height: 0;
929 }
930
931 .note h5, .note p {
932 margin: 0;
933 color: #fff;
934 }
935
936 .note h5 {
937 line-height: 1.5em;
938 font-weight: 900;
939 font-style: normal;
940 }
941
942 .note p {
943 font-weight: 400;
944 font-size: .75em;
945 }
946
947 .info {
948 background-color: #0389aa;
949 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAzODlhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDYxN2YiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
950 background-image: -webkit-gradient(linear, left top, left bottom, from(#0389aa), to(#00617f));
951 background-image: -webkit-linear-gradient(top, #0389aa 0%, #00617f 100%);
952 background-image: -moz-linear-gradient(top, #0389aa 0%, #00617f 100%);
953 background-image: -o-linear-gradient(top, #0389aa 0%, #00617f 100%);
954 background-image: linear-gradient(to bottom, #0389aa 0%,#00617f 100%);
955 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0389aa', endColorstr='#00617f',GradientType=0 );
956 }
957
958 .warning {
959 background-color: #9e2812;
960 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
961 background-image: -webkit-gradient(linear, left top, left bottom, from(#9e2812), to(#6f0d0d));
962 background-image: -webkit-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
963 background-image: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
964 background-image: -o-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
965 background-image: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
966 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
967 }
968
969 .unreleased {
970 background-color: #cd9239;
971 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2NkOTIzOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNhMjc1MjgiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
972 background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(205,146,57,1)), to(rgba(162,117,40,1)));
973 background-image: -webkit-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
974 background-image: -moz-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
975 background-image: -o-linear-gradient(top, rgba(205,146,57,1) 0%, rgba(162,117,40,1) 100%);
976 background-image: linear-gradient(to bottom, rgba(205,146,57,1) 0%,rgba(162,117,40,1) 100%);
977 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cd9239', endColorstr='#a27528',GradientType=0 );
978 }
979
980 .info:before {
981 border-color: transparent #00617f #00617f transparent;
982 }
983
984 .warning:before {
985 border-color: transparent #6f0d0d #6f0d0d transparent;
986 }
987
988 .unreleased:before {
989 border-color: transparent #664719 #664719 transparent;
990 }
991
992 .note:after {
993 content: "★";
994 color: #fc0;
995 position: absolute;
996 top: 14px;
997 left: 14px;
998 font-size: 28px;
999 font-weight: 700;
1000 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
1001 }
1002
1003 .info:after {
1004 content: "ⓘ";
1005 color: #fff;
1006 position: absolute;
1007 top: 15px;
1008 left: 15px;
1009 font-size: 28px;
1010 font-weight: 700;
1011 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
1012 }
1013
1014 .warning:after {
1015 content: "‼";
1016 color: #fc0;
1017 position: absolute;
1018 top: 15px;
1019 left: 15px;
1020 font-size: 32px;
1021 font-weight: 700;
1022 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
1023 }
1024
1025 .unreleased:after {
1026 content: "⚒";
1027 color: #2b2a12;
1028 position: absolute;
1029 top: 8px;
1030 left: 15px;
1031 font-size: 38px;
1032 font-weight: 700;
1033 text-shadow: 0 1px 0 rgba(255,255,255,.25);
1034 }
1035
1036 /* Responsive tables */
1037
1038 @media (max-width: 768px) {
1039 .mobile-side-scroller {
1040 overflow-x: scroll;
1041 margin: 0 -40px;
1042 padding: 0 10px;
1043 }
1044 }
00 <div class="unit one-fifth hide-on-mobiles">
11 <aside>
2 <h4>Getting Started</h4>
3 {% include docs_ul.html items='home quickstart installation usage structure configuration' %}
4 <h4>Your Content</h4>
5 {% include docs_ul.html items='frontmatter posts drafts pages variables datafiles migrations' %}
6 <h4>Customization</h4>
7 {% include docs_ul.html items='templates permalinks pagination plugins extras' %}
8 <h4>Deployment</h4>
9 {% include docs_ul.html items='github-pages deployment-methods' %}
10 <h4>Miscellaneous</h4>
11 {% include docs_ul.html items='troubleshooting sites resources upgrading' %}
12 <h4>Meta</h4>
13 {% include docs_ul.html items='contributing history' %}
2 {% for section in site.data.docs %}
3 <h4>{{ section.title }}</h4>
4 {% include docs_ul.html items=section.docs %}
5 {% endfor %}
146 </aside>
157 </div>
00 <div class="docs-nav-mobile unit whole show-on-mobiles">
11 <select onchange="if (this.value) window.location.href=this.value">
22 <option value="">Navigate the docs…</option>
3 <optgroup label="Getting started">
4 {% include docs_option.html items='home quickstart installation usage structure configuration' %}
3 {% for section in site.data.docs %}
4 <optgroup label="{{ section.title }}">
5 {% include docs_option.html items=section.docs %}
56 </optgroup>
6 <optgroup label="Your Content">
7 {% include docs_option.html items='frontmatter posts drafts pages variables datafiles migrations' %}
8 </optgroup>
9 <optgroup label="Customization">
10 {% include docs_option.html items='templates permalinks pagination plugins extras' %}
11 </optgroup>
12 <optgroup label="Deployment">
13 {% include docs_option.html items='github-pages deployment-methods' %}
14 </optgroup>
15 <optgroup label="Miscellaneous">
16 {% include docs_option.html items='troubleshooting sites resources upgrading' %}
17 </optgroup>
18 <optgroup label="Meta">
19 {% include docs_option.html items='contributing history' %}
20 </optgroup>
7 {% endfor %}
218 </select>
229 </div>
0 {% assign items = include.items | split: ' ' %}
0 {% assign items = include.items %}
11
22 {% for item in items %}
3 {% assign item_url = item | prepend:'/docs/' | append:'/' %}
3 {% assign item_url = item | prepend:"/docs/" | append:"/" %}
44
55 {% for p in site.pages %}
66 {% if p.url == item_url %}
0 {% assign items = include.items | split: ' ' %}
0 {% assign items = include.items %}
11
22 <ul>
33 {% for item in items %}
4 {% assign item_url = item | prepend:'/docs/' | append:'/' %}
4 {% assign item_url = item | prepend:"/docs/" | append:"/" %}
55
66 {% if item_url == page.url %}
7 {% assign c = 'current' %}
7 {% assign c = "current" %}
88 {% else %}
9 {% assign c = '' %}
9 {% assign c = "" %}
1010 {% endif %}
1111
1212 {% for p in site.pages %}
1515 {% endif %}
1616 {% endfor %}
1717
18 {% endfor %}
18 {% endfor %}
1919 </ul>
00 <footer>
11 <div class="grid">
22 <div class="unit one-third center-on-mobiles">
3 <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="{{ site.repository }}/graphs/contributors">awesome&nbsp;contributors</a>.</p>
3 <p>The contents of this website are &copy;&nbsp;{{ site.time | date: '%Y' }} <a href="http://tom.preston-werner.com/">Tom Preston-Werner</a> under the terms of the <a href="{{ site.repository }}/blob/master/LICENSE">MIT&nbsp;License</a>.</p>
44 </div>
55 <div class="unit two-thirds align-right center-on-mobiles">
66 <p>
77 Proudly hosted by
88 <a href="https://github.com">
9 <img src="{{ site.url }}/img/footer-logo.png" alt="GitHub • Social coding">
9 <img src="/img/footer-logo.png" width="100" height="30" alt="GitHub • Social coding">
1010 </a>
1111 </p>
1212 </div>
44 <div class="grid">
55 <div class="unit one-third center-on-mobiles">
66 <h1>
7 <a href="{{ site.url }}/">
7 <a href="/">
88 <span>Jekyll</span>
9 <img src="{{ site.url }}/img/logo-2x.png" width="249" height="115" alt="">
9 <img src="/img/logo-2x.png" width="249" height="115" alt="Logo">
1010 </a>
1111 </h1>
1212 </div>
99 </ul>
1010 <h4>Recent Releases</h4>
1111 <ul>
12 {% for post in site.posts limit:5 %}
12 {% for post in site.categories.release limit:5 %}
1313 <li class="{% if page.title == post.title %}current{% endif %}">
1414 <a href="{{ post.url }}">Version {{ post.version }}</a>
1515 </li>
1818 <a href="/docs/history/">History »</a>
1919 </li>
2020 </ul>
21 <h4>Other News</h4>
22 <ul>
23 {% for post in site.posts %}
24 {% unless post.categories contains 'release' %}
25 <li class="{% if page.title == post.title %}current{% endif %}">
26 <a href="{{ post.url }}">{{ post.title }}</a>
27 </li>
28 {% endunless %}
29 {% endfor %}
30 </ul>
2131 </aside>
2232 </div>
44 </a>
55 </h2>
66 <span class="post-category">
7 {% for category in post.categories %}
8 <span class="label">{{ category }}</span>
9 {% endfor %}
7 <span class="label">
8 {{ post.categories | array_to_sentence_string }}
9 </span>
1010 </span>
1111 <div class="post-meta">
1212 <span class="post-date">
1313 {{ post.date | date_to_string }}
1414 </span>
1515 <a href="https://github.com/{{ post.author }}" class="post-author">
16 <img src="https://github.com/{{ post.author }}.png" class="avatar" alt="{{ post.author }}"/>
16 <img src="https://github.com/{{ post.author }}.png" class="avatar" alt="{{ post.author }}" width="24" height="24">
1717 {{ post.author }}
1818 </a>
1919 </div>
00 <ul>
11 <li class="{% if page.overview %}current{% endif %}">
2 <a href="{{ site.url }}/">Overview</a>
2 <a href="/">Home</a>
33 </li>
44 <li class="{% if page.url contains '/docs/' %}current{% endif %}">
5 <a href="{{ site.url }}/docs/home/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
5 <a href="/docs/home/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
66 </li>
77 <li class="{% if page.author %}current{% endif %}">
8 <a href="{{ site.url }}/news/">News</a>
8 <a href="/news/">News</a>
99 </li>
10 <li class="">
10 <li>
11 <a href="{{ site.help_url }}">Help</a>
12 </li>
13 <li>
1114 <a href="{{ site.repository }}"><span class="hide-on-mobiles">View on </span>GitHub</a>
1215 </li>
1316 </ul>
00 <div class="section-nav">
11 <div class="left align-right">
22 {% if page.prev_section != null %}
3 <a href="{{ site.url }}/docs/{{ page.prev_section }}/" class="prev">
3 <a href="/docs/{{ page.prev_section }}/" class="prev">
44 Back
55 </a>
66 {% else %}
99 </div>
1010 <div class="right align-left">
1111 {% if page.next_section != null %}
12 <a href="{{ site.url }}/docs/{{ page.next_section }}/" class="next">
12 <a href="/docs/{{ page.next_section }}/" class="next">
1313 Next
1414 </a>
1515 {% else %}
33 <meta charset="UTF-8">
44 <title>{{ page.title }}</title>
55 <meta name="viewport" content="width=device-width,initial-scale=1">
6 <link rel="alternate" type="application/rss+xml" title="Jekyll • Simple, blog-aware, static sites - Feed" href="/feed.xml" />
7 <link rel="alternate" type="application/atom+xml" title="Recent commits to Jekyll’s master branch" href="{{ site.repository }}/commits/master.atom" />
8 <link href='http://fonts.googleapis.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic' rel='stylesheet' type='text/css'>
9 <link href='http://fonts.googleapis.com/css?family=Arizonia' rel='stylesheet' type='text/css'>
10 <link rel="stylesheet" href="{{ site.url }}/css/normalize.css" />
11 <link rel="stylesheet" href="{{ site.url }}/css/gridism.css" />
12 <link rel="stylesheet" href="{{ site.url }}/css/style.css" />
13 <link rel="stylesheet" href="{{ site.url }}/css/pygments.css" />
14 <link rel="icon" type="image/png" href="{{ site.url }}/favicon.png" />
15 <script src="{{ site.url }}/js/modernizr-2.5.3.min.js"></script>
6 <meta name="generator" content="Jekyll v{{ jekyll.version }}">
7 <link rel="alternate" type="application/rss+xml" title="Jekyll • Simple, blog-aware, static sites - Feed" href="/feed.xml">
8 <link rel="alternate" type="application/atom+xml" title="Recent commits to Jekyll’s master branch" href="{{ site.repository }}/commits/master.atom">
9 <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900">
10 <link rel="stylesheet" href="/css/screen.css">
11 <link rel="icon" type="image/x-icon" href="/favicon.ico">
12 <!--[if lt IE 9]>
13 <script src="/js/html5shiv.min.js"></script>
14 <script src="/js/respond.min.js"></script>
15 <![endif]-->
1616 </head>
55 {{ content }}
66
77 {% include footer.html %}
8 {% include anchor_links.html %}
89 {% include analytics.html %}
910
1011 </body>
77 <a href="{{ page.url }}" class="permalink" title="Permalink">∞</a>
88 </h2>
99 <span class="post-category">
10 {% for category in page.categories %}
11 <span class="label">{{ category }}</span>
12 {% endfor %}
10 <span class="label">
11 {{ page.categories | array_to_sentence_string }}
12 </span>
1313 </span>
1414 <div class="post-meta">
1515 <span class="post-date">
1616 {{ page.date | date_to_string }}
1717 </span>
1818 <a href="https://github.com/{{ page.author }}" class="post-author">
19 <img src="https://github.com/{{ page.author }}.png" class="avatar" />
19 <img src="https://github.com/{{ page.author }}.png" class="avatar" alt="{{ page.author }}" width="24" height="24">
2020 {{ page.author }}
2121 </a>
2222 </div>
23 <p class="post-content">
23 <div class="post-content">
2424 {{ content }}
25 </p>
25 </div>
2626 </article>
1818
1919 Take a look at the [Upgrading][] page in the docs for more detailed information.
2020
21 [history]: /docs/history/#100__20130506
21 [history]: /docs/history/#v1-0-0
2222 [Upgrading]: /docs/upgrading/
2323 [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }}
2424 {% endfor %}
2525
26 [History]: /docs/history/#101__20130508
26 [History]: /docs/history/#v1-0-1
2424 [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }}
2525 {% endfor %}
2626
27 [History]: /docs/history/#102__20130512
27 [History]: /docs/history/#v1-0-2
2121 [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }}
2222 {% endfor %}
2323
24 [History]: /docs/history/#103__20130607
24 [History]: /docs/history/#v1-0-3
88
99
1010 Coming just 10 days after the release of v1.1.0, v1.1.1 is out with a patch for the nasty
11 excerpt inception bug ([1339][]) and non-zero exit codes for invalid commands
12 ([1338][]).
11 excerpt inception bug ([#1339][]) and non-zero exit codes for invalid commands
12 ([#1338][]).
1313
14 To all those affected by the [strange excerpt bug in v1.1.0][1321], I'm sorry. I think we
14 To all those affected by the [strange excerpt bug in v1.1.0][#1321], I'm sorry. I think we
1515 have it all patched up and it should be deployed to [GitHub Pages][gh_pages] in the next
1616 couple weeks. Thank you for your patience!
1717
2222
2323 {% assign issue_numbers = "1339|1338|1321" | split: "|" %}
2424 {% for issue in issue_numbers %}
25 [{{ issue }}]: {{ site.repository }}/issues/{{ issue }}
25 [#{{ issue }}]: {{ site.repository }}/issues/{{ issue }}
2626 {% endfor %}
2727
2828 [GitHub Release]: {{ site.repository }}/releases/tag/v1.1.1
88
99 Version 1.0.4 fixes a minor, but nonetheless important security vulnerability affecting several third-party Jekyll plugins. If your Jekyll site does not use plugins, you may, but are not required to upgrade at this time.
1010
11 Community and custom plugins extending the `Liquid::Drop` class may inadvertently disclose some system information such as directory structure or software configuration to users with access to the Liquid templating system.
11 Community and custom plugins extending the `Liquid::Drop` class may inadvertently disclose some system information such as directory structure or software configuration to users with access to the Liquid templating system.
1212
1313 We recommend you upgrade to Jekyll v1.0.4 immediately if you use `Liquid::Drop` plugins on your Jekyll site.
1414
15 Many thanks for [Ben Balter](http://github.com/benbalter) for alerting us to the problem
15 Many thanks for [Ben Balter](https://github.com/benbalter) for alerting us to the problem
1616 and [submitting a patch][1349] so quickly.
1717
1818 [230]: https://github.com/Shopify/liquid/pull/230
88
99 Version 1.1.2 fixes a minor, but nonetheless important security vulnerability affecting several third-party Jekyll plugins. If your Jekyll site does not use plugins, you may, but are not required to upgrade at this time.
1010
11 Community and custom plugins extending the `Liquid::Drop` class may inadvertently disclose some system information such as directory structure or software configuration to users with access to the Liquid templating system.
11 Community and custom plugins extending the `Liquid::Drop` class may inadvertently disclose some system information such as directory structure or software configuration to users with access to the Liquid templating system.
1212
1313 We recommend you upgrade to Jekyll v1.1.2 immediately if you use `Liquid::Drop` plugins on your Jekyll site.
1414
15 Many thanks for [Ben Balter](http://github.com/benbalter) for alerting us to the problem
15 Many thanks for [Ben Balter](https://github.com/benbalter) for alerting us to the problem
1616 and [submitting a patch][1349] so quickly.
1717
1818 [230]: https://github.com/Shopify/liquid/pull/230
77 ---
88
99 Quick turnover, anyone? A [recent incompatibility with Liquid
10 v2.5.2](https://github.com/mojombo/jekyll/pull/1525) produced a nasty bug in
11 which `include` tags were not rendered properly within `if` blocks.
10 v2.5.2](https://github.com/jekyll/jekyll/pull/1525) produced a nasty bug in
11 which `include` tags were not rendered properly within `if` blocks.
1212
1313 This release also includes a better handling of detached servers (prints pid and
1414 the command for killing the process). **Note**: the `--detach` flag and
1212 greatest code a spin without having to clone a repository from git.
1313
1414 Please take this prerelease for a spin and [let us
15 know](https://github.com/mojombo/jekyll/issues/new) if you run into any
15 know](https://github.com/jekyll/jekyll/issues/new) if you run into any
1616 issues!
1717
1818
0 ---
1 layout: news_item
2 title: 'Jekyll 1.4.1 Released'
3 date: 2013-12-09 20:44:13 -0600
4 author: mattr-
5 version: 1.4.1
6 categories: [release]
7 ---
8
9 Another quick turnover, anyone? A [critical
10 bug]({{ site.repository }}/issues/1794) in the reading of
11 posts snuck itself into the 1.4.0 release.
12
13 To address this issue, we're releasing v1.4.1 of Jekyll so that you can
14 keep on writing without any problems.
15
16 As always, you can find the full list of fixes in this release in the
17 [change log](/docs/history/)!
18
19
2222 or Javascript depending on your server's configuration.
2323
2424 *Maintainer's note: Many thanks to @gregose and @charliesome for discovering
25 these vulnerabilities, and to @BenBalter and @alindeman for writing the patch.
26 -@parkr*
25 these vulnerabilities, and to @BenBalter and @alindeman for writing the patch.*
1515 Now, back to work on 2.0.0!
1616
1717 [fun issue with path sanitizing]: https://github.com/jekyll/jekyll/issues/1948
18 [history]: /docs/history/#150__20140324
18 [history]: /docs/history/#v1-5-0
1818
1919 {% highlight ruby %}
2020 > sanitized_path("/tmp/foobar/jail", "..c:/..c:/..c:/etc/passwd")
21 => "/tmp/foobar/jail/etc/passwd"
21 => "/tmp/foobar/jail/..c:/..c:/..c:/etc/passwd"
2222 {% endhighlight %}
2323
2424 Luckily not affecting 1.4.x, this fix will make 1.5.0 that much safer for
0 ---
1 layout: news_item
2 title: 'Jekyll turns 2.0.0'
3 author: parkr
4 version: 2.0.0
5 categories: [release]
6 ---
7
8 A year ago to the day, [we released Jekyll 1.0.0][jekyll-1]. One year later, we present to you the next major version: Jekyll 2.0.0.
9
10 Jam-packed with some [highly-requested features and bugfixes galore][changelog], this is the best Jekyll yet. Some notable changes:
11
12 1. [Collections](/docs/collections/) - Collections allow you to define an unlimited number of custom document types (beyond just posts and pages) for different types of content you may want to author in Jekyll such as API documentation or a cookbook!
13 2. [Brand new site template](https://github.com/jekyll/jekyll/pull/2050#issuecomment-35938016) (thanks [@jglovier][]!) - Getting started with Jekyll just got a lot easier and a lot more beautiful. Just run `jekyll new <path>` and you're good to go.
14 3. [Native Sass & CoffeeScript support](/docs/assets/) - We love CSS and JavaScript as much as the next guy, but there will always be a special place in our hearts for Sass and CoffeeScript. We now offer native support for these file types &mdash; no more messing around with Rake or Grunt!
15 4. [YAML Front-Matter defaults](/docs/configuration/#frontmatter-defaults) - If you've set `layout: post` more than once in your life, you'll love this new feature: set front-matter defaults for a given directory or type.
16 5. [Custom markdown processors](/docs/configuration/#custom-markdown-processors) - Always wanted to use your favourite home-grown Markdown converter, but couldn't with Jekyll? Now you can. Simply specify `markdown: MyConverterClass` and you're on your way.
17 6. [Addition of `where` and `group_by` Liquid filters](/docs/templates/#filters) - Simplifying your Liquid templates one filter at a time. The `where` filter selects from an array all items within which have a given value for a property. The `group_by` filter groups all items in an array which have the same value for a given property.
18 7. [Switch from Maruku to Kramdown as default markdown converter](https://github.com/jekyll/jekyll/pull/1988) - Maruku is dead. We've replaced it with the converter which has the closest feature parity: Kramdown!
19
20 Check out our [changelog][] for a complete list of all (200+) changes.
21
22 Many thanks to these 183 contributors for making Jekyll 2.0.0 happen:
23
24 Parker Moore, Matt Rogers, maul.esel, Anatol Broder, Zach Gersh, Joel Glovier, Ben Balter, XhmikosR, Coby Chapple, John Piasetzki, Aidan Feldman, Robin Dupret, Pascal Borreli, Troy Swanson, Erik Michaels-Ober, albertogg, Lucas Jenss, Matt Rogers & Persa Zula, Eric Mill, Shigeya Suzuki, Jens Nazarenus, ddavison, Pat Hawks, Rob Wierzbowski, MURAOKA Taro, Casey Lang, Fabian Rodriguez, Greg Karékinian, Zlatan Vasović, Christopher Nicotera, Dmitry Chestnykh, Ryan Morrissey, Jordon, John Hughes, akira yamada, Matt Swanson, Jashank Jeremy, Matthew Iversen, Meeka, liufengyun, Anand Narayan, nitoyon, Geoff Shannon, Benjamin J. Balter, Juan Ignacio Donoso, David Briggs, Benjamin Esham, Slava Pavlutin, Assaf Gelber, Josh Brown, Nick Fagerlund, Davide Ficano, pilosus, Anthony Smith, André Arko, Mikael Konutgan, Matthew Scharley, Dan Tao, scribu, Mort Yao, m, Stephen McDonald, Marcus Stollsteimer, Thomas Torsney-Weir, Jordon Bedwell, Tom Preston-Werner, Lincoln Mullen, Philip Poots, Ivan Tse, Christopher Giroir, Valery Tolstov, Wlodek Bzyl, Xavier Noria, Yi Zeng, Persa Zula, Phil Leggetter, Pirogov Evgenij, Rafael Revi, Rob McGuire-Dale, Rob Muhlestein, Robin Mehner, Roland Warmerdam, Rusty Geldmacher, Sam Rayner, Santeri Paavolainen, Sebastian Morr, Stephan Groß, Steven Spasbo, Tobias Brunner, Tuomas Kareinen, Tyler Margison, Uwe Dauernheim, Yihang Ho, Zach Leatherman, Zequez, andrew morton, andrewhavens, imathis, jannypie, jaybe@jekyll, kk_Ataka, markets, redwallhp, schneems, szymzet, thomasdao, tomsugden, wǒis神仙, 张君君, Noah Slater, Abhi Yerra, Adam Heckler, Ahmed Hazem, Aigars Dzerviniks, Aleksey V. Zapparov, Andreas Möller, Andy Lindeman, Arlen Cuss, Aziz Shamim, Ben Baker-Smith, Ben Hanzl, Ben Hildred, Brian Kim, Brice, Carol Nichols, Chezou, Chris Jones, Christian Grobmeier, Christoph Hochstrasser, Christoph Schiessl, Clint Shryock, Colin Dean, Corey Ward, Damian Lettie, Daniel Schauenberg, David Ensinger, David Paschich, David Sawyer, David Silva Smith, Donald Perry, Doug Johnston, Edward Ball, Eric Dobson, Erik Dungan, Florent Guilleux, Francis, Frederic ROS, GSI2013, Garen Torikian, George Anderson, Giuseppe Capizzi, Ishibashi Hideto, Jarrod Birch, Jeff Kolesky, Jens Bissinger, Jens Krause, John Firebaugh, John Papandriopoulos, Josh Branchaud, Katy DeCorah, Lachlan Holden, Mark Prins, Markus Roth, Martin Charles, Matt Iversen, Matt Sheehan, Matt Swensen, Matthias Vogelgesang, Michael Parker, Miha Rekar, Nathan Youngman, Nick Quaranto, Nick Quinlan, Nick Schonning, Nicolas Alpi, Nicolás Reynolds, Nikkau, 4ensicLog, Octavian Damiean, Olov Lassus, PatrickC8t, Paul Annesley, and Paul Oppenheim.
25
26 Happy developing!
27
28 [changelog]: /docs/history/
29 [@jglovier]: https://github.com/jglovier
30 [jekyll-1]: /news/2013/05/06/jekyll-1-0-0-released/
0 ---
1 layout: news_item
2 title: 'Jekyll 2.0.3 Released'
3 date: 2014-05-08 22:43:17 -0400
4 author: parkr
5 version: 2.0.3
6 categories: [release]
7 ---
8
9 Hey again! Just wanted to let you know we've released another version of Jekyll, jam-packed with bug fixes.
10
11 A huge "thank you" is in order for all the folks who have submitted bug reports over the last 2 days &mdash; your input is what allows this project to continue. It's always a pain to deal with a MAJOR version bump release, but it's been pretty smooth so far and you have all been nice about the flaws you've found in the tool. Keep filing those reports so we can continue to make Jekyll even better!
12
13 Thank you to the contributors that contributed code to 2.0.1, 2.0.2, and/or 2.0.3:
14
15 Parker Moore, Yi Zeng, Gabe Ortiz, Aaron Broder, Alberto Grespan, gpxl, David Briggs, Kevin Ingersoll, and Troy Swanson.
16
17 As always, check out the [changelog](/docs/history/) for more info. Happy Jekylling!
0 ---
1 layout: news_item
2 title: 'Pick Up your $1 Jekyll Sticker'
3 date: 2014-06-04 15:46:53 -0400
4 author: parkr
5 categories: [partners]
6 ---
7
8 ![Jekyll Sticker](/img/jekyll-sticker.jpg)
9
10 You may have heard that [@cobyism](https://github.com/cobyism)'s excellent
11 Jekyll logo has been made into a sticker. You may have sat idly by, wishing
12 that you could have a sticker honoring your beloved Jekyll.
13
14 The StickerMule team says, *"Pine no longer!"* StickerMule has **[discounted the
15 price of Jekyll stickers down to $1 and are offering free (domestic)
16 shipping](http://www.stickermule.com/marketplace/825-jekyll-stickers)!**
17 Go grab one now on the StickerMule marketplace – [they'll look
18 swell on your favourite hardware.](https://twitter.com/parkr/status/430826309707902976/photo/1)
0 ---
1 layout: news_item
2 title: 'Jekyll Turns 21! Err... I mean 2.1.0.'
3 date: 2014-06-28 17:26:59 -0400
4 author: parkr
5 version: 2.1.0
6 categories: [release]
7 ---
8
9 Jekyll's finally [legal to drink in the States](http://en.wikipedia.org/wiki/Legal_drinking_age).
10 And he's done a lot of learning in the process! Here are some of the new
11 things to look forward to:
12
13 - Uses the latest Liquid version (2.6.1) (#2495)
14 - Set front-matter defaults for collections (#2419)
15 - Set a collection-specific URL template (#2418)
16 - `pygments.rb` 0.6.0! (#2504)
17 - `.json` files in `_data` (#2369)
18 - Allow subdirectories in `_data` (#2395)
19 - Add support for `hl_lines` in `highlight` tag (#2532)
20 - Post categories now merge with directory, front-matter, and defaults (#2373)
21 - New `--skip_initial_build` flag for `jekyll serve` (#2477)
22 - A bajilion bug fixes and site updates!
23
24 Let's go party!
25
26 *Check out the [full changelog](/docs/history/#v2-1-0) for more.*
27
28 Many thanks to these 37 contributors for the 2.1.0 release:
29
30 Alberto Grespan, Alessandro Lorenzi, Alex Medearis, Alfred Xing, Anatol Broder, Ben, Ben Balter, Bud Parr, Chezou, Denilson Figueiredo de Sá, Denilson Sá, Ivan Tse, Jens Nazarenus, Jesse Shawl, Jordon Bedwell, Josh Davis, János Rusiczki, Marc Ransome, Mathieu Bruyen, Matt Rogers, Parker Moore, Pat Hawks, Paul Henry, Peter Rhoades, Philipp Rudloff, Quinn Shanahan, Renaud Martinet, Rob Murray, Rodrigo Dumont, Simon Sarris, Terry, Terry Schmidt, Tomer Cohen, XhmikosR, Yihang Ho, jaybe@jekyll, and mikecole.
0 ---
1 layout: news_item
2 title: 'Jekyll 2.1.1 Released'
3 date: 2014-07-01 20:16:43 -0400
4 author: parkr
5 version: 2.1.1
6 categories: [release]
7 ---
8
9 This is a minor release for Jekyll 2.1.0. It fixes a couple bugs and
10 introduces fixes for a couple security-related issues.
11
12 It covers two security vulnerabilities:
13
14 1. One in the reading of data
15 2. One in the `layouts` setting
16
17 They were identified in Jekyll 1.5.1 and has been confirmed as patched
18 in this version and the version used by GitHub Pages. If you are in the
19 business of building Jekyll sites, please ensure you upgrade to 2.1.1 as
20 soon as possible.
21
22 For more, check out [`jekyll/jekyll#2563`](https://github.com/jekyll/jekyll/pull/2563).
23
24 Additionally, the dependency on Maruku has been loosened and a bug was
25 fixed with document URLs.
26
27 As always, check out the [full changelog](/docs/history/) for more info!
28
29 Happy Jekylling!
0 ---
1 layout: news_item
2 title: 'Jekyll 2.2.0 Released'
3 date: 2014-07-29 18:59:13 -0400
4 author: parkr
5 version: 2.2.0
6 categories: [release]
7 ---
8
9 Jekyll 2.2.0 contains a few key updates:
10
11 1. A warning will now fire if you specify a layout in any of your pages or
12 posts that doesn't exist.
13 2. Certain Pygments options are now whitelisted in safe mode
14 3. Categories in a post's path are now respected (i.e. folders in `_posts`
15 will now work properly).
16
17 As always, a full list of the updates are on the
18 [history page](/docs/history#v2-2-0). Happy Jekylling!
+0
-110
site/css/gridism.css less more
0 /*
1 * Gridism
2 * A simple, responsive, and handy CSS grid by @cobyism
3 * https://github.com/cobyism/gridism
4 */
5
6 /* Preserve some sanity */
7 .grid,
8 .unit {
9 -webkit-box-sizing: border-box;
10 -moz-box-sizing: border-box;
11 box-sizing: border-box;
12 }
13
14 /* Set up some rules to govern the grid */
15 .grid {
16 display: block;
17 clear: both;
18 }
19 .grid .unit {
20 float: left;
21 width: 100%;
22 padding: 10px;
23 }
24
25 /* This ensures the outer gutters are equal to the (doubled) inner gutters. */
26 .grid .unit:first-child { padding-left: 20px; }
27 .grid .unit:last-child { padding-right: 20px; }
28
29 /* Nested grids already have padding though, so let’s nuke it */
30 .unit .unit:first-child { padding-left: 0; }
31 .unit .unit:last-child { padding-right: 0; }
32 .unit .grid:first-child > .unit { padding-top: 0; }
33 .unit .grid:last-child > .unit { padding-bottom: 0; }
34
35 /* Let people nuke the gutters/padding completely in a couple of ways */
36 .no-gutters .unit,
37 .unit.no-gutters {
38 padding: 0 !important;
39 }
40
41 /* Wrapping at a maximum width is optional */
42 .wrap .grid,
43 .grid.wrap {
44 max-width: 978px;
45 margin: 0 auto;
46 }
47
48 /* Width classes also have shorthand versions numbered as fractions
49 * For example: for a grid unit 1/3 (one third) of the parent width,
50 * simply apply class="w-1-3" to the element. */
51 .grid .whole, .grid .w-1-1 { width: 100%; }
52 .grid .half, .grid .w-1-2 { width: 50%; }
53 .grid .one-third, .grid .w-1-3 { width: 33.3332%; }
54 .grid .two-thirds, .grid .w-2-3 { width: 66.6665%; }
55 .grid .one-quarter, .grid .w-1-4 { width: 25%; }
56 .grid .three-quarters, .grid .w-3-4 { width: 75%; }
57 .grid .one-fifth, .grid .w-1-5 { width: 20%; }
58 .grid .two-fifths, .grid .w-2-5 { width: 40%; }
59 .grid .three-fifths, .grid .w-3-5 { width: 60%; }
60 .grid .four-fifths, .grid .w-4-5 { width: 80%; }
61 .grid .golden-small, .grid .w-g-s { width: 38.2716%; } /* Golden section: smaller piece */
62 .grid .golden-large, .grid .w-g-l { width: 61.7283%; } /* Golden section: larger piece */
63
64 /* Utility classes */
65 .align-center { text-align: center; }
66 .align-left { text-align: left; }
67 .align-right { text-align: right; }
68 .pull-left { float: left; }
69 .pull-right { float: right; }
70
71 .show-on-mobiles {
72 display: none;
73 }
74
75 /* Responsive Stuff */
76 @media screen and (max-width: 568px) {
77 /* Stack anything that isn’t full-width on smaller screens */
78 .grid .unit {
79 width: 100% !important;
80 padding-left: 20px;
81 padding-right: 20px;
82 }
83 .unit .grid .unit {
84 padding-left: 0px;
85 padding-right: 0px;
86 }
87
88 /* Sometimes, you just want to be different on small screens */
89 .center-on-mobiles {
90 text-align: center !important;
91 }
92 .hide-on-mobiles {
93 display: none !important;
94 }
95 .show-on-mobiles {
96 display: block !important;
97 }
98 a .show-on-mobiles {
99 display: inline !important;
100 }
101 }
102
103 /* Expand the wrap a bit further on larger screens */
104 /*@media screen and (min-width: 1180px) {
105 .wrap .grid {
106 max-width: 1180px;
107 margin: 0 auto;
108 }
109 }*/
+0
-1
site/css/normalize.css less more
0 /* normalize.css v2.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:0.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}
+0
-70
site/css/pygments.css less more
0 /*.highlight { background: #333333; color: #ffffff}*/
1 .highlight .hll { background-color: #ffffcc }
2 .highlight .c { color: #87ceeb} /* Comment */
3 .highlight .err { color: #ffffff} /* Error */
4 .highlight .g { color: #ffffff} /* Generic */
5 .highlight .k { color: #f0e68c} /* Keyword */
6 .highlight .l { color: #ffffff} /* Literal */
7 .highlight .n { color: #ffffff} /* Name */
8 .highlight .o { color: #ffffff} /* Operator */
9 .highlight .x { color: #ffffff} /* Other */
10 .highlight .p { color: #ffffff} /* Punctuation */
11 .highlight .cm { color: #87ceeb} /* Comment.Multiline */
12 .highlight .cp { color: #cd5c5c} /* Comment.Preproc */
13 .highlight .c1 { color: #87ceeb} /* Comment.Single */
14 .highlight .cs { color: #87ceeb} /* Comment.Special */
15 .highlight .gd { color: #0000c0; font-weight: bold; background-color: #008080 } /* Generic.Deleted */
16 .highlight .ge { color: #c000c0; text-decoration: underline} /* Generic.Emph */
17 .highlight .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */
18 .highlight .gh { color: #cd5c5c} /* Generic.Heading */
19 .highlight .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */
20 .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. */
21 .highlight .gp { color: #ffffff} /* Generic.Prompt */
22 .highlight .gs { color: #ffffff} /* Generic.Strong */
23 .highlight .gu { color: #cd5c5c} /* Generic.Subheading */
24 .highlight .gt { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Traceback */
25 .highlight .kc { color: #f0e68c} /* Keyword.Constant */
26 .highlight .kd { color: #f0e68c} /* Keyword.Declaration */
27 .highlight .kn { color: #f0e68c} /* Keyword.Namespace */
28 .highlight .kp { color: #f0e68c} /* Keyword.Pseudo */
29 .highlight .kr { color: #f0e68c} /* Keyword.Reserved */
30 .highlight .kt { color: #bdb76b} /* Keyword.Type */
31 .highlight .ld { color: #ffffff} /* Literal.Date */
32 .highlight .m { color: #ffffff} /* Literal.Number */
33 .highlight .s { color: #ffffff} /* Literal.String */
34 .highlight .na { color: #ffffff} /* Name.Attribute */
35 .highlight .nb { color: #ffffff} /* Name.Builtin */
36 .highlight .nc { color: #ffffff} /* Name.Class */
37 .highlight .no { color: #ffa0a0} /* Name.Constant */
38 .highlight .nd { color: #ffffff} /* Name.Decorator */
39 .highlight .ni { color: #ffdead} /* Name.Entity */
40 .highlight .ne { color: #ffffff} /* Name.Exception */
41 .highlight .nf { color: #ffffff} /* Name.Function */
42 .highlight .nl { color: #ffffff} /* Name.Label */
43 .highlight .nn { color: #ffffff} /* Name.Namespace */
44 .highlight .nx { color: #ffffff} /* Name.Other */
45 .highlight .py { color: #ffffff} /* Name.Property */
46 .highlight .nt { color: #f0e68c} /* Name.Tag */
47 .highlight .nv { color: #98fb98} /* Name.Variable */
48 .highlight .ow { color: #ffffff} /* Operator.Word */
49 .highlight .w { color: #ffffff} /* Text.Whitespace */
50 .highlight .mf { color: #ffffff} /* Literal.Number.Float */
51 .highlight .mh { color: #ffffff} /* Literal.Number.Hex */
52 .highlight .mi { color: #ffffff} /* Literal.Number.Integer */
53 .highlight .mo { color: #ffffff} /* Literal.Number.Oct */
54 .highlight .sb { color: #ffffff} /* Literal.String.Backtick */
55 .highlight .sc { color: #ffffff} /* Literal.String.Char */
56 .highlight .sd { color: #ffffff} /* Literal.String.Doc */
57 .highlight .s2 { color: #ffffff} /* Literal.String.Double */
58 .highlight .se { color: #ffffff} /* Literal.String.Escape */
59 .highlight .sh { color: #ffffff} /* Literal.String.Heredoc */
60 .highlight .si { color: #ffffff} /* Literal.String.Interpol */
61 .highlight .sx { color: #ffffff} /* Literal.String.Other */
62 .highlight .sr { color: #ffffff} /* Literal.String.Regex */
63 .highlight .s1 { color: #ffffff} /* Literal.String.Single */
64 .highlight .ss { color: #ffffff} /* Literal.String.Symbol */
65 .highlight .bp { color: #ffffff} /* Name.Builtin.Pseudo */
66 .highlight .vc { color: #98fb98} /* Name.Variable.Class */
67 .highlight .vg { color: #98fb98} /* Name.Variable.Global */
68 .highlight .vi { color: #98fb98} /* Name.Variable.Instance */
69 .highlight .il { color: #ffffff} /* Literal.Number.Integer.Long */
0 ---
1 ---
2
3 {% capture screen %}
4 /* *\
5 * $normalize.css *
6 \* */
7 {% include css/normalize.css %}
8 /* *\
9 * $gridism.css *
10 \* */
11 {% include css/gridism.css %}
12 /* *\
13 * $style.css *
14 \* */
15 {% include css/style.css %}
16 /* *\
17 * $pygments.css *
18 \* */
19 {% include css/pygments.css %}
20 /* *\
21 * $font-awesome.css *
22 \* */
23 {% include css/font-awesome.css %}
24 {% endcapture %}
25
26 {% if site.GH_ENV %}
27 {{ screen | strip_newlines | remove: ' ' }}
28 {% else %}
29 {{ screen }}
30 {% endif %}
+0
-946
site/css/style.css less more
0 /* Base */
1
2 * {
3 box-sizing: border-box;
4 -webkit-box-sizing: border-box;
5 -moz-box-sizing: border-box;
6 }
7
8 body {
9 font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif;
10 font-size: 21px;
11 font-weight: 300;
12 color: #ddd;
13 background: #333;
14 border-top: 5px solid #fc0;
15 box-shadow: inset 0 3px 30px rgba(0,0,0,.3);
16 text-shadow: 0 1px 3px rgba(0,0,0,.5);
17 }
18
19 .clear {
20 display: block;
21 }
22
23 .clear:after {
24 content: " ";
25 display: block;
26 height: 0;
27 clear: both;
28 visibility: hidden;
29 }
30
31 /* Sections */
32
33 body > header, body > section, body > footer {
34 float: left;
35 width: 100%;
36 clear: both;
37 }
38
39 /* Header */
40
41 body > header h1, body > header nav {
42 display: inline-block;
43 }
44
45 body > header h1 span {
46 display: none;
47 }
48
49 nav ul {
50 padding: 0;
51 margin: 0;
52 }
53
54 nav li {
55 display: inline-block;
56 }
57
58 .main-nav {
59 margin-top: 52px;
60 }
61
62 .main-nav li {
63 margin-right: 10px;
64 }
65
66 .main-nav li a {
67 border-radius: 5px;
68 font-weight: 800;
69 font-size: 14px;
70 padding: 0.5em 1em;
71 text-shadow: none;
72 text-transform: uppercase;
73 transition: all .25s;
74 -moz-transition: all .25s;
75 -webkit-transition: all .25s;
76 }
77
78 .main-nav li a:hover {
79 background: #252525;
80 box-shadow: inset 0 1px 3px rgba(0,0,0,.5), 0 1px 0 rgba(255,255,255,.1);
81 text-shadow: 0 1px 3px rgba(0,0,0,.5);
82 }
83
84 .main-nav li.current a {
85 background: #fc0;
86 color: #222;
87 box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
88 text-shadow: 0 1px 0 rgba(255,255,255,.3);
89 }
90
91 .mobile-nav ul {
92 overflow: hidden;
93 width: 100%;
94 display: table;
95 }
96
97 .mobile-nav a {
98 float: left;
99 width: 100%;
100 background: #333;
101 color: #fc0;
102 text-align: center;
103 text-transform: uppercase;
104 font-size: 14px;
105 font-weight: 800;
106 padding: 5px;
107 border-radius: 5px;
108 }
109
110 .mobile-nav .current a {
111 background: #fc0;
112 color: #222;
113 box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 1px 5px rgba(0,0,0,.5);
114 text-shadow: 0 1px 0 rgba(255,255,255,.3);
115 }
116
117 .mobile-nav li {
118 display: table-cell;
119 width: 25%;
120 padding: 8px;
121 }
122
123 @media (max-width: 768px){
124 .main-nav ul {
125 text-align: right;
126 }
127 }
128 @media (max-width: 830px){
129 .main-nav .show-on-mobiles {
130 display: inline;
131 }
132 .main-nav .hide-on-mobiles {
133 display: none;
134 }
135 }
136
137 /* Footer */
138
139 body > footer {
140 background: #222;
141 font-size: 16px;
142 padding-bottom: 5px;
143 color: #888;
144 margin-top: 40px;
145 }
146
147 body > footer a {
148 color: #fff;
149 }
150
151 body > footer .align-right p, body > footer img {
152 display: inline-block;
153 }
154
155 body > footer img {
156 position: relative;
157 top: 8px;
158 margin-left: 5px;
159 width: 100px;
160 height: 30px;
161 opacity: .8;
162 padding: 1px;
163 -webkit-transition: opacity .2s;
164 -moz-transition: opacity .2s;
165 transition: opacity .2s;
166 }
167
168 body > footer a:hover img {
169 opacity: 1;
170 }
171
172 @media (max-width: 568px){
173 footer .one-third p {
174 margin-bottom: 0;
175 }
176 footer .two-thirds p {
177 margin-top: -20px;
178 }
179 }
180
181 /* Intro */
182
183 .intro .unit {
184 padding: 10px 0 40px;
185 }
186
187 .intro p {
188 font-size: 1.75em;
189 line-height: 1em;
190 margin: 0;
191 }
192
193 @media (min-width: 569px){
194 .intro p {
195 font-size: 3.2em;
196 }
197 }
198
199 /* Quickstart */
200
201 .quickstart {
202 background: #3F1F1F;
203 color: #fff;
204 margin: 60px 0;
205 box-shadow: inset 0 3px 10px rgba(0,0,0,.4);
206 }
207
208 .quickstart .content {
209 padding: 0px 0;
210 }
211
212 .quickstart h4 {
213 font-size: 24px;
214 line-height: 24px;
215 margin-top: 20px;
216 text-shadow: 0 1px 3px rgba(0,0,0,.8);
217 }
218
219 .quickstart .code {
220 font-size: 12px;
221 display: block;
222 margin: 0 0 -30px;
223 }
224
225 @media (min-width: 768px){
226 .quickstart .code {
227 font-size: 18px;
228 margin: -30px 0;
229 float: right;
230 }
231 .quickstart h4 {
232 margin: 50px 0 0;
233 text-align: center;
234 }
235 }
236
237 /* Code */
238
239 .quickstart .code {
240 display: block;
241 padding: 0;
242 font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
243 line-height: 1.3em;
244 }
245
246 .quickstart .code .title {
247 display: block;
248 text-align: center;
249 margin: 0 20px;
250 padding: 5px 0;
251 border-radius: 5px 5px 0 0;
252 box-shadow: 0 3px 10px rgba(0,0,0,.5);
253 font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
254 font-size: 16px;
255 font-weight: normal;
256 color: #444;
257 text-shadow: 0 1px 0 rgba(255,255,255,.5);
258 background: #f7f7f7;
259 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y3ZjdmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjclIiBzdG9wLWNvbG9yPSIjY2ZjZmNmIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2FhYWFhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=);
260 background: -moz-linear-gradient(top, #f7f7f7 0%, #cfcfcf 7%, #aaaaaa 100%);
261 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f7f7f7), color-stop(7%,#cfcfcf), color-stop(100%,#aaaaaa));
262 background: -webkit-linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%);
263 background: -o-linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%);
264 background: -ms-linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%);
265 background: linear-gradient(top, #f7f7f7 0%,#cfcfcf 7%,#aaaaaa 100%);
266 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f7f7f7', endColorstr='#aaaaaa',GradientType=0 );
267 border-bottom: 1px solid #111;
268 }
269
270 .quickstart .code .shell {
271 padding: 20px;
272 text-shadow: none;
273 margin: 0 20px;
274 background: #3d3d3d;
275 border-radius: 0 0 5px 5px;
276 box-shadow: 0 5px 30px rgba(0,0,0,.3);
277 }
278
279 .quickstart .code .line {
280 display: block;
281 margin: 0;
282 padding: 0;
283 }
284
285 .quickstart .code .line span {
286 display: inline-block;
287 }
288
289 .quickstart .code .path {
290 color: #87ceeb;
291 }
292
293 .quickstart .code .prompt {
294 color: #cd5c5c;
295 }
296
297 .quickstart .code .command {
298 color: #f0e68c;
299 }
300
301 .quickstart .code .output {
302 color: #888;
303 }
304
305 /* Free Hosting */
306
307 .free-hosting .pane {
308 background: #444;
309 border-radius: 10px;
310 text-shadow: none;
311 position: relative;
312 padding: 0 20px 30px;
313 }
314
315 .free-hosting img {
316 margin: -30px 0 0;
317 width: 180px;
318 height: 150px;
319 }
320
321 .free-hosting h2 {
322 font-size: 28px;
323 }
324
325 .free-hosting p,
326 .free-hosting a {
327 font-size: 16px;
328 }
329
330 .free-hosting p {
331 margin: .75em 0;
332 }
333
334 @media (min-width: 768px){
335 .free-hosting img {
336 float: left;
337 margin: -20px -30px -30px -50px;
338 width: 300px;
339 height: 251px;
340 }
341 .free-hosting .pane-content {
342 margin-top: 35px;
343 padding-right: 30px;
344 }
345 .free-hosting p,
346 .free-hosting a {
347 font-size: 18px;
348 }
349 .free-hosting .pane:after {
350 content: " ";
351 float: right;
352 background: url(../img/footer-arrow.png) top left no-repeat;
353 width: 73px;
354 height: 186px;
355 position: absolute;
356 right: 0;
357 bottom: -30px;
358 }
359 }
360
361 /* Article - Used for both docs and news */
362
363
364 article {
365 background: #444;
366 border-radius: 10px;
367 padding: 20px;
368 margin: 0 10px;
369 box-shadow: 0 3px 10px rgba(0,0,0,.1);
370 font-size: 16px;
371 }
372
373 @media (max-width: 480px){
374 article ul {
375 padding-left: 20px;
376 }
377 }
378
379 @media (max-width: 568px){
380 article {
381 margin: 0;
382 }
383 }
384
385 @media (min-width: 768px){
386 article {
387 padding: 40px 40px 30px;
388 font-size: 21px;
389 }
390 }
391
392 /* Right-side nav - used by both docs and news */
393
394 aside {
395 padding-top: 30px;
396 }
397
398 aside h4 {
399 text-transform: uppercase;
400 font-size: 14px;
401 font-weight: 700;
402 padding: 0 0 10px 30px;
403 margin-left: -30px;
404 display: inline-block;
405 border-bottom: 1px solid #c00;
406 }
407
408 aside ul {
409 padding-left: 0;
410 }
411
412 aside ul:first-child {
413 margin-top: 0;
414 }
415
416 aside li {
417 list-style-type: none;
418 }
419
420 aside li a {
421 font-size: 16px;
422 position: relative
423 }
424
425 aside li.current a:before {
426 content: "";
427 border-color: transparent transparent transparent #444;
428 border-style: solid;
429 border-width: 10px;
430 width: 0;
431 height: 0;
432 position: absolute;
433 top: 0;
434 left: -30px;
435 }
436
437 /* Documentation */
438
439 .docs article {
440 min-height: 800px;
441 }
442
443 .docs .content {
444 padding: 0;
445 }
446
447 .section-nav {
448 text-align: center;
449 padding-top: 40px;
450 position: relative;
451 background: url(../img/article-footer.png) top center no-repeat;
452 margin: 40px -20px 10px;
453 }
454
455 .section-nav > div {
456 width: 49.5%;
457 }
458
459 .section-nav a, .section-nav span {
460 color: #fff;
461 font-size: 16px;
462 text-transform: uppercase;
463 font-weight: 700;
464 padding: 8px 12px 10px;
465 border-radius: 5px;
466 /*border: 1px solid #333;*/
467 box-shadow: 0 1px 3px rgba(0,0,0,.3), inset 0 1px 1px rgba(255,255,255,.5);
468 background: #777;
469 }
470
471 .section-nav a:hover {
472 color: #fff;
473 background: #888;
474 }
475
476 .section-nav .next, .section-nav .prev {
477 position: relative;
478 }
479
480 .section-nav .next:after, .section-nav .prev:before {
481 font-size: 36px;
482 color: #222;
483 font-weight: 800;
484 text-shadow: 0 1px 0 rgba(255,255,255,.4);
485 position: absolute;
486 top: -7px;
487 }
488
489 .section-nav .next:after {
490 content: "›";
491 right: 10px;
492 }
493
494 .section-nav .prev:before {
495 content: "‹";
496 left: 10px;
497 }
498
499 .section-nav .prev, .section-nav .prev:hover {
500 /*float: left;*/
501 padding-left: 30px;
502 }
503
504 .section-nav .next, .section-nav .next:hover {
505 /*float: right;*/
506 padding-right: 30px;
507 }
508
509 .section-nav .disabled {
510 opacity: .5;
511 /*filter: alpha*/
512 cursor: default;
513 }
514
515 .docs-nav-mobile select {
516 width: 100%;
517 }
518
519 /* News */
520
521 article h2:first-child {
522 margin-top: 0;
523 }
524
525 .post-category,
526 .post-meta {
527 display: inline-block;
528 vertical-align: middle;
529 font-size: .8em;
530 }
531
532 .post-category {
533 display: inline-block;
534 margin-left: -30px;
535 padding: 6px 10px 8px;
536 padding-left: 50px;
537 border-radius: 0 5px 5px 0;
538 position: relative;
539 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);
540 background: #9e2812;
541 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
542 background: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
543 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9e2812), color-stop(100%,#6f0d0d));
544 background: -webkit-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
545 background: -o-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
546 background: -ms-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
547 background: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
548 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
549 }
550
551 .label {
552 float: left;
553 text-transform: uppercase;
554 font-weight: bold;
555 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
556 }
557
558 @media (max-width: 568px){
559 .post-category {
560 padding-left: 30px;
561 }
562 }
563
564 @media (min-width: 768px){
565 .post-category {
566 margin-left: -50px;
567 }
568 }
569
570 .post-category:before {
571 content: "";
572 position: absolute;
573 top: -10px;
574 left: 0px;
575 border-color: transparent #6f0d0d #6f0d0d transparent;
576 border-style: solid;
577 border-width: 5px;
578 width: 0;
579 height: 0;
580 }
581
582 .avatar {
583 width: 24px;
584 height: 24px;
585 border-radius: 3px;
586 display: inline-block;
587 vertical-align: middle;
588 }
589
590 .post-meta {
591 padding: 5px 0;
592 color: #aaa;
593 font-weight: 600;
594 text-shadow: 0 -1px 0 #000;
595 }
596
597 .post-date,
598 .post-author {
599 margin-left: 10px;
600 }
601
602 .news article + article {
603 margin-top: -10px;
604 border-radius: 0 0 10px 10px;
605 border-top: 1px solid #555;
606 box-shadow: 0 -1px 0 #2f2f2f;
607 }
608
609 /* Code Highlighting */
610
611
612 pre, code {
613 white-space: pre;
614 display: inline-block;
615 margin: 0;
616 padding: 0;
617 font-family: Menlo, Consolas, "Courier New", Courier, "Liberation Mono", monospace;
618 font-size: 14px;
619 padding: 0 .5em;
620 line-height: 1.8em;
621 }
622
623 @media (min-width: 768px){
624 pre, code {
625 font-size: 16px;
626 }
627 }
628
629 .highlight, p > pre, p > code, p > nobr > code, li > code, h5 > code, .note > code {
630 background: #333;
631 color: #fff;
632 border-radius: 5px;
633 box-shadow: inset 0 1px 10px rgba(0,0,0,.3),
634 0 1px 0 rgba(255,255,255,.1),
635 0 -1px 0 rgba(0,0,0,.5);
636 }
637
638 .note code {
639 background-color: rgba(0,0,0,0.2);
640 margin-left: 2.5px;
641 margin-right: 2.5px;
642 font-size: 0.8em;
643 }
644
645 .highlight {
646 padding: 10px 0;
647 width: 100%;
648 overflow: auto;
649 }
650
651 /* HTML Elements */
652
653 h1, h2, h3, h4, h5, h6 {
654 margin: 0;
655 }
656
657 a {
658 color: #fc0;
659 text-decoration: none;
660 transition: all .25s;
661 -moz-transition: all .25s;
662 -webkit-transition: all .25s;
663 }
664
665 a:hover {
666 color: #f90;
667 }
668
669 strong {
670 font-weight: 700;
671 }
672
673 p {
674 line-height: 1.5em;
675 }
676
677 .left { float: left; }
678 .right { float: right; }
679 .align-right { text-align: right; }
680 .align-left { text-align: left; }
681 .align-center { text-align: center; }
682
683 /* Article HTML */
684
685 article h2,
686 article h3,
687 article h4,
688 article h5,
689 article h6 {
690 margin: 1em 0;
691 }
692
693 article h4 {
694 color: #fff;
695 }
696
697 h5, h6 {
698 font-size: 1em;
699 font-style: italic;
700 }
701
702 article ul li p {
703 margin: 0;
704 }
705
706 article ul li, article ol li {
707 line-height: 1.5em;
708 margin-bottom: 0.5em;
709 }
710
711 article ul li blockquote {
712 margin: 10px 0;
713 }
714
715 blockquote {
716 border-left: 2px solid #777;
717 padding-left: 20px;
718 font-style: italic;
719 font-size: 18px;
720 font-weight: 500;
721 }
722
723
724 /* Tables */
725
726 table {
727 width: 100%;
728 background: #555;
729 margin: .5em 0;
730 border-radius: 5px;
731 box-shadow: 0 1px 3px rgba(0,0,0,.3);
732 }
733
734 thead {
735 border-top-left-radius: 5px;
736 border-top-right-radius: 5px;
737 color: #fff;
738 background: #3a3a3a;
739 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzNhM2EzYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxZTFlMWUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
740 background: -moz-linear-gradient(top, #3a3a3a 0%, #1e1e1e 100%);
741 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3a3a3a), color-stop(100%,#1e1e1e));
742 background: -webkit-linear-gradient(top, #3a3a3a 0%,#1e1e1e 100%);
743 background: -o-linear-gradient(top, #3a3a3a 0%,#1e1e1e 100%);
744 background: -ms-linear-gradient(top, #3a3a3a 0%,#1e1e1e 100%);
745 background: linear-gradient(to bottom, #3a3a3a 0%,#1e1e1e 100%);
746 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3a3a3a', endColorstr='#1e1e1e',GradientType=0 );
747 }
748
749 thead th {
750 position: relative;
751 box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
752 }
753
754 thead th:first-child {
755 border-top-left-radius: 5px;
756 }
757
758 thead th:last-child {
759 border-top-right-radius: 5px;
760 }
761
762 td {
763 padding: .5em .75em;
764 }
765
766 td p {
767 margin: 0;
768 }
769
770 th {
771 text-transform: uppercase;
772 font-size: 16px;
773 padding: .5em .75em;
774 text-shadow: 0 -1px 0 rgba(0,0,0,.9);
775 color: #888;
776 }
777
778 tbody td {
779 border-top: 1px solid rgba(0,0,0,.1);
780 box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
781 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=);
782 background: -moz-linear-gradient(top, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
783 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.1)), color-stop(100%,rgba(255,255,255,0)));
784 background: -webkit-linear-gradient(top, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%);
785 background: -o-linear-gradient(top, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%);
786 background: -ms-linear-gradient(top, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%);
787 background: linear-gradient(to bottom, rgba(255,255,255,0.1) 0%,rgba(255,255,255,0) 100%);
788 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1affffff', endColorstr='#00ffffff',GradientType=0 );
789 }
790
791 td p {
792 font-size: 16px;
793 }
794
795 td p code {
796 font-size: 14px;
797 }
798
799 code.option, th .option, code.filter, th .filter {
800 color: #50B600;
801 }
802
803 code.flag, th .flag, code.output, th .output {
804 color: #049DCE;
805 }
806
807 code.option, code.flag, code.filter, code.output {
808 margin-bottom: 2px;
809 }
810
811 /* Note types */
812
813 .note {
814 margin: 30px 0;
815 margin-left: -30px;
816 padding: 20px 20px 24px;
817 padding-left: 50px;
818 border-radius: 0 5px 5px 0;
819 position: relative;
820 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);
821 background: #7e6d42;
822 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzdlNmQ0MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1YzRlMzUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
823 background: -moz-linear-gradient(top, #7e6d42 0%, #5c4e35 100%);
824 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#7e6d42), color-stop(100%,#5c4e35));
825 background: -webkit-linear-gradient(top, #7e6d42 0%,#5c4e35 100%);
826 background: -o-linear-gradient(top, #7e6d42 0%,#5c4e35 100%);
827 background: -ms-linear-gradient(top, #7e6d42 0%,#5c4e35 100%);
828 background: linear-gradient(to bottom, #7e6d42 0%,#5c4e35 100%);
829 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7e6d42', endColorstr='#5c4e35',GradientType=0 );
830 }
831
832 @media (max-width: 568px){
833 .note {
834 margin-right: -30px;
835 }
836 }
837
838 @media (min-width: 768px){
839 .note {
840 margin-left: -50px;
841 }
842 }
843
844 .note:before {
845 content: "";
846 position: absolute;
847 top: -10px;
848 left: 0px;
849 border-color: transparent #222 #222 transparent;
850 border-style: solid;
851 border-width: 5px;
852 width: 0;
853 height: 0;
854 }
855
856 .note h5, .note p {
857 margin: 0;
858 color: #fff;
859 }
860
861 .note h5 {
862 line-height: 1.5em;
863 font-weight: 800;
864 font-style: normal;
865 }
866
867 .note p {
868 font-weight: 400;
869 font-size: .75em;
870 }
871
872 .info {
873 background: #0389aa;
874 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAzODlhYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDYxN2YiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
875 background: -moz-linear-gradient(top, #0389aa 0%, #00617f 100%);
876 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0389aa), color-stop(100%,#00617f));
877 background: -webkit-linear-gradient(top, #0389aa 0%,#00617f 100%);
878 background: -o-linear-gradient(top, #0389aa 0%,#00617f 100%);
879 background: -ms-linear-gradient(top, #0389aa 0%,#00617f 100%);
880 background: linear-gradient(to bottom, #0389aa 0%,#00617f 100%);
881 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0389aa', endColorstr='#00617f',GradientType=0 );
882 }
883
884 .warning {
885 background: #9e2812;
886 background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllMjgxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2ZjBkMGQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
887 background: -moz-linear-gradient(top, #9e2812 0%, #6f0d0d 100%);
888 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9e2812), color-stop(100%,#6f0d0d));
889 background: -webkit-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
890 background: -o-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
891 background: -ms-linear-gradient(top, #9e2812 0%,#6f0d0d 100%);
892 background: linear-gradient(to bottom, #9e2812 0%,#6f0d0d 100%);
893 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9e2812', endColorstr='#6f0d0d',GradientType=0 );
894 }
895
896 .info:before {
897 border-color: transparent #00617f #00617f transparent;
898 }
899
900 .warning:before {
901 border-color: transparent #6f0d0d #6f0d0d transparent;
902 }
903
904 .note:after {
905 content: "★";
906 color: #fc0;
907 position: absolute;
908 top: 14px;
909 left: 14px;
910 font-size: 28px;
911 font-weight: bold;
912 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
913 }
914
915 .info:after {
916 content: "ⓘ";
917 color: #fff;
918 position: absolute;
919 top: 15px;
920 left: 15px;
921 font-size: 28px;
922 font-weight: bold;
923 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
924 }
925
926 .warning:after {
927 content: "‼";
928 color: #fc0;
929 position: absolute;
930 top: 15px;
931 left: 15px;
932 font-size: 32px;
933 font-weight: bold;
934 text-shadow: 0 -1px 0 rgba(0,0,0,.5);
935 }
936
937 /* Responsive tables */
938
939 @media (max-width: 768px){
940 .mobile-side-scroller {
941 overflow-x: scroll;
942 margin: 0 -40px;
943 padding: 0 10px;
944 }
945 }
0 ---
1 layout: docs
2 title: Assets
3 prev_section: datafiles
4 next_section: migrations
5 permalink: /docs/assets/
6 ---
7
8 Jekyll provides built-in support for Sass and CoffeeScript. In order to use
9 them, create a file with the proper extension name (one of `.sass`, `.scss`,
10 or `.coffee`) and start the file with two lines of triple dashes, like this:
11
12 {% highlight sass %}
13 ---
14 ---
15
16 // start content
17 .my-definition
18 font-size: 1.2em
19 {% endhighlight %}
20
21 Jekyll treats these files the same as a regular page, in that the output file
22 will be placed in the same directory that it came from. For instance, if you
23 have a file named `css/styles.scss` in your site's source folder, Jekyll
24 will process it and put it in your site's destination folder under
25 `css/styles.css`.
26
27 ## Sass/SCSS
28
29 Jekyll allows you to customize your Sass conversion in certain ways.
30
31 If you are using Sass `@import` statements, you'll need to ensure that your
32 `sass_dir` is set to the base directory that contains your Sass files. You
33 can do that thusly:
34
35 {% highlight yaml %}
36 sass:
37 sass_dir: _sass
38 {% endhighlight %}
39
40 The Sass converter will default the `sass_dir` configuration option to
41 `_sass`.
42
43 <div class="note info">
44 <h5>The <code>sass_dir</code> is only used by Sass</h5>
45 <p>
46
47 Note that the `sass_dir` becomes the load path for Sass imports,
48 nothing more. This means that Jekyll does not know about these files
49 directly, so any files here should not contain the YAML front matter as
50 described above nor will they be transformed as described above. This
51 folder should only contain imports.
52
53 </p>
54 </div>
55
56 You may also specify the output style with the `style` option in your
57 `_config.yml` file:
58
59 {% highlight yaml %}
60 sass:
61 style: :compressed
62 {% endhighlight %}
63
64 These are passed to Sass, so any output style options Sass supports are valid
65 here, too.
0 ---
1 layout: docs
2 title: Collections
3 prev_section: variables
4 next_section: datafiles
5 permalink: /docs/collections/
6 ---
7
8 <div class="note warning">
9 <h5>Collections support is unstable and may change</h5>
10 <p>
11 This is an experimental feature and that the API may likely change until the feature stabilizes.
12 </p>
13 </div>
14
15 Not everything is a post or a page. Maybe you want to document the various methods in your open source project, members of a team, or talks at a conference. Collections allow you to define a new type of document that behave like Pages or Posts do normally, but also have their own unique properties and namespace.
16
17 ## Using Collections
18
19 ### Step 1: Tell Jekyll to read in your collection
20
21 Add the following to your site's `_config.yml` file, replacing `my_collection` with the name of your collection:
22
23 {% highlight yaml %}
24 collections:
25 - my_collection
26 {% endhighlight %}
27
28 You can optionally specify metadata for your collection in the configuration:
29
30 {% highlight yaml %}
31 collections:
32 my_collection:
33 foo: bar
34 {% endhighlight %}
35
36 ### Step 2: Add your content
37
38 Create a corresponding folder (e.g. `<source>/_my_collection`) and add documents.
39 YAML front-matter is read in as data if it exists, if not, then everything is just stuck in the Document's `content` attribute.
40
41 Note: the folder must be named identical to the collection you defined in you config.yml file, with the addition of the preceding `_` character.
42
43 ### Step 3: Optionally render your collection's documents into independent files
44
45 If you'd like Jekyll to create a public-facing, rendered version of each document in your collection, set the `output` key to `true` in your collection metadata in your `_config.yml`:
46
47 {% highlight yaml %}
48 collections:
49 my_collection:
50 output: true
51 {% endhighlight %}
52
53 This will produce a file for each document in the collection.
54 For example, if you have `_my_collection/some_subdir/some_doc.md`,
55 it will be rendered using Liquid and the Markdown converter of your
56 choice and written out to `<dest>/my_collection/some_subdir/some_doc.html`.
57
58 As for posts with [Permalinks](../permalinks/), document URL can be customized by setting a `permalink` metadata to the collection:
59
60 {% highlight yaml %}
61 collections:
62 my_collection:
63 output: true
64 permalink: /awesome/:path/
65 {% endhighlight %}
66
67 For example, if you have `_my_collection/some_subdir/some_doc.md`, it will be written out to `<dest>/awesome/some_subdir/some_doc/index.html`.
68
69 <div class="mobile-side-scroller">
70 <table>
71 <thead>
72 <tr>
73 <th>Variable</th>
74 <th>Description</th>
75 </tr>
76 </thead>
77 <tbody>
78 <tr>
79 <td>
80 <p><code>collection</code></p>
81 </td>
82 <td>
83 <p>Label of the containing collection</p>
84 </td>
85 </tr>
86 <tr>
87 <td>
88 <p><code>path</code></p>
89 </td>
90 <td>
91 <p>Path to the document relative to the collection's directory</p>
92 </td>
93 </tr>
94 <tr>
95 <td>
96 <p><code>output_ext</code></p>
97 </td>
98 <td>
99 <p>Extension of the output file</p>
100 </td>
101 </tr>
102 </tbody>
103 </table>
104 </div>
105
106 ## Liquid Attributes
107
108 ### Collections
109
110 Each collection is accessible via the `site` Liquid variable. For example, if you want to access the `albums` collection found in `_albums`, you'd use `site.albums`. Each collection is itself an array of documents (e.g. `site.albums` is an array of documents, much like `site.pages` and `site.posts`). See below for how to access attributes of those documents.
111
112 The collections are also available under `site.collections`, with the metadata you specified in your `_config.yml` (if present) and the following information:
113
114 <div class="mobile-side-scroller">
115 <table>
116 <thead>
117 <tr>
118 <th>Variable</th>
119 <th>Description</th>
120 </tr>
121 </thead>
122 <tbody>
123 <tr>
124 <td>
125 <p><code>label</code></p>
126 </td>
127 <td>
128 <p>
129 The name of your collection, e.g. <code>my_collection</code>.
130 </p>
131 </td>
132 </tr>
133 <tr>
134 <td>
135 <p><code>docs</code></p>
136 </td>
137 <td>
138 <p>
139 An array of <a href="#documents">documents</a>.
140 </p>
141 </td>
142 </tr>
143 <tr>
144 <td>
145 <p><code>relative_directory</code></p>
146 </td>
147 <td>
148 <p>
149 The path to the collections's source directory, relative to the site source.
150 </p>
151 </td>
152 </tr>
153 <tr>
154 <td>
155 <p><code>directory</code></p>
156 </td>
157 <td>
158 <p>
159 The full path to the collections's source directory.
160 </p>
161 </td>
162 </tr>
163 <tr>
164 <td>
165 <p><code>output</code></p>
166 </td>
167 <td>
168 <p>
169 Whether the collection's documents will be output as individual files.
170 </p>
171 </td>
172 </tr>
173 </tbody>
174 </table>
175 </div>
176
177
178 ### Documents
179
180 In addition to any YAML front-matter provided in the document's corresponding file, each document has the following attributes:
181
182 <div class="mobile-side-scroller">
183 <table>
184 <thead>
185 <tr>
186 <th>Variable</th>
187 <th>Description</th>
188 </tr>
189 </thead>
190 <tbody>
191 <tr>
192 <td>
193 <p><code>content</code></p>
194 </td>
195 <td>
196 <p>
197 The (unrendered) content of the document. If no YAML front-matter is provided,
198 this is the entirety of the file contents. If YAML front-matter
199 is used, then this is all the contents of the file after the terminating
200 `---` of the front-matter.
201 </p>
202 </td>
203 </tr>
204 <tr>
205 <td>
206 <p><code>output</code></p>
207 </td>
208 <td>
209 <p>
210 The rendered output of the document, based on the <code>content</code>.
211 </p>
212 </td>
213 </tr>
214 <tr>
215 <td>
216 <p><code>path</code></p>
217 </td>
218 <td>
219 <p>
220 The full path to the document's source file.
221 </p>
222 </td>
223 </tr>
224 <tr>
225 <td>
226 <p><code>relative_path</code></p>
227 </td>
228 <td>
229 <p>
230 The path to the document's source file relative to the site source.
231 </p>
232 </td>
233 </tr>
234 <tr>
235 <td>
236 <p><code>url</code></p>
237 </td>
238 <td>
239 <p>
240 The URL of the rendered collection. The file is only written to the
241 destination when the name of the collection to which it belongs is
242 included in the <code>render</code> key in the site's configuration file.
243 </p>
244 </td>
245 </tr>
246 <tr>
247 <td>
248 <p><code>collection</code></p>
249 </td>
250 <td>
251 <p>
252 The name of the document's collection.
253 </p>
254 </td>
255 </tr>
256 </tbody>
257 </table>
258 </div>
3030 </tr>
3131 </thead>
3232 <tbody>
33 <tr class='setting'>
34 <td>
35 <p class='name'><strong>Site Source</strong></p>
36 <p class='description'>Change the directory where Jekyll will read files</p>
33 <tr class="setting">
34 <td>
35 <p class="name"><strong>Site Source</strong></p>
36 <p class="description">Change the directory where Jekyll will read files</p>
3737 </td>
3838 <td class="align-center">
3939 <p><code class="option">source: DIR</code></p>
4040 <p><code class="flag">-s, --source DIR</code></p>
4141 </td>
4242 </tr>
43 <tr class='setting'>
44 <td>
45 <p class='name'><strong>Site Destination</strong></p>
46 <p class='description'>Change the directory where Jekyll will write files</p>
43 <tr class="setting">
44 <td>
45 <p class="name"><strong>Site Destination</strong></p>
46 <p class="description">Change the directory where Jekyll will write files</p>
4747 </td>
4848 <td class="align-center">
4949 <p><code class="option">destination: DIR</code></p>
5050 <p><code class="flag">-d, --destination DIR</code></p>
5151 </td>
5252 </tr>
53 <tr class='setting'>
54 <td>
55 <p class='name'><strong>Safe</strong></p>
56 <p class='description'>Disable <a href="../plugins/">custom plugins</a>.</p>
53 <tr class="setting">
54 <td>
55 <p class="name"><strong>Safe</strong></p>
56 <p class="description">Disable <a href="../plugins/">custom plugins, and ignore symbolic links</a>.</p>
5757 </td>
5858 <td class="align-center">
5959 <p><code class="option">safe: BOOL</code></p>
6060 <p><code class="flag">--safe</code></p>
6161 </td>
6262 </tr>
63 <tr class='setting'>
64 <td>
65 <p class='name'><strong>Exclude</strong></p>
66 <p class="description">Exclude directories and/or files from the conversion</p>
67 </td>
68 <td class='align-center'>
63 <tr class="setting">
64 <td>
65 <p class="name"><strong>Exclude</strong></p>
66 <p class="description">
67 Exclude directories and/or files from the
68 conversion. These exclusions are relative to the site's
69 source directory and cannot be outside the source directory.
70 </p>
71 </td>
72 <td class="align-center">
6973 <p><code class="option">exclude: [DIR, FILE, ...]</code></p>
7074 </td>
7175 </tr>
72 <tr class='setting'>
73 <td>
74 <p class='name'><strong>Include</strong></p>
76 <tr class="setting">
77 <td>
78 <p class="name"><strong>Include</strong></p>
7579 <p class="description">
7680 Force inclusion of directories and/or files in the conversion.
7781 <code>.htaccess</code> is a good example since dotfiles are excluded
7882 by default.
7983 </p>
8084 </td>
81 <td class='align-center'>
85 <td class="align-center">
8286 <p><code class="option">include: [DIR, FILE, ...]</code></p>
8387 </td>
8488 </tr>
85 <tr class='setting'>
86 <td>
87 <p class='name'><strong>Time Zone</strong></p>
89 <tr class="setting">
90 <td>
91 <p class="name"><strong>Time Zone</strong></p>
8892 <p class="description">
8993 Set the time zone for site generation. This sets the <code>TZ</code>
9094 environment variable, which Ruby uses to handle time and date
9195 creation and manipulation. Any entry from the
9296 <a href="http://en.wikipedia.org/wiki/Tz_database">IANA Time Zone
93 Database</a> is valid, e.g. <code>America/New_York</code>. The default
94 is the local time zone, as set by your operating system.
97 Database</a> is valid, e.g. <code>America/New_York</code>. A list of all
98 available values can be found <a href="http://en.wikipedia.org/wiki/List_of_tz_database_time_zones">
99 here</a>. The default is the local time zone, as set by your operating system.
95100 </p>
96101 </td>
97 <td class='align-center'>
102 <td class="align-center">
98103 <p><code class="option">timezone: TIMEZONE</code></p>
99104 </td>
100105 </tr>
101 <tr class='setting'>
102 <td>
103 <p class='name'><strong>Encoding</strong></p>
106 <tr class="setting">
107 <td>
108 <p class="name"><strong>Encoding</strong></p>
104109 <p class="description">
105110 Set the encoding of files by name. Only available for Ruby
106111 1.9 or later).
107 The default value is nil, which use Ruby default,
108 <code>ASCII-8BIT</code>.
109 Available encoding for the ruby in use, can be shown by
110 command <code>ruby -e 'puts Encoding::list.join("\n")'</code>
112 The default value is <code>utf-8</code> starting in 2.0.0,
113 and <code>nil</code> before 2.0.0, which will yield the Ruby
114 default of <code>ASCII-8BIT</code>.
115 Available encodings can be shown by the
116 command <code>ruby -e 'puts Encoding::list.join("\n")'</code>.
111117 </p>
112118 </td>
119 <td class="align-center">
120 <p><code class="option">encoding: ENCODING</code></p>
121 </td>
122 </tr>
123 <tr>
124 <td>
125 <p class='name'><strong>Defaults</strong></p>
126 <p class='description'>
127 Set defaults for <a href="../frontmatter/" title="YAML frontmatter">YAML frontmatter</a>
128 variables.
129 </p>
130 </td>
113131 <td class='align-center'>
114 <p><code class="option">encoding: ENCODING</code></p>
132 <p>see <a href="#frontmatter-defaults" title="details">below</a></p>
115133 </td>
116134 </tr>
117135 </tbody>
129147 </tr>
130148 </thead>
131149 <tbody>
132 <tr class='setting'>
133 <td>
134 <p class='name'><strong>Regeneration</strong></p>
135 <p class='description'>Enable auto-regeneration of the site when files are modified.</p>
150 <tr class="setting">
151 <td>
152 <p class="name"><strong>Regeneration</strong></p>
153 <p class="description">Enable auto-regeneration of the site when files are modified.</p>
136154 </td>
137155 <td class="align-center">
138156 <p><code class="flag">-w, --watch</code></p>
139157 </td>
140158 </tr>
141 <tr class='setting'>
142 <td>
143 <p class='name'><strong>Configuration</strong></p>
159 <tr class="setting">
160 <td>
161 <p class="name"><strong>Configuration</strong></p>
144162 <p class="description">Specify config files instead of using <code>_config.yml</code> automatically. Settings in later files override settings in earlier files.</p>
145163 </td>
146 <td class='align-center'>
164 <td class="align-center">
147165 <p><code class="flag">--config FILE1[,FILE2,...]</code></p>
148166 </td>
149167 </tr>
150 <tr class='setting'>
151 <td>
152 <p class='name'><strong>Drafts</strong></p>
168 <tr class="setting">
169 <td>
170 <p class="name"><strong>Drafts</strong></p>
153171 <p class="description">Process and render draft posts.</p>
154172 </td>
155 <td class='align-center'>
173 <td class="align-center">
156174 <p><code class="flag">--drafts</code></p>
157175 </td>
158176 </tr>
159 <tr class='setting'>
160 <td>
161 <p class='name'><strong>Future</strong></p>
177 <tr class="setting">
178 <td>
179 <p class="name"><strong>Future</strong></p>
162180 <p class="description">Publish posts with a future date.</p>
163181 </td>
164 <td class='align-center'>
182 <td class="align-center">
165183 <p><code class="option">future: BOOL</code></p>
166184 <p><code class="flag">--future</code></p>
167185 </td>
168186 </tr>
169 <tr class='setting'>
170 <td>
171 <p class='name'><strong>LSI</strong></p>
187 <tr class="setting">
188 <td>
189 <p class="name"><strong>LSI</strong></p>
172190 <p class="description">Produce an index for related posts.</p>
173191 </td>
174 <td class='align-center'>
192 <td class="align-center">
175193 <p><code class="option">lsi: BOOL</code></p>
176194 <p><code class="flag">--lsi</code></p>
177195 </td>
178196 </tr>
179 <tr class='setting'>
180 <td>
181 <p class='name'><strong>Limit Posts</strong></p>
197 <tr class="setting">
198 <td>
199 <p class="name"><strong>Limit Posts</strong></p>
182200 <p class="description">Limit the number of posts to parse and publish.</p>
183201 </td>
184 <td class='align-center'>
202 <td class="align-center">
185203 <p><code class="option">limit_posts: NUM</code></p>
186204 <p><code class="flag">--limit_posts NUM</code></p>
187205 </td>
205223 </tr>
206224 </thead>
207225 <tbody>
208 <tr class='setting'>
209 <td>
210 <p class='name'><strong>Local Server Port</strong></p>
211 <p class='description'>Listen on the given port.</p>
226 <tr class="setting">
227 <td>
228 <p class="name"><strong>Local Server Port</strong></p>
229 <p class="description">Listen on the given port.</p>
212230 </td>
213231 <td class="align-center">
214232 <p><code class="option">port: PORT</code></p>
215233 <p><code class="flag">--port PORT</code></p>
216234 </td>
217235 </tr>
218 <tr class='setting'>
219 <td>
220 <p class='name'><strong>Local Server Hostname</strong></p>
221 <p class='description'>Listen at the given hostname.</p>
236 <tr class="setting">
237 <td>
238 <p class="name"><strong>Local Server Hostname</strong></p>
239 <p class="description">Listen at the given hostname.</p>
222240 </td>
223241 <td class="align-center">
224242 <p><code class="option">host: HOSTNAME</code></p>
225243 <p><code class="flag">--host HOSTNAME</code></p>
226244 </td>
227245 </tr>
228 <tr class='setting'>
229 <td>
230 <p class='name'><strong>Base URL</strong></p>
231 <p class='description'>Serve the website from the given base URL</p>
246 <tr class="setting">
247 <td>
248 <p class="name"><strong>Base URL</strong></p>
249 <p class="description">Serve the website from the given base URL</p>
232250 </td>
233251 <td class="align-center">
234252 <p><code class="option">baseurl: URL</code></p>
235253 <p><code class="flag">--baseurl URL</code></p>
236254 </td>
237255 </tr>
238 <tr class='setting'>
239 <td>
240 <p class='name'><strong>Detach</strong></p>
241 <p class='description'>Detach the server from the terminal</p>
256 <tr class="setting">
257 <td>
258 <p class="name"><strong>Detach</strong></p>
259 <p class="description">Detach the server from the terminal</p>
242260 </td>
243261 <td class="align-center">
244262 <p><code class="option">detach: BOOL</code></p>
256274 default settings. Use spaces instead.
257275 </p>
258276 </div>
277
278 ## Frontmatter defaults
279
280 Using [YAML front-matter](../frontmatter/) is one way that you can specify configuration in the pages and posts for your site. Setting things like a default layout, or customizing the title, or specifying a more precise date/time for the post can all be added to your page or post front-matter.
281
282 Often times, you will find that you are repeating a lot of configuration options. Setting the same layout in each file, adding the same category - or categories - to a post, etc. You can even add custom variables like author names, which might be the same for the majority of posts on your blog.
283
284 Instead of repeating this configuration each time you create a new post or page, Jekyll provides a way to set these defaults in the site configuration. To do this, you can specify site-wide defaults using the `defaults` key in the `_config.yml` file in your projects root directory.
285
286 The `defaults` key holds an array of scope/values pairs that define what defaults should be set for a particular file path, and optionally, a file type in that path.
287
288 Let's say that you want to add a default layout to all pages and posts in your site. You would add this to your `_config.yml` file:
289
290 {% highlight yaml %}
291 defaults:
292 -
293 scope:
294 path: "" # an empty string here means all files in the project
295 values:
296 layout: "default"
297 {% endhighlight %}
298
299 Here, we are scoping the `values` to any file that exists in the scopes path. Since the path is set as an empty string, it will apply to **all files** in your project. You probably don't want to set a layout on every file in your project - like css files, for example - so you can also specify a `type` value under the `scope` key.
300
301 {% highlight yaml %}
302 defaults:
303 -
304 scope:
305 path: "" # an empty string here means all files in the project
306 type: "post"
307 values:
308 layout: "default"
309 {% endhighlight %}
310
311 Now, this will only set the layout for files where the type is `post`.
312 The different types that are available to you are `page`, `post`, `draft` or any collection in your site. While `type` is optional, you must specify a value for `path` when creating a `scope/values` pair.
313
314 As mentioned earlier, you can set multiple scope/values pairs for `defaults`.
315
316 {% highlight yaml %}
317 defaults:
318 -
319 scope:
320 path: ""
321 type: "post"
322 values:
323 layout: "my-site"
324 -
325 scope:
326 path: "projects"
327 type: "page"
328 values:
329 layout: "project" # overrides previous default layout
330 author: "Mr. Hyde"
331 category: "project"
332 {% endhighlight %}
333
334 With these defaults, all posts would use the `my-site` layout. Any html files that exist in the `projects/` folder will use the `project` layout, if it exists. Those files will also have the `page.author` [liquid variable](../variables/) set to `Mr. Hyde` as well as have the category for the page set to `project`.
335
336 {% highlight yaml %}
337 collections:
338 - my_collection:
339 output: true
340
341 defaults:
342 -
343 scope:
344 path: ""
345 type: "my_collection" # a collection in your site
346 values:
347 layout: "default"
348 {% endhighlight %}
349
350 In this example the `layout` is set to `default` inside the [collection](../collections) with the name `my_collection`.
351
352 ### Precedence
353
354 Jekyll will apply all of the configuration settings you specify in the `defaults` section of your `_config.yml` file. However, you can choose to override settings from other scope/values pair by specifying a more specific path for the scope.
355
356 You can see that in the last example above. First, we set the default layout to `my-site`. Then, using a more specific path, we set the default layout for files in the `projects/` path to `project`. This can be done with any value that you would set in the page or post front-matter.
357
358 Finally, if you set defaults in the site configuration by adding a `defaults` section to your `_config.yml` file, you can override those settings in a post or page file. All you need to do is specify the settings in the post or page front-matter. For example:
359
360 {% highlight yaml %}
361 # In _config.yml
362 ...
363 defaults:
364 -
365 scope:
366 path: "projects"
367 type: "page"
368 values:
369 layout: "project"
370 author: "Mr. Hyde"
371 category: "project"
372 ...
373 {% endhighlight %}
374
375 {% highlight yaml %}
376 # In projects/foo_project.md
377 ---
378 author: "John Smith"
379 layout: "foobar"
380 ---
381 The post text goes here...
382 {% endhighlight %}
383
384 The `projects/foo_project.md` would have the `layout` set to `foobar` instead of `project` and the `author` set to `John Smith` instead of `Mr. Hyde` when the site is built.
259385
260386 ## Default Configuration
261387
285411 encoding: nil
286412
287413 future: true
288 show_drafts: nil
414 show_drafts: false
289415 limit_posts: 0
290 pygments: true
416 highlighter: pygments
291417
292418 relative_permalinks: true
293419
294420 permalink: date
295421 paginate_path: 'page:num'
296
297 markdown: maruku
298 markdown_ext: markdown,mkd,mkdn,md
422 paginate: nil
423
424 markdown: kramdown
425 markdown_ext: markdown,mkdown,mkdn,mkd,md
299426 textile_ext: textile
300427
301428 excerpt_separator: "\n\n"
305432 server: false # deprecated
306433 host: 0.0.0.0
307434 port: 4000
308 baseurl: /
309 url: http://localhost:4000
435 baseurl: ""
310436 lsi: false
311437
312438 maruku:
343469 hard_breaks: true
344470 {% endhighlight %}
345471
346
347472 ## Markdown Options
348473
349474 The various Markdown renderers supported by Jekyll sometimes have extra options available.
362487 # ...ruby code
363488 ```
364489
365 With both fenced code blocks and pygments enabled, this will statically highlight the code; without pygments, it will add a `class="LANGUAGE"` attribute to the `<code>` element, which can be used as a hint by various JavaScript code highlighting libraries.
490 With both fenced code blocks and highlighter enabled, this will statically highlight the code; without any syntax highlighter, it will add a `class="LANGUAGE"` attribute to the `<code>` element, which can be used as a hint by various JavaScript code highlighting libraries.
366491 - `smart` --- This pseudo-extension turns on SmartyPants, which converts straight quotes to curly quotes and runs of hyphens to em (`---`) and en (`--`) dashes.
367492
368493 All other extensions retain their usual names from Redcarpet, and no renderer options aside from `smart` can be specified in Jekyll. [A list of available extensions can be found in the Redcarpet README file.][redcarpet_extensions] Make sure you're looking at the README for the right version of Redcarpet: Jekyll currently uses v2.2.x, and extensions like `footnotes` and `highlight` weren't added until after version 3.0.0. The most commonly used extensions are:
372497 - `autolink`
373498
374499 [redcarpet_extensions]: https://github.com/vmg/redcarpet/blob/v2.2.2/README.markdown#and-its-like-really-simple-to-use
500
501 ### Kramdown
502
503 In addition to the defaults mentioned above, you can also turn on recognition of Github Flavored Markdown by passing an `input` option with a value of "GFM".
504
505 For example, in your `_config.yml`:
506
507 kramdown:
508 input: GFM
509
510 ### Custom Markdown Processors
511
512 If you're interested in creating a custom markdown processor, you're in luck! Create a new class in the `Jekyll::Converters::Markdown` namespace:
513
514 {% highlight ruby %}
515 class Jekyll::Converters::Markdown::MyCustomProcessor
516 def initialize(config)
517 require 'funky_markdown'
518 @config = config
519 rescue LoadError
520 STDERR.puts 'You are missing a library required for Markdown. Please run:'
521 STDERR.puts ' $ [sudo] gem install funky_markdown'
522 raise FatalException.new("Missing dependency: funky_markdown")
523 end
524
525 def convert(content)
526 ::FunkyMarkdown.new(content).convert
527 end
528 end
529 {% endhighlight %}
530
531 Once you've created your class and have it properly setup either as a plugin in the `_plugins` folder or as a gem, specify it in your `_config.yml`:
532
533 {% highlight yaml %}
534 markdown: MyCustomProcessor
535 {% endhighlight %}
0 ---
1 layout: docs
2 title: Continuous Integration
3 prev_section: deployment-methods
4 next_section: troubleshooting
5 permalink: /docs/continuous-integration/
6 ---
7
8 You can easily test your website build against one or more versions of Ruby.
9 The following guide will show you how to set up a free build environment on
10 [Travis][0], with [GitHub][1] integration for pull requests. Paid
11 alternatives exist for private repositories.
12
13 [0]: https://travis-ci.org/
14 [1]: https://github.com/
15
16 ## 1. Enabling Travis and GitHub
17
18 Enabling Travis builds for your GitHub repository is pretty simple:
19
20 1. Go to your profile on travis-ci.org: https://travis-ci.org/profile/username
21 2. Find the repository for which you're interested in enabling builds.
22 3. Click the slider on the right so it says "ON" and is a dark grey.
23 4. Optionally configure the build by clicking on the wrench icon. Further
24 configuration happens in you `.travis.yml` file. More details on that
25 below.
26
27 ## 2. The Test Script
28
29 The simplest test script simply runs `jekyll build` and ensures that Jekyll
30 doesn't fail to build the site. It doesn't check the resulting site, but it
31 does ensure things are built properly.
32
33 When testing Jekyll output, there is no better tool than [html-proofer][2].
34 This tool checks your resulting site to ensure all links and images exist.
35 Utilize it either with the convenient `htmlproof` command-line executable,
36 or write a Ruby script which utilizes the gem.
37
38 ### The HTML Proofer Executable
39
40 {% highlight bash %}
41 #!/usr/bin/env bash
42 set -e # halt script on error
43
44 bundle exec jekyll build
45 bundle exec htmlproof ./_site
46 {% endhighlight %}
47
48 Some options can be specified via command-line switches. Check out the
49 `html-proofer` README for more information about these switches, or run
50 `htmlproof --help` locally.
51
52 ### The HTML Proofer Library
53
54 You can also invoke `html-proofer` in Ruby scripts (e.g. in a Rakefile):
55
56 {% highlight ruby %}
57 #!/usr/bin/env ruby
58
59 require 'html/proofer'
60 HTML::Proofer.new("./_site").run
61 {% endhighlight %}
62
63 Options are given as a second argument to `.new`, and are encoded in a
64 symbol-keyed Ruby Hash. More information about the configuration options,
65 check out `html-proofer`'s README file.
66
67 [2]: https://github.com/gjtorikian/html-proofer
68
69 ## 3. Configuring Your Travis Builds
70
71 This file is used to configure your Travis builds. Because Jekyll is built
72 with Ruby and requires RubyGems to install, we use the Ruby language build
73 environment. Below is a sample `.travis.yml` file, and what follows that is
74 an explanation of each line.
75
76 {% highlight yaml %}
77 language: ruby
78 rvm:
79 - 2.1
80 script: ./script/cibuild
81
82 # branch whitelist
83 branches:
84 only:
85 - gh-pages # test the gh-pages branch
86 - /pages-(.*)/ # test every branch which starts with "pages-"
87
88 env:
89 global:
90 - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer
91 {% endhighlight %}
92
93 Ok, now for an explanation of each line:
94
95 {% highlight yaml %}
96 language: ruby
97 {% endhighlight %}
98
99 This line tells Travis to use a Ruby build container. It gives your script
100 access to Bundler, RubyGems, and and Ruby runtime.
101
102 {% highlight yaml %}
103 rvm:
104 - 2.1
105 {% endhighlight %}
106
107 RVM is a popular Ruby Version Manager (like rbenv, chruby, etc). This
108 directive tells Travis the Ruby version to use when running your test
109 script.
110
111 {% highlight yaml %}
112 script: ./script/cibuild
113 {% endhighlight %}
114
115 Travis allows you to run any arbitrary shell script to test your site. One
116 convention is to put all scripts for your project in the `script`
117 directory, and to call your test script `cibuild`. This line is completely
118 customizable. If your script won't change much, you can write your test
119 incantation here directly:
120
121 {% highlight yaml %}
122 script: jekyll build && htmlproof ./_site
123 {% endhighlight %}
124
125 The `script` directive can be absolutely any valid shell command.
126
127 {% highlight yaml %}
128 # branch whitelist
129 branches:
130 only:
131 - gh-pages # test the gh-pages branch
132 - /pages-(.*)/ # test every branch which starts with "pages-"
133 {% endhighlight %}
134
135 You want to ensure the Travis builds for your site are being run only on
136 the branch or branches which contain your site. One means of ensuring this
137 isolation is including a branch whitelist in your Travis configuration
138 file. By specifying the `gh-pages` branch, you will ensure the associated
139 test script (discussed above) is only executed on site branches. If you use
140 a pull request flow for proposing changes, you may wish to enforce a
141 convention for your builds such that all branches containing edits are
142 prefixed, exemplified above with the `/pages-(.*)/` regular expression.
143
144 The `branches` directive is completely optional.
145
146 {% highlight yaml %}
147 env:
148 global:
149 - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer
150 {% endhighlight %}
151
152 Using `html-proofer`? You'll want this environment variable. Nokogiri, used
153 to parse HTML files in your compiled site, comes bundled with libraries
154 which it must compile each time it is installed. Luckily, you can
155 dramatically increase the install time of Nokogiri by setting the
156 environment variable `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true`.
157
158 ## 4. Gotchas
159
160 ### Exclude `vendor`
161
162 Travis bundles all gems in the `vendor` directory on its build servers,
163 which Jekyll will mistakenly read and explode on. To avoid this, exclude
164 `vendor` in your `_config.yml`:
165
166 {% highlight yaml %}
167 exclude: [vendor]
168 {% endhighlight %}
169
170 ### Questions?
171
172 This entire guide is open-source. Go ahead and [edit it][3] if you have a
173 fix or [ask for help][4] if you run into trouble and need some help.
174
175 [3]: https://github.com/jekyll/jekyll/edit/master/site/docs/continuous-integration.md
176 [4]: https://github.com/jekyll/jekyll-help#how-do-i-ask-a-question
1010
1111 * If you're creating a small fix or patch to an existing feature, just a simple
1212 test will do. Please stay in the confines of the current test suite and use
13 [Shoulda](http://github.com/thoughtbot/shoulda/tree/master) and
14 [RR](http://github.com/btakita/rr/tree/master).
13 [Shoulda](https://github.com/thoughtbot/shoulda/tree/master) and
14 [RR](https://github.com/btakita/rr/tree/master).
1515 * If it's a brand new feature, make sure to create a new
1616 [Cucumber](https://github.com/cucumber/cucumber/) feature and reuse steps
1717 where appropriate. Also, whipping up some documentation in your fork's `site`
8484 git push origin my_awesome_feature
8585 {% endhighlight %}
8686
87 * Create a pull request against mojombo/jekyll:master and describe what your
87 * Create a pull request against jekyll/jekyll:master and describe what your
8888 change does and the why you think it should be merged.
8989
9090 Updating Documentation
101101 All documentation pull requests should be directed at `master`. Pull
102102 requests directed at another branch will not be accepted.
103103
104 The [Jekyll wiki]({{ site.repository }}/wiki) on GitHub
105 can be freely updated without a pull request as all
104 The [Jekyll wiki]({{ site.repository }}/wiki) on GitHub
105 can be freely updated without a pull request as all
106106 GitHub users have access.
107
108 If you want to add your plugin to the [list of plugins](/docs/plugins/#available-plugins),
109 please submit a pull request modifying the [plugins page source
110 file]({{ site.repository }}/blob/master/site/docs/plugins.md) by adding a
111 link to your plugin under the proper subheading depending upon its type.
107112
108113 Gotchas
109114 -------
110115
111116 * If you want to bump the gem version, please put that in a separate commit.
112117 This way, the maintainers can control when the gem gets released.
113 * Try to keep your patch(es) based from the latest commit on mojombo/jekyll.
118 * Try to keep your patch(es) based from the latest commit on jekyll/jekyll.
114119 The easier it is to apply your work, the less work the maintainers have to do,
115120 which is always a good thing.
116121 * Please don't tag your GitHub issue with \[fix\], \[feature\], etc. The maintainers
00 ---
11 layout: docs
22 title: Data Files
3 prev_section: variables
4 next_section: migrations
3 prev_section: collections
4 next_section: assets
55 permalink: /docs/datafiles/
66 ---
77
88 In addition to the [built-in variables](../variables/) available from Jekyll,
9 you can specify your own custom data that can be accessed via the [Liquid
10 templating system](http://wiki.github.com/shopify/liquid/liquid-for-designers).
9 you can specify your own custom data that can be accessed via the [Liquid
10 templating system](https://wiki.github.com/shopify/liquid/liquid-for-designers).
1111
12 Jekyll supports loading data from [YAML](http://yaml.org/) files located in the
12 Jekyll supports loading data from [YAML](http://yaml.org/) and [JSON](http://www.json.org/) files located in the
1313 `_data` directory.
1414
15 This powerful features allows you to avoid repetition in your templates and to
16 set site specific options without changing `_config.yml`.
15 This powerful feature allows you to avoid repetition in your templates and to
16 set site specific options without changing `_config.yml`.
1717
1818 Plugins/themes can also leverage Data Files to set configuration variables.
1919
2020 ## The Data Folder
2121
22 As explained on the [directory structure](../structure/) page, the `_data`
22 As explained on the [directory structure](../structure/) page, the `_data`
2323 folder is where you can store additional data for Jekyll to use when generating
24 your site. These files must be YAML files (using either the `.yml` or `.yaml`
24 your site. These files must be YAML files (using either the `.yml`, `.yaml` or `.json`
2525 extension) and they will be accessible via `site.data`.
2626
2727 ## Example: List of members
6060 </ul>
6161 {% endraw %}
6262 {% endhighlight %}
63
64 ## Example: Organizations
65
66 Data files can also be placed in sub-folders of the `_data` folder. Each folder level will be added to a variable's namespace. The example bellow shows how GitHub organizations could be defined separately in a file under the `orgs` folder:
67
68 In `_data/orgs/jekyll.yml`:
69
70 {% highlight yaml %}
71 username: jekyll
72 name: Jekyll
73 members:
74 - name: Tom Preston-Werner
75 github: mojombo
76
77 - name: Parker Moore
78 github: parkr
79 {% endhighlight %}
80
81 In `_data/orgs/doeorg.yml`:
82
83 {% highlight yaml %}
84 username: doeorg
85 name: Doe Org
86 members:
87 - name: John Doe
88 github: jdoe
89 {% endhighlight %}
90
91 The organizations can then be accessed via `site.data.orgs`, followed by the file name:
92
93 {% highlight html %}
94 {% raw %}
95 <ul>
96 {% for org_hash in site.data.orgs %}
97 {% assign org = org_hash[1] %}
98 <li>
99 <a href="https://github.com/{{ org.username }}">
100 {{ org.name }}
101 </a>
102 ({{ org.members | size }} members)
103 </li>
104 {% endfor %}
105 </ul>
106 {% endraw %}
107 {% endhighlight %}
2626
2727 ### Git post-update hook
2828
29 If you store your jekyll site in [Git](http://git-scm.com/) (you are using version control, right?), it’s pretty easy to automate the
29 If you store your Jekyll site in [Git](http://git-scm.com/) (you are using version control, right?), it’s pretty easy to automate the
3030 deployment process by setting up a post-update hook in your Git
3131 repository, [like
3232 this](http://web.archive.org/web/20091223025644/http://www.taknado.com/en/2009/03/26/deploying-a-jekyll-generated-site/).
7272 laptops$ git push deploy master
7373 {% endhighlight %}
7474
75 ### Jekyll-hook
76
77 You can also use jekyll-hook, a server that listens for webhook posts from
78 GitHub, generates a website with Jekyll, and moves it somewhere to be
79 published. Use this to run your own GitHub Pages-style web server.
80
81 This method is useful if you need to serve your websites behind a firewall,
82 need extra server-level features like HTTP basic authentication or want to
83 host your site directly on a CDN or file host like S3.
84
85 Setup steps are fully documented
86 [in the `jekyll-hook` repo](https://github.com/developmentseed/jekyll-hook).
87
7588 ### Rake
7689
7790 Another way to deploy your Jekyll site is to use [Rake](https://github.com/jimweirich/rake), [HighLine](https://github.com/JEG2/highline), and
78 [Net::SSH](http://net-ssh.rubyforge.org/). A more complex example of deploying Jekyll with Rake that deals with multiple branches can be found in [Git Ready](https://github.com/gitready/gitready/blob/cdfbc4ec5321ff8d18c3ce936e9c749dbbc4f190/Rakefile).
91 [Net::SSH](https://github.com/net-ssh/net-ssh). A more complex example of deploying Jekyll with Rake that deals with multiple branches can be found in [Git Ready](https://github.com/gitready/gitready/blob/cdfbc4ec5321ff8d18c3ce936e9c749dbbc4f190/Rakefile).
7992
8093 ### rsync
8194
82 Once you’ve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](http://github.com/henrik/henrik.nyh.se/blob/master/tasks/deploy). You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run
95 Once you’ve generated the `_site` directory, you can easily rsync it using a `tasks/deploy` shell script similar to [this deploy script here](https://github.com/henrik/henrik.nyh.se/blob/master/tasks/deploy). You’d obviously need to change the values to reflect your site’s details. There is even [a matching TextMate command](http://gist.github.com/214959) that will help you run
8396 this script from within Textmate.
8497
8598
8699 ## Rack-Jekyll
87100
88 [Rack-Jekyll](http://github.com/bry4n/rack-jekyll/) is an easy way to deploy your site on any Rack server such as Amazon EC2, Slicehost, Heroku, and so forth. It also can run with [shotgun](http://github.com/rtomakyo/shotgun/), [rackup](http://github.com/rack/rack), [mongrel](http://github.com/mongrel/mongrel), [unicorn](http://github.com/defunkt/unicorn/), and [others](https://github.com/adaoraul/rack-jekyll#readme).
101 [Rack-Jekyll](https://github.com/adaoraul/rack-jekyll/) is an easy way to deploy your site on any Rack server such as Amazon EC2, Slicehost, Heroku, and so forth. It also can run with [shotgun](https://github.com/rtomayko/shotgun/), [rackup](https://github.com/rack/rack), [mongrel](https://github.com/mongrel/mongrel), [unicorn](https://github.com/defunkt/unicorn/), and [others](https://github.com/adaoraul/rack-jekyll#readme).
89102
90103 Read [this post](http://blog.crowdint.com/2010/08/02/instant-blog-using-jekyll-and-heroku.html) on how to deploy to Heroku using Rack-Jekyll.
91104
92105 ## Jekyll-Admin for Rails
93106
94 If you want to maintain Jekyll inside your existing Rails app, [Jekyll-Admin](http://github.com/zkarpinski/Jekyll-Admin) contains drop in code to make this possible. See Jekyll-Admin’s [README](http://github.com/zkarpinski/Jekyll-Admin/blob/master/README) for more details.
107 If you want to maintain Jekyll inside your existing Rails app, [Jekyll-Admin](https://github.com/zkarpinski/Jekyll-Admin) contains drop in code to make this possible. See Jekyll-Admin’s [README](https://github.com/zkarpinski/Jekyll-Admin/blob/master/README) for more details.
95108
96109 ## Amazon S3
97110
102115 benefit of being about the cheapest hosting option available for
103116 low-volume blogs as you only pay for what you use.
104117
118 ## OpenShift
119
120 If you'd like to deploy your site to an OpenShift gear, there's [a cartridge
121 for that](https://github.com/openshift-cartridges/openshift-jekyll-cartridge).
122
105123 <div class="note">
106124 <h5>ProTip™: Use GitHub Pages for zero-hassle Jekyll hosting</h5>
107125 <p>GitHub Pages are powered by Jekyll behind the scenes, so if you’re looking for a zero-hassle, zero-cost solution, GitHub Pages are a great way to <a href="../github-pages/">host your Jekyll-powered website for free</a>.</p>
88 There are a number of (optional) extra features that Jekyll supports that you
99 may want to install, depending on how you plan to use Jekyll.
1010
11 ## LaTeX Support
11 ## Math Support
1212
13 Maruku comes with optional support for LaTeX to PNG rendering via blahtex
14 (Version 0.6) which must be in your `$PATH` along with `dvips`. If you need
15 Maruku to not assume a fixed location for `dvips`, check out [Remi’s Maruku
16 fork](http://github.com/remi/maruku).
13 Kramdown comes with optional support for LaTeX to PNG rendering via [MathJax](http://www.mathjax.org/) within math blocks. See the Kramdown documentation on [math blocks](http://kramdown.gettalong.org/syntax.html#math-blocks) and [math support](http://kramdown.gettalong.org/converter/html.html#math-support) for more details.
1714
18 ## RDiscount
15 ## Alternative Markdown Processors
1916
20 If you prefer to use [RDiscount](http://github.com/rtomayko/rdiscount) instead
21 of [Maruku](http://github.com/bhollis/maruku) for Markdown, just make sure you have
22 it installed:
23
24 {% highlight bash %}
25 $ [sudo] gem install rdiscount
26 {% endhighlight %}
27
28 And then specify RDiscount as the Markdown engine in your `_config.yml` file to
29 have Jekyll run with that option.
30
31 {% highlight yaml %}
32 # In _config.yml
33 markdown: rdiscount
34 {% endhighlight %}
35
36 ## Kramdown
37
38 You can also use [Kramdown](http://kramdown.rubyforge.org/) instead of Maruku
39 for Markdown. Make sure that Kramdown is installed:
40
41 {% highlight bash %}
42 $ [sudo] gem install kramdown
43 {% endhighlight %}
44
45 Then you can specify Kramdown as the Markdown engine in `_config.yml`.
46
47 {% highlight yaml %}
48 # In _config.yml
49 markdown: kramdown
50 {% endhighlight %}
51
52 Kramdown has various options for customizing the HTML output. The
53 [Configuration](/docs/configuration/) page lists the default options used by
54 Jekyll. A complete list of options is also available on the [Kramdown
55 website](http://kramdown.rubyforge.org/options.html).
17 See the Markdown section on the [configuration page](/docs/configuration/#markdown-options) for instructions on how to use and configure alternative Markdown processors, as well as how to create [custom processors](/docs/configuration/#custom-markdown-processors).
2929 <p>
3030 If you use UTF-8 encoding, make sure that no <code>BOM</code> header
3131 characters exist in your files or very, very bad things will happen to
32 Jekyll. This is especially relevant if you’re running Jekyll on Windows.
32 Jekyll. This is especially relevant if you’re running
33 <a href="../windows/">Jekyll on Windows</a>.
3334 </p>
3435 </div>
3536
177178 </tbody>
178179 </table>
179180 </div>
181
182 <div class="note">
183 <h5>ProTip™: Don't repeat yourself</h5>
184 <p>
185 If you don't want to repeat your frequently used front-matter variables over and over,
186 just define <a href="../configuration/#frontmatter-defaults" title="frontmatter defaults">defaults</a>
187 for them and only override them where necessary (or not at all). This works both for predefined
188 and custom variables.
189 </p>
190 </div>
77
88 [GitHub Pages](http://pages.github.com) are public web pages for users,
99 organizations, and repositories, that are freely hosted on GitHub's
10 [github.io]() domain or on a custom domain name of your choice. GitHub Pages are
10 `github.io` domain or on a custom domain name of your choice. GitHub Pages are
1111 powered by Jekyll behind the scenes, so in addition to supporting regular HTML
1212 content, they’re also a great way to host your Jekyll-powered website for free.
1313
6464 1. In `_config.yml`, set the `baseurl` option to `/project-name` -- note the
6565 leading slash and the **absence** of a trailing slash.
6666 2. When referencing JS or CSS files, do it like this:
67 `{% raw %}{{ site.baseurl}}/path/to/css.css{% endraw %}` -- note the slash
67 `{% raw %}{{ site.baseurl }}/path/to/css.css{% endraw %}` -- note the slash
6868 immediately following the variable (just before "path").
6969 3. When doing permalinks or internal links, do it like this:
7070 `{% raw %}{{ site.baseurl }}{{ post.url }}{% endraw %}` -- note that there
+0
-9
site/docs/heroku.md less more
0 ---
1 layout: docs
2 title: Heroku
3 prev_section: github-pages
4 next_section: manual-deployment
5 permalink: /docs/heroku/
6 ---
7
8 Move along, people. Nothing to see here.
44 prev_section: contributing
55 ---
66
7 ## 2.2.0 / 2014-07-29
8 {: #v2-2-0}
9
10 ### Minor Enhancements
11 {: #minor-enhancements-v2-2-0}
12
13 - Throw a warning if the specified layout does not exist ([#2620]({{ site.repository }}/issues/2620))
14 - Whitelist Pygments options in safe mode ([#2642]({{ site.repository }}/issues/2642))
15
16 ### Bug Fixes
17 {: #bug-fixes-v2-2-0}
18
19 - Remove unnecessary `Jekyll::Tags::IncludeTag#blank?` method ([#2625]({{ site.repository }}/issues/2625))
20 - Categories in the path are ignored ([#2633]({{ site.repository }}/issues/2633))
21
22 ### Development Fixes
23 {: #development-fixes-v2-2-0}
24
25 - Refactoring Errors & Requires of Third-Party stuff ([#2591]({{ site.repository }}/issues/2591))
26 - Add further tests for categories ([#2584]({{ site.repository }}/issues/2584))
27 - Proof site with html-proofer on change ([#2605]({{ site.repository }}/issues/2605))
28 - Fix up bug in [#2605]({{ site.repository }}/issues/2605) which caused proofing the site not to function ([#2608]({{ site.repository }}/issues/2608))
29 - Use `bundle exec` in `script/proof` ([#2610]({{ site.repository }}/issues/2610))
30
31 ### Site Enhancements
32 {: #site-enhancements-v2-2-0}
33
34 - Update Kramdown urls ([#2588]({{ site.repository }}/issues/2588))
35 - Add `Jekyll::AutolinkEmail` and `Jekyll::GitMetadata` to the list of
36 third-party plugins ([#2596]({{ site.repository }}/issues/2596))
37 - Fix a bunch of broken links in the site ([#2601]({{ site.repository }}/issues/2601))
38 - Replace dead links with working links ([#2611]({{ site.repository }}/issues/2611))
39 - Add jekyll-hook to deployment methods ([#2617]({{ site.repository }}/issues/2617))
40 - Added kramdown-with-pygments plugin to the list of third-party plugins ([#2623]({{ site.repository }}/issues/2623))
41 - Update outdated "Extras" page and remove duplicate documentation ([#2622]({{ site.repository }}/issues/2622))
42 - Add co2 plugin to list of third-party plugins ([#2639]({{ site.repository }}/issues/2639))
43 - Attempt to clarify the way Sass imports happen ([#2642]({{ site.repository }}/issues/2642))
44
45
46 ## 2.1.1 / 2014-07-01
47 {: #v2-1-1}
48
49 ### Bug Fixes
50 {: #bug-fixes-v2-1-1}
51
52 - Patch read vulnerabilities for data & confirm none for layouts ([#2563]({{ site.repository }}/issues/2563))
53 - Update Maruku dependency to allow use of the latest version ([#2576]({{ site.repository }}/issues/2576))
54 - Remove conditional assignment from document URL to prevent stale urls ([#2575]({{ site.repository }}/issues/2575))
55
56 ### Site Enhancements
57 {: #site-enhancements-v2-1-1}
58
59 - Add vertical margin to `highlight` to separate code blocks ([#2558]({{ site.repository }}/issues/2558))
60 - Add `html_pages` to Variables docs ([#2567]({{ site.repository }}/issues/2567))
61 - Fixed broken link to Permalinks page ([#2572]({{ site.repository }}/issues/2572))
62 - Update link to Windows installation guide ([#2578]({{ site.repository }}/issues/2578))
63
64
65 ## 2.1.0 / 2014-06-28
66 {: #v2-1-0}
67
68 ### Minor Enhancements
69 {: #minor-enhancements-v2-1-0}
70
71 - Bump to the latest Liquid version, 2.6.1 ([#2495]({{ site.repository }}/issues/2495))
72 - Add support for JSON files in the `_data` directory ([#2369]({{ site.repository }}/issues/2369))
73 - Allow subclasses to override `EXCERPT_ATTRIBUTES_FOR_LIQUID` ([#2408]({{ site.repository }}/issues/2408))
74 - Add `Jekyll.env` and `jekyll.environment` (the Liquid var) ([#2417]({{ site.repository }}/issues/2417))
75 - Use `_config.yaml` or `_config.yml` (`.yml` takes precedence) ([#2406]({{ site.repository }}/issues/2406))
76 - Override collection url template ([#2418]({{ site.repository }}/issues/2418))
77 - Allow subdirectories in `_data` ([#2395]({{ site.repository }}/issues/2395))
78 - Extract Pagination Generator into gem: `jekyll-paginate` ([#2455]({{ site.repository }}/issues/2455))
79 - Utilize `date_to_rfc822` filter in site template ([#2437]({{ site.repository }}/issues/2437))
80 - Add categories, last build datetime, and generator to site template
81 feed ([#2438]({{ site.repository }}/issues/2438))
82 - Configurable, replaceable Logger-compliant logger ([#2444]({{ site.repository }}/issues/2444))
83 - Extract `gist` tag into a separate gem ([#2469]({{ site.repository }}/issues/2469))
84 - Add `collection` attribute to `Document#to_liquid` to access the
85 document's collection label. ([#2436]({{ site.repository }}/issues/2436))
86 - Upgrade listen to `2.7.6 <= x < 3.0.0` ([#2492]({{ site.repository }}/issues/2492))
87 - Allow configuration of different Twitter and GitHub usernames in site template ([#2485]({{ site.repository }}/issues/2485))
88 - Bump Pygments to v0.6.0 ([#2504]({{ site.repository }}/issues/2504))
89 - Front-matter defaults for documents in collections ([#2419]({{ site.repository }}/issues/2419))
90 - Include files with a url which ends in `/` in the `site.html_pages` list ([#2524]({{ site.repository }}/issues/2524))
91 - Make `highlight` tag use `language-` prefix in CSS class ([#2511]({{ site.repository }}/issues/2511))
92 - Lookup item property via `item#to_liquid` before `#data` or `#[]` in filters ([#2493]({{ site.repository }}/issues/2493))
93 - Skip initial build of site on serve with flag ([#2477]({{ site.repository }}/issues/2477))
94 - Add support for `hl_lines` in `highlight` tag ([#2532]({{ site.repository }}/issues/2532))
95 - Spike out `--watch` flag into a separate gem ([#2550]({{ site.repository }}/issues/2550))
96
97 ### Bug Fixes
98 {: #bug-fixes-v2-1-0}
99
100 - Liquid `sort` filter should sort even if one of the values is `nil` ([#2345]({{ site.repository }}/issues/2345))
101 - Remove padding on `pre code` in the site template CSS ([#2383]({{ site.repository }}/issues/2383))
102 - Set `log_level` earlier to silence info level configuration output ([#2393]({{ site.repository }}/issues/2393))
103 - Only list pages which have `title` in site template ([#2411]({{ site.repository }}/issues/2411))
104 - Accept `Numeric` values for dates, not `Number` values ([#2377]({{ site.repository }}/issues/2377))
105 - Prevent code from overflowing container in site template ([#2429]({{ site.repository }}/issues/2429))
106 - Encode URLs in UTF-8 when escaping and unescaping ([#2420]({{ site.repository }}/issues/2420))
107 - No Layouts or Liquid for Asset Files ([#2431]({{ site.repository }}/issues/2431))
108 - Allow front-matter defaults to set post categories ([#2373]({{ site.repository }}/issues/2373))
109 - Fix command in subcommand deprecation warning ([#2457]({{ site.repository }}/issues/2457))
110 - Keep all parent directories of files/dirs in `keep_files` ([#2458]({{ site.repository }}/issues/2458))
111 - When using RedCarpet and Rouge without Rouge installed, fixed erroneous
112 error which stated that redcarpet was missing, not rouge. ([#2464]({{ site.repository }}/issues/2464))
113 - Ignore *all* directories and files that merit it on auto-generation ([#2459]({{ site.repository }}/issues/2459))
114 - Before copying file, explicitly remove the old one ([#2535]({{ site.repository }}/issues/2535))
115 - Merge file system categories with categories from YAML. ([#2531]({{ site.repository }}/issues/2531))
116 - Deep merge front matter defaults ([#2490]({{ site.repository }}/issues/2490))
117 - Ensure exclude and include arrays are arrays of strings ([#2542]({{ site.repository }}/issues/2542))
118 - Allow collections to have dots in their filenames ([#2552]({{ site.repository }}/issues/2552))
119 - Collections shouldn't try to read in directories as files ([#2552]({{ site.repository }}/issues/2552))
120 - Be quiet very quickly. ([#2520]({{ site.repository }}/issues/2520))
121
122 ### Development Fixes
123 {: #development-fixes-v2-1-0}
124
125 - Test Ruby 2.1.2 instead of 2.1.1 ([#2374]({{ site.repository }}/issues/2374))
126 - Add test for sorting UTF-8 characters ([#2384]({{ site.repository }}/issues/2384))
127 - Use `https` for GitHub links in documentation ([#2470]({{ site.repository }}/issues/2470))
128 - Remove coverage reporting with Coveralls ([#2494]({{ site.repository }}/issues/2494))
129 - Fix a bit of missing TomDoc to `Jekyll::Commands::Build#build` ([#2554]({{ site.repository }}/issues/2554))
130
131 ### Site Enhancements
132 {: #site-enhancements-v2-1-0}
133
134 - Set `timezone` to `America/Los_Angeles` ([#2394]({{ site.repository }}/issues/2394))
135 - Improve JavaScript in `anchor_links.html` ([#2368]({{ site.repository }}/issues/2368))
136 - Remove note on Quickstart page about default markdown converter ([#2387]({{ site.repository }}/issues/2387))
137 - Remove broken link in extras.md to a Maruku fork ([#2401]({{ site.repository }}/issues/2401))
138 - Update Font Awesome to v4.1.0. ([#2410]({{ site.repository }}/issues/2410))
139 - Fix broken link on Installation page to Templates page ([#2421]({{ site.repository }}/issues/2421))
140 - Prevent table from extending parent width in permalink style table ([#2424]({{ site.repository }}/issues/2424))
141 - Add collections to info about pagination support ([#2389]({{ site.repository }}/issues/2389))
142 - Add `jekyll_github_sample` plugin to list of third-party plugins ([#2463]({{ site.repository }}/issues/2463))
143 - Clarify documentation around front-matter defaults and add details
144 about defaults for collections. ([#2439]({{ site.repository }}/issues/2439))
145 - Add Jekyll Project Version Tag to list of third-party plugins ([#2468]({{ site.repository }}/issues/2468))
146 - Use `https` for GitHub links across whole site ([#2470]({{ site.repository }}/issues/2470))
147 - Add StickerMule + Jekyll post ([#2476]({{ site.repository }}/issues/2476))
148 - Add Jekyll Asset Pipeline Reborn to list of third-party plugins ([#2479]({{ site.repository }}/issues/2479))
149 - Add link to jekyll-compress-html to list of third-party plugins ([#2514]({{ site.repository }}/issues/2514))
150 - Add Piwigo Gallery to list of third-party plugins ([#2526]({{ site.repository }}/issues/2526))
151 - Set `show_drafts` to `false` in default configuration listing ([#2536]({{ site.repository }}/issues/2536))
152 - Provide an updated link for Windows installation instructions ([#2544]({{ site.repository }}/issues/2544))
153 - Remove `url` from configuration docs ([#2547]({{ site.repository }}/issues/2547))
154 - Documentation for Continuous Integration for your Jekyll Site ([#2432]({{ site.repository }}/issues/2432))
155
156
157 ## 2.0.3 / 2014-05-08
158 {: #v2-0-3}
159
160 ### Bug Fixes
161 {: #bug-fixes-v2-0-3}
162
163 - Properly prefix links in site template with URL or baseurl depending upon
164 need. ([#2319]({{ site.repository }}/issues/2319))
165 - Update gist tag comments and error message to require username ([#2326]({{ site.repository }}/issues/2326))
166 - Fix `permalink` setting in site template ([#2331]({{ site.repository }}/issues/2331))
167 - Don't fail if any of the path objects are nil ([#2325]({{ site.repository }}/issues/2325))
168 - Instantiate all descendants for converters and generators, not just
169 direct subclasses ([#2334]({{ site.repository }}/issues/2334))
170 - Replace all instances of `site.name` with `site.title` in site template ([#2324]({{ site.repository }}/issues/2324))
171 - `Jekyll::Filters#time` now accepts UNIX timestamps in string or number form ([#2339]({{ site.repository }}/issues/2339))
172 - Use `item_property` for `where` filter so it doesn't break on collections ([#2359]({{ site.repository }}/issues/2359))
173 - Rescue errors thrown so `--watch` doesn't fail ([#2364]({{ site.repository }}/issues/2364))
174
175 ### Site Enhancements
176 {: #site-enhancements-v2-0-3}
177
178 - Add missing "as" to assets docs page ([#2337]({{ site.repository }}/issues/2337))
179 - Update docs to reflect new `baseurl` default ([#2341]({{ site.repository }}/issues/2341))
180 - Add links to headers who have an ID. ([#2342]({{ site.repository }}/issues/2342))
181 - Use symbol instead of HTML number in `upgrading.md` ([#2351]({{ site.repository }}/issues/2351))
182 - Fix link to frontmatter defaults docs ([#2353]({{ site.repository }}/issues/2353))
183 - Fix for `History.markdown` in order to fix history page in docs ([#2363]({{ site.repository }}/issues/2363))
184
185
186 ## 2.0.2 / 2014-05-07
187 {: #v2-0-2}
188
189 ### Bug Fixes
190 {: #bug-fixes-v2-0-2}
191
192 - Correct use of `url` and `baseurl` in the site template. ([#2317]({{ site.repository }}/issues/2317))
193 - Default `baseurl` to `""` ([#2317]({{ site.repository }}/issues/2317))
194
195 ### Site Enhancements
196 {: #site-enhancements-v2-0-2}
197
198 - Correct docs for the `gist` plugin so it always includes the username. ([#2314]({{ site.repository }}/issues/2314))
199 - Clarify new (defaults, `where` filter) features in docs ([#2316]({{ site.repository }}/issues/2316))
200
201
202 ## 2.0.1 / 2014-05-06
203 {: #v2-0-1}
204
205 ### Bug Fixes
206 {: #bug-fixes-v2-0-1}
207
208 - Require `kramdown` gem instead of `maruku` gem
209
210
211 ## 2.0.0 / 2014-05-06
212 {: #v2-0-0}
213
214 ### Major Enhancements
215 {: #major-enhancements-v2-0-0}
216 - Add "Collections" feature ([#2199]({{ site.repository }}/issues/2199))
217 - Add gem-based plugin whitelist to safe mode ([#1657]({{ site.repository }}/issues/1657))
218 - Replace the commander command line parser with a more robust
219 solution for our needs called `mercenary` ([#1706]({{ site.repository }}/issues/1706))
220 - Remove support for Ruby 1.8.x ([#1780]({{ site.repository }}/issues/1780))
221 - Move to jekyll/jekyll from mojombo/jekyll ([#1817]({{ site.repository }}/issues/1817))
222 - Allow custom markdown processors ([#1872]({{ site.repository }}/issues/1872))
223 - Provide support for the Rouge syntax highlighter ([#1859]({{ site.repository }}/issues/1859))
224 - Provide support for Sass ([#1932]({{ site.repository }}/issues/1932))
225 - Provide a 300% improvement when generating sites that use
226 `Post#next` or `Post#previous` ([#1983]({{ site.repository }}/issues/1983))
227 - Provide support for CoffeeScript ([#1991]({{ site.repository }}/issues/1991))
228 - Replace Maruku with Kramdown as Default Markdown Processor ([#1988]({{ site.repository }}/issues/1988))
229 - Expose `site.static_files` to Liquid ([#2075]({{ site.repository }}/issues/2075))
230 - Complete redesign of the template site generated by `jekyll new` ([#2050]({{ site.repository }}/issues/2050))
231 - Update Listen from 1.x to 2.x ([#2097]({{ site.repository }}/issues/2097))
232 - Front-matter defaults ([#2205]({{ site.repository }}/issues/2205))
233 - Deprecate `relative_permalinks` configuration option (default to `false`) ([#2307]({{ site.repository }}/issues/2307))
234 - Exclude files based on prefix as well as `fnmatch?` ([#2303]({{ site.repository }}/issues/2303))
235
236 ### Minor Enhancements
237 {: #minor-enhancements-v2-0-0}
238 - Move the EntryFilter class into the Jekyll module to avoid polluting the
239 global namespace ([#1800]({{ site.repository }}/issues/1800))
240 - Add `group_by` Liquid filter create lists of items grouped by a common
241 property's value ([#1788]({{ site.repository }}/issues/1788))
242 - Add support for Maruku's `fenced_code_blocks` option ([#1799]({{ site.repository }}/issues/1799))
243 - Update Redcarpet dependency to ~> 3.0 ([#1815]({{ site.repository }}/issues/1815))
244 - Automatically sort all pages by name ([#1848]({{ site.repository }}/issues/1848))
245 - Better error message when time is not parseable ([#1847]({{ site.repository }}/issues/1847))
246 - Allow `include` tag variable arguments to use filters ([#1841]({{ site.repository }}/issues/1841))
247 - `post_url` tag should raise `ArgumentError` for invalid name ([#1825]({{ site.repository }}/issues/1825))
248 - Bump dependency `mercenary` to `~> 0.2.0` ([#1879]({{ site.repository }}/issues/1879))
249 - Bump dependency `safe_yaml` to `~> 1.0` ([#1886]({{ site.repository }}/issues/1886))
250 - Allow sorting of content by custom properties ([#1849]({{ site.repository }}/issues/1849))
251 - Add `--quiet` flag to silence output during build and serve ([#1898]({{ site.repository }}/issues/1898))
252 - Add a `where` filter to filter arrays based on a key/value pair
253 ([#1875]({{ site.repository }}/issues/1875))
254 - Route 404 errors to a custom 404 page in development ([#1899]({{ site.repository }}/issues/1899))
255 - Excludes are now relative to the site source ([#1916]({{ site.repository }}/issues/1916))
256 - Bring MIME Types file for `jekyll serve` to complete parity with GH Pages
257 servers ([#1993]({{ site.repository }}/issues/1993))
258 - Adding Breakpoint to make new site template more responsive ([#2038]({{ site.repository }}/issues/2038))
259 - Default to using the UTF-8 encoding when reading files. ([#2031]({{ site.repository }}/issues/2031))
260 - Update Redcarpet dependency to ~> 3.1 ([#2044]({{ site.repository }}/issues/2044))
261 - Remove support for Ruby 1.9.2 ([#2045]({{ site.repository }}/issues/2045))
262 - Add `.mkdown` as valid Markdown extension ([#2048]({{ site.repository }}/issues/2048))
263 - Add `index.xml` to the list of WEBrick directory index files ([#2041]({{ site.repository }}/issues/2041))
264 - Make the `layouts` config key relative to CWD or to source ([#2058]({{ site.repository }}/issues/2058))
265 - Update Kramdown to `~> 1.3` ([#1894]({{ site.repository }}/issues/1894))
266 - Remove unnecessary references to `self` ([#2090]({{ site.repository }}/issues/2090))
267 - Update to Mercenary v0.3.x ([#2085]({{ site.repository }}/issues/2085))
268 - Ship Sass support as a separate gem ([#2098]({{ site.repository }}/issues/2098))
269 - Extract core extensions into a Utils module ([#2112]({{ site.repository }}/issues/2112))
270 - Refactor CLI & Commands For Greater Happiness ([#2143]({{ site.repository }}/issues/2143))
271 - Provide useful error when Pygments returns `nil` and error out ([#2148]({{ site.repository }}/issues/2148))
272 - Add support for unpublished drafts ([#2164]({{ site.repository }}/issues/2164))
273 - Add `force_polling` option to the `serve` command ([#2165]({{ site.repository }}/issues/2165))
274 - Clean up the `<head>` in the site template ([#2186]({{ site.repository }}/issues/2186))
275 - Permit YAML blocks to end with three dots to better conform with the
276 YAML spec ([#2110]({{ site.repository }}/issues/2110))
277 - Use `File.exist?` instead of deprecated `File.exists?` ([#2214]({{ site.repository }}/issues/2214))
278 - Require newline after start of YAML front-matter header ([#2211]({{ site.repository }}/issues/2211))
279 - Add the ability for pages to be marked as `published: false` ([#1492]({{ site.repository }}/issues/1492))
280 - Add `Jekyll::LiquidExtensions` with `.lookup_variable` method for easy
281 looking up of variable values in a Liquid context. ([#2253]({{ site.repository }}/issues/2253))
282 - Remove literal lang name from class ([#2292]({{ site.repository }}/issues/2292))
283 - Return `utf-8` encoding in header for webrick error page response ([#2289]({{ site.repository }}/issues/2289))
284 - Make template site easier to customize ([#2268]({{ site.repository }}/issues/2268))
285 - Add two-digit year to permalink template option ([#2301]({{ site.repository }}/issues/2301))
286 - Add `site.documents` to Liquid payload (list of all docs) ([#2295]({{ site.repository }}/issues/2295))
287 - Take into account missing values in the Liquid sort filter ([#2299]({{ site.repository }}/issues/2299))
288
289 ### Bug Fixes
290 {: #bug-fixes-v2-0-0}
291 - Don't allow nil entries when loading posts ([#1796]({{ site.repository }}/issues/1796))
292 - Remove the scrollbar that's always displayed in new sites generated
293 from the site template ([#1805]({{ site.repository }}/issues/1805))
294 - Add `#path` to required methods in `Jekyll::Convertible` ([#1866]({{ site.repository }}/issues/1866))
295 - Default Maruku fenced code blocks to ON for 2.0.0-dev ([#1831]({{ site.repository }}/issues/1831))
296 - Change short opts for host and port for `jekyll docs` to be consistent with
297 other subcommands ([#1877]({{ site.repository }}/issues/1877))
298 - Fix typos ([#1910]({{ site.repository }}/issues/1910))
299 - Lock Maruku at 0.7.0 to prevent bugs caused by Maruku 0.7.1 ([#1958]({{ site.repository }}/issues/1958))
300 - Fixes full path leak to source directory when using include tag ([#1951]({{ site.repository }}/issues/1951))
301 - Don't generate pages that aren't being published ([#1931]({{ site.repository }}/issues/1931))
302 - Use `SafeYAML.load` to avoid conflicts with other projects ([#1982]({{ site.repository }}/issues/1982))
303 - Relative posts should never fail to build ([#1976]({{ site.repository }}/issues/1976))
304 - Remove executable bits of non executable files ([#2056]({{ site.repository }}/issues/2056))
305 - `#path` for a draft is now `_drafts` instead of `_posts` ([#2042]({{ site.repository }}/issues/2042))
306 - Patch a couple show-stopping security vulnerabilities ([#1946]({{ site.repository }}/issues/1946))
307 - Sanitize paths uniformly, in a Windows-friendly way ([#2065]({{ site.repository }}/issues/2065), [#2109]({{ site.repository }}/issues/2109))
308 - Update gem build steps to work correctly on Windows ([#2118]({{ site.repository }}/issues/2118))
309 - Remove obsolete `normalize_options` method call from `bin/jekyll` ([#2121]({{ site.repository }}/issues/2121)).
310 - Remove `+` characters from Pygments lexer names when adding as a CSS
311 class ([#994]({{ site.repository }}/issues/994))
312 - Remove some code that caused Ruby interpreter warnings ([#2178]({{ site.repository }}/issues/2178))
313 - Only strip the drive name if it begins the string ([#2175]({{ site.repository }}/issues/2175))
314 - Remove default post with invalid date from site template ([#2200]({{ site.repository }}/issues/2200))
315 - Fix `Post#url` and `Page#url` escape ([#1568]({{ site.repository }}/issues/1568))
316 - Strip newlines from the {% raw %}`{% highlight %}`{% endraw %} block content ([#1823]({{ site.repository }}/issues/1823))
317 - Load in `rouge` only when it's been requested as the highlighter ([#2189]({{ site.repository }}/issues/2189))
318 - Convert input to string before XML escaping (`xml_escape` liquid filter) ([#2244]({{ site.repository }}/issues/2244))
319 - Modify configuration key for Collections and reset properly. ([#2238]({{ site.repository }}/issues/2238))
320 - Avoid duplicated output using `highlight` tag ([#2264]({{ site.repository }}/issues/2264))
321 - Only use Jekyll.logger for output ([#2307]({{ site.repository }}/issues/2307))
322 - Close the file descriptor in `has_yaml_header?` ([#2310]({{ site.repository }}/issues/2310))
323 - Add `output` to `Document` liquid output hash ([#2309]({{ site.repository }}/issues/2309))
324
325 ### Development Fixes
326 {: #development-fixes-v2-0-0}
327 - Add a link to the site in the README.md file ([#1795]({{ site.repository }}/issues/1795))
328 - Add in History and site changes from `v1-stable` branch ([#1836]({{ site.repository }}/issues/1836))
329 - Testing additions on the Excerpt class ([#1893]({{ site.repository }}/issues/1893))
330 - Fix the `highlight` tag feature ([#1859]({{ site.repository }}/issues/1859))
331 - Test Jekyll under Ruby 2.1.0 ([#1900]({{ site.repository }}/issues/1900))
332 - Add script/cibuild for fun and profit ([#1912]({{ site.repository }}/issues/1912))
333 - Use `Forwardable` for delegation between `Excerpt` and `Post`
334 ([#1927]({{ site.repository }}/issues/1927))
335 - Rename `read_things` to `read_content` ([#1928]({{ site.repository }}/issues/1928))
336 - Add `script/branding` script for ASCII art lovin' ([#1936]({{ site.repository }}/issues/1936))
337 - Update the README to reflect the repo move ([#1943]({{ site.repository }}/issues/1943))
338 - Add the project vision to the README ([#1935]({{ site.repository }}/issues/1935))
339 - Speed up Travis CI builds by using Rebund ([#1985]({{ site.repository }}/issues/1985))
340 - Use Yarp as a Gem proxy for Travis CI ([#1984]({{ site.repository }}/issues/1984))
341 - Remove Yarp as a Gem proxy for Travis CI ([#2004]({{ site.repository }}/issues/2004))
342 - Move the reading of layouts into its own class ([#2020]({{ site.repository }}/issues/2020))
343 - Test Sass import ([#2009]({{ site.repository }}/issues/2009))
344 - Switch Maruku and Kramdown in lists of Runtime vs. Development dependencies ([#2049]({{ site.repository }}/issues/2049))
345 - Clean up the gemspec for the project ([#2095]({{ site.repository }}/issues/2095))
346 - Add Japanese translation of README and CONTRIBUTING docs. ([#2081]({{ site.repository }}/issues/2081))
347 - Re-align the tables in Cucumber ([#2108]({{ site.repository }}/issues/2108))
348 - Trim trailing spaces and convert tabs to spaces ([#2122]({{ site.repository }}/issues/2122))
349 - Fix the failing Travis scenarios due to Cucumber issues ([#2155]({{ site.repository }}/issues/2155))
350 - Wrap `bundle install` in `travis_retry` to retry when RubyGems fails ([#2160]({{ site.repository }}/issues/2160))
351 - Refactor tags and categories ([#1639]({{ site.repository }}/issues/1639))
352 - Extract plugin management into its own class ([#2197]({{ site.repository }}/issues/2197))
353 - Add missing tests for `Command` ([#2216]({{ site.repository }}/issues/2216))
354 - Update `rr` link in CONTRIBUTING doc ([#2247]({{ site.repository }}/issues/2247))
355 - Streamline Cucumber execution of `jekyll` subcommands ([#2258]({{ site.repository }}/issues/2258))
356 - Refactor `Commands::Serve`. ([#2269]({{ site.repository }}/issues/2269))
357 - Refactor `highlight` tag ([#2154]({{ site.repository }}/issues/2154))
358 - Update `Util` hash functions with latest from Rails ([#2273]({{ site.repository }}/issues/2273))
359 - Workaround for Travis bug ([#2290]({{ site.repository }}/issues/2290))
360
361 ### Site Enhancements
362 {: #site-enhancements-v2-0-0}
363 - Document Kramdown's GFM parser option ([#1791]({{ site.repository }}/issues/1791))
364 - Move CSS to includes & update normalize.css to v2.1.3 ([#1787]({{ site.repository }}/issues/1787))
365 - Minify CSS only in production ([#1803]({{ site.repository }}/issues/1803))
366 - Fix broken link to installation of Ruby on Mountain Lion blog post on
367 Troubleshooting docs page ([#1797]({{ site.repository }}/issues/1797))
368 - Fix issues with 1.4.1 release blog post ([#1804]({{ site.repository }}/issues/1804))
369 - Add note about deploying to OpenShift ([#1812]({{ site.repository }}/issues/1812))
370 - Collect all Windows-related docs onto one page ([#1818]({{ site.repository }}/issues/1818))
371 - Fixed typo in datafiles doc page ([#1854]({{ site.repository }}/issues/1854))
372 - Clarify how to access `site` in docs ([#1864]({{ site.repository }}/issues/1864))
373 - Add closing `<code>` tag to `context.registers[:site]` note ([#1867]({{ site.repository }}/issues/1867))
374 - Fix link to [@mojombo](https://github.com/mojombo)'s site source ([#1897]({{ site.repository }}/issues/1897))
375 - Add `paginate: nil` to default configuration in docs ([#1896]({{ site.repository }}/issues/1896))
376 - Add link to our License in the site footer ([#1889]({{ site.repository }}/issues/1889))
377 - Add a charset note in "Writing Posts" doc page ([#1902]({{ site.repository }}/issues/1902))
378 - Disallow selection of path and prompt in bash examples
379 - Add jekyll-compass to the plugin list ([#1923]({{ site.repository }}/issues/1923))
380 - Add note in Posts docs about stripping `<p>` tags from excerpt ([#1933]({{ site.repository }}/issues/1933))
381 - Add additional info about the new exclude behavior ([#1938]({{ site.repository }}/issues/1938))
382 - Linkify 'awesome contributors' to point to the contributors graph on
383 GitHub ([#1940]({{ site.repository }}/issues/1940))
384 - Update `docs/sites.md` link to GitHub Training materials ([#1949]({{ site.repository }}/issues/1949))
385 - Update `master` with the release info from 1.4.3 ([#1947]({{ site.repository }}/issues/1947))
386 - Define docs nav in datafile ([#1953]({{ site.repository }}/issues/1953))
387 - Clarify the docs around the naming convention for posts ([#1971]({{ site.repository }}/issues/1971))
388 - Add missing `next` and `previous` docs for post layouts and templates ([#1970]({{ site.repository }}/issues/1970))
389 - Add note to `Writing posts` page about how to strip html from excerpt ([#1962]({{ site.repository }}/issues/1962))
390 - Add `jekyll-humanize` plugin to plugin list ([#1998]({{ site.repository }}/issues/1998))
391 - Add `jekyll-font-awesome` plugin to plugin list ([#1999]({{ site.repository }}/issues/1999))
392 - Add `sublime-jekyll` to list of Editor plugins ([#2001]({{ site.repository }}/issues/2001))
393 - Add `vim-jekyll` to the list of Editor plugins ([#2005]({{ site.repository }}/issues/2005))
394 - Fix non-semantic nesting of `p` tags in `news_item` layout ([#2013]({{ site.repository }}/issues/2013))
395 - Document destination folder cleaning ([#2016]({{ site.repository }}/issues/2016))
396 - Updated instructions for NearlyFreeSpeech.NET installation ([#2015]({{ site.repository }}/issues/2015))
397 - Update link to rack-jekyll on "Deployment Methods" page ([#2047]({{ site.repository }}/issues/2047))
398 - Fix typo in /docs/configuration ([#2073]({{ site.repository }}/issues/2073))
399 - Fix count in docs for `site.static_files` ([#2077]({{ site.repository }}/issues/2077))
400 - Update configuration docs to indicate utf-8 is the default for 2.0.0
401 and ASCII for 1.9.3 ([#2074]({{ site.repository }}/issues/2074))
402 - Add info about unreleased feature to the site ([#2061]({{ site.repository }}/issues/2061))
403 - Add whitespace to liquid example in GitHub Pages docs ([#2084]({{ site.repository }}/issues/2084))
404 - Clarify the way Sass and CoffeeScript files are read in and output ([#2067]({{ site.repository }}/issues/2067))
405 - Add lyche gallery tag plugin link to list of plugins ([#2094]({{ site.repository }}/issues/2094))
406 - Add Jekyll Pages Directory plugin to list of plugins ([#2096]({{ site.repository }}/issues/2096))
407 - Update Configuration docs page with new markdown extension ([#2102]({{ site.repository }}/issues/2102))
408 - Add `jekyll-image-set` to the list of third-party plugins ([#2105]({{ site.repository }}/issues/2105))
409 - Losslessly compress images ([#2128]({{ site.repository }}/issues/2128))
410 - Update normalize.css to 3.0.0 ([#2126]({{ site.repository }}/issues/2126))
411 - Update modernizr to v2.7.1 ([#2129]({{ site.repository }}/issues/2129))
412 - Add `jekyll-ordinal` to list of third-party plugins ([#2150]({{ site.repository }}/issues/2150))
413 - Add `jekyll_figure` to list of third-party plugins ([#2158]({{ site.repository }}/issues/2158))
414 - Clarify the documentation for safe mode ([#2163]({{ site.repository }}/issues/2163))
415 - Some HTML tidying ([#2130]({{ site.repository }}/issues/2130))
416 - Remove modernizr and use html5shiv.js directly for IE less than v9 ([#2131]({{ site.repository }}/issues/2131))
417 - Remove unused images ([#2187]({{ site.repository }}/issues/2187))
418 - Use `array_to_sentence_string` filter when outputting news item
419 categories ([#2191]({{ site.repository }}/issues/2191))
420 - Add link to Help repo in primary navigation bar ([#2177]({{ site.repository }}/issues/2177))
421 - Switch to using an ico file for the shortcut icon ([#2193]({{ site.repository }}/issues/2193))
422 - Use numbers to specify font weights and only bring in font weights used ([#2185]({{ site.repository }}/issues/2185))
423 - Add a link to the list of all tz database time zones ([#1824]({{ site.repository }}/issues/1824))
424 - Clean-up and improve documentation `feed.xml` ([#2192]({{ site.repository }}/issues/2192))
425 - Remove duplicate entry in list of third-party plugins ([#2206]({{ site.repository }}/issues/2206))
426 - Reduce the whitespace in the favicon. ([#2213]({{ site.repository }}/issues/2213))
427 - Add `jekyll-page-collections` to list of third-party plugins ([#2215]({{ site.repository }}/issues/2215))
428 - Add a cross-reference about `post_url` ([#2243]({{ site.repository }}/issues/2243))
429 - Add `jekyll-live-tiles` to list of third-party plugins ([#2250]({{ site.repository }}/issues/2250))
430 - Fixed broken link to GitHub training material site source ([#2257]({{ site.repository }}/issues/2257))
431 - Update link to help repo, now called `jekyll-help` ([#2277]({{ site.repository }}/issues/2277))
432 - Fix capitalization of 'Jekyll' on Deployment Methods page ([#2291]({{ site.repository }}/issues/2291))
433 - Include plugins by sonnym in list of third-party plugins ([#2297]({{ site.repository }}/issues/2297))
434 - Add deprecated articles keeper filter to list of third-party plugins ([#2300]({{ site.repository }}/issues/2300))
435 - Simplify and improve our CSS. ([#2127]({{ site.repository }}/issues/2127))
436 - Use black text color for the mobile navbar ([#2306]({{ site.repository }}/issues/2306))
437 - Use the built in date filter and `site.time` for the copyright year. ([#2305]({{ site.repository }}/issues/2305))
438 - Update html5shiv to v3.7.2 ([#2304]({{ site.repository }}/issues/2304))
439 - Add 2.0.0 release post ([#2298]({{ site.repository }}/issues/2298))
440 - Add docs for custom markdown processors ([#2298]({{ site.repository }}/issues/2298))
441 - Add docs for `where` and `group_by` Liquid filters ([#2298]({{ site.repository }}/issues/2298))
442 - Remove notes in docs for unreleased features ([#2309]({{ site.repository }}/issues/2309))
443
444
445 ## 1.5.1 / 2014-03-27
446 {: #v1-5-1}
447
448 ### Bug Fixes
449 {: #bug-fixes-v1-5-1}
450
451 - Only strip the drive name if it begins the string ([#2176]({{ site.repository }}/issues/2176))
452
453
7454 ## 1.5.0 / 2014-03-24
8
9 ### Minor Enhancements
455 {: #v1-5-0}
456
457 ### Minor Enhancements
458 {: #minor-enhancements-v1-5-0}
10459
11460 - Loosen `safe_yaml` dependency to `~> 1.0` ([#2167]({{ site.repository }}/issues/2167))
12461 - Bump `safe_yaml` dependency to `~> 1.0.0` ([#1942]({{ site.repository }}/issues/1942))
13462
14463 ### Bug Fixes
464 {: #bug-fixes-v1-5-0}
15465
16466 - Fix issue where filesystem traversal restriction broke Windows ([#2167]({{ site.repository }}/issues/2167))
17467 - Lock `maruku` at `0.7.0` ([#2167]({{ site.repository }}/issues/2167))
18468
19469 ### Development Fixes
20
21 - Lock `cucmber` at `1.3.11` ([#2167]({{ site.repository }}/issues/2167))
470 {: #development-fixes-v1-5-0}
471
472 - Lock `cucumber` at `1.3.11` ([#2167]({{ site.repository }}/issues/2167))
473
22474
23475 ## 1.4.3 / 2014-01-13
24
25 ### Bug Fixes
26
476 {: #v1-4-3}
477
478 ### Bug Fixes
479 {: #bug-fixes-v1-4-3}
27480 - Patch show-stopping security vulnerabilities ([#1944]({{ site.repository }}/issues/1944))
28481
482
29483 ## 1.4.2 / 2013-12-16
30
31 ### Bug Fixes
484 {: #v1-4-2}
485
486 ### Bug Fixes
487 {: #bug-fixes-v1-4-2}
32488 - Turn on Maruku fenced code blocks by default ([#1830]({{ site.repository }}/issues/1830))
33489
490
34491 ## 1.4.1 / 2013-12-09
35
36 ### Bug Fixes
492 {: #v1-4-1}
493
494 ### Bug Fixes
495 {: #bug-fixes-v1-4-1}
37496 - Don't allow nil entries when loading posts ([#1796]({{ site.repository }}/issues/1796))
38497
498
39499 ## 1.4.0 / 2013-12-07
500 {: #v1-4-0}
40501
41502 ### Major Enhancements
503 {: #major-enhancements-v1-4-0}
42504 - Add support for TOML config files ([#1765]({{ site.repository }}/issues/1765))
43505
44506 ### Minor Enhancements
507 {: #minor-enhancements-v1-4-0}
45508 - Sort plugins as a way to establish a load order ([#1682]({{ site.repository }}/issues/1682))
46509 - Update Maruku to 0.7.0 ([#1775]({{ site.repository }}/issues/1775))
47510
48511 ### Bug Fixes
512 {: #bug-fixes-v1-4-0}
49513 - Add a space between two words in a Pagination warning message ([#1769]({{ site.repository }}/issues/1769))
50514 - Upgrade `toml` gem to `v0.1.0` to maintain compat with Ruby 1.8.7 ([#1778]({{ site.repository }}/issues/1778))
51515
52516 ### Development Fixes
517 {: #development-fixes-v1-4-0}
53518 - Remove some whitespace in the code ([#1755]({{ site.repository }}/issues/1755))
54519 - Remove some duplication in the reading of posts and drafts ([#1779]({{ site.repository }}/issues/1779))
55520
56521 ### Site Enhancements
522 {: #site-enhancements-v1-4-0}
57523 - Fixed case of a word in the Jekyll v1.3.0 release post ([#1762]({{ site.repository }}/issues/1762))
58524 - Fixed the mime type for the favicon ([#1772]({{ site.repository }}/issues/1772))
59525
526
60527 ## 1.3.1 / 2013-11-26
61
62 ### Minor Enhancements
528 {: #v1-3-1}
529
530 ### Minor Enhancements
531 {: #minor-enhancements-v1-3-1}
63532 - Add a `--prefix` option to passthrough for the importers ([#1669]({{ site.repository }}/issues/1669))
64533 - Push the paginator plugin lower in the plugin priority order so
65534 other plugins run before it ([#1759]({{ site.repository }}/issues/1759))
66535
67536 ### Bug Fixes
537 {: #bug-fixes-v1-3-1}
68538 - Fix the include tag when ran in a loop ([#1726]({{ site.repository }}/issues/1726))
69539 - Fix errors when using `--watch` on 1.8.7 ([#1730]({{ site.repository }}/issues/1730))
70540 - Specify where the include is called from if an included file is
71541 missing ([#1746]({{ site.repository }}/issues/1746))
72542
73543 ### Development Fixes
544 {: #development-fixes-v1-3-1}
74545 - Extract `Site#filter_entries` into its own object ([#1697]({{ site.repository }}/issues/1697))
75546 - Enable Travis' bundle caching ([#1734]({{ site.repository }}/issues/1734))
76547 - Remove trailing whitespace in some files ([#1736]({{ site.repository }}/issues/1736))
77548 - Fix a duplicate test name ([#1754]({{ site.repository }}/issues/1754))
78549
79550 ### Site Enhancements
551 {: #site-enhancements-v1-3-1}
80552 - Update link to example Rakefile to point to specific commit ([#1741]({{ site.repository }}/issues/1741))
81553 - Fix drafts docs to indicate that draft time is based on file modification
82554 time, not `Time.now` ([#1695]({{ site.repository }}/issues/1695))
90562 - Add docs for `post_url` when posts are in subdirectories ([#1718]({{ site.repository }}/issues/1718))
91563 - Update the docs to point to `example.com` ([#1448]({{ site.repository }}/issues/1448))
92564
565
93566 ## 1.3.0 / 2013-11-04
567 {: #v1-3-0}
94568
95569 ### Major Enhancements
570 {: #major-enhancements-v1-3-0}
96571 - Add support for adding data as YAML files under a site's `_data`
97572 directory ([#1003]({{ site.repository }}/issues/1003))
98573 - Allow variables to be used with `include` tags ([#1495]({{ site.repository }}/issues/1495))
99574 - Allow using gems for plugin management ([#1557]({{ site.repository }}/issues/1557))
100575
101576 ### Minor Enhancements
577 {: #minor-enhancements-v1-3-0}
102578 - Decrease the specificity in the site template CSS ([#1574]({{ site.repository }}/issues/1574))
103579 - Add `encoding` configuration option ([#1449]({{ site.repository }}/issues/1449))
104580 - Provide better error handling for Jekyll's custom Liquid tags
116592 missing ([#1662]({{ site.repository }}/issues/1662))
117593
118594 ### Bug Fixes
595 {: #bug-fixes-v1-3-0}
119596 - Fix up matching against source and destination when the two
120597 locations are similar ([#1556]({{ site.repository }}/issues/1556))
121598 - Fix the missing `pathname` require in certain cases ([#1255]({{ site.repository }}/issues/1255))
131608 incompatibilities ([#1687]({{ site.repository }}/issues/1687))
132609
133610 ### Development Fixes
611 {: #development-fixes-v1-3-0}
134612 - Add coverage reporting with Coveralls ([#1539]({{ site.repository }}/issues/1539))
135613 - Refactor the Liquid `include` tag ([#1490]({{ site.repository }}/issues/1490))
136614 - Update launchy dependency to `~> 2.3` ([#1608]({{ site.repository }}/issues/1608))
143621 - Refactor Site#render ([#1638]({{ site.repository }}/issues/1638))
144622 - Remove duplication in command line options ([#1637]({{ site.repository }}/issues/1637))
145623 - Add tests for all the coderay options ([#1543]({{ site.repository }}/issues/1543))
146 - Improve some of the cucumber test code ([#1493]({{ site.repository }}/issues/1493))
624 - Improve some of the Cucumber test code ([#1493]({{ site.repository }}/issues/1493))
147625 - Improve comparisons of timestamps by ignoring the seconds ([#1582]({{ site.repository }}/issues/1582))
148626
149627 ### Site Enhancements
628 {: #site-enhancements-v1-3-0}
150629 - Fix params for `JekyllImport::WordPress.process` arguments ([#1554]({{ site.repository }}/issues/1554))
151630 - Add `jekyll-suggested-tweet` to list of third-party plugins ([#1555]({{ site.repository }}/issues/1555))
152631 - Link to Liquid's docs for tags and filters ([#1553]({{ site.repository }}/issues/1553))
164643 - Fix navigation in the "Working with Drafts" page ([#1667]({{ site.repository }}/issues/1667))
165644 - Fix an error with the data documentation ([#1691]({{ site.repository }}/issues/1691))
166645
646
167647 ## 1.2.1 / 2013-09-14
168
169 ### Minor Enhancements
648 {: #v1-2-1}
649
650 ### Minor Enhancements
651 {: #minor-enhancements-v1-2-1}
170652 - Print better messages for detached server. Mute output on detach. ([#1518]({{ site.repository }}/issues/1518))
171653 - Disable reverse lookup when running `jekyll serve` ([#1363]({{ site.repository }}/issues/1363))
172654 - Upgrade RedCarpet dependency to `~> 2.3.0` ([#1515]({{ site.repository }}/issues/1515))
173655 - Upgrade to Liquid `>= 2.5.2, < 2.6` ([#1536]({{ site.repository }}/issues/1536))
174656
175657 ### Bug Fixes
658 {: #bug-fixes-v1-2-1}
176659 - Fix file discrepancy in gemspec ([#1522]({{ site.repository }}/issues/1522))
177660 - Force rendering of Include tag ([#1525]({{ site.repository }}/issues/1525))
178661
179662 ### Development Fixes
663 {: #development-fixes-v1-2-1}
180664 - Add a rake task to generate a new release post ([#1404]({{ site.repository }}/issues/1404))
181665 - Mute LSI output in tests ([#1531]({{ site.repository }}/issues/1531))
182666 - Update contributor documentation ([#1537]({{ site.repository }}/issues/1537))
183667
184668 ### Site Enhancements
669 {: #site-enhancements-v1-2-1}
185670 - Fix a couple of validation errors on the site ([#1511]({{ site.repository }}/issues/1511))
186671 - Make navigation menus reusable ([#1507]({{ site.repository }}/issues/1507))
187672 - Fix link to History page from Release v1.2.0 notes post.
188673 - Fix markup in History file for command line options ([#1512]({{ site.repository }}/issues/1512))
189674 - Expand 1.2 release post title to 1.2.0 ([#1516]({{ site.repository }}/issues/1516))
190675
676
191677 ## 1.2.0 / 2013-09-06
678 {: #v1-2-0}
192679
193680 ### Major Enhancements
681 {: #major-enhancements-v1-2-0}
194682 - Disable automatically-generated excerpts when `excerpt_separator` is `""`. ([#1386]({{ site.repository }}/issues/1386))
195683 - Add checking for URL conflicts when running `jekyll doctor` ([#1389]({{ site.repository }}/issues/1389))
196684
197685 ### Minor Enhancements
686 {: #minor-enhancements-v1-2-0}
198687 - Catch and fix invalid `paginate` values ([#1390]({{ site.repository }}/issues/1390))
199688 - Remove superfluous `div.container` from the default html template for
200689 `jekyll new` ([#1315]({{ site.repository }}/issues/1315))
210699 `jekyll.version` variable ([#1481]({{ site.repository }}/issues/1481))
211700
212701 ### Bug Fixes
702 {: #bug-fixes-v1-2-0}
213703 - Markdown extension matching matches only exact matches ([#1382]({{ site.repository }}/issues/1382))
214704 - Fixed NoMethodError when message passed to `Stevenson#message` is nil ([#1388]({{ site.repository }}/issues/1388))
215705 - Use binary mode when writing file ([#1364]({{ site.repository }}/issues/1364))
225715 tag ([#1494]({{ site.repository }}/issues/1494))
226716
227717 ### Development Fixes
718 {: #development-fixes-v1-2-0}
228719 - Remove redundant argument to
229720 Jekyll::Commands::New#scaffold_post_content ([#1356]({{ site.repository }}/issues/1356))
230721 - Add new dependencies to the README ([#1360]({{ site.repository }}/issues/1360))
236727 - Add Gem version and dependency badge to README ([#1497]({{ site.repository }}/issues/1497))
237728
238729 ### Site Enhancements
730 {: #site-enhancements-v1-2-0}
239731 - Add info about new releases ([#1353]({{ site.repository }}/issues/1353))
240732 - Update plugin list with jekyll-rss plugin ([#1354]({{ site.repository }}/issues/1354))
241733 - Update the site list page with Ruby's official site ([#1358]({{ site.repository }}/issues/1358))
257749 - XML escape the blog post title in our feed ([#1501]({{ site.repository }}/issues/1501))
258750 - Add `jekyll-toc-generator` to list of third-party plugins ([#1506]({{ site.repository }}/issues/1506))
259751
752
260753 ## 1.1.2 / 2013-07-25
261
262 ### Bug Fixes
754 {: #v1-1-2}
755
756 ### Bug Fixes
757 {: #bug-fixes-v1-1-2}
263758 - Require Liquid 2.5.1 ([#1349]({{ site.repository }}/issues/1349))
264759
760
265761 ## 1.1.1 / 2013-07-24
266
267 ### Minor Enhancements
762 {: #v1-1-1}
763
764 ### Minor Enhancements
765 {: #minor-enhancements-v1-1-1}
268766 - Remove superfluous `table` selector from main.css in `jekyll new` template ([#1328]({{ site.repository }}/issues/1328))
269767 - Abort with non-zero exit codes ([#1338]({{ site.repository }}/issues/1338))
270768
271769 ### Bug Fixes
770 {: #bug-fixes-v1-1-1}
272771 - Fix up the rendering of excerpts ([#1339]({{ site.repository }}/issues/1339))
273772
274773 ### Site Enhancements
774 {: #site-enhancements-v1-1-1}
275775 - Add Jekyll Image Tag to the plugins list ([#1306]({{ site.repository }}/issues/1306))
276776 - Remove erroneous statement that `site.pages` are sorted alphabetically.
277777 - Add info about the `_drafts` directory to the directory structure
285785 will automatically convert them. ([#1303]({{ site.repository }}/issues/1303))
286786 - Add an RSS feed for commits to Jekyll ([#1343]({{ site.repository }}/issues/1343))
287787
788
288789 ## 1.1.0 / 2013-07-14
790 {: #v1-1-0}
289791
290792 ### Major Enhancements
793 {: #major-enhancements-v1-1-0}
291794 - Add `docs` subcommand to read Jekyll's docs when offline. ([#1046]({{ site.repository }}/issues/1046))
292795 - Support passing parameters to templates in `include` tag ([#1204]({{ site.repository }}/issues/1204))
293796 - Add support for Liquid tags to post excerpts ([#1302]({{ site.repository }}/issues/1302))
294797
295798 ### Minor Enhancements
799 {: #minor-enhancements-v1-1-0}
296800 - Search the hierarchy of pagination path up to site root to determine template page for
297801 pagination. ([#1198]({{ site.repository }}/issues/1198))
298802 - Add the ability to generate a new Jekyll site without a template ([#1171]({{ site.repository }}/issues/1171))
306810 - Allow for all options for Kramdown HTML Converter ([#1201]({{ site.repository }}/issues/1201))
307811
308812 ### Bug Fixes
813 {: #bug-fixes-v1-1-0}
309814 - Fix pagination in subdirectories. ([#1198]({{ site.repository }}/issues/1198))
310815 - Fix an issue with directories and permalinks that have a plus sign
311816 (+) in them ([#1215]({{ site.repository }}/issues/1215))
313818 - Latest posts first in non-LSI `related_posts` ([#1271]({{ site.repository }}/issues/1271))
314819
315820 ### Development Fixes
316 - Merge the theme and layout cucumber steps into one step ([#1151]({{ site.repository }}/issues/1151))
821 {: #development-fixes-v1-1-0}
822 - Merge the theme and layout Cucumber steps into one step ([#1151]({{ site.repository }}/issues/1151))
317823 - Restrict activesupport dependency to pre-4.0.0 to maintain compatibility with `<= 1.9.2`
318824 - Include/exclude deprecation handling simplification ([#1284]({{ site.repository }}/issues/1284))
319825 - Convert README to Markdown. ([#1267]({{ site.repository }}/issues/1267))
320826 - Refactor Jekyll::Site ([#1144]({{ site.repository }}/issues/1144))
321827
322828 ### Site Enhancements
829 {: #site-enhancements-v1-1-0}
323830 - Add "News" section for release notes, along with an RSS feed ([#1093]({{ site.repository }}/issues/1093), [#1285]({{ site.repository }}/issues/1285), [#1286]({{ site.repository }}/issues/1286))
324831 - Add "History" page.
325832 - Restructured docs sections to include "Meta" section.
343850 - Update contributor information ([#1192]({{ site.repository }}/issues/1192))
344851 - Update URL of article about Blogger migration ([#1242]({{ site.repository }}/issues/1242))
345852 - Specify that RedCarpet is the default for new Jekyll sites on Quickstart page ([#1247]({{ site.repository }}/issues/1247))
346 - Added site.pages to Variables page in docs ([#1251]({{ site.repository }}/issues/1251))
853 - Added `site.pages` to Variables page in docs ([#1251]({{ site.repository }}/issues/1251))
347854 - Add Youku and Tudou Embed link on Plugins page. ([#1250]({{ site.repository }}/issues/1250))
348855 - Add note that `gist` tag supports private gists. ([#1248]({{ site.repository }}/issues/1248))
349856 - Add `jekyll-timeago` to list of third-party plugins. ([#1260]({{ site.repository }}/issues/1260))
357864 - Add information about time zones to the documentation for a page's
358865 date ([#1304]({{ site.repository }}/issues/1304))
359866
867
360868 ## 1.0.3 / 2013-06-07
361
362 ### Minor Enhancements
869 {: #v1-0-3}
870
871 ### Minor Enhancements
872 {: #minor-enhancements-v1-0-3}
363873 - Add support to gist tag for private gists. ([#1189]({{ site.repository }}/issues/1189))
364 - Fail loudly when MaRuKu errors out ([#1190]({{ site.repository }}/issues/1190))
874 - Fail loudly when Maruku errors out ([#1190]({{ site.repository }}/issues/1190))
365875 - Move the building of related posts into their own class ([#1057]({{ site.repository }}/issues/1057))
366876 - Removed trailing spaces in several places throughout the code ([#1116]({{ site.repository }}/issues/1116))
367877 - Add a `--force` option to `jekyll new` ([#1115]({{ site.repository }}/issues/1115))
368878 - Convert IDs in the site template to classes ([#1170]({{ site.repository }}/issues/1170))
369879
370880 ### Bug Fixes
881 {: #bug-fixes-v1-0-3}
371882 - Fix typo in Stevenson constant "ERROR". ([#1166]({{ site.repository }}/issues/1166))
372883 - Rename Jekyll::Logger to Jekyll::Stevenson to fix inheritance issue ([#1106]({{ site.repository }}/issues/1106))
373884 - Exit with a non-zero exit code when dealing with a Liquid error ([#1121]({{ site.repository }}/issues/1121))
378889 ([#1156]({{ site.repository }}/issues/1156))
379890
380891 ### Site Enhancements
892 {: #site-enhancements-v1-0-3}
381893 - Add a Pro Tip to docs about front matter variables being optional ([#1147]({{ site.repository }}/issues/1147))
382894 - Add changelog to site as History page in /docs/ ([#1065]({{ site.repository }}/issues/1065))
383895 - Add note to Upgrading page about new config options in 1.0.x ([#1146]({{ site.repository }}/issues/1146))
397909 - Add the Jekyll Gallery Plugin to the plugin list ([#1143]({{ site.repository }}/issues/1143))
398910
399911 ### Development Fixes
912 {: #development-fixes-v1-0-3}
400913 - Use Jekyll.logger instead of Jekyll::Stevenson to log things ([#1149]({{ site.repository }}/issues/1149))
401914 - Fix pesky Cucumber infinite loop ([#1139]({{ site.repository }}/issues/1139))
402915 - Do not write posts with timezones in Cucumber tests ([#1124]({{ site.repository }}/issues/1124))
403916 - Use ISO formatted dates in Cucumber features ([#1150]({{ site.repository }}/issues/1150))
404917
918
405919 ## 1.0.2 / 2013-05-12
920 {: #v1-0-2}
406921
407922 ### Major Enhancements
923 {: #major-enhancements-v1-0-2}
408924 - Add `jekyll doctor` command to check site for any known compatibility problems ([#1081]({{ site.repository }}/issues/1081))
409925 - Backwards-compatibilize relative permalinks ([#1081]({{ site.repository }}/issues/1081))
410926
411927 ### Minor Enhancements
928 {: #minor-enhancements-v1-0-2}
412929 - Add a `data-lang="<lang>"` attribute to Redcarpet code blocks ([#1066]({{ site.repository }}/issues/1066))
413930 - Deprecate old config `server_port`, match to `port` if `port` isn't set ([#1084]({{ site.repository }}/issues/1084))
414931 - Update pygments.rb version to 0.5.0 ([#1061]({{ site.repository }}/issues/1061))
415932 - Update Kramdown version to 1.0.2 ([#1067]({{ site.repository }}/issues/1067))
416933
417934 ### Bug Fixes
935 {: #bug-fixes-v1-0-2}
418936 - Fix issue when categories are numbers ([#1078]({{ site.repository }}/issues/1078))
419937 - Catching that Redcarpet gem isn't installed ([#1059]({{ site.repository }}/issues/1059))
420938
421939 ### Site Enhancements
940 {: #site-enhancements-v1-0-2}
422941 - Add documentation about `relative_permalinks` ([#1081]({{ site.repository }}/issues/1081))
423942 - Remove pygments-installation instructions, as pygments.rb is bundled with it ([#1079]({{ site.repository }}/issues/1079))
424943 - Move pages to be Pages for realz ([#985]({{ site.repository }}/issues/985))
425944 - Updated links to Liquid documentation ([#1073]({{ site.repository }}/issues/1073))
426945
946
427947 ## 1.0.1 / 2013-05-08
428
429 ### Minor Enhancements
430 - Do not force use of toc_token when using generate_tok in RDiscount ([#1048]({{ site.repository }}/issues/1048))
948 {: #v1-0-1}
949
950 ### Minor Enhancements
951 {: #minor-enhancements-v1-0-1}
952 - Do not force use of `toc_token` when using `generate_tok` in RDiscount ([#1048]({{ site.repository }}/issues/1048))
431953 - Add newer `language-` class name prefix to code blocks ([#1037]({{ site.repository }}/issues/1037))
432954 - Commander error message now preferred over process abort with incorrect args ([#1040]({{ site.repository }}/issues/1040))
433955
434956 ### Bug Fixes
957 {: #bug-fixes-v1-0-1}
435958 - Make Redcarpet respect the pygments configuration option ([#1053]({{ site.repository }}/issues/1053))
436959 - Fix the index build with LSI ([#1045]({{ site.repository }}/issues/1045))
437960 - Don't print deprecation warning when no arguments are specified. ([#1041]({{ site.repository }}/issues/1041))
438961 - Add missing `</div>` to site template used by `new` subcommand, fixed typos in code ([#1032]({{ site.repository }}/issues/1032))
439962
440963 ### Site Enhancements
964 {: #site-enhancements-v1-0-1}
441965 - Changed https to http in the GitHub Pages link ([#1051]({{ site.repository }}/issues/1051))
442966 - Remove CSS cruft, fix typos, fix HTML errors ([#1028]({{ site.repository }}/issues/1028))
443967 - Removing manual install of Pip and Distribute ([#1025]({{ site.repository }}/issues/1025))
444968 - Updated URL for Markdown references plugin ([#1022]({{ site.repository }}/issues/1022))
445969
446970 ### Development Fixes
971 {: #development-fixes-v1-0-1}
447972 - Markdownify history file ([#1027]({{ site.repository }}/issues/1027))
448973 - Update links on README to point to new jekyllrb.com ([#1018]({{ site.repository }}/issues/1018))
449974
975
450976 ## 1.0.0 / 2013-05-06
977 {: #v1-0-0}
451978
452979 ### Major Enhancements
453 - Add `jekyll new` subcommand: generate a jekyll scaffold ([#764]({{ site.repository }}/issues/764))
454 - Refactored jekyll commands into subcommands: build, serve, and migrate. ([#690]({{ site.repository }}/issues/690))
980 {: #major-enhancements-v1-0-0}
981 - Add `jekyll new` subcommand: generate a Jekyll scaffold ([#764]({{ site.repository }}/issues/764))
982 - Refactored Jekyll commands into subcommands: build, serve, and migrate. ([#690]({{ site.repository }}/issues/690))
455983 - Removed importers/migrators from main project, migrated to jekyll-import sub-gem ([#793]({{ site.repository }}/issues/793))
456984 - Added ability to render drafts in `_drafts` folder via command line ([#833]({{ site.repository }}/issues/833))
457985 - Add ordinal date permalink style (/:categories/:year/:y_day/:title.html) ([#928]({{ site.repository }}/issues/928))
458986
459987 ### Minor Enhancements
988 {: #minor-enhancements-v1-0-0}
460989 - Site template HTML5-ified ([#964]({{ site.repository }}/issues/964))
461 - Use post's directory path when matching for the post_url tag ([#998]({{ site.repository }}/issues/998))
990 - Use post's directory path when matching for the `post_url` tag ([#998]({{ site.repository }}/issues/998))
462991 - Loosen dependency on Pygments so it's only required when it's needed ([#1015]({{ site.repository }}/issues/1015))
463992 - Parse strings into Time objects for date-related Liquid filters ([#1014]({{ site.repository }}/issues/1014))
464993 - Tell the user if there is no subcommand specified ([#1008]({{ site.repository }}/issues/1008))
4721001 - Expose new attribute to Liquid via `page`: `page.path` ([#951]({{ site.repository }}/issues/951))
4731002 - Accept multiple config files from command line ([#945]({{ site.repository }}/issues/945))
4741003 - Add page variable to liquid custom tags and blocks ([#413]({{ site.repository }}/issues/413))
475 - Add paginator.previous_page_path and paginator.next_page_path ([#942]({{ site.repository }}/issues/942))
1004 - Add `paginator.previous_page_path` and `paginator.next_page_path` ([#942]({{ site.repository }}/issues/942))
4761005 - Backwards compatibility for 'auto' ([#821]({{ site.repository }}/issues/821), [#934]({{ site.repository }}/issues/934))
4771006 - Added date_to_rfc822 used on RSS feeds ([#892]({{ site.repository }}/issues/892))
4781007 - Upgrade version of pygments.rb to 0.4.2 ([#927]({{ site.repository }}/issues/927))
4911020 - Relaxed Kramdown version to 0.14 ([#808]({{ site.repository }}/issues/808))
4921021 - Aliased `jekyll server` to `jekyll serve`. ([#792]({{ site.repository }}/issues/792))
4931022 - Updated gem versions for Kramdown, Rake, Shoulda, Cucumber, and RedCarpet. ([#744]({{ site.repository }}/issues/744))
494 - Refactored jekyll subcommands into Jekyll::Commands submodule, which now contains them ([#768]({{ site.repository }}/issues/768))
1023 - Refactored Jekyll subcommands into Jekyll::Commands submodule, which now contains them ([#768]({{ site.repository }}/issues/768))
4951024 - Rescue from import errors in Wordpress.com migrator ([#671]({{ site.repository }}/issues/671))
4961025 - Massively accelerate LSI performance ([#664]({{ site.repository }}/issues/664))
4971026 - Truncate post slugs when importing from Tumblr ([#496]({{ site.repository }}/issues/496))
5061035 - Paginate in subdirectories properly ([#1016]({{ site.repository }}/issues/1016))
5071036 - Ensure post and page URLs have a leading slash ([#992]({{ site.repository }}/issues/992))
5081037 - Catch all exceptions, not just StandardError descendents ([#1007]({{ site.repository }}/issues/1007))
509 - Bullet-proof limit_posts option ([#1004]({{ site.repository }}/issues/1004))
1038 - Bullet-proof `limit_posts` option ([#1004]({{ site.repository }}/issues/1004))
5101039 - Read in YAML as UTF-8 to accept non-ASCII chars ([#836]({{ site.repository }}/issues/836))
5111040 - Fix the CLI option `--plugins` to actually accept dirs and files ([#993]({{ site.repository }}/issues/993))
5121041 - Allow 'excerpt' in YAML Front-Matter to override the extracted excerpt ([#946]({{ site.repository }}/issues/946))
5181047 - Force usage of older directory_watcher gem as 1.5 is broken ([#883]({{ site.repository }}/issues/883))
5191048 - Ensure all Post categories are downcase ([#842]({{ site.repository }}/issues/842), [#872]({{ site.repository }}/issues/872))
5201049 - Force encoding of the rdiscount TOC to UTF8 to avoid conversion errors ([#555]({{ site.repository }}/issues/555))
521 - Patch for multibyte URI problem with jekyll serve ([#723]({{ site.repository }}/issues/723))
1050 - Patch for multibyte URI problem with `jekyll serve` ([#723]({{ site.repository }}/issues/723))
5221051 - Order plugin execution by priority ([#864]({{ site.repository }}/issues/864))
5231052 - Fixed Page#dir and Page#url for edge cases ([#536]({{ site.repository }}/issues/536))
524 - Fix broken post_url with posts with a time in their YAML Front-Matter ([#831]({{ site.repository }}/issues/831))
1053 - Fix broken `post_url` with posts with a time in their YAML Front-Matter ([#831]({{ site.repository }}/issues/831))
5251054 - Look for plugins under the source directory ([#654]({{ site.repository }}/issues/654))
5261055 - Tumblr Migrator: finds `_posts` dir correctly, fixes truncation of long
5271056 post names ([#775]({{ site.repository }}/issues/775))
5311060 - Prevent custom destination from causing continuous regen on watch ([#528]({{ site.repository }}/issues/528), [#820]({{ site.repository }}/issues/820), [#862]({{ site.repository }}/issues/862))
5321061
5331062 ### Site Enhancements
1063 {: #site-enhancements-v1-0-0}
5341064 - Responsify ([#860]({{ site.repository }}/issues/860))
5351065 - Fix spelling, punctuation and phrasal errors ([#989]({{ site.repository }}/issues/989))
5361066 - Update quickstart instructions with `new` command ([#966]({{ site.repository }}/issues/966))
5411071 - Redesigned site ([#583]({{ site.repository }}/issues/583))
5421072
5431073 ### Development Fixes
1074 {: #development-fixes-v1-0-0}
5441075 - Exclude Cucumber 1.2.4, which causes tests to fail in 1.9.2 ([#938]({{ site.repository }}/issues/938))
5451076 - Added "features:html" rake task for debugging purposes, cleaned up
546 cucumber profiles ([#832]({{ site.repository }}/issues/832))
1077 Cucumber profiles ([#832]({{ site.repository }}/issues/832))
5471078 - Explicitly require HTTPS rubygems source in Gemfile ([#826]({{ site.repository }}/issues/826))
5481079 - Changed Ruby version for development to 1.9.3-p374 from p362 ([#801]({{ site.repository }}/issues/801))
5491080 - Including a link to the GitHub Ruby style guide in CONTRIBUTING.md ([#806]({{ site.repository }}/issues/806))
5521083 of greater than 1.9 ([#771]({{ site.repository }}/issues/771))
5531084 - Switch to Simplecov for coverage report ([#765]({{ site.repository }}/issues/765))
5541085
1086
5551087 ## 0.12.1 / 2013-02-19
556 ### Minor Enhancements
1088 {: #v0-12-1}
1089
1090 ### Minor Enhancements
1091 {: #minor-enhancements-v0-12-1}
5571092 - Update Kramdown version to 0.14.1 ([#744]({{ site.repository }}/issues/744))
5581093 - Test Enhancements
5591094 - Update Rake version to 10.0.3 ([#744]({{ site.repository }}/issues/744))
5601095 - Update Shoulda version to 3.3.2 ([#744]({{ site.repository }}/issues/744))
5611096 - Update Redcarpet version to 2.2.2 ([#744]({{ site.repository }}/issues/744))
5621097
1098
5631099 ## 0.12.0 / 2012-12-22
564 ### Minor Enhancements
1100 {: #v0-12-0}
1101
1102 ### Minor Enhancements
1103 {: #minor-enhancements-v0-12-0}
5651104 - Add ability to explicitly specify included files ([#261]({{ site.repository }}/issues/261))
566 - Add --default-mimetype option ([#279]({{ site.repository }}/issues/279))
1105 - Add `--default-mimetype` option ([#279]({{ site.repository }}/issues/279))
5671106 - Allow setting of RedCloth options ([#284]({{ site.repository }}/issues/284))
568 - Add post_url Liquid tag for internal post linking ([#369]({{ site.repository }}/issues/369))
1107 - Add `post_url` Liquid tag for internal post linking ([#369]({{ site.repository }}/issues/369))
5691108 - Allow multiple plugin dirs to be specified ([#438]({{ site.repository }}/issues/438))
5701109 - Inline TOC token support for RDiscount ([#333]({{ site.repository }}/issues/333))
5711110 - Add the option to specify the paginated url format ([#342]({{ site.repository }}/issues/342))
5751114 - Bug Fixes
5761115 - Allow some special characters in highlight names
5771116 - URL escape category names in URL generation ([#360]({{ site.repository }}/issues/360))
578 - Fix error with limit_posts ([#442]({{ site.repository }}/issues/442))
1117 - Fix error with `limit_posts` ([#442]({{ site.repository }}/issues/442))
5791118 - Properly select dotfile during directory scan ([#363]({{ site.repository }}/issues/363), [#431]({{ site.repository }}/issues/431), [#377]({{ site.repository }}/issues/377))
580 - Allow setting of Kramdown smart_quotes ([#482]({{ site.repository }}/issues/482))
1119 - Allow setting of Kramdown `smart_quotes` ([#482]({{ site.repository }}/issues/482))
5811120 - Ensure front-matter is at start of file ([#562]({{ site.repository }}/issues/562))
5821121
1122
5831123 ## 0.11.2 / 2011-12-27
1124 {: #v0-11-2}
5841125 - Bug Fixes
5851126 - Fix gemspec
5861127
1128
5871129 ## 0.11.1 / 2011-12-27
1130 {: #v0-11-1}
5881131 - Bug Fixes
5891132 - Fix extra blank line in highlight blocks ([#409]({{ site.repository }}/issues/409))
5901133 - Update dependencies
5911134
1135
5921136 ## 0.11.0 / 2011-07-10
1137 {: #v0-11-0}
1138
5931139 ### Major Enhancements
1140 {: #major-enhancements-v0-11-0}
5941141 - Add command line importer functionality ([#253]({{ site.repository }}/issues/253))
5951142 - Add Redcarpet Markdown support ([#318]({{ site.repository }}/issues/318))
5961143 - Make markdown/textile extensions configurable ([#312]({{ site.repository }}/issues/312))
5971144 - Add `markdownify` filter
5981145
5991146 ### Minor Enhancements
1147 {: #minor-enhancements-v0-11-0}
6001148 - Switch to Albino gem
6011149 - Bundler support
6021150 - Use English library to avoid hoops ([#292]({{ site.repository }}/issues/292))
6091157 - Bug Fixes
6101158 - Secure additional path exploits
6111159
1160
6121161 ## 0.10.0 / 2010-12-16
613 - Bug Fixes
614 - Add --no-server option.
1162 {: #v0-10-0}
1163 - Bug Fixes
1164 - Add `--no-server` option.
1165
6151166
6161167 ## 0.9.0 / 2010-12-15
617 ### Minor Enhancements
1168 {: #v0-9-0}
1169
1170 ### Minor Enhancements
1171 {: #minor-enhancements-v0-9-0}
6181172 - Use OptionParser's `[no-]` functionality for better boolean parsing.
6191173 - Add Drupal migrator ([#245]({{ site.repository }}/issues/245))
6201174 - Complain about YAML and Liquid errors ([#249]({{ site.repository }}/issues/249))
6211175 - Remove orphaned files during regeneration ([#247]({{ site.repository }}/issues/247))
6221176 - Add Marley migrator ([#28]({{ site.repository }}/issues/28))
6231177
1178
6241179 ## 0.8.0 / 2010-11-22
625 ### Minor Enhancements
1180 {: #v0-8-0}
1181
1182 ### Minor Enhancements
1183 {: #minor-enhancements-v0-8-0}
6261184 - Add wordpress.com importer ([#207]({{ site.repository }}/issues/207))
627 - Add --limit-posts cli option ([#212]({{ site.repository }}/issues/212))
628 - Add uri_escape filter ([#234]({{ site.repository }}/issues/234))
629 - Add --base-url cli option ([#235]({{ site.repository }}/issues/235))
1185 - Add `--limit-posts` cli option ([#212]({{ site.repository }}/issues/212))
1186 - Add `uri_escape` filter ([#234]({{ site.repository }}/issues/234))
1187 - Add `--base-url` cli option ([#235]({{ site.repository }}/issues/235))
6301188 - Improve MT migrator ([#238]({{ site.repository }}/issues/238))
6311189 - Add kramdown support ([#239]({{ site.repository }}/issues/239))
6321190 - Bug Fixes
6341192 - Set mode to UTF8 on Sequel connections ([#237]({{ site.repository }}/issues/237))
6351193 - Prevent `_includes` dir from being a symlink
6361194
1195
6371196 ## 0.7.0 / 2010-08-24
638 ### Minor Enhancements
1197 {: #v0-7-0}
1198
1199 ### Minor Enhancements
1200 {: #minor-enhancements-v0-7-0}
6391201 - Add support for rdiscount extensions ([#173]({{ site.repository }}/issues/173))
6401202 - Bug Fixes
6411203 - Highlight should not be able to render local files
6421204 - The site configuration may not always provide a 'time' setting ([#184]({{ site.repository }}/issues/184))
6431205
1206
6441207 ## 0.6.2 / 2010-06-25
1208 {: #v0-6-2}
6451209 - Bug Fixes
6461210 - Fix Rakefile 'release' task (tag pushing was missing origin)
6471211 - Ensure that RedCloth is loaded when textilize filter is used ([#183]({{ site.repository }}/issues/183))
6481212 - Expand source, destination, and plugin paths ([#180]({{ site.repository }}/issues/180))
649 - Fix page.url to include full relative path ([#181]({{ site.repository }}/issues/181))
1213 - Fix `page.url` to include full relative path ([#181]({{ site.repository }}/issues/181))
1214
6501215
6511216 ## 0.6.1 / 2010-06-24
1217 {: #v0-6-1}
6521218 - Bug Fixes
6531219 - Fix Markdown Pygments prefix and suffix ([#178]({{ site.repository }}/issues/178))
6541220
1221
6551222 ## 0.6.0 / 2010-06-23
1223 {: #v0-6-0}
1224
6561225 ### Major Enhancements
1226 {: #major-enhancements-v0-6-0}
6571227 - Proper plugin system ([#19]({{ site.repository }}/issues/19), [#100]({{ site.repository }}/issues/100))
6581228 - Add safe mode so unsafe converters/generators can be added
6591229 - Maruku is now the only processor dependency installed by default.
6611231 user to install them when necessary) ([#57]({{ site.repository }}/issues/57))
6621232
6631233 ### Minor Enhancements
1234 {: #minor-enhancements-v0-6-0}
6641235 - Inclusion/exclusion of future dated posts ([#59]({{ site.repository }}/issues/59))
6651236 - Generation for a specific time ([#59]({{ site.repository }}/issues/59))
666 - Allocate site.time on render not per site_payload invocation ([#59]({{ site.repository }}/issues/59))
1237 - Allocate `site.time` on render not per site_payload invocation ([#59]({{ site.repository }}/issues/59))
6671238 - Pages now present in the site payload and can be used through the
668 site.pages and site.html_pages variables
1239 `site.pages` and `site.html_pages` variables
6691240 - Generate phase added to site#process and pagination is now a generator
6701241 - Switch to RakeGem for build/test process
6711242 - Only regenerate static files when they have changed ([#142]({{ site.repository }}/issues/142))
6771248 - Fix extension munging when pretty permalinks are enabled ([#64]({{ site.repository }}/issues/64))
6781249 - Stop sorting categories ([#33]({{ site.repository }}/issues/33))
6791250 - Preserve generated attributes over front matter ([#119]({{ site.repository }}/issues/119))
680 - Fix source directory binding using Dir.pwd ([#75]({{ site.repository }}/issues/75))
1251 - Fix source directory binding using `Dir.pwd` ([#75]({{ site.repository }}/issues/75))
1252
6811253
6821254 ## 0.5.7 / 2010-01-12
683 ### Minor Enhancements
1255 {: #v0-5-7}
1256
1257 ### Minor Enhancements
1258 {: #minor-enhancements-v0-5-7}
6841259 - Allow overriding of post date in the front matter ([#62]({{ site.repository }}/issues/62), [#38]({{ site.repository }}/issues/38))
6851260 - Bug Fixes
6861261 - Categories isn't always an array ([#73]({{ site.repository }}/issues/73))
6871262 - Empty tags causes error in read_posts ([#84]({{ site.repository }}/issues/84))
6881263 - Fix pagination to adhere to read/render/write paradigm
6891264 - Test Enhancement
690 - cucumber features no longer use site.posts.first where a better
1265 - Cucumber features no longer use site.posts.first where a better
6911266 alternative is available
6921267
1268
6931269 ## 0.5.6 / 2010-01-08
1270 {: #v0-5-6}
6941271 - Bug Fixes
6951272 - Require redcloth >= 4.2.1 in tests ([#92]({{ site.repository }}/issues/92))
6961273 - Don't break on triple dashes in yaml frontmatter ([#93]({{ site.repository }}/issues/93))
6971274
6981275 ### Minor Enhancements
1276 {: #minor-enhancements-v0-5-6}
6991277 - Allow .mkd as markdown extension
7001278 - Use $stdout/err instead of constants ([#99]({{ site.repository }}/issues/99))
7011279 - Properly wrap code blocks ([#91]({{ site.repository }}/issues/91))
7021280 - Add javascript mime type for webrick ([#98]({{ site.repository }}/issues/98))
7031281
1282
7041283 ## 0.5.5 / 2010-01-08
1284 {: #v0-5-5}
7051285 - Bug Fixes
7061286 - Fix pagination % 0 bug ([#78]({{ site.repository }}/issues/78))
7071287 - Ensure all posts are processed first ([#71]({{ site.repository }}/issues/71))
1288
7081289
7091290 ## NOTE
7101291 - After this point I will no longer be giving credit in the history;
7111292 that is what the commit log is for.
7121293
1294
7131295 ## 0.5.4 / 2009-08-23
1296 {: #v0-5-4}
7141297 - Bug Fixes
7151298 - Do not allow symlinks (security vulnerability)
7161299
1300
7171301 ## 0.5.3 / 2009-07-14
1302 {: #v0-5-3}
7181303 - Bug Fixes
7191304 - Solving the permalink bug where non-html files wouldn't work
7201305 ([@jeffrydegrande](https://github.com/jeffrydegrande))
7211306
1307
7221308 ## 0.5.2 / 2009-06-24
1309 {: #v0-5-2}
7231310 - Enhancements
7241311 - Added --paginate option to the executable along with a paginator object
7251312 for the payload ([@calavera](https://github.com/calavera))
7281315 - Configuration options set in config.yml are now available through the
7291316 site payload ([@vilcans](https://github.com/vilcans))
7301317 - Posts can now have an empty YAML front matter or none at all
731 ([@bahuvrihi](https://github.com/bahuvrihi))
732 - Bug Fixes
733 - Fixing Ruby 1.9 issue that requires to_s on the err object
1318 (@ bahuvrihi)
1319 - Bug Fixes
1320 - Fixing Ruby 1.9 issue that requires `#to_s` on the err object
7341321 ([@Chrononaut](https://github.com/Chrononaut))
7351322 - Fixes for pagination and ordering posts on the same day ([@ujh](https://github.com/ujh))
7361323 - Made pages respect permalinks style and permalinks in yml front matter
7401327 - Added trailing slash to pretty permalink style so Apache is happy
7411328 ([@eugenebolshakov](https://github.com/eugenebolshakov))
7421329 - Bad markdown processor in config fails sooner and with better message
743 ([@gcnovus](https://github.com/gcnovus))
1330 (@ gcnovus)
7441331 - Allow CRLFs in yaml frontmatter ([@juretta](https://github.com/juretta))
7451332 - Added Date#xmlschema for Ruby versions < 1.9
7461333
1334
7471335 ## 0.5.1 / 2009-05-06
1336 {: #v0-5-1}
1337
7481338 ### Major Enhancements
1339 {: #major-enhancements-v0-5-1}
7491340 - Next/previous posts in site payload ([@pantulis](https://github.com/pantulis), [@tomo](https://github.com/tomo))
7501341 - Permalink templating system
7511342 - Moved most of the README out to the GitHub wiki
7581349 after highlight ([@henrik](https://github.com/henrik))
7591350 - CGI escaped post titles ([@Chrononaut](https://github.com/Chrononaut))
7601351
1352
7611353 ## 0.5.0 / 2009-04-07
762 ### Minor Enhancements
1354 {: #v0-5-0}
1355
1356 ### Minor Enhancements
1357 {: #minor-enhancements-v0-5-0}
7631358 - Ability to set post categories via YAML ([@qrush](https://github.com/qrush))
7641359 - Ability to set prevent a post from publishing via YAML ([@qrush](https://github.com/qrush))
7651360 - Add textilize filter ([@willcodeforfoo](https://github.com/willcodeforfoo))
7761371 - Fix tests and convert to Shoulda ([@qrush](https://github.com/qrush), [@technicalpickles](https://github.com/technicalpickles))
7771372 - Add Cucumber acceptance test suite ([@qrush](https://github.com/qrush), [@technicalpickles](https://github.com/technicalpickles))
7781373
1374
7791375 ## 0.4.1
780 ### Minor Enhancements
1376
1377 ### Minor Enhancements
1378 {: #minor-enhancements-v--}
7811379 - Changed date format on wordpress converter (zeropadding) ([@dysinger](https://github.com/dysinger))
7821380 - Bug Fixes
783 - Add jekyll binary as executable to gemspec ([@dysinger](https://github.com/dysinger))
1381 - Add Jekyll binary as executable to gemspec ([@dysinger](https://github.com/dysinger))
1382
7841383
7851384 ## 0.4.0 / 2009-02-03
1385 {: #v0-4-0}
1386
7861387 ### Major Enhancements
1388 {: #major-enhancements-v0-4-0}
7871389 - Switch to Jeweler for packaging tasks
7881390
7891391 ### Minor Enhancements
1392 {: #minor-enhancements-v0-4-0}
7901393 - Type importer ([@codeslinger](https://github.com/codeslinger))
791 - site.topics accessor ([@baz](https://github.com/baz))
1394 - `site.topics` accessor ([@baz](https://github.com/baz))
7921395 - Add `array_to_sentence_string` filter ([@mchung](https://github.com/mchung))
7931396 - Add a converter for textpattern ([@PerfectlyNormal](https://github.com/PerfectlyNormal))
7941397 - Add a working Mephisto / MySQL converter ([@ivey](https://github.com/ivey))
8021405 - Test and fix the site.categories hash ([@zzot](https://github.com/zzot))
8031406 - Fix site payload available to files ([@matrix9180](https://github.com/matrix9180))
8041407
1408
8051409 ## 0.3.0 / 2008-12-24
1410 {: #v0-3-0}
1411
8061412 ### Major Enhancements
807 - Added --server option to start a simple WEBrick server on destination
1413 {: #major-enhancements-v0-3-0}
1414 - Added `--server` option to start a simple WEBrick server on destination
8081415 directory ([@johnreilly](https://github.com/johnreilly) and [@mchung](https://github.com/mchung))
8091416
8101417 ### Minor Enhancements
1418 {: #minor-enhancements-v0-3-0}
8111419 - Added post categories based on directories containing `_posts` ([@mreid](https://github.com/mreid))
8121420 - Added post topics based on directories underneath `_posts`
8131421 - Added new date filter that shows the full month name ([@mreid](https://github.com/mreid))
8201428 templates ([@mreid](https://github.com/mreid))
8211429 - Properly reject directories in `_layouts`
8221430
1431
8231432 ## 0.2.1 / 2008-12-15
1433 {: #v0-2-1}
8241434 - Major Changes
8251435 - Use Maruku (pure Ruby) for Markdown by default ([@mreid](https://github.com/mreid))
826 - Allow use of RDiscount with --rdiscount flag
827
828 ### Minor Enhancements
1436 - Allow use of RDiscount with `--rdiscount` flag
1437
1438 ### Minor Enhancements
1439 {: #minor-enhancements-v0-2-1}
8291440 - Don't load directory_watcher unless it's needed ([@pjhyett](https://github.com/pjhyett))
8301441
1442
8311443 ## 0.2.0 / 2008-12-14
1444 {: #v0-2-0}
8321445 - Major Changes
833 - related_posts is now found in site.related_posts
1446 - related_posts is now found in `site.related_posts`
1447
8341448
8351449 ## 0.1.6 / 2008-12-13
1450 {: #v0-1-6}
8361451 - Major Features
8371452 - Include files in `_includes` with {% raw %}`{% include x.textile %}`{% endraw %}
8381453
1454
8391455 ## 0.1.5 / 2008-12-12
1456 {: #v0-1-5}
1457
8401458 ### Major Enhancements
841 - Code highlighting with Pygments if --pygments is specified
842 - Disable true LSI by default, enable with --lsi
843
844 ### Minor Enhancements
1459 {: #major-enhancements-v0-1-5}
1460 - Code highlighting with Pygments if `--pygments` is specified
1461 - Disable true LSI by default, enable with `--lsi`
1462
1463 ### Minor Enhancements
1464 {: #minor-enhancements-v0-1-5}
8451465 - Output informative message if RDiscount is not available ([@JackDanger](https://github.com/JackDanger))
8461466 - Bug Fixes
8471467 - Prevent Jekyll from picking up the output directory as a source ([@JackDanger](https://github.com/JackDanger))
8481468 - Skip `related_posts` when there is only one post ([@JackDanger](https://github.com/JackDanger))
8491469
1470
8501471 ## 0.1.4 / 2008-12-08
1472 {: #v0-1-4}
8511473 - Bug Fixes
8521474 - DATA does not work properly with rubygems
8531475
1476
8541477 ## 0.1.3 / 2008-12-06
1478 {: #v0-1-3}
8551479 - Major Features
8561480 - Markdown support ([@vanpelt](https://github.com/vanpelt))
8571481 - Mephisto and CSV converters ([@vanpelt](https://github.com/vanpelt))
8581482 - Code hilighting ([@vanpelt](https://github.com/vanpelt))
8591483 - Autobuild
8601484 - Bug Fixes
861 - Accept both \r\n and \n in YAML header ([@vanpelt](https://github.com/vanpelt))
1485 - Accept both `\r\n` and `\n` in YAML header ([@vanpelt](https://github.com/vanpelt))
1486
8621487
8631488 ## 0.1.2 / 2008-11-22
1489 {: #v0-1-2}
8641490 - Major Features
8651491 - Add a real "related posts" implementation using Classifier
8661492 - Command Line Changes
8671493 - Allow cli to be called with 0, 1, or 2 args intuiting dir paths
8681494 if they are omitted
8691495
1496
8701497 ## 0.1.1 / 2008-11-22
1498 {: #v0-1-1}
8711499 - Minor Additions
8721500 - Posts now support introspectional data e.g. {% raw %}`{{ page.url }}`{% endraw %}
8731501
1502
8741503 ## 0.1.0 / 2008-11-05
1504 {: #v0-1-0}
8751505 - First release
8761506 - Converts posts written in Textile
8771507 - Converts regular site pages
8781508 - Simple copy of binary files
8791509
1510
8801511 ## 0.0.0 / 2008-10-19
1512 {: #v0-0-0}
8811513 - Birthday!
1515 Jekyll is a simple, blog-aware, static site generator. It takes a template
1616 directory containing raw text files in various formats, runs it through
1717 [Markdown](http://daringfireball.net/projects/markdown/) (or
18 [Textile](http://textile.sitemonks.com/)) and
18 [Textile](http://redcloth.org/textile)) and
1919 [Liquid](http://wiki.shopify.com/Liquid)
2020 converters, and spits out a complete, ready-to-publish static website suitable
2121 for serving with your favorite web server. Jekyll also happens to be the engine
2323 to host your project’s page, blog, or website from GitHub’s servers **for
2424 free**.
2525
26 ## ProTips™, Notes, and Warnings
26 ## Helpful Hints
2727
2828 Throughout this guide there are a number of small-but-handy pieces of
2929 information that can make using Jekyll easier, more interesting, and less
4545 <p>Be aware of these messages if you wish to avoid certain death.</p>
4646 </div>
4747
48 <div class="note unreleased">
49 <h5>You'll see this by a feature that hasn't been released</h5>
50 <p>Some pieces of this website are for future versions of Jekyll that
51 are not yet released.</p>
52 </div>
53
4854 If you come across anything along the way that we haven’t covered, or if you
4955 know of a tip you think others would find handy, please [file an
5056 issue]({{ site.repository }}/issues/new) and we’ll see about
1818 - [Ruby](http://www.ruby-lang.org/en/downloads/)
1919 - [RubyGems](http://rubygems.org/pages/download)
2020 - Linux, Unix, or Mac OS X
21 - [NodeJS](http://nodejs.org), or another JavaScript runtime (for
22 CoffeeScript support).
2123
2224 <div class="note info">
2325 <h5>Running Jekyll on Windows</h5>
2426 <p>
25 It is possible to get
26 <a href="http://www.madhur.co.in/blog/2011/09/01/runningjekyllwindows.html">
27 Jekyll running on Windows</a>, but the official documentation does not
28 support installation on Windows platforms.
27 While Windows is not officially supported, it is possible to get it running
28 on Windows. Special instructions can be found on our
29 <a href="../windows/#installation">Windows-specific docs page</a>.
2930 </p>
3031 </div>
3132
3233 ## Install with RubyGems
3334
3435 The best way to install Jekyll is via
35 [RubyGems](http://docs.rubygems.org/read/chapter/3). At the terminal prompt,
36 [RubyGems](http://rubygems.org/pages/download). At the terminal prompt,
3637 simply run the following command to install Jekyll:
3738
3839 {% highlight bash %}
5556 </p>
5657 </div>
5758
59 ## Pre-releases
60
61 In order to install a pre-release, make sure you have all the requirements
62 installed properly and run:
63
64 {% highlight bash %}
65 gem install jekyll --pre
66 {% endhighlight %}
67
68 This will install the latest pre-release. If you want a particular pre-release,
69 use the `-v` switch to indicate the version you'd like to install:
70
71 {% highlight bash %}
72 gem install jekyll -v '2.0.0.alpha.1'
73 {% endhighlight %}
74
75 If you'd like to install a development version of Jekyll, the process is a bit
76 more involved. This gives you the advantage of having the latest and greatest,
77 but may be unstable.
78
79 {% highlight bash %}
80 $ git clone git://github.com/jekyll/jekyll.git
81 $ cd jekyll
82 $ script/bootstrap
83 $ bundle exec rake build
84 $ ls pkg/*.gem | head -n 1 | xargs gem install -l
85 {% endhighlight %}
86
5887 ## Optional Extras
5988
6089 There are a number of (optional) extra features that Jekyll supports that you
6695 <h5>ProTip™: Enable Syntax Highlighting</h5>
6796 <p>
6897 If you’re the kind of person who is using Jekyll, then chances are you’ll
69 want to enable syntax highlighting using Pygments. You should really
70 <a href="../templates/#code_snippet_highlighting">check out how to do
71 that</a> before you go any further.
98 want to enable syntax highlighting using <a href="http://pygments.org/">Pygments</a>
99 or <a href="https://github.com/jayferd/rouge">Rouge</a>. You should really
100 <a href="../templates/#code-snippet-highlighting">check out how to
101 do that</a> before you go any farther.
72102 </p>
73103 </div>
74104
00 ---
11 layout: docs
22 title: Blog migrations
3 prev_section: datafiles
3 prev_section: assets
44 next_section: templates
55 permalink: /docs/migrations/
66 ---
77
88 If you’re switching to Jekyll from another blogging system, Jekyll’s importers
99 can help you with the move. To learn more about importing your site to Jekyll,
10 visit our [`jekyll-import` docs site](http://import.jekyllrb.com).
10 visit our [`jekyll-import` docs site](http://import.jekyllrb.com/docs/home/).
122122 <p>Pagination pages through every post in the <code>posts</code>
123123 variable regardless of variables defined in the YAML Front Matter of
124124 each. It does not currently allow paging over groups of posts linked
125 by a common tag or category.</p>
125 by a common tag or category. It cannot include any collection of
126 documents because it is restricted to posts.</p>
126127 </div>
127128
128129 ## Render the paginated Posts
6464 </td>
6565 <td>
6666 <p>Day from the Post’s filename without leading zeros.</p>
67 </td>
68 </tr>
69 <tr>
70 <td>
71 <p><code>short_year</code></p>
72 </td>
73 <td>
74 <p>Year from the Post’s filename without the century.</p>
6775 </td>
6876 </tr>
6977 <tr>
137145 <table>
138146 <thead>
139147 <tr>
140 <th>Permalink Setting</th>
148 <th>URL Template</th>
141149 <th>Resulting Permalink URL</th>
142150 </tr>
143151 </thead>
152160 </tr>
153161 <tr>
154162 <td>
155 <p><code>permalink: pretty</code></p>
163 <p><code>pretty</code></p>
156164 </td>
157165 <td>
158166 <p><code>/2009/04/29/slap-chop/index.html</code></p>
160168 </tr>
161169 <tr>
162170 <td>
163 <p><code>permalink: /:month-:day-:year/:title.html</code></p>
171 <p><code>/:month-:day-:year/:title.html</code></p>
164172 </td>
165173 <td>
166174 <p><code>/04-29-2009/slap-chop.html</code></p>
168176 </tr>
169177 <tr>
170178 <td>
171 <p><code>permalink: /blog/:year/:month/:day/:title</code></p>
179 <p><code>/blog/:year/:month/:day/:title</code></p>
172180 </td>
173181 <td>
174182 <p><code>/blog/2009/04/29/slap-chop/index.html</code></p>
7272 and are available via `site.pages`. Static files become instances of
7373 [`Jekyll::StaticFile`]({{ site.repository }}/blob/master/lib/jekyll/static_file.rb)
7474 and are available via `site.static_files`. See
75 [the Variables documentation page](/docs/variables/) and
7576 [`Jekyll::Site`]({{ site.repository }}/blob/master/lib/jekyll/site.rb)
7677 for more details.
7778
338339 <h5>ProTip™: Access the site object using Liquid</h5>
339340 <p>
340341 Jekyll lets you access the <code>site</code> object through the
341 <code>context.registers</code> feature of Liquid. For example, you can
342 <code>context.registers</code> feature of Liquid at <code>context.registers[:site]</code>. For example, you can
342343 access the global configuration file <code>_config.yml</code> using
343 <code>context.registers.config</code>.
344 <code>context.registers[:site].config</code>.
344345 </p>
345346 </div>
346347
421422 - [Monthly archive generator by Shigeya Suzuki](https://github.com/shigeya/jekyll-monthly-archive-plugin): Generator and template which renders monthly archive like MovableType style, based on the work by Ilkka Laukkanen and others above.
422423 - [Category archive generator by Shigeya Suzuki](https://github.com/shigeya/jekyll-category-archive-plugin): Generator and template which renders category archive like MovableType style, based on Monthly archive generator.
423424 - [Emoji for Jekyll](https://github.com/yihangho/emoji-for-jekyll): Seamlessly enable emoji for all posts and pages.
425 - [Compass integration for Jekyll](https://github.com/mscharley/jekyll-compass): Easily integrate Compass and Sass with your Jekyll website.
426 - [Pages Directory by Ben Baker-Smith](https://github.com/bbakersmith/jekyll-pages-directory): Defines a `_pages` directory for page files which routes its output relative to the project root.
427 - [Page Collections by Jeff Kolesky](https://github.com/jeffkole/jekyll-page-collections): Generates collections of pages with functionality that resembles posts.
428 - [Windows 8.1 Live Tile Generation by Matt Sheehan](https://github.com/sheehamj13/jekyll-live-tiles): Generates Internet Explorer 11 config.xml file and Tile Templates for pinning your site to Windows 8.1.
429 - [Jekyll::AutolinkEmail by Ivan Tse](https://github.com/ivantsepp/jekyll-autolink_email): Autolink your emails.
430 - [Jekyll::GitMetadata by Ivan Tse](https://github.com/ivantsepp/jekyll-git_metadata): Expose Git metadata for your templates.
424431
425432 #### Converters
426433
437444 - [ReStructuredText Converter](https://github.com/xdissent/jekyll-rst): Converts ReST documents to HTML with Pygments syntax highlighting.
438445 - [Jekyll-pandoc-plugin](https://github.com/dsanson/jekyll-pandoc-plugin): Use pandoc for rendering markdown.
439446 - [Jekyll-pandoc-multiple-formats](https://github.com/fauno/jekyll-pandoc-multiple-formats) by [edsl](https://github.com/edsl): Use pandoc to generate your site in multiple formats. Supports pandoc’s markdown extensions.
440 - [ReStructuredText Converter](https://github.com/xdissent/jekyll-rst): Converts ReST documents to HTML with Pygments syntax highlighting.
441447 - [Transform Layouts](https://gist.github.com/1472645): Allows HAML layouts (you need a HAML Converter plugin for this to work).
442448 - [Org-mode Converter](https://gist.github.com/abhiyerra/7377603): Org-mode converter for Jekyll.
449 - [Customized Kramdown Converter](https://github.com/mvdbos/kramdown-with-pygments): Enable Pygments syntax highlighting for Kramdown-parsed fenced code blocks.
443450
444451 #### Filters
445452
449456 - [URL encoding by James An](https://gist.github.com/919275): Percent encoding for URIs.
450457 - [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.
451458 - [i18n_filter](https://github.com/gacha/gacha.id.lv/blob/master/_plugins/i18n_filter.rb): Liquid filter to use I18n localization.
452 - [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/)).
459 - [Smilify](https://github.com/SaswatPadhi/jekyll_smilify) by [SaswatPadhi](https://github.com/SaswatPadhi): Convert text emoticons in your content to themeable smiley pics.
453460 - [Read in X Minutes](https://gist.github.com/zachleat/5792681) by [zachleat](https://github.com/zachleat): Estimates the reading time of a string (for blog post content).
454461 - [Jekyll-timeago](https://github.com/markets/jekyll-timeago): Converts a time value to the time ago in words.
455462 - [pluralize](https://github.com/bdesham/pluralize): Easily combine a number and a word into a gramatically-correct amount like “1 minute” or “2 minute**s**”.
456463 - [reading_time](https://github.com/bdesham/reading_time): Count words and estimate reading time for a piece of text, ignoring HTML elements that are unlikely to contain running text.
457464 - [Table of Content Generator](https://github.com/dafi/jekyll-toc-generator): Generate the HTML code containing a table of content (TOC), the TOC can be customized in many way, for example you can decide which pages can be without TOC.
465 - [jekyll-humanize](https://github.com/23maverick23/jekyll-humanize): This is a port of the Django app humanize which adds a "human touch" to data. Each method represents a Fluid type filter that can be used in your Jekyll site templates. Given that Jekyll produces static sites, some of the original methods do not make logical sense to port (e.g. naturaltime).
466 - [Jekyll-Ordinal](https://github.com/PatrickC8t/Jekyll-Ordinal): Jekyll liquid filter to output a date ordinal such as "st", "nd", "rd", or "th".
467 - [Deprecated articles keeper](https://github.com/kzykbys/JekyllPlugins) by [Kazuya Kobayashi](http://blog.kazuya.co/): A simple Jekyll filter which monitor how old an article is.
458468
459469 #### Tags
460470
461471 - [Asset Path Tag](https://github.com/samrayner/jekyll-asset-path-plugin) by [Sam Rayner](http://www.samrayner.com/): Allows organisation of assets into subdirectories by outputting a path for a given file relative to the current post or page.
462472 - [Delicious Plugin by Christian Hellsten](https://github.com/christianhellsten/jekyll-plugins): Fetches and renders bookmarks from delicious.com.
463 - [Ultraviolet Plugin by Steve Alex](https://gist.github.com/480380): Jekyll tag for the [Ultraviolet](http://ultraviolet.rubyforge.org/) code highligher.
473 - [Ultraviolet Plugin by Steve Alex](https://gist.github.com/480380): Jekyll tag for the [Ultraviolet](https://github.com/grosser/ultraviolet) code highligher.
464474 - [Tag Cloud Plugin by Ilkka Laukkanen](https://gist.github.com/710577): Generate a tag cloud that links to tag pages.
465475 - [GIT Tag by Alexandre Girard](https://gist.github.com/730347): Add Git activity inside a list.
466476 - [MathJax Liquid Tags by Jessy Cowan-Sharp](https://gist.github.com/834610): Simple liquid tags for Jekyll that convert inline math and block equations to the appropriate MathJax script tags.
494504 - [Jekyll Date Chart](https://github.com/GSI/jekyll_date_chart) by [GSI](https://github.com/GSI): Block that renders date line charts based on textile-formatted tables.
495505 - [Jekyll Image Encode](https://github.com/GSI/jekyll_image_encode) by [GSI](https://github.com/GSI): Tag that renders base64 codes of images fetched from the web.
496506 - [Jekyll Quick Man](https://github.com/GSI/jekyll_quick_man) by [GSI](https://github.com/GSI): Tag that renders pretty links to man page sources on the internet.
507 - [jekyll-font-awesome](https://gist.github.com/23maverick23/8532525): Quickly and easily add Font Awesome icons to your posts.
508 - [Lychee Gallery Tag](https://gist.github.com/tobru/9171700) by [tobru](https://github.com/tobru): Include [Lychee](http://lychee.electerious.com/) albums into a post. For an introduction, see [Jekyll meets Lychee - A Liquid Tag plugin](https://tobrunet.ch/articles/jekyll-meets-lychee-a-liquid-tag-plugin/)
509 - [Image Set/Gallery Tag](https://github.com/callmeed/jekyll-image-set) by [callmeed](https://github.com/callmeed): Renders HTML for an image gallery from a folder in your Jekyll site. Just pass it a folder name and class/tag options.
510 - [jekyll_figure](https://github.com/lmullen/jekyll_figure): Generate figures and captions with links to the figure in a variety of formats
511 - [Jekyll Github Sample Tag](https://github.com/bwillis/jekyll-github-sample): A liquid tag to include a sample of a github repo file in your Jekyll site.
512 - [Jekyll Project Version Tag](https://github.com/rob-murray/jekyll-version-plugin): A Liquid tag plugin that renders a version identifier for your Jekyll site sourced from the git repository containing your code.
513 - [Piwigo Gallery](https://github.com/AlessandroLorenzi/piwigo_gallery) by [Alessandro Lorenzi](http://www.alorenzi.eu/): Jekyll plugin to generate thumbnails from a Piwigo gallery and display them with a Liquid tag
514
497515
498516 #### Collections
499517
516534 - [Jekyll-scholar](https://github.com/inukshuk/jekyll-scholar): Jekyll extensions for the blogging scholar.
517535 - [Jekyll-asset_bundler](https://github.com/moshen/jekyll-asset_bundler): Bundles and minifies JavaScript and CSS.
518536 - [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).
537 - [JAPR](https://github.com/kitsched/japr): Jekyll Asset Pipeline Reborn - Powerful asset pipeline for Jekyll that collects, converts and compresses JavaScript and CSS assets.
519538 - [File compressor](https://gist.github.com/2758691) by [mytharcher](https://github.com/mytharcher): Compress HTML and JavaScript files on site build.
520539 - [Jekyll-minibundle](https://github.com/tkareine/jekyll-minibundle): Asset bundling and cache busting using external minification tool of your choice. No gem dependencies.
521540 - [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.
522541 - [generator-jekyllrb](https://github.com/robwierzbowski/generator-jekyllrb): A generator that wraps Jekyll in [Yeoman](http://yeoman.io/), a tool collection and workflow for builing modern web apps.
523542 - [grunt-jekyll](https://github.com/dannygarcia/grunt-jekyll): A straightforward [Grunt](http://gruntjs.com/) plugin for Jekyll.
524543 - [jekyll-postfiles](https://github.com/indirect/jekyll-postfiles): Add `_postfiles` directory and {% raw %}`{{ postfile }}`{% endraw %} tag so the files a post refers to will always be right there inside your repo.
544 - [A layout that compresses HTML](https://github.com/penibelst/jekyll-compress-html) by [Anatol Broder](http://penibelst.de/): Github Pages compatible, configurable way to compress HTML files on site build.
545 - [Jekyll CO₂](https://github.com/wdenton/jekyll-co2): Generates HTML showing the monthly change in atmospheric CO₂ at the Mauna Loa observatory in Hawaii.
546
547 #### Editors
548
549 - [sublime-jekyll](https://github.com/23maverick23/sublime-jekyll): A Sublime Text package for Jekyll static sites. This package should help creating Jekyll sites and posts easier by providing access to key template tags and filters, as well as common completions and a current date/datetime command (for dating posts). You can install this package manually via GitHub, or via [Package Control](https://sublime.wbond.net/packages/Jekyll).
550 - [vim-jekyll](https://github.com/parkr/vim-jekyll): A vim plugin to generate
551 new posts and run `jekyll build` all without leaving vim.
525552
526553 <div class="note info">
527554 <h5>Jekyll Plugins Wanted</h5>
1717 As explained on the [directory structure](../structure/) page, the `_posts`
1818 folder is where your blog posts will live. These files can be either
1919 [Markdown](http://daringfireball.net/projects/markdown/) or
20 [Textile](http://textile.sitemonks.com/) formatted text files, and as long as
20 [Textile](http://redcloth.org/textile) formatted text files, and as long as
2121 they have [YAML front-matter](../frontmatter/), they will be converted from their
2222 source format into an HTML page that is part of your static site.
2323
4040 2012-09-12-how-to-write-a-blog.textile
4141 {% endhighlight %}
4242
43 <div class="note">
44 <h5>ProTip™: Link to other posts</h5>
45 <p>
46 Use the <a href="../templates#post-url"><code>post_url</code></a>
47 tag to link to other posts without having to worry about the URL's
48 breaking when the site permalink style changes.
49 </p>
50 </div>
51
4352 ### Content Formats
4453
45 All blog post files must begin with [YAML front- matter](../frontmatter/). After
54 All blog post files must begin with [YAML front-matter](../frontmatter/). After
4655 that, it's simply a matter of deciding which format you prefer. Jekyll supports
4756 two popular content markup formats:
4857 [Markdown](http://daringfireball.net/projects/markdown/) and
49 [Textile](http://textile.sitemonks.com/). These formats each have their own way
58 [Textile](http://redcloth.org/textile). These formats each have their own way
5059 of marking up different types of content within a post, so you should
5160 familiarize yourself with these formats and decide which one best suits your
5261 needs.
62
63 <div class="note info">
64 <h5>Be aware of character sets</h5>
65 <p>
66 Content processors can modify certain characters to make them look nicer.
67 For example, the <code>smart</code> extension in Redcarpet converts standard,
68 ASCII quotation characters to curly, Unicode ones. In order for the browser
69 to display those characters properly, define the charset meta value by
70 including <code>&lt;meta charset=&quot;utf-8&quot;&gt;</code> in the
71 <code>&lt;head&gt;</code> of your layout.
72 </p>
73 </div>
5374
5475 ## Including images and resources
5576
125146 {% raw %}{% for post in site.posts %}{% endraw %}
126147 <li>
127148 <a href="{% raw %}{{ post.url }}{% endraw %}">{% raw %}{{ post.title }}{% endraw %}</a>
128 <p>{% raw %}{{ post.excerpt }}{% endraw %}</p>
149 {% raw %}{{ post.excerpt }}{% endraw %}
129150 </li>
130151 {% raw %}{% endfor %}{% endraw %}
131152 </ul>
132153 {% endhighlight %}
133154
155 Because Jekyll grabs the first paragraph you will not need to wrap the excerpt in `p` tags,
156 which is already done for you. These tags can be removed with the following if you'd prefer:
157
158 {% highlight html %}
159 {% raw %}{{ post.excerpt | remove: '<p>' | remove: '</p>' }}{% endraw %}
160 {% endhighlight %}
161
134162 If you don't like the automatically-generated post excerpt, it can be overridden by adding
135163 `excerpt` to your post's YAML front-matter. Completely disable it by setting
136164 your `excerpt_separator` to `""`.
137165
166 Also, as with any output generated by Liquid tags, you can pass the `| strip_html` flag to remove any html tags in the output. This is particularly helpful if you wish to output a post excerpt as a `meta="description"` tag within the post `head`, or anywhere else having html tags along with the content is not desirable.
167
138168 ## Highlighting code snippets
139169
140170 Jekyll also has built-in support for syntax highlighting of code snippets using
141 Pygments, and including a code snippet in any post is easy. Just use the
142 dedicated Liquid tag as follows:
171 either Pygments or Rouge, and including a code snippet in any post is easy. Just
172 use the dedicated Liquid tag as follows:
143173
144174 {% highlight text %}
145175 {% raw %}{% highlight ruby %}{% endraw %}
1919 posts, using the front-matter to control templates and layouts, and taking
2020 advantage of all the awesome configuration options Jekyll makes available.
2121
22 <div class="note info">
23 <h5>Redcarpet is the default Markdown engine for new sites</h5>
24 <p>In Jekyll 1.1, we switched the default markdown engine for sites
25 generated with <code>jekyll new</code> to Redcarpet</p>
26 </div>
27
2822 If you're running into problems, ensure you have all the [requirements
2923 installed][Installation].
3024
3434 > “Jekyll is a well-architected throwback to a time before WordPress, when men were men, and HTML was static. I like the ideas it espouses, and have made a few improvements to it’s core. Here, I’ll point out some highlights of my fork in the hopes that they see usage beyond this site.”
3535 - [‘About this Website’, by Carter Allen](http://cartera.me/2010/08/12/about-this-website/)
3636 > “Jekyll is everything that I ever wanted in a blogging engine. Really. It isn’t perfect, but what’s excellent about it is that if there’s something wrong, I know exactly how it works and how to fix it. It runs on the your machine only, and is essentially an added”build" step between you and the browser. I coded this entire site in TextMate using standard HTML5 and CSS3, and then at the end I added just a few little variables to the markup. Presto-chango, my site is built and I am at peace with the world.”
37 - [Generating a Tag Cloud in Jekyll](http://www.justkez.com/generating-a-tag-cloud-in-jekyll/)
37 - [Generating a Tag Cloud in Jekyll](http://www.justkez.com/generating-a-tag-cloud-in-jekyll/)
38 A guide to implementing a tag cloud and per-tag content pages using Jekyll.
3839
39 A guide to implementing a tag cloud and per-tag content pages using Jekyll.
40
41 - [Jekyll Extensions -= Pain](http://rfelix.com/2010/01/19/jekyll-extensions-minus-equal-pain/)
42
43 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.
40 - A way to [extend Jekyll](https://github.com/rfelix/jekyll_ext) without forking and modifying the Jekyll gem codebase and some [portable Jekyll extensions](https://wiki.github.com/rfelix/jekyll_ext/extensions) that can be reused and shared.
4441
4542 - [Using your Rails layouts in Jekyll](http://numbers.brighterplanet.com/2010/08/09/sharing-rails-views-with-jekyll)
1010 learning purposes.
1111
1212 - [Tom Preston-Werner](http://tom.preston-werner.com/)
13 ([source](http://github.com/mojombo/mojombo.github.com))
13 ([source](https://github.com/mojombo/mojombo.github.io))
1414 - [Nick Quaranto](http://quaran.to/)
1515 ([source](https://github.com/qrush/qrush.github.com))
1616 - [Roger Chapman](http://rogchap.com/)
1717 ([source](https://github.com/rogchap/rogchap.github.com))
18 - [GitHub Official Teaching Materials](http://teach.github.com)
19 ([source](https://github.com/github/teach.github.com))
18 - [GitHub Official Teaching Materials](http://training.github.com)
19 ([source](https://github.com/github/training.github.com/tree/7049d7532a6856411e34046aedfce43a4afaf424))
2020 - [Rasmus Andersson](http://rsms.me/)
2121 ([source](https://github.com/rsms/rsms.github.com))
2222 - [Scott Chacon](http://schacon.github.com)
112112 <td>
113113 <p>
114114
115 Your dynamic content, so to speak. The format of these files is
115 Your dynamic content, so to speak. The naming convention of these files is
116116 important, and must follow the format:
117117 <code>YEAR-MONTH-DAY-title.MARKUP</code>.
118118 The <a href="../permalinks/">permalinks</a> can be customized for each
129129 <td>
130130 <p>
131131
132 Well-formatted site data should be placed here. The jekyll engine will
133 autoload all yaml files (ends with <code>.yml</code> or <code>.yaml</code>)
134 in this directory. If there's a file <code>members.yml</code> under the directory,
132 Well-formatted site data should be placed here. The jekyll engine will
133 autoload all yaml files (ends with <code>.yml</code> or <code>.yaml</code>)
134 in this directory. If there's a file <code>members.yml</code> under the directory,
135135 then you can access contents of the file through <code>site.data.members</code>.
136136
137137 </p>
2424 <tbody>
2525 <tr>
2626 <td>
27 <p class='name'><strong>Date to XML Schema</strong></p>
27 <p class="name"><strong>Date to XML Schema</strong></p>
2828 <p>Convert a Date into XML Schema (ISO 8601) format.</p>
2929 </td>
30 <td class='align-center'>
31 <p>
32 <code class='filter'>{% raw %}{{ site.time | date_to_xmlschema }}{% endraw %}</code>
33 </p>
34 <p>
35 <code class='output'>2008-11-07T13:07:54-08:00</code>
36 </p>
37 </td>
38 </tr>
39 <tr>
40 <td>
41 <p class='name'><strong>Date to RFC-822 Format</strong></p>
30 <td class="align-center">
31 <p>
32 <code class="filter">{% raw %}{{ site.time | date_to_xmlschema }}{% endraw %}</code>
33 </p>
34 <p>
35 <code class="output">2008-11-07T13:07:54-08:00</code>
36 </p>
37 </td>
38 </tr>
39 <tr>
40 <td>
41 <p class="name"><strong>Date to RFC-822 Format</strong></p>
4242 <p>Convert a Date into the RFC-822 format used for RSS feeds.</p>
4343 </td>
44 <td class='align-center'>
45 <p>
46 <code class='filter'>{% raw %}{{ site.time | date_to_rfc822 }}{% endraw %}</code>
47 </p>
48 <p>
49 <code class='output'>Mon, 07 Nov 2008 13:07:54 -0800</code>
50 </p>
51 </td>
52 </tr>
53 <tr>
54 <td>
55 <p class='name'><strong>Date to String</strong></p>
44 <td class="align-center">
45 <p>
46 <code class="filter">{% raw %}{{ site.time | date_to_rfc822 }}{% endraw %}</code>
47 </p>
48 <p>
49 <code class="output">Mon, 07 Nov 2008 13:07:54 -0800</code>
50 </p>
51 </td>
52 </tr>
53 <tr>
54 <td>
55 <p class="name"><strong>Date to String</strong></p>
5656 <p>Convert a date to short format.</p>
5757 </td>
58 <td class='align-center'>
59 <p>
60 <code class='filter'>{% raw %}{{ site.time | date_to_string }}{% endraw %}</code>
61 </p>
62 <p>
63 <code class='output'>07 Nov 2008</code>
64 </p>
65 </td>
66 </tr>
67 <tr>
68 <td>
69 <p class='name'><strong>Date to Long String</strong></p>
58 <td class="align-center">
59 <p>
60 <code class="filter">{% raw %}{{ site.time | date_to_string }}{% endraw %}</code>
61 </p>
62 <p>
63 <code class="output">07 Nov 2008</code>
64 </p>
65 </td>
66 </tr>
67 <tr>
68 <td>
69 <p class="name"><strong>Date to Long String</strong></p>
7070 <p>Format a date to long format.</p>
7171 </td>
72 <td class='align-center'>
73 <p>
74 <code class='filter'>{% raw %}{{ site.time | date_to_long_string }}{% endraw %}</code>
75 </p>
76 <p>
77 <code class='output'>07 November 2008</code>
78 </p>
79 </td>
80 </tr>
81 <tr>
82 <td>
83 <p class='name'><strong>XML Escape</strong></p>
72 <td class="align-center">
73 <p>
74 <code class="filter">{% raw %}{{ site.time | date_to_long_string }}{% endraw %}</code>
75 </p>
76 <p>
77 <code class="output">07 November 2008</code>
78 </p>
79 </td>
80 </tr>
81 <tr>
82 <td>
83 <p class="name"><strong>Where</strong></p>
84 <p>Select all the objects in an array where the key has the given value.</p>
85 </td>
86 <td class="align-center">
87 <p>
88 <code class="filter">{% raw %}{{ site.members | where:"graduation_year","2014" }}{% endraw %}</code>
89 </p>
90 </td>
91 </tr>
92 <tr>
93 <td>
94 <p class="name"><strong>Group By</strong></p>
95 <p>Group an array's items by a given property.</p>
96 </td>
97 <td class="align-center">
98 <p>
99 <code class="filter">{% raw %}{{ site.members | group_by:"graduation_year" }}{% endraw %}</code>
100 </p>
101 <p>
102 <code class="output">[{"name"=>"2013", "items"=>[...]},
103 {"name"=>"2014", "items"=>[...]}]</code>
104 </p>
105 </td>
106 </tr>
107 <tr>
108 <td>
109 <p class="name"><strong>XML Escape</strong></p>
84110 <p>Escape some text for use in XML.</p>
85111 </td>
86 <td class='align-center'>
87 <p>
88 <code class='filter'>{% raw %}{{ page.content | xml_escape }}{% endraw %}</code>
89 </p>
90 </td>
91 </tr>
92 <tr>
93 <td>
94 <p class='name'><strong>CGI Escape</strong></p>
112 <td class="align-center">
113 <p>
114 <code class="filter">{% raw %}{{ page.content | xml_escape }}{% endraw %}</code>
115 </p>
116 </td>
117 </tr>
118 <tr>
119 <td>
120 <p class="name"><strong>CGI Escape</strong></p>
95121 <p>
96122 CGI escape a string for use in a URL. Replaces any special characters
97123 with appropriate %XX replacements.
98124 </p>
99125 </td>
100 <td class='align-center'>
101 <p>
102 <code class='filter'>{% raw %}{{ “foo,bar;baz?” | cgi_escape }}{% endraw %}</code>
103 </p>
104 <p>
105 <code class='output'>foo%2Cbar%3Bbaz%3F</code>
106 </p>
107 </td>
108 </tr>
109 <tr>
110 <td>
111 <p class='name'><strong>URI Escape</strong></p>
126 <td class="align-center">
127 <p>
128 <code class="filter">{% raw %}{{ “foo,bar;baz?” | cgi_escape }}{% endraw %}</code>
129 </p>
130 <p>
131 <code class="output">foo%2Cbar%3Bbaz%3F</code>
132 </p>
133 </td>
134 </tr>
135 <tr>
136 <td>
137 <p class="name"><strong>URI Escape</strong></p>
112138 <p>
113139 URI escape a string.
114140 </p>
115141 </td>
116 <td class='align-center'>
117 <p>
118 <code class='filter'>{% raw %}{{ “'foo, bar \\baz?'” | uri_escape }}{% endraw %}</code>
119 </p>
120 <p>
121 <code class='output'>foo,%20bar%20%5Cbaz?</code>
122 </p>
123 </td>
124 </tr>
125 <tr>
126 <td>
127 <p class='name'><strong>Number of Words</strong></p>
142 <td class="align-center">
143 <p>
144 <code class="filter">{% raw %}{{ “'foo, bar \\baz?'” | uri_escape }}{% endraw %}</code>
145 </p>
146 <p>
147 <code class="output">foo,%20bar%20%5Cbaz?</code>
148 </p>
149 </td>
150 </tr>
151 <tr>
152 <td>
153 <p class="name"><strong>Number of Words</strong></p>
128154 <p>Count the number of words in some text.</p>
129155 </td>
130 <td class='align-center'>
131 <p>
132 <code class='filter'>{% raw %}{{ page.content | number_of_words }}{% endraw %}</code>
133 </p>
134 <p>
135 <code class='output'>1337</code>
136 </p>
137 </td>
138 </tr>
139 <tr>
140 <td>
141 <p class='name'><strong>Array to Sentence</strong></p>
156 <td class="align-center">
157 <p>
158 <code class="filter">{% raw %}{{ page.content | number_of_words }}{% endraw %}</code>
159 </p>
160 <p>
161 <code class="output">1337</code>
162 </p>
163 </td>
164 </tr>
165 <tr>
166 <td>
167 <p class="name"><strong>Array to Sentence</strong></p>
142168 <p>Convert an array into a sentence. Useful for listing tags.</p>
143169 </td>
144 <td class='align-center'>
145 <p>
146 <code class='filter'>{% raw %}{{ page.tags | array_to_sentence_string }}{% endraw %}</code>
147 </p>
148 <p>
149 <code class='output'>foo, bar, and baz</code>
150 </p>
151 </td>
152 </tr>
153 <tr>
154 <td>
155 <p class='name'><strong>Textilize</strong></p>
170 <td class="align-center">
171 <p>
172 <code class="filter">{% raw %}{{ page.tags | array_to_sentence_string }}{% endraw %}</code>
173 </p>
174 <p>
175 <code class="output">foo, bar, and baz</code>
176 </p>
177 </td>
178 </tr>
179 <tr>
180 <td>
181 <p class="name"><strong>Textilize</strong></p>
156182 <p>Convert a Textile-formatted string into HTML, formatted via RedCloth</p>
157183 </td>
158 <td class='align-center'>
159 <p>
160 <code class='filter'>{% raw %}{{ page.excerpt | textilize }}{% endraw %}</code>
161 </p>
162 </td>
163 </tr>
164 <tr>
165 <td>
166 <p class='name'><strong>Markdownify</strong></p>
184 <td class="align-center">
185 <p>
186 <code class="filter">{% raw %}{{ page.excerpt | textilize }}{% endraw %}</code>
187 </p>
188 </td>
189 </tr>
190 <tr>
191 <td>
192 <p class="name"><strong>Markdownify</strong></p>
167193 <p>Convert a Markdown-formatted string into HTML.</p>
168194 </td>
169 <td class='align-center'>
170 <p>
171 <code class='filter'>{% raw %}{{ page.excerpt | markdownify }}{% endraw %}</code>
172 </p>
173 </td>
174 </tr>
175 <tr>
176 <td>
177 <p class='name'><strong>Data To JSON</strong></p>
195 <td class="align-center">
196 <p>
197 <code class="filter">{% raw %}{{ page.excerpt | markdownify }}{% endraw %}</code>
198 </p>
199 </td>
200 </tr>
201 <tr>
202 <td>
203 <p class="name"><strong>Data To JSON</strong></p>
178204 <p>Convert Hash or Array to JSON.</p>
179205 </td>
180 <td class='align-center'>
181 <p>
182 <code class='filter'>{% raw %}{{ site.data.projects | jsonify }}{% endraw %}</code>
206 <td class="align-center">
207 <p>
208 <code class="filter">{% raw %}{{ site.data.projects | jsonify }}{% endraw %}</code>
209 </p>
210 </td>
211 </tr>
212 <tr>
213 <td>
214 <p class="name"><strong>Sort</strong></p>
215 <p>Sort an array. Optional arguments for hashes: 1.&nbsp;property name 2.&nbsp;nils order (<em>first</em> or <em>last</em>).</p>
216 </td>
217 <td class="align-center">
218 <p>
219 <code class="filter">{% raw %}{{ page.tags | sort }}{% endraw %}</code>
220 </p>
221 <p>
222 <code class="filter">{% raw %}{{ site.posts | sort: 'author' }}{% endraw %}</code>
223 </p>
224 <p>
225 <code class="filter">{% raw %}{{ site.pages | sort: 'title', 'last' }}{% endraw %}</code>
183226 </p>
184227 </td>
185228 </tr>
210253 or you can use a variable, using liquid-like variable syntax as in
211254 <code>{% raw %}{% include {{my_variable}} %}{% endraw %}</code>.
212255
213 Note that unlike usual liquid variable syntax, you cannot have spaces inside the curly braces.
214
215256 </p>
216257 </div>
217258
231272
232273 Jekyll has built in support for syntax highlighting of [over 100
233274 languages](http://pygments.org/languages/) thanks to
234 [Pygments](http://pygments.org/). To use Pygments, you must have Python installed on your
235 system and set `pygments` to `true` in your site's configuration file.
275 [Pygments](http://pygments.org/). To use Pygments, you must have Python installed
276 on your system and set `highlighter` to `pygments` in your site's configuration
277 file.
278
279 Alternatively, you can use [Rouge](https://github.com/jayferd/rouge) to highlight
280 your code snippets. It doesn't support as many languages as Pygments does but
281 it should fit in most cases and it's written in pure Ruby ; you don't need Python
282 on your system!
236283
237284 To render a code block with syntax highlighting, surround your code as follows:
238285
248295
249296 The argument to the `highlight` tag (`ruby` in the example above) is the
250297 language identifier. To find the appropriate identifier to use for the language
251 you want to highlight, look for the “short name” on the [Lexers
252 page](http://pygments.org/docs/lexers/).
298 you want to highlight, look for the “short name” on the [Pygments' Lexers
299 page](http://pygments.org/docs/lexers/) or the [Rouge
300 wiki](https://github.com/jayferd/rouge/wiki/List-of-supported-languages-and-lexers).
253301
254302 #### Line numbers
255303
272320
273321 In order for the highlighting to show up, you’ll need to include a highlighting
274322 stylesheet. For an example stylesheet you can look at
275 [syntax.css](http://github.com/mojombo/tpw/tree/master/css/syntax.css). These
323 [syntax.css](https://github.com/mojombo/tpw/tree/master/css/syntax.css). These
276324 are the same styles as used by GitHub and you are free to use them for your own
277325 site. If you use `linenos`, you might want to include an additional CSS class
278326 definition for the `.lineno` class in `syntax.css` to distinguish the line
289337 {% endraw %}
290338 {% endhighlight %}
291339
292 If you organize your posts in subdirectories, you need to include subdirectory
340 If you organize your posts in subdirectories, you need to include subdirectory
293341 path to the post:
294342
295343 {% highlight text %}
310358
311359 ### Gist
312360
313 Use the `gist` tag to easily embed a GitHub Gist onto your site:
314
315 {% highlight text %}
316 {% raw %}
317 {% gist 5555251 %}
361 Use the `gist` tag to easily embed a GitHub Gist onto your site. This works with public or secret gists:
362
363 {% highlight text %}
364 {% raw %}
365 {% gist parkr/931c1c8d465a04042403 %}
318366 {% endraw %}
319367 {% endhighlight %}
320368
322370
323371 {% highlight text %}
324372 {% raw %}
325 {% gist 5555251 result.md %}
326 {% endraw %}
327 {% endhighlight %}
328
329 The `gist` tag also works with private gists, which require the gist owner's
330 github username:
331
332 {% highlight text %}
333 {% raw %}
334 {% gist parkr/931c1c8d465a04042403 %}
335 {% endraw %}
336 {% endhighlight %}
337
338 The private gist syntax also supports filenames.
373 {% gist parkr/931c1c8d465a04042403 jekyll-private-gist.markdown %}
374 {% endraw %}
375 {% endhighlight %}
55 permalink: /docs/troubleshooting/
66 ---
77
8 If you ever run into problems installing or using Jekyll, here's a few tips
8 If you ever run into problems installing or using Jekyll, here are a few tips
99 that might be of help. If the problem you’re experiencing isn’t covered below,
10 please [report an issue]({{ site.repository }}/issues/new) so the
10 please [report an issue]({{site.help_url}}/issues/new) so the
1111 Jekyll community can make everyone’s experience better.
1212
1313 ## Installation Problems
2727 {% endhighlight %}
2828
2929 On [NearlyFreeSpeech](http://nearlyfreespeech.net/) you need to run the
30 command with the following environment variable:
30 following commands before installing Jekyll:
3131
3232 {% highlight bash %}
33 RB_USER_INSTALL=true gem install jekyll
33 export GEM_HOME=/home/private/gems
34 export GEM_PATH=/home/private/gems:/usr/local/lib/ruby/gems/1.8/
35 export PATH=$PATH:/home/private/gems/bin
36 export RB_USER_INSTALL='true'
3437 {% endhighlight %}
3538
3639 On OSX, you may need to update RubyGems:
4043 {% endhighlight %}
4144
4245 If you still have issues, you may need to [use XCode to install Command Line
43 Tools](http://www.zlu.me/blog/2012/02/21/install-native-ruby-gem-in-mountain-lion-preview/)
46 Tools](http://www.zlu.me/ruby/os%20x/gem/mountain%20lion/2012/02/21/install-native-ruby-gem-in-mountain-lion-preview.html)
4447 that will allow you to install native gems using the following command:
4548
4649 {% highlight bash %}
5457 {% endhighlight %}
5558
5659 On Windows, you may need to install [RubyInstaller
57 DevKit](http://wiki.github.com/oneclick/rubyinstaller/development-kit).
60 DevKit](https://wiki.github.com/oneclick/rubyinstaller/development-kit).
5861
5962 ## Problems running Jekyll
6063
115118 XHTML.](http://www.w3.org/TR/xhtml1/#C_3) An easy fix is to put a space
116119 between the opening and closing tags.
117120
118 ### RedCloth
119
120 Versions 4.1.1 and higher do not obey the notextile tag. [This is a known
121 bug](http://aaronqian.com/articles/2009/04/07/redcloth-ate-my-notextile.html)
122 and will hopefully be fixed for 4.2. You can still use 4.1.9, but the
123 test suite requires that 4.1.0 be installed. If you use a version of
124 RedCloth that does not have the notextile tag, you may notice that
125 syntax highlighted blocks from Pygments are not formatted correctly,
126 among other things. If you’re seeing this just install 4.1.0.
127
128121 ### Liquid
129122
130123 The latest version, version 2.0, seems to break the use of `{{ "{{" }}` in
145138
146139 <div class="note">
147140 <h5>Please report issues you encounter!</h5>
148 <p>If you come across a bug, please <a href="{{ site.repository }}/issues/new">create an issue</a> on GitHub describing the problem and any work-arounds you find so we can document it here for others.</p>
141 <p>
142 If you come across a bug, please <a href="{{ site.help_url }}/issues/new">create an issue</a>
143 on GitHub describing the problem and any work-arounds you find so we can
144 document it here for others.
145 </p>
149146 </div>
3434 <p markdown="1">With the new subcommands, the way sites are previewed locally
3535 changed a bit. Instead of specifying `server: true` in the site's
3636 configuration file, use `jekyll serve`. The same hold's true for
37 `watch: true`. Instead, use the `&#45;&#45;watch` flag with either `jekyll serve`
37 `watch: true`. Instead, use the `--watch` flag with either `jekyll serve`
3838 or `jekyll build`.</p>
3939 </div>
4040
9696
9797 <div class="note info">
9898 <h5>The config flag explicitly specifies your configuration file(s)</h5>
99 <p markdown="1">If you use the `&#45;&#45;config` flag, Jekyll will ignore your
100 `&#95;config.yml` file. Want to merge a custom configuration with the normal
99 <p markdown="1">If you use the `--config` flag, Jekyll will ignore your
100 `_config.yml` file. Want to merge a custom configuration with the normal
101101 configuration? No problem. Jekyll will accept more than one custom config
102102 file via the command line. Config files cascade from right to left, such
103 that if I run `jekyll serve &#45;&#45;config &#95;config.yml,&#95;config-dev.yml`,
104 the values in the config files on the right (`&#95;config-dev.yml`) overwrite
105 those on the left (`&#95;config.yml`) when both contain the same key.</p>
103 that if I run `jekyll serve --config _config.yml,_config-dev.yml`,
104 the values in the config files on the right (`_config-dev.yml`) overwrite
105 those on the left (`_config.yml`) when both contain the same key.</p>
106106 </div>
107107
108108 ### New Config File Options
2222 # => The current folder will be generated into ./_site,
2323 # watched for changes, and regenerated automatically.
2424 {% endhighlight %}
25
26 <div class="note warning">
27 <h5>Destination folders are cleaned on site builds</h5>
28 <p>
29 The contents of <code>&lt;destination&gt;</code> are automatically
30 cleaned when the site is built. Files or folders that are not
31 created by your site will be removed. Do not use an important
32 location for <code>&lt;destination&gt;</code>; instead, use it as
33 a staging area and copy files from there to your web server.
34 </p>
35 </div>
2536
2637 Jekyll also comes with a built-in development server that will allow you to
2738 preview what the generated site will look like in your browser locally.
11 layout: docs
22 title: Variables
33 prev_section: pages
4 next_section: datafiles
4 next_section: collections
55 permalink: /docs/variables/
66 ---
77
108108 For high quality but slow to compute results, run the
109109 <code>jekyll</code> command with the <code>--lsi</code> (latent semantic
110110 indexing) option.
111
112 </p></td>
113 </tr>
114 <tr>
115 <td><p><code>site.static_files</code></p></td>
116 <td><p>
117
118 A list of all static files (i.e. files not processed by Jekyll's
119 converters or the Liquid renderer). Each file has three properties:
120 <code>path</code>, <code>modified_time</code> and <code>extname</code>.
121
122 </p></td>
123 </tr>
124 <tr>
125 <td><p><code>site.html_pages</code></p></td>
126 <td><p>
127
128 A list of all HTML Pages.
129
130 </p></td>
131 </tr>
132 <tr>
133 <td><p><code>site.collections</code></p></td>
134 <td><p>
135
136 A list of all the collections.
137
138 </p></td>
139 </tr>
140 <tr>
141 <td><p><code>site.data</code></p></td>
142 <td><p>
143
144 A list containing the data loaded from the YAML files located in the <code>_data</code> directory.
145
146 </p></td>
147 </tr>
148 <tr>
149 <td><p><code>site.documents</code></p></td>
150 <td><p>
151
152 A list of all the documents in every collection.
111153
112154 </p></td>
113155 </tr>
243285
244286 </p></td>
245287 </tr>
288 <tr>
289 <td><p><code>page.next</code></p></td>
290 <td><p>
291
292 The next post relative to the position of the current post in
293 <code>site.posts</code>. Returns <code>nil</code> for the last entry.
294
295 </p></td>
296 </tr>
297 <tr>
298 <td><p><code>page.previous</code></p></td>
299 <td><p>
300
301 The previous post relative to the position of the current post in
302 <code>site.posts</code>. Returns <code>nil</code> for the first entry.
303
304 </p></td>
305 </tr>
246306 </tbody>
247307 </table>
248308 </div>
0 ---
1 layout: docs
2 title: Jekyll on Windows
3 prev_section: configuration
4 next_section: posts
5 permalink: /docs/windows/
6 ---
7
8 While Windows is not an officially-supported platform, it can be used to run
9 Jekyll with the proper tweaks. This page aims to collect some of the general
10 knowledge and lessons that have been unearthed by Windows users.
11
12 ## Installation
13
14 Julian Thilo has written up instructions to get
15 [Jekyll running on Windows][windows-installation] and it seems to work for most.
16
17 ## Encoding
18
19 If you use UTF-8 encoding, make sure that no `BOM` header
20 characters exist in your files or very, very bad things will happen to
21 Jekyll. This is especially relevant if you're running Jekyll on Windows.
22
23 Additionally, you might need to change the code page of the console window to UTF-8
24 in case you get a "Liquid Exception: Incompatible character encoding" error during
25 the site generation process. It can be done with the following command:
26
27 {% highlight bash %}
28 $ chcp 65001
29 {% endhighlight %}
30
31 [windows-installation]: http://jekyll-windows.juthilo.com/
32
33 ## Auto-regeneration
34
35 As of v1.3.0, Jekyll uses the `listen` gem to watch for changes when the
36 `--watch` switch is specified during a build or serve. While `listen` has
37 built-in support for UNIX systems, it requires an extra gem for compatibility
38 with Windows. Add the following to the Gemfile for your site:
39
40 {% highlight ruby %}
41 require 'rbconfig'
42 gem 'wdm', '~> 0.1.0' if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
43 {% endhighlight %}
Binary diff not shown
site/favicon.png less more
Binary diff not shown
00 ---
1 layout: none
21 permalink: /feed.xml
32 ---
43
1110 xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
1211 xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
1312 >
14 <channel>
13 <channel>
1514 <title xml:lang="en">Jekyll • Simple, blog-aware, static sites</title>
16 <atom:link type="application/atom+xml" href="http://jekyllrb.com/feed/" rel="self"/>
17 <link>http://jekyllrb.com</link>
18 <pubDate>{{ site.time | date: "%a, %d %b %Y %H:%M:%S %z" }}</pubDate>
19 <lastBuildDate>{{ site.time | date: "%a, %d %b %Y %H:%M:%S %z" }}</lastBuildDate>
15 <atom:link type="application/atom+xml" href="http://jekyllrb.com/feed.xml" rel="self"/>
16 <link>http://jekyllrb.com/</link>
17 <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
18 <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
2019 <language>en-US</language>
20 <generator>Jekyll v{{ jekyll.version }}</generator>
2121 <description>Transform your plain text into static websites and blogs.</description>
22 <image>
23 <description>Transform your plain text into static websites and blogs.</description>
24 <url>http://jekyllrb.com/img/logo-rss.png</url>
25 <title>Jekyll • Simple, blog-aware, static sites</title>
26 <link>http://jekyllrb.com/</link>
27 <width>144</width>
28 <height>73</height>
29 </image>
2230 {% for post in site.posts %}
2331 <item>
24 <title>{{ post.title | xml_escape}}</title>
25 <link>http://jekyllrb.com{{ post.url }}</link>
26 <pubDate>{{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }}</pubDate>
27 <dc:creator>{{ post.author }}</dc:creator>
28 {% for tag in post.tags %}<category>{{ tag | xml_escape }}</category>
29 {% endfor %}{% for cat in post.categories %}<category>{{ cat | xml_escape }}</category>
30 {% endfor %}<guid isPermaLink="false">{{ post.id }}</guid>
31 <description><![CDATA[ {{ post.content }} ]]></description>
32 <title>{{ post.title | xml_escape}}</title>
33 <link>http://jekyllrb.com{{ post.url }}</link>
34 <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
35 <dc:creator>{{ post.author }}</dc:creator>
36 {% for tag in post.tags %}
37 <category>{{ tag | xml_escape }}</category>
38 {% endfor %}
39 {% for cat in post.categories %}
40 <category>{{ cat | xml_escape }}</category>
41 {% endfor %}
42 <guid isPermaLink="true">http://jekyllrb.com{{ post.url }}</guid>
43 <description>{{ post.content | xml_escape }}</description>
3244 </item>
3345 {% endfor %}
34 </channel>
46 </channel>
3547 </rss>
Binary diff not shown
0 <?xml version="1.0" standalone="no"?>
1 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
2 <svg xmlns="http://www.w3.org/2000/svg">
3 <metadata></metadata>
4 <defs>
5 <font id="fontawesomeregular" horiz-adv-x="1536" >
6 <font-face units-per-em="1792" ascent="1536" descent="-256" />
7 <missing-glyph horiz-adv-x="448" />
8 <glyph unicode=" " horiz-adv-x="448" />
9 <glyph unicode="&#x09;" horiz-adv-x="448" />
10 <glyph unicode="&#xa0;" horiz-adv-x="448" />
11 <glyph unicode="&#xa8;" horiz-adv-x="1792" />
12 <glyph unicode="&#xa9;" horiz-adv-x="1792" />
13 <glyph unicode="&#xae;" horiz-adv-x="1792" />
14 <glyph unicode="&#xb4;" horiz-adv-x="1792" />
15 <glyph unicode="&#xc6;" horiz-adv-x="1792" />
16 <glyph unicode="&#xd8;" horiz-adv-x="1792" />
17 <glyph unicode="&#x2000;" horiz-adv-x="768" />
18 <glyph unicode="&#x2001;" horiz-adv-x="1537" />
19 <glyph unicode="&#x2002;" horiz-adv-x="768" />
20 <glyph unicode="&#x2003;" horiz-adv-x="1537" />
21 <glyph unicode="&#x2004;" horiz-adv-x="512" />
22 <glyph unicode="&#x2005;" horiz-adv-x="384" />
23 <glyph unicode="&#x2006;" horiz-adv-x="256" />
24 <glyph unicode="&#x2007;" horiz-adv-x="256" />
25 <glyph unicode="&#x2008;" horiz-adv-x="192" />
26 <glyph unicode="&#x2009;" horiz-adv-x="307" />
27 <glyph unicode="&#x200a;" horiz-adv-x="85" />
28 <glyph unicode="&#x202f;" horiz-adv-x="307" />
29 <glyph unicode="&#x205f;" horiz-adv-x="384" />
30 <glyph unicode="&#x2122;" horiz-adv-x="1792" />
31 <glyph unicode="&#x221e;" horiz-adv-x="1792" />
32 <glyph unicode="&#x2260;" horiz-adv-x="1792" />
33 <glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
34 <glyph unicode="&#xf000;" horiz-adv-x="1792" d="M93 1350q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78z" />
35 <glyph unicode="&#xf001;" d="M0 -64q0 50 34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5 q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89z" />
36 <glyph unicode="&#xf002;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
37 <glyph unicode="&#xf003;" horiz-adv-x="1792" d="M0 32v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5 t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768zM128 1120q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317 q54 43 100.5 115.5t46.5 131.5v11v13.5t-0.5 13t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5z" />
38 <glyph unicode="&#xf004;" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z " />
39 <glyph unicode="&#xf005;" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48z" />
40 <glyph unicode="&#xf006;" horiz-adv-x="1664" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354 q-25 27 -25 48zM221 829l306 -297l-73 -421l378 199l377 -199l-72 421l306 297l-422 62l-189 382l-189 -382z" />
41 <glyph unicode="&#xf007;" horiz-adv-x="1408" d="M0 131q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5 h-874q-121 0 -194 69.5t-73 189.5zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5z" />
42 <glyph unicode="&#xf008;" horiz-adv-x="1920" d="M0 -96v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 64v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM128 320q0 -26 19 -45t45 -19h128 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM128 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19 h-128q-26 0 -45 -19t-19 -45v-128zM512 -64q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM512 704q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512zM1536 64 v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45zM1536 320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 704q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128zM1536 1088q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128z" />
43 <glyph unicode="&#xf009;" horiz-adv-x="1664" d="M0 128v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM0 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 128v384q0 52 38 90t90 38h512q52 0 90 -38 t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM896 896v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90z" />
44 <glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 608v192 q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1280 1120v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
45 <glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M0 96v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 96v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM640 608v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68zM640 1120v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68z" />
46 <glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M121 608q0 40 28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68z" />
47 <glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M110 214q0 40 28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68t-28 -68l-294 -294l294 -294q28 -28 28 -68t-28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294 q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68z" />
48 <glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
49 <glyph unicode="&#xf010;" horiz-adv-x="1664" d="M0 704q0 143 55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90t-37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5z M256 704q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM384 672v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5z" />
50 <glyph unicode="&#xf011;" d="M0 640q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181 q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298zM640 768v640q0 52 38 90t90 38t90 -38t38 -90v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90z" />
51 <glyph unicode="&#xf012;" horiz-adv-x="1792" d="M0 -96v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM384 -96v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM768 -96v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576 q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 -96v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1536 -96v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23z" />
52 <glyph unicode="&#xf013;" d="M0 531v222q0 12 8 23t19 13l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10 q129 -119 165 -170q7 -8 7 -22q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108 q-44 -23 -91 -38q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5z M512 640q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
53 <glyph unicode="&#xf014;" horiz-adv-x="1408" d="M0 1056v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23zM256 76q0 -22 7 -40.5 t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5v948h-896v-948zM384 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM640 224v576q0 14 9 23t23 9h64 q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23zM896 224v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23z" />
54 <glyph unicode="&#xf015;" horiz-adv-x="1664" d="M26 636.5q1 13.5 11 21.5l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5zM256 64 v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45z" />
55 <glyph unicode="&#xf016;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22 v-376z" />
56 <glyph unicode="&#xf017;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 544v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
57 <glyph unicode="&#xf018;" horiz-adv-x="1920" d="M50 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256 q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73zM809 540q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4z" />
58 <glyph unicode="&#xf019;" horiz-adv-x="1664" d="M0 96v320q0 40 28 68t68 28h465l135 -136q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 985q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39q17 -41 -14 -70 l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70zM1152 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
59 <glyph unicode="&#xf01a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM418 620q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35z" />
60 <glyph unicode="&#xf01b;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM416 672q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23z" />
61 <glyph unicode="&#xf01c;" d="M0 64v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552q25 -61 25 -123v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM197 576h316l95 -192h320l95 192h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8 t-2.5 -8z" />
62 <glyph unicode="&#xf01d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 320v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55t-32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56z" />
63 <glyph unicode="&#xf01e;" d="M0 640q0 156 61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5 t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298z" />
64 <glyph unicode="&#xf021;" d="M0 0v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129 q-19 -19 -45 -19t-45 19t-19 45zM18 800v7q65 268 270 434.5t480 166.5q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179 q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5z" />
65 <glyph unicode="&#xf022;" horiz-adv-x="1792" d="M0 160v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832z M256 288v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 544v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z M256 800v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 288v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z M512 544v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5zM512 800v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5z " />
66 <glyph unicode="&#xf023;" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68zM320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192z" />
67 <glyph unicode="&#xf024;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110zM320 320v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19 q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45z" />
68 <glyph unicode="&#xf025;" horiz-adv-x="1664" d="M0 650q0 151 67 291t179 242.5t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32 q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32 q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314z" />
69 <glyph unicode="&#xf026;" horiz-adv-x="768" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45z" />
70 <glyph unicode="&#xf027;" horiz-adv-x="1152" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5z" />
71 <glyph unicode="&#xf028;" horiz-adv-x="1664" d="M0 448v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45zM908 464q0 21 12 35.5t29 25t34 23t29 35.5t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5 q15 0 25 -5q70 -27 112.5 -93t42.5 -142t-42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5zM1008 228q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5 q140 -59 225 -188.5t85 -282.5t-85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45zM1109 -7q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19 q13 0 26 -5q211 -91 338 -283.5t127 -422.5t-127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45z" />
72 <glyph unicode="&#xf029;" horiz-adv-x="1408" d="M0 0v640h640v-640h-640zM0 768v640h640v-640h-640zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM256 256v128h128v-128h-128zM256 1024v128h128v-128h-128zM768 0v640h384v-128h128v128h128v-384h-384v128h-128v-384h-128zM768 768v640h640v-640h-640z M896 896h384v384h-384v-384zM1024 0v128h128v-128h-128zM1024 1024v128h128v-128h-128zM1280 0v128h128v-128h-128z" />
73 <glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M0 0v1408h63v-1408h-63zM94 1v1407h32v-1407h-32zM189 1v1407h31v-1407h-31zM346 1v1407h31v-1407h-31zM472 1v1407h62v-1407h-62zM629 1v1407h31v-1407h-31zM692 1v1407h31v-1407h-31zM755 1v1407h31v-1407h-31zM880 1v1407h63v-1407h-63zM1037 1v1407h63v-1407h-63z M1163 1v1407h63v-1407h-63zM1289 1v1407h63v-1407h-63zM1383 1v1407h63v-1407h-63zM1541 1v1407h94v-1407h-94zM1666 1v1407h32v-1407h-32zM1729 0v1408h63v-1408h-63z" />
74 <glyph unicode="&#xf02b;" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5z" />
75 <glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M0 864v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117zM192 1088q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5zM704 1408h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5z" />
76 <glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M10 184q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23 t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57 q38 -15 59 -43q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5zM575 1056 q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
77 <glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62z" />
78 <glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M0 160v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-224 q-13 0 -22.5 9.5t-9.5 22.5zM384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1408 576q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
79 <glyph unicode="&#xf030;" horiz-adv-x="1920" d="M0 128v896q0 106 75 181t181 75h224l51 136q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181zM512 576q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5zM672 576q0 119 84.5 203.5t203.5 84.5t203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5z" />
80 <glyph unicode="&#xf031;" horiz-adv-x="1664" d="M0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8 t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27 q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14zM555 527q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452z" />
81 <glyph unicode="&#xf032;" horiz-adv-x="1408" d="M0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5 t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12zM533 1292q0 -50 4 -151t4 -152q0 -27 -0.5 -80 t-0.5 -79q0 -46 1 -69q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13zM538.5 165q0.5 -37 4.5 -83.5t12 -66.5q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25 t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5z" />
82 <glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
83 <glyph unicode="&#xf034;" horiz-adv-x="1792" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5 q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9 t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44zM1414 109.5q9 18.5 42 18.5h80v1024 h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5z" />
84 <glyph unicode="&#xf035;" d="M0 1023v383l81 1l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1 t-103 1t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29 t78 27q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44zM5 -64q0 28 26 49q4 3 36 30t59.5 49 t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5q12 0 42 -19.5t57.5 -41.5t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5 t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49z" />
85 <glyph unicode="&#xf036;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1536 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
86 <glyph unicode="&#xf037;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h896 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45z" />
87 <glyph unicode="&#xf038;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM128 832v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM384 448v128q0 26 19 45t45 19h1280 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM512 1216v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45z" />
88 <glyph unicode="&#xf039;" horiz-adv-x="1792" d="M0 64v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 448v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 832v128q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1216v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45z" />
89 <glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 416v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5zM0 800v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192 q-13 0 -22.5 9.5t-9.5 22.5zM384 32v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 416v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 800v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5zM384 1184v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5z" />
90 <glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5 t-9.5 22.5zM32 704q0 14 9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088 q-13 0 -22.5 9.5t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
91 <glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M0 32v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM0 416v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23t-9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5z M0 1184v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5zM640 416v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5 t-9.5 22.5zM640 800v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5z" />
92 <glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5q39 -17 39 -59v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5 t-84.5 203.5z" />
93 <glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v192l320 320l160 -160l512 512l416 -416v-448h-1408zM256 960q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136z" />
94 <glyph unicode="&#xf040;" d="M0 -128v416l832 832l416 -416l-832 -832h-416zM128 128h128v-128h107l91 91l-235 235l-91 -91v-107zM298 384q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17zM896 1184l166 165q36 38 90 38q53 0 91 -38l235 -234 q37 -39 37 -91q0 -53 -37 -90l-166 -166z" />
95 <glyph unicode="&#xf041;" horiz-adv-x="1024" d="M0 896q0 212 150 362t362 150t362 -150t150 -362q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179zM256 896q0 -106 75 -181t181 -75t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181z" />
96 <glyph unicode="&#xf042;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73v1088q-148 0 -273 -73t-198 -198t-73 -273z" />
97 <glyph unicode="&#xf043;" horiz-adv-x="1024" d="M0 512q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275q0 -212 -150 -362t-362 -150t-362 150t-150 362zM256 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69z" />
98 <glyph unicode="&#xf044;" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29v-190 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM640 256v288l672 672l288 -288l-672 -672h-288zM736 448h96v-96h56l116 116l-152 152l-116 -116v-56zM944 688q16 -16 33 1l350 350q17 17 1 33t-33 -1l-350 -350q-17 -17 -1 -33zM1376 1280l92 92 q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68l-92 -92z" />
99 <glyph unicode="&#xf045;" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h255q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29v-259 q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM256 704q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45l-384 -384 q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5t-38.5 114t-17.5 122z" />
100 <glyph unicode="&#xf046;" horiz-adv-x="1664" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3 q20 -8 20 -29v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM257 768q0 33 24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110q24 -24 24 -57t-24 -57l-814 -814q-24 -24 -57 -24t-57 24l-430 430 q-24 24 -24 57z" />
101 <glyph unicode="&#xf047;" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256 q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
102 <glyph unicode="&#xf048;" horiz-adv-x="1024" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45z" />
103 <glyph unicode="&#xf049;" horiz-adv-x="1792" d="M0 -64v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710q19 19 32 13t13 -32v-710q4 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45 t-45 -19h-128q-26 0 -45 19t-19 45z" />
104 <glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M122 640q0 26 19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19l710 710q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45z" />
105 <glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M0 -96v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31l-1328 -738q-23 -13 -39.5 -3t-16.5 36z" />
106 <glyph unicode="&#xf04c;" d="M0 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM896 -64v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45z" />
107 <glyph unicode="&#xf04d;" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
108 <glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
109 <glyph unicode="&#xf050;" horiz-adv-x="1792" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32v710 q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
110 <glyph unicode="&#xf051;" horiz-adv-x="1024" d="M0 -96v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710q-19 -19 -32 -13t-13 32z" />
111 <glyph unicode="&#xf052;" horiz-adv-x="1538" d="M1 64v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM1 525q-6 13 13 32l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13z" />
112 <glyph unicode="&#xf053;" horiz-adv-x="1280" d="M154 704q0 26 19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45z" />
113 <glyph unicode="&#xf054;" horiz-adv-x="1280" d="M90 128q0 26 19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45z" />
114 <glyph unicode="&#xf055;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19 t19 45v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128z" />
115 <glyph unicode="&#xf056;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 576q0 -26 19 -45t45 -19h768q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19 t-19 -45v-128z" />
116 <glyph unicode="&#xf057;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM387 414q0 -27 19 -46l90 -90q19 -19 46 -19q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19 l90 90q19 19 19 46q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45z" />
117 <glyph unicode="&#xf058;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 621q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45q0 28 -18 46l-91 90 q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46z" />
118 <glyph unicode="&#xf059;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM417 939q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26 t37.5 -59q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213zM640 160q0 -14 9 -23t23 -9 h192q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192z" />
119 <glyph unicode="&#xf05a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320 q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160zM640 1056q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160z" />
120 <glyph unicode="&#xf05b;" d="M0 576v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143 q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45zM339 512q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5h-109q-26 0 -45 19 t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109z" />
121 <glyph unicode="&#xf05c;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM429 480q0 13 10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23l-137 -137l137 -137q10 -10 10 -23t-10 -23l-146 -146q-10 -10 -23 -10t-23 10l-137 137 l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23z" />
122 <glyph unicode="&#xf05d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM346 640q0 26 19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45z" />
123 <glyph unicode="&#xf05e;" d="M0 643q0 157 61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5t-61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61t-245 164t-163.5 246t-61 300zM224 643q0 -162 89 -299l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199 t-73 -274zM471 185q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5q0 161 -87 295z" />
124 <glyph unicode="&#xf060;" d="M64 576q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5t32.5 -90.5v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90 z" />
125 <glyph unicode="&#xf061;" d="M0 512v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5z" />
126 <glyph unicode="&#xf062;" horiz-adv-x="1664" d="M53 565q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651q37 -39 37 -91q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75 q-38 38 -38 90z" />
127 <glyph unicode="&#xf063;" horiz-adv-x="1664" d="M53 704q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90z" />
128 <glyph unicode="&#xf064;" horiz-adv-x="1792" d="M0 416q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45t-19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123 q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22t-13.5 30t-10.5 24q-127 285 -127 451z" />
129 <glyph unicode="&#xf065;" d="M0 -64v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45zM781 800q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448 q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
130 <glyph unicode="&#xf066;" d="M13 32q0 13 10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23zM768 704v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10 t23 -10l114 -114q10 -10 10 -23t-10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45z" />
131 <glyph unicode="&#xf067;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68z" />
132 <glyph unicode="&#xf068;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68z" />
133 <glyph unicode="&#xf069;" horiz-adv-x="1664" d="M122.5 408.5q13.5 51.5 59.5 77.5l266 154l-266 154q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5 l-266 -154l266 -154q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5z" />
134 <glyph unicode="&#xf06a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM624 1126l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5l18 621q0 12 -10 18 q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18zM640 161q0 -13 10 -23t23 -10h192q13 0 22 9.5t9 23.5v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190z" />
135 <glyph unicode="&#xf06b;" d="M0 544v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68 t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23zM376 1120q0 -40 28 -68t68 -28h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68zM608 180q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5v56v468v192h-320v-192v-468v-56zM870 1024h194q40 0 68 28 t28 68t-28 68t-68 28q-43 0 -69 -31z" />
136 <glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M0 121q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96 q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5zM384 448q0 -26 19 -45t45 -19q24 0 45 19 q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45t-19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45z" />
137 <glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M0 -160q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64zM256 640q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100 t113.5 -122.5t72.5 -150.5t27.5 -184q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184z" />
138 <glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M0 576q0 34 20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69t-20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69zM128 576q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5q-152 236 -381 353 q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5z" />
139 <glyph unicode="&#xf070;" horiz-adv-x="1792" d="M0 576q0 38 20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5q16 -10 16 -27q0 -7 -1 -9q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87 q-143 65 -263.5 173t-208.5 245q-20 31 -20 69zM128 576q167 -258 427 -375l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353zM592 704q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34t-14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5zM896 0l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69t-20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95zM1056 286l280 502q8 -45 8 -84q0 -139 -79 -253.5t-209 -164.5z" />
140 <glyph unicode="&#xf071;" horiz-adv-x="1792" d="M16 61l768 1408q17 31 47 49t65 18t65 -18t47 -49l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126zM752 992l17 -457q0 -10 10 -16.5t24 -6.5h185q14 0 23.5 6.5t10.5 16.5l18 459q0 12 -10 19q-13 11 -24 11h-220 q-11 0 -24 -11q-10 -7 -10 -21zM768 161q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190z" />
141 <glyph unicode="&#xf072;" horiz-adv-x="1408" d="M0 477q-1 13 9 25l96 97q9 9 23 9q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16 l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23z" />
142 <glyph unicode="&#xf073;" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h288v288h-288v-288zM128 224 h288v320h-288v-320zM128 608h288v288h-288v-288zM384 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM480 -128h320v288h-320v-288zM480 224h320v320h-320v-320zM480 608h320v288h-320 v-288zM864 -128h320v288h-320v-288zM864 224h320v320h-320v-320zM864 608h320v288h-320v-288zM1152 1088q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288zM1248 -128h288v288h-288v-288z M1248 224h288v320h-288v-320zM1248 608h288v288h-288v-288z" />
143 <glyph unicode="&#xf074;" horiz-adv-x="1792" d="M0 160v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23zM0 1056v192q0 14 9 23t23 9h224q250 0 410 -225q-60 -92 -137 -273q-22 45 -37 72.5 t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23zM743 353q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192 q-32 0 -85 -0.5t-81 -1t-73 1t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5z" />
144 <glyph unicode="&#xf075;" horiz-adv-x="1792" d="M0 640q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5 t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281z" />
145 <glyph unicode="&#xf076;" d="M0 576v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5 t-98.5 362zM0 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45zM1024 960v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45z" />
146 <glyph unicode="&#xf077;" horiz-adv-x="1792" d="M90 250.5q0 26.5 19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5z" />
147 <glyph unicode="&#xf078;" horiz-adv-x="1792" d="M90 773.5q0 26.5 19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5z" />
148 <glyph unicode="&#xf079;" horiz-adv-x="1920" d="M0 704q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45z M640 1120q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20z " />
149 <glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M0 1216q0 26 19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024 q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45zM384 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1280 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
150 <glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158z" />
151 <glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5t-0.5 12.5zM73 56q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43 q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43z" />
152 <glyph unicode="&#xf07d;" horiz-adv-x="768" d="M64 64q0 26 19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45z" />
153 <glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M0 640q0 26 19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45z" />
154 <glyph unicode="&#xf080;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216z M256 128v384h256v-384h-256zM640 128v896h256v-896h-256zM1024 128v640h256v-640h-256zM1408 128v1024h256v-1024h-256z" />
155 <glyph unicode="&#xf081;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 286q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109 q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4q21 -63 74.5 -104 t121.5 -42q-116 -90 -261 -90q-26 0 -50 3z" />
156 <glyph unicode="&#xf082;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544 q-119 0 -203.5 84.5t-84.5 203.5z" />
157 <glyph unicode="&#xf083;" horiz-adv-x="1792" d="M0 0v1280q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5zM128 0h1536v128h-1536v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM256 1216h384v128h-384v-128zM512 574 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM640 574q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM736 576q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9 t9 23t-9 23t-23 9q-66 0 -113 -47t-47 -113z" />
158 <glyph unicode="&#xf084;" horiz-adv-x="1792" d="M0 752q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41q0 -17 -49 -66t-66 -49 q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5zM192 768q0 -80 56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56 t56 136t-56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136z" />
159 <glyph unicode="&#xf085;" horiz-adv-x="1920" d="M0 549v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8 q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90 q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5zM384 640q0 -106 75 -181t181 -75 t181 75t75 181t-75 181t-181 75t-181 -75t-75 -181zM1152 58v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31 v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1152 1082v140q0 16 149 31q13 29 30 52 q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71 q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31zM1408 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90zM1408 1152q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5q0 52 -38 90t-90 38t-90 -38t-38 -90z" />
160 <glyph unicode="&#xf086;" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM616 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5 t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
161 <glyph unicode="&#xf087;" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5 t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85 t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640z" />
162 <glyph unicode="&#xf088;" d="M0 512v640q0 53 37.5 90.5t90.5 37.5h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186 q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5zM128 1088q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 512h32q16 0 35.5 -9 t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5 t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640z" />
163 <glyph unicode="&#xf089;" horiz-adv-x="896" d="M0 889q0 37 56 46l502 73l225 455q19 41 49 41v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48z" />
164 <glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M0 940q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138z M128 940q0 -168 187 -355l581 -560l580 559q188 188 188 356q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5 t-21.5 -143z" />
165 <glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M0 288v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5q0 -4 1 -20t0.5 -26.5t-3 -23.5 t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5zM384 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45z" />
166 <glyph unicode="&#xf08c;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM223 1030q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86z M237 122h231v694h-231v-694zM595 122h231v388q0 38 7 56q15 35 45 59.5t74 24.5q116 0 116 -157v-371h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694z" />
167 <glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M0 320q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19 t-19 45zM416 672q0 -14 9 -23t23 -9t23 9t9 23v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448z" />
168 <glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832 q-119 0 -203.5 84.5t-84.5 203.5zM685 576q0 13 10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23z" />
169 <glyph unicode="&#xf090;" d="M0 448v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45t-19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45zM894.5 78.5q0.5 10.5 3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113 t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5q0 4 -1 20t-0.5 26.5z" />
170 <glyph unicode="&#xf091;" horiz-adv-x="1664" d="M0 928v128q0 40 28 68t68 28h288v96q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91t97.5 -37q75 0 133.5 -45.5 t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143zM128 928q0 -78 94.5 -162t235.5 -113q-74 162 -74 371 h-256v-96zM1206 653q141 29 235.5 113t94.5 162v96h-256q0 -209 -74 -371z" />
171 <glyph unicode="&#xf092;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204 q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52 t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5h-224q-119 0 -203.5 84.5t-84.5 203.5zM271 315q3 5 13 2 q10 -5 7 -12q-5 -7 -13 -2q-10 5 -7 12zM304 290q6 6 16 -3q9 -11 2 -16q-6 -7 -16 3q-9 11 -2 16zM335 233q-9 13 0 18q9 7 17 -6q9 -12 0 -19q-8 -6 -17 7zM370 206q8 9 20 -3q12 -11 4 -19q-8 -9 -20 3q-13 11 -4 19zM419 168q4 11 19 7q16 -5 13 -16q-4 -12 -19 -6 q-17 4 -13 15zM481 154q0 11 16 11q17 2 17 -11q0 -11 -16 -11q-17 -2 -17 11zM540 158q-2 12 14 15q16 2 18 -9q2 -10 -14 -14t-18 8z" />
172 <glyph unicode="&#xf093;" horiz-adv-x="1664" d="M0 -32v320q0 40 28 68t68 28h427q21 -56 70.5 -92t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68zM325 936q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69q-17 -40 -59 -40 h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40zM1152 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM1408 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
173 <glyph unicode="&#xf094;" d="M0 433q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5q0 -165 -70 -327.5 t-196 -288t-281 -180.5q-124 -44 -326 -44q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5zM128 434q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5 q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24 q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5z" />
174 <glyph unicode="&#xf095;" horiz-adv-x="1408" d="M0 1069q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235 t235 -174q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5 t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5z" />
175 <glyph unicode="&#xf096;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832z" />
176 <glyph unicode="&#xf097;" horiz-adv-x="1280" d="M0 7v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62zM128 38l423 406l89 85l89 -85l423 -406 v1242h-1024v-1242z" />
177 <glyph unicode="&#xf098;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 905q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5 q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5 t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5z" />
178 <glyph unicode="&#xf099;" horiz-adv-x="1664" d="M44 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5 q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145z" />
179 <glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M95 631v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255z" />
180 <glyph unicode="&#xf09b;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44 l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3 q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5z" />
181 <glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M0 96v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68z" />
182 <glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M0 32v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v608h-1664v-608zM128 1024h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600 q-13 0 -22.5 -9.5t-9.5 -22.5v-224zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
183 <glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M0 192q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 697v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5t259 -181.5q114 -113 181.5 -259t80.5 -306q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5 t-391.5 184.5q-25 2 -41.5 20t-16.5 43zM0 1201v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294q187 -186 294 -425.5t120 -501.5q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102 q-25 1 -42.5 19.5t-17.5 43.5z" />
184 <glyph unicode="&#xf0a0;" d="M0 160v320q0 25 16 75l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113zM128 160q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-1216 q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM880 320q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1136 320q0 33 23.5 56.5t56.5 23.5 t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5z" />
185 <glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M0 672v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50 t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113zM768 633q377 -42 768 -341v954q-394 -302 -768 -343v-270z" />
186 <glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
187 <glyph unicode="&#xf0a3;" d="M2 435q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70l-53 -186l188 -48 q40 -10 52 -51q10 -42 -20 -70l-138 -135l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53 q-41 -12 -70 19q-31 29 -19 70l53 186l-188 48q-40 10 -52 51z" />
188 <glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M0 128v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179q0 -105 -75.5 -181 t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5zM128 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM384 128h32q72 0 167 -32 t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139 q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106q-69 -57 -140 -57h-32v-640z" />
189 <glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M0 769q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5v-640 q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181zM128 768q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119 q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5 t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5t-39 -89.5zM1536 192q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
190 <glyph unicode="&#xf0a6;" d="M0 640q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5t-90.5 -37.5h-640 q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5zM128 640q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140 v-32h640v32q0 72 32 167t64 193.5t32 179.5q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576q-20 0 -48.5 15t-55 33t-68 33t-84.5 15 q-67 0 -97.5 -44.5t-30.5 -115.5zM1152 -64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
191 <glyph unicode="&#xf0a7;" d="M0 640q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317q0 -142 -77.5 -230t-217.5 -87 l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5zM128 640q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33t55 33t48.5 15v-576q0 -50 38.5 -89 t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112 q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5zM1152 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
192 <glyph unicode="&#xf0a8;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM251 640q0 -27 18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502 q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45z" />
193 <glyph unicode="&#xf0a9;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM256 576q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18 l362 362l91 91q18 18 18 45t-18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128z" />
194 <glyph unicode="&#xf0aa;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 641q0 -27 18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19 t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45t-18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45z" />
195 <glyph unicode="&#xf0ab;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM252 639q0 -27 18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45t-18 45l-91 91 q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45z" />
196 <glyph unicode="&#xf0ac;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM226 979q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18 q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13 q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5 t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13 q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25 t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5 t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4 q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5q15 10 -7 16q-17 5 -43 -12q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8 q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5 q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26 q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5 q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14 q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5 q-16 0 -22 -1q-146 -80 -235 -222zM877 26q0 -6 2 -16q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7 t-10 1.5t-11.5 -7q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5z" />
197 <glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M21 0q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90zM256 64q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45zM768 960q0 185 131.5 316.5t316.5 131.5q58 0 121.5 -16.5 t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25q0 -39 -23 -106q-47 -134 -164.5 -217.5t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5z" />
198 <glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M0 64v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 576v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM0 1088v256q0 26 19 45t45 19h1664 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45zM640 640h1024v128h-1024v-128zM1024 128h640v128h-640v-128zM1280 1152h384v128h-384v-128z" />
199 <glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M5 1241q17 39 59 39h1280q42 0 59 -39q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70z" />
200 <glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M0 160v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 736v384q0 66 47 113t113 47h352v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113v-384h-1792z M640 1280h512v128h-512v-128zM768 512v128h256v-128h-256z" />
201 <glyph unicode="&#xf0b2;" d="M0 -64v448q0 42 40 59q39 17 69 -14l144 -144l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45 v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19l-144 144l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19 t-19 45z" />
202 <glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M0 671q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5zM128 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM256 3q0 53 3.5 103.5 t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5 zM576 896q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM1280 1280q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181zM1327 640q81 117 81 256q0 29 -5 66q66 -23 133 -23 q59 0 119 21.5t97.5 42.5t43.5 21q124 0 124 -353q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128z" />
203 <glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l206 -207q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204t-85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88 q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204zM208 1088q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15t21.5 -21.5t18.5 -19q33 31 33 73 q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67zM911 383q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26l147 146q28 28 28 67q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5 q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73z" />
204 <glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M0 448q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z" />
205 <glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M115.5 -64.5q-34.5 63.5 21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399l503 -793q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5zM476 384h712l-272 429l-20 31v37v399h-128v-399v-37 l-20 -31z" />
206 <glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M1 157q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148q4 -48 -10 -97q4 -1 12 -5 l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56l-507 -398l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207zM168 176q-25 -66 21 -108q39 -36 113 -36q100 0 192 59q81 51 106 117t-21 108q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117zM168 976q25 -66 106 -117q92 -59 192 -59q74 0 113 36q46 42 21 108t-106 117q-92 59 -192 59 q-74 0 -113 -36q-46 -42 -21 -108zM672 448l9 -8q2 -2 7 -6q4 -4 11 -12t11 -12l26 -26l160 96l96 -32l736 576l-128 64l-768 -431v-113zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 576q0 26 19 45t45 19t45 -19 t19 -45t-19 -45t-45 -19t-45 19t-19 45zM1018 391l582 -327l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
207 <glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M0 224v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68zM128 256h512v256q0 40 20 88t48 76l316 316v416h-384 v-416q0 -40 -28 -68t-68 -28h-416v-640zM213 1024h299v299zM768 -128h896v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640zM853 640h299v299z" />
208 <glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M4 1023q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581 q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776 q-113 115 -113 271z" />
209 <glyph unicode="&#xf0c7;" d="M0 -32v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 0h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20 t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280zM384 0h768v384h-768v-384zM640 928q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320z" />
210 <glyph unicode="&#xf0c8;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5z" />
211 <glyph unicode="&#xf0c9;" d="M0 64v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 576v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM0 1088v128q0 26 19 45t45 19h1408 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45z" />
212 <glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M0 128q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 640q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM0 1152q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM512 32v192 q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z M512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" />
213 <glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M15 438q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105v-159h-362q-6 36 -6 54zM19 -190 l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66zM34 1400l136 127h106v-404h108v-99 h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54zM512 32v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 544v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5v-192 q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5zM512 1056v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5z" />
214 <glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M0 544v64q0 14 9 23t23 9h1728q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23zM384 972q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6l-14 2q-50 149 -103 205 q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743q-28 35 -51 80q-48 97 -48 188zM414 154q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22 q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156z" />
215 <glyph unicode="&#xf0cd;" d="M0 -32v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-1472q-14 0 -23 -9t-9 -23zM0 1405q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5 t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2 q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195 q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39q-37 2 -45 4z" />
216 <glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M0 160v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 544q0 -14 9 -23t23 -9h320 q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM128 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192zM640 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM640 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 160q0 -14 9 -23t23 -9h320q14 0 23 9t9 23 v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 544q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192zM1152 928q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192z" />
217 <glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M27 160q0 27 18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45t-18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45zM128 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM320 1216l196 60l60 196l60 -196l196 -60l-196 -60 l-60 -196l-60 196zM768 1408l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98zM1083 1062l107 -107l293 293l-107 107zM1408 768l98 30l30 98l30 -98l98 -30l-98 -30l-30 -98l-30 98z" />
218 <glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M64 192q0 26 19 45t45 19v320q0 8 -0.5 35t0 38t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45v-1024q0 -15 -4 -26.5t-13.5 -18.5t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5 q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM384 128q0 -52 38 -90t90 -38 t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90zM1280 128q0 -52 38 -90t90 -38t90 38t38 90t-38 90t-90 38t-90 -38t-38 -90z" />
219 <glyph unicode="&#xf0d2;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63 q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5 q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423z" />
220 <glyph unicode="&#xf0d3;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5 q-104 0 -194.5 -28.5t-153 -76.5t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118 q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5z" />
221 <glyph unicode="&#xf0d4;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM276 309q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117 q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94 q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95zM395 338q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78z M462 969q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5t-57.5 96.5t-17.5 106zM960 672h128v-160h64v160h128v64h-128v128h-64v-128h-128v-64z" />
222 <glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M32 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65 t-59.5 -61.5t-24.5 -66q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131zM218 228q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5q58 0 111.5 13t99 39t73 73 t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5zM324 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q38 0 78 16.5t66 43.5q53 57 53 159 q0 58 -17 125t-48.5 129.5t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160zM1084 731v108h212v217h105v-217h213v-108h-213v-219h-105v219h-212z" />
223 <glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M0 64v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45zM128 384q106 0 181 -75t75 -181h1152q0 106 75 181t181 75v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512zM640 640q0 70 21 142 t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142t-21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142zM762 791l77 -80q42 37 55 57h2v-288h-128v-96h384v96h-128v448h-114z" />
224 <glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M0 832q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
225 <glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M0 320q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
226 <glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M64 640q0 26 19 45l448 448q19 19 45 19t45 -19t19 -45v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45z" />
227 <glyph unicode="&#xf0da;" horiz-adv-x="640" d="M0 192v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45z" />
228 <glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M0 32v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113zM128 32q0 -13 9.5 -22.5t22.5 -9.5h608v1152h-640v-1120zM896 0h608q13 0 22.5 9.5t9.5 22.5v1120h-640v-1152z" />
229 <glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45zM0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
230 <glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M0 448q0 26 19 45t45 19h896q26 0 45 -19t19 -45t-19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45z" />
231 <glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M0 832q0 26 19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45z" />
232 <glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M0 32v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113zM0 1098q0 78 41.5 130t118.5 52h1472 q65 0 112.5 -47t47.5 -113q0 -79 -49 -151t-122 -123q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5z" />
233 <glyph unicode="&#xf0e1;" d="M0 1217q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122zM19 -80v991h330v-991h-330zM531 -80q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5v-568 h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329z" />
234 <glyph unicode="&#xf0e2;" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45z" />
235 <glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M40 736q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18 q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5 q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5 t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68z" />
236 <glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M0 384q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29q-141 221 -141 483zM128 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M320 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM710 241q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91l101 382q6 26 -7.5 48.5t-38.5 29.5t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5 t-63 -98.5zM768 1024q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1216 832q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 384q0 -53 37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
237 <glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M0 640q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5t-120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5 t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281zM128 640q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5t-381.5 -69.5 t-282 -187.5t-104.5 -255z" />
238 <glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M0 768q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257t-94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25 t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224zM128 768q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52t-286 -52t-211.5 -141t-78.5 -191zM616 132 q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22 t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132z" />
239 <glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M1 551l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39z" />
240 <glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M0 -32v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68z" />
241 <glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M0 681q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17 q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5z M384 128q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180zM768 1310v98q0 26 19 45t45 19t45 -19t19 -45v-98q-42 2 -64 2t-64 -2z" />
242 <glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M0 96v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88v-672q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68zM256 1312q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5v64 q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64zM768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1280 640h299l-299 299v-299z" />
243 <glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M0 960q0 99 44.5 184.5t117 142t164 89t186.5 32.5t186.5 -32.5t164 -89t117 -142t44.5 -184.5q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47q0 -46 -31.5 -71t-77.5 -25 q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268zM128 960q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228 q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134zM480 1088q0 13 9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5 q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5z" />
244 <glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M0 256q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22zM0 800v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23 t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5z" />
245 <glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 608q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5z" />
246 <glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M0 448q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5z M512 672q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24z" />
247 <glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M0 131q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89 q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5 t81 -103t47.5 -132.5t24 -138t5.5 -131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190zM256 192q0 26 19 45t45 19t45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45zM320 1024q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 t-271.5 112.5t-112.5 271.5z" />
248 <glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M0 768v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48 q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5 t-131.5 271.5v132q-164 20 -274 128t-110 252zM1152 832q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
249 <glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h64v-1280h-64q-92 0 -158 66t-66 158zM384 -128v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128v-1280h-1024zM640 1152h512v128h-512v-128zM1504 -128v1280h64q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-64z " />
250 <glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M0 128q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38 t-38 90zM656 0q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16z" />
251 <glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM256 480v736q0 26 19 45t45 19h1152q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158zM1408 704h64q80 0 136 56t56 136 t-56 136t-136 56h-64v-384z" />
252 <glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M0 832v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128 q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111zM768 416v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5z" />
253 <glyph unicode="&#xf0f6;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM384 160v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64 q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 416v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM384 672v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
254 <glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1536h-1152v-1536zM256 160v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 928v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 1184v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 928v64q0 13 9.5 22.5t22.5 9.5h64 q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 1184v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" />
255 <glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M0 -192v1280q0 26 19 45t45 19h320v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM128 -128h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224h384v1152h-256 v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152zM256 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM256 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64 q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM512 1056q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128 v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320zM768 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM768 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 160v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 416v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5zM1024 672v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5 v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5z" />
256 <glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M64 192q0 26 19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128 q-26 0 -45 19t-19 45zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM384 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM896 800q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192 q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM1280 128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
257 <glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M0 96v832q0 92 66 158t158 66h32v-1280h-32q-92 0 -158 66t-66 158zM352 -128v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160v-1280h-1088zM512 416q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23v192 q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192zM640 1152h512v128h-512v-128zM1536 -128v1280h32q92 0 158 -66t66 -158v-832q0 -92 -66 -158t-158 -66h-32z" />
258 <glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M0 512v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93l1 -3q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5 t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8z" />
259 <glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M64 1152l32 128h480l32 128h960l32 -192l-64 -32v-800l128 -192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320zM384 768q0 -53 37.5 -90.5t90.5 -37.5h128v384h-256v-256z" />
260 <glyph unicode="&#xf0fd;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 192q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896z" />
261 <glyph unicode="&#xf0fe;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45 v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128z" />
262 <glyph unicode="&#xf100;" horiz-adv-x="1024" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM429 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23 l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
263 <glyph unicode="&#xf101;" horiz-adv-x="1024" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM397 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10 l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
264 <glyph unicode="&#xf102;" horiz-adv-x="1152" d="M77 224q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM77 608q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23 l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
265 <glyph unicode="&#xf103;" horiz-adv-x="1152" d="M77 672q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM77 1056q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10 l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
266 <glyph unicode="&#xf104;" horiz-adv-x="640" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
267 <glyph unicode="&#xf105;" horiz-adv-x="640" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
268 <glyph unicode="&#xf106;" horiz-adv-x="1152" d="M77 352q0 13 10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
269 <glyph unicode="&#xf107;" horiz-adv-x="1152" d="M77 800q0 13 10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23z" />
270 <glyph unicode="&#xf108;" horiz-adv-x="1920" d="M0 288v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113zM128 544q0 -13 9.5 -22.5 t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832z" />
271 <glyph unicode="&#xf109;" horiz-adv-x="1920" d="M0 96v96h160h1600h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68zM256 416v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113zM384 416q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5 t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM864 112q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16z" />
272 <glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M0 160v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-832q-66 0 -113 47t-47 113zM128 288q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM512 128 q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
273 <glyph unicode="&#xf10b;" horiz-adv-x="768" d="M0 128v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90zM96 288q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704zM288 1136 q0 -16 16 -16h160q16 0 16 16t-16 16h-160q-16 0 -16 -16zM304 128q0 -33 23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5z" />
274 <glyph unicode="&#xf10c;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273z" />
275 <glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M0 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z M896 192v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136z" />
276 <glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M0 832v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136zM896 832v384 q0 80 56 136t136 56h384q80 0 136 -56t56 -136v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136z" />
277 <glyph unicode="&#xf110;" horiz-adv-x="1568" d="M0 640q0 66 47 113t113 47t113 -47t47 -113t-47 -113t-113 -47t-113 47t-47 113zM176 1088q0 73 51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5t-51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5zM208 192q0 60 42 102t102 42q59 0 101.5 -42t42.5 -102t-42.5 -102 t-101.5 -42q-60 0 -102 42t-42 102zM608 1280q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM672 0q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM1136 192q0 46 33 79t79 33t79 -33t33 -79 t-33 -79t-79 -33t-79 33t-33 79zM1168 1088q0 33 23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5t-23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5zM1344 640q0 40 28 68t68 28t68 -28t28 -68t-28 -68t-68 -28t-68 28t-28 68z" />
278 <glyph unicode="&#xf111;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5z" />
279 <glyph unicode="&#xf112;" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101 t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19l-512 512q-19 19 -19 45z" />
280 <glyph unicode="&#xf113;" horiz-adv-x="1664" d="M0 496q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218q0 -87 -27 -168q136 -160 136 -398q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86t-170 -47.5t-171.5 -22t-167 -4.5 q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331zM224 320q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11 q-152 21 -195 21q-118 0 -187 -84t-69 -204zM384 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82zM1024 320q0 40 12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82t-12.5 -82t-43 -76t-72.5 -34t-72.5 34 t-43 76t-12.5 82z" />
281 <glyph unicode="&#xf114;" horiz-adv-x="1664" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158zM128 224q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64 q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960z" />
282 <glyph unicode="&#xf115;" horiz-adv-x="1920" d="M0 224v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158zM128 331l256 315q44 53 116 87.5 t140 34.5h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-853zM171 163q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40z " />
283 <glyph unicode="&#xf116;" horiz-adv-x="1792" />
284 <glyph unicode="&#xf117;" horiz-adv-x="1792" />
285 <glyph unicode="&#xf118;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 461q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38 q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5q-37 -121 -138 -195t-228 -74t-228 74t-138 195zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
286 <glyph unicode="&#xf119;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM402 307q37 121 138 195t228 74t228 -74t138 -195q8 -25 -4 -48.5 t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
287 <glyph unicode="&#xf11a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM384 448q0 26 19 45t45 19h640q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45zM384 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5zM896 896q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5z" />
288 <glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M0 512q0 212 150 362t362 150h896q212 0 362 -150t150 -362t-150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150t-150 362zM192 448q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23v128 q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128zM1152 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1408 640q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" />
289 <glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M0 128v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5zM128 128h1664v896h-1664v-896zM256 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM256 528v96 q0 16 16 16h224q16 0 16 -16v-96q0 -16 -16 -16h-224q-16 0 -16 16zM256 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM512 272v96q0 16 16 16h864q16 0 16 -16v-96q0 -16 -16 -16h-864q-16 0 -16 16zM512 784v96q0 16 16 16h96q16 0 16 -16v-96 q0 -16 -16 -16h-96q-16 0 -16 16zM640 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM768 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM896 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z M1024 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1152 528v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1280 784v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16zM1408 528v96q0 16 16 16h112v240 q0 16 16 16h96q16 0 16 -16v-352q0 -16 -16 -16h-224q-16 0 -16 16zM1536 272v96q0 16 16 16h96q16 0 16 -16v-96q0 -16 -16 -16h-96q-16 0 -16 16z" />
290 <glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599z" />
291 <glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M64 1280q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64zM320 320v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86 q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56zM448 426 q205 96 384 110v192q-181 -16 -384 -117v-185zM448 836q215 111 384 118v197q-172 -8 -384 -126v-189zM832 730h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15 t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2q-23 0 -49 -3v-222zM1280 828q148 -42 384 90v189q-169 -91 -306 -91q-45 0 -78 8v-196z" />
292 <glyph unicode="&#xf120;" horiz-adv-x="1664" d="M13 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23zM640 32v64q0 14 9 23t23 9h960q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-960 q-14 0 -23 9t-9 23z" />
293 <glyph unicode="&#xf121;" horiz-adv-x="1920" d="M45 576q0 13 10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23zM712 -52l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5 l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5zM1293 160q0 13 10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23z" />
294 <glyph unicode="&#xf122;" horiz-adv-x="1792" d="M0 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45l397 -397v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45zM384 896q0 26 19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221 q169 -173 169 -509q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45z" />
295 <glyph unicode="&#xf123;" horiz-adv-x="1664" d="M2 900.5q9 27.5 54 34.5l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5z M832 310l59 -31l318 -168l-60 355l-12 66l49 47l257 250l-356 52l-66 10l-30 60l-159 322v-963z" />
296 <glyph unicode="&#xf124;" horiz-adv-x="1408" d="M2 561q-5 22 4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5z" />
297 <glyph unicode="&#xf125;" horiz-adv-x="1664" d="M0 928v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864 q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23zM512 301l595 595h-595v-595zM557 256h595v595z" />
298 <glyph unicode="&#xf126;" horiz-adv-x="1024" d="M0 64q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136 q0 -52 -26 -96.5t-70 -69.5q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136zM96 64q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM96 1216q0 -40 28 -68 t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68zM736 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" />
299 <glyph unicode="&#xf127;" horiz-adv-x="1664" d="M0 448q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23zM16 1088q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56l-239 -18l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68 l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204zM128 32q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23zM544 -96v320q0 14 9 23t23 9t23 -9t9 -23v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23zM633 364 l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56zM1056 1184v320q0 14 9 23t23 9t23 -9t9 -23v-320 q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1216 1120q0 13 9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23zM1280 960q0 14 9 23t23 9h320q14 0 23 -9t9 -23t-9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
300 <glyph unicode="&#xf128;" horiz-adv-x="1024" d="M96.5 986q-2.5 15 5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5t-10.5 37.5v45q0 83 65 156.5 t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25zM384 40v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28z" />
301 <glyph unicode="&#xf129;" horiz-adv-x="640" d="M0 64v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45zM128 1152v192q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-192 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
302 <glyph unicode="&#xf12a;" horiz-adv-x="640" d="M98 1344q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45zM128 64v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45z" />
303 <glyph unicode="&#xf12b;" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1013 713q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80h126v-206h-514l-3 27q-4 28 -4 46z " />
304 <glyph unicode="&#xf12c;" d="M5 0v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258zM1015 -183q0 64 26 117t65 86.5 t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126v-206h-514l-4 27q-3 45 -3 46z" />
305 <glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M1.5 146.5q5.5 37.5 30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5zM128 128h768l336 384h-768z" />
306 <glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M0 0v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5 q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124 q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89 q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1z" />
307 <glyph unicode="&#xf130;" horiz-adv-x="1152" d="M0 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45 t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5zM256 704v512q0 132 94 226t226 94t226 -94t94 -226v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226z" />
308 <glyph unicode="&#xf131;" horiz-adv-x="1408" d="M13 64q0 13 10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23t-10 -23l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -221 -147.5 -384.5 t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23zM128 704v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113l-101 -101 q-42 103 -42 214zM384 704v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
309 <glyph unicode="&#xf132;" horiz-adv-x="1280" d="M0 576v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150t-33.5 170.5zM640 79 q119 63 213 137q235 184 235 360v640h-448v-1137z" />
310 <glyph unicode="&#xf133;" horiz-adv-x="1664" d="M0 -128v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90zM128 -128h1408v1024h-1408v-1024z M384 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288zM1152 1088q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288z" />
311 <glyph unicode="&#xf134;" horiz-adv-x="1408" d="M3.5 940q-8.5 25 3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96 q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37 zM384 1344q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
312 <glyph unicode="&#xf135;" horiz-adv-x="1664" d="M36 464l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85 q-3 -1 -9 -1q-14 0 -23 9l-64 64q-17 19 -5 39zM1248 1088q0 -40 28 -68t68 -28t68 28t28 68t-28 68t-68 28t-68 -28t-28 -68z" />
313 <glyph unicode="&#xf136;" horiz-adv-x="1792" d="M0 0l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334z" />
314 <glyph unicode="&#xf137;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM346 640q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l102 102q19 19 19 45t-19 45l-307 307l307 307 q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
315 <glyph unicode="&#xf138;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM506 288q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-454 454 q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45z" />
316 <glyph unicode="&#xf139;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 544q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19l102 102 q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45z" />
317 <glyph unicode="&#xf13a;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM250 736q0 -26 19 -45l454 -454q19 -19 45 -19t45 19l454 454q19 19 19 45t-19 45l-102 102 q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
318 <glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M0 1408h1408l-128 -1438l-578 -162l-574 162zM262 1114l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674l16 175h-884z" />
319 <glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M12 75l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208l59 297h1505l-266 -1333l-804 -267z" />
320 <glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M0 0v352q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192 q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5 l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30zM832 1280q0 -26 19 -45t45 -19t45 19t19 45t-19 45t-45 19t-45 -19t-19 -45z" />
321 <glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M0 96v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181v-320h736q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28 t-28 68z" />
322 <glyph unicode="&#xf140;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5zM256 640q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362zM384 640q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
323 <glyph unicode="&#xf141;" horiz-adv-x="1408" d="M0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM512 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM1024 608v192q0 40 28 68t68 28h192 q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
324 <glyph unicode="&#xf142;" horiz-adv-x="384" d="M0 96v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 608v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68zM0 1120v192q0 40 28 68t68 28h192q40 0 68 -28 t28 -68v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68z" />
325 <glyph unicode="&#xf143;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 256q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z M256 575q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10t9 24q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128zM256 959q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128 q13 0 23 10q11 9 9 23q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128z" />
326 <glyph unicode="&#xf144;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM512 320q0 -37 32 -56q16 -8 32 -8q17 0 32 9l544 320q32 18 32 55t-32 55l-544 320q-31 19 -64 1 q-32 -19 -32 -56v-640z" />
327 <glyph unicode="&#xf145;" horiz-adv-x="1792" d="M54 448.5q0 53.5 37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136t-136 56t-136 -56l-125 126q-37 37 -37 90.5z M342 512q0 -26 19 -45l362 -362q18 -18 45 -18t45 18l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45zM452 512l572 572l316 -316l-572 -572z" />
328 <glyph unicode="&#xf146;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 576q0 -26 19 -45t45 -19h896q26 0 45 19t19 45v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128 z" />
329 <glyph unicode="&#xf147;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" />
330 <glyph unicode="&#xf148;" horiz-adv-x="1024" d="M3 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18z" />
331 <glyph unicode="&#xf149;" horiz-adv-x="1024" d="M3 1261q9 19 29 19h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34z" />
332 <glyph unicode="&#xf14a;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 640q0 -26 19 -45l358 -358q19 -19 45 -19t45 19l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19 t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45z" />
333 <glyph unicode="&#xf14b;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 128h288l544 544l-288 288l-544 -544v-288zM352 320v56l52 52l152 -152l-52 -52h-56v96h-96zM494 494 q-14 13 3 30l291 291q17 17 30 3q14 -13 -3 -30l-291 -291q-17 -17 -30 -3zM864 1024l288 -288l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28z" />
334 <glyph unicode="&#xf14c;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM282 320q0 -26 19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59 v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45z" />
335 <glyph unicode="&#xf14d;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 448q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5t224 23.5v-160 q0 -42 40 -59q12 -5 24 -5q26 0 45 19l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5z" />
336 <glyph unicode="&#xf14e;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 241v542l512 256v-542zM640 448l256 128l-256 128v-256z" />
337 <glyph unicode="&#xf150;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 861q17 35 57 35h640q40 0 57 -35q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66z" />
338 <glyph unicode="&#xf151;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM391 419q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66q-17 -35 -57 -35h-640q-40 0 -57 35z" />
339 <glyph unicode="&#xf152;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -14 9 -23t23 -9h960q14 0 23 9t9 23v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960z M512 320v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52t-27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57z" />
340 <glyph unicode="&#xf153;" horiz-adv-x="1024" d="M0 514v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5 t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5 l12 3l5 2q13 5 26 -2q12 -7 15 -21l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5z" />
341 <glyph unicode="&#xf154;" horiz-adv-x="1024" d="M0 32v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215 h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23z" />
342 <glyph unicode="&#xf155;" horiz-adv-x="1024" d="M52 171l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242 t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48 t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50t53 -63.5t31.5 -76.5t13 -94q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5 t-17.5 18q-17 21 -2 41z" />
343 <glyph unicode="&#xf156;" horiz-adv-x="898" d="M0 605v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171 q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22z" />
344 <glyph unicode="&#xf157;" horiz-adv-x="1027" d="M4 1360q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103 q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214z" />
345 <glyph unicode="&#xf158;" horiz-adv-x="1280" d="M0 256v128q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315t-126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9 h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23zM487 747h320q106 0 171 62t65 162t-65 162t-171 62h-320v-448z" />
346 <glyph unicode="&#xf159;" horiz-adv-x="1792" d="M0 672v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111 q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23z M373 896l32 -128h225l35 128h-292zM436 640l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5l81 299h-159zM822 768h139l-35 128h-70zM1118 896l34 -128h230l33 128h-297zM1187 640l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3l78 300h-162z" />
347 <glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M56 0l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89 t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200zM522 182q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30t24.5 40t9.5 51q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1 t-47.5 -1v-338zM522 674q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307z" />
348 <glyph unicode="&#xf15b;" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
349 <glyph unicode="&#xf15c;" d="M0 -160v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM384 160q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 416q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM384 672q0 -14 9 -23t23 -9h704q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64zM1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472z" />
350 <glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 768v106h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106 h-287zM988 -166l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121v-233h-584v90zM1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18 t-7.5 -29z" />
351 <glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM899 -150h70l230 662h162l230 -662h70v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287 v106zM988 768v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248v119h121v-233h-584zM1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29 z" />
352 <glyph unicode="&#xf160;" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23z" />
353 <glyph unicode="&#xf161;" horiz-adv-x="1792" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM896 -32q0 14 9 23t23 9h256q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9 t-9 23v192zM896 288v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23zM896 800v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23zM896 1312v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23 v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23z" />
354 <glyph unicode="&#xf162;" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 261q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 1351l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17 v16h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 261q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" />
355 <glyph unicode="&#xf163;" d="M34 108q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35zM946 1285q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5q0 -62 -13 -121.5t-41 -114 t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5zM976 327l192 185h123v-654h165v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16 h-2l-7 -12q-8 -13 -26 -31l-62 -58zM1085 1285q0 -57 36.5 -95t104.5 -38q50 0 85 27t35 68q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94z" />
356 <glyph unicode="&#xf164;" horiz-adv-x="1664" d="M0 64v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45zM128 192q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45zM480 64v641q0 25 18 43.5t43 20.5q24 2 76 59 t101 121q68 87 101 120q18 18 31 48t17.5 48.5t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135 q0 -86 -55 -149q15 -44 15 -76q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5z" />
357 <glyph unicode="&#xf165;" horiz-adv-x="1664" d="M0 448q0 -26 19 -45t45 -19h288q26 0 45 19t19 45v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640zM128 960q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45zM480 447v641q0 26 19 44.5t45 19.5q35 1 158 44 q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76q55 -61 55 -149q-1 -78 -57.5 -135t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39 t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121t-76 59q-25 2 -43 20.5t-18 43.5z" />
358 <glyph unicode="&#xf166;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM218 366q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73 q20 84 20 260q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5q-20 -87 -20 -260zM300 551v70h232v-70h-80v-423h-74v423h-78zM396 1313l24 -69t23 -69q35 -103 46 -158v-201h74v201l90 296h-75l-51 -195l-53 195 h-78zM542 205v290h66v-270q0 -24 1 -26q1 -15 15 -15q20 0 42 31v280h67v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54zM654 936q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38q-21 -29 -21 -87v-130zM721 923 v156q0 52 32 52t32 -52v-156q0 -51 -32 -51t-32 51zM790 128v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67zM857 200q16 -16 33 -16q29 0 29 49v157q0 50 -29 50q-17 0 -33 -16v-224zM907 893q0 -37 6 -55 q11 -27 43 -27q36 0 77 45v-40h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293zM1037 247v129q0 59 20 86q29 38 80 38t78 -38q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68v-9q0 -29 -2 -43q-3 -22 -15 -40 q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86zM1103 355h66v34q0 51 -33 51t-33 -51v-34z" />
359 <glyph unicode="&#xf167;" d="M27 260q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99q-26 112 -26 350zM138 509h105v-569h100v569h107v94h-312 v-94zM266 1536h106l71 -263l68 263h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187zM463 43q0 -49 8 -73q12 -37 58 -37q48 0 102 61v-54h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391zM614 1028v175q0 80 28 117q38 51 105 51 q69 0 106 -51q28 -37 28 -117v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51q-28 38 -28 118zM704 1011q0 -70 43 -70t43 70v210q0 69 -43 69t-43 -69v-210zM798 -60h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89 v-663zM887 36v301q22 22 45 22q39 0 39 -67v-211q0 -67 -39 -67q-23 0 -45 22zM955 971v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75zM1130 100q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54 q2 9 2 58v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51q-28 -37 -28 -116v-173zM1219 245v46q0 68 45 68t45 -68v-46h-90z" />
360 <glyph unicode="&#xf168;" horiz-adv-x="1408" d="M5 384q-10 17 0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45l164 -286q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17zM536 539q18 32 531 942q25 45 64 45h241q22 0 31 -15q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37 q-10 -15 -32 -15h-239q-42 0 -66 45z" />
361 <glyph unicode="&#xf169;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM227 396q8 -13 24 -13h185q31 0 50 36l199 352q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29 l125 -216v-1l-196 -346q-9 -14 0 -28zM638 516q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1l409 723q8 16 0 28q-7 12 -24 12h-187q-30 0 -49 -35z" />
362 <glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M0 640q0 96 1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150t-1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58 t-69.5 123q-14 65 -21.5 147.5t-8.5 136.5t-1 150zM640 320q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54t-30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640z" />
363 <glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M64 558l338 271l494 -305l-342 -285zM64 1099l490 319l342 -285l-494 -304zM407 166v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284l147 96v-108l-490 -293v-1l-1 1l-1 -1v1zM896 524l494 305l338 -271l-489 -319zM896 1133l343 285l489 -319l-338 -270z" />
364 <glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M0 -255v736h121v-618h928v618h120v-701l-1 -35v-1h-1132l-35 1h-1zM221 -17v151l707 1v-151zM227 243l14 150l704 -65l-13 -150zM270 563l39 146l683 -183l-39 -146zM395 928l77 130l609 -360l-77 -130zM707 1303l125 86l398 -585l-124 -85zM1136 1510l149 26l121 -697 l-149 -26z" />
365 <glyph unicode="&#xf16d;" d="M0 69v1142q0 81 58 139t139 58h1142q81 0 139 -58t58 -139v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139zM171 110q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62 q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648zM461 643q0 -124 90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5t-90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5zM1050 1003q0 -29 20 -49t49 -20h174q29 0 49 20t20 49v165q0 28 -20 48.5 t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165z" />
366 <glyph unicode="&#xf16e;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM274 640q0 -88 62 -150t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150zM838 640q0 -88 62 -150 t150 -62t150 62t62 150t-62 150t-150 62t-150 -62t-62 -150z" />
367 <glyph unicode="&#xf170;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM309 384h94l104 160h522l104 -160h94l-459 691zM567 608l201 306l201 -306h-402z" />
368 <glyph unicode="&#xf171;" horiz-adv-x="1408" d="M0 1222q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34 t-6 39.5t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158zM173 285l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18t-76.5 27 t-73 43.5t-52 61.5q-25 96 -57 292zM243 1240q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5q-20 27 -56 44.5t-58 22t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43zM481 657q4 -91 77.5 -155t165.5 -56q91 8 152 84 t50 168q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5zM599 710q14 41 52 58q36 18 72.5 12t64 -35.5t27.5 -67.5q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82z" />
369 <glyph unicode="&#xf172;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM260 1060q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63 q24 13 39.5 23t31 29t19.5 40q48 267 80 473q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54zM385 384q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71q0 7 5.5 26.5t3 32 t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6zM436 1073q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5t-52.5 16t-54.5 32.5zM607 653q-2 49 25.5 93t72.5 64 q70 31 141.5 -10t81.5 -118q8 -66 -36 -121t-110 -61t-119 40t-56 113zM687.5 660.5q0.5 -52.5 43.5 -70.5q39 -23 81 4t36 72q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5z" />
370 <glyph unicode="&#xf173;" horiz-adv-x="1024" d="M78 779v217q91 30 155 84q64 55 103 132q39 78 54 196h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170z" />
371 <glyph unicode="&#xf174;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM413 744h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49v181 q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163z" />
372 <glyph unicode="&#xf175;" horiz-adv-x="768" d="M3 237q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19t-5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35z" />
373 <glyph unicode="&#xf176;" horiz-adv-x="768" d="M3 1043q-8 19 5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19z" />
374 <glyph unicode="&#xf177;" horiz-adv-x="1792" d="M64 637q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23z" />
375 <glyph unicode="&#xf178;" horiz-adv-x="1792" d="M0 544v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23z" />
376 <glyph unicode="&#xf179;" horiz-adv-x="1408" d="M0 634q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32 q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503zM683 1131q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17z" />
377 <glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M0 -27v557h682v-651zM0 614v565l682 94v-659h-682zM757 -131v661h907v-786zM757 614v669l907 125v-794h-907z" />
378 <glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M0 337v430q0 42 30 72t73 30q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30t-73 30t-30 73zM241 886q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20l-71 -131q107 -55 171 -153.5t64 -215.5 h-925zM245 184v666h918v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78zM455 1092q0 -16 11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27.5 t-27.5 11.5t-27 -11.5t-11 -27.5zM876 1092q0 -16 11.5 -27.5t27.5 -11.5t27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5zM1203 337v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73z" />
379 <glyph unicode="&#xf17c;" d="M11 -115q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48q3 -17 37 -26q20 -6 84.5 -18.5 t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195q-12 112 -16 310q-2 90 24 151.5 t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5 t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13 t16.5 -9.5q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5 q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5zM321 495q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54 t7 -70.5q46 24 7 92q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5 t60 -22.5q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18zM372 630q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12zM603 1190q2 -5 5 -6 q10 0 7 -15q-3 -20 8 -20q3 0 3 3q3 17 -2.5 30t-11.5 15q-9 2 -9 -7zM634 1110q0 12 19 15h10q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5zM721 1122q24 11 32 -2q3 -6 -3 -9q-4 -1 -11.5 6.5t-17.5 4.5zM835 1196l4 -2q14 -4 18 -31q0 -3 8 2l2 3q0 11 -5 19.5t-11 12.5 t-9 3q-14 -1 -7 -7zM851 1381.5q-1 -2.5 3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9zM981 1002q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20q-2 8 -6.5 11.5t-13 5 t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5z" />
380 <glyph unicode="&#xf17d;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM112 640q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81t99.5 48l37 13 q4 1 13 3.5t13 4.5q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21zM126 775q302 0 606 80q-120 213 -244 378q-138 -65 -234 -186t-128 -272zM350 134q184 -150 418 -150q132 0 256 52q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5 t-103 -148zM609 1276q1 1 2 1q-1 0 -2 -1zM613 1277q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5l12.5 17.5q-185 164 -433 164q-76 0 -155 -19zM909 797q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5 t36.5 -6t25 -4.5l10 -2q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5zM1007 565q87 -239 128 -469q111 75 185 189.5t96 250.5q-210 60 -409 29z" />
381 <glyph unicode="&#xf17e;" d="M0 1024q0 159 112.5 271.5t271.5 112.5q130 0 234 -80q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225 t-55.5 273.5q0 73 16 150q-80 104 -80 234zM376 399q0 -92 122 -157.5t291 -65.5q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12 t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5 q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75z" />
382 <glyph unicode="&#xf180;" horiz-adv-x="1664" d="M0 640q0 75 53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41l619 619l2 -3q53 -53 53 -128t-53 -128l-587 -587 q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128zM302 660q0 21 14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36z" />
383 <glyph unicode="&#xf181;" d="M0 -64v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM160 192q0 -14 9 -23t23 -9h480q14 0 23 9t9 23v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024zM832 576q0 -14 9 -23t23 -9h480q14 0 23 9t9 23 v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640z" />
384 <glyph unicode="&#xf182;" horiz-adv-x="1280" d="M0 480q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192 q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43q-40 0 -68 28t-28 68zM416 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
385 <glyph unicode="&#xf183;" horiz-adv-x="1024" d="M0 416v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68z M288 1280q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
386 <glyph unicode="&#xf184;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM399.5 766q8.5 -37 24.5 -59l349 -473l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5 t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85z" />
387 <glyph unicode="&#xf185;" horiz-adv-x="1792" d="M44 363q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29q-4 -15 -20 -20 l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20zM320 640q0 -117 45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5 t-45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5z" />
388 <glyph unicode="&#xf186;" d="M0 640q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384z" />
389 <glyph unicode="&#xf187;" horiz-adv-x="1792" d="M64 1088v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1536q-26 0 -45 19t-19 45zM128 -64v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45zM704 704q0 -26 19 -45t45 -19h256 q26 0 45 19t19 45t-19 45t-45 19h-256q-26 0 -45 -19t-19 -45z" />
390 <glyph unicode="&#xf188;" horiz-adv-x="1664" d="M32 576q0 26 19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19t19 -45t-19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19 t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45z M512 1152q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5h-640z" />
391 <glyph unicode="&#xf189;" horiz-adv-x="1920" d="M-1 1004q0 11 3 16l4 6q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24 q17 19 38 30q53 26 239 24q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5 t13 3t20 0.5l288 2q39 5 64 -2.5t31 -16.5l6 -10q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12 q-30 21 -70 64t-68.5 77.5t-61 58t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211 t-130.5 272q-6 16 -6 27z" />
392 <glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M0 391q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5q0 -68 -37 -139.5 t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5zM181 320q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5zM413.5 230.5 q-40.5 92.5 6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5q-45 -102 -158 -150t-224 -12q-107 34 -147.5 126.5zM495 257.5q9 -34.5 43 -50.5t74.5 -2.5t62.5 47.5q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5zM705 399 q-17 -31 13 -45q14 -5 29 0.5t22 18.5q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5zM1165 1274q-6 28 9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158 q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5zM1224 1047q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5t54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37z" />
393 <glyph unicode="&#xf18b;" d="M0 638q0 187 83.5 349.5t229.5 269.5t325 137v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495zM398 -34q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211q-171 -94 -368 -94q-196 0 -367 94zM898 909v485q179 -30 325 -137t229.5 -269.5 t83.5 -349.5q0 -280 -181 -495q-204 99 -330.5 306.5t-126.5 459.5z" />
394 <glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M0 -211q0 19 13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23 t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89 t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283 q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32z" />
395 <glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M21 217v66h1238v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5zM21 354v255h1238v-255h-1238zM21 682v255h1238v-255h-1238zM21 1010v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5v-67h-1238z" />
396 <glyph unicode="&#xf18e;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 544v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23t-9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5z" />
397 <glyph unicode="&#xf190;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM384 640q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23z" />
398 <glyph unicode="&#xf191;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 160q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5v960q0 13 -9.5 22.5t-22.5 9.5h-960 q-13 0 -22.5 -9.5t-9.5 -22.5v-960zM448 640q0 33 27 52l448 320q17 12 37 12q26 0 45 -19t19 -45v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52z" />
399 <glyph unicode="&#xf192;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM224 640q0 -148 73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73 t-198 -198t-73 -273zM512 640q0 106 75 181t181 75t181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181z" />
400 <glyph unicode="&#xf193;" horiz-adv-x="1664" d="M0 320q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5zM416 1348q-2 16 6 42 q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455l198 99l58 -114l-256 -128q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5z" />
401 <glyph unicode="&#xf194;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 806q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5 q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237q104 139 172.5 292.5t82.5 226.5q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143 q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7z" />
402 <glyph unicode="&#xf195;" horiz-adv-x="1152" d="M0 608v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31 l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26z" />
403 <glyph unicode="&#xf196;" horiz-adv-x="1408" d="M0 288v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5zM128 288q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47 t-47 -113v-832zM256 672v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23z" />
404 <glyph unicode="&#xf197;" horiz-adv-x="2176" d="M0 576q0 12 38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113q-110 -64 -268 -64h-128v64 h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5zM323 336h29q157 0 273 64h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96zM323 816l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5 t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64h-29zM1739 484l81 -30q68 48 68 122t-68 122l-81 -30q53 -36 53 -92t-53 -92z" />
405 <glyph unicode="&#xf198;" horiz-adv-x="1664" d="M0 796q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5 t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72 l-55 163l-153 -53q-29 -9 -50 -9q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5zM620 811l105 -313l310 105l-105 315z" />
406 <glyph unicode="&#xf199;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 352q0 -40 28 -68t68 -28h832q40 0 68 28t28 68v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99 q-98 -69 -164 -69t-164 69q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436zM256 928q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13 t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68z" />
407 <glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM41 640q0 -173 68 -331.5t182.5 -273t273 -182.5t331.5 -68t331.5 68t273 182.5t182.5 273t68 331.5 t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5zM127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM254 1062q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5 q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21t14.5 -24t14 -23q63 -107 63 -212q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15 t-1.5 -18.5t9 -16.5t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5zM679 -97l230 670l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1282 -24l235 678q59 169 59 276q0 42 -6 79 q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5z" />
408 <glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M0 455q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360l272 133v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5zM1134 860v172q277 -33 481 -157l140 79l37 -390l-525 114l147 83 q-119 70 -280 99z" />
409 <glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M0 -128q0 26 20.5 45t48.5 19h1782q28 0 48.5 -19t20.5 -45v-128h-1920v128zM0 1024v128l960 384l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128zM128 0v64q0 26 20.5 45t48.5 19h59v768h256v-768h128v768h256v-768h128v768h256 v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664z" />
410 <glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M0 1024q0 23 22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31t-22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433 q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31zM512 384l18 316l574 -181q22 -7 48 -7t48 7l574 181l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128z" />
411 <glyph unicode="&#xf19e;" d="M109 1536q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610l13 -707q-62 11 -105 11 q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287z" />
412 <glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M111 182q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5t-59.5 -93 t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131zM297 228q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13 t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5zM403 1222q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5 q53 56 53 159q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160z" />
413 <glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M0 722q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58 q94 0 160 -66t66 -160q0 -62 -31 -114t-83 -82q5 -33 5 -61q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5zM77 722q0 -67 51 -111 q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM178 465q0 -101 59.5 -194t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5 t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5zM555 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM661 209.5q0 16.5 11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77q11 11 27 11t27 -11t11 -27.5t-11 -27.5 q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5zM1153 572q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96zM1555 1350q0 -45 32 -77t77 -32t77 32t32 77t-32 77t-77 32t-77 -32t-32 -77zM1672 843q131 -105 178 -238 q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28z" />
414 <glyph unicode="&#xf1a2;" d="M0 193v894q0 133 94 227t226 94h896q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227zM155 709q0 -37 19.5 -67.5t52.5 -45.5q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54 q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43 q-51 0 -87 -36.5t-36 -87.5zM493 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM560 375q0 11 8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18z M882 613q0 37 26 63t63 26t63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64zM1143 1120q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21q-29 0 -50 21t-21 50z" />
415 <glyph unicode="&#xf1a3;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM320 502q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14 q19 0 32.5 -14t13.5 -33v-54l60 -28l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122zM806 500q0 -80 58 -137t139 -57t138.5 57t57.5 139v122h-150v-126q0 -20 -13.5 -33.5t-33.5 -13.5 q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123z" />
416 <glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M0 336v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58l-131 61v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5zM1062 332 v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275h328v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5z" />
417 <glyph unicode="&#xf1a5;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM64 640h704v-704h480q93 0 158.5 65.5t65.5 158.5v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480z " />
418 <glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M0 271v697h328v286h204v-983h-532zM205 435h123v369h-123v-369zM614 271h205v697h-205v-697zM614 1050h205v204h-205v-204zM901 26v163h328v82h-328v697h533v-942h-533zM1106 435h123v369h-123v-369zM1516 26v163h327v82h-327v697h532v-942h-532zM1720 435h123v369h-123 v-369z" />
419 <glyph unicode="&#xf1a7;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM293 388l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229t-88.5 229t-213.5 95q-74 0 -141 -36h-186v-840z M504 804v277q28 17 70 17q53 0 91 -45t38 -109t-38 -109.5t-91 -45.5q-43 0 -70 15zM636 -39l211 41v206q51 -19 117 -19q125 0 213 95t88 229t-88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101v-636zM847 377v277q28 17 70 17q53 0 91 -45.5t38 -109.5 t-38 -109t-91 -45q-43 0 -70 15z" />
420 <glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M41 455q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80 t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5l1 -21q75 3 143.5 -20.5 t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14q6 -5 28 -23.5t25.5 -22t19 -18 t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63 t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27zM764 676q10 1 32.5 7t34.5 6q19 0 35 -10l-96 -20zM822 568l48 12l109 -177l-73 -48zM859 884q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1 v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5 t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43zM1061 45h31l10 -83l-41 -12v95zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM1116 29 q21 2 60.5 8.5t72 10t60.5 3.5h14q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13t-54 -9.5t-53.5 -7.5t-32 -4.5zM1947 1528l1 3l2 4l-1 -5zM1950 1535v1v-1zM1950 1535l1 1z" />
421 <glyph unicode="&#xf1a9;" d="M0 520q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5 t19.5 -177.5q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302zM333 256q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5zM685.5 -76q-0.5 -10 7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5 q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16zM852 31q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5 t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10q-29 -12 -78 -56q-26 -24 -12 -44z" />
422 <glyph unicode="&#xf1aa;" d="M0 78q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160l151 -152l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5 t-60 145.5zM2 1202q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5t149.5 -87.5l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5 q-70 15 -115 71t-45 129zM446 803l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126t135.5 51q85 0 145 -60.5t60 -145.5q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152 l-160 -160zM776 793l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5q76 -11 126.5 -68.5t50.5 -134.5q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30 l-152 152z" />
423 <glyph unicode="&#xf1ab;" d="M0 -16v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5q20 0 20 -21v-418l147 -47v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3zM39 15l694 232v1032l-694 -233v-1031zM147 293q6 4 82 92 q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8 t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110 q-4 -2 -19.5 -4t-18.5 0zM268 933l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41zM310 -116q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11q73 -37 159.5 -61.5t157.5 -24.5 q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5l-43 73l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16zM777 1294l573 -184v380zM885 453l102 -31l45 110l211 -65l37 -135l102 -31l-181 657l-100 31z M1071 630l76 185l63 -227z" />
424 <glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M0 -96v1088q0 66 47 113t113 47h128q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113zM512 -96v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-163q58 -34 93 -93t35 -128v-768q0 -106 -75 -181 t-181 -75h-864q-66 0 -113 47t-47 113zM640 896h896v256h-160q-40 0 -68 28t-28 68v160h-640v-512zM736 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM736 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9 h-128q-14 0 -23 -9t-9 -23v-128zM736 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 256q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM992 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 0q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23 v-128zM1248 256q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128zM1248 512q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128z" />
425 <glyph unicode="&#xf1ad;" d="M0 -192v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45zM256 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM256 1184q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 96v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23zM512 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM512 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM512 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 928q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM768 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 160q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64zM1024 416q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 672q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 928q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64zM1024 1184q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64z" />
426 <glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M64 1056q0 40 28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68zM416 1152q0 93 65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5t-65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5z" />
427 <glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M0 724q0 80 42 139.5t119 59.5q76 0 141.5 -55.5t100.5 -134t35 -152.5q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152zM256 19q0 86 56 191.5t139.5 192.5t187.5 146t193 59q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45 t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146zM333 1163q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151zM884 1064 q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5q-61 0 -105 39t-63 92.5t-19 113.5zM1226 581q0 74 35 152.5t100.5 134t141.5 55.5q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5 q-77 0 -119 59t-42 139z" />
428 <glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M64 1008q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5z" />
429 <glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M0 256v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65zM134 1026l698 -254l698 254l-698 254zM896 -93l640 349v636l-640 -233v-752z" />
430 <glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M0 96v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70v-400l434 -186q36 -16 57 -48t21 -70v-416q0 -36 -19 -67t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4 l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67zM172 531l404 -173l404 173l-404 173zM640 -96l384 192v314l-384 -164v-342zM647 1219l441 -189l441 189l-441 189zM1152 651l384 165v266l-384 -164v-267zM1196 531l404 -173l404 173l-404 173zM1664 -96 l384 192v314l-384 -164v-342z" />
431 <glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M0 22v1260h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5 t45.5 113.5q0 144 -190 144h-260v-294zM1137 477q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658q0 -111 57.5 -171.5t166.5 -60.5q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347zM1337 1073h511v124 h-511v-124zM1388 576h408q-18 195 -200 195q-90 0 -146 -52.5t-62 -142.5z" />
432 <glyph unicode="&#xf1b5;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 254h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5t-56.5 60.5t-79 29.5 t-97 8.5h-371v-787zM301 388v217h189q124 0 124 -113q0 -104 -128 -104h-185zM301 723v184h163q119 0 119 -90q0 -94 -106 -94h-176zM838 538q0 -135 79 -217t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20q-68 0 -104 38t-36 107h411q1 10 1 30 q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216zM964 911v77h319v-77h-319zM996 600q4 56 39 89t91 33q113 0 124 -122h-254z" />
433 <glyph unicode="&#xf1b6;" horiz-adv-x="2048" d="M0 764q0 86 61 146.5t146 60.5q73 0 130 -46t73 -117l783 -315q49 29 106 29q14 0 21 -1l173 248q1 114 82 194.5t195 80.5q115 0 196.5 -81t81.5 -196t-81.5 -196.5t-196.5 -81.5l-265 -194q-8 -80 -67.5 -133.5t-138.5 -53.5q-73 0 -130 46t-73 117l-783 315 q-51 -30 -106 -30q-85 0 -146 61t-61 147zM55 764q0 -64 44.5 -108.5t107.5 -44.5q11 0 33 4l-64 26q-33 14 -52.5 44.5t-19.5 66.5q0 50 35.5 85.5t85.5 35.5q20 0 41 -8v1l76 -31q-20 37 -56.5 59t-78.5 22q-63 0 -107.5 -44.5t-44.5 -107.5zM1164 244q19 -37 55.5 -59 t79.5 -22q63 0 107.5 44.5t44.5 107.5t-44.5 108t-107.5 45q-13 0 -33 -4q2 -1 20 -8t21.5 -8.5t18.5 -8.5t19 -10t16 -11t15.5 -13.5t11 -14.5t10 -18t5 -21t2.5 -25q0 -50 -35.5 -85.5t-85.5 -35.5q-14 0 -31.5 4.5t-29 9t-31.5 13.5t-28 12zM1584 767q0 -77 54.5 -131.5 t131.5 -54.5t132 54.5t55 131.5t-55 131.5t-132 54.5q-76 0 -131 -54.5t-55 -131.5zM1623 767q0 62 43.5 105.5t104.5 43.5t105 -44t44 -105t-43.5 -104.5t-105.5 -43.5q-61 0 -104.5 43.5t-43.5 104.5z" />
434 <glyph unicode="&#xf1b7;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM128 693q0 -53 38 -91t92 -38q36 0 66 18l489 -197q10 -44 45.5 -73t81.5 -29q50 0 86.5 34t41.5 83l167 122 q71 0 122 50.5t51 122.5t-51 123t-122 51q-72 0 -122.5 -50.5t-51.5 -121.5l-108 -155q-2 0 -6.5 0.5t-6.5 0.5q-35 0 -67 -19l-489 197q-10 44 -45.5 73t-80.5 29q-54 0 -92 -38t-38 -92zM162 693q0 40 28 68t68 28q27 0 49.5 -14t34.5 -37l-48 19q-29 11 -56.5 -2 t-38.5 -41q-12 -29 -0.5 -57t39.5 -40v-1l40 -16q-14 -2 -20 -2q-40 0 -68 27.5t-28 67.5zM855 369q5 -2 47 -19q29 -12 58 0.5t41 41.5q11 29 -1 57.5t-41 40.5l-40 16q14 2 21 2q39 0 67 -27.5t28 -67.5t-28 -67.5t-67 -27.5q-59 0 -85 51zM1118 695q0 48 34 82t83 34 q48 0 82 -34t34 -82t-34 -82t-82 -34q-49 0 -83 34t-34 82zM1142 696q0 -39 27.5 -66t65.5 -27t65.5 27t27.5 66q0 38 -27.5 65.5t-65.5 27.5t-65.5 -27.5t-27.5 -65.5z" />
435 <glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M16 970l433 -17l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188zM270.5 158q-3.5 28 4 65t12 55t21.5 64t19 53q78 -12 509 -28l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5 q-11 27 -14.5 55zM294 1124l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5t36 -39.5t32 -35q-47 -63 -265 -435l-317 187zM782 1524l405 -1q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190l142 83l-220 -373l-419 20l151 86q-34 89 -75 166 t-75.5 123.5t-64.5 80t-47 46.5zM953 197l211 362l7 -173q170 -16 283 -5t170 33l56 22l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164zM1218 847l313 195l19 11l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22 t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436z" />
436 <glyph unicode="&#xf1b9;" horiz-adv-x="1984" d="M0 160v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h704q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-928v-128q0 -80 -56 -136 t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23zM160 448q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 768h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 448q0 -66 47 -113t113 -47t113 47t47 113 t-47 113t-113 47t-113 -47t-47 -113z" />
437 <glyph unicode="&#xf1ba;" horiz-adv-x="1984" d="M0 32v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h64q98 0 179 -63.5t104 -157.5l105 -419h28q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-128v-64q0 -80 -56 -136t-136 -56 t-136 56t-56 136v64h-928v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23zM160 320q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113zM516 640h952l-89 357q-2 8 -14 17.5t-21 9.5h-704q-9 0 -21 -9.5t-14 -17.5zM1472 320 q0 -66 47 -113t113 -47t113 47t47 113t-47 113t-113 47t-113 -47t-47 -113z" />
438 <glyph unicode="&#xf1bb;" d="M32 64q0 26 19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45t-19 -45t-45 -19 h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45z" />
439 <glyph unicode="&#xf1bc;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM237 886q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37q159 0 309.5 -34t253.5 -95q21 -12 40 -12 q29 0 50.5 20.5t21.5 51.5q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5zM289 637q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5q0 40 -35 61 q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64zM321 406q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52z" />
440 <glyph unicode="&#xf1bd;" d="M0 11v1258q0 58 40.5 98.5t98.5 40.5h1258q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5zM71 11q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258z M121 11v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5zM121 709v560q0 7 5.5 12.5 t12.5 5.5h1258q7 0 12.5 -5.5t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137zM246 413q-24 203 166 305l129 -270l-255 -61q-14 -3 -26 4.5t-14 21.5z" />
441 <glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M0 405l17 128q2 9 9 9t9 -9l20 -128l-20 -126q-2 -9 -9 -9t-9 9zM79 405l23 207q0 9 9 9q8 0 10 -9l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10zM169 405l21 245q2 12 12 12q11 0 11 -12l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11zM259 405l21 252q0 13 13 13 q12 0 14 -13l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13zM350 405l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5zM401 159zM442 405l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5l21 -380l-21 -246q0 -7 -5 -12.5 t-12 -5.5q-16 0 -18 18zM534 403l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19zM628 405l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5l18 -506l-18 -242q-2 -21 -22 -21q-19 0 -21 21zM723 405l14 -241 q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17zM784 164zM817 405l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18zM913 404l12 492q1 12 9 20t19 8t18.5 -8 t8.5 -20l14 -492l-14 -236q0 -11 -8 -19t-19 -8t-19 8t-9 19zM1010 405q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11q11 0 20 9q9 7 9 20l1 24l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6zM1079 169zM1103 404l12 636v3q2 15 12 24q9 7 20 7 q8 0 15 -5q14 -8 16 -26l14 -639l-14 -231q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114zM1204 174v899q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22z" />
442 <glyph unicode="&#xf1c0;" d="M0 0v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 384v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 768 v170q119 -84 325 -127t443 -43t443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128zM0 1152v128q0 69 103 128t280 93.5t385 34.5t385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128z" />
443 <glyph unicode="&#xf1c1;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM257 60q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4 q52 85 107 197q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38 q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83z M714 842q1 7 7 44q0 3 7 43q1 4 4 8q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2q-15 -42 -2 -132zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1098 353q76 -28 124 -28q14 0 18 1q0 1 -2 3q-24 24 -140 24z" />
444 <glyph unicode="&#xf1c2;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM233 661h70l164 -661h159l128 485q7 20 10 46q2 16 2 24 h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21q-2 26 -7 46l-99 438h90v107h-300v-107zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
445 <glyph unicode="&#xf1c3;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM429 0h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4 h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107h-290v-107h68l189 -272l-194 -283h-68v-106zM1024 1024h376 q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
446 <glyph unicode="&#xf1c4;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM416 0h327v106h-93v167h137q76 0 118 15q67 23 106.5 87 t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92v-106zM650 386v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15h-119zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
447 <glyph unicode="&#xf1c5;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 0v192l192 192l128 -128l384 384l320 -320v-320 h-1024zM256 704q0 80 56 136t136 56t136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
448 <glyph unicode="&#xf1c6;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536zM384 192q0 25 8 52q21 63 120 396 v128h128v-128h79q22 0 39 -13t23 -34l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5zM512 192q0 -26 37.5 -45t90.5 -19t90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45zM512 896h128v128h-128v-128zM512 1152h128v128h-128v-128 zM640 768h128v128h-128v-128zM640 1024h128v128h-128v-128zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
449 <glyph unicode="&#xf1c7;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 288v192q0 14 9 23t23 9h131l166 167q16 15 35 7 q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23zM762 206.5q1 -26.5 20 -44.5q20 -17 44 -17q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5z M973.5 54.5q2.5 -26.5 23.5 -42.5q18 -15 40 -15q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
450 <glyph unicode="&#xf1c8;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM256 256v384q0 52 38 90t90 38h384q52 0 90 -38t38 -90 v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90zM960 403v90l265 266q9 9 23 9q4 0 12 -2q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
451 <glyph unicode="&#xf1c9;" d="M0 -160v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68zM128 -128h1280v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536zM254 429q-14 19 0 38l226 301q8 11 21 12.5t24 -6.5 l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5zM636 43l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5l-63 10q-13 2 -20.5 13t-5.5 24zM947.5 181 q-1.5 13 6.5 24l182 243l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5l226 -301q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21zM1024 1024h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376z" />
452 <glyph unicode="&#xf1ca;" d="M39 1286h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132 t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390z" />
453 <glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M0 367v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64v-546q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64zM154 511l193 129l-193 129v-258zM216 367l603 -402v359l-334 223zM216 913l269 -180l334 223v359zM624 640 l272 -182l272 182l-272 182zM973 -35l603 402l-269 180l-334 -223v-359zM973 956l334 -223l269 180l-603 402v-359zM1445 640l193 -129v258z" />
454 <glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M0 407q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5 h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55t121.5 -21 q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5t-85 -189.5z " />
455 <glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM128 640q0 -190 90 -361l194 194q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361zM512 640 q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5zM535 -38q171 -90 361 -90t361 90l-194 194q-82 -28 -167 -28t-167 28zM535 1318l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90t-361 -90z M1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
456 <glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M0 640q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348z" />
457 <glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
458 <glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M0 640q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348zM44 640q0 -173 67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331 t-67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331zM87 640q0 205 98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385zM206 217l58 34q29 -49 73 -99 l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13v-66q-208 6 -385 109.5t-283 275.5zM207 1063q106 172 282 275.5t385 109.5v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98zM415 805q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10 t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162q-67 77 -98 169l232 80q-14 42 -14 85t14 85zM918 -102 q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99l58 -34q-106 -172 -283 -275.5t-385 -109.5v66zM918 1382v66q209 -6 385 -109.5t282 -275.5l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13zM1516 428q36 103 36 212q0 112 -35 212l82 28 q-19 56 -49 112l57 33q98 -180 98 -385t-98 -385l-57 33q27 52 49 112z" />
459 <glyph unicode="&#xf1d2;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 218q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5 t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85q0 -53 41 -77v-3q-113 -37 -113 -139zM382 225q0 64 98 64q102 0 102 -61q0 -66 -93 -66 q-107 0 -107 63zM395 693q0 90 77 90q36 0 55 -25.5t19 -63.5q0 -85 -74 -85q-77 0 -77 84zM755 1072q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392q0 -50 -3 -75z M966 771q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117z" />
460 <glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M68 7q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47q98 0 218 47v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58q0 -31 22.5 -51.5t58 -32 t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5zM272 18q0 -101 172 -101q151 0 151 105q0 100 -165 100q-158 0 -158 -104zM293 775q0 -135 124 -135q119 0 119 137q0 61 -30 102t-89 41 q-124 0 -124 -145zM875 1389q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5t-39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5zM901 220q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134h-222zM1217 901v190h96v76q0 54 -6 89h227q-6 -41 -6 -165 h171v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6z" />
461 <glyph unicode="&#xf1d4;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM368 1135l323 -589v-435h134v436l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3 q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150z" />
462 <glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M57 953q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5t-78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153 t-153 102t-186 38t-186 -38t-153 -102t-102 -153t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265zM113.5 38.5q10.5 121.5 29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5t136.5 -56.5 t56.5 -136.5t-57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5z" />
463 <glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M18 264q0 275 252 466q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5 t3.5 -5t2 -3.5q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9 t-98 20t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20 q-18 -41 -54.5 -74.5t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100z" />
464 <glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M0 858q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490z M380 1075q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5t-25 66t-66 25q-43 0 -76 -25.5t-33 -65.5zM816 404q0 143 81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109q-150 -37 -218 -37 q-169 0 -311 70.5t-223.5 191.5t-81.5 264zM888 1075q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5t-24.5 66t-65.5 25q-43 0 -76 -25.5t-33 -65.5zM1160 568q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5 t-22.5 -49.5zM1559 568q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5z" />
465 <glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M0 508q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55z" />
466 <glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M0 508q-3 39 32 59l1664 960q35 21 68 -2q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55zM209 522l336 -137l863 639l-478 -797l492 -201 l221 1323z" />
467 <glyph unicode="&#xf1da;" d="M0 832v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298t-61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12 q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45zM512 480v64q0 14 9 23t23 9h224v352 q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23z" />
468 <glyph unicode="&#xf1db;" d="M0 640q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5zM128 640q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5z" />
469 <glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M62 1338q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5 t45 -15t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18 q-15 10 -45 12t-53 2t-41 14t-18 45z" />
470 <glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M24 926q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108 q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179q-64 117 -64 259z" />
471 <glyph unicode="&#xf1de;" d="M0 736v64q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM128 -96v672h256v-672q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM128 960v416q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-416h-256zM512 224v64q0 40 28 68 t68 28h320q40 0 68 -28t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM640 64h256v-160q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v160zM640 448v928q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-928h-256zM1024 992v64q0 40 28 68t68 28h320q40 0 68 -28 t28 -68v-64q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68zM1152 -96v928h256v-928q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23zM1152 1216v160q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-160h-256z" />
472 <glyph unicode="&#xf1e0;" d="M0 640q0 133 93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86q133 0 226.5 -93.5t93.5 -226.5 t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5z" />
473 <glyph unicode="&#xf1e1;" d="M0 160v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5zM256 640q0 -88 62.5 -150.5t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5 t150.5 62.5t62.5 150.5t-62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5z" />
474 <glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M0 448q0 143 55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68l243 244l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5 t-225 150t-150 225t-55.5 273.5zM170 615q10 -24 35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49t-34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49zM1376 1472q0 13 9 23q10 9 23 9t23 -9l90 -91q10 -9 10 -22.5t-10 -22.5 q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23zM1536 1408v96q0 14 9 23t23 9t23 -9t9 -23v-96q0 -14 -9 -23t-23 -9t-23 9t-9 23zM1605 1242.5q0 13.5 10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5z M1605 1381.5q0 13.5 10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5zM1632 1312q0 14 9 23t23 9h96q14 0 23 -9t9 -23t-9 -23t-23 -9h-96q-14 0 -23 9t-9 23z" />
475 <glyph unicode="&#xf1e3;" horiz-adv-x="1792" />
476 <glyph unicode="&#xf1e4;" horiz-adv-x="1792" />
477 <glyph unicode="&#xf1e5;" horiz-adv-x="1792" />
478 <glyph unicode="&#xf1e6;" horiz-adv-x="1792" />
479 <glyph unicode="&#xf1e7;" horiz-adv-x="1792" />
480 <glyph unicode="&#xf1e8;" horiz-adv-x="1792" />
481 <glyph unicode="&#xf1e9;" horiz-adv-x="1792" />
482 <glyph unicode="&#xf1ea;" horiz-adv-x="1792" />
483 <glyph unicode="&#xf1eb;" horiz-adv-x="1792" />
484 <glyph unicode="&#xf1ec;" horiz-adv-x="1792" />
485 <glyph unicode="&#xf1ed;" horiz-adv-x="1792" />
486 <glyph unicode="&#xf1ee;" horiz-adv-x="1792" />
487 <glyph unicode="&#xf500;" horiz-adv-x="1792" />
488 <glyph horiz-adv-x="1792" />
489 <glyph horiz-adv-x="1792" />
490 <glyph horiz-adv-x="1792" />
491 <glyph horiz-adv-x="1792" />
492 <glyph horiz-adv-x="1792" />
493 <glyph horiz-adv-x="1792" />
494 <glyph horiz-adv-x="1792" />
495 <glyph horiz-adv-x="1792" />
496 <glyph horiz-adv-x="1792" />
497 <glyph horiz-adv-x="1792" />
498 <glyph horiz-adv-x="1792" />
499 <glyph horiz-adv-x="1792" />
500 <glyph horiz-adv-x="1792" />
501 <glyph horiz-adv-x="1792" />
502 </font>
503 </defs></svg>
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
Binary diff not shown
site/img/tube.png less more
Binary diff not shown
site/img/tube1x.png less more
Binary diff not shown
1717 <p>
1818 No more databases, comment moderation, or pesky updates to install—just <em>your content</em>.
1919 </p>
20 <a href="/docs/usage/" class="">How Jekyll works &rarr;</a>
20 <a href="/docs/usage/">How Jekyll works &rarr;</a>
2121 </div>
2222 <div class="unit one-third">
2323 <h2>Static</h2>
24 <p><a href="http://daringfireball.net/projects/markdown/">Markdown</a> (or <a href="http://textile.sitemonks.com/">Textile</a>), <a href="http://wiki.shopify.com/Liquid">Liquid</a>, HTML <span class="amp">&amp;</span> CSS go in. Static sites come out ready for deployment.</p>
25 <a href="/docs/templates/" class="">Jekyll template guide &rarr;</a>
24 <p><a href="http://daringfireball.net/projects/markdown/">Markdown</a> (or <a href="http://redcloth.org/textile">Textile</a>), <a href="http://wiki.shopify.com/Liquid">Liquid</a>, HTML <span class="amp">&amp;</span> CSS go in. Static sites come out ready for deployment.</p>
25 <a href="/docs/templates/">Jekyll template guide &rarr;</a>
2626 </div>
2727 <div class="unit one-third">
2828 <h2>Blog-aware</h2>
2929 <p>
3030 Permalinks, categories, pages, posts, and custom layouts are all first-class citizens here.
3131 </p>
32 <a href="/docs/migrations/" class="">Migrate your blog &rarr;</a>
32 <a href="/docs/migrations/">Migrate your blog &rarr;</a>
3333 </div>
3434 <div class="clear"></div>
3535 </div>
7575 <div class="unit whole">
7676 <div class="grid pane">
7777 <div class="unit whole center-on-mobiles">
78 <img src="img/octojekyll.png" alt="Free Jekyll hosting on GitHub Pages">
78 <img src="img/octojekyll.png" width="300" height="251" alt="Free Jekyll hosting on GitHub Pages">
7979 <div class="pane-content">
8080 <h2 class="center-on-mobiles"><strong>Free hosting</strong> with GitHub Pages</h2>
8181 <p>Sick of dealing with hosting companies? <a href="http://pages.github.com/">GitHub Pages</a> are <em>powered by Jekyll</em>, so you can easily deploy your site using GitHub for free&mdash;<a href="https://help.github.com/articles/setting-up-a-custom-domain-with-pages">custom domain name</a> and&nbsp;all.</p>
82 <a href="http://pages.github.com/" class="">Learn more about GitHub Pages &rarr;</a>
82 <a href="http://pages.github.com/">Learn more about GitHub Pages &rarr;</a>
8383 </div>
8484 </div>
8585 <div class="clear"></div>
0 if RUBY_VERSION > '1.9'
1 require 'simplecov'
2 require 'simplecov-gem-adapter'
3 SimpleCov.start('gem')
4
5 require 'coveralls'
6 Coveralls.wear_merged!
7 end
0 require 'simplecov'
1 require 'simplecov-gem-adapter'
2 SimpleCov.start('gem')
83
94 require 'rubygems'
105 require 'test/unit'
1813 require 'kramdown'
1914 require 'redcarpet'
2015
21 require 'redgreen' if RUBY_VERSION < '1.9'
2216 require 'shoulda'
2317 require 'rr'
2418
2923
3024 class Test::Unit::TestCase
3125 include RR::Adapters::TestUnit
26
27 def build_configs(overrides, base_hash = Jekyll::Configuration::DEFAULTS)
28 Utils.deep_merge_hashes(base_hash, overrides)
29 end
30
31 def site_configuration(overrides = {})
32 build_configs({
33 "source" => source_dir,
34 "destination" => dest_dir
35 }, build_configs(overrides))
36 end
3237
3338 def dest_dir(*subdirs)
3439 test_dir('dest', *subdirs)
6166 ensure
6267 $stdout = $old_stdout
6368 end
69
70 def capture_stderr
71 $old_stderr = $stderr
72 $stderr = StringIO.new
73 yield
74 $stderr.rewind
75 return $stderr.string
76 ensure
77 $stderr = $old_stderr
78 end
6479 end
0 ---
1 layout: default
2 title : Page name with non-alphabetic character
3 ---
4 Line 1
5 {{ page.title }}
00 ---
11 layout: default
22 title : Page inside +
3 permalink: plus+in+url
3 permalink: /+/plus+in+url
44 ---
55 Line 1
66 {{ page.title }}
0 name: Dairy
1 products:
2 - name: cheese
3 price: 5.3
4 - name: milk
5 price: 2.5
0 [
1 {
2 "name": "Jack",
3 "age": 27,
4 "blog": "http://example.com/jack"
5 },
6 {
7 "name": "John",
8 "age": 32,
9 "blog": "http://example.com/john"
10 }
11 ]
0 ---
1 categories: foo bar baz
2 foo: bar
3 layout: default
4 tags: ay bee cee
5 title: Properties Draft
6 ---
7
8 All the properties.
9
10 Plus an excerpt.
0 --
0 ---
11 Tom Preston-Werner
2 github.com/mojombo
2 github.com/mojombo
0 ---
1 title: The unreadable wonder
2 ---
3
4 Don't read me, you fool! FILTER ME
0 ---
1 title: "Jekyll.configuration"
2 whatever: foo.bar
3 ---
4
5 Use `{{ page.title }}` to build a full configuration for use w/Jekyll.
6
7 Whatever: {{ page.whatever }}
0 ---
1 title: "Jekyll.sanitized_path"
2 ---
3
4 `{{ page.title }}` is used to make sure your path is in your source.
0 ---
1 title: Don't Include Me Either
2 ---
3
4 Don't include me either. FILTER ME PLZ
0 ---
1 title: "Site#generate"
2 layout: default
3 ---
4
5 Run your generators! {{ page.layout }}
0 ---
1 ---
2
3 Page without title.
0 ---
1 title: "Site#generate"
2 layout: default
3 ---
4
5 Run your generators! {{ page.layout }}
0 ---
1 layout: default
2 title: Category in YAML
3 ---
4
5 Best *post* ever
11 date: 2011-04-12 13:07:09
22 ---
33
4 under default configuration, this post should get processed by the identity converter. By changing
4 under default configuration, this post should get processed by the identity converter. By changing
55 textile extension or markdown extension configuration parameters, you should be able to associate
66 it with either of those converters
0 ---
1 title: Post
2 layout: post
3 include1: include.html
4 include2: include
5 include3: INCLUDE
6 include4: params
7 ---
8
9 Liquid tests
10 - 1 {% include {{ page.include1 }} %}
11 - 2 {% include {{ page.include2 | append: '.html' }} %}
12 - 3 {% include {{ page.include3 | downcase | append: '.html' }} %}
13
14 Whitespace tests
15 - 4 {% include {{page.include1}} %}
16 - 5 {% include {{ page.include1}} %}
17 - 6 {% include {{ page.include3 | downcase | append: '.html'}} %}
18
19 Parameters test
20 - 7 {% include {{ page.include4 | append: '.html' }} var1='foo' var2='bar' %}
0 ---
1 categories: foo bar baz
2 foo: bar
3 layout: default
4 tags: ay bee cee
5 title: Properties Post
6 ---
7
8 All the properties.
9
10 Plus an excerpt.
0 ---
1 title: Test Post Where YAML Ends in Dots
2 ...
3
4 # Test
0 ---
1 layout: default
2 title: Plus space percent
3 ---
4
5 Signs are nice
0 .half { width: 50%; }
0 ---
1 title: Example slide
2 layout: slide
3 ---
0 ---
1 title: Override title
2 layout: slide
3 nested:
4 test1: override1
5 test2: override2
6 ---
0 ---
1 title: Override permalink
2 layout: slide
3 permalink: /slide/3/
4 ---
0 ---
1 title: v2.4.0
2 ---
3
4 v2.4.0
0 ---
1 ---
2
3 @import "grid";
0 ---
1 title: I'm a Jekyll environment exchequer
2 ---
3
4 {{ jekyll.environment }}
0 ---
1 ---
2
3 $ ->
4 list = [1, 2, 3, 4, 5]
5 square = (x) -> x * x
6 cube = (x) -> square(x) * x
7 cubes = (math.cube num for num in list)
8
9 alert "I knew it!" if elvis?
0 -----BEGIN PGP PUBLIC KEY BLOCK-----
1 Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
0 ---
1 foo: bar
2 layout: default
3 permalink: /properties/
4 title: Properties Page
5 ---
6
7 All the properties.
0 ---
1 ---
2 {% for file in site.static_files %}
3 - {{ file.path }} last edited at {{ file.modified_time }} with extname {{ file.extname }}{% endfor %}
0 ---
1 layout: default
2 title: Not published!
3 published: false
4 ---
5
6 This should *not* be published!
0 require 'helper'
1
2 class TestCleaner < Test::Unit::TestCase
3 context "directory in keep_files" do
4 setup do
5 clear_dest
6 stub(Jekyll).configuration do
7 Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
8 end
9
10 FileUtils.mkdir_p(dest_dir('to_keep/child_dir'))
11 FileUtils.touch(File.join(dest_dir('to_keep'), 'index.html'))
12 FileUtils.touch(File.join(dest_dir('to_keep/child_dir'), 'index.html'))
13
14 @site = Site.new(Jekyll.configuration)
15 @site.keep_files = ['to_keep/child_dir']
16
17 @cleaner = Site::Cleaner.new(@site)
18 @cleaner.cleanup!
19 end
20
21 teardown do
22 FileUtils.rm_rf(dest_dir('to_keep'))
23 end
24
25 should "keep the parent directory" do
26 assert File.exist?(dest_dir('to_keep'))
27 end
28
29 should "keep the child directory" do
30 assert File.exist?(dest_dir('to_keep/child_dir'))
31 end
32
33 should "keep the file in the directory in keep_files" do
34 assert File.exist?(File.join(dest_dir('to_keep/child_dir'), 'index.html'))
35 end
36
37 should "delete the file in the directory not in keep_files" do
38 assert !File.exist?(File.join(dest_dir('to_keep'), 'index.html'))
39 end
40 end
41
42 context "directory containing no files and non-empty directories" do
43 setup do
44 clear_dest
45 stub(Jekyll).configuration do
46 Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
47 end
48
49 FileUtils.mkdir_p(source_dir('no_files_inside/child_dir'))
50 FileUtils.touch(File.join(source_dir('no_files_inside/child_dir'), 'index.html'))
51
52 @site = Site.new(Jekyll.configuration)
53 @site.process
54
55 @cleaner = Site::Cleaner.new(@site)
56 @cleaner.cleanup!
57 end
58
59 teardown do
60 FileUtils.rm_rf(source_dir('no_files_inside'))
61 FileUtils.rm_rf(dest_dir('no_files_inside'))
62 end
63
64 should "keep the parent directory" do
65 assert File.exist?(dest_dir('no_files_inside'))
66 end
67
68 should "keep the child directory" do
69 assert File.exist?(dest_dir('no_files_inside/child_dir'))
70 end
71
72 should "keep the file" do
73 assert File.exist?(File.join(dest_dir('no_files_inside/child_dir'), 'index.html'))
74 end
75 end
76 end
0 require 'helper'
1
2 class TestCoffeeScript < Test::Unit::TestCase
3 context "converting CoffeeScript" do
4 setup do
5 @site = Jekyll::Site.new(Jekyll.configuration({
6 "source" => source_dir,
7 "destination" => dest_dir
8 }))
9 @site.process
10 @test_coffeescript_file = dest_dir("js/coffeescript.js")
11 @js_output = <<-JS
12 (function() {
13 $(function() {
14 var cube, cubes, list, num, square;
15 list = [1, 2, 3, 4, 5];
16 square = function(x) {
17 return x * x;
18 };
19 cube = function(x) {
20 return square(x) * x;
21 };
22 cubes = (function() {
23 var _i, _len, _results;
24 _results = [];
25 for (_i = 0, _len = list.length; _i < _len; _i++) {
26 num = list[_i];
27 _results.push(math.cube(num));
28 }
29 return _results;
30 })();
31 if (typeof elvis !== \"undefined\" && elvis !== null) {
32 return alert(\"I knew it!\");
33 }
34 });
35
36 }).call(this);
37 JS
38 end
39
40 should "write a JS file in place" do
41 assert File.exist?(@test_coffeescript_file), "Can't find the converted CoffeeScript file in the dest_dir."
42 end
43
44 should "produce JS" do
45 assert_equal @js_output, File.read(@test_coffeescript_file)
46 end
47 end
48 end
0 require 'helper'
1
2 class TestCollections < Test::Unit::TestCase
3
4 def fixture_site(overrides = {})
5 Jekyll::Site.new(Jekyll.configuration(
6 overrides.merge({
7 "source" => source_dir,
8 "destination" => dest_dir
9 })
10 ))
11 end
12
13 context "an evil collection" do
14 setup do
15 @collection = Jekyll::Collection.new(fixture_site, "../../etc/password")
16 end
17
18 should "sanitize the label name" do
19 assert_equal @collection.label, "....etcpassword"
20 end
21
22 should "have a sanitized relative path name" do
23 assert_equal @collection.relative_directory, "_....etcpassword"
24 end
25
26 should "have a sanitized full path" do
27 assert_equal @collection.directory, source_dir("_....etcpassword")
28 end
29 end
30
31 context "a simple collection" do
32 setup do
33 @collection = Jekyll::Collection.new(fixture_site, "methods")
34 end
35
36 should "sanitize the label name" do
37 assert_equal @collection.label, "methods"
38 end
39
40 should "have default url template" do
41 assert_equal @collection.url_template, "/:collection/:path:output_ext"
42 end
43
44 should "contain no docs when initialized" do
45 assert_empty @collection.docs
46 end
47
48 should "know its relative directory" do
49 assert_equal @collection.relative_directory, "_methods"
50 end
51
52 should "know the full path to itself on the filesystem" do
53 assert_equal @collection.directory, source_dir("_methods")
54 end
55
56 context "when turned into Liquid" do
57 should "have a label attribute" do
58 assert_equal @collection.to_liquid["label"], "methods"
59 end
60
61 should "have a docs attribute" do
62 assert_equal @collection.to_liquid["docs"], Array.new
63 end
64
65 should "have a directory attribute" do
66 assert_equal @collection.to_liquid["directory"], source_dir("_methods")
67 end
68
69 should "have a relative_directory attribute" do
70 assert_equal @collection.to_liquid["relative_directory"], "_methods"
71 end
72
73 should "have a output attribute" do
74 assert_equal @collection.to_liquid["output"], false
75 end
76 end
77
78 should "know whether it should be written or not" do
79 assert_equal @collection.write?, false
80 @collection.metadata['output'] = true
81 assert_equal @collection.write?, true
82 @collection.metadata.delete 'output'
83 end
84 end
85
86 context "with no collections specified" do
87 setup do
88 @site = fixture_site
89 @site.process
90 end
91
92 should "not contain any collections" do
93 assert_equal Hash.new, @site.collections
94 end
95 end
96
97 context "a collection with permalink" do
98 setup do
99 @site = fixture_site({
100 "collections" => {
101 "methods" => {
102 "permalink" => "/awesome/:path/"
103 }
104 }
105 })
106 @site.process
107 @collection = @site.collections["methods"]
108 end
109
110 should "have custom url template" do
111 assert_equal @collection.url_template, "/awesome/:path/"
112 end
113 end
114
115 context "with a collection" do
116 setup do
117 @site = fixture_site({
118 "collections" => ["methods"]
119 })
120 @site.process
121 @collection = @site.collections["methods"]
122 end
123
124 should "create a Hash on Site with the label mapped to the instance of the Collection" do
125 assert @site.collections.is_a?(Hash)
126 assert_not_nil @site.collections["methods"]
127 assert @site.collections["methods"].is_a? Jekyll::Collection
128 end
129
130 should "collects docs in an array on the Collection object" do
131 assert @site.collections["methods"].docs.is_a? Array
132 @site.collections["methods"].docs.each do |doc|
133 assert doc.is_a? Jekyll::Document
134 assert_include %w[
135 _methods/configuration.md
136 _methods/sanitized_path.md
137 _methods/site/generate.md
138 _methods/site/initialize.md
139 _methods/um_hi.md
140 ], doc.relative_path
141 end
142 end
143
144 should "not include files which start with an underscore in the base collection directory" do
145 assert_not_include @collection.filtered_entries, "_do_not_read_me.md"
146 end
147
148 should "not include files which start with an underscore in a subdirectory" do
149 assert_not_include @collection.filtered_entries, "site/_dont_include_me_either.md"
150 end
151
152 should "not include the underscored files in the list of docs" do
153 assert_not_include @collection.docs.map(&:relative_path), "_methods/_do_not_read_me.md"
154 assert_not_include @collection.docs.map(&:relative_path), "_methods/site/_dont_include_me_either.md"
155 end
156 end
157
158 context "with a collection with metadata" do
159 setup do
160 @site = fixture_site({
161 "collections" => {
162 "methods" => {
163 "foo" => "bar",
164 "baz" => "whoo"
165 }
166 }
167 })
168 @site.process
169 @collection = @site.collections["methods"]
170 end
171
172 should "extract the configuration collection information as metadata" do
173 assert_equal @collection.metadata, {"foo" => "bar", "baz" => "whoo"}
174 end
175 end
176
177 context "in safe mode" do
178 setup do
179 @site = fixture_site({
180 "collections" => ["methods"],
181 "safe" => true
182 })
183 @site.process
184 @collection = @site.collections["methods"]
185 end
186
187 should "not allow symlinks" do
188 assert_not_include @collection.filtered_entries, "um_hi.md"
189 end
190
191 should "not include the symlinked file in the list of docs" do
192 assert_not_include @collection.docs.map(&:relative_path), "_methods/um_hi.md"
193 end
194 end
195
196 context "with dots in the filenames" do
197 setup do
198 @site = fixture_site({
199 "collections" => ["with.dots"],
200 "safe" => true
201 })
202 @site.process
203 @collection = @site.collections["with.dots"]
204 end
205
206 should "exist" do
207 assert_not_nil @collection
208 end
209
210 should "contain one document" do
211 assert_equal 2, @collection.docs.size
212 end
213
214 should "allow dots in the filename" do
215 assert_equal "_with.dots", @collection.relative_directory
216 end
217
218 should "read document in subfolders with dots" do
219 assert @collection.docs.any? { |d| d.path.include?("all.dots") }
220 end
221 end
222
223 end
00 require 'helper'
11
22 class TestCommand < Test::Unit::TestCase
3 context "when calling .globs" do
4 context "when non-default dest & source dirs" do
5 setup do
6 @source = source_dir
7 @dest = dest_dir
8 directory_with_contents(@dest)
9 @globs = Command.globs(@source, @dest)
10 end
11 should "return an array without the destination dir" do
12 assert @globs.is_a?(Array)
13 assert !@globs.include?(@dest)
14 end
15 teardown do
16 clear_dest
3 context "when calling .ignore_paths" do
4 context "when source is absolute" do
5 setup { @source = source_dir }
6 should "return an array with regex for destination" do
7 absolute = source_dir('dest')
8 relative = Pathname.new(source_dir('dest')).relative_path_from(Pathname.new('.').expand_path).to_s
9 [absolute, relative].each do |dest|
10 config = build_configs("source" => @source, "destination" => dest)
11 assert Command.ignore_paths(config).include?(/dest/), "failed with destination: #{dest}"
12 end
1713 end
1814 end
19 context "when using default dest dir" do
20 setup do
21 @source = test_dir
22 @dest = test_dir('_site')
23 directory_with_contents(@dest)
24 @globs = Command.globs(@source, @dest)
25 end
26 should "return an array without the destination dir" do
27 assert @globs.is_a?(Array)
28 assert !@globs.include?(@dest)
29 @globs.each do |glob|
30 assert !glob.include?(File.basename(@dest))
15 context "when source is relative" do
16 setup { @source = Pathname.new(source_dir).relative_path_from(Pathname.new('.').expand_path).to_s }
17 should "return an array with regex for destination" do
18 absolute = source_dir('dest')
19 relative = Pathname.new(source_dir('dest')).relative_path_from(Pathname.new('.').expand_path).to_s
20 [absolute, relative].each do |dest|
21 config = build_configs("source" => @source, "destination" => dest)
22 assert Command.ignore_paths(config).include?(/dest/), "failed with destination: #{dest}"
3123 end
3224 end
33 teardown do
34 FileUtils.rm_r(@dest)
25 end
26 context "multiple config files" do
27 should "return an array with regex for config files" do
28 config = build_configs("config"=> ["_config.yaml", "_config2.yml"])
29 ignore_paths = Command.ignore_paths(config)
30 assert ignore_paths.include?(/_config\.yaml/), 'did not include _config.yaml'
31 assert ignore_paths.include?(/_config2\.yml/), 'did not include _config2.yml'
32 end
33 end
34 end
35 context "when calling .add_build_options" do
36 should "add common options" do
37 cmd = Object.new
38 mock(cmd).option.with_any_args.at_least(1)
39 Command.add_build_options(cmd)
40 end
41 end
42 context "when calling .process_site" do
43 context "when fatal error occurs" do
44 should "exit with non-zero error code" do
45 site = Object.new
46 stub(site).process { raise Jekyll::Errors::FatalException }
47 error = assert_raise(SystemExit) { Command.process_site(site) }
48 assert_not_equal 0, error.status
3549 end
3650 end
3751 end
33 context "#stringify_keys" do
44 setup do
55 @mixed_keys = Configuration[{
6 'markdown' => 'maruku',
6 'markdown' => 'kramdown',
77 :permalink => 'date',
88 'baseurl' => '/',
99 :include => ['.htaccess'],
1010 :source => './'
1111 }]
1212 @string_keys = Configuration[{
13 'markdown' => 'maruku',
13 'markdown' => 'kramdown',
1414 'permalink' => 'date',
1515 'baseurl' => '/',
1616 'include' => ['.htaccess'],
3838 assert @config.config_files(@multiple_files).is_a?(Array)
3939 end
4040 should "return the default config path if no config files are specified" do
41 assert_equal [File.join(source_dir, "_config.yml")], @config.config_files(@no_override)
41 assert_equal [source_dir("_config.yml")], @config.config_files(@no_override)
42 end
43 should "return .yaml if it exists but .yml does not" do
44 mock(File).exists?(source_dir("_config.yml")) { false }
45 mock(File).exists?(source_dir("_config.yaml")) { true }
46 assert_equal [source_dir("_config.yaml")], @config.config_files(@no_override)
47 end
48 should "return .yml if both .yml and .yaml exist" do
49 mock(File).exists?(source_dir("_config.yml")) { true }
50 assert_equal [source_dir("_config.yml")], @config.config_files(@no_override)
4251 end
4352 should "return the config if given one config file" do
4453 assert_equal %w[config.yml], @config.config_files(@one_config_file)
5059 context "#backwards_compatibilize" do
5160 setup do
5261 @config = Configuration[{
53 "auto" => true,
54 "watch" => true,
55 "server" => true,
56 "exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown",
57 "include" => "STOP_THE_PRESSES.txt,.heloses, .git"
62 "auto" => true,
63 "watch" => true,
64 "server" => true,
65 "exclude" => "READ-ME.md, Gemfile,CONTRIBUTING.hello.markdown",
66 "include" => "STOP_THE_PRESSES.txt,.heloses, .git",
67 "pygments" => true,
5868 }]
5969 end
6070 should "unset 'auto' and 'watch'" do
7787 assert @config.backwards_compatibilize.has_key?("include")
7888 assert_equal @config.backwards_compatibilize["include"], %w[STOP_THE_PRESSES.txt .heloses .git]
7989 end
90 should "set highlighter to pygments" do
91 assert @config.has_key?("pygments")
92 assert !@config.backwards_compatibilize.has_key?("pygments")
93 assert_equal @config.backwards_compatibilize["highlighter"], "pygments"
94 end
8095 end
8196 context "#fix_common_issues" do
8297 setup do
99114 end
100115
101116 should "fire warning with no _config.yml" do
102 mock(YAML).safe_load_file(@path) { raise SystemCallError, "No such file or directory - #{@path}" }
117 mock(SafeYAML).load_file(@path) { raise SystemCallError, "No such file or directory - #{@path}" }
103118 mock($stderr).puts("Configuration file: none".yellow)
104119 assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
105120 end
106121
107122 should "load configuration as hash" do
108 mock(YAML).safe_load_file(@path) { Hash.new }
123 mock(SafeYAML).load_file(@path) { Hash.new }
109124 mock($stdout).puts("Configuration file: #{@path}")
110125 assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
111126 end
112127
113128 should "fire warning with bad config" do
114 mock(YAML).safe_load_file(@path) { Array.new }
129 mock(SafeYAML).load_file(@path) { Array.new }
115130 mock($stderr).puts(("WARNING: ".rjust(20) + "Error reading configuration. Using defaults (and options).").yellow)
116131 mock($stderr).puts("Configuration file: (INVALID) #{@path}".yellow)
117132 assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
118133 end
119134
120135 should "fire warning when user-specified config file isn't there" do
121 mock(YAML).safe_load_file(@user_config) { raise SystemCallError, "No such file or directory - #{@user_config}" }
136 mock(SafeYAML).load_file(@user_config) { raise SystemCallError, "No such file or directory - #{@user_config}" }
122137 mock($stderr).puts(("Fatal: ".rjust(20) + "The configuration file '#{@user_config}' could not be found.").red)
123138 assert_raises LoadError do
124139 Jekyll.configuration({'config' => [@user_config]})
125140 end
141 end
142
143 should "not clobber YAML.load to the dismay of other libraries" do
144 assert_equal :foo, YAML.load(':foo')
145 # as opposed to: assert_equal ':foo', SafeYAML.load(':foo')
126146 end
127147 end
128148 context "loading config from external file" do
136156 end
137157
138158 should "load default config if no config_file is set" do
139 mock(YAML).safe_load_file(@paths[:default]) { Hash.new }
159 mock(SafeYAML).load_file(@paths[:default]) { Hash.new }
140160 mock($stdout).puts("Configuration file: #{@paths[:default]}")
141161 assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({})
142162 end
143163
144164 should "load different config if specified" do
145 mock(YAML).safe_load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} }
165 mock(SafeYAML).load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} }
146166 mock($stdout).puts("Configuration file: #{@paths[:other]}")
147 assert_equal Jekyll::Configuration::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] })
167 assert_equal Utils.deep_merge_hashes(Jekyll::Configuration::DEFAULTS, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => @paths[:other] })
148168 end
149169
150170 should "load default config if path passed is empty" do
151 mock(YAML).safe_load_file(@paths[:default]) { Hash.new }
171 mock(SafeYAML).load_file(@paths[:default]) { Hash.new }
152172 mock($stdout).puts("Configuration file: #{@paths[:default]}")
153173 assert_equal Jekyll::Configuration::DEFAULTS, Jekyll.configuration({ "config" => @paths[:empty] })
154174 end
155175
156176 should "successfully load a TOML file" do
157 Jekyll.logger.log_level = Jekyll::Stevenson::WARN
177 Jekyll.logger.log_level = :warn
158178 assert_equal Jekyll::Configuration::DEFAULTS.merge({ "baseurl" => "/you-beautiful-blog-you", "title" => "My magnificent site, wut" }), Jekyll.configuration({ "config" => [@paths[:toml]] })
159 Jekyll.logger.log_level = Jekyll::Stevenson::INFO
179 Jekyll.logger.log_level = :info
160180 end
161181
162182 should "load multiple config files" do
163 mock(YAML).safe_load_file(@paths[:default]) { Hash.new }
164 mock(YAML).safe_load_file(@paths[:other]) { Hash.new }
183 mock(SafeYAML).load_file(@paths[:default]) { Hash.new }
184 mock(SafeYAML).load_file(@paths[:other]) { Hash.new }
165185 mock(TOML).load_file(@paths[:toml]) { Hash.new }
166186 mock($stdout).puts("Configuration file: #{@paths[:default]}")
167187 mock($stdout).puts("Configuration file: #{@paths[:other]}")
170190 end
171191
172192 should "load multiple config files and last config should win" do
173 mock(YAML).safe_load_file(@paths[:default]) { {"baseurl" => "http://example.dev"} }
174 mock(YAML).safe_load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} }
193 mock(SafeYAML).load_file(@paths[:default]) { {"baseurl" => "http://example.dev"} }
194 mock(SafeYAML).load_file(@paths[:other]) { {"baseurl" => "http://wahoo.dev"} }
175195 mock($stdout).puts("Configuration file: #{@paths[:default]}")
176196 mock($stdout).puts("Configuration file: #{@paths[:other]}")
177 assert_equal Jekyll::Configuration::DEFAULTS.deep_merge({ "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] })
197 assert_equal Utils.deep_merge_hashes(Jekyll::Configuration::DEFAULTS, { "baseurl" => "http://wahoo.dev" }), Jekyll.configuration({ "config" => [@paths[:default], @paths[:other]] })
178198 end
179199 end
180200 end
2020
2121 should "not parse if there is syntax error in front-matter" do
2222 name = 'broken_front_matter2.erb'
23 out = capture_stdout do
23 out = capture_stderr do
2424 ret = @convertible.read_yaml(@base, name)
2525 assert_equal({}, ret)
2626 end
2929 end
3030
3131 should "not allow ruby objects in yaml" do
32 out = capture_stdout do
32 out = capture_stderr do
3333 @convertible.read_yaml(@base, 'exploit_front_matter.erb')
3434 end
3535 assert_no_match /undefined class\/module DoesNotExist/, out
3636 end
3737
38 if RUBY_VERSION >= '1.9.2'
39 should "not parse if there is encoding error in file" do
40 name = 'broken_front_matter3.erb'
41 out = capture_stdout do
42 ret = @convertible.read_yaml(@base, name, :encoding => 'utf-8')
43 assert_equal({}, ret)
44 end
45 assert_match(/invalid byte sequence in UTF-8/, out)
46 assert_match(/#{File.join(@base, name)}/, out)
38 should "not parse if there is encoding error in file" do
39 name = 'broken_front_matter3.erb'
40 out = capture_stderr do
41 ret = @convertible.read_yaml(@base, name, :encoding => 'utf-8')
42 assert_equal({}, ret)
4743 end
44 assert_match(/invalid byte sequence in UTF-8/, out)
45 assert_match(/#{File.join(@base, name)}/, out)
4846 end
4947 end
5048 end
+0
-88
test/test_core_ext.rb less more
0 require 'helper'
1
2 class TestCoreExt < Test::Unit::TestCase
3 context "hash" do
4
5 context "pluralized_array" do
6
7 should "return empty array with no values" do
8 data = {}
9 assert_equal [], data.pluralized_array('tag', 'tags')
10 end
11
12 should "return empty array with no matching values" do
13 data = { 'foo' => 'bar' }
14 assert_equal [], data.pluralized_array('tag', 'tags')
15 end
16
17 should "return empty array with matching nil singular" do
18 data = { 'foo' => 'bar', 'tag' => nil, 'tags' => ['dog', 'cat'] }
19 assert_equal [], data.pluralized_array('tag', 'tags')
20 end
21
22 should "return single value array with matching singular" do
23 data = { 'foo' => 'bar', 'tag' => 'dog', 'tags' => ['dog', 'cat'] }
24 assert_equal ['dog'], data.pluralized_array('tag', 'tags')
25 end
26
27 should "return single value array with matching singular with spaces" do
28 data = { 'foo' => 'bar', 'tag' => 'dog cat', 'tags' => ['dog', 'cat'] }
29 assert_equal ['dog cat'], data.pluralized_array('tag', 'tags')
30 end
31
32 should "return empty array with matching nil plural" do
33 data = { 'foo' => 'bar', 'tags' => nil }
34 assert_equal [], data.pluralized_array('tag', 'tags')
35 end
36
37 should "return empty array with matching empty array" do
38 data = { 'foo' => 'bar', 'tags' => [] }
39 assert_equal [], data.pluralized_array('tag', 'tags')
40 end
41
42 should "return single value array with matching plural with single string value" do
43 data = { 'foo' => 'bar', 'tags' => 'dog' }
44 assert_equal ['dog'], data.pluralized_array('tag', 'tags')
45 end
46
47 should "return multiple value array with matching plural with single string value with spaces" do
48 data = { 'foo' => 'bar', 'tags' => 'dog cat' }
49 assert_equal ['dog', 'cat'], data.pluralized_array('tag', 'tags')
50 end
51
52 should "return single value array with matching plural with single value array" do
53 data = { 'foo' => 'bar', 'tags' => ['dog'] }
54 assert_equal ['dog'], data.pluralized_array('tag', 'tags')
55 end
56
57 should "return multiple value array with matching plural with multiple value array" do
58 data = { 'foo' => 'bar', 'tags' => ['dog', 'cat'] }
59 assert_equal ['dog', 'cat'], data.pluralized_array('tag', 'tags')
60 end
61
62 end
63
64 end
65
66 context "enumerable" do
67 context "glob_include?" do
68 should "return false with no glob patterns" do
69 assert ![].glob_include?("a.txt")
70 end
71
72 should "return false with all not match path" do
73 data = ["a*", "b?"]
74 assert !data.glob_include?("ca.txt")
75 assert !data.glob_include?("ba.txt")
76 end
77
78 should "return true with match path" do
79 data = ["a*", "b?", "**/a*"]
80 assert data.glob_include?("a.txt")
81 assert data.glob_include?("ba")
82 assert data.glob_include?("c/a/a.txt")
83 assert data.glob_include?("c/a/b/a.txt")
84 end
85 end
86 end
87 end
0 require 'helper'
1
2 class TestDocument < Test::Unit::TestCase
3
4 context "a document in a collection" do
5 setup do
6 @site = Site.new(Jekyll.configuration({
7 "collections" => ["methods"],
8 "source" => source_dir,
9 "destination" => dest_dir
10 }))
11 @site.process
12 @document = @site.collections["methods"].docs.first
13 end
14
15 should "know its relative path" do
16 assert_equal "_methods/configuration.md", @document.relative_path
17 end
18
19 should "knows its extname" do
20 assert_equal ".md", @document.extname
21 end
22
23 should "know its basename" do
24 assert_equal "configuration.md", @document.basename
25 end
26
27 should "allow the suffix to be specified for the basename" do
28 assert_equal "configuration", @document.basename(".*")
29 end
30
31 should "know whether its a yaml file" do
32 assert_equal false, @document.yaml_file?
33 end
34
35 should "know its data" do
36 assert_equal({
37 "title" => "Jekyll.configuration",
38 "whatever" => "foo.bar"
39 }, @document.data)
40 end
41
42 should "output the collection name in the #to_liquid method" do
43 assert_equal @document.to_liquid['collection'], "methods"
44 end
45
46 end
47
48 context "a document as part of a collection with frontmatter defaults" do
49 setup do
50 @site = Site.new(Jekyll.configuration({
51 "collections" => ["slides"],
52 "source" => source_dir,
53 "destination" => dest_dir,
54 "defaults" => [{
55 "scope"=> {"path"=>"", "type"=>"slides"},
56 "values"=> {
57 "nested"=> {
58 "key"=>"myval",
59 }
60 }
61 }]
62 }))
63 @site.process
64 @document = @site.collections["slides"].docs.first
65 end
66
67 should "know the frontmatter defaults" do
68 assert_equal({
69 "title"=>"Example slide",
70 "layout"=>"slide",
71 "nested"=> {
72 "key"=>"myval"
73 }
74 }, @document.data)
75 end
76 end
77
78 context "a document as part of a collection with overriden default values" do
79 setup do
80 @site = Site.new(Jekyll.configuration({
81 "collections" => ["slides"],
82 "source" => source_dir,
83 "destination" => dest_dir,
84 "defaults" => [{
85 "scope"=> {"path"=>"", "type"=>"slides"},
86 "values"=> {
87 "nested"=> {
88 "test1"=>"default1",
89 "test2"=>"default1"
90 }
91 }
92 }]
93 }))
94 @site.process
95 @document = @site.collections["slides"].docs[1]
96 end
97
98 should "override default values in the document frontmatter" do
99 assert_equal({
100 "title"=>"Override title",
101 "layout"=>"slide",
102 "nested"=> {
103 "test1"=>"override1",
104 "test2"=>"override2"
105 }
106 }, @document.data)
107 end
108 end
109
110 context "a document as part of a collection with valid path" do
111 setup do
112 @site = Site.new(Jekyll.configuration({
113 "collections" => ["slides"],
114 "source" => source_dir,
115 "destination" => dest_dir,
116 "defaults" => [{
117 "scope"=> {"path"=>"slides", "type"=>"slides"},
118 "values"=> {
119 "nested"=> {
120 "key"=>"value123",
121 }
122 }
123 }]
124 }))
125 @site.process
126 @document = @site.collections["slides"].docs.first
127 end
128
129 should "know the frontmatter defaults" do
130 assert_equal({
131 "title"=>"Example slide",
132 "layout"=>"slide",
133 "nested"=> {
134 "key"=>"value123"
135 }
136 }, @document.data)
137 end
138 end
139
140 context "a document as part of a collection with invalid path" do
141 setup do
142 @site = Site.new(Jekyll.configuration({
143 "collections" => ["slides"],
144 "source" => source_dir,
145 "destination" => dest_dir,
146 "defaults" => [{
147 "scope"=> {"path"=>"somepath", "type"=>"slides"},
148 "values"=> {
149 "nested"=> {
150 "key"=>"myval",
151 }
152 }
153 }]
154 }))
155 @site.process
156 @document = @site.collections["slides"].docs.first
157 end
158
159 should "not know the specified frontmatter defaults" do
160 assert_equal({
161 "title"=>"Example slide",
162 "layout"=>"slide"
163 }, @document.data)
164 end
165 end
166
167 context "a document in a collection with a custom permalink" do
168 setup do
169 @site = Site.new(Jekyll.configuration({
170 "collections" => ["slides"],
171 "source" => source_dir,
172 "destination" => dest_dir
173 }))
174 @site.process
175 @document = @site.collections["slides"].docs[2]
176 @dest_file = dest_dir("slide/3/index.html")
177 end
178
179 should "know its permalink" do
180 assert_equal "/slide/3/", @document.permalink
181 end
182
183 should "produce the right URL" do
184 assert_equal "/slide/3/", @document.url
185 end
186 end
187
188
189 context " a document part of a rendered collection" do
190 end
191
192 end
0 require 'helper'
1
2 class TestDraft < Test::Unit::TestCase
3 def setup_draft(file)
4 Draft.new(@site, source_dir, '', file)
5 end
6
7 context "A Draft" do
8 setup do
9 clear_dest
10 stub(Jekyll).configuration { Jekyll::Configuration::DEFAULTS }
11 @site = Site.new(Jekyll.configuration)
12 end
13
14 should "ensure valid drafts are valid" do
15 assert Draft.valid?("2008-09-09-foo-bar.textile")
16 assert Draft.valid?("foo/bar/2008-09-09-foo-bar.textile")
17 assert Draft.valid?("lol2008-09-09-foo-bar.textile")
18
19 assert !Draft.valid?("blah")
20 end
21
22 should "make properties accessible through #[]" do
23 draft = setup_draft('draft-properties.text')
24 # ! need to touch the file! Or get its timestamp
25 date = File.mtime(File.join(source_dir, '_drafts', 'draft-properties.text'))
26 ymd = date.strftime("%Y/%m/%d")
27
28 attrs = {
29 categories: %w(foo bar baz),
30 content: "All the properties.\n\nPlus an excerpt.\n",
31 date: date,
32 dir: "/foo/bar/baz/#{ymd}",
33 excerpt: "All the properties.\n\n",
34 foo: 'bar',
35 id: "/foo/bar/baz/#{ymd}/draft-properties",
36 layout: 'default',
37 name: nil,
38 path: "_drafts/draft-properties.text",
39 permalink: nil,
40 published: nil,
41 tags: %w(ay bee cee),
42 title: 'Properties Draft',
43 url: "/foo/bar/baz/#{ymd}/draft-properties.html"
44 }
45
46 attrs.each do |attr, val|
47 attr_str = attr.to_s
48 result = draft[attr_str]
49 assert_equal val, result, "For <draft[\"#{attr_str}\"]>:"
50 end
51 end
52
53 end
54
55 end
1717 end
1818
1919 should "filter entries with exclude" do
20 excludes = %w[README TODO]
21 files = %w[index.html site.css .htaccess]
20 excludes = %w[README TODO vendor/bundle]
21 files = %w[index.html site.css .htaccess vendor]
2222
2323 @site.exclude = excludes + ["exclude*"]
2424 assert_equal files, @site.filter_entries(excludes + files + ["excludeA"])
25 end
26
27 should "filter entries with exclude relative to site source" do
28 excludes = %w[README TODO css]
29 files = %w[index.html vendor/css .htaccess]
30
31 @site.exclude = excludes
32 assert_equal files, @site.filter_entries(excludes + files + ["css"])
33 end
34
35 should "filter excluded directory and contained files" do
36 excludes = %w[README TODO css]
37 files = %w[index.html .htaccess]
38
39 @site.exclude = excludes
40 assert_equal files, @site.filter_entries(excludes + files + ["css", "css/main.css", "css/vendor.css"])
2541 end
2642
2743 should "not filter entries within include" do
7086 assert_not_equal [], site.static_files
7187 end
7288 end
89
90 context "#glob_include?" do
91 setup do
92 stub(Jekyll).configuration do
93 Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
94 end
95 @site = Site.new(Jekyll.configuration)
96 @filter = EntryFilter.new(@site)
97 end
98
99 should "return false with no glob patterns" do
100 assert !@filter.glob_include?([], "a.txt")
101 end
102
103 should "return false with all not match path" do
104 data = ["a*", "b?"]
105 assert !@filter.glob_include?(data, "ca.txt")
106 assert !@filter.glob_include?(data, "ba.txt")
107 end
108
109 should "return true with match path" do
110 data = ["a*", "b?", "**/a*"]
111 assert @filter.glob_include?(data, "a.txt")
112 assert @filter.glob_include?(data, "ba")
113 assert @filter.glob_include?(data, "c/a/a.txt")
114 assert @filter.glob_include?(data, "c/a/b/a.txt")
115 end
116
117 should "match even if there is no leading slash" do
118 data = ['vendor/bundle']
119 assert @filter.glob_include?(data, '/vendor/bundle')
120 assert @filter.glob_include?(data, 'vendor/bundle')
121 end
122 end
73123 end
3434 @excerpt = @post.send :extract_excerpt
3535 end
3636
37 context "#include(string)" do
38
39 setup do
40 @excerpt.output = "Here is a fake output stub"
41 end
42
43 should "return true only if an excerpt output contains a specified string" do
44 assert @excerpt.include?("fake output")
45 refute @excerpt.include?("real output")
46 end
47 end
48
49 context "#id" do
50 should "contain the UID for the post" do
51 assert_equal @excerpt.id, "#{@post.id}/#excerpt"
52 end
53 should "return a string" do
54 assert_same @post.id.class, String
55 end
56 end
57
58 context "#to_s" do
59 should "return its content if no output present" do
60 assert_equal @excerpt.content, @excerpt.to_s
61 end
62
63 should "return its output if output present" do
64 @excerpt.output = "Fake Output"
65 assert_equal @excerpt.output, @excerpt.to_s
66 end
67 end
68
69 context "#inspect" do
70 should "contain the excerpt id as a shorthand string identifier" do
71 assert_equal @excerpt.inspect, "<Excerpt: #{@excerpt.id}>"
72 end
73
74 should "return a string" do
75 assert_same @post.id.class, String
76 end
77 end
78
3779 context "#to_liquid" do
3880 should "contain the proper page data to mimick the post liquid" do
3981 assert_equal "Post Excerpt with Layout", @excerpt.to_liquid["title"]
4284 assert_equal %w[bar baz z_category], @excerpt.to_liquid["categories"]
4385 assert_equal %w[first second third jekyllrb.com], @excerpt.to_liquid["tags"]
4486 assert_equal "_posts/2013-07-22-post-excerpt-with-layout.markdown", @excerpt.to_liquid["path"]
87 end
88
89 should "consider inheritance" do
90 klass = Class.new(Jekyll::Post)
91 assert_gets_called = false
92 klass.send(:define_method, :assert_gets_called) { assert_gets_called = true }
93 klass.const_set(:EXCERPT_ATTRIBUTES_FOR_LIQUID, Jekyll::Post::EXCERPT_ATTRIBUTES_FOR_LIQUID + ['assert_gets_called'])
94 post = klass.new(@site, source_dir, '', "2008-02-02-published.textile")
95 Jekyll::Excerpt.new(post).to_liquid
96
97 assert assert_gets_called, 'assert_gets_called did not get called on post.'
4598 end
4699 end
47100
65118 end
66119
67120 should "be the first paragraph of the page" do
68 assert_equal "<p>First paragraph with <a href=\"http://www.jekyllrb.com/\">link ref</a>.</p>", @extracted_excerpt.content
121 assert_equal "<p>First paragraph with <a href=\"http://www.jekyllrb.com/\">link ref</a>.</p>\n\n", @extracted_excerpt.content
69122 end
70123
71124 should "link properly" do
0 # coding: utf-8
1
02 require 'helper'
13
24 class TestFilters < Test::Unit::TestCase
35 class JekyllFilter
46 include Jekyll::Filters
5
6 def initialize
7 site = Jekyll::Site.new(Jekyll.configuration({}))
8 @context = Liquid::Context.new({}, {}, { :site => site })
7 attr_accessor :site, :context
8
9 def initialize(opts = {})
10 @site = Jekyll::Site.new(Jekyll.configuration(opts))
11 @context = Liquid::Context.new({}, {}, { :site => @site })
912 end
1013 end
1114
1215 context "filters" do
1316 setup do
14 @filter = JekyllFilter.new
17 @filter = JekyllFilter.new({"source" => source_dir, "destination" => dest_dir, "timezone" => "UTC"})
1518 @sample_time = Time.utc(2013, 03, 27, 11, 22, 33)
1619 @time_as_string = "September 11, 2001 12:46:30 -0000"
20 @time_as_numeric = 1399680607
21 @array_of_objects = [
22 { "color" => "red", "size" => "large" },
23 { "color" => "red", "size" => "medium" },
24 { "color" => "blue", "size" => "medium" }
25 ]
1726 end
1827
1928 should "textilize with simple string" do
2130 end
2231
2332 should "markdownify with simple string" do
24 assert_equal "<p>something <strong>really</strong> simple</p>", @filter.markdownify("something **really** simple")
33 assert_equal "<p>something <strong>really</strong> simple</p>\n", @filter.markdownify("something **really** simple")
2534 end
2635
2736 should "convert array to sentence string with no args" do
7988 assert_equal "Tue, 11 Sep 2001 12:46:30 -0000", @filter.date_to_rfc822(@time_as_string)
8089 end
8190 end
91
92 context "with a Numeric object" do
93 should "format a date with short format" do
94 assert_equal "10 May 2014", @filter.date_to_string(@time_as_numeric)
95 end
96
97 should "format a date with long format" do
98 assert_equal "10 May 2014", @filter.date_to_long_string(@time_as_numeric)
99 end
100
101 should "format a time with xmlschema" do
102 assert_match /2014-05-10T00:10:07/, @filter.date_to_xmlschema(@time_as_numeric)
103 end
104
105 should "format a time according to RFC-822" do
106 assert_equal "Sat, 10 May 2014 00:10:07 +0000", @filter.date_to_rfc822(@time_as_numeric)
107 end
108 end
82109 end
83110
84111 should "escape xml with ampersands" do
86113 assert_equal "&lt;code&gt;command &amp;lt;filename&amp;gt;&lt;/code&gt;", @filter.xml_escape("<code>command &lt;filename&gt;</code>")
87114 end
88115
116 should "not error when xml escaping nil" do
117 assert_equal "", @filter.xml_escape(nil)
118 end
119
89120 should "escape space as plus" do
90121 assert_equal "my+things", @filter.cgi_escape("my things")
91122 end
108139 assert_equal "[{\"name\":\"Jack\"},{\"name\":\"Smith\"}]", @filter.jsonify([{:name => 'Jack'}, {:name => 'Smith'}])
109140 end
110141 end
142
143 context "group_by filter" do
144 should "successfully group array of Jekyll::Page's" do
145 @filter.site.process
146 grouping = @filter.group_by(@filter.site.pages, "layout")
147 grouping.each do |g|
148 assert ["default", "nil", ""].include?(g["name"]), "#{g['name']} isn't a valid grouping."
149 case g["name"]
150 when "default"
151 assert g["items"].is_a?(Array), "The list of grouped items for 'default' is not an Array."
152 assert_equal 5, g["items"].size
153 when "nil"
154 assert g["items"].is_a?(Array), "The list of grouped items for 'nil' is not an Array."
155 assert_equal 2, g["items"].size
156 when ""
157 assert g["items"].is_a?(Array), "The list of grouped items for '' is not an Array."
158 assert_equal 11, g["items"].size
159 end
160 end
161 end
162 end
163
164 context "where filter" do
165 should "return any input that is not an array" do
166 assert_equal Hash.new, @filter.where(Hash.new, nil, nil)
167 assert_equal "some string", @filter.where("some string", "la", "le")
168 end
169
170 should "filter objects appropriately" do
171 assert_equal 2, @filter.where(@array_of_objects, "color", "red").length
172 end
173 end
174
175 context "sort filter" do
176 should "return sorted numbers" do
177 assert_equal [1, 2, 2.2, 3], @filter.sort([3, 2.2, 2, 1])
178 end
179 should "return sorted strings" do
180 assert_equal ["10", "2"], @filter.sort(["10", "2"])
181 assert_equal [{"a" => "10"}, {"a" => "2"}], @filter.sort([{"a" => "10"}, {"a" => "2"}], "a")
182 assert_equal ["FOO", "Foo", "foo"], @filter.sort(["foo", "Foo", "FOO"])
183 assert_equal ["_foo", "foo", "foo_"], @filter.sort(["foo_", "_foo", "foo"])
184 # Cyrillic
185 assert_equal ["ВУЗ", "Вуз", "вуз"], @filter.sort(["Вуз", "вуз", "ВУЗ"])
186 assert_equal ["_вуз", "вуз", "вуз_"], @filter.sort(["вуз_", "_вуз", "вуз"])
187 # Hebrew
188 assert_equal ["אלף", "בית"], @filter.sort(["בית", "אלף"])
189 end
190 should "return sorted by property array" do
191 assert_equal [{"a" => 1}, {"a" => 2}, {"a" => 3}, {"a" => 4}],
192 @filter.sort([{"a" => 4}, {"a" => 3}, {"a" => 1}, {"a" => 2}], "a")
193 end
194 should "return sorted by property array with nils first" do
195 ary = [{"a" => 2}, {"b" => 1}, {"a" => 1}]
196 assert_equal [{"b" => 1}, {"a" => 1}, {"a" => 2}], @filter.sort(ary, "a")
197 assert_equal @filter.sort(ary, "a"), @filter.sort(ary, "a", "first")
198 end
199 should "return sorted by property array with nils last" do
200 assert_equal [{"a" => 1}, {"a" => 2}, {"b" => 1}],
201 @filter.sort([{"a" => 2}, {"b" => 1}, {"a" => 1}], "a", "last")
202 end
203 end
204
111205 end
112206 end
1313 end
1414
1515 should "ensure post count is as expected" do
16 assert_equal 37, @site.posts.size
16 assert_equal 42, @site.posts.size
1717 end
1818
1919 should "insert site.posts into the index" do
3131 assert_equal "published.html", published.first
3232 end
3333
34 should "hide unpublished page" do
35 assert !File.exist?(dest_dir('/unpublished.html'))
36 end
37
3438 should "not copy _posts directory" do
3539 assert !File.exist?(dest_dir('_posts'))
3640 end
3741
3842 should "process other static files and generate correct permalinks" do
39 assert File.exists?(dest_dir('/about/index.html'))
40 assert File.exists?(dest_dir('/contacts.html'))
43 assert File.exist?(dest_dir('/about/index.html'))
44 assert File.exist?(dest_dir('/contacts.html'))
45 end
46
47 should "print a nice list of static files" do
48 expected_output = Regexp.new <<-OUTPUT
49 - /css/screen.css last edited at \\d+ with extname .css
50 - /pgp.key last edited at \\d+ with extname .key
51 - /products.yml last edited at \\d+ with extname .yml
52 - /symlink-test/symlinked-dir/screen.css last edited at \\d+ with extname .css
53 OUTPUT
54 assert_match expected_output, File.read(dest_dir('static_files.html'))
4155 end
4256 end
4357
2525 @markdown = Converters::Markdown.new(@config)
2626 end
2727
28 # http://kramdown.rubyforge.org/converter/html.html#options
28 # http://kramdown.gettalong.org/converter/html.html#options
2929 should "pass kramdown options" do
3030 assert_equal "<h1>Some Header</h1>", @markdown.convert('# Some Header #').strip
3131 end
3434 assert_match /<p>(&#8220;|“)Pit(&#8217;|’)hy(&#8221;|”)<\/p>/, @markdown.convert(%{"Pit'hy"}).strip
3535
3636 override = { 'kramdown' => { 'smart_quotes' => 'lsaquo,rsaquo,laquo,raquo' } }
37 markdown = Converters::Markdown.new(@config.deep_merge(override))
37 markdown = Converters::Markdown.new(Utils.deep_merge_hashes(@config, override))
3838 assert_match /<p>(&#171;|«)Pit(&#8250;|›)hy(&#187;|»)<\/p>/, markdown.convert(%{"Pit'hy"}).strip
3939 end
4040
0 require 'helper'
1
2 class TestLayoutReader < Test::Unit::TestCase
3 context "reading layouts" do
4 setup do
5 stub(Jekyll).configuration do
6 Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir})
7 end
8 @site = Site.new(Jekyll.configuration)
9 end
10
11 should "read layouts" do
12 layouts = LayoutReader.new(@site).read
13 assert_equal ["default", "simple", "post/simple"].sort, layouts.keys.sort
14 end
15
16 context "when no _layouts directory exists in CWD" do
17 should "know to use the layout directory relative to the site source" do
18 assert_equal LayoutReader.new(@site).layout_directory, source_dir("_layouts")
19 end
20 end
21
22 context "when a _layouts directory exists in CWD" do
23 setup do
24 stub(File).directory? { true }
25 stub(Dir).pwd { source_dir("blah") }
26 end
27
28 should "know to use the layout directory relative to CWD" do
29 assert_equal LayoutReader.new(@site).layout_directory, source_dir("blah/_layouts")
30 end
31 end
32 end
33 end
0 require 'helper'
1
2 class TestLiquidExtensions < Test::Unit::TestCase
3
4 context "looking up a variable in a Liquid context" do
5 class SayHi < Liquid::Tag
6 include Jekyll::LiquidExtensions
7
8 def initialize(tag_name, markup, tokens)
9 @markup = markup.strip
10 end
11
12 def render(context)
13 "hi #{lookup_variable(context, @markup)}"
14 end
15 end
16 Liquid::Template.register_tag('say_hi', SayHi)
17 setup do
18 @template = Liquid::Template.parse("{% say_hi page.name %}") # Parses and compiles the template
19 end
20
21 should "extract the var properly" do
22 assert_equal @template.render({'page' => {'name' => 'tobi'}}), 'hi tobi'
23 end
24
25 should "return the variable name if the value isn't there" do
26 assert_equal @template.render({'page' => {'title' => 'tobi'}}), 'hi page.name'
27 end
28 end
29
30 end
0 require 'helper'
1
2 class TestLogAdapter < Test::Unit::TestCase
3 class LoggerDouble
4 attr_accessor :level
5 end
6
7 context "#log_level=" do
8 should "set the writers logging level" do
9 subject = Jekyll::LogAdapter.new(LoggerDouble.new)
10 subject.log_level = :error
11 assert_equal Jekyll::LogAdapter::LOG_LEVELS[:error], subject.writer.level
12 end
13 end
14
15 context "#debug" do
16 should "call #debug on writer return true" do
17 writer = LoggerDouble.new
18 logger = Jekyll::LogAdapter.new(writer)
19 stub(writer).debug('topic '.rjust(20) + 'log message') { true }
20 assert logger.debug('topic', 'log message')
21 end
22 end
23
24 context "#info" do
25 should "call #info on writer return true" do
26 writer = LoggerDouble.new
27 logger = Jekyll::LogAdapter.new(writer)
28 stub(writer).info('topic '.rjust(20) + 'log message') { true }
29 assert logger.info('topic', 'log message')
30 end
31 end
32
33 context "#warn" do
34 should "call #warn on writer return true" do
35 writer = LoggerDouble.new
36 logger = Jekyll::LogAdapter.new(writer)
37 stub(writer).warn('topic '.rjust(20) + 'log message') { true }
38 assert logger.warn('topic', 'log message')
39 end
40 end
41
42 context "#error" do
43 should "call #error on writer return true" do
44 writer = LoggerDouble.new
45 logger = Jekyll::LogAdapter.new(writer)
46 stub(writer).error('topic '.rjust(20) + 'log message') { true }
47 assert logger.error('topic', 'log message')
48 end
49 end
50
51 context "#abort_with" do
52 should "call #error and abort" do
53 logger = Jekyll::LogAdapter.new(LoggerDouble.new)
54 stub(logger).error('topic', 'log message') { true }
55 assert_raise(SystemExit) { logger.abort_with('topic', 'log message') }
56 end
57 end
58 end
2323 end
2424
2525 should 'create a new directory' do
26 assert !File.exists?(@full_path)
26 assert !File.exist?(@full_path)
2727 capture_stdout { Jekyll::Commands::New.process(@args) }
28 assert File.exists?(@full_path)
28 assert File.exist?(@full_path)
2929 end
3030
3131 should 'display a success message' do
3232 output = capture_stdout { Jekyll::Commands::New.process(@args) }
33 success_message = "New jekyll site installed in #{@full_path}.\n"
33 success_message = "New jekyll site installed in #{@full_path}. \n"
3434 assert_equal success_message, output
3535 end
3636
8282 end
8383
8484 should 'create a new directory' do
85 assert !File.exists?(@site_name_with_spaces)
85 assert !File.exist?(@site_name_with_spaces)
8686 capture_stdout { Jekyll::Commands::New.process(@multiple_args) }
87 assert File.exists?(@site_name_with_spaces)
87 assert File.exist?(@site_name_with_spaces)
8888 end
8989 end
9090
2424 assert_equal "/contacts.html", @page.url
2525 end
2626
27 should "not published when published yaml is false" do
28 @page = setup_page("unpublished.html")
29 assert_equal false, @page.published?
30 end
31
32 should "create url with non-alphabetic characters" do
33 @page = setup_page('+', '%# +.md')
34 assert_equal "/+/%25%23%20+.html", @page.url
35 end
36
2737 context "in a directory hierarchy" do
2838 should "create url based on filename" do
2939 @page = setup_page('/contacts', 'bar.html')
4454 should "deal properly with dots" do
4555 @page = setup_page('deal.with.dots.html')
4656 assert_equal "deal.with.dots", @page.basename
57 end
58
59 should "make properties accessible through #[]" do
60 page = setup_page('properties.html')
61 attrs = {
62 content: "All the properties.\n",
63 dir: "/properties/",
64 excerpt: nil,
65 foo: 'bar',
66 layout: 'default',
67 name: "properties.html",
68 path: "properties.html",
69 permalink: '/properties/',
70 published: nil,
71 title: 'Properties Page',
72 url: "/properties/"
73 }
74
75 attrs.each do |attr, val|
76 attr_str = attr.to_s
77 result = page[attr_str]
78 assert_equal val, result, "For <page[\"#{attr_str}\"]>:"
79 end
4780 end
4881
4982 context "with pretty url style" do
133166 page.write(dest_dir)
134167
135168 assert File.directory?(dest_dir)
136 assert File.exists?(File.join(dest_dir, 'contacts.html'))
169 assert File.exist?(File.join(dest_dir, 'contacts.html'))
137170 end
138171
139172 should "write even when the folder name is plus and permalink has +" do
142175 page.write(dest_dir)
143176
144177 assert File.directory?(dest_dir)
145 assert File.exists?(File.join(dest_dir, '+', 'plus+in+url'))
178 assert File.exist?(File.join(dest_dir, '+', 'plus+in+url'))
179 end
180
181 should "write even when permalink has '%# +'" do
182 page = setup_page('+', '%# +.md')
183 do_render(page)
184 page.write(dest_dir)
185
186 assert File.directory?(dest_dir)
187 assert File.exist?(File.join(dest_dir, '+', '%# +.html'))
146188 end
147189
148190 should "write properly without html extension" do
152194 page.write(dest_dir)
153195
154196 assert File.directory?(dest_dir)
155 assert File.exists?(File.join(dest_dir, 'contacts', 'index.html'))
197 assert File.exist?(File.join(dest_dir, 'contacts', 'index.html'))
156198 end
157199
158200 should "write properly with extension different from html" do
164206 assert_equal("/sitemap.xml", page.url)
165207 assert_nil(page.url[/\.html$/])
166208 assert File.directory?(dest_dir)
167 assert File.exists?(File.join(dest_dir,'sitemap.xml'))
209 assert File.exist?(File.join(dest_dir,'sitemap.xml'))
168210 end
169211
170212 should "write dotfiles properly" do
173215 page.write(dest_dir)
174216
175217 assert File.directory?(dest_dir)
176 assert File.exists?(File.join(dest_dir, '.htaccess'))
218 assert File.exist?(File.join(dest_dir, '.htaccess'))
177219 end
178220
179221 context "in a directory hierarchy" do
183225 page.write(dest_dir)
184226
185227 assert File.directory?(dest_dir)
186 assert File.exists?(File.join(dest_dir, 'contacts', 'index.html'))
228 assert File.exist?(File.join(dest_dir, 'contacts', 'index.html'))
187229 end
188230
189231 should "write properly" do
192234 page.write(dest_dir)
193235
194236 assert File.directory?(dest_dir)
195 assert File.exists?(File.join(dest_dir, 'contacts', 'bar.html'))
237 assert File.exist?(File.join(dest_dir, 'contacts', 'bar.html'))
196238 end
197239
198240 should "write properly without html extension" do
202244 page.write(dest_dir)
203245
204246 assert File.directory?(dest_dir)
205 assert File.exists?(File.join(dest_dir, 'contacts', 'bar', 'index.html'))
247 assert File.exist?(File.join(dest_dir, 'contacts', 'bar', 'index.html'))
206248 end
207249 end
208250 end
+0
-116
test/test_pager.rb less more
0 require 'helper'
1
2 class TestPager < Test::Unit::TestCase
3
4 def build_site(config = {})
5 base = Jekyll::Configuration::DEFAULTS.deep_merge({
6 'source' => source_dir,
7 'destination' => dest_dir,
8 'paginate' => 1
9 })
10 site = Jekyll::Site.new(base.deep_merge(config))
11 site.process
12 site
13 end
14
15 should "calculate number of pages" do
16 assert_equal(0, Pager.calculate_pages([], '2'))
17 assert_equal(1, Pager.calculate_pages([1], '2'))
18 assert_equal(1, Pager.calculate_pages([1,2], '2'))
19 assert_equal(2, Pager.calculate_pages([1,2,3], '2'))
20 assert_equal(2, Pager.calculate_pages([1,2,3,4], '2'))
21 assert_equal(3, Pager.calculate_pages([1,2,3,4,5], '2'))
22 end
23
24 should "determine the pagination path" do
25 assert_equal("/index.html", Pager.paginate_path(build_site, 1))
26 assert_equal("/page2", Pager.paginate_path(build_site, 2))
27 assert_equal("/index.html", Pager.paginate_path(build_site({'paginate_path' => '/blog/page-:num'}), 1))
28 assert_equal("/blog/page-2", Pager.paginate_path(build_site({'paginate_path' => '/blog/page-:num'}), 2))
29 assert_equal("/index.html", Pager.paginate_path(build_site({'paginate_path' => '/blog/page/:num'}), 1))
30 assert_equal("/blog/page/2", Pager.paginate_path(build_site({'paginate_path' => '/blog/page/:num'}), 2))
31 assert_equal("/contacts/index.html", Pager.paginate_path(build_site({'paginate_path' => '/contacts/page:num'}), 1))
32 assert_equal("/contacts/page2", Pager.paginate_path(build_site({'paginate_path' => '/contacts/page:num'}), 2))
33 assert_equal("/contacts/index.html", Pager.paginate_path(build_site({'paginate_path' => '/contacts/page/:num'}), 1))
34 assert_equal("/contacts/page/2", Pager.paginate_path(build_site({'paginate_path' => '/contacts/page/:num'}), 2))
35 end
36
37 context "pagination disabled" do
38 should "report that pagination is disabled" do
39 assert !Pager.pagination_enabled?(build_site('paginate' => nil))
40 end
41 end
42
43 context "pagination enabled for 2" do
44 setup do
45 @site = build_site('paginate' => 2)
46 @posts = @site.posts
47 end
48
49 should "report that pagination is enabled" do
50 assert Pager.pagination_enabled?(@site)
51 end
52
53 context "with 4 posts" do
54 setup do
55 @posts = @site.posts[1..4] # limit to 4
56 end
57
58 should "create first pager" do
59 pager = Pager.new(@site, 1, @posts)
60 assert_equal(2, pager.posts.size)
61 assert_equal(2, pager.total_pages)
62 assert_nil(pager.previous_page)
63 assert_equal(2, pager.next_page)
64 end
65
66 should "create second pager" do
67 pager = Pager.new(@site, 2, @posts)
68 assert_equal(2, pager.posts.size)
69 assert_equal(2, pager.total_pages)
70 assert_equal(1, pager.previous_page)
71 assert_nil(pager.next_page)
72 end
73
74 should "not create third pager" do
75 assert_raise(RuntimeError) { Pager.new(@site, 3, @posts) }
76 end
77
78 end
79
80 context "with 5 posts" do
81 setup do
82 @posts = @site.posts[1..5] # limit to 5
83 end
84
85 should "create first pager" do
86 pager = Pager.new(@site, 1, @posts)
87 assert_equal(2, pager.posts.size)
88 assert_equal(3, pager.total_pages)
89 assert_nil(pager.previous_page)
90 assert_equal(2, pager.next_page)
91 end
92
93 should "create second pager" do
94 pager = Pager.new(@site, 2, @posts)
95 assert_equal(2, pager.posts.size)
96 assert_equal(3, pager.total_pages)
97 assert_equal(1, pager.previous_page)
98 assert_equal(3, pager.next_page)
99 end
100
101 should "create third pager" do
102 pager = Pager.new(@site, 3, @posts)
103 assert_equal(1, pager.posts.size)
104 assert_equal(3, pager.total_pages)
105 assert_equal(2, pager.previous_page)
106 assert_nil(pager.next_page)
107 end
108
109 should "not create fourth pager" do
110 assert_raise(RuntimeError) { Pager.new(@site, 4, @posts) }
111 end
112
113 end
114 end
115 end
0 # encoding: utf-8
1
02 require 'helper'
13
24 class TestPost < Test::Unit::TestCase
2426 assert !Post.valid?("blah")
2527 end
2628
29 should "make properties accessible through #[]" do
30 post = setup_post('2013-12-20-properties.text')
31
32 attrs = {
33 categories: %w(foo bar baz),
34 content: "All the properties.\n\nPlus an excerpt.\n",
35 date: Time.new(2013, 12, 20),
36 dir: "/foo/bar/baz/2013/12/20",
37 excerpt: "All the properties.\n\n",
38 foo: 'bar',
39 id: "/foo/bar/baz/2013/12/20/properties",
40 layout: 'default',
41 name: nil,
42 path: "_posts/2013-12-20-properties.text",
43 permalink: nil,
44 published: nil,
45 tags: %w(ay bee cee),
46 title: 'Properties Post',
47 url: "/foo/bar/baz/2013/12/20/properties.html"
48 }
49
50 attrs.each do |attr, val|
51 attr_str = attr.to_s
52 result = post[attr_str]
53 assert_equal val, result, "For <post[\"#{attr_str}\"]>:"
54 end
55 end
56
2757 context "processing posts" do
2858 setup do
2959 @post = Post.allocate
4575 assert_equal "/2008/09/09/foo-bar", @post.id
4676 end
4777
78 should "keep categories" do
79 post = Post.allocate
80 post.site = @site
81 post.process("cat1/2008-09-09-foo-bar.textile")
82 assert_equal 1, post.categories.size
83 assert_equal "cat1", post.categories[0]
84
85 post = Post.allocate
86 post.site = @site
87 post.process("cat2/CAT3/2008-09-09-foo-bar.textile")
88 assert_equal 2, post.categories.size
89 assert_equal "cat2", post.categories[0]
90 assert_equal "cat3", post.categories[1]
91 end
92
4893 should "create url based on date and title" do
4994 @post.categories = []
5095 @post.process(@fake_file)
5297 end
5398
5499 should "raise a good error on invalid post date" do
55 assert_raise Jekyll::FatalException do
100 assert_raise Jekyll::Errors::FatalException do
56101 @post.process("2009-27-03-foo-bar.textile")
57102 end
58103 end
59104
60 should "CGI escape urls" do
105 should "escape urls" do
61106 @post.categories = []
62107 @post.process("2009-03-12-hash-#1.markdown")
63108 assert_equal "/2009/03/12/hash-%231.html", @post.url
64109 assert_equal "/2009/03/12/hash-#1", @post.id
110 end
111
112 should "escape urls with non-alphabetic characters" do
113 @post.categories = []
114 @post.process("2014-03-22-escape-+ %20[].markdown")
115 assert_equal "/2014/03/22/escape-+%20%2520%5B%5D.html", @post.url
116 assert_equal "/2014/03/22/escape-+ %20[]", @post.id
117 end
118
119 should "return a UTF-8 escaped string" do
120 assert_equal Encoding::UTF_8, URL.escape_path("/rails笔记/2014/04/20/escaped/").encoding
121 end
122
123 should "return a UTF-8 unescaped string" do
124 assert_equal Encoding::UTF_8, URL.unescape_path("/rails%E7%AC%94%E8%AE%B0/2014/04/20/escaped/".encode(Encoding::ASCII)).encoding
65125 end
66126
67127 should "respect permalink in yaml front matter" do
95155
96156 assert_equal({"title" => "Test title", "layout" => "post", "tag" => "Ruby"}, @post.data)
97157 assert_equal "This is the content", @post.content
158 end
159 end
160
161 context "with three dots ending YAML header" do
162 setup do
163 @real_file = "2014-03-03-yaml-with-dots.md"
164 end
165 should "should read the YAML header" do
166 @post.read_yaml(@source, @real_file)
167
168 assert_equal({"title" => "Test Post Where YAML Ends in Dots"},
169 @post.data)
98170 end
99171 end
100172
294366 end
295367
296368 should "return rendered HTML" do
297 assert_equal "<p>First paragraph with <a href=\"http://www.jekyllrb.com/\">link ref</a>.</p>",
369 assert_equal "<p>First paragraph with <a href=\"http://www.jekyllrb.com/\">link ref</a>.</p>\n\n",
298370 @post.excerpt
299371 end
300372
367439 end
368440
369441 context "initializing posts" do
370 should "publish when published yaml is no specified" do
371 post = setup_post("2008-02-02-published.textile")
372 assert_equal true, post.published
373 end
374
375 should "not published when published yaml is false" do
376 post = setup_post("2008-02-02-not-published.textile")
377 assert_equal false, post.published
378 end
379
380442 should "recognize date in yaml" do
381443 post = setup_post("2010-01-09-date-override.textile")
382444 do_render(post)
412474 assert_equal Time, post.to_liquid["date"].class
413475 end
414476
477 should "to_liquid should consider inheritance" do
478 klass = Class.new(Jekyll::Post)
479 assert_gets_called = false
480 klass.send(:define_method, :assert_gets_called) { assert_gets_called = true }
481 klass.const_set(:EXCERPT_ATTRIBUTES_FOR_LIQUID, Jekyll::Post::EXCERPT_ATTRIBUTES_FOR_LIQUID + ['assert_gets_called'])
482 post = klass.new(@site, source_dir, '', "2008-02-02-published.textile")
483 do_render(post)
484
485 assert assert_gets_called, 'assert_gets_called did not get called on post.'
486 end
487
415488 should "recognize category in yaml" do
416489 post = setup_post("2009-01-27-category.textile")
417490 assert post.categories.include?('foo')
489562 post.write(dest_dir)
490563
491564 assert File.directory?(dest_dir)
492 assert File.exists?(File.join(dest_dir, '2008', '10', '18', 'foo-bar.html'))
565 assert File.exist?(File.join(dest_dir, '2008', '10', '18', 'foo-bar.html'))
566 end
567
568 should "write properly when url has hash" do
569 post = setup_post("2009-03-12-hash-#1.markdown")
570 do_render(post)
571 post.write(dest_dir)
572
573 assert File.directory?(dest_dir)
574 assert File.exist?(File.join(dest_dir, '2009', '03', '12',
575 'hash-#1.html'))
576 end
577
578 should "write properly when url has space" do
579 post = setup_post("2014-03-22-escape-+ %20[].markdown")
580 do_render(post)
581 post.write(dest_dir)
582
583 assert File.directory?(dest_dir)
584 assert File.exist?(File.join(dest_dir, '2014', '03', '22',
585 'escape-+ %20[].html'))
493586 end
494587
495588 should "write properly without html extension" do
499592 post.write(dest_dir)
500593
501594 assert File.directory?(dest_dir)
502 assert File.exists?(File.join(dest_dir, 'foo-bar', 'index.html'))
595 assert File.exist?(File.join(dest_dir, 'foo-bar', 'index.html'))
503596 end
504597
505598 should "insert data" do
514607 post.site.source = File.join(File.dirname(__FILE__), 'source')
515608 do_render(post)
516609
517 assert_equal "<<< <hr />\n<p>Tom Preston-Werner github.com/mojombo</p>\n\n<p>This <em>is</em> cool</p> >>>", post.output
610 assert_equal "<<< <hr />\n<p>Tom Preston-Werner\ngithub.com/mojombo</p>\n\n<p>This <em>is</em> cool</p>\n >>>", post.output
518611 end
519612
520613 should "render date specified in front matter properly" do
536629
537630 should "generate categories and topics" do
538631 post = Post.new(@site, File.join(File.dirname(__FILE__), *%w[source]), 'foo', 'bar/2008-12-12-topical-post.textile')
539 assert_equal ['foo'], post.categories
632 assert_equal ['foo', 'bar'], post.categories
540633 end
541634 end
542635
588681
589682 end
590683
684 context "site config with category" do
685 setup do
686 config = Jekyll::Configuration::DEFAULTS.merge({
687 'defaults' => [
688 'scope' => {
689 'path' => ''
690 },
691 'values' => {
692 'category' => 'article'
693 }
694 ]
695 })
696 @site = Site.new(config)
697 end
698
699 should "return category if post does not specify category" do
700 post = setup_post("2009-01-27-no-category.textile")
701 assert post.categories.include?('article'), "Expected post.categories to include 'article' but did not."
702 end
703
704 should "override site category if set on post" do
705 post = setup_post("2009-01-27-category.textile")
706 assert post.categories.include?('foo'), "Expected post.categories to include 'foo' but did not."
707 assert !post.categories.include?('article'), "Did not expect post.categories to include 'article' but it did."
708 end
709 end
710
711 context "site config with categories" do
712 setup do
713 config = Jekyll::Configuration::DEFAULTS.merge({
714 'defaults' => [
715 'scope' => {
716 'path' => ''
717 },
718 'values' => {
719 'categories' => ['article']
720 }
721 ]
722 })
723 @site = Site.new(config)
724 end
725
726 should "return categories if post does not specify categories" do
727 post = setup_post("2009-01-27-no-category.textile")
728 assert post.categories.include?('article'), "Expected post.categories to include 'article' but did not."
729 end
730
731 should "override site categories if set on post" do
732 post = setup_post("2009-01-27-categories.textile")
733 ['foo', 'bar', 'baz'].each do |category|
734 assert post.categories.include?(category), "Expected post.categories to include '#{category}' but did not."
735 end
736 assert !post.categories.include?('article'), "Did not expect post.categories to include 'article' but it did."
737 end
738 end
739
591740 end
2727
2828 context "with pygments enabled" do
2929 setup do
30 @markdown = Converters::Markdown.new @config.merge({ 'pygments' => true })
30 @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => 'pygments' })
3131 end
3232
3333 should "render fenced code blocks with syntax highlighting" do
34 assert_equal "<div class=\"highlight\"><pre><code class=\"ruby language-ruby\" data-lang=\"ruby\"><span class=\"nb\">puts</span> <span class=\"s2\">&quot;Hello world&quot;</span>\n</code></pre></div>", @markdown.convert(
34 assert_equal "<div class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"nb\">puts</span> <span class=\"s2\">&quot;Hello world&quot;</span>\n</code></pre></div>", @markdown.convert(
3535 <<-EOS
3636 ```ruby
3737 puts "Hello world"
4141 end
4242 end
4343
44 context "with pygments disabled" do
44 context "with rouge enabled" do
4545 setup do
46 @markdown = Converters::Markdown.new @config.merge({ 'pygments' => false })
46 @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => 'rouge' })
47 end
48
49 should "render fenced code blocks with syntax highlighting" do
50 assert_equal "<div class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"nb\">puts</span> <span class=\"s2\">\"Hello world\"</span>\n</code></pre></div>", @markdown.convert(
51 <<-EOS
52 ```ruby
53 puts "Hello world"
54 ```
55 EOS
56 ).strip
57 end
58 end
59
60 context "without any highlighter" do
61 setup do
62 @markdown = Converters::Markdown.new @config.merge({ 'highlighter' => nil })
4763 end
4864
4965 should "render fenced code blocks without syntax highlighting" do
50 assert_equal "<div class=\"highlight\"><pre><code class=\"ruby language-ruby\" data-lang=\"ruby\">puts &quot;Hello world&quot;\n</code></pre></div>", @markdown.convert(
66 assert_equal "<div class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\">puts &quot;Hello world&quot;\n</code></pre></div>", @markdown.convert(
5167 <<-EOS
5268 ```ruby
5369 puts "Hello world"
0 require 'helper'
1
2 class TestSass < Test::Unit::TestCase
3 context "importing partials" do
4 setup do
5 @site = Jekyll::Site.new(Jekyll.configuration({
6 "source" => source_dir,
7 "destination" => dest_dir
8 }))
9 @site.process
10 @test_css_file = dest_dir("css/main.css")
11 end
12
13 should "import SCSS partial" do
14 assert_equal ".half {\n width: 50%; }\n", File.read(@test_css_file)
15 end
16
17 should "register the SCSS converter" do
18 assert !!@site.getConverterImpl(Jekyll::Converters::Scss), "SCSS converter implementation should exist."
19 end
20
21 should "register the Sass converter" do
22 assert !!@site.getConverterImpl(Jekyll::Converters::Sass), "Sass converter implementation should exist."
23 end
24 end
25 end
153153 assert_equal @site.generators.sort_by(&:class).map{|g|g.class.priority}, @site.generators.map{|g|g.class.priority}
154154 end
155155
156 should "read layouts" do
157 @site.read_layouts
158 assert_equal ["default", "simple", "post/simple"].sort, @site.layouts.keys.sort
156 should "sort pages alphabetically" do
157 stub.proxy(Dir).entries { |entries| entries.reverse }
158 @site.process
159 # files in symlinked directories may appear twice
160 sorted_pages = %w(
161 %#\ +.md
162 .htaccess
163 about.html
164 bar.html
165 coffeescript.coffee
166 contacts.html
167 deal.with.dots.html
168 environment.html
169 exploit.md
170 foo.md
171 index.html
172 index.html
173 main.scss
174 main.scss
175 properties.html
176 sitemap.xml
177 static_files.html
178 symlinked-file
179 )
180 assert_equal sorted_pages, @site.pages.map(&:name)
159181 end
160182
161183 should "read posts" do
165187 assert_equal posts.size - @num_invalid_posts, @site.posts.size
166188 end
167189
190 should "read pages with yaml front matter" do
191 abs_path = File.expand_path("about.html", @site.source)
192 assert_equal true, @site.send(:has_yaml_header?, abs_path)
193 end
194
195 should "enforce a strict 3-dash limit on the start of the YAML front-matter" do
196 abs_path = File.expand_path("pgp.key", @site.source)
197 assert_equal false, @site.send(:has_yaml_header?, abs_path)
198 end
199
200 should "expose jekyll version to site payload" do
201 assert_equal Jekyll::VERSION, @site.site_payload['jekyll']['version']
202 end
203
204 should "expose list of static files to site payload" do
205 assert_equal @site.static_files, @site.site_payload['site']['static_files']
206 end
207
168208 should "deploy payload" do
169209 clear_dest
170210 @site.process
171211
172212 posts = Dir[source_dir("**", "_posts", "**", "*")]
173213 posts.delete_if { |post| File.directory?(post) && !Post.valid?(post) }
174 categories = %w(2013 bar baz category foo z_category publish_test win).sort
214 categories = %w(2013 bar baz category es foo z_category publish_test win).sort
175215
176216 assert_equal posts.size - @num_invalid_posts, @site.posts.size
177217 assert_equal categories, @site.categories.keys.sort
178 assert_equal 4, @site.categories['foo'].size
218 assert_equal 5, @site.categories['foo'].size
179219 end
180220
181221 context 'error handling' do
184224 Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => source_dir})
185225 end
186226
187 assert_raise Jekyll::FatalException do
227 assert_raise Jekyll::Errors::FatalException do
188228 site = Site.new(Jekyll.configuration)
189229 end
190230 end
194234 Jekyll::Configuration::DEFAULTS.merge({'source' => source_dir, 'destination' => File.join(source_dir, "..")})
195235 end
196236
197 assert_raise Jekyll::FatalException do
237 assert_raise Jekyll::Errors::FatalException do
198238 site = Site.new(Jekyll.configuration)
199239 end
200240 end
254294 end
255295 end
256296
297 context 'using a non-default markdown processor in the configuration' do
298 should 'use the non-default markdown processor' do
299 class Jekyll::Converters::Markdown::CustomMarkdown
300 def initialize(*args)
301 @args = args
302 end
303
304 def convert(*args)
305 ""
306 end
307 end
308
309 custom_processor = "CustomMarkdown"
310 s = Site.new(Jekyll.configuration.merge({ 'markdown' => custom_processor }))
311 assert_nothing_raised do
312 s.process
313 end
314
315 # Do some cleanup, we don't like straggling stuff's.
316 Jekyll::Converters::Markdown.send(:remove_const, :CustomMarkdown)
317 end
318
319 should 'ignore, if there are any bad characters in the class name' do
320 module Jekyll::Converters::Markdown::Custom
321 class Markdown
322 def initialize(*args)
323 @args = args
324 end
325
326 def convert(*args)
327 ""
328 end
329 end
330 end
331
332 bad_processor = "Custom::Markdown"
333 s = Site.new(Jekyll.configuration.merge({ 'markdown' => bad_processor }))
334 assert_raise Jekyll::Errors::FatalException do
335 s.process
336 end
337
338 # Do some cleanup, we don't like straggling stuff's.
339 Jekyll::Converters::Markdown.send(:remove_const, :Custom)
340 end
341 end
342
257343 context 'with an invalid markdown processor in the configuration' do
258344 should 'not throw an error at initialization time' do
259345 bad_processor = 'not a processor name'
265351 should 'throw FatalException at process time' do
266352 bad_processor = 'not a processor name'
267353 s = Site.new(Jekyll.configuration.merge({ 'markdown' => bad_processor }))
268 assert_raise Jekyll::FatalException do
354 assert_raise Jekyll::Errors::FatalException do
269355 s.process
270356 end
271357 end
276362 site = Site.new(Jekyll.configuration)
277363 site.process
278364
279 file_content = YAML.safe_load_file(File.join(source_dir, '_data', 'members.yaml'))
365 file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.yaml'))
280366
281367 assert_equal site.data['members'], file_content
282368 assert_equal site.site_payload['site']['data']['members'], file_content
286372 site = Site.new(Jekyll.configuration)
287373 site.process
288374
289 file_content = YAML.safe_load_file(File.join(source_dir, '_data', 'languages.yml'))
375 file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'languages.yml'))
290376
291377 assert_equal site.data['languages'], file_content
292378 assert_equal site.site_payload['site']['data']['languages'], file_content
293379 end
294380
381 should 'auto load json files' do
382 site = Site.new(Jekyll.configuration)
383 site.process
384
385 file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'members.json'))
386
387 assert_equal site.data['members'], file_content
388 assert_equal site.site_payload['site']['data']['members'], file_content
389 end
390
391 should 'auto load yaml files in subdirectory' do
392 site = Site.new(Jekyll.configuration)
393 site.process
394
395 file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'categories', 'dairy.yaml'))
396
397 assert_equal site.data['categories']['dairy'], file_content
398 assert_equal site.site_payload['site']['data']['categories']['dairy'], file_content
399 end
400
295401 should "load symlink files in unsafe mode" do
296402 site = Site.new(Jekyll.configuration.merge({'safe' => false}))
297403 site.process
298404
299 file_content = YAML.safe_load_file(File.join(source_dir, '_data', 'products.yml'))
405 file_content = SafeYAML.load_file(File.join(source_dir, '_data', 'products.yml'))
300406
301407 assert_equal site.data['products'], file_content
302408 assert_equal site.site_payload['site']['data']['products'], file_content
310416 assert_nil site.site_payload['site']['data']['products']
311417 end
312418
313 should "load symlink directory in unsafe mode" do
314 site = Site.new(Jekyll.configuration.merge({'safe' => false, 'data_source' => File.join('symlink-test', '_data')}))
315 site.process
316
317 assert_not_nil site.data['products']
318 assert_not_nil site.data['languages']
319 assert_not_nil site.data['members']
320 end
321
322 should "not load symlink directory in safe mode" do
323 site = Site.new(Jekyll.configuration.merge({'safe' => true, 'data_source' => File.join('symlink-test', '_data')}))
324 site.process
325
326 assert_nil site.data['products']
327 assert_nil site.data['languages']
328 assert_nil site.data['members']
329 end
330 end
419 end
420
421 context "manipulating the Jekyll environment" do
422 setup do
423 @site = Site.new(site_configuration)
424 @site.process
425 @page = @site.pages.find { |p| p.name == "environment.html" }
426 end
427
428 should "default to 'development'" do
429 assert_equal "development", @page.content.strip
430 end
431
432 context "in production" do
433 setup do
434 ENV["JEKYLL_ENV"] = "production"
435 @site = Site.new(site_configuration)
436 @site.process
437 @page = @site.pages.find { |p| p.name == "environment.html" }
438 end
439
440 teardown do
441 ENV.delete("JEKYLL_ENV")
442 end
443
444 should "be overridden by JEKYLL_ENV" do
445 assert_equal "production", @page.content.strip
446 end
447 end
448 end
449
331450 end
332451 end
55
66 def create_post(content, override = {}, converter_class = Jekyll::Converters::Markdown)
77 stub(Jekyll).configuration do
8 Jekyll::Configuration::DEFAULTS.deep_merge({'pygments' => true}).deep_merge(override)
8 site_configuration({
9 "highlighter" => "pygments"
10 }.merge(override))
911 end
1012 site = Site.new(Jekyll.configuration)
1113
1517
1618 info = { :filters => [Jekyll::Filters], :registers => { :site => site } }
1719 @converter = site.converters.find { |c| c.class == converter_class }
18 payload = { "pygments_prefix" => @converter.pygments_prefix,
19 "pygments_suffix" => @converter.pygments_suffix }
20 payload = { "highlighter_prefix" => @converter.highlighter_prefix,
21 "highlighter_suffix" => @converter.highlighter_suffix }
2022
2123 @result = Liquid::Template.parse(content).render!(payload, info)
2224 @result = @converter.convert(@result)
3032
3133 This document results in a markdown error with maruku
3234
33 {% highlight text %}#{code}{% endhighlight %}
34 {% highlight text linenos %}#{code}{% endhighlight %}
35 {% highlight text %}
36 #{code}
37 {% endhighlight %}
38 {% highlight text linenos %}
39 #{code}
40 {% endhighlight %}
3541 CONTENT
3642 create_post(content, override)
3743 end
5359 end
5460
5561 context "initialized tag" do
56 should "work" do
62 should "set the correct options" do
5763 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby ', ["test", "{% endhighlight %}", "\n"])
5864 assert_equal({}, tag.instance_variable_get(:@options))
5965
6066 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos ', ["test", "{% endhighlight %}", "\n"])
61 assert_equal({ 'linenos' => 'inline' }, tag.instance_variable_get(:@options))
67 assert_equal({ :linenos => 'inline' }, tag.instance_variable_get(:@options))
6268
6369 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table ', ["test", "{% endhighlight %}", "\n"])
64 assert_equal({ 'linenos' => 'table' }, tag.instance_variable_get(:@options))
70 assert_equal({ :linenos => 'table' }, tag.instance_variable_get(:@options))
6571
6672 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table nowrap', ["test", "{% endhighlight %}", "\n"])
67 assert_equal({ 'linenos' => 'table', 'nowrap' => true }, tag.instance_variable_get(:@options))
73 assert_equal({ :linenos => 'table', :nowrap => true }, tag.instance_variable_get(:@options))
6874
6975 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl', ["test", "{% endhighlight %}", "\n"])
70 assert_equal({ 'cssclass' => 'hl', 'linenos' => 'table' }, tag.instance_variable_get(:@options))
76 assert_equal({ :cssclass => 'hl', :linenos => 'table' }, tag.instance_variable_get(:@options))
77
78 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl hl_linenos=3', ["test", "{% endhighlight %}", "\n"])
79 assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => '3' }, tag.instance_variable_get(:@options))
80
81 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl hl_linenos="3 5 6"', ["test", "{% endhighlight %}", "\n"])
82 assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => ['3', '5', '6'] }, tag.instance_variable_get(:@options))
7183
7284 tag = Jekyll::Tags::HighlightBlock.new('highlight', 'Ruby ', ["test", "{% endhighlight %}", "\n"])
7385 assert_equal "ruby", tag.instance_variable_get(:@lang), "lexers should be case insensitive"
7486 end
7587 end
7688
89 context "in safe mode" do
90 setup do
91 @tag = Jekyll::Tags::HighlightBlock.new('highlight', 'text ', ["test", "{% endhighlight %}", "\n"])
92 end
93
94 should "allow linenos" do
95 sanitized = @tag.sanitized_opts({:linenos => true}, true)
96 assert_equal true, sanitized[:linenos]
97 end
98
99 should "allow hl_linenos" do
100 sanitized = @tag.sanitized_opts({:hl_linenos => %w[1 2 3 4]}, true)
101 assert_equal %w[1 2 3 4], sanitized[:hl_linenos]
102 end
103
104 should "allow cssclass" do
105 sanitized = @tag.sanitized_opts({:cssclass => "ahoy"}, true)
106 assert_equal "ahoy", sanitized[:cssclass]
107 end
108
109 should "allow startinline" do
110 sanitized = @tag.sanitized_opts({:startinline => true}, true)
111 assert_equal true, sanitized[:startinline]
112 end
113
114 should "strip unknown options" do
115 sanitized = @tag.sanitized_opts({:light => true}, true)
116 assert_nil sanitized[:light]
117 end
118 end
119
77120 context "post content has highlight tag" do
78121 setup do
79122 fill_post("test")
84127 end
85128
86129 should "render markdown with pygments" do
87 assert_match %{<pre><code class='text'>test\n</code></pre>}, @result
130 assert_match %{<pre><code class="language-text" data-lang="text">test</code></pre>}, @result
88131 end
89132
90133 should "render markdown with pygments with line numbers" do
91 assert_match %{<pre><code class='text'><span class='lineno'>1</span> test\n</code></pre>}, @result
134 assert_match %{<pre><code class="language-text" data-lang="text"><span class="lineno">1</span> test</code></pre>}, @result
92135 end
93136 end
94137
98141 end
99142
100143 should "not embed the file" do
101 assert_match %{<pre><code class='text'>./jekyll.gemspec\n</code></pre>}, @result
144 assert_match %{<pre><code class="language-text" data-lang="text">./jekyll.gemspec</code></pre>}, @result
102145 end
103146 end
104147
108151 end
109152
110153 should "render markdown with pygments line handling" do
111 assert_match %{<pre><code class='text'>Æ\n</code></pre>}, @result
154 assert_match %{<pre><code class="language-text" data-lang="text">Æ</code></pre>}, @result
112155 end
113156 end
114157
231274 end
232275
233276 should "have the url to the \"nested\" post from 2008-11-21" do
234 assert_match %r{3\s/2008/11/21/nested/}, @result
235 assert_match %r{4\s/2008/11/21/nested/}, @result
236 end
237 end
238
239 context "gist tag" do
240 context "simple" do
241 setup do
242 @gist = 358471
243 content = <<CONTENT
244 ---
245 title: My Cool Gist
246 ---
247
248 {% gist #{@gist} %}
249 CONTENT
277 assert_match %r{3\s/es/2008/11/21/nested/}, @result
278 assert_match %r{4\s/es/2008/11/21/nested/}, @result
279 end
280 end
281
282 context "simple page with invalid post name linking" do
283 should "cause an error" do
284 content = <<CONTENT
285 ---
286 title: Invalid post name linking
287 ---
288
289 {% post_url abc2008-11-21-complex %}
290 CONTENT
291
292 assert_raise ArgumentError do
250293 create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
251 end
252
253 should "write script tag" do
254 assert_match "<script src='https://gist.github.com/#{@gist}.js'><![CDATA[\s]]></script>", @result
255 end
256 end
257
258 context "for private gist" do
259 context "when valid" do
260 setup do
261 @gist = "mattr-/24081a1d93d2898ecf0f"
262 @filename = "myfile.ext"
263 content = <<CONTENT
264 ---
265 title: My Cool Gist
266 ---
267
268 {% gist #{@gist} #{@filename} %}
269 CONTENT
270 create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
271 end
272
273 should "write script tag with specific file in gist" do
274 assert_match "<script src='https://gist.github.com/#{@gist}.js?file=#{@filename}'><![CDATA[\s]]></script>", @result
275 end
276 end
277
278 should "raise ArgumentError when invalid" do
279 @gist = "mattr-24081a1d93d2898ecf0f"
280 @filename = "myfile.ext"
281 content = <<CONTENT
282 ---
283 title: My Cool Gist
284 ---
285
286 {% gist #{@gist} #{@filename} %}
287 CONTENT
288
289 assert_raise ArgumentError do
290 create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
291 end
292 end
293 end
294
295 context "with specific file" do
296 setup do
297 @gist = 358471
298 @filename = 'somefile.rb'
299 content = <<CONTENT
300 ---
301 title: My Cool Gist
302 ---
303
304 {% gist #{@gist} #{@filename} %}
305 CONTENT
306 create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
307 end
308
309 should "write script tag with specific file in gist" do
310 assert_match "<script src='https://gist.github.com/#{@gist}.js?file=#{@filename}'><![CDATA[\s]]></script>", @result
311 end
312 end
313
314 context "with blank gist id" do
315 should "raise ArgumentError" do
316 content = <<CONTENT
317 ---
318 title: My Cool Gist
319 ---
320
321 {% gist %}
322 CONTENT
323
324 assert_raise ArgumentError do
325 create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
326 end
327 end
328 end
329
330 context "with invalid gist id" do
331 should "raise ArgumentError" do
332 invalid_gist = 'invalid'
333 content = <<CONTENT
334 ---
335 title: My Cool Gist
336 ---
337
338 {% gist #{invalid_gist} %}
339 CONTENT
340
341 assert_raise ArgumentError do
342 create_post(content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
343 end
344294 end
345295 end
346296 end
396346 end
397347
398348 should "correctly output include variable" do
399 assert_match "<span id='include-param'>value</span>", @result.strip
349 assert_match "<span id=\"include-param\">value</span>", @result.strip
400350 end
401351
402352 should "ignore parameters if unused" do
403 assert_match "<hr />\n<p>Tom Preston-Werner github.com/mojombo</p>\n", @result
353 assert_match "<hr />\n<p>Tom Preston-Werner\ngithub.com/mojombo</p>\n", @result
404354 end
405355 end
406356
448398 end
449399
450400 should "not include previously used parameters" do
451 assert_match "<span id='include-param' />", @result
401 assert_match "<span id=\"include-param\"></span>", @result
452402 end
453403 end
454404
465415 end
466416
467417 should "include file with empty parameters" do
468 assert_match "<span id='include-param' />", @result
418 assert_match "<span id=\"include-param\"></span>", @result
469419 end
470420 end
471421
482432 end
483433
484434 should "include file with empty parameters within if statement" do
485 assert_match "<span id='include-param' />", @result
435 assert_match "<span id=\"include-param\"></span>", @result
436 end
437 end
438
439 context "with fenced code blocks with backticks" do
440
441 setup do
442 content = <<CONTENT
443 ```ruby
444 puts "Hello world"
445 ```
446 CONTENT
447 create_post(content, {
448 'markdown' => 'maruku',
449 'maruku' => {'fenced_code_blocks' => true}}
450 )
451 end
452
453 should "render fenced code blocks" do
454 assert_match %r{<pre class=\"ruby\"><code class=\"ruby\">puts &quot;Hello world&quot;</code></pre>}, @result.strip
455 end
456 end
457
458 context "include missing file" do
459 setup do
460 @content = <<CONTENT
461 ---
462 title: missing file
463 ---
464
465 {% include missing.html %}
466 CONTENT
467 end
468
469 should "raise error relative to source directory" do
470 exception = assert_raise IOError do
471 create_post(@content, {'permalink' => 'pretty', 'source' => source_dir, 'destination' => dest_dir, 'read_posts' => true})
472 end
473 assert_equal 'Included file \'_includes/missing.html\' not found', exception.message
474 end
475 end
476
477 context "include tag with variable and liquid filters" do
478 setup do
479 stub(Jekyll).configuration do
480 site_configuration({'pygments' => true})
481 end
482
483 site = Site.new(Jekyll.configuration)
484 post = Post.new(site, source_dir, '', "2013-12-17-include-variable-filters.markdown")
485 layouts = { "default" => Layout.new(site, source_dir('_layouts'), "simple.html")}
486 post.render(layouts, {"site" => {"posts" => []}})
487 @content = post.content
488 end
489
490 should "include file as variable with liquid filters" do
491 assert_match %r{1 included}, @content
492 assert_match %r{2 included}, @content
493 assert_match %r{3 included}, @content
494 end
495
496 should "include file as variable and liquid filters with arbitrary whitespace" do
497 assert_match %r{4 included}, @content
498 assert_match %r{5 included}, @content
499 assert_match %r{6 included}, @content
500 end
501
502 should "include file as variable and filters with additional parameters" do
503 assert_match '<li>var1 = foo</li>', @content
504 assert_match '<li>var2 = bar</li>', @content
486505 end
487506 end
488507 end
0 require 'helper'
1
2 class TestUtils < Test::Unit::TestCase
3 context "hash" do
4
5 context "pluralized_array" do
6
7 should "return empty array with no values" do
8 data = {}
9 assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
10 end
11
12 should "return empty array with no matching values" do
13 data = { 'foo' => 'bar' }
14 assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
15 end
16
17 should "return plural array with nil singular" do
18 data = { 'foo' => 'bar', 'tag' => nil, 'tags' => ['dog', 'cat'] }
19 assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
20 end
21
22 should "return single value array with matching singular" do
23 data = { 'foo' => 'bar', 'tag' => 'dog', 'tags' => ['dog', 'cat'] }
24 assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
25 end
26
27 should "return single value array with matching singular with spaces" do
28 data = { 'foo' => 'bar', 'tag' => 'dog cat', 'tags' => ['dog', 'cat'] }
29 assert_equal ['dog cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
30 end
31
32 should "return empty array with matching nil plural" do
33 data = { 'foo' => 'bar', 'tags' => nil }
34 assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
35 end
36
37 should "return empty array with matching empty array" do
38 data = { 'foo' => 'bar', 'tags' => [] }
39 assert_equal [], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
40 end
41
42 should "return single value array with matching plural with single string value" do
43 data = { 'foo' => 'bar', 'tags' => 'dog' }
44 assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
45 end
46
47 should "return multiple value array with matching plural with single string value with spaces" do
48 data = { 'foo' => 'bar', 'tags' => 'dog cat' }
49 assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
50 end
51
52 should "return single value array with matching plural with single value array" do
53 data = { 'foo' => 'bar', 'tags' => ['dog'] }
54 assert_equal ['dog'], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
55 end
56
57 should "return multiple value array with matching plural with multiple value array" do
58 data = { 'foo' => 'bar', 'tags' => ['dog', 'cat'] }
59 assert_equal ['dog', 'cat'], Utils.pluralized_array_from_hash(data, 'tag', 'tags')
60 end
61
62 end
63
64 end
65
66 end