├── bower.json ├── .gitignore ├── .gitattributes ├── test ├── fixtures │ ├── posts │ │ ├── 2014-02-12-bar.md │ │ ├── 2014-01-01-new-year.md │ │ ├── 2013-10-11-foo.md │ │ └── 2013-12-31-last-year.md │ ├── slugs │ │ └── UGLy nAme for SluGiFy.hbs │ ├── ipsum.json │ ├── helpers │ │ ├── relative.js │ │ ├── not.js │ │ ├── rel.js │ │ ├── times.js │ │ ├── navigation.js │ │ ├── pager.js │ │ └── pagination.js │ ├── pages │ │ ├── articles │ │ │ ├── nested │ │ │ │ └── quux.hbs │ │ │ ├── bar.hbs │ │ │ ├── index.hbs │ │ │ └── baz.hbs │ │ ├── foo.hbs │ │ └── index.hbs │ ├── yfm-pages │ │ ├── articles │ │ │ ├── nested │ │ │ │ └── quux.hbs │ │ │ ├── bar.hbs │ │ │ ├── index.hbs │ │ │ └── baz.hbs │ │ ├── foo.hbs │ │ └── index.hbs │ └── default.hbs ├── assets │ └── validation.css └── actual │ ├── filename_replacement │ ├── last-year │ │ └── index.html │ ├── new-year │ │ └── index.html │ ├── bar │ │ └── index.html │ └── foo │ │ └── index.html │ ├── no_opts_flatten │ ├── quux.html │ ├── foo.html │ ├── baz.html │ └── bar.html │ ├── no_opts_files │ └── articles │ │ ├── nested │ │ └── quux.html │ │ ├── index.html │ │ └── baz.html │ └── structure_basename │ └── articles │ ├── nested │ └── quux.html │ ├── index.html │ └── baz.html ├── .travis.yml ├── .editorconfig ├── .verb.md ├── docs ├── quickstart.md ├── seo.md ├── options.md ├── examples.md └── patterns.md ├── LICENSE ├── CHANGELOG ├── package.json ├── index.js └── .eslintrc.json /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "assemble-contrib-permalinks", 3 | "version": "0.4.1", 4 | "main": [ 5 | "index.js" 6 | ] 7 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | node_modules 3 | npm-debug.log 4 | 5 | tmp 6 | temp 7 | TODO.md 8 | 9 | *.sublime-* 10 | 11 | test/actual/random/* -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Enforce Unix newlines 2 | * text eol=lf 3 | 4 | # binaries 5 | *.ai binary 6 | *.psd binary 7 | *.jpg binary 8 | *.gif binary 9 | *.png binary 10 | *.jpeg binary -------------------------------------------------------------------------------- /test/fixtures/posts/2014-02-12-bar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bar 3 | category : snippets 4 | tags : [android, advanced, tutorial] 5 | --- 6 | 7 | # Header 8 | 9 | > Cras sit amet nibh libero, in gravida nulla. 10 | -------------------------------------------------------------------------------- /test/fixtures/posts/2014-01-01-new-year.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: New Year 3 | category : snippets 4 | tags : [php, beginner, tutorial] 5 | --- 6 | 7 | # Header 8 | 9 | > Cras sit amet nibh libero, in gravida nulla. 10 | -------------------------------------------------------------------------------- /test/fixtures/posts/2013-10-11-foo.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Foo 3 | category : lessons 4 | tags : [intro, beginner, assemble, tutorial] 5 | --- 6 | 7 | # Header 8 | 9 | > Cras sit amet nibh libero, in gravida nulla. 10 | -------------------------------------------------------------------------------- /test/fixtures/posts/2013-12-31-last-year.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Last Year 3 | category : snippets 4 | tags : [javascript, beginner, assemble, tutorial] 5 | --- 6 | 7 | # Header 8 | 9 | > Cras sit amet nibh libero, in gravida nulla. 10 | -------------------------------------------------------------------------------- /test/fixtures/slugs/UGLy nAme for SluGiFy.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Ugly 3 | description: Let's see how well this is slugified. 4 | date: 2013-02-13 5 | section: plugins 6 | tags: 7 | - paper 8 | - rock 9 | - scissors 10 | --- 11 |

{{{title}}}

12 |

{{{description}}}

-------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - '6' 5 | - '5' 6 | - '4' 7 | - '0.12' 8 | - '0.10' 9 | matrix: 10 | fast_finish: true 11 | allow_failures: 12 | - node_js: '4' 13 | - node_js: '0.10' 14 | - node_js: '0.12' 15 | git: 16 | depth: 10 17 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | end_of_line = lf 6 | charset = utf-8 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [{,**/}{actual,fixtures,expected,templates}/**/*.*] 12 | trim_trailing_whitespace = false 13 | insert_final_newline = false 14 | -------------------------------------------------------------------------------- /.verb.md: -------------------------------------------------------------------------------- 1 | Also see the [Gruntfile](./Gruntfile.js) for example usage. 2 | 3 | ## Quickstart 4 | {%= doc("quickstart") %} 5 | 6 | ## The "permalinks" plugin 7 | 8 | ### Patterns 9 | {%= doc("patterns") %} 10 | 11 | ### Options 12 | {%= doc("options") %} 13 | 14 | ### Usage Examples 15 | {%= doc("examples") %} 16 | 17 | ### SEO 18 | {%= doc("seo") %} 19 | -------------------------------------------------------------------------------- /test/fixtures/ipsum.json: -------------------------------------------------------------------------------- 1 | { 2 | "words": { 3 | "count": 5, 4 | "units": "words" 5 | }, 6 | "sentence": { 7 | "count": 3, 8 | "units": "sentences", 9 | "sentenceLowerBound": 10, 10 | "sentenceUpperBound": 15, 11 | "format": "html" 12 | }, 13 | "paragraph": { 14 | "count": 3, 15 | "units": "paragraphs", 16 | "sentenceLowerBound": 10, 17 | "sentenceUpperBound": 20, 18 | "format": "html" 19 | } 20 | } -------------------------------------------------------------------------------- /test/fixtures/helpers/relative.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2014 Jon Schlinkert 3 | * Licensed under the MIT License (MIT). 4 | */ 5 | 'use strict'; 6 | 7 | var relative = require('relative'); 8 | 9 | module.exports.register = function (Handlebars) { 10 | /** 11 | * {{relative}} 12 | */ 13 | exports.relative = function(from, to) { 14 | return relative(from, to); 15 | }; 16 | 17 | for (var helper in exports) { 18 | if (exports.hasOwnProperty(helper)) { 19 | Handlebars.registerHelper(helper, exports[helper]); 20 | } 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /test/fixtures/helpers/not.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handlebars Helper: {{not}} 3 | * Copyright (c) 2013 Jon Schlinkert 4 | * Licensed under the MIT License (MIT). 5 | */ 6 | 7 | 'use strict'; 8 | 9 | // Export helpers 10 | module.exports.register = function (Handlebars) { 11 | /** 12 | * {{not}} 13 | */ 14 | exports.not = function (value, test, options) { 15 | if (value !== test) { 16 | return options.fn(this); 17 | } else { 18 | return options.inverse(this); 19 | } 20 | }; 21 | 22 | 23 | for (var helper in exports) { 24 | if (exports.hasOwnProperty(helper)) { 25 | Handlebars.registerHelper(helper, exports[helper]); 26 | } 27 | } 28 | }; 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /test/fixtures/helpers/rel.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handlebars Helpers: {{rel}} 3 | * Copyright (c) 2013 Jon Schlinkert 4 | * Licensed under the MIT License (MIT). 5 | */ 6 | 7 | // Node.js 8 | var path = require('path'); 9 | 10 | // Export helpers 11 | module.exports.register = function (Handlebars) { 12 | 'use strict'; 13 | 14 | /** 15 | * {{rel}} 16 | */ 17 | exports.rel = function(context) { 18 | var newDest = this.dest; 19 | var destDirname = path.dirname(context); 20 | var relativePath = path.relative(path.resolve(destDirname), path.resolve(newDest)); 21 | 22 | return relativePath.replace(/\\/g, '/'); 23 | }; 24 | 25 | for (var helper in exports) { 26 | if (exports.hasOwnProperty(helper)) { 27 | Handlebars.registerHelper(helper, exports[helper]); 28 | } 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /test/fixtures/helpers/times.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handlebars Helpers: {{times}} 3 | * Copyright (c) 2013 Jon Schlinkert 4 | * Licensed under the MIT License (MIT). 5 | */ 6 | 7 | 'use strict'; 8 | 9 | // Export helpers 10 | module.exports.register = function (Handlebars) { 11 | 12 | /** 13 | * {{times}} 14 | */ 15 | exports.times = function(value, options) { 16 | var data, i, content = ""; 17 | 18 | for (i = 1; i <= value; i++) { 19 | if (options.data) { 20 | data = Handlebars.createFrame(options.data || {}); 21 | data.index = i; 22 | } 23 | content = content + options.fn(this, { data: data }); 24 | } 25 | return content; 26 | }; 27 | 28 | for (var helper in exports) { 29 | if (exports.hasOwnProperty(helper)) { 30 | Handlebars.registerHelper(helper, exports[helper]); 31 | } 32 | } 33 | }; 34 | 35 | -------------------------------------------------------------------------------- /docs/quickstart.md: -------------------------------------------------------------------------------- 1 | 2 | From the same directory as your project's [Gruntfile][Getting Started] and [package.json][], install this plugin with the following command: 3 | 4 | ```bash 5 | npm install {%= name %} --save-dev 6 | ``` 7 | 8 | Once that's done, just add `permalinks`, the name of this module, to the `plugins` option in the Assemble task: 9 | 10 | ```js 11 | module.exports = function(grunt) { 12 | 13 | // Project configuration. 14 | grunt.initConfig({ 15 | assemble: { 16 | options: { 17 | plugins: ['{%= name %}', 'other/plugins/*'], 18 | permalinks: { 19 | structure: ':year/:month/:day/:foo/index.html' 20 | } 21 | }, 22 | files: {'blog/archives/': ['archives/*.hbs']} 23 | } 24 | }); 25 | grunt.loadNpmTasks('grunt-assemble'); 26 | grunt.registerTask('default', ['assemble']); 27 | }; 28 | ``` 29 | 30 | If everything was installed and configured correctly, you should be ready to go! 31 | 32 | [grunt]: http://gruntjs.com/ 33 | [Getting Started]: https://github.com/gruntjs/grunt/blob/devel/docs/getting_started.md 34 | [package.json]: https://npmjs.org/doc/json.html 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-2016, Jon Schlinkert 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | v0.3.2: 2 | date: 2013-12-21 3 | changes: 4 | - adds debug option 5 | - adds `:random()` and `:000` special patterns 6 | v0.3.0: 7 | date: 2013-11-28 8 | changes: 9 | - "Updates dependencies to work with Grunt 0.4.2" 10 | - "Adds `:num` permalink structure, for adding numbers to generated pages" 11 | - "Adds `stripnumber` to strip leading numbers from pages. this works well with `:num` for replacing pages that are in order but poorly numbered" 12 | - "Adds documentation for updates" 13 | v0.1.5: 14 | date: 2013-10-09 15 | changes: 16 | - Adds logic to ignore permalink structures for files named "index". Fixes [issue 20](https://github.com/assemble/permalinks/issues/20). 17 | - Updates replacement patterns to use RegExp and word boundaries to minimize potential for moment.js to greedily modify non-date patterns. 18 | v0.1.2: 19 | date: 2013-10-04 20 | changes: 21 | - Adds "presets" per [issue 6](https://github.com/assemble/permalinks/issues/6). 22 | v0.1.1: 23 | date: 2013-10-03 24 | changes: 25 | - Renames "pattern" to "structure". 26 | v0.1.0: 27 | date: 2013-10-03 28 | changes: 29 | - First commmit. 30 | -------------------------------------------------------------------------------- /test/fixtures/helpers/navigation.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handlebars Helpers: {{navigation}} 3 | * Copyright (c) 2013 Jon Schlinkert 4 | * Licensed under the MIT License (MIT). 5 | */ 6 | 7 | 'use strict'; 8 | 9 | // Export helpers 10 | module.exports.register = function (Handlebars, options, params) { 11 | 12 | var opts = options || {}; 13 | var _ = params.grunt.util._; 14 | 15 | /** 16 | * {{navigation}} 17 | * Adds a navigation to enable navigating to prev and next page/post. 18 | * @param {Object} context Context to pass to the helper, most likely `pagination`. 19 | * @param {Object} options Pass a modifier class to the helper. 20 | * @return {String} The navigation, HTML. 21 | */ 22 | exports.navigation = function(context, options) { 23 | 24 | options = options || {}; 25 | options.hash = options.hash || {}; 26 | context = _.extend({modifier: ''}, context, opts.data, this, options.hash); 27 | 28 | var template = [ 29 | '
', 30 | ' {{#eachItems pages}}', 31 | ' ', 32 | ' {{default title basename}}', 33 | ' ', 34 | ' {{/eachItems}}', 35 | '
' 36 | ].join('\n'); 37 | 38 | return new Handlebars.SafeString(Handlebars.compile(template)(context)); 39 | }; 40 | 41 | for (var helper in exports) { 42 | if (exports.hasOwnProperty(helper)) { 43 | Handlebars.registerHelper(helper, exports[helper]); 44 | } 45 | } 46 | }; 47 | -------------------------------------------------------------------------------- /docs/seo.md: -------------------------------------------------------------------------------- 1 | ## Recommendations 2 | 3 | > Permalinks are important for SEO. but you should spend some time thinking about the strategy you want to use before you decide on a URL structure. 4 | 5 | 6 | ### Avoid date-based permalinks 7 | Yep, that's what I said. There are plenty of valid use cases for using date-based URL's. This plugin offers a number of date-based patterns, and we leverage [Moment.js][moment] a lot. Still, I recommend that you avoid using a date-based permalink structure for your blog or documentation, because there is a good chance it will do more harm than good over the long term. 8 | 9 | Date-based URL's tend to _decrease click through rates_ on older articles. Think about it, who prefers reading out of date content? So use a URL strategy that doesn't go out of its way to emphasize the date, and you'l keep your posts feeling like fresh content. 10 | 11 | 12 | ### Numeric permalinks 13 | Numeric or `:id` based permalinks are better than date-based, but they don't really offer much usability or SEO benefit. 14 | 15 | 16 | ### Idiomatic permalinks 17 | The best structure is one that: 18 | 19 | * provides the _highest degree of semantic relevance_ to the content, and 20 | * is _useful to both search engines and humans_ 21 | 22 | Here are some example permalink structures, pick the one you like or feel free to use something else: 23 | 24 | ```js 25 | :author 26 | :category/:author 27 | ``` 28 | 29 | Since the `:author` variable isn't actually built in, you'll need to add it as a custom replacement pattern. But you could use `:filename`, `:pagename`, `:basename` and so on. The important thing to remember is that _the name counts_. 30 | 31 | If you need to use a custom variable, such as `:author` or `:title`, just add it like this: 32 | 33 | ```js 34 | var _str = require('underscore.string'); 35 | 36 | { 37 | assemble: { 38 | options: { 39 | permalinks: { 40 | structure: ':author:ext', 41 | patterns: [ 42 | { 43 | pattern: ':author', 44 | replacement: '<%= _str.slugify(pkg.author.name) %>' 45 | } 46 | ] 47 | } 48 | }, 49 | files: {}, 50 | } 51 | } 52 | ``` 53 | 54 | [moment]: http://momentjs.com/ "Moment.js Permalinks" 55 | -------------------------------------------------------------------------------- /test/fixtures/pages/articles/nested/quux.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quux 3 | author: Jon Schlinkert 4 | slug: quux 5 | date: 2013-04-11 6 | section: blog 7 | categories: 8 | - nested 9 | tags: 10 | - two 11 | --- 12 |

{{{title}}}

13 |

{{{description}}}

14 |
15 |
16 |

laboris ad incididunt et aliquip

17 |
18 |
19 |

Pariatur enim mollit nostrud aute qui consectetur dolore Lorem ad fugiat aute anim aliquip mollit veniam. Magna ad amet eiusmod officia excepteur minim eiusmod fugiat nisi ad do velit nisi consequat ullamco est. Ad nisi veniam cillum excepteur 20 | velit voluptate officia esse velit tempor aliquip. Qui dolor consequat nostrud aute elit elit sunt ea do magna cupidatat nisi. Ea quis aliqua proident Lorem commodo incididunt nulla sint cupidatat nisi excepteur eiusmod aliquip duis in proident 21 | consectetur tempor veniam.

22 |

Voluptate occaecat reprehenderit adipisicing sint enim ut voluptate qui ad. Aute ipsum cillum labore sit in aliqua nulla ullamco exercitation nulla ipsum proident incididunt. Cillum deserunt magna sint ullamco officia veniam fugiat sint do nisi 23 | cillum culpa laboris ut id aute dolor. Excepteur deserunt consectetur nostrud deserunt nostrud irure amet officia minim nostrud ad magna. Voluptate nostrud excepteur enim Lorem adipisicing enim proident incididunt labore anim. Non exercitation 24 | minim sint cupidatat veniam voluptate amet amet veniam adipisicing culpa enim duis eiusmod commodo reprehenderit deserunt. Sit consequat consectetur nostrud esse do quis excepteur consectetur pariatur ea officia occaecat dolor ex.

25 |

Nostrud cupidatat ea non sit id veniam nostrud mollit elit eiusmod pariatur consequat adipisicing ea amet officia reprehenderit nulla. Tempor sunt qui irure do velit culpa consectetur eiusmod duis deserunt. Velit ullamco ipsum aute nisi eiusmod 26 | pariatur ut sit sit Lorem adipisicing exercitation occaecat magna. Laboris ipsum reprehenderit consectetur ullamco excepteur pariatur qui deserunt ut elit eiusmod consectetur proident amet officia anim quis.

27 |
Minim sunt nulla in tempor officia eu consectetur in incididunt est enim in culpa incididunt. Ea non cillum laboris excepteur exercitation veniam sit quis fugiat labore qui et eu eu. Minim quis proident sint id consequat laboris ex minim exercitation 28 | id nisi. 29 |
-------------------------------------------------------------------------------- /test/fixtures/yfm-pages/articles/nested/quux.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quux 3 | author: Jon Schlinkert 4 | slug: quux 5 | date: 2013-04-11 6 | section: blog 7 | categories: 8 | - nested 9 | tags: 10 | - two 11 | permalinks: 12 | structure: ":slug/:YYYY/yfm/:basename:ext" 13 | --- 14 |

{{{title}}}

15 |

{{{description}}}

16 |
17 |
18 |

laboris ad incididunt et aliquip

19 |
20 |
21 |

Pariatur enim mollit nostrud aute qui consectetur dolore Lorem ad fugiat aute anim aliquip mollit veniam. Magna ad amet eiusmod officia excepteur minim eiusmod fugiat nisi ad do velit nisi consequat ullamco est. Ad nisi veniam cillum excepteur 22 | velit voluptate officia esse velit tempor aliquip. Qui dolor consequat nostrud aute elit elit sunt ea do magna cupidatat nisi. Ea quis aliqua proident Lorem commodo incididunt nulla sint cupidatat nisi excepteur eiusmod aliquip duis in proident 23 | consectetur tempor veniam.

24 |

Voluptate occaecat reprehenderit adipisicing sint enim ut voluptate qui ad. Aute ipsum cillum labore sit in aliqua nulla ullamco exercitation nulla ipsum proident incididunt. Cillum deserunt magna sint ullamco officia veniam fugiat sint do nisi 25 | cillum culpa laboris ut id aute dolor. Excepteur deserunt consectetur nostrud deserunt nostrud irure amet officia minim nostrud ad magna. Voluptate nostrud excepteur enim Lorem adipisicing enim proident incididunt labore anim. Non exercitation 26 | minim sint cupidatat veniam voluptate amet amet veniam adipisicing culpa enim duis eiusmod commodo reprehenderit deserunt. Sit consequat consectetur nostrud esse do quis excepteur consectetur pariatur ea officia occaecat dolor ex.

27 |

Nostrud cupidatat ea non sit id veniam nostrud mollit elit eiusmod pariatur consequat adipisicing ea amet officia reprehenderit nulla. Tempor sunt qui irure do velit culpa consectetur eiusmod duis deserunt. Velit ullamco ipsum aute nisi eiusmod 28 | pariatur ut sit sit Lorem adipisicing exercitation occaecat magna. Laboris ipsum reprehenderit consectetur ullamco excepteur pariatur qui deserunt ut elit eiusmod consectetur proident amet officia anim quis.

29 |
Minim sunt nulla in tempor officia eu consectetur in incididunt est enim in culpa incididunt. Ea non cillum laboris excepteur exercitation veniam sit quis fugiat labore qui et eu eu. Minim quis proident sint id consequat laboris ex minim exercitation 30 | id nisi. 31 |
32 | -------------------------------------------------------------------------------- /test/fixtures/pages/articles/bar.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bar 3 | author: Jon Schlinkert 4 | slug: this-is-a-custom-prop 5 | date: 2013-10-03 6 | section: blog 7 | tags: 8 | - bbb 9 | --- 10 |

{{{title}}}

11 |

{{{description}}}

12 | Est exercitation tempor ad sit dolore proident ex aute Lorem dolor. Labore esse reprehenderit sit ea duis consectetur non irure eu quis et. Irure occaecat irure qui sunt veniam cupidatat mollit adipisicing in qui cupidatat excepteur cupidatat. 13 |
14 |
15 |

dolore dolor et adipisicing ea

16 |
17 |
18 |

Do aute sunt est ea laborum tempor nostrud ad amet non consequat Lorem cupidatat anim. Amet velit ad consequat deserunt ullamco et non commodo laboris ex ut deserunt. Sunt nisi proident occaecat qui ipsum sunt cillum nisi aliqua incididunt consectetur 19 | excepteur dolor sint ipsum pariatur. Nostrud elit deserunt reprehenderit culpa irure in consequat excepteur nulla quis commodo id ad officia ex aliqua laboris veniam. Ullamco ex ut veniam aliqua dolor aliquip consectetur dolor in cillum ut 20 | et sint duis amet.

21 |

Nisi exercitation deserunt aliqua in eu non qui aute dolore sunt cupidatat Lorem. Excepteur duis cupidatat culpa Lorem aliquip ex commodo aute exercitation. Voluptate eiusmod in ad velit deserunt ea enim ad magna officia veniam adipisicing. 22 | Consequat sunt quis laboris excepteur ex reprehenderit duis laboris officia quis pariatur aliqua ipsum amet amet. Culpa veniam et cillum nisi fugiat minim ut laborum cillum voluptate amet proident minim. Occaecat et non sint Lorem anim Lorem 23 | adipisicing deserunt reprehenderit. Magna in nulla sunt sint consectetur in ullamco nulla veniam et ex adipisicing dolor aliquip nostrud fugiat qui.

24 |

Nostrud aliqua tempor velit enim quis ut aliqua eu labore sit cillum laborum cupidatat est esse deserunt. Minim ad laborum ex exercitation sit sunt labore eu Lorem nulla non occaecat. Consectetur occaecat consectetur nulla deserunt officia dolor 25 | et magna consequat ad excepteur irure minim exercitation sit magna culpa voluptate. Laborum consectetur ut duis quis elit id laboris ullamco amet ut consectetur voluptate aliquip excepteur ullamco et ipsum.

26 |
Labore voluptate excepteur quis nulla adipisicing mollit reprehenderit tempor ipsum duis sunt reprehenderit officia. Ipsum deserunt nulla sint deserunt eiusmod nulla reprehenderit id quis. Esse pariatur Lorem Lorem non irure enim veniam duis 27 | ea veniam nisi nisi eiusmod. 28 |
-------------------------------------------------------------------------------- /test/fixtures/pages/foo.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Foo Foo 3 | slug: custom/path 4 | date: 2013-10-03 5 | section: plugins 6 | tags: 7 | - one 8 | --- 9 |

{{title}}

10 | Aliquip id aute tempor dolore non non elit elit mollit do est tempor voluptate minim. Ut magna do dolor sit aliqua proident duis nulla eu consectetur id. Consectetur ullamco ullamco exercitation esse nostrud id duis duis ex fugiat voluptate. 11 |
12 |
13 |

proident non consequat aliquip et

14 |
15 |
16 |

Nisi occaecat est excepteur tempor enim pariatur in dolore magna magna. Sunt non eiusmod ex veniam incididunt consequat culpa consequat esse aliquip ex sunt mollit officia veniam deserunt tempor laboris. Nulla aliqua id do id mollit eiusmod 17 | id excepteur culpa magna aute aute elit nostrud ullamco. Dolor deserunt ea do incididunt et eiusmod fugiat commodo qui laborum. Sint deserunt fugiat ullamco magna magna quis veniam non amet elit.

18 |

Esse amet adipisicing dolor sunt pariatur sint enim sunt occaecat. Dolore culpa ea aliqua non laboris excepteur enim consectetur minim sit enim cupidatat esse deserunt tempor. Fugiat cupidatat ut fugiat aute fugiat et excepteur incididunt consequat 19 | enim ullamco dolore cupidatat dolore ut velit incididunt aliqua. Occaecat consequat sunt aliqua exercitation deserunt culpa eiusmod eu exercitation exercitation Lorem consequat velit. Cillum aute Lorem consectetur veniam dolor dolor officia 20 | aute incididunt ad laboris nostrud aute do incididunt. Excepteur est aliquip ullamco fugiat fugiat aliquip do est elit qui ea nisi deserunt adipisicing in fugiat. Dolore in magna nostrud do non mollit cupidatat ea aliqua aute ut.

21 |

Officia et deserunt tempor commodo aliqua enim labore aliquip minim ea laboris magna dolor ullamco. Magna eiusmod sit adipisicing tempor eiusmod laboris consectetur duis consectetur enim esse laboris. Ex cupidatat nulla non laboris duis nisi 22 | amet ipsum duis duis est anim do minim aliqua cillum aliquip excepteur. Commodo aute excepteur fugiat mollit aliqua eiusmod commodo mollit sunt quis anim mollit ipsum reprehenderit ex aute. Consectetur laborum labore irure eiusmod excepteur 23 | adipisicing ut est cupidatat consectetur commodo est ea do qui fugiat.

24 |
Mollit id duis cillum eu ex incididunt pariatur exercitation ullamco consequat nostrud. Eiusmod consequat non quis ad mollit ad in mollit veniam amet aliqua duis non. Amet deserunt labore deserunt enim qui eu sit proident anim minim do est. 25 |
-------------------------------------------------------------------------------- /test/fixtures/yfm-pages/articles/bar.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bar 3 | author: Jon Schlinkert 4 | slug: this-is-a-custom-prop 5 | date: 2013-10-03 6 | section: blog 7 | tags: 8 | - bbb 9 | permalinks: 10 | preset: pretty 11 | --- 12 |

{{{title}}}

13 |

{{{description}}}

14 | Est exercitation tempor ad sit dolore proident ex aute Lorem dolor. Labore esse reprehenderit sit ea duis consectetur non irure eu quis et. Irure occaecat irure qui sunt veniam cupidatat mollit adipisicing in qui cupidatat excepteur cupidatat. 15 |
16 |
17 |

dolore dolor et adipisicing ea

18 |
19 |
20 |

Do aute sunt est ea laborum tempor nostrud ad amet non consequat Lorem cupidatat anim. Amet velit ad consequat deserunt ullamco et non commodo laboris ex ut deserunt. Sunt nisi proident occaecat qui ipsum sunt cillum nisi aliqua incididunt consectetur 21 | excepteur dolor sint ipsum pariatur. Nostrud elit deserunt reprehenderit culpa irure in consequat excepteur nulla quis commodo id ad officia ex aliqua laboris veniam. Ullamco ex ut veniam aliqua dolor aliquip consectetur dolor in cillum ut 22 | et sint duis amet.

23 |

Nisi exercitation deserunt aliqua in eu non qui aute dolore sunt cupidatat Lorem. Excepteur duis cupidatat culpa Lorem aliquip ex commodo aute exercitation. Voluptate eiusmod in ad velit deserunt ea enim ad magna officia veniam adipisicing. 24 | Consequat sunt quis laboris excepteur ex reprehenderit duis laboris officia quis pariatur aliqua ipsum amet amet. Culpa veniam et cillum nisi fugiat minim ut laborum cillum voluptate amet proident minim. Occaecat et non sint Lorem anim Lorem 25 | adipisicing deserunt reprehenderit. Magna in nulla sunt sint consectetur in ullamco nulla veniam et ex adipisicing dolor aliquip nostrud fugiat qui.

26 |

Nostrud aliqua tempor velit enim quis ut aliqua eu labore sit cillum laborum cupidatat est esse deserunt. Minim ad laborum ex exercitation sit sunt labore eu Lorem nulla non occaecat. Consectetur occaecat consectetur nulla deserunt officia dolor 27 | et magna consequat ad excepteur irure minim exercitation sit magna culpa voluptate. Laborum consectetur ut duis quis elit id laboris ullamco amet ut consectetur voluptate aliquip excepteur ullamco et ipsum.

28 |
Labore voluptate excepteur quis nulla adipisicing mollit reprehenderit tempor ipsum duis sunt reprehenderit officia. Ipsum deserunt nulla sint deserunt eiusmod nulla reprehenderit id quis. Esse pariatur Lorem Lorem non irure enim veniam duis 29 | ea veniam nisi nisi eiusmod. 30 |
31 | -------------------------------------------------------------------------------- /test/fixtures/pages/articles/index.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Category Index 3 | description: Index page nested in a directory. 4 | slug: category-page 5 | section: blog 6 | date: 2013-10-02 7 | tags: 8 | - three 9 | --- 10 |

{{{title}}}

11 |

{{{description}}}

12 | Exercitation ex incididunt cupidatat ad sit laboris aliqua aliquip irure veniam ipsum et et. Consectetur labore reprehenderit aliquip eu laborum adipisicing exercitation aliqua in anim adipisicing. Dolore deserunt ex dolor cillum ullamco fugiat dolore 13 | excepteur cillum esse id non. 14 |
15 |
16 |

nulla duis tempor Lorem est

17 |
18 |
19 |

Deserunt culpa mollit duis id deserunt Lorem aliqua ullamco cupidatat aliquip exercitation qui incididunt amet. Velit amet eiusmod labore mollit exercitation velit anim voluptate ex anim. Non eu ipsum duis elit commodo quis sunt enim non ipsum 20 | ipsum ex est do.

21 |

Occaecat cupidatat ea enim elit incididunt qui voluptate ex minim dolor ex. Consectetur tempor ex ea eiusmod esse in incididunt ut veniam quis tempor ullamco deserunt magna consequat ut commodo. Voluptate consectetur magna nisi esse laboris 22 | eu quis amet sit fugiat reprehenderit in ex mollit velit in consectetur officia ut. Anim ipsum proident dolor excepteur eiusmod esse deserunt velit eu amet. Ex ipsum anim est ut dolore irure sint culpa minim exercitation enim in cillum. Pariatur 23 | reprehenderit aliquip proident exercitation quis irure nostrud officia sit dolor ullamco Lorem tempor.

24 |

Dolore magna occaecat nulla veniam non Lorem ex eiusmod est pariatur esse quis proident ipsum qui deserunt et ipsum. Voluptate eu proident commodo ullamco proident Lorem incididunt id exercitation velit qui aliquip. Nulla pariatur id ad proident 25 | cupidatat non proident sit laborum velit laboris proident aute reprehenderit. Consectetur commodo eiusmod fugiat qui pariatur non commodo Lorem amet tempor excepteur consectetur enim. Culpa laborum nulla magna officia anim amet incididunt 26 | excepteur do dolor. Dolore commodo cupidatat commodo sit cupidatat ea proident reprehenderit ad elit qui id eiusmod. Voluptate pariatur anim anim incididunt ut adipisicing ex occaecat deserunt adipisicing enim eiusmod ipsum pariatur ut irure 27 | fugiat.

28 |
Proident proident amet dolore do ullamco aliquip incididunt Lorem aliquip ex laborum qui. Aute esse non dolor velit fugiat proident aute sit irure minim aute ut. Id mollit quis enim laboris sunt do nisi mollit cupidatat non reprehenderit deserunt 29 | commodo pariatur. 30 |
-------------------------------------------------------------------------------- /test/fixtures/yfm-pages/articles/index.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Category Index 3 | description: Index page nested in a directory. 4 | slug: category-page 5 | section: blog 6 | date: 2013-10-02 7 | tags: 8 | - three 9 | --- 10 |

{{{title}}}

11 |

{{{description}}}

12 | Exercitation ex incididunt cupidatat ad sit laboris aliqua aliquip irure veniam ipsum et et. Consectetur labore reprehenderit aliquip eu laborum adipisicing exercitation aliqua in anim adipisicing. Dolore deserunt ex dolor cillum ullamco fugiat dolore 13 | excepteur cillum esse id non. 14 |
15 |
16 |

nulla duis tempor Lorem est

17 |
18 |
19 |

Deserunt culpa mollit duis id deserunt Lorem aliqua ullamco cupidatat aliquip exercitation qui incididunt amet. Velit amet eiusmod labore mollit exercitation velit anim voluptate ex anim. Non eu ipsum duis elit commodo quis sunt enim non ipsum 20 | ipsum ex est do.

21 |

Occaecat cupidatat ea enim elit incididunt qui voluptate ex minim dolor ex. Consectetur tempor ex ea eiusmod esse in incididunt ut veniam quis tempor ullamco deserunt magna consequat ut commodo. Voluptate consectetur magna nisi esse laboris 22 | eu quis amet sit fugiat reprehenderit in ex mollit velit in consectetur officia ut. Anim ipsum proident dolor excepteur eiusmod esse deserunt velit eu amet. Ex ipsum anim est ut dolore irure sint culpa minim exercitation enim in cillum. Pariatur 23 | reprehenderit aliquip proident exercitation quis irure nostrud officia sit dolor ullamco Lorem tempor.

24 |

Dolore magna occaecat nulla veniam non Lorem ex eiusmod est pariatur esse quis proident ipsum qui deserunt et ipsum. Voluptate eu proident commodo ullamco proident Lorem incididunt id exercitation velit qui aliquip. Nulla pariatur id ad proident 25 | cupidatat non proident sit laborum velit laboris proident aute reprehenderit. Consectetur commodo eiusmod fugiat qui pariatur non commodo Lorem amet tempor excepteur consectetur enim. Culpa laborum nulla magna officia anim amet incididunt 26 | excepteur do dolor. Dolore commodo cupidatat commodo sit cupidatat ea proident reprehenderit ad elit qui id eiusmod. Voluptate pariatur anim anim incididunt ut adipisicing ex occaecat deserunt adipisicing enim eiusmod ipsum pariatur ut irure 27 | fugiat.

28 |
Proident proident amet dolore do ullamco aliquip incididunt Lorem aliquip ex laborum qui. Aute esse non dolor velit fugiat proident aute sit irure minim aute ut. Id mollit quis enim laboris sunt do nisi mollit cupidatat non reprehenderit deserunt 29 | commodo pariatur. 30 |
-------------------------------------------------------------------------------- /test/fixtures/yfm-pages/foo.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Foo Foo 3 | slug: custom/path 4 | date: 2013-10-03 5 | section: plugins 6 | tags: 7 | - one 8 | permalinks: 9 | preset: pretty 10 | structure: ":section" 11 | --- 12 |

{{title}}

13 | Aliquip id aute tempor dolore non non elit elit mollit do est tempor voluptate minim. Ut magna do dolor sit aliqua proident duis nulla eu consectetur id. Consectetur ullamco ullamco exercitation esse nostrud id duis duis ex fugiat voluptate. 14 |
15 |
16 |

proident non consequat aliquip et

17 |
18 |
19 |

Nisi occaecat est excepteur tempor enim pariatur in dolore magna magna. Sunt non eiusmod ex veniam incididunt consequat culpa consequat esse aliquip ex sunt mollit officia veniam deserunt tempor laboris. Nulla aliqua id do id mollit eiusmod 20 | id excepteur culpa magna aute aute elit nostrud ullamco. Dolor deserunt ea do incididunt et eiusmod fugiat commodo qui laborum. Sint deserunt fugiat ullamco magna magna quis veniam non amet elit.

21 |

Esse amet adipisicing dolor sunt pariatur sint enim sunt occaecat. Dolore culpa ea aliqua non laboris excepteur enim consectetur minim sit enim cupidatat esse deserunt tempor. Fugiat cupidatat ut fugiat aute fugiat et excepteur incididunt consequat 22 | enim ullamco dolore cupidatat dolore ut velit incididunt aliqua. Occaecat consequat sunt aliqua exercitation deserunt culpa eiusmod eu exercitation exercitation Lorem consequat velit. Cillum aute Lorem consectetur veniam dolor dolor officia 23 | aute incididunt ad laboris nostrud aute do incididunt. Excepteur est aliquip ullamco fugiat fugiat aliquip do est elit qui ea nisi deserunt adipisicing in fugiat. Dolore in magna nostrud do non mollit cupidatat ea aliqua aute ut.

24 |

Officia et deserunt tempor commodo aliqua enim labore aliquip minim ea laboris magna dolor ullamco. Magna eiusmod sit adipisicing tempor eiusmod laboris consectetur duis consectetur enim esse laboris. Ex cupidatat nulla non laboris duis nisi 25 | amet ipsum duis duis est anim do minim aliqua cillum aliquip excepteur. Commodo aute excepteur fugiat mollit aliqua eiusmod commodo mollit sunt quis anim mollit ipsum reprehenderit ex aute. Consectetur laborum labore irure eiusmod excepteur 26 | adipisicing ut est cupidatat consectetur commodo est ea do qui fugiat.

27 |
Mollit id duis cillum eu ex incididunt pariatur exercitation ullamco consequat nostrud. Eiusmod consequat non quis ad mollit ad in mollit veniam amet aliqua duis non. Amet deserunt labore deserunt enim qui eu sit proident anim minim do est. 28 |
29 | -------------------------------------------------------------------------------- /test/fixtures/pages/index.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Home 3 | description: This is the home page! 4 | slug: home-page 5 | date: 2013-10-01 6 | section: plugins 7 | tags: 8 | - one 9 | - three 10 | --- 11 |

{{{title}}}

12 |

{{{description}}}

13 | Non in ut Lorem exercitation eiusmod sit adipisicing commodo velit occaecat laboris enim. Exercitation id laborum magna enim incididunt reprehenderit sit ullamco eiusmod aute velit deserunt. Dolore ex exercitation minim eu elit enim et do aliqua adipisicing 14 | anim Lorem anim. 15 |
16 |
17 |

pariatur eu voluptate duis cupidatat

18 |
19 |
20 |

Do esse nulla magna eu excepteur ex Lorem Lorem voluptate fugiat incididunt mollit et proident. Voluptate deserunt Lorem irure excepteur dolore duis cillum proident ad anim id labore dolore laboris nisi sit voluptate. Lorem enim labore amet 21 | anim adipisicing velit aliquip Lorem adipisicing labore eiusmod consectetur anim do quis adipisicing mollit. Id occaecat sit cillum est reprehenderit elit nisi enim incididunt reprehenderit eu adipisicing. Ipsum anim consectetur est cillum 22 | minim id ipsum eiusmod in ut eiusmod ut est elit anim. Do do occaecat consequat do adipisicing tempor sit eu labore ad ullamco ullamco deserunt non.

23 |

Officia laboris non ea ullamco ex deserunt aute dolor incididunt voluptate reprehenderit. Sint tempor velit culpa proident enim laborum eiusmod cupidatat id sint sit qui occaecat occaecat officia fugiat esse ad minim. Labore tempor excepteur 24 | deserunt commodo sit excepteur cupidatat irure fugiat labore Lorem quis aute ex excepteur cupidatat ex. Laboris nostrud nulla aute dolor ullamco quis Lorem sint tempor cupidatat laborum amet ut. Deserunt magna id nisi anim voluptate officia 25 | minim sunt dolore amet reprehenderit.

26 |

Est pariatur est commodo officia voluptate ea adipisicing ullamco veniam reprehenderit enim duis aute fugiat. Incididunt sit eiusmod id occaecat id dolor ullamco occaecat commodo culpa laborum eu pariatur ullamco eu occaecat. Deserunt Lorem 27 | nisi labore incididunt in proident ex do in est et Lorem. Excepteur cillum excepteur tempor eiusmod amet esse est Lorem sint laborum sunt. Minim consequat consequat incididunt do labore consequat nulla commodo occaecat deserunt aute exercitation 28 | reprehenderit. Adipisicing veniam commodo ea minim eu consequat irure sunt nisi tempor in ut est ea ex non.

29 |
Incididunt ut adipisicing voluptate tempor occaecat ad duis excepteur Lorem proident. Excepteur elit ea id velit et adipisicing occaecat est aute deserunt. Id ea minim minim voluptate veniam nisi dolore voluptate ipsum duis nulla magna. 30 |
-------------------------------------------------------------------------------- /test/fixtures/yfm-pages/index.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Home 3 | description: This is the home page! 4 | slug: home-page 5 | date: 2013-10-01 6 | section: plugins 7 | tags: 8 | - one 9 | - three 10 | --- 11 |

{{{title}}}

12 |

{{{description}}}

13 | Non in ut Lorem exercitation eiusmod sit adipisicing commodo velit occaecat laboris enim. Exercitation id laborum magna enim incididunt reprehenderit sit ullamco eiusmod aute velit deserunt. Dolore ex exercitation minim eu elit enim et do aliqua adipisicing 14 | anim Lorem anim. 15 |
16 |
17 |

pariatur eu voluptate duis cupidatat

18 |
19 |
20 |

Do esse nulla magna eu excepteur ex Lorem Lorem voluptate fugiat incididunt mollit et proident. Voluptate deserunt Lorem irure excepteur dolore duis cillum proident ad anim id labore dolore laboris nisi sit voluptate. Lorem enim labore amet 21 | anim adipisicing velit aliquip Lorem adipisicing labore eiusmod consectetur anim do quis adipisicing mollit. Id occaecat sit cillum est reprehenderit elit nisi enim incididunt reprehenderit eu adipisicing. Ipsum anim consectetur est cillum 22 | minim id ipsum eiusmod in ut eiusmod ut est elit anim. Do do occaecat consequat do adipisicing tempor sit eu labore ad ullamco ullamco deserunt non.

23 |

Officia laboris non ea ullamco ex deserunt aute dolor incididunt voluptate reprehenderit. Sint tempor velit culpa proident enim laborum eiusmod cupidatat id sint sit qui occaecat occaecat officia fugiat esse ad minim. Labore tempor excepteur 24 | deserunt commodo sit excepteur cupidatat irure fugiat labore Lorem quis aute ex excepteur cupidatat ex. Laboris nostrud nulla aute dolor ullamco quis Lorem sint tempor cupidatat laborum amet ut. Deserunt magna id nisi anim voluptate officia 25 | minim sunt dolore amet reprehenderit.

26 |

Est pariatur est commodo officia voluptate ea adipisicing ullamco veniam reprehenderit enim duis aute fugiat. Incididunt sit eiusmod id occaecat id dolor ullamco occaecat commodo culpa laborum eu pariatur ullamco eu occaecat. Deserunt Lorem 27 | nisi labore incididunt in proident ex do in est et Lorem. Excepteur cillum excepteur tempor eiusmod amet esse est Lorem sint laborum sunt. Minim consequat consequat incididunt do labore consequat nulla commodo occaecat deserunt aute exercitation 28 | reprehenderit. Adipisicing veniam commodo ea minim eu consequat irure sunt nisi tempor in ut est ea ex non.

29 |
Incididunt ut adipisicing voluptate tempor occaecat ad duis excepteur Lorem proident. Excepteur elit ea id velit et adipisicing occaecat est aute deserunt. Id ea minim minim voluptate veniam nisi dolore voluptate ipsum duis nulla magna. 30 |
-------------------------------------------------------------------------------- /test/fixtures/pages/articles/baz.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Baz 3 | description: "Suprising discovery! Contrary to popular belief, ice in the arctic tundra was found to be below freezing temperatures." 4 | author: Jon Schlinkert 5 | slug: custom-prop 6 | section: blog 7 | date: 2013-10-03 8 | categories: 9 | - zzz 10 | - yyy 11 | --- 12 |

{{{title}}}

13 |

{{{description}}}

14 | Ullamco elit non id amet ex ut ea dolor ipsum. Adipisicing deserunt non reprehenderit anim deserunt in nisi voluptate laborum labore fugiat et fugiat cillum. Est anim ea ea amet eu sit ut dolor in. 15 |
16 |
17 |

deserunt minim labore qui consequat

18 |
19 |
20 |

Laboris reprehenderit commodo sit mollit magna occaecat id qui tempor do irure adipisicing eu amet culpa. Quis enim ut fugiat ea est fugiat excepteur eiusmod exercitation do. Occaecat excepteur consectetur nisi et et aliqua fugiat sunt laborum 21 | magna commodo amet consequat. Cupidatat dolore nisi qui pariatur excepteur occaecat elit ut nulla. Culpa aute ipsum magna consequat minim ullamco cupidatat magna labore amet est laboris enim nisi. Qui et officia enim qui voluptate reprehenderit 22 | nostrud veniam veniam in exercitation do excepteur id. Veniam sint qui amet deserunt sint aliqua adipisicing labore deserunt do non adipisicing do ex non reprehenderit voluptate.

23 |

Veniam dolor Lorem eu Lorem cillum in do pariatur eu ipsum ipsum labore nostrud ex tempor pariatur cillum. Eiusmod id velit laboris excepteur laborum minim nostrud do culpa sint ullamco commodo ipsum adipisicing sint ipsum. Ad exercitation do 24 | Lorem enim dolore non quis Lorem anim ex minim ex anim amet. Proident minim esse magna fugiat in incididunt dolore amet do consectetur exercitation excepteur dolor consequat cillum adipisicing ea.

25 |

Non officia proident sit quis laboris Lorem fugiat commodo et excepteur cupidatat tempor nostrud non sunt amet cillum sint. Et tempor deserunt nulla proident ad eu id culpa amet sunt esse nulla quis velit culpa qui id. Veniam cupidatat excepteur 26 | Lorem est proident laboris pariatur fugiat ipsum voluptate magna labore labore ea sint ut. Elit eu exercitation est occaecat est pariatur tempor voluptate sit esse laborum non ut eu nostrud pariatur quis aliquip. Velit ut ex adipisicing do 27 | occaecat officia excepteur exercitation quis duis mollit sit veniam deserunt quis reprehenderit tempor.

28 |
Ipsum amet exercitation excepteur anim enim occaecat culpa ex id sit ipsum anim velit minim. Veniam elit enim in ipsum nisi irure et minim mollit voluptate non fugiat laboris. Fugiat commodo Lorem dolore mollit commodo voluptate amet deserunt 29 | in anim nostrud do. 30 |
-------------------------------------------------------------------------------- /test/fixtures/yfm-pages/articles/baz.hbs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Baz 3 | description: "Suprising discovery! Contrary to popular belief, ice in the arctic tundra was found to be below freezing temperatures." 4 | author: Jon Schlinkert 5 | slug: custom-prop 6 | section: blog 7 | date: 2013-10-03 8 | categories: 9 | - zzz 10 | - yyy 11 | permalinks: 12 | preset: pretty 13 | --- 14 |

{{{title}}}

15 |

{{{description}}}

16 | Ullamco elit non id amet ex ut ea dolor ipsum. Adipisicing deserunt non reprehenderit anim deserunt in nisi voluptate laborum labore fugiat et fugiat cillum. Est anim ea ea amet eu sit ut dolor in. 17 |
18 |
19 |

deserunt minim labore qui consequat

20 |
21 |
22 |

Laboris reprehenderit commodo sit mollit magna occaecat id qui tempor do irure adipisicing eu amet culpa. Quis enim ut fugiat ea est fugiat excepteur eiusmod exercitation do. Occaecat excepteur consectetur nisi et et aliqua fugiat sunt laborum 23 | magna commodo amet consequat. Cupidatat dolore nisi qui pariatur excepteur occaecat elit ut nulla. Culpa aute ipsum magna consequat minim ullamco cupidatat magna labore amet est laboris enim nisi. Qui et officia enim qui voluptate reprehenderit 24 | nostrud veniam veniam in exercitation do excepteur id. Veniam sint qui amet deserunt sint aliqua adipisicing labore deserunt do non adipisicing do ex non reprehenderit voluptate.

25 |

Veniam dolor Lorem eu Lorem cillum in do pariatur eu ipsum ipsum labore nostrud ex tempor pariatur cillum. Eiusmod id velit laboris excepteur laborum minim nostrud do culpa sint ullamco commodo ipsum adipisicing sint ipsum. Ad exercitation do 26 | Lorem enim dolore non quis Lorem anim ex minim ex anim amet. Proident minim esse magna fugiat in incididunt dolore amet do consectetur exercitation excepteur dolor consequat cillum adipisicing ea.

27 |

Non officia proident sit quis laboris Lorem fugiat commodo et excepteur cupidatat tempor nostrud non sunt amet cillum sint. Et tempor deserunt nulla proident ad eu id culpa amet sunt esse nulla quis velit culpa qui id. Veniam cupidatat excepteur 28 | Lorem est proident laboris pariatur fugiat ipsum voluptate magna labore labore ea sint ut. Elit eu exercitation est occaecat est pariatur tempor voluptate sit esse laborum non ut eu nostrud pariatur quis aliquip. Velit ut ex adipisicing do 29 | occaecat officia excepteur exercitation quis duis mollit sit veniam deserunt quis reprehenderit tempor.

30 |
Ipsum amet exercitation excepteur anim enim occaecat culpa ex id sit ipsum anim velit minim. Veniam elit enim in ipsum nisi irure et minim mollit voluptate non fugiat laboris. Fugiat commodo Lorem dolore mollit commodo voluptate amet deserunt 31 | in anim nostrud do. 32 |
33 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grunt-assemble-permalinks", 3 | "description": "Permalinks plugin for Assemble, the static site generator for Grunt.js, Yeoman and Node.js. This plugin enables powerful and configurable URI patterns, [Moment.js](http://momentjs.com/) for parsing dates, much more.", 4 | "version": "0.1.1", 5 | "homepage": "https://github.com/assemble/grunt-assemble-permalinks", 6 | "author": "Jon Schlinkert (https://github.com/jonschlinkert)", 7 | "repository": "assemble/grunt-assemble-permalinks", 8 | "bugs": { 9 | "url": "https://github.com/assemble/grunt-assemble-permalinks/issues" 10 | }, 11 | "license": "MIT", 12 | "files": [ 13 | "index.js", 14 | "LICENSE", 15 | "README.md" 16 | ], 17 | "main": "index.js", 18 | "engines": { 19 | "node": ">= 0.8.0" 20 | }, 21 | "dependencies": { 22 | "arr-union": "^3.1.0", 23 | "async-each": "^1.0.0", 24 | "calculate-assets": "^0.1.2", 25 | "helper-slugify": "^0.2.0", 26 | "mixin-deep": "^1.1.3", 27 | "object.omit": "^2.0.0", 28 | "permalinks": "~0.2.0" 29 | }, 30 | "devDependencies": { 31 | "grunt": "^1.0.1", 32 | "grunt-assemble": "^0.4.0", 33 | "grunt-contrib-clean": "^1.0.0", 34 | "grunt-contrib-jshint": "^1.0.0", 35 | "grunt-prettify": "^0.4.0", 36 | "gulp-format-md": "^0.1.9", 37 | "handlebars-helper-eachitems": "^0.1.2", 38 | "handlebars-helper-paginate": "^0.2.0" 39 | }, 40 | "keywords": [ 41 | "assemble", 42 | "assemblecollection", 43 | "assembleplugin", 44 | "blog", 45 | "front", 46 | "generator", 47 | "grunt", 48 | "handlebars-helper-eachitems", 49 | "handlebars-helper-paginate", 50 | "links", 51 | "matter", 52 | "moment", 53 | "moment.js", 54 | "parse", 55 | "permalink", 56 | "permalinks", 57 | "post", 58 | "pretty", 59 | "SEO", 60 | "site", 61 | "slug", 62 | "static", 63 | "uri", 64 | "url", 65 | "yaml" 66 | ], 67 | "verb": { 68 | "related": { 69 | "list": [ 70 | "grunt-assemble", 71 | "grunt-assemble-anchors", 72 | "grunt-assemble-contextual", 73 | "grunt-assemble-decompress", 74 | "grunt-assemble-download", 75 | "grunt-assemble-i18n", 76 | "grunt-assemble-lunr", 77 | "grunt-assemble-navigation", 78 | "grunt-assemble-permalinks", 79 | "grunt-assemble-sitemap", 80 | "grunt-assemble-toc", 81 | "grunt-assemble-wordcount" 82 | ] 83 | }, 84 | "toc": true, 85 | "layout": "default", 86 | "tasks": [ 87 | "readme" 88 | ], 89 | "plugins": [ 90 | "gulp-format-md" 91 | ], 92 | "lint": { 93 | "reflinks": true 94 | }, 95 | "reflinks": [ 96 | "verb", 97 | "verb-generate-readme" 98 | ] 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /test/fixtures/helpers/pager.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handlebars Helpers: {{pager}} 3 | * Copyright (c) 2013 Jon Schlinkert 4 | * Licensed under the MIT License (MIT). 5 | */ 6 | 7 | 'use strict'; 8 | 9 | // Export helpers 10 | module.exports.register = function (Handlebars, options, params) { 11 | 12 | var opts = options || {}; 13 | var _ = params.grunt.util._; 14 | 15 | /** 16 | * {{pager}} 17 | * Adds a pager to enable navigating to prev and next page/post. 18 | * @param {Object} context Context to pass to the helper, most likely `pagination`. 19 | * @param {Object} options Pass a modifier class to the helper. 20 | * @return {String} The pager, HTML. 21 | */ 22 | exports.pager = function(context, options) { 23 | options = options || {}; 24 | options.hash = options.hash || {}; 25 | context = _.extend({modifier: ''}, context, opts.data, this, options.hash); 26 | 27 | var template = [ 28 | '' 73 | ].join('\n'); 74 | 75 | return new Handlebars.SafeString(Handlebars.compile(template)(context)); 76 | }; 77 | 78 | for (var helper in exports) { 79 | if (exports.hasOwnProperty(helper)) { 80 | Handlebars.registerHelper(helper, exports[helper]); 81 | } 82 | } 83 | }; 84 | -------------------------------------------------------------------------------- /test/fixtures/helpers/pagination.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handlebars Helpers: {{pagination}} 3 | * Copyright (c) 2013 Jon Schlinkert 4 | * Licensed under the MIT License (MIT). 5 | */ 6 | 7 | 'use strict'; 8 | 9 | // Export helpers 10 | module.exports.register = function (Handlebars, options, params) { 11 | 12 | var opts = options || {}; 13 | var _ = params.grunt.util._; 14 | 15 | /** 16 | * {{pagination}} 17 | * Adds a pagination to enable navigating to prev and next page/post. 18 | * @param {Object} context Context to pass to the helper, most likely `pagination`. 19 | * @param {Object} options Pass a modifier class to the helper. 20 | * @return {String} The pagination, HTML. 21 | */ 22 | exports.pagination = function(context, options) { 23 | options = options || {}; 24 | options.hash = options.hash || {}; 25 | context = _.extend({modifier: ''}, context, opts.data, this, options.hash); 26 | 27 | var template = [ 28 | '' 73 | ].join('\n'); 74 | 75 | return new Handlebars.SafeString(Handlebars.compile(template)(context)); 76 | }; 77 | 78 | for (var helper in exports) { 79 | if (exports.hasOwnProperty(helper)) { 80 | Handlebars.registerHelper(helper, exports[helper]); 81 | } 82 | } 83 | }; 84 | -------------------------------------------------------------------------------- /docs/options.md: -------------------------------------------------------------------------------- 1 | _Note that this plugin does not currently modify actual links inside pages, so that will need to be addressed separately. I'm also willing to look at options for incorporating that into this plugin._ 2 | 3 | ## structure 4 | Type: `String` 5 | Default: `undefined` 6 | 7 | The permalink pattern to use for building paths and generated files. Permalink structures are appended to the `dest` defined for the current target. 8 | 9 | For example, let's say we use the following pattern on a few blog posts: `foo.hbs`, `bar.hbs`, and `baz.hbs`: 10 | 11 | ```js 12 | options: { 13 | permalinks: { 14 | structure: ':year/:month/:day/:basename:ext', 15 | }, 16 | files: { 17 | './blog/': ['./templates/blog/*.hbs'] 18 | } 19 | } 20 | // results in 21 | // => './blog/2014/01/01/foo.html' 22 | // => './blog/2014/01/01/bar.html' 23 | // => './blog/2014/01/01/baz.html' 24 | ``` 25 | 26 | ### 'index' pages 27 | 28 | Note that permalink structures will be ignored for files with the basename `index`. See [Issue #20](https://github.com/assemble/permalinks/issues/20) for more info. 29 | 30 | 31 | ## preset 32 | Type: `String` 33 | Default: `undefined` 34 | 35 | The following presets are currently available: 36 | 37 | * `pretty`: expands to `:basename/index:html`. 38 | * `dayname`: expands to `:YYYY/:MM/:DD/:basename/index:ext`. 39 | * `monthname`: expands to `:YYYY/:MM/:basename/index:ext`. 40 | 41 | ### how presets work 42 | 43 | In a nutshell, a preset is simply a pre-defined permalink `structure`, so instead of having to type out `:foo/:bar/:baz/basename:html`, you can just use `pretty`. Presets expand into permalink structures following this pattern: 44 | 45 | ```js 46 | dest + preset 47 | //=> dest + :bar/index:html 48 | ``` 49 | 50 | Additionally, if a `structure` is also defined, the `preset` will be appended to it. 51 | 52 | ```js 53 | dest + structure + preset 54 | //=> dest + :foo + :bar/index:html 55 | ``` 56 | 57 | _If you would like to see another preset, [please submit an issue](https://github.com/assemble/permalinks/issues/new)._ 58 | 59 | 60 | ## dateFormats 61 | Type: `Array` 62 | Default: `["YYYY-MM-DD"]` 63 | 64 | Array of custom date formats for [Moment.js](http://momentjs.com/) to use for parsing dates. 65 | 66 | ```js 67 | options: { 68 | permalinks: { 69 | dateFormats: ["YYYY-MM-DD", "MM-DD-YYYY", "YYYY-MM-DDTHH:mm:ss.SSS"] 70 | }, 71 | files: { 72 | ... 73 | } 74 | } 75 | ``` 76 | 77 | ## lang 78 | Type: `String` 79 | Default: `en` 80 | 81 | Set the "global" language for [Moment.js](http://momentjs.com/) to use for converting dates: 82 | 83 | ```js 84 | options: { 85 | permalinks: { 86 | structure: ':year/:month/:day/:basename:ext', 87 | lang: 'fr' 88 | } 89 | files: { 90 | 'blog/': ['templates/blog/*.hbs'] 91 | } 92 | } 93 | ... 94 | //=> blog/2013/mars/13/my-post.html 95 | ``` 96 | 97 | 98 | ## exclusions 99 | Type: `Array` 100 | Default: `['_page', 'data', 'filePair', 'page', 'pageName']` 101 | 102 | Properties to omit from the context for processing replacement patterns. I wanted to use this for omitting the default properties, but I decided to expose this as an option in case it comes in useful to someone else. 103 | 104 | ```js 105 | options: { 106 | permalinks: { 107 | exclusions: ["foo", "bar"], 108 | }, 109 | files: { 110 | ... 111 | } 112 | } 113 | ``` 114 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * grunt-assemble-permalinks 3 | * 4 | * Copyright (c) 2014-2015, Jon Schlinkert. 5 | * Licensed under the MIT License. 6 | */ 7 | 'use strict'; 8 | 9 | var path = require('path'); 10 | var each = require('async-each'); 11 | var permalinks = require('permalinks'); 12 | var calculate = require('calculate-assets'); 13 | var slugify = require('helper-slugify'); 14 | var union = require('arr-union'); 15 | var merge = require('mixin-deep'); 16 | var omit = require('object.omit'); 17 | 18 | /** 19 | * Permalinks Plugin 20 | * @param {Object} params 21 | * @param {Function} next 22 | * @return {String} The permalink string 23 | */ 24 | 25 | module.exports = function(params, cb) { 26 | var assemble = params.assemble; 27 | var grunt = params.grunt; 28 | 29 | var options = assemble.options.permalinks; 30 | var originalAssets = assemble.options.assets; 31 | var pages = assemble.options.pages; 32 | 33 | var index = 0; 34 | var totalPages = pages.length; 35 | 36 | each(pages, function(page, next) { 37 | var opts = page.data.permalinks || options; 38 | if (typeof opts === 'undefined') { 39 | next(); 40 | return; 41 | } 42 | 43 | index++; 44 | opts.index = index; 45 | opts.length = totalPages; 46 | 47 | // Slugify basenames by default. 48 | opts.slugify = true; 49 | 50 | // Get the permalink pattern to use from options.permalinks.structure. 51 | // If one isn't defined, don't change anything. 52 | var structure = opts.structure; 53 | 54 | // Convenience variable for YAML front matter. 55 | var yfm = page.data; 56 | 57 | // exclusion patterns option. properties to omit from the params object. 58 | var exclusions = ['_page', 'data', 'filePair', 'page', 'pageName']; 59 | exclusions = union([], exclusions, opts.exclusions || []); 60 | 61 | // `slugify` option. Ensure that basenames are suitable to be used as URLs. 62 | if (opts.slugify) { 63 | page.basename = slugify(page.basename); 64 | if (!yfm.slug) { 65 | page.slug = page.basename; 66 | } 67 | } 68 | 69 | /** 70 | * Strip leading numbers from pages 71 | * Works well with `:num` pattern 72 | * @examples 73 | * 010foo.html,011bar.html => foo.html,bar.html 74 | */ 75 | 76 | if (opts.stripnumber === true) { 77 | page.basename = page.basename.replace(/^\d+\-?/, ''); 78 | } 79 | 80 | var context = merge({}, yfm, page); 81 | context = omit(context, exclusions); 82 | 83 | /** 84 | * CREATE PERMALINKS 85 | * Construct the permalink string. Modifies string with an array 86 | * of replacement patterns passed into options.patterns 87 | */ 88 | 89 | var permalink = permalinks(structure, context, opts); 90 | 91 | /** 92 | * WRITE PERMALINKS 93 | * Append the permalink to the dest path defined in the target. 94 | */ 95 | 96 | if (permalink && page.basename !== 'index') { 97 | page.dest = path.join(page.dirname, permalink).split(/\\/).join('/'); 98 | } 99 | 100 | page.assets = calculate(page.dest, originalAssets); 101 | grunt.verbose.ok('page'.yellow, page); 102 | grunt.verbose.ok('page.dest'.yellow, page.dest); 103 | grunt.verbose.ok('page.assets'.yellow, page.assets); 104 | grunt.verbose.ok('Generated permalink for:'.yellow, page.dest); 105 | next(); 106 | }, cb); 107 | }; 108 | 109 | module.exports.options = { 110 | stage: 'render:pre:pages' 111 | }; 112 | -------------------------------------------------------------------------------- /test/assets/validation.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Scaffolding 3 | * 4 | * Basic resets for tests 5 | */ 6 | 7 | body { 8 | padding: 60px 0 80px; 9 | } 10 | 11 | .unselectable { 12 | -webkit-touch-callout: none; 13 | -webkit-user-select: none; 14 | -moz-user-select: none; 15 | -ms-user-select: none; 16 | user-select: none; 17 | } 18 | 19 | .justified { 20 | width: 100%; 21 | } 22 | .justified > li { 23 | float: none; 24 | } 25 | .justified > li > a { 26 | text-align: center; 27 | margin-bottom: 5px; 28 | } 29 | @media (min-width: 768px) { 30 | .justified > li { 31 | display: table-cell; 32 | width: 1%; 33 | } 34 | } 35 | .justified > li > a { 36 | width: 100%; 37 | } 38 | .justified > li + li > a { 39 | border-left: none 40 | } 41 | .justified > li:nth-child(2) > a { 42 | border-left: 1px solid #DDD; 43 | } 44 | 45 | 46 | 47 | /* 48 | * Validation styles 49 | */ 50 | #validate:before { 51 | display: block; 52 | content: "\2713 assets path works!"; 53 | font-size: 15px; 54 | font-weight: bold; 55 | padding: 15px; 56 | margin-bottom: 20px; 57 | color: #569C57; 58 | background-color: #e0f7d7; 59 | border: 1px solid #d1ecc2; 60 | border-radius: 4px; 61 | } 62 | 63 | 64 | .nav > li:after { 65 | position: absolute; 66 | top: 9px; 67 | right: 10px; 68 | content: "class='" attr(class) "'"; 69 | font-family: Monaco, Menlo, Consolas, "Courier New", monospace; 70 | padding: 2px 4px; 71 | margin-left: 10px; 72 | font-size: 90%; 73 | color: #C7254E; 74 | white-space: nowrap; 75 | background-color: #F9F2F4; 76 | border-radius: 4px; 77 | clear: both; 78 | } 79 | 80 | .pager-heading { 81 | position: relative; 82 | display: block; 83 | padding: 10px 15px; 84 | } 85 | 86 | .pager > .active > a, 87 | .pager > .active > span, 88 | .pager > .active > a:hover, 89 | .pager > .active > span:hover, 90 | .pager > .active > a:focus, 91 | .pager > .active > span:focus { 92 | z-index: 2; 93 | color: #ffffff; 94 | background-color: #428bca; 95 | border-color: #428bca; 96 | cursor: default; 97 | } 98 | 99 | .pager .disabled > a, 100 | .pager .disabled > a:hover, 101 | .pager .disabled > a:focus, 102 | .pager .disabled > span, 103 | .pagination > .disabled > span, 104 | .pagination > .disabled > span:hover, 105 | .pagination > .disabled > span:focus, 106 | .pagination > .disabled > a, 107 | .pagination > .disabled > a:hover, 108 | .pagination > .disabled > a:focus, 109 | .nav > li.disabled > a, 110 | .nav > li.disabled > a:hover, 111 | .nav > li.disabled > a:focus, 112 | .nav > li.disabled:hover > a { 113 | color: #aaa; 114 | cursor: default; 115 | background-color: #f8f8f8; 116 | } 117 | 118 | /* Blockquotes */ 119 | .callout { 120 | margin: 20px 0; 121 | padding: 20px; 122 | border-left: 3px solid #eee; 123 | } 124 | .callout h4 { 125 | margin-top: 0; 126 | margin-bottom: 5px; 127 | } 128 | .callout p:last-child { 129 | margin-bottom: 0; 130 | } 131 | .callout-success { 132 | background-color: #fdf7f7; 133 | border-color: #eed3d7; 134 | } 135 | .callout-success h4 { 136 | color: #eed3d7; 137 | } 138 | .callout-info { 139 | background-color: #f4f8fa; 140 | border-color: #bce8f1; 141 | } 142 | .callout-info h4 { 143 | color: #3a87ad; 144 | } 145 | .callout-warning { 146 | background-color: #faf8f0; 147 | border-color: #faebcc; 148 | } 149 | .callout-warning h4 { 150 | color: #c09853; 151 | } 152 | .callout-danger { 153 | background-color: #fdf7f7; 154 | border-color: #eed3d7; 155 | } 156 | .callout-danger h4 { 157 | color: #b94a48; 158 | } 159 | 160 | 161 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "ecmaFeatures": { 3 | "modules": true, 4 | "experimentalObjectRestSpread": true 5 | }, 6 | 7 | "env": { 8 | "browser": false, 9 | "es6": true, 10 | "node": true, 11 | "mocha": true 12 | }, 13 | 14 | "globals": { 15 | "document": false, 16 | "navigator": false, 17 | "window": false 18 | }, 19 | 20 | "rules": { 21 | "accessor-pairs": 2, 22 | "arrow-spacing": [2, { "before": true, "after": true }], 23 | "block-spacing": [2, "always"], 24 | "brace-style": [2, "1tbs", { "allowSingleLine": true }], 25 | "comma-dangle": [2, "never"], 26 | "comma-spacing": [2, { "before": false, "after": true }], 27 | "comma-style": [2, "last"], 28 | "constructor-super": 2, 29 | "curly": [2, "multi-line"], 30 | "dot-location": [2, "property"], 31 | "eol-last": 2, 32 | "eqeqeq": [2, "allow-null"], 33 | "generator-star-spacing": [2, { "before": true, "after": true }], 34 | "handle-callback-err": [2, "^(err|error)$" ], 35 | "indent": [2, 2, { "SwitchCase": 1 }], 36 | "key-spacing": [2, { "beforeColon": false, "afterColon": true }], 37 | "keyword-spacing": [2, { "before": true, "after": true }], 38 | "new-cap": [2, { "newIsCap": true, "capIsNew": false }], 39 | "new-parens": 2, 40 | "no-array-constructor": 2, 41 | "no-caller": 2, 42 | "no-class-assign": 2, 43 | "no-cond-assign": 2, 44 | "no-const-assign": 2, 45 | "no-control-regex": 2, 46 | "no-debugger": 2, 47 | "no-delete-var": 2, 48 | "no-dupe-args": 2, 49 | "no-dupe-class-members": 2, 50 | "no-dupe-keys": 2, 51 | "no-duplicate-case": 2, 52 | "no-empty-character-class": 2, 53 | "no-eval": 2, 54 | "no-ex-assign": 2, 55 | "no-extend-native": 2, 56 | "no-extra-bind": 2, 57 | "no-extra-boolean-cast": 2, 58 | "no-extra-parens": [2, "functions"], 59 | "no-fallthrough": 2, 60 | "no-floating-decimal": 2, 61 | "no-func-assign": 2, 62 | "no-implied-eval": 2, 63 | "no-inner-declarations": [2, "functions"], 64 | "no-invalid-regexp": 2, 65 | "no-irregular-whitespace": 2, 66 | "no-iterator": 2, 67 | "no-label-var": 2, 68 | "no-labels": 2, 69 | "no-lone-blocks": 2, 70 | "no-mixed-spaces-and-tabs": 2, 71 | "no-multi-spaces": 2, 72 | "no-multi-str": 2, 73 | "no-multiple-empty-lines": [2, { "max": 1 }], 74 | "no-native-reassign": 0, 75 | "no-negated-in-lhs": 2, 76 | "no-new": 2, 77 | "no-new-func": 2, 78 | "no-new-object": 2, 79 | "no-new-require": 2, 80 | "no-new-wrappers": 2, 81 | "no-obj-calls": 2, 82 | "no-octal": 2, 83 | "no-octal-escape": 2, 84 | "no-proto": 0, 85 | "no-redeclare": 2, 86 | "no-regex-spaces": 2, 87 | "no-return-assign": 2, 88 | "no-self-compare": 2, 89 | "no-sequences": 2, 90 | "no-shadow-restricted-names": 2, 91 | "no-spaced-func": 2, 92 | "no-sparse-arrays": 2, 93 | "no-this-before-super": 2, 94 | "no-throw-literal": 2, 95 | "no-trailing-spaces": 0, 96 | "no-undef": 2, 97 | "no-undef-init": 2, 98 | "no-unexpected-multiline": 2, 99 | "no-unneeded-ternary": [2, { "defaultAssignment": false }], 100 | "no-unreachable": 2, 101 | "no-unused-vars": [2, { "vars": "all", "args": "none" }], 102 | "no-useless-call": 0, 103 | "no-with": 2, 104 | "one-var": [0, { "initialized": "never" }], 105 | "operator-linebreak": [0, "after", { "overrides": { "?": "before", ":": "before" } }], 106 | "padded-blocks": [0, "never"], 107 | "quotes": [2, "single", "avoid-escape"], 108 | "radix": 2, 109 | "semi": [2, "always"], 110 | "semi-spacing": [2, { "before": false, "after": true }], 111 | "space-before-blocks": [2, "always"], 112 | "space-before-function-paren": [2, "never"], 113 | "space-in-parens": [2, "never"], 114 | "space-infix-ops": 2, 115 | "space-unary-ops": [2, { "words": true, "nonwords": false }], 116 | "spaced-comment": [0, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }], 117 | "use-isnan": 2, 118 | "valid-typeof": 2, 119 | "wrap-iife": [2, "any"], 120 | "yoda": [2, "never"] 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /docs/examples.md: -------------------------------------------------------------------------------- 1 | ## Pretty URLs 2 | 3 | Pretty links involve saving an `index.html` to each directory, with the tile, file name, slug, or some other variable as the `:basename` of the directory. For example: 4 | 5 | ```js 6 | assemble: { 7 | blog: { 8 | options: { 9 | permalinks: { 10 | structure: ':basename/:index.html' 11 | } 12 | }, 13 | files: [ 14 | {expand: true, cwd: 'templates/', src: ['*.hbs'], dest: 'blog/', ext: '.html'} 15 | ] 16 | } 17 | } 18 | ``` 19 | 20 | which results in something like: 21 | 22 | ``` 23 | dest + /my-node-js-post/index.html 24 | dest + /my-javascript-post/index.html 25 | dest + /my-assemble-post/index.html 26 | ``` 27 | Also see the [Gruntfile](./Gruntfile.js) for example usage. 28 | 29 | ## Using presets 30 | 31 | Presets allow you to achieve certain permalinks structures without having to explicitly define each URL segment. For example, in the previous example we created pretty URLs., Here is how we would do the same with `presets`: 32 | 33 | ```js 34 | options: { 35 | permalinks: { 36 | preset: 'pretty' 37 | }, 38 | files: { 39 | './blog/': ['./templates/blog/*.hbs'] 40 | } 41 | } 42 | ``` 43 | 44 | The above example won't necessarily save a whole lot of time, but it's a nice way of ensuring that you're getting pretty links with whatever permalinks structure you define. To some, this might be particularly useful when "stacked" with more complex permalink structures, e.g.: 45 | 46 | ```js 47 | options: { 48 | permalinks: { 49 | preset: 'pretty', 50 | structure: ':archives/:categories', 51 | }, 52 | files: { 53 | './blog/': ['./templates/blog/*.hbs'] 54 | } 55 | } 56 | ``` 57 | 58 | which expands to: `./blog/:archives/:categories/:basename:/index:ext`, and would result in: 59 | 60 | ```js 61 | ./blog/archives/categories/foo/index.html 62 | ``` 63 | Also see the [Gruntfile](./Gruntfile.js) for example usage. 64 | 65 | ## Dest extension 66 | 67 | In most cases your generated HTML will have the `.html` extension, then using `:index.html` is probably fine. But if you happen to switch back and forthing between projects that alternate between `.htm` and `.html`, you can use `:index:ext` instead. 68 | 69 | Also see the [Gruntfile](./Gruntfile.js) for example usage. 70 | 71 | ## Path separators 72 | 73 | You don't have to use slashes (`/`) only in your permalinks, you can use `-` or `_` wherever you need them as well. For example, this is perfectly valid: 74 | 75 | ``` 76 | :YYYY_:MM-:DD/:slug:category:foo/:bar/index.html 77 | ``` 78 | 79 | **Warning**, this should be obvious, but make sure not to use a `.` in the middle of your paths, especially if you use Windows. 80 | 81 | Also see the [Gruntfile](./Gruntfile.js) for example usage. 82 | 83 | ## Dynamically build slugs 84 | 85 | You can even dynamically build up strings using Lo-Dash templates: 86 | 87 | ```yaml 88 | --- 89 | date: 1-1-2014 90 | 91 | # Dynamically build the slug for example 92 | area: business 93 | section: finance 94 | slug: <%= area %>-<%= section %> 95 | --- 96 | ``` 97 | With this config: 98 | 99 | ```js 100 | blog: { 101 | options: { 102 | permalinks: { 103 | structure: ':year/:month/:day/:slug/:title.html' 104 | } 105 | }, 106 | files: { 107 | 'blog/': ['posts/*.hbs'] 108 | } 109 | } 110 | ``` 111 | 112 | Would render to: 113 | 114 | ``` 115 | blog/2014/01/01/business-finance/index.html 116 | ``` 117 | Also see the [Gruntfile](./Gruntfile.js) for example usage. 118 | 119 | ## More examples 120 | 121 | Keep in mind that the date is formatted the way you want it, you don't need to follow these examples. Also, some of these variables will only work if you add that property to your pages, and setup the replacement patterns. 122 | 123 | ```bash 124 | :YYYY/:MM/:DD/news/:id/index:ext 125 | //=> dest + '/2014/01/01/news/001/index.html' 126 | 127 | :YYYY/:MM/:DD/:mm/:ss/news/:id/index:ext 128 | //=> dest + '/2014/01/01/40/16/news/001/index.html' 129 | 130 | :year/:month/:day/:basename:ext 131 | //=> dest + '/2014/01/01/my-post.html' 132 | 133 | blog/:year-:month-:day/:basename:ext 134 | //=> dest + 'blog/2014-01-01/my-post.html' 135 | 136 | :date/:basename:ext 137 | //=> dest + '2014-01-01/my-post.html' 138 | 139 | :year/:month/:day/:category/index.html 140 | //=> dest + '/2014/01/01/javascript/index.html' 141 | 142 | :year/:month/:day/:slug/index.html 143 | //=> dest + '/2014/01/01/business-finance/index.html' 144 | ``` 145 | Also see the [Gruntfile](./Gruntfile.js) for example usage. -------------------------------------------------------------------------------- /test/fixtures/default.hbs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{title}} 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 |
14 | 15 |

pagination

16 | {{pagination pagination modifier="pagination-lg"}} 17 |
18 |

pagination-justified

19 | {{pagination pagination modifier="pagination-lg justified"}} 20 |
21 | 22 |

paginate

23 | {{paginate pagination}} 24 |
25 | 26 | 27 |
28 |
29 | 54 |
55 |
56 |
57 |
58 | 59 | 60 |
61 |
62 |

\{{relative}} helper

63 | Page title: {{ title }} 64 |
65 | 72 |
73 |
74 | 75 | 76 | 77 |
78 |
79 |

\{{rel}} helper

80 | Page title: {{ title }} 81 |
82 | 89 |
90 |
91 |
92 | 93 | 94 |
95 |
Tags
96 |
97 | {{#each collections.tags}} 98 |
Related pages for: {{tag}}
99 |
    100 | {{#each pages}} 101 | 102 | {{{data.title}}} 103 | 104 | {{/each}} 105 |
106 | {{/each}} 107 |
108 |
109 |
110 |
111 | 112 | 113 |
114 |
Categories
115 |
116 | {{#each collections.categories}} 117 |
Related pages for: {{category}}
118 |
    119 | {{#each pages}} 120 | 121 | {{{data.title}}} 122 | 123 | {{/each}} 124 |
125 | {{/each}} 126 |
127 |
128 |
129 |
130 | 131 | 132 | {{> body }} 133 | 134 |
135 |
136 |
137 |
138 | 139 | 140 | -------------------------------------------------------------------------------- /test/actual/filename_replacement/last-year/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Last Year 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 36 |
37 |

pagination-justified

38 | 58 |
59 | 60 | 61 |

paginate

62 | 76 | 85 |
86 |
87 |
88 | 141 |
142 |
143 |
144 |
145 | 146 | 147 |
148 |
149 |

{{relative}} helper

150 | Page title: Last Year 151 |
152 | 160 |
161 |
162 | 163 | 164 |
165 |
166 |

{{rel}} helper

167 | Page title: Last Year 168 |
169 | 177 |
178 |
179 |
180 | 181 | 182 |
183 |
Tags
184 |
185 |
186 |
187 |
188 |
189 | 190 | 191 |
192 |
Categories
193 |
194 |
195 |
196 |
197 |
198 | 199 | 200 | # Header > Cras sit amet nibh libero, in gravida nulla. 201 |
202 |
203 |
204 |
205 | 206 | -------------------------------------------------------------------------------- /test/actual/filename_replacement/new-year/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | New Year 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 36 |
37 |

pagination-justified

38 | 58 |
59 | 60 | 61 |

paginate

62 | 76 | 85 |
86 |
87 |
88 | 141 |
142 |
143 |
144 |
145 | 146 | 147 |
148 |
149 |

{{relative}} helper

150 | Page title: New Year 151 |
152 | 160 |
161 |
162 | 163 | 164 |
165 |
166 |

{{rel}} helper

167 | Page title: New Year 168 |
169 | 177 |
178 |
179 |
180 | 181 | 182 |
183 |
Tags
184 |
185 |
186 |
187 |
188 |
189 | 190 | 191 |
192 |
Categories
193 |
194 |
195 |
196 |
197 |
198 | 199 | 200 | # Header > Cras sit amet nibh libero, in gravida nulla. 201 |
202 |
203 |
204 |
205 | 206 | -------------------------------------------------------------------------------- /test/actual/filename_replacement/bar/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bar 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 36 |
37 |

pagination-justified

38 | 58 |
59 | 60 | 61 |

paginate

62 | 76 | 85 |
86 |
87 |
88 | 141 |
142 |
143 |
144 |
145 | 146 | 147 |
148 |
149 |

{{relative}} helper

150 | Page title: Bar 151 |
152 | 160 |
161 |
162 | 163 | 164 |
165 |
166 |

{{rel}} helper

167 | Page title: Bar 168 |
169 | 177 |
178 |
179 |
180 | 181 | 182 |
183 |
Tags
184 |
185 |
186 |
187 |
188 |
189 | 190 | 191 |
192 |
Categories
193 |
194 |
195 |
196 |
197 |
198 | 199 | 200 | # Header > Cras sit amet nibh libero, in gravida nulla. 201 |
202 |
203 |
204 |
205 | 206 | -------------------------------------------------------------------------------- /test/actual/filename_replacement/foo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Foo 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 36 |
37 |

pagination-justified

38 | 58 |
59 | 60 | 61 |

paginate

62 | 76 | 85 |
86 |
87 |
88 | 141 |
142 |
143 |
144 |
145 | 146 | 147 |
148 |
149 |

{{relative}} helper

150 | Page title: Foo 151 |
152 | 160 |
161 |
162 | 163 | 164 |
165 |
166 |

{{rel}} helper

167 | Page title: Foo 168 |
169 | 177 |
178 |
179 |
180 | 181 | 182 |
183 |
Tags
184 |
185 |
186 |
187 |
188 |
189 | 190 | 191 |
192 |
Categories
193 |
194 |
195 |
196 |
197 |
198 | 199 | 200 | # Header > Cras sit amet nibh libero, in gravida nulla. 201 |
202 |
203 |
204 |
205 | 206 | -------------------------------------------------------------------------------- /docs/patterns.md: -------------------------------------------------------------------------------- 1 | ## Permalink structure 2 | 3 | > Replacement patterns for dynamically constructing permalinks, as well as the corresponding directory structures. 4 | 5 | Permalinks are **appended to the dest directory**. So given this config: 6 | 7 | ```js 8 | { 9 | assemble: { 10 | blog: { 11 | options: { 12 | permalinks: { 13 | structure: ':year/:month/:day/:basename:ext' 14 | } 15 | }, 16 | files: { 17 | 'blog/archives/': ['archives/*.hbs'] 18 | } 19 | } 20 | } 21 | } 22 | // the generated directory structure and resulting path would look something like: 23 | //=> 'blog/archives/2011/01/01/an-inspiring-post.html' 24 | ``` 25 | 26 | ## How replacement patterns work 27 | 28 | This plugin comes with a number of built-in replacement patterns that will automatically parse and convert the built-in variables into the appropriate string. Since Assemble provides a number of generic variables for accessing page data, such as `basename`, `ext`, `filename` etc., this plugin simply dynamically builds the replacement patterns from those generic variables. 29 | 30 | Barring a few exceptions (`_page`, `data`, `filePair`, `page`, `pageName`), you should be able to use any _valid_ variable that is on the page context in your replacement patterns. 31 | 32 | For example, assuming we have a file, `./templates/overview.hbs`: 33 | 34 | * `:ext`: would result in the `dest` extension: `.html` 35 | * `:extname`: alias for `:ext`. 36 | * `:basename`: would result in `overview` 37 | * `:filename`: would result in the dest file name, `overview.html` 38 | * `:pagename`: alias for `:filename`. 39 | * `:category`: Slugified version of _the very first category_ for a page. 40 | 41 | 42 | ## Special patterns 43 | 44 | > A few special replacement patterns were created for this lib. 45 | 46 | ### `:num` 47 | Automatically adds sequential, "padded" numbers based on the length of the pages array in the current target. 48 | 49 | For example, given the structure `:num-:basename`: 50 | 51 | * 1-9 pages would result in `1-foo.html`, `2-bar.html`, `3-baz.html` and so on. 52 | * 1,000 pages would result in `0001-foo.html`, `0002-bar.html`, `0003-baz.html`, ... `1000-quux.html`. 53 | 54 | ### `:000` 55 | Adds sequential digits. Similar to `:num`, but the number of digits is determined by the number of zeros defined. 56 | 57 | Example: 58 | 59 | * `:00` will result in two-digit numbers 60 | * `:000` will result in three-digit numbers 61 | * `:00000000` will result in eight-digit numbers, and so on... 62 | 63 | ### `:random(Pattern, Number)` 64 | Adds randomized characters based on the pattern provided in the parentheses. The first parameter defines the pattern you wish to use, and an optional second parameter defines the number of characters to generate. 65 | 66 | For example, `:random(A, 4)` (whitespace insenstive) would result in randomized 4-digit uppercase letters, like, `ZAKH`, `UJSL`... and so on. 67 | 68 | **no second parameter** 69 | 70 | If a second parameter is not provided, then the `length()` of the characters used in the first parameter will be used to determine the number of digits to output. For example: 71 | 72 | * `:random(AAAA)` is equivelant to `:random(A, 4)` 73 | * `:random(AAA0)` and `:random(AA00)` and `:random(A0A0)` are equivelant to `:random(A0, 4)` 74 | 75 | **valid characters (and examples)** 76 | 77 | * `:random(aa)`: results in double-digit, randomized, lower-case letters (`abcdefghijklmnopqrstuvwxyz`) 78 | * `:random(AAA)`: results in triple-digit, randomized, upper-case letters (`ABCDEFGHIJKLMNOPQRSTUVWXYZ`) 79 | * `:random(0, 6)`: results in six-digit, randomized nubmers (`0123456789`) 80 | * `:random(!, 5)`: results in single-digit randomized, _valid_ non-letter characters (`~!@#$%^&()_+-={}[];\',.`) 81 | * `:random(A!a0, 9)`: results in nine-digit, randomized characters (any of the above) 82 | 83 | _The order in which the characters are provided has no impact on the outcome._ 84 | 85 | 86 | ### Custom replacement patterns 87 | 88 | If you have some patterns you'd like to implement, if you think they're common enough that they should be built into this plugin, please submit a pull request. 89 | 90 | Adding patterns is easy, just add a `patterns: []` property to the `permalinks` option, then add any number of patterns to the array. For example, let's say we want to add the `:project` variable to our permalinks: 91 | 92 | ```js 93 | options: { 94 | permalinks: { 95 | structure: ':year/:month/:day/:project/:slug:ext', 96 | patterns: [] 97 | } 98 | } 99 | ... 100 | ``` 101 | 102 | Since `:project` is not a built-in variable, we need to add a replacement pattern so that any permalinks that include this variable will actually work: 103 | 104 | ```js 105 | options: { 106 | permalinks: { 107 | structure: ':year/:month/:day/:project/:slug:ext', 108 | patterns: [ 109 | { 110 | pattern: ':project', 111 | replacement: '<%= pkg.name %>' 112 | } 113 | ] 114 | } 115 | } 116 | ... 117 | ``` 118 | ### with custom properties 119 | 120 | Any string pattern is acceptable, as long as a `:` precedes the variable, but don't forget that there must also be a matching property in the context or Assemble will might an error (or worse, not). In other words, when you add a replacement pattern for `:foo`, it's good practice to make sure this property exists: 121 | 122 | ```yaml 123 | --- 124 | foo: bar 125 | slug: 126 | --- 127 | ``` 128 | 129 | ## Date patterns 130 | 131 | > This plugin uses the incredibly feature rich and flexible [moment.js](http://momentjs.com/) for parsing dates. Please consult the [moment.js documentation](http://momentjs.com/docs/) for usage information and for the full list of available options. 132 | 133 | For the date variables to work, a `date` property must exist on the page object. 134 | 135 | ```yaml 136 | --- 137 | date: 2014-01-29 3:45 PM 138 | --- 139 | ``` 140 | 141 | Or 142 | 143 | ```js 144 | pages: [ 145 | { 146 | data: { 147 | title: 'All about permalinks, the novel.', 148 | description: 'This rivoting sequel to War & Peace will have you sleeping in no time.' 149 | date: '2014-01-29 3:45 PM' 150 | }, 151 | content: "" 152 | } 153 | ] 154 | ``` 155 | 156 | ### Common date patterns 157 | 158 | * `:year`: The year of the date, four digits, for example `2014` 159 | * `:month`: Month of the year, for example `01` 160 | * `:day`: Day of the month, for example `13` 161 | * `:hour`: Hour of the day, for example `24` 162 | * `:minute`: Minute of the hour, for example `01` 163 | * `:second`: Second of the minute, for example `59` 164 | 165 | For the following examples, let's assume we have a date in the YAML front matter of a page formatted like this: 166 | 167 | ```yaml 168 | --- 169 | date: 2014-01-29 3:45 PM 170 | --- 171 | ``` 172 | (_note that this property doesn't have to be in YAML front matter, it just needs to be in the `page.data` object, so this works fine with `options.pages` collections as well._) 173 | 174 | ### Full date 175 | * `:date`: Eqivelant to the full date: `YYYY-MM-DD`. Example: `2014-01-29` 176 | 177 | ### Year 178 | * `:YYYY`: The full year of the date. Example: `2014` 179 | * `:YY`: The two-digit year of the date. Example: `14` 180 | * `:year`: alias for `YYYY` 181 | 182 | ### Month name 183 | * `:MMMM`: The full name of the month. Example `January`. 184 | * `:MMM`: The name of the month. Example: `Jan` 185 | * `:monthname`: alias for `MMMM` 186 | 187 | ### Month number 188 | * `:MM`: The double-digit number of the month. Example: `01` 189 | * `:M`: The single-digit number of the month. Example: `1` 190 | * `:month`: alias for `MM` 191 | * `:mo`: alias for `M` 192 | 193 | ### Day of the month 194 | * `:day`: alias for `DD` 195 | * `:DD`: The double-digit day of the month. Example: `29` 196 | * `:D`: The double-digit day of the month. Example: `29` 197 | 198 | ### Day of the week 199 | * `:dddd`: Day of the week. Example: `monday` 200 | * `:ddd`: Day of the week. Example: `mon` 201 | * `:dd`: Day of the week. Example: `Mo` 202 | * `:d`: Day of the week. Example: `2` 203 | 204 | ### Hour 205 | * `:HH`: The double-digit time of day on a 24 hour clock. Example `15` 206 | * `:H`: The single-digit time of day on a 24 hour clock. Example `3` 207 | * `:hh`: The double-digit time of day on a 12 hour clock. Example `03` 208 | * `:h`: The single-digit time of day on a 12 hour clock. Example `3` 209 | * `:hour`: alias for `HH` 210 | 211 | ### Minute 212 | * `:mm`: Minutes. Example: `45`. 213 | * `:m`: Minutes. Example: `45`. 214 | * `:min`: Alias for `mm`|`m`. 215 | * `:minute`: Alias for `mm`|`m`. 216 | 217 | ### Second 218 | * `:ss`: Seconds. Example: `09`. 219 | * `:s`: Seconds. Example: `9`. 220 | * `:sec`: Alias for `ss`|`s`. 221 | * `:second`: Alias for `ss`|`s`. 222 | -------------------------------------------------------------------------------- /test/actual/no_opts_flatten/quux.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Quux 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Quux 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Quux 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Quux

219 |

220 |
221 |
222 |

laboris ad incididunt et aliquip

223 |
224 |
225 |

Pariatur enim mollit nostrud aute qui consectetur dolore Lorem ad fugiat aute anim aliquip mollit veniam. Magna ad amet eiusmod officia excepteur minim eiusmod fugiat nisi ad do velit nisi consequat ullamco est. Ad nisi veniam cillum excepteur velit voluptate officia esse velit tempor aliquip. Qui dolor consequat nostrud aute elit elit sunt ea do magna cupidatat nisi. Ea quis aliqua proident Lorem commodo incididunt nulla sint cupidatat nisi excepteur eiusmod aliquip duis in proident consectetur tempor veniam.

226 |

Voluptate occaecat reprehenderit adipisicing sint enim ut voluptate qui ad. Aute ipsum cillum labore sit in aliqua nulla ullamco exercitation nulla ipsum proident incididunt. Cillum deserunt magna sint ullamco officia veniam fugiat sint do nisi cillum culpa laboris ut id aute dolor. Excepteur deserunt consectetur nostrud deserunt nostrud irure amet officia minim nostrud ad magna. Voluptate nostrud excepteur enim Lorem adipisicing enim proident incididunt labore anim. Non exercitation minim sint cupidatat veniam voluptate amet amet veniam adipisicing culpa enim duis eiusmod commodo reprehenderit deserunt. Sit consequat consectetur nostrud esse do quis excepteur consectetur pariatur ea officia occaecat dolor ex.

227 |

Nostrud cupidatat ea non sit id veniam nostrud mollit elit eiusmod pariatur consequat adipisicing ea amet officia reprehenderit nulla. Tempor sunt qui irure do velit culpa consectetur eiusmod duis deserunt. Velit ullamco ipsum aute nisi eiusmod pariatur ut sit sit Lorem adipisicing exercitation occaecat magna. Laboris ipsum reprehenderit consectetur ullamco excepteur pariatur qui deserunt ut elit eiusmod consectetur proident amet officia anim quis.

228 |
Minim sunt nulla in tempor officia eu consectetur in incididunt est enim in culpa incididunt. Ea non cillum laboris excepteur exercitation veniam sit quis fugiat labore qui et eu eu. Minim quis proident sint id consequat laboris ex minim exercitation id nisi. 229 |
230 |
231 |
232 |
233 |
234 | 235 | -------------------------------------------------------------------------------- /test/actual/no_opts_files/articles/nested/quux.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Quux 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Quux 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Quux 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Quux

219 |

220 |
221 |
222 |

laboris ad incididunt et aliquip

223 |
224 |
225 |

Pariatur enim mollit nostrud aute qui consectetur dolore Lorem ad fugiat aute anim aliquip mollit veniam. Magna ad amet eiusmod officia excepteur minim eiusmod fugiat nisi ad do velit nisi consequat ullamco est. Ad nisi veniam cillum excepteur velit voluptate officia esse velit tempor aliquip. Qui dolor consequat nostrud aute elit elit sunt ea do magna cupidatat nisi. Ea quis aliqua proident Lorem commodo incididunt nulla sint cupidatat nisi excepteur eiusmod aliquip duis in proident consectetur tempor veniam.

226 |

Voluptate occaecat reprehenderit adipisicing sint enim ut voluptate qui ad. Aute ipsum cillum labore sit in aliqua nulla ullamco exercitation nulla ipsum proident incididunt. Cillum deserunt magna sint ullamco officia veniam fugiat sint do nisi cillum culpa laboris ut id aute dolor. Excepteur deserunt consectetur nostrud deserunt nostrud irure amet officia minim nostrud ad magna. Voluptate nostrud excepteur enim Lorem adipisicing enim proident incididunt labore anim. Non exercitation minim sint cupidatat veniam voluptate amet amet veniam adipisicing culpa enim duis eiusmod commodo reprehenderit deserunt. Sit consequat consectetur nostrud esse do quis excepteur consectetur pariatur ea officia occaecat dolor ex.

227 |

Nostrud cupidatat ea non sit id veniam nostrud mollit elit eiusmod pariatur consequat adipisicing ea amet officia reprehenderit nulla. Tempor sunt qui irure do velit culpa consectetur eiusmod duis deserunt. Velit ullamco ipsum aute nisi eiusmod pariatur ut sit sit Lorem adipisicing exercitation occaecat magna. Laboris ipsum reprehenderit consectetur ullamco excepteur pariatur qui deserunt ut elit eiusmod consectetur proident amet officia anim quis.

228 |
Minim sunt nulla in tempor officia eu consectetur in incididunt est enim in culpa incididunt. Ea non cillum laboris excepteur exercitation veniam sit quis fugiat labore qui et eu eu. Minim quis proident sint id consequat laboris ex minim exercitation id nisi. 229 |
230 |
231 |
232 |
233 |
234 | 235 | -------------------------------------------------------------------------------- /test/actual/no_opts_flatten/foo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Foo Foo 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Foo Foo 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Foo Foo 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Foo Foo

Aliquip id aute tempor dolore non non elit elit mollit do est tempor voluptate minim. Ut magna do dolor sit aliqua proident duis nulla eu consectetur id. Consectetur ullamco ullamco exercitation esse nostrud id duis duis ex fugiat voluptate. 219 |
220 |
221 |

proident non consequat aliquip et

222 |
223 |
224 |

Nisi occaecat est excepteur tempor enim pariatur in dolore magna magna. Sunt non eiusmod ex veniam incididunt consequat culpa consequat esse aliquip ex sunt mollit officia veniam deserunt tempor laboris. Nulla aliqua id do id mollit eiusmod id excepteur culpa magna aute aute elit nostrud ullamco. Dolor deserunt ea do incididunt et eiusmod fugiat commodo qui laborum. Sint deserunt fugiat ullamco magna magna quis veniam non amet elit.

225 |

Esse amet adipisicing dolor sunt pariatur sint enim sunt occaecat. Dolore culpa ea aliqua non laboris excepteur enim consectetur minim sit enim cupidatat esse deserunt tempor. Fugiat cupidatat ut fugiat aute fugiat et excepteur incididunt consequat enim ullamco dolore cupidatat dolore ut velit incididunt aliqua. Occaecat consequat sunt aliqua exercitation deserunt culpa eiusmod eu exercitation exercitation Lorem consequat velit. Cillum aute Lorem consectetur veniam dolor dolor officia aute incididunt ad laboris nostrud aute do incididunt. Excepteur est aliquip ullamco fugiat fugiat aliquip do est elit qui ea nisi deserunt adipisicing in fugiat. Dolore in magna nostrud do non mollit cupidatat ea aliqua aute ut.

226 |

Officia et deserunt tempor commodo aliqua enim labore aliquip minim ea laboris magna dolor ullamco. Magna eiusmod sit adipisicing tempor eiusmod laboris consectetur duis consectetur enim esse laboris. Ex cupidatat nulla non laboris duis nisi amet ipsum duis duis est anim do minim aliqua cillum aliquip excepteur. Commodo aute excepteur fugiat mollit aliqua eiusmod commodo mollit sunt quis anim mollit ipsum reprehenderit ex aute. Consectetur laborum labore irure eiusmod excepteur adipisicing ut est cupidatat consectetur commodo est ea do qui fugiat.

227 |
Mollit id duis cillum eu ex incididunt pariatur exercitation ullamco consequat nostrud. Eiusmod consequat non quis ad mollit ad in mollit veniam amet aliqua duis non. Amet deserunt labore deserunt enim qui eu sit proident anim minim do est. 228 |
229 |
230 |
231 |
232 |
233 | 234 | -------------------------------------------------------------------------------- /test/actual/structure_basename/articles/nested/quux.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Quux 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Quux 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Quux 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Quux

219 |

220 |
221 |
222 |

laboris ad incididunt et aliquip

223 |
224 |
225 |

Pariatur enim mollit nostrud aute qui consectetur dolore Lorem ad fugiat aute anim aliquip mollit veniam. Magna ad amet eiusmod officia excepteur minim eiusmod fugiat nisi ad do velit nisi consequat ullamco est. Ad nisi veniam cillum excepteur velit voluptate officia esse velit tempor aliquip. Qui dolor consequat nostrud aute elit elit sunt ea do magna cupidatat nisi. Ea quis aliqua proident Lorem commodo incididunt nulla sint cupidatat nisi excepteur eiusmod aliquip duis in proident consectetur tempor veniam.

226 |

Voluptate occaecat reprehenderit adipisicing sint enim ut voluptate qui ad. Aute ipsum cillum labore sit in aliqua nulla ullamco exercitation nulla ipsum proident incididunt. Cillum deserunt magna sint ullamco officia veniam fugiat sint do nisi cillum culpa laboris ut id aute dolor. Excepteur deserunt consectetur nostrud deserunt nostrud irure amet officia minim nostrud ad magna. Voluptate nostrud excepteur enim Lorem adipisicing enim proident incididunt labore anim. Non exercitation minim sint cupidatat veniam voluptate amet amet veniam adipisicing culpa enim duis eiusmod commodo reprehenderit deserunt. Sit consequat consectetur nostrud esse do quis excepteur consectetur pariatur ea officia occaecat dolor ex.

227 |

Nostrud cupidatat ea non sit id veniam nostrud mollit elit eiusmod pariatur consequat adipisicing ea amet officia reprehenderit nulla. Tempor sunt qui irure do velit culpa consectetur eiusmod duis deserunt. Velit ullamco ipsum aute nisi eiusmod pariatur ut sit sit Lorem adipisicing exercitation occaecat magna. Laboris ipsum reprehenderit consectetur ullamco excepteur pariatur qui deserunt ut elit eiusmod consectetur proident amet officia anim quis.

228 |
Minim sunt nulla in tempor officia eu consectetur in incididunt est enim in culpa incididunt. Ea non cillum laboris excepteur exercitation veniam sit quis fugiat labore qui et eu eu. Minim quis proident sint id consequat laboris ex minim exercitation id nisi. 229 |
230 |
231 |
232 |
233 |
234 | 235 | -------------------------------------------------------------------------------- /test/actual/no_opts_flatten/baz.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Baz 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Baz 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Baz 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Baz

219 |

Suprising discovery! Contrary to popular belief, ice in the arctic tundra was found to be below freezing temperatures.

220 | Ullamco elit non id amet ex ut ea dolor ipsum. Adipisicing deserunt non reprehenderit anim deserunt in nisi voluptate laborum labore fugiat et fugiat cillum. Est anim ea ea amet eu sit ut dolor in. 221 |
222 |
223 |

deserunt minim labore qui consequat

224 |
225 |
226 |

Laboris reprehenderit commodo sit mollit magna occaecat id qui tempor do irure adipisicing eu amet culpa. Quis enim ut fugiat ea est fugiat excepteur eiusmod exercitation do. Occaecat excepteur consectetur nisi et et aliqua fugiat sunt laborum magna commodo amet consequat. Cupidatat dolore nisi qui pariatur excepteur occaecat elit ut nulla. Culpa aute ipsum magna consequat minim ullamco cupidatat magna labore amet est laboris enim nisi. Qui et officia enim qui voluptate reprehenderit nostrud veniam veniam in exercitation do excepteur id. Veniam sint qui amet deserunt sint aliqua adipisicing labore deserunt do non adipisicing do ex non reprehenderit voluptate.

227 |

Veniam dolor Lorem eu Lorem cillum in do pariatur eu ipsum ipsum labore nostrud ex tempor pariatur cillum. Eiusmod id velit laboris excepteur laborum minim nostrud do culpa sint ullamco commodo ipsum adipisicing sint ipsum. Ad exercitation do Lorem enim dolore non quis Lorem anim ex minim ex anim amet. Proident minim esse magna fugiat in incididunt dolore amet do consectetur exercitation excepteur dolor consequat cillum adipisicing ea.

228 |

Non officia proident sit quis laboris Lorem fugiat commodo et excepteur cupidatat tempor nostrud non sunt amet cillum sint. Et tempor deserunt nulla proident ad eu id culpa amet sunt esse nulla quis velit culpa qui id. Veniam cupidatat excepteur Lorem est proident laboris pariatur fugiat ipsum voluptate magna labore labore ea sint ut. Elit eu exercitation est occaecat est pariatur tempor voluptate sit esse laborum non ut eu nostrud pariatur quis aliquip. Velit ut ex adipisicing do occaecat officia excepteur exercitation quis duis mollit sit veniam deserunt quis reprehenderit tempor.

229 |
Ipsum amet exercitation excepteur anim enim occaecat culpa ex id sit ipsum anim velit minim. Veniam elit enim in ipsum nisi irure et minim mollit voluptate non fugiat laboris. Fugiat commodo Lorem dolore mollit commodo voluptate amet deserunt in anim nostrud do. 230 |
231 |
232 |
233 |
234 |
235 | 236 | -------------------------------------------------------------------------------- /test/actual/no_opts_flatten/bar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bar 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Bar 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Bar 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Bar

219 |

220 | Est exercitation tempor ad sit dolore proident ex aute Lorem dolor. Labore esse reprehenderit sit ea duis consectetur non irure eu quis et. Irure occaecat irure qui sunt veniam cupidatat mollit adipisicing in qui cupidatat excepteur cupidatat. 221 |
222 |
223 |

dolore dolor et adipisicing ea

224 |
225 |
226 |

Do aute sunt est ea laborum tempor nostrud ad amet non consequat Lorem cupidatat anim. Amet velit ad consequat deserunt ullamco et non commodo laboris ex ut deserunt. Sunt nisi proident occaecat qui ipsum sunt cillum nisi aliqua incididunt consectetur excepteur dolor sint ipsum pariatur. Nostrud elit deserunt reprehenderit culpa irure in consequat excepteur nulla quis commodo id ad officia ex aliqua laboris veniam. Ullamco ex ut veniam aliqua dolor aliquip consectetur dolor in cillum ut et sint duis amet.

227 |

Nisi exercitation deserunt aliqua in eu non qui aute dolore sunt cupidatat Lorem. Excepteur duis cupidatat culpa Lorem aliquip ex commodo aute exercitation. Voluptate eiusmod in ad velit deserunt ea enim ad magna officia veniam adipisicing. Consequat sunt quis laboris excepteur ex reprehenderit duis laboris officia quis pariatur aliqua ipsum amet amet. Culpa veniam et cillum nisi fugiat minim ut laborum cillum voluptate amet proident minim. Occaecat et non sint Lorem anim Lorem adipisicing deserunt reprehenderit. Magna in nulla sunt sint consectetur in ullamco nulla veniam et ex adipisicing dolor aliquip nostrud fugiat qui.

228 |

Nostrud aliqua tempor velit enim quis ut aliqua eu labore sit cillum laborum cupidatat est esse deserunt. Minim ad laborum ex exercitation sit sunt labore eu Lorem nulla non occaecat. Consectetur occaecat consectetur nulla deserunt officia dolor et magna consequat ad excepteur irure minim exercitation sit magna culpa voluptate. Laborum consectetur ut duis quis elit id laboris ullamco amet ut consectetur voluptate aliquip excepteur ullamco et ipsum.

229 |
Labore voluptate excepteur quis nulla adipisicing mollit reprehenderit tempor ipsum duis sunt reprehenderit officia. Ipsum deserunt nulla sint deserunt eiusmod nulla reprehenderit id quis. Esse pariatur Lorem Lorem non irure enim veniam duis ea veniam nisi nisi eiusmod. 230 |
231 |
232 |
233 |
234 |
235 | 236 | -------------------------------------------------------------------------------- /test/actual/no_opts_files/articles/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Category Index 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Category Index 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Category Index 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Category Index

219 |

Index page nested in a directory.

220 | Exercitation ex incididunt cupidatat ad sit laboris aliqua aliquip irure veniam ipsum et et. Consectetur labore reprehenderit aliquip eu laborum adipisicing exercitation aliqua in anim adipisicing. Dolore deserunt ex dolor cillum ullamco fugiat dolore excepteur cillum esse id non. 221 |
222 |
223 |

nulla duis tempor Lorem est

224 |
225 |
226 |

Deserunt culpa mollit duis id deserunt Lorem aliqua ullamco cupidatat aliquip exercitation qui incididunt amet. Velit amet eiusmod labore mollit exercitation velit anim voluptate ex anim. Non eu ipsum duis elit commodo quis sunt enim non ipsum ipsum ex est do.

227 |

Occaecat cupidatat ea enim elit incididunt qui voluptate ex minim dolor ex. Consectetur tempor ex ea eiusmod esse in incididunt ut veniam quis tempor ullamco deserunt magna consequat ut commodo. Voluptate consectetur magna nisi esse laboris eu quis amet sit fugiat reprehenderit in ex mollit velit in consectetur officia ut. Anim ipsum proident dolor excepteur eiusmod esse deserunt velit eu amet. Ex ipsum anim est ut dolore irure sint culpa minim exercitation enim in cillum. Pariatur reprehenderit aliquip proident exercitation quis irure nostrud officia sit dolor ullamco Lorem tempor.

228 |

Dolore magna occaecat nulla veniam non Lorem ex eiusmod est pariatur esse quis proident ipsum qui deserunt et ipsum. Voluptate eu proident commodo ullamco proident Lorem incididunt id exercitation velit qui aliquip. Nulla pariatur id ad proident cupidatat non proident sit laborum velit laboris proident aute reprehenderit. Consectetur commodo eiusmod fugiat qui pariatur non commodo Lorem amet tempor excepteur consectetur enim. Culpa laborum nulla magna officia anim amet incididunt excepteur do dolor. Dolore commodo cupidatat commodo sit cupidatat ea proident reprehenderit ad elit qui id eiusmod. Voluptate pariatur anim anim incididunt ut adipisicing ex occaecat deserunt adipisicing enim eiusmod ipsum pariatur ut irure fugiat.

229 |
Proident proident amet dolore do ullamco aliquip incididunt Lorem aliquip ex laborum qui. Aute esse non dolor velit fugiat proident aute sit irure minim aute ut. Id mollit quis enim laboris sunt do nisi mollit cupidatat non reprehenderit deserunt commodo pariatur. 230 |
231 |
232 |
233 |
234 |
235 | 236 | -------------------------------------------------------------------------------- /test/actual/structure_basename/articles/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Category Index 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Category Index 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Category Index 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Category Index

219 |

Index page nested in a directory.

220 | Exercitation ex incididunt cupidatat ad sit laboris aliqua aliquip irure veniam ipsum et et. Consectetur labore reprehenderit aliquip eu laborum adipisicing exercitation aliqua in anim adipisicing. Dolore deserunt ex dolor cillum ullamco fugiat dolore excepteur cillum esse id non. 221 |
222 |
223 |

nulla duis tempor Lorem est

224 |
225 |
226 |

Deserunt culpa mollit duis id deserunt Lorem aliqua ullamco cupidatat aliquip exercitation qui incididunt amet. Velit amet eiusmod labore mollit exercitation velit anim voluptate ex anim. Non eu ipsum duis elit commodo quis sunt enim non ipsum ipsum ex est do.

227 |

Occaecat cupidatat ea enim elit incididunt qui voluptate ex minim dolor ex. Consectetur tempor ex ea eiusmod esse in incididunt ut veniam quis tempor ullamco deserunt magna consequat ut commodo. Voluptate consectetur magna nisi esse laboris eu quis amet sit fugiat reprehenderit in ex mollit velit in consectetur officia ut. Anim ipsum proident dolor excepteur eiusmod esse deserunt velit eu amet. Ex ipsum anim est ut dolore irure sint culpa minim exercitation enim in cillum. Pariatur reprehenderit aliquip proident exercitation quis irure nostrud officia sit dolor ullamco Lorem tempor.

228 |

Dolore magna occaecat nulla veniam non Lorem ex eiusmod est pariatur esse quis proident ipsum qui deserunt et ipsum. Voluptate eu proident commodo ullamco proident Lorem incididunt id exercitation velit qui aliquip. Nulla pariatur id ad proident cupidatat non proident sit laborum velit laboris proident aute reprehenderit. Consectetur commodo eiusmod fugiat qui pariatur non commodo Lorem amet tempor excepteur consectetur enim. Culpa laborum nulla magna officia anim amet incididunt excepteur do dolor. Dolore commodo cupidatat commodo sit cupidatat ea proident reprehenderit ad elit qui id eiusmod. Voluptate pariatur anim anim incididunt ut adipisicing ex occaecat deserunt adipisicing enim eiusmod ipsum pariatur ut irure fugiat.

229 |
Proident proident amet dolore do ullamco aliquip incididunt Lorem aliquip ex laborum qui. Aute esse non dolor velit fugiat proident aute sit irure minim aute ut. Id mollit quis enim laboris sunt do nisi mollit cupidatat non reprehenderit deserunt commodo pariatur. 230 |
231 |
232 |
233 |
234 |
235 | 236 | -------------------------------------------------------------------------------- /test/actual/no_opts_files/articles/baz.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Baz 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Baz 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Baz 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Baz

219 |

Suprising discovery! Contrary to popular belief, ice in the arctic tundra was found to be below freezing temperatures.

220 | Ullamco elit non id amet ex ut ea dolor ipsum. Adipisicing deserunt non reprehenderit anim deserunt in nisi voluptate laborum labore fugiat et fugiat cillum. Est anim ea ea amet eu sit ut dolor in. 221 |
222 |
223 |

deserunt minim labore qui consequat

224 |
225 |
226 |

Laboris reprehenderit commodo sit mollit magna occaecat id qui tempor do irure adipisicing eu amet culpa. Quis enim ut fugiat ea est fugiat excepteur eiusmod exercitation do. Occaecat excepteur consectetur nisi et et aliqua fugiat sunt laborum magna commodo amet consequat. Cupidatat dolore nisi qui pariatur excepteur occaecat elit ut nulla. Culpa aute ipsum magna consequat minim ullamco cupidatat magna labore amet est laboris enim nisi. Qui et officia enim qui voluptate reprehenderit nostrud veniam veniam in exercitation do excepteur id. Veniam sint qui amet deserunt sint aliqua adipisicing labore deserunt do non adipisicing do ex non reprehenderit voluptate.

227 |

Veniam dolor Lorem eu Lorem cillum in do pariatur eu ipsum ipsum labore nostrud ex tempor pariatur cillum. Eiusmod id velit laboris excepteur laborum minim nostrud do culpa sint ullamco commodo ipsum adipisicing sint ipsum. Ad exercitation do Lorem enim dolore non quis Lorem anim ex minim ex anim amet. Proident minim esse magna fugiat in incididunt dolore amet do consectetur exercitation excepteur dolor consequat cillum adipisicing ea.

228 |

Non officia proident sit quis laboris Lorem fugiat commodo et excepteur cupidatat tempor nostrud non sunt amet cillum sint. Et tempor deserunt nulla proident ad eu id culpa amet sunt esse nulla quis velit culpa qui id. Veniam cupidatat excepteur Lorem est proident laboris pariatur fugiat ipsum voluptate magna labore labore ea sint ut. Elit eu exercitation est occaecat est pariatur tempor voluptate sit esse laborum non ut eu nostrud pariatur quis aliquip. Velit ut ex adipisicing do occaecat officia excepteur exercitation quis duis mollit sit veniam deserunt quis reprehenderit tempor.

229 |
Ipsum amet exercitation excepteur anim enim occaecat culpa ex id sit ipsum anim velit minim. Veniam elit enim in ipsum nisi irure et minim mollit voluptate non fugiat laboris. Fugiat commodo Lorem dolore mollit commodo voluptate amet deserunt in anim nostrud do. 230 |
231 |
232 |
233 |
234 |
235 | 236 | -------------------------------------------------------------------------------- /test/actual/structure_basename/articles/baz.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Baz 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 |

pagination

16 | 38 |
39 |

pagination-justified

40 | 62 |
63 | 64 | 65 |

paginate

66 | 82 | 91 |
92 |
93 |
94 | 155 |
156 |
157 |
158 |
159 | 160 | 161 |
162 |
163 |

{{relative}} helper

164 | Page title: Baz 165 |
166 | 176 |
177 |
178 | 179 | 180 |
181 |
182 |

{{rel}} helper

183 | Page title: Baz 184 |
185 | 195 |
196 |
197 |
198 | 199 | 200 |
201 |
Tags
202 |
203 |
204 |
205 |
206 |
207 | 208 | 209 |
210 |
Categories
211 |
212 |
213 |
214 |
215 |
216 | 217 | 218 |

Baz

219 |

Suprising discovery! Contrary to popular belief, ice in the arctic tundra was found to be below freezing temperatures.

220 | Ullamco elit non id amet ex ut ea dolor ipsum. Adipisicing deserunt non reprehenderit anim deserunt in nisi voluptate laborum labore fugiat et fugiat cillum. Est anim ea ea amet eu sit ut dolor in. 221 |
222 |
223 |

deserunt minim labore qui consequat

224 |
225 |
226 |

Laboris reprehenderit commodo sit mollit magna occaecat id qui tempor do irure adipisicing eu amet culpa. Quis enim ut fugiat ea est fugiat excepteur eiusmod exercitation do. Occaecat excepteur consectetur nisi et et aliqua fugiat sunt laborum magna commodo amet consequat. Cupidatat dolore nisi qui pariatur excepteur occaecat elit ut nulla. Culpa aute ipsum magna consequat minim ullamco cupidatat magna labore amet est laboris enim nisi. Qui et officia enim qui voluptate reprehenderit nostrud veniam veniam in exercitation do excepteur id. Veniam sint qui amet deserunt sint aliqua adipisicing labore deserunt do non adipisicing do ex non reprehenderit voluptate.

227 |

Veniam dolor Lorem eu Lorem cillum in do pariatur eu ipsum ipsum labore nostrud ex tempor pariatur cillum. Eiusmod id velit laboris excepteur laborum minim nostrud do culpa sint ullamco commodo ipsum adipisicing sint ipsum. Ad exercitation do Lorem enim dolore non quis Lorem anim ex minim ex anim amet. Proident minim esse magna fugiat in incididunt dolore amet do consectetur exercitation excepteur dolor consequat cillum adipisicing ea.

228 |

Non officia proident sit quis laboris Lorem fugiat commodo et excepteur cupidatat tempor nostrud non sunt amet cillum sint. Et tempor deserunt nulla proident ad eu id culpa amet sunt esse nulla quis velit culpa qui id. Veniam cupidatat excepteur Lorem est proident laboris pariatur fugiat ipsum voluptate magna labore labore ea sint ut. Elit eu exercitation est occaecat est pariatur tempor voluptate sit esse laborum non ut eu nostrud pariatur quis aliquip. Velit ut ex adipisicing do occaecat officia excepteur exercitation quis duis mollit sit veniam deserunt quis reprehenderit tempor.

229 |
Ipsum amet exercitation excepteur anim enim occaecat culpa ex id sit ipsum anim velit minim. Veniam elit enim in ipsum nisi irure et minim mollit voluptate non fugiat laboris. Fugiat commodo Lorem dolore mollit commodo voluptate amet deserunt in anim nostrud do. 230 |
231 |
232 |
233 |
234 |
235 | 236 | --------------------------------------------------------------------------------