diff --git a/app/templates/app/_posts/2014-03-02-introducing-poole.md b/app/templates/app/_posts/2014-03-02-introducing-poole.md
deleted file mode 100644
index 5504435..0000000
--- a/app/templates/app/_posts/2014-03-02-introducing-poole.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-layout: post
-date: 2014-03-02
-title: Introducing Poole
-categories: jekyll poole
----
-
-*The Strange Case of Dr. Jeykll and Mr. Hyde* tells the story of a lawyer
-investigating the connection of two persons, Dr. Henry Jekyll and Mr. Edward
-Hyde. Chief among the novel's supporting cast is a man by the name of Mr. Poole,
-Dr. Jekyll's loyal butler.
-
------
-
-Poole is the butler for [Jekyll](http://jekyllrb.com), the static site
-generator. It's designed and developed by [@mdo](https://twitter.com/mdo) to
-provide a clear and concise foundational setup for any Jekyll site. It does so
-by furnishing a full vanilla Jekyll install with example templates, pages,
-posts, and styles.
-
-There are currently two themes built on Poole:
-
-* [Hyde](http://hyde.getpoole.com)
-* [Lanyon](http://lanyon.getpoole.com)
-
-Learn more and contribute on [GitHub](https://github.com/poole).
-
-### What's included
-
-Poole is a streamlined Jekyll site designed and built as a foundation for
-building more meaningful themes. Poole, and every theme built on it, includes
-the following:
-
-* Complete Jekyll setup included (layouts, config, [404](/404), [RSS
- feed](/atom.xml), posts, and [example page](/about))
-* Mobile friendly design and development
-* Easily scalable text and component sizing with `rem` units in the CSS
-* Support for a wide gamut of HTML elements
-* Related posts (time-based, because Jekyll) below each post
-* Syntax highlighting, courtesy Pygments (the Python-based code snippet
- highlighter)
-
-Additional features are available in individual themes.
-
-### Browser support
-
-Poole and it's themes are by preference a forward-thinking project. In addition
-to the latest versions of Chrome, Safari (mobile and desktop), and Firefox, it
-is only compatible with Internet Explorer 9 and above.
-
-### Download
-
-Poole is developed on and hosted with GitHub. Head to the GitHub repository for downloads, bug
-reports, and features requests.
-
-Thanks!
diff --git a/app/templates/app/about.md b/app/templates/app/about.md
deleted file mode 100644
index 9b2605b..0000000
--- a/app/templates/app/about.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-layout: page
-title: About
----
-
-
- Hey there! This page is included as an example. Feel free to customize it for your own use upon downloading. Carry on!
-
-
-In the novel, *The Strange Case of Dr. Jeykll and Mr. Hyde*, Mr. Poole is Dr. Jekyll's virtuous and loyal butler. Similarly, Poole is an upstanding and effective butler that helps you build Jekyll themes. It's made by [@mdo](https://twitter.com/mdo).
-
-There are currently two themes built on Poole:
-
-* [Hyde](http://hyde.getpoole.com)
-* [Lanyon](http://lanyon.getpoole.com)
-
-Learn more and contribute on [GitHub](https://github.com/poole).
-
-## Setup
-
-Some fun facts about the setup of this project include:
-
-* Built for [Jekyll](http://jekyllrb.com)
-* Developed on GitHub and hosted for free on [GitHub Pages](https://pages.github.com)
-* Coded with [Sublime Text 2](http://sublimetext.com), an amazing code editor
-* Designed and developed while listening to music like [Blood Bros Trilogy](https://soundcloud.com/maddecent/sets/blood-bros-series)
-
-Have questions or suggestions? Feel free to [open an issue on GitHub](https://github.com/poole/issues/new) or [ask me on Twitter](https://twitter.com/mdo).
-
-Thanks for reading!
diff --git a/app/templates/app/assets/javascript/javascript.js b/app/templates/app/assets/javascript/javascript.js
deleted file mode 100644
index e69de29..0000000
diff --git a/app/templates/app/assets/javascript/somejavascript.js b/app/templates/app/assets/javascript/somejavascript.js
deleted file mode 100644
index e69de29..0000000
diff --git a/app/templates/app/assets/scss/lanyon.scss b/app/templates/app/assets/scss/lanyon.scss
deleted file mode 100644
index 5fcad21..0000000
--- a/app/templates/app/assets/scss/lanyon.scss
+++ /dev/null
@@ -1,542 +0,0 @@
-/*
- * ___
- * /\_ \
- * \//\ \ __ ___ __ __ ___ ___
- * \ \ \ /'__`\ /' _ `\/\ \/\ \ / __`\ /' _ `\
- * \_\ \_/\ \_\.\_/\ \/\ \ \ \_\ \/\ \_\ \/\ \/\ \
- * /\____\ \__/.\_\ \_\ \_\/`____ \ \____/\ \_\ \_\
- * \/____/\/__/\/_/\/_/\/_/`/___/> \/___/ \/_/\/_/
- * /\___/
- * \/__/
- *
- * Designed, built, and released under MIT license by @mdo. Learn more at
- * https://github.com/poole/lanyon.
- */
-
-/*
- * Contents
- *
- * Global resets
- * Masthead
- * Sidebar
- * Slide effect
- * Posts and pages
- * Pagination
- * Reverse layout
- * Themes
- */
-
-/*
- * Global resets
- *
- * Update the foundational and global aspects of the page.
- */
-
-/* Prevent scroll on narrow devices */
-
-html, body {
- overflow-x: hidden;
-}
-
-html {
- font-family: "PT Serif", Georgia, "Times New Roman", serif;
-}
-
-h1, h2, h3, h4, h5, h6 {
- font-family: "PT Sans", Helvetica, Arial, sans-serif;
- font-weight: 400;
- color: #313131;
- letter-spacing: -.025rem;
-}
-
-/*
- * Wrapper
- *
- * The wrapper is used to position site content when the sidebar is toggled. We
- * use an outter wrap to position the sidebar without interferring with the
- * regular page content.
- */
-
-.wrap {
- position: relative;
- width: 100%;
-}
-
-/*
- * Container
- *
- * Center the page content.
- */
-
-.container {
- max-width: 28rem;
-}
-
-@media (min-width: 38rem) {
- .container {
- max-width: 32rem;
- }
-}
-
-@media (min-width: 56rem) {
- .container {
- max-width: 38rem;
- }
-}
-
-/*
- * Masthead
- *
- * Super small header above the content for site name and short description.
- */
-
-.masthead {
- padding-top: 1rem;
- padding-bottom: 1rem;
- margin-bottom: 3rem;
- border-bottom: 1px solid #eee;
-}
-
-.masthead-title {
- margin-top: 0;
- margin-bottom: 0;
- color: #505050;
- a {
- color: #505050;
- }
- small {
- font-size: 75%;
- font-weight: 400;
- color: #c0c0c0;
- letter-spacing: 0;
- }
-}
-
-@media (max-width: 48rem) {
- .masthead-title {
- text-align: center;
- small {
- display: none;
- }
- }
-}
-
-/*
- * Sidebar
- *
- * The sidebar is the drawer, the item we are toggling with our handy hamburger
- * button in the corner of the page.
- *
- * This particular sidebar implementation was inspired by Chris Coyier's
- * "Offcanvas Menu with CSS Target" article, and the checkbox variation from the
- * comments by a reader. It modifies both implementations to continue using the
- * checkbox (no change in URL means no polluted browser history), but this uses
- * `position` for the menu to avoid some potential content reflow issues.
- *
- * Source: http://css-tricks.com/off-canvas-menu-with-css-target/#comment-207504
- */
-
-/* Style and "hide" the sidebar */
-
-.sidebar {
- position: fixed;
- top: 0;
- bottom: 0;
- left: -14rem;
- width: 14rem;
- visibility: hidden;
- overflow-y: auto;
- font-family: "PT Sans", Helvetica, Arial, sans-serif;
- font-size: .875rem;
- /* 15px */
- color: rgba(255, 255, 255, 0.6);
- background-color: #202020;
- -webkit-transition: all .3s ease-in-out;
- transition: all .3s ease-in-out;
- a {
- font-weight: normal;
- color: #fff;
- }
-}
-
-@media (min-width: 30rem) {
- .sidebar {
- font-size: .75rem;
- /* 14px */
- }
-}
-
-/* Sidebar content */
-
-.sidebar-item {
- padding: 1rem;
- p:last-child {
- margin-bottom: 0;
- }
-}
-
-/* Sidebar nav */
-
-.sidebar-nav {
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
-}
-
-.sidebar-nav-item {
- display: block;
- padding: .5rem 1rem;
- border-top: 1px solid rgba(255, 255, 255, 0.1);
- &.active {
- text-decoration: none;
- background-color: rgba(255, 255, 255, 0.1);
- border-color: transparent;
- }
-}
-
-a.sidebar-nav-item {
- &:hover, &:focus {
- text-decoration: none;
- background-color: rgba(255, 255, 255, 0.1);
- border-color: transparent;
- }
-}
-
-@media (min-width: 48rem) {
- .sidebar-item {
- padding: 1.5rem;
- }
- .sidebar-nav-item {
- padding-left: 1.5rem;
- padding-right: 1.5rem;
- }
-}
-
-/* Hide the sidebar checkbox that we toggle with `.sidebar-toggle` */
-
-.sidebar-checkbox {
- display: none;
-}
-
-/* Style the `label` that we use to target the `.sidebar-checkbox` */
-
-.sidebar-toggle {
- position: absolute;
- top: 1rem;
- left: 1rem;
- display: block;
- width: 2.2rem;
- padding: .5rem .65rem;
- color: #505050;
- background-color: #fff;
- border-radius: 4px;
- cursor: pointer;
- &:before {
- display: block;
- content: "";
- width: 100%;
- padding-bottom: .125rem;
- border-top: .375rem double;
- border-bottom: .125rem solid;
- /* Make the border inside the box */
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- }
- &:active {
- color: #fff;
- background-color: #505050;
- }
-}
-
-#sidebar-checkbox:checked ~ .sidebar-toggle {
- color: #fff;
- background-color: #505050;
-}
-
-@media (min-width: 30.1rem) {
- .sidebar-toggle {
- position: fixed;
- width: 2.25rem;
- &:before {
- padding-bottom: .15rem;
- border-top-width: .45rem;
- border-bottom-width: .15rem;
- }
- }
-}
-
-/* Slide effect
- *
- * Handle the sliding effects of the sidebar and content in one spot, seperate
- * from the default styles.
- *
- * As an a heads up, we don't use `transform: translate3d()` here because when
- * mixed with `position: fixed;` for the sidebar toggle, it creates a new
- * containing block. Put simply, the fixed sidebar toggle behaves like
- * `position: absolute;` when transformed.
- *
- * Read more about it at http://meyerweb.com/eric/thoughts/2011/09/12/.
- */
-
-.wrap, .sidebar, .sidebar-toggle {
- -webkit-backface-visibility: hidden;
- -ms-backface-visibility: hidden;
- backface-visibility: hidden;
-}
-
-.wrap, .sidebar-toggle {
- -webkit-transition: -webkit-transform .3s ease-in-out;
- transition: transform .3s ease-in-out;
-}
-
-#sidebar-checkbox:checked {
- + .sidebar {
- visibility: visible;
- }
- ~ {
- .sidebar, .wrap, .sidebar-toggle {
- -webkit-transform: translateX(14rem);
- -ms-transform: translateX(14rem);
- transform: translateX(14rem);
- }
- }
-}
-
-/*
- * Posts and pages
- *
- * Each post is wrapped in `.post` and is used on default and post layouts. Each
- * page is wrapped in `.page` and is only used on the page layout.
- */
-
-.page, .post {
- margin-bottom: 4em;
-}
-
-/* Blog post or page title */
-
-.page-title {
- color: #303030;
-}
-
-.post-title {
- color: #303030;
- a {
- color: #303030;
- }
-}
-
-.page-title, .post-title {
- margin-top: 0;
-}
-
-/* Meta data line below post title */
-
-.post-date {
- display: block;
- margin-top: -.5rem;
- margin-bottom: 1rem;
- color: #9a9a9a;
-}
-
-/* Related posts */
-
-.related {
- padding-top: 2rem;
- padding-bottom: 2rem;
- border-top: 1px solid #eee;
-}
-
-.related-posts {
- padding-left: 0;
- list-style: none;
- h3 {
- margin-top: 0;
- }
- li {
- small {
- font-size: 75%;
- color: #999;
- }
- a:hover {
- color: #268bd2;
- text-decoration: none;
- small {
- color: inherit;
- }
- }
- }
-}
-
-/*
- * Pagination
- *
- * Super lightweight (HTML-wise) blog pagination. `span`s are provide for when
- * there are no more previous or next posts to show.
- */
-
-.pagination {
- overflow: hidden;
- /* clearfix */
- margin-left: -1rem;
- margin-right: -1rem;
- font-family: "PT Sans", Helvetica, Arial, sans-serif;
- color: #ccc;
- text-align: center;
-}
-
-/* Pagination items can be `span`s or `a`s */
-
-.pagination-item {
- display: block;
- padding: 1rem;
- border: 1px solid #eee;
- &:first-child {
- margin-bottom: -1px;
- }
-}
-
-/* Only provide a hover state for linked pagination items */
-
-a.pagination-item:hover {
- background-color: #f5f5f5;
-}
-
-@media (min-width: 30rem) {
- .pagination {
- margin: 3rem 0;
- }
- .pagination-item {
- float: left;
- width: 50%;
- &:first-child {
- margin-bottom: 0;
- border-top-left-radius: 4px;
- border-bottom-left-radius: 4px;
- }
- &:last-child {
- margin-left: -1px;
- border-top-right-radius: 4px;
- border-bottom-right-radius: 4px;
- }
- }
-}
-
-/*
- * Reverse layout
- *
- * Flip the orientation of the page by placing the `.sidebar` and sidebar toggle
- * on the right side.
- */
-
-.layout-reverse {
- .sidebar {
- left: auto;
- right: -14rem;
- }
- .sidebar-toggle {
- left: auto;
- right: 1rem;
- }
- #sidebar-checkbox:checked ~ {
- .sidebar, .wrap, .sidebar-toggle {
- -webkit-transform: translateX(-14rem);
- -ms-transform: translateX(-14rem);
- transform: translateX(-14rem);
- }
- }
-}
-
-/*
- * Themes
- *
- * Apply custom color schemes by adding the appropriate class to the `body`.
- * Based on colors from Base16: http://chriskempson.github.io/base16/#default.
- */
-
-/* Red */
-
-.theme-base-08 {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #ac4142;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #ac4142;
- }
-}
-
-/* Orange */
-
-.theme-base-09 {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #d28445;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #d28445;
- }
-}
-
-/* Yellow */
-
-.theme-base-0a {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #f4bf75;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #f4bf75;
- }
-}
-
-/* Green */
-
-.theme-base-0b {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #90a959;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #90a959;
- }
-}
-
-/* Cyan */
-
-.theme-base-0c {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #75b5aa;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #75b5aa;
- }
-}
-
-/* Blue */
-
-.theme-base-0d {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #6a9fb5;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #6a9fb5;
- }
-}
-
-/* Magenta */
-
-.theme-base-0e {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #aa759f;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #aa759f;
- }
-}
-
-/* Brown */
-
-.theme-base-0f {
- .sidebar, .sidebar-toggle:active, #sidebar-checkbox:checked ~ .sidebar-toggle {
- background-color: #8f5536;
- }
- .container a, .sidebar-toggle, .related-posts li a:hover {
- color: #8f5536;
- }
-}
diff --git a/app/templates/app/assets/scss/poole.scss b/app/templates/app/assets/scss/poole.scss
deleted file mode 100644
index 69e6dd1..0000000
--- a/app/templates/app/assets/scss/poole.scss
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * ___
- * /\_ \
- * _____ ___ ___\//\ \ __
- * /\ '__`\ / __`\ / __`\\ \ \ /'__`\
- * \ \ \_\ \/\ \_\ \/\ \_\ \\_\ \_/\ __/
- * \ \ ,__/\ \____/\ \____//\____\ \____\
- * \ \ \/ \/___/ \/___/ \/____/\/____/
- * \ \_\
- * \/_/
- *
- * Designed, built, and released under MIT license by @mdo. Learn more at
- * https://github.com/poole/poole.
- */
-
-/*
- * Contents
- *
- * Body resets
- * Custom type
- * Messages
- * Container
- * Masthead
- * Posts and pages
- * Pagination
- * Reverse layout
- * Themes
- */
-
-/*
- * Body resets
- *
- * Update the foundational and global aspects of the page.
- */
-
-* {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-html, body {
- margin: 0;
- padding: 0;
-}
-
-html {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 16px;
- line-height: 1.5;
-}
-
-@media (min-width: 38rem) {
- html {
- font-size: 20px;
- }
-}
-
-body {
- color: #515151;
- background-color: #fff;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-
-/* No `:visited` state is required by default (browsers will use `a`) */
-
-a {
- color: #268bd2;
- text-decoration: none;
- &:hover, &:focus {
- text-decoration: underline;
- }
-}
-
-/* `:focus` is linked to `:hover` for basic accessibility */
-
-/* Headings */
-
-h1, h2, h3, h4, h5, h6 {
- margin-bottom: .5rem;
- font-weight: bold;
- line-height: 1.25;
- color: #313131;
- text-rendering: optimizeLegibility;
-}
-
-h1 {
- font-size: 2rem;
-}
-
-h2 {
- margin-top: 1rem;
- font-size: 1.5rem;
-}
-
-h3 {
- margin-top: 1.5rem;
- font-size: 1.25rem;
-}
-
-h4, h5, h6 {
- margin-top: 1rem;
- font-size: 1rem;
-}
-
-/* Body text */
-
-p {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-strong {
- color: #303030;
-}
-
-/* Lists */
-
-ul, ol, dl {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-dt {
- font-weight: bold;
-}
-
-dd {
- margin-bottom: .5rem;
-}
-
-/* Misc */
-
-hr {
- position: relative;
- margin: 1.5rem 0;
- border: 0;
- border-top: 1px solid #eee;
- border-bottom: 1px solid #fff;
-}
-
-abbr {
- font-size: 85%;
- font-weight: bold;
- color: #555;
- text-transform: uppercase;
- &[title] {
- cursor: help;
- border-bottom: 1px dotted #e5e5e5;
- }
-}
-
-/* Code */
-
-code, pre {
- font-family: Menlo, Monaco, "Courier New", monospace;
-}
-
-code {
- padding: .25em .5em;
- font-size: 85%;
- color: #bf616a;
- background-color: #f9f9f9;
- border-radius: 3px;
-}
-
-pre {
- display: block;
- margin-top: 0;
- margin-bottom: 1rem;
- padding: 1rem;
- font-size: .8rem;
- line-height: 1.4;
- white-space: pre;
- white-space: pre-wrap;
- word-break: break-all;
- word-wrap: break-word;
- background-color: #f9f9f9;
- code {
- padding: 0;
- font-size: 100%;
- color: inherit;
- background-color: transparent;
- }
-}
-
-.highlight {
- margin-bottom: 1rem;
- border-radius: 4px;
- pre {
- margin-bottom: 0;
- }
-}
-
-/* Quotes */
-
-blockquote {
- padding: .5rem 1rem;
- margin: .8rem 0;
- color: #7a7a7a;
- border-left: .25rem solid #e5e5e5;
- p:last-child {
- margin-bottom: 0;
- }
-}
-
-@media (min-width: 30rem) {
- blockquote {
- padding-right: 5rem;
- padding-left: 1.25rem;
- }
-}
-
-img {
- display: block;
- margin: 0 0 1rem;
- border-radius: 5px;
-}
-
-/* Tables */
-
-table {
- margin-bottom: 1rem;
- width: 100%;
- border: 1px solid #e5e5e5;
- border-collapse: collapse;
-}
-
-td, th {
- padding: .25rem .5rem;
- border: 1px solid #e5e5e5;
-}
-
-tbody tr:nth-child(odd) {
- td, th {
- background-color: #f9f9f9;
- }
-}
-
-/*
- * Custom type
- *
- * Extend paragraphs with `.lead` for larger introductory text.
- */
-
-.lead {
- font-size: 1.25rem;
- font-weight: 300;
-}
-
-/*
- * Messages
- *
- * Show alert messages to users. You may add it to single elements like a `
diff --git a/app/templates/app/sitemap.xml b/app/templates/app/sitemap.xml
deleted file mode 100644
index 72f9372..0000000
--- a/app/templates/app/sitemap.xml
+++ /dev/null
@@ -1,56 +0,0 @@
----
-layout: null
----
-
-
-
- {{ site.url }}/
- {{ site.time | date_to_xmlschema }}
- weekly
- 1.0
-
- {% for post in site.posts %}
-
- {{ site.url }}{{ post.url }}
- {% if post.sitemap.lastmod %}
- {{ post.sitemap.lastmod | date: "%Y-%m-%d" }}
- {% elsif post.date %}
- {{ post.date | date_to_xmlschema }}
- {% else %}
- {{ site.time | date_to_xmlschema }}
- {% endif %}
- {% if post.sitemap.changefreq %}
- {{ post.sitemap.changefreq }}
- {% else %}
- monthly
- {% endif %}
- {% if post.sitemap.priority %}
- {{ post.sitemap.priority }}
- {% else %}
- 0.5
- {% endif %}
-
- {% endfor %}
- {% for page in site.pages %}
-
- {{ site.url }}{{ page.url }}
- {% if page.sitemap.lastmod %}
- {{ page.sitemap.lastmod | date: "%Y-%m-%d" }}
- {% elsif page.date %}
- {{ page.date | date_to_xmlschema }}
- {% else %}
- {{ site.time | date_to_xmlschema }}
- {% endif %}
- {% if page.sitemap.changefreq %}
- {{ page.sitemap.changefreq }}
- {% else %}
- monthly
- {% endif %}
- {% if page.sitemap.priority %}
- {{ page.sitemap.priority }}
- {% else %}
- 0.3
- {% endif %}
-
- {% endfor %}
-
diff --git a/app/templates/bowerrc b/app/templates/bowerrc
deleted file mode 100644
index f79669e..0000000
--- a/app/templates/bowerrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "directory": "src/_bower_components"
-}
diff --git a/app/templates/conditionals/_aws-credentials.json b/app/templates/conditionals/_aws-credentials.json
deleted file mode 100644
index 7a16e0c..0000000
--- a/app/templates/conditionals/_aws-credentials.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "key": "<%= amazonKey %>",
- "secret": "<%= amazonSecret %>",
- "bucket": "<%= amazonBucket %>",
- "region": "us-west-1",
- "distributionId": "<%= amazonDistID %>"
-}
diff --git a/app/templates/conditionals/_rsync-credentials.json b/app/templates/conditionals/_rsync-credentials.json
deleted file mode 100644
index 37fcc84..0000000
--- a/app/templates/conditionals/_rsync-credentials.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "username": "<%= rsyncUsername %>",
- "hostname": "<%= rsyncHostname %>",
- "destination": "<%= rsyncDestination %>"
-}
diff --git a/app/templates/gulpfile.js b/app/templates/gulpfile.js
deleted file mode 100755
index 8a2a1e5..0000000
--- a/app/templates/gulpfile.js
+++ /dev/null
@@ -1,267 +0,0 @@
-// Generated on <%= (new Date).toISOString().split("T")[0] %> using <%= pkg.name %> <%= pkg.version %>
-"use strict";
-
-var gulp = require("gulp");
-// Loads the plugins without having to list all of them, but you need
-// to call them as $.pluginname
-var $ = require("gulp-load-plugins")();
-// "del" is used to clean out directories and such
-var del = require("del");
-<% if (amazonCloudfrontS3) { %>// Parallelize the uploads when uploading to Amazon S3
-// "fs" is used to read files from the system (used for AWS uploading)
-var fs = require("fs");
-var parallelize = require("concurrent-transform");
-<% } %>// BrowserSync isn"t a gulp package, and needs to be loaded manually
-var browserSync = require("browser-sync");
-// merge is used to merge the output from two different streams into the same stream
-var merge = require("merge-stream");
-// Need a command for reloading webpages using BrowserSync
-var reload = browserSync.reload;
-// And define a variable that BrowserSync uses in it"s function
-var bs;
-
-// Deletes the directory that is used to serve the site during development
-gulp.task("clean:dev", del.bind(null, ["serve"]));
-
-// Deletes the directory that the optimized site is output to
-gulp.task("clean:prod", del.bind(null, ["site"]));
-
-// Runs the build command for Jekyll to compile the site locally
-// This will build the site with the production settings
-gulp.task("jekyll:dev", $.shell.task("jekyll build"));
-gulp.task("jekyll-rebuild", ["jekyll:dev"], function () {
- reload;
-});
-
-// Almost identical to the above task, but instead we load in the build configuration
-// that overwrites some of the settings in the regular configuration so that you
-// don"t end up publishing your drafts or future posts
-gulp.task("jekyll:prod", $.shell.task("jekyll build --config _config.yml,_config.build.yml"));
-
-// Compiles the SASS files and moves them into the "assets/stylesheets" directory
-gulp.task("styles", function () {
- // Looks at the style.scss file for what to include and creates a style.css file
- return gulp.src("src/assets/scss/style.scss")
- .pipe($.sass())
- // AutoPrefix your CSS so it works between browsers
- .pipe($.autoprefixer("last 1 version", { cascade: true }))
- // Directory your CSS file goes to
- .pipe(gulp.dest("src/assets/stylesheets/"))
- .pipe(gulp.dest("serve/assets/stylesheets/"))
- // Outputs the size of the CSS file
- .pipe($.size({title: "styles"}))
- // Injects the CSS changes to your browser since Jekyll doesn"t rebuild the CSS
- .pipe(reload({stream: true}));
-});
-
-// Optimizes the images that exists
-gulp.task("images", function () {
- return gulp.src("src/assets/images/**")
- .pipe($.changed("site/assets/images"))
- .pipe($.imagemin({
- // Lossless conversion to progressive JPGs
- progressive: true,
- // Interlace GIFs for progressive rendering
- interlaced: true
- }))
- .pipe(gulp.dest("site/assets/images"))
- .pipe($.size({title: "images"}));
-});
-
-// Copy over fonts to the "site" directory
-gulp.task("fonts", function () {
- return gulp.src("src/assets/fonts/**")
- .pipe(gulp.dest("site/assets/fonts"))
- .pipe($.size({ title: "fonts" }));
-});
-
-// Copy xml and txt files to the "site" directory
-gulp.task("copy", function () {
- return gulp.src(["serve/*.txt", "serve/*.xml"])
- .pipe(gulp.dest("site"))
- .pipe($.size({ title: "xml & txt" }))
-});
-
-// Optimizes all the CSS, HTML and concats the JS etc
-gulp.task("html", ["styles"], function () {
- var assets = $.useref.assets({searchPath: "serve"});
-
- return gulp.src("serve/**/*.html")
- .pipe(assets)
- // Concatenate JavaScript files and preserve important comments
- .pipe($.if("*.js", $.uglify({preserveComments: "some"})))
- // Minify CSS
- .pipe($.if("*.css", $.minifyCss()))
- // Start cache busting the files
- .pipe($.revAll({ ignore: [".eot", ".svg", ".ttf", ".woff"] }))
- .pipe(assets.restore())
- // Conctenate your files based on what you specified in _layout/header.html
- .pipe($.useref())
- // Replace the asset names with their cache busted names
- .pipe($.revReplace())
- // Minify HTML
- .pipe($.if("*.html", $.htmlmin({
- removeComments: true,
- removeCommentsFromCDATA: true,
- removeCDATASectionsFromCDATA: true,
- collapseWhitespace: true,
- collapseBooleanAttributes: true,
- removeAttributeQuotes: true,
- removeRedundantAttributes: true
- })))
- // Send the output to the correct folder
- .pipe(gulp.dest("site"))
- .pipe($.size({title: "optimizations"}));
-});
-
-<% if (amazonCloudfrontS3) { %>// Task to deploy your site to Amazon S3 and Cloudfront
-gulp.task("deploy", function () {
- // Generate the needed credentials (bucket, secret key etc) from a "hidden" JSON file
- var credentials = JSON.parse(fs.readFileSync("aws-credentials.json", "utf8"));
- var publisher = $.awspublish.create(credentials);
- // Give your files the proper headers
- var headers = {
- "Cache-Control": "max-age=0, no-transform, public",
- "Content-Encoding": "gzip"
- };
-
- gulp.src("site/**/*")
- .pipe($.awspublishRouter({
- routes: {
- "^assets/(?:.+)\\.(?:js|css)$": {
- key: "$&",
- headers: {
- "Cache-Control": "max-age=315360000, no-transform, public",
- "Content-Encoding": "gzip"
- }
- },
-
- "^assets/(?:.+)\\.(?:jpg|png|gif)$": {
- key: "$&",
- headers: {
- "Cache-Control": "max-age=315360000, no-transform, public",
- "Content-Encoding": "gzip"
- }
- },
-
- "^assets/fonts/(?:.+)\\.(?:eot|svg|ttf|woff)$": {
- key: "$&",
- headers: {
- "Cache-Control": "max-age=315360000, no-transform, public"
- }
- },
-
- "^.+\\.html": {
- key: "$&",
- headers: {
- "Cache-Control": "max-age=0, no-transform, public",
- "Content-Encoding": "gzip"
- }
- },
- "^.+$": "$&"
- }
- }))
- // Gzip the files for moar speed
- .pipe($.awspublish.gzip())
- // Parallelize the number of concurrent uploads, in this case 30
- .pipe(parallelize(publisher.publish(), 30))
- // Have your files in the system cache so you don"t have to recheck all the files every time
- .pipe(publisher.cache())
- // Synchronize the contents of the bucket and local (this deletes everything that isn"t in local!)
- .pipe(publisher.sync())
- // And print the ouput, glorious
- .pipe($.awspublish.reporter())
- // And update the default root object
- .pipe($.cloudfront(credentials));
-});<% } %><% if (rsync) { %>
-
-// Task to upload your site via Rsync to your server
-gulp.task("deploy", function () {
- // Load in the variables needed for our Rsync synchronization
- var secret = require("./rsync-credentials.json");
-
- return gulp.src("site/**")
- .pipe($.rsync({
- // This uploads the contenst of "root", instead of the folder
- root: "site",
- // Find your username, hostname and destination from your rsync-credentials.json
- hostname: secret.hostname,
- username: secret.username,
- destination: secret.destination,
- // Incremental uploading, adds a small delay but minimizes the amount of files transferred
- incremental: true,
- // Shows the progress on your files while uploading
- progress: true
- }));
-});<% } %><% if (githubPages) { %>
-// Task to upload your site to your personal GH Pages repo
-gulp.task("deploy", function () {
- // Deploys your optimized site, you can change the settings in the html task if you want to
- return gulp.src("./site/**/*")
- .pipe($.ghPages({
- // Currently only personal GitHub Pages are supported so it will upload to the master
- // branch and automatically overwrite anything that is in the directory
- branch: "master"
- }));
-});<% } %>
-
-// Run JS Lint against your JS
-gulp.task("jslint", function () {
- gulp.src("./serve/assets/javascript/*.js")
- // Checks your JS code quality against your .jshintrc file
- .pipe($.jshint(".jshintrc"))
- .pipe($.jshint.reporter());
-});
-
-// Runs "jekyll doctor" on your site to check for errors with your configuration
-// and will check for URL errors a well
-gulp.task("doctor", $.shell.task("jekyll doctor"));
-
-// BrowserSync will serve our site on a local server for us and other devices to use
-// It will also autoreload across all devices as well as keep the viewport synchronized
-// between them.
-gulp.task("serve:dev", ["styles", "jekyll:dev"], function () {
- bs = browserSync({
- notify: true,
- // tunnel: "",
- server: {
- baseDir: "serve"
- }
- });
-});
-
-// These tasks will look for files that change while serving and will auto-regenerate or
-// reload the website accordingly. Update or add other files you need to be watched.
-gulp.task("watch", function () {
- gulp.watch(["src/**/*.md", "src/**/*.html", "src/**/*.xml", "src/**/*.txt", "src/**/*.js"], ["jekyll-rebuild"]);
- gulp.watch(["serve/assets/stylesheets/*.css"], reload);
- gulp.watch(["src/assets/scss/**/*.scss"], ["styles"]);
-});
-
-// Serve the site after optimizations to see that everything looks fine
-gulp.task("serve:prod", function () {
- bs = browserSync({
- notify: false,
- // tunnel: true,
- server: {
- baseDir: "site"
- }
- });
-});
-
-// Default task, run when just writing "gulp" in the terminal
-gulp.task("default", ["serve:dev", "watch"]);
-
-// Checks your CSS, JS and Jekyll for errors
-gulp.task("check", ["jslint", "doctor"], function () {
- // Better hope nothing is wrong.
-});
-
-// Builds the site but doesn"t serve it to you
-gulp.task("build", ["jekyll:prod", "styles"], function () {});
-
-// Builds your site with the "build" command and then runs all the optimizations on
-// it and outputs it to "./site"
-gulp.task("publish", ["build"], function () {
- gulp.start("html", "copy", "images", "fonts");
-});
diff --git a/app/templates/jshintrc b/app/templates/jshintrc
deleted file mode 100644
index 23ca7ec..0000000
--- a/app/templates/jshintrc
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "node": true,
- "browser": true,
- "esnext": true,
- "bitwise": false,
- "curly": false,
- "eqeqeq": true,
- "eqnull": true,
- "immed": true,
- "latedef": true,
- "newcap": true,
- "noarg": true,
- "quotmark": "single",
- "undef": true,
- "strict": false,
- "trailing": true,
- "smarttabs": true
-}
diff --git a/generators/app/index.js b/generators/app/index.js
new file mode 100644
index 0000000..f29f768
--- /dev/null
+++ b/generators/app/index.js
@@ -0,0 +1,172 @@
+'use strict';
+
+var _ = require('lodash');
+var chalk = require('chalk');
+var generators = require('yeoman-generator');
+var shelljs = require('shelljs');
+var yosay = require('yosay');
+
+module.exports = generators.Base.extend({
+ constructor: function () {
+ generators.Base.apply(this, arguments);
+
+ this.option('skip-install', {
+ desc: 'Skip installing dependencies',
+ type: Boolean
+ });
+
+ this.option('skip-welcome-message', {
+ desc: 'Skips the welcome message',
+ type: Boolean
+ });
+
+ if (!this.options['skip-install']) {
+ var dependencies = ['ruby', 'bundle', 'yo', 'gulp', 'node'].every(function (depend) {
+ return shelljs.which(depend);
+ });
+
+ if (!dependencies) {
+ this.log(chalk.red('You are missing one or more dependencies!'));
+ this.log(chalk.yellow('Make sure you have the required dependencies, or that they are in $PATH'));
+ shelljs.exit(1);
+ }
+ }
+ },
+
+ initializing: function () {
+ this.props = {};
+ this.pkg = this.fs.readJSON(this.destinationPath('package.json'), {});
+ },
+
+ prompting: function () {
+ if (!this.options['skip-welcome-message']) {
+ this.log(yosay(`'Allo 'allo`));
+ }
+
+ var questions = [{
+ name: 'projectName',
+ message: 'What is the name of your project?',
+ store: true
+ }, {
+ name: 'projectDescription',
+ message: 'Describe your project',
+ store: true
+ }, {
+ name: 'projectURL',
+ message: chalk.yellow('If you will be using Github Pages, use username.github.io\n') +
+ chalk.yellow('? ') + 'What will the URL for your project be?',
+ validate: i => i.startsWith('http') ? true : 'URL must contain either HTTP or HTTPs',
+ store: true
+ }, {
+ name: 'authorName',
+ message: 'What\'s your name?',
+ store: true
+ }, {
+ name: 'authorEmail',
+ message: 'What\'s your email?',
+ store: true
+ }, {
+ name: 'authorURI',
+ message: chalk.yellow('Can be the same as this site\n') +
+ chalk.yellow('? ') + 'What is your homepage?',
+ store: true
+ }, {
+ name: 'authorBio',
+ message: 'Write a short description about yourself',
+ store: true
+ }, {
+ name: 'uploading',
+ type: 'list',
+ message: 'How do you want to upload your site?',
+ choices: ['Amazon S3', 'Rsync', 'Github Pages', 'None'],
+ store: true
+ }, {
+ name: 'jekyllPermalinks',
+ type: 'list',
+ message: 'Permalink style' + (chalk.yellow(
+ '\n date: /:categories/:year/:month/:day/:title.html' +
+ '\n pretty: /:categories/:year/:month/:day/:title/' +
+ '\n ordinal: /:categories/:year/:y_day/:title.html' +
+ '\n none: /:categories/:title.html\n')),
+ choices: ['date', 'pretty', 'ordinal', 'none'],
+ store: true
+ }];
+
+ return this.prompt(questions).then(function (props) {
+ this.props = props;
+ }.bind(this));
+ },
+
+ writing: function () {
+ var pkgJSONFields = {
+ name: _.kebabCase(this.props.projectName),
+ version: '0.0.0',
+ description: this.props.projectDescription,
+ homepage: this.props.projectURL,
+ author: {
+ name: this.props.authorName,
+ email: this.props.authorEmail
+ }
+ };
+
+ this.fs.writeJSON('package.json', _.extend(pkgJSONFields, this.pkg));
+ },
+
+ default: function () {
+ this.composeWith('jekyllized:boilerplate', {
+ options: {
+ projectName: this.props.projectName,
+ projectDescription: this.props.projectDescription,
+ projectURL: this.props.projectURL,
+ authorName: this.props.authorName
+ }
+ }, {
+ local: require.resolve('../boilerplate')
+ });
+
+ this.composeWith('jekyllized:gulp', {
+ options: {
+ uploading: this.props.uploading
+ }
+ }, {
+ local: require.resolve('../gulp')
+ });
+
+ this.composeWith('jekyllized:jekyll', {
+ options: {
+ projectName: this.props.projectName,
+ projectDescription: this.props.projectDescription,
+ projectURL: this.props.projectURL,
+ authorName: this.props.authorName,
+ authorEmail: this.props.authorEmail,
+ authorURI: this.props.authorURI,
+ authorBio: this.props.authorBio,
+ jekyllPermalinks: this.props.jekyllPermalinks
+ }
+ }, {
+ local: require.resolve('../jekyll')
+ });
+ },
+
+ installing: function () {
+ this.installDependencies({
+ skipInstall: this.options['skip-install']
+ });
+ if (this.options['skip-install']) {
+ this.log('Please run bundle install to ');
+ } else {
+ this.spawnCommand('bundle', ['install', '--quiet']);
+ }
+ },
+
+ end: function () {
+ var skipInstallMessage =
+ '\nPlease run ' + chalk.blue('npm install') + ' and ' +
+ chalk.blue('bundle install') + ' to install dependencies';
+
+ if (this.options['skip-install']) {
+ this.log(skipInstallMessage);
+ return;
+ }
+ }
+});
diff --git a/generators/boilerplate/index.js b/generators/boilerplate/index.js
new file mode 100644
index 0000000..19a865d
--- /dev/null
+++ b/generators/boilerplate/index.js
@@ -0,0 +1,61 @@
+'use strict';
+
+var generators = require('yeoman-generator');
+
+module.exports = generators.Base.extend({
+ constructor: function () {
+ generators.Base.apply(this, arguments);
+
+ this.option('projectName', {
+ type: String,
+ required: true,
+ desc: 'Project name'
+ });
+
+ this.option('projectDescription', {
+ type: String,
+ required: true,
+ desc: 'Project description'
+ });
+
+ this.option('projectURL', {
+ type: String,
+ required: true,
+ desc: 'Project URL'
+ });
+
+ this.option('authorName', {
+ type: String,
+ required: true,
+ desc: 'Author name'
+ });
+ },
+
+ configuring: function () {
+ this.fs.copyTpl(
+ this.templatePath('README.md'),
+ this.destinationPath('README.md'),
+ {
+ projectName: this.options.projectName,
+ projectDescription: this.options.projectDescription,
+ projectURL: this.options.projectURL,
+ authorName: this.options.authorName
+ }
+ );
+
+ this.fs.copy(
+ this.templatePath('editorconfig'),
+ this.destinationPath('.editorconfig')
+ );
+
+ this.fs.copy(
+ this.templatePath('gitattributes'),
+ this.destinationPath('.gitattributes')
+ );
+
+ this.fs.copy(
+ this.templatePath('gitignore'),
+ this.destinationPath('.gitignore')
+ );
+ }
+});
diff --git a/generators/boilerplate/templates/README.md b/generators/boilerplate/templates/README.md
new file mode 100644
index 0000000..73c0b09
--- /dev/null
+++ b/generators/boilerplate/templates/README.md
@@ -0,0 +1,45 @@
+# <%= projectName %>
+
+> <%= projectDescription %>
+
+## To get started
+
+```sh
+$ gulp [--prod]
+```
+
+And you'll have a new Jekyll site generated for you and displayed in your
+browser. Neato. If you want to run it with production settings, just add
+`--prod`.
+
+#### Settings
+In your `_config.yml` and `humans.txt` you should add your Github and Twitter
+profile if you want to.
+
+## Usage
+
+```sh
+$ gulp build [--prod]
+```
+
+```sh
+$ gulp deploy
+```
+
+## Install
+If you have cloned this repo or want to reinstall, make sure there's no
+`node_modules` or `Gemfile.lock` folder/file and then run `npm install` and
+`bundle install`.
+
+#### Update
+To update: `npm update generator-jekyllized -g`, then run `yo jekyllized:gulp
+[--rsync|amazon|pages]` in this directory. Note that this will overwrite any
+local changes, so back it up.
+
+## Github
+For more information on how to use your new project, please refer to the [README
+on Github](https://github.com/sondr3/generator-jekyllized).
+
+## Owner
+
+> [<%= authorName %>](<%= projectURL %>)
diff --git a/app/templates/editorconfig b/generators/boilerplate/templates/editorconfig
similarity index 72%
rename from app/templates/editorconfig
rename to generators/boilerplate/templates/editorconfig
index 8f6cc4f..4a7ea30 100644
--- a/app/templates/editorconfig
+++ b/generators/boilerplate/templates/editorconfig
@@ -1,4 +1,3 @@
-# http://editorconfig.org
root = true
[*]
@@ -10,4 +9,4 @@ trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
-trim_trailing_whitespace = false
\ No newline at end of file
+trim_trailing_whitespace = false
diff --git a/app/templates/gitattributes b/generators/boilerplate/templates/gitattributes
similarity index 100%
rename from app/templates/gitattributes
rename to generators/boilerplate/templates/gitattributes
diff --git a/app/templates/gitignore b/generators/boilerplate/templates/gitignore
similarity index 93%
rename from app/templates/gitignore
rename to generators/boilerplate/templates/gitignore
index 1ac3139..b48cd80 100644
--- a/app/templates/gitignore
+++ b/generators/boilerplate/templates/gitignore
@@ -50,7 +50,7 @@ tags
*.zip
# Packages
-node_modules/*
+node_modules/
.tmp
test/
@@ -59,11 +59,10 @@ test/
*.sublime-workspace
*.sublime-projectcompletions
-app/_bower_components
+bower_components
# Output folders
-serve
-site
+dist
# hide the AWS and Rsync credentials file
aws-credentials.json
diff --git a/generators/gulp/USAGE b/generators/gulp/USAGE
new file mode 100644
index 0000000..8579276
--- /dev/null
+++ b/generators/gulp/USAGE
@@ -0,0 +1,12 @@
+Updating:
+ When updating your gulpfile and packages you need to include a command line
+ flag specifying how you want to upload your site, if no flag is specified it
+ will generate a gulpfile without any uploading task. For example:
+
+ yo jekyllized:gulp
+ yo jekyllized:gulp --rsync
+
+ Options:
+ --amazon
+ --rsync
+ --pages
diff --git a/generators/gulp/index.js b/generators/gulp/index.js
new file mode 100644
index 0000000..359e2e9
--- /dev/null
+++ b/generators/gulp/index.js
@@ -0,0 +1,108 @@
+'use strict';
+
+var _ = require('lodash');
+var generators = require('yeoman-generator');
+var argv = require('yargs').argv;
+
+module.exports = generators.Base.extend({
+ constructor: function () {
+ generators.Base.apply(this, arguments);
+
+ this.option('uploading', {
+ required: true,
+ name: 'uploading',
+ type: 'list',
+ message: 'How do you want to upload your site?',
+ choices: ['Amazon S3', 'Rsync', 'Github Pages', 'None']
+ });
+
+ if (argv.amazon) {
+ this.options.uploading = 'Amazon S3';
+ }
+
+ if (argv.rsync) {
+ this.options.uploading = 'Rsync';
+ }
+
+ if (argv.pages) {
+ this.options.uploading = 'Github Pages';
+ }
+ },
+
+ writing: {
+ package: function () {
+ var pkg = this.fs.readJSON(this.destinationPath('package.json'), {});
+
+ pkg.devDependencies = pkg.devDependencies || {};
+ _.extend(pkg.devDependencies, {
+ 'autoprefixer': '^6.2.3',
+ 'browser-sync': '^2.11.0',
+ 'del': '^2.2.0',
+ 'gulp': 'git://github.com/gulpjs/gulp.git#4.0',
+ 'gulp-cache': '^0.4.1',
+ 'gulp-concat': '^2.6.0',
+ 'gulp-cssnano': '^2.1.0',
+ 'gulp-eslint': '^2.0.0',
+ 'gulp-gzip': '^1.1.0',
+ 'gulp-htmlmin': '^2.0.0',
+ 'gulp-if': '^2.0.0',
+ 'gulp-imagemin': '^3.0.0',
+ 'gulp-inject': '^4.0.0',
+ 'gulp-load-plugins': '^1.2.0',
+ 'gulp-newer': '^1.1.0',
+ 'gulp-postcss': '^6.0.0',
+ 'gulp-rename': '^1.2.2',
+ 'gulp-rev': '^7.0.0',
+ 'gulp-sass': '^2.1.1',
+ 'gulp-size': '^2.0.0',
+ 'gulp-sourcemaps': '^1.3.0',
+ 'gulp-uglify': '^1.5.1',
+ 'gulp-uncss': '^1.0.0',
+ 'shelljs': '^0.7.0',
+ 'yargs': '^4.7.0'
+ });
+
+ if (this.options.uploading === 'Amazon S3') {
+ pkg.devDependencies['gulp-awspublish'] = '^3.2.0';
+ pkg.devDependencies['concurrent-transform'] = '^1.0.0';
+ }
+
+ if (this.options.uploading === 'Rsync') {
+ pkg.devDependencies['gulp-rsync'] = '^0.0.6';
+ }
+
+ if (this.options.uploading === 'Github Pages') {
+ pkg.devDependencies['gulp-gh-pages'] = '^0.5.2';
+ }
+
+ this.fs.writeJSON(this.destinationPath('package.json'), pkg);
+ },
+
+ gulpfile: function () {
+ this.fs.copyTpl(
+ this.templatePath('gulpfile.js'),
+ this.destinationPath('gulpfile.js'),
+ {
+ amazonS3: this.options.uploading === 'Amazon S3',
+ rsync: this.options.uploading === 'Rsync',
+ ghpages: this.options.uploading === 'Github Pages',
+ noUpload: this.options.uploading === 'None'
+ }
+ );
+
+ if (this.options.uploading === 'Amazon S3') {
+ this.fs.copyTpl(
+ this.templatePath('aws-credentials.json'),
+ this.destinationPath('aws-credentials.json')
+ );
+ }
+
+ if (this.options.uploading === 'Rsync') {
+ this.fs.copyTpl(
+ this.templatePath('rsync-credentials.json'),
+ this.destinationPath('rsync-credentials.json')
+ );
+ }
+ }
+ }
+});
diff --git a/generators/gulp/templates/aws-credentials.json b/generators/gulp/templates/aws-credentials.json
new file mode 100644
index 0000000..bff1f71
--- /dev/null
+++ b/generators/gulp/templates/aws-credentials.json
@@ -0,0 +1,7 @@
+{
+ "params": {
+ "Bucket": ""
+ },
+ "accessKeyId": "1231923123",
+ "secretAccessKey": "ABC123ACB12"
+}
diff --git a/generators/gulp/templates/gulpfile.js b/generators/gulp/templates/gulpfile.js
new file mode 100644
index 0000000..6551e2f
--- /dev/null
+++ b/generators/gulp/templates/gulpfile.js
@@ -0,0 +1,322 @@
+'use strict';
+
+<% if (amazonS3 || rsync) { -%>
+// 'fs' is used to read files from the system (used for uploading)
+const fs = require('fs');
+<% } -%>
+const gulp = require('gulp');
+// Loads the plugins without having to list all of them, but you need
+// to call them as $.pluginname
+const gulpLoadPlugins = require('gulp-load-plugins');
+const $ = gulpLoadPlugins();
+// Delete stuff
+const del = require('del');
+// Used to run shell commands
+const shell = require('shelljs');
+<% if (amazonS3) { -%>
+// Parallelize the uploads when uploading to Amazon S3
+const parallelize = require('concurrent-transform');
+<% } -%>
+// BrowserSync is used to live-reload your website
+const browserSync = require('browser-sync').create();
+// AutoPrefixer
+const autoprefixer = require('autoprefixer');
+// Yargs for command line arguments
+const argv = require('yargs').argv;
+
+// 'gulp clean:assets' -- deletes all assets except for images
+// 'gulp clean:images' -- deletes your images
+// 'gulp clean:dist' -- erases the dist directory
+// 'gulp clean:gzip' -- erases all the gzipped files
+// 'gulp clean:jekyll' -- deletes the temporary Jekyll site
+gulp.task('clean:assets', () => {
+ return del(['.tmp/**/*', '!.tmp/assets', '!.tmp/assets/images', '!.tmp/assets/images/**/*', 'dist/assets']);
+});
+gulp.task('clean:images', () => {
+ return del(['.tmp/assets/images', 'dist/assets/images']);
+});
+gulp.task('clean:dist', () => {
+ return del(['dist/', '.tmp/dist']);
+});
+gulp.task('clean:gzip', () => {
+ return del(['dist/**/*.gz']);
+});
+gulp.task('clean:jekyll', () => {
+ return del(['.tmp/jekyll']);
+});
+
+// 'gulp jekyll:tmp' -- copies your Jekyll site to a temporary directory
+// to be processed
+gulp.task('jekyll:tmp', () =>
+ gulp.src(['src/**/*', '!src/assets/**/*', '!src/assets'])
+ .pipe(gulp.dest('.tmp/jekyll'))
+ .pipe($.size({title: 'Jekyll'}))
+);
+
+// 'gulp jekyll' -- builds your site with development settings
+// 'gulp jekyll --prod' -- builds your site with production settings
+gulp.task('jekyll', done => {
+ if (!argv.prod) {
+ shell.exec('jekyll build');
+ done();
+ } else if (argv.prod) {
+ shell.exec('jekyll build --config _config.yml,_config.build.yml');
+ done();
+ }
+});
+
+// 'gulp doctor' -- literally just runs jekyll doctor
+gulp.task('jekyll:doctor', done => {
+ shell.exec('jekyll doctor');
+ done();
+});
+
+// 'gulp styles' -- creates a CSS file from your SASS, adds prefixes and
+// creates a Sourcemap
+// 'gulp styles --prod' -- creates a CSS file from your SASS, adds prefixes and
+// then minifies, gzips and cache busts it. Does not create a Sourcemap
+gulp.task('styles', () =>
+ gulp.src('src/assets/scss/style.scss')
+ .pipe($.if(!argv.prod, $.sourcemaps.init()))
+ .pipe($.sass({
+ precision: 10
+ }).on('error', $.sass.logError))
+ .pipe($.postcss([
+ autoprefixer({browsers: 'last 1 version'})
+ ]))
+ .pipe($.size({
+ title: 'styles',
+ showFiles: true
+ }))
+ .pipe($.if(argv.prod, $.rename({suffix: '.min'})))
+ .pipe($.if(argv.prod, $.if('*.css', $.cssnano({autoprefixer: false}))))
+ .pipe($.if(argv.prod, $.size({
+ title: 'minified styles',
+ showFiles: true
+ })))
+ .pipe($.if(argv.prod, $.rev()))
+ .pipe($.if(!argv.prod, $.sourcemaps.write('.')))
+ .pipe($.if(argv.prod, gulp.dest('.tmp/assets/stylesheets')))
+ .pipe($.if(argv.prod, $.if('*.css', $.gzip({append: true}))))
+ .pipe($.if(argv.prod, $.size({
+ title: 'gzipped styles',
+ gzip: true,
+ showFiles: true
+ })))
+ .pipe(gulp.dest('.tmp/assets/stylesheets'))
+ .pipe($.if(!argv.prod, browserSync.stream({match: '**/*.css'})))
+);
+
+// 'gulp scripts' -- creates a index.js file from your JavaScript files and
+// creates a Sourcemap for it
+// 'gulp scripts --prod' -- creates a index.js file from your JavaScript files,
+// minifies, gzips and cache busts it. Does not create a Sourcemap
+gulp.task('scripts', () =>
+ // NOTE: The order here is important since it's concatenated in order from
+ // top to bottom, so you want vendor scripts etc on top
+ gulp.src([
+ 'src/assets/javascript/vendor.js',
+ 'src/assets/javascript/main.js'
+ ])
+ .pipe($.newer('.tmp/assets/javascript/index.js', {dest: '.tmp/assets/javascript', ext: '.js'}))
+ .pipe($.if(!argv.prod, $.sourcemaps.init()))
+ .pipe($.concat('index.js'))
+ .pipe($.size({
+ title: 'scripts',
+ showFiles: true
+ }))
+ .pipe($.if(argv.prod, $.rename({suffix: '.min'})))
+ .pipe($.if(argv.prod, $.if('*.js', $.uglify({preserveComments: 'some'}))))
+ .pipe($.if(argv.prod, $.size({
+ title: 'minified scripts',
+ showFiles: true
+ })))
+ .pipe($.if(argv.prod, $.rev()))
+ .pipe($.if(!argv.prod, $.sourcemaps.write('.')))
+ .pipe($.if(argv.prod, gulp.dest('.tmp/assets/javascript')))
+ .pipe($.if(argv.prod, $.if('*.js', $.gzip({append: true}))))
+ .pipe($.if(argv.prod, $.size({
+ title: 'gzipped scripts',
+ gzip: true,
+ showFiles: true
+ })))
+ .pipe(gulp.dest('.tmp/assets/javascript'))
+ .pipe($.if(!argv.prod, browserSync.stream({match: '**/*.js'})))
+);
+
+// 'gulp inject:head' -- injects our style.css file into the head of our HTML
+gulp.task('inject:head', () =>
+ gulp.src('.tmp/jekyll/_includes/head.html')
+ .pipe($.inject(gulp.src('.tmp/assets/stylesheets/*.css',
+ {read: false}), {ignorePath: '.tmp'}))
+ .pipe(gulp.dest('.tmp/jekyll/_includes'))
+);
+
+// 'gulp inject:footer' -- injects our index.js file into the end of our HTML
+gulp.task('inject:footer', () =>
+ gulp.src('.tmp/jekyll/_layouts/default.html')
+ .pipe($.inject(gulp.src('.tmp/assets/javascript/*.js',
+ {read: false}), {ignorePath: '.tmp'}))
+ .pipe(gulp.dest('.tmp/jekyll/_layouts'))
+);
+
+// 'gulp images' -- optimizes and caches your images
+gulp.task('images', () =>
+ gulp.src('src/assets/images/**/*')
+ .pipe($.cache($.imagemin([
+ $.imagemin.gifsicle({interlaced: true}),
+ $.imagemin.jpegtran({progressive: true}),
+ $.imagemin.optipng(),
+ $.imagemin.svgo({plugins: [{cleanupIDs: false}]})
+ ])))
+ .pipe(gulp.dest('.tmp/assets/images'))
+ .pipe($.size({title: 'images'}))
+);
+
+// 'gulp fonts' -- copies your fonts to the temporary assets directory
+gulp.task('fonts', () =>
+ gulp.src('src/assets/fonts/**/*')
+ .pipe(gulp.dest('.tmp/assets/fonts'))
+ .pipe($.size({title: 'fonts'}))
+);
+
+// 'gulp html' -- does nothing
+// 'gulp html --prod' -- minifies and gzips our HTML files
+gulp.task('html', () =>
+ gulp.src('dist/**/*.html')
+ .pipe($.if(argv.prod, $.htmlmin({
+ removeComments: true,
+ collapseWhitespace: true,
+ collapseBooleanAttributes: true,
+ removeAttributeQuotes: true,
+ removeRedundantAttributes: true
+ })))
+ .pipe($.if(argv.prod, $.size({title: 'optimized HTML'})))
+ .pipe($.if(argv.prod, gulp.dest('dist')))
+ .pipe($.if(argv.prod, $.gzip({append: true})))
+ .pipe($.if(argv.prod, $.size({
+ title: 'gzipped HTML',
+ gzip: true
+ })))
+ .pipe($.if(argv.prod, gulp.dest('dist')))
+);
+
+<% if (amazonS3) { -%>
+// 'gulp deploy' -- reads from your AWS Credentials file, creates the correct
+// headers for your files and uploads them to S3
+gulp.task('deploy', () => {
+ var credentials = JSON.parse(fs.readFileSync('aws-credentials.json', 'utf8'));
+ var publisher = $.awspublish.create(credentials);
+
+ var headers = {
+ 'Cache-Control': 'max-age=315360000, no-transform, public'
+ };
+
+ return gulp.src('dist/**/*')
+ .pipe($.awspublish.gzip())
+ .pipe(parallelize(publisher.publish(headers), 30))
+ .pipe(publisher.cache())
+ .pipe(publisher.sync())
+ .pipe($.awspublish.reporter());
+});
+
+<% } -%><% if (rsync) { -%>
+// 'gulp deploy' -- reads from your Rsync credentials file and incrementally
+// uploads your site to your server
+gulp.task('deploy', () => {
+ var credentials = JSON.parse(fs.readFileSync('rsync-credentials.json', 'utf8'));
+
+ return gulp.src('dist/**')
+ .pipe($.rsync({
+ root: 'dist',
+ hostname: credentials.hostname,
+ username: credentials.username,
+ destination: credentials.destination,
+ incremental: true
+ }));
+});
+
+<% } -%><% if (ghpages) { -%>
+// 'gulp deploy' -- pushes your dist folder to Github
+gulp.task('deploy', () => {
+ return gulp.src('dist/**/*')
+ .pipe($.ghPages());
+});
+
+<% } -%>
+<% if (noUpload) { -%><% } -%>
+// 'gulp assets:copy' -- copies the assets into the dist directory, needs to be
+// done this way because Jekyll overwrites the whole directory otherwise
+gulp.task('copy:assets', () =>
+ gulp.src('.tmp/assets/**/*')
+ .pipe(gulp.dest('dist/assets'))
+);
+
+// 'gulp jekyll:copy' -- copies your processed Jekyll site to the dist directory
+gulp.task('copy:jekyll', () =>
+ gulp.src('.tmp/dist/**/*')
+ .pipe(gulp.dest('dist'))
+);
+
+// 'gulp inject' -- injects your CSS and JS into either the header or the footer
+gulp.task('inject', gulp.parallel('inject:head', 'inject:footer'));
+
+// 'gulp build:jekyll' -- copies, builds, and then copies it again
+gulp.task('build:jekyll', gulp.series('jekyll:tmp', 'inject', 'jekyll', 'copy:jekyll'));
+
+// Function to properly reload your browser
+function reload(done) {
+ browserSync.reload();
+ done();
+}
+// 'gulp serve' -- open up your website in your browser and watch for changes
+// in all your files and update them when needed
+gulp.task('serve', (done) => {
+ browserSync.init({
+ // tunnel: true,
+ // open: false,
+ server: ['.tmp', 'dist']
+ });
+ done();
+
+ // Watch various files for changes and do the needful
+ gulp.watch(['src/**/*.md', 'src/**/*.html', 'src/**/*.yml'], gulp.series('build:jekyll', reload));
+ gulp.watch(['src/**/*.xml', 'src/**/*.txt'], gulp.series('jekyll'));
+ gulp.watch('src/assets/javascript/**/*.js', gulp.series('scripts'));
+ gulp.watch('src/assets/scss/**/*.scss', gulp.series('styles'));
+ gulp.watch('src/assets/images/**/*', reload);
+});
+
+// 'gulp assets' -- cleans out your assets and rebuilds them
+// 'gulp assets --prod' -- cleans out your assets and rebuilds them with
+// production settings
+gulp.task('assets', gulp.series(
+ gulp.parallel('styles', 'scripts', 'fonts', 'images'),
+ gulp.series('copy:assets')
+));
+
+// 'gulp clean' -- erases your assets and gzipped files
+gulp.task('clean', gulp.series('clean:assets', 'clean:gzip', 'clean:dist', 'clean:jekyll'));
+
+// 'gulp build' -- same as 'gulp' but doesn't serve your site in your browser
+// 'gulp build --prod' -- same as above but with production settings
+gulp.task('build', gulp.series(
+ gulp.series('clean:assets', 'clean:gzip'),
+ gulp.series('clean', 'assets', 'build:jekyll'),
+ gulp.series('html')
+));
+
+// 'gulp rebuild' -- WARNING: Erases your assets and built site, use only when
+// you need to do a complete rebuild
+gulp.task('rebuild', gulp.series('clean:dist', 'clean:assets', 'clean:images'));
+
+// 'gulp check' -- checks your Jekyll configuration for errors and lint your JS
+gulp.task('check', gulp.series('jekyll:doctor'));
+
+// 'gulp' -- cleans your assets and gzipped files, creates your assets and
+// injects them into the templates, then builds your site, copied the assets
+// into their directory and serves the site
+// 'gulp --prod' -- same as above but with production settings
+gulp.task('default', gulp.series(
+ gulp.series('build', 'serve')
+));
diff --git a/generators/gulp/templates/rsync-credentials.json b/generators/gulp/templates/rsync-credentials.json
new file mode 100644
index 0000000..7fbb6ab
--- /dev/null
+++ b/generators/gulp/templates/rsync-credentials.json
@@ -0,0 +1,5 @@
+{
+ "username": "example",
+ "hostname": "192.168.1.1",
+ "destination": "/srv/example.com/www/"
+}
diff --git a/generators/jekyll/index.js b/generators/jekyll/index.js
new file mode 100644
index 0000000..9746e64
--- /dev/null
+++ b/generators/jekyll/index.js
@@ -0,0 +1,112 @@
+'use strict';
+
+var generators = require('yeoman-generator');
+
+module.exports = generators.Base.extend({
+ constructor: function () {
+ generators.Base.apply(this, arguments);
+
+ this.option('projectName', {
+ type: String,
+ required: true,
+ desc: 'Project name'
+ });
+
+ this.option('projectDescription', {
+ type: String,
+ required: true,
+ desc: 'Project description'
+ });
+
+ this.option('projectURL', {
+ type: String,
+ required: true,
+ desc: 'Project URL'
+ });
+
+ this.option('authorName', {
+ type: String,
+ required: true,
+ desc: 'Author name'
+ });
+
+ this.option('authorEmail', {
+ type: String,
+ required: true,
+ desc: 'Author email'
+ });
+
+ this.option('authorURI', {
+ type: String,
+ required: true,
+ desc: 'Author URI'
+ });
+
+ this.option('authorBio', {
+ type: String,
+ required: true,
+ desc: 'Author bio'
+ });
+
+ this.option('authorTwitter', {
+ type: String,
+ required: true,
+ desc: 'Author Twitter'
+ });
+
+ this.option('authorGithub', {
+ type: String,
+ required: true,
+ desc: 'Author Github'
+ });
+
+ this.option('jekyllPermalinks', {
+ type: String,
+ required: true,
+ desc: 'Jekyll permalinks'
+ });
+ },
+
+ writing: function () {
+ this.fs.copy(
+ this.templatePath('Gemfile'),
+ this.destinationPath('Gemfile')
+ );
+
+ this.fs.copyTpl(
+ this.templatePath('config.yml'),
+ this.destinationPath('_config.yml'),
+ {
+ projectName: this.options.projectName,
+ projectDescription: this.options.projectDescription,
+ projectURL: this.options.projectURL,
+ authorName: this.options.authorName,
+ authorEmail: this.options.authorEmail,
+ authorURI: this.options.authorURI,
+ authorBio: this.options.authorBio,
+ authorTwitter: this.options.authorTwitter,
+ authorGithub: this.options.authorGithub,
+ jekyllPermalinks: this.options.jekyllPermalinks
+ }
+ );
+
+ this.fs.copyTpl(
+ this.templatePath('config.build.yml'),
+ this.destinationPath('_config.build.yml')
+ );
+
+ this.fs.copyTpl(
+ this.templatePath('humans.txt'),
+ this.destinationPath('src/humans.txt'),
+ {
+ authorName: this.options.authorName,
+ authorTwitter: this.options.authorTwitter
+ }
+ );
+
+ this.fs.copy(
+ this.templatePath('app'),
+ this.destinationPath('src')
+ );
+ }
+});
diff --git a/generators/jekyll/templates/Gemfile b/generators/jekyll/templates/Gemfile
new file mode 100644
index 0000000..4b55c70
--- /dev/null
+++ b/generators/jekyll/templates/Gemfile
@@ -0,0 +1,11 @@
+source "http://rubygems.org"
+
+gem 'jekyll'
+gem 'redcarpet'
+
+# jekyll plugins
+gem 'jekyll-feed'
+gem 'jekyll-gist'
+gem 'jekyll-paginate'
+gem 'jekyll-sitemap'
+gem 'jekyll-seo-tag'
diff --git a/app/templates/app/404.html b/generators/jekyll/templates/app/404.html
similarity index 65%
rename from app/templates/app/404.html
rename to generators/jekyll/templates/app/404.html
index 5f5b9bf..46f2d7b 100644
--- a/app/templates/app/404.html
+++ b/generators/jekyll/templates/app/404.html
@@ -5,5 +5,7 @@
404: Page not found
-
Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. Head back home to try finding it again.
+
Sorry, we've misplaced that URL or it's pointing to something
+ that doesn't exist. Head back home to try finding it
+ again.
diff --git a/app/templates/app/_drafts/2014-03-01-example-content.md b/generators/jekyll/templates/app/_drafts/2014-03-01-example-content.md
similarity index 58%
rename from app/templates/app/_drafts/2014-03-01-example-content.md
rename to generators/jekyll/templates/app/_drafts/2014-03-01-example-content.md
index e6e5462..fb41e06 100644
--- a/app/templates/app/_drafts/2014-03-01-example-content.md
+++ b/generators/jekyll/templates/app/_drafts/2014-03-01-example-content.md
@@ -5,74 +5,99 @@ title: Example content
categories: jekyll example
---
+
Howdy! This is an example blog post that shows several
+types of HTML content supported in this theme.
-
- Howdy! This is an example blog post that shows several types of HTML content supported in this theme.
-
+Cum sociis natoque penatibus et magnis dis parturient montes,
+nascetur ridiculus mus. *Aenean eu leo quam.* Pellentesque ornare sem lacinia
+quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis
+consectetur purus sit amet fermentum.
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. *Aenean eu leo quam.* Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.
+> Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare
+> vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.
-> Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.
+Etiam porta **sem malesuada magna** mollis euismod. Cras mattis consectetur
+purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.
-Etiam porta **sem malesuada magna** mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.
+
## Inline HTML elements
-HTML defines a long list of available inline tags, a complete list of which can be found on the [Mozilla Developer Network](https://developer.mozilla.org/en-US/docs/Web/HTML/Element).
+HTML defines a long list of available inline tags, a complete list of which can
+be found on the [Mozilla Developer
+Network](https://developer.mozilla.org/en-US/docs/Web/HTML/Element).
- **To bold text**, use ``.
- *To italicize text*, use ``.
-- Abbreviations, like HTML should use ``, with an optional `title` attribute for the full phrase.
+- Abbreviations, like HTML should
+ use ``, with an optional `title` attribute for the full phrase.
- Citations, like — Mark otto, should use ``.
-- Deleted text should use `` and inserted text should use ``.
-- Superscript text uses `` and subscript text uses ``.
+- Deleted text should use `` and inserted text should
+ use ``.
+- Superscript text uses `` and subscript text uses
+ ``.
Most of these elements are styled by browsers with few modifications on our part.
## Heading
-Vivamus sagittis lacus vel augue rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
+Vivamus sagittis lacus vel augue rutrum faucibus dolor auctor. Duis mollis, est
+non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.
+Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
### Code
-Cum sociis natoque penatibus et magnis dis `code element` montes, nascetur ridiculus mus.
+Cum sociis natoque penatibus et magnis dis `code element` montes, nascetur
+ridiculus mus.
{% highlight js %}
// Example can be run directly in your JavaScript console
-// Create a function that takes two arguments and returns the sum of those arguments
-var adder = new Function("a", "b", "return a + b");
+// Create a function that takes two arguments and returns the sum of those
+arguments var adder = new Function("a", "b", "return a + b");
// Call the function
adder(2, 6);
// > 8
{% endhighlight %}
-Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.
+Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna
+mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris
+condimentum nibh, ut fermentum massa.
### Gists via GitHub Pages
-Vestibulum id ligula porta felis euismod semper. Nullam quis risus eget urna mollis ornare vel eu leo. Donec sed odio dui.
+Vestibulum id ligula porta felis euismod semper. Nullam quis risus eget urna
+mollis ornare vel eu leo. Donec sed odio dui.
{% gist 5555251 gist.md %}
-Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Vestibulum id ligula porta felis euismod semper.
+Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.
+Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque
+penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed
+odio dui. Vestibulum id ligula porta felis euismod semper.
### Lists
-Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
+Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
+mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada
+magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris
+condimentum nibh, ut fermentum massa justo sit amet risus.
* Praesent commodo cursus magna, vel scelerisque nisl consectetur et.
* Donec id elit non mi porta gravida at eget metus.
* Nulla vitae elit libero, a pharetra augue.
-Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.
+Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a
+pharetra augue.
1. Vestibulum id ligula porta felis euismod semper.
-2. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+2. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur
+ ridiculus mus.
3. Maecenas sed diam eget risus varius blandit sit amet non magna.
-Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis.
+Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at
+lobortis.
HyperText Markup Language (HTML)
@@ -85,11 +110,14 @@ Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at
The programming language used to build advanced Web sites and applications
-Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nullam quis risus eget urna mollis ornare vel eu leo.
+Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Morbi leo
+risus, porta ac consectetur ac, vestibulum at eros. Nullam quis risus eget urna
+mollis ornare vel eu leo.
### Tables
-Aenean lacinia bibendum nulla sed consectetur. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+Aenean lacinia bibendum nulla sed consectetur. Lorem ipsum dolor sit amet,
+consectetur adipiscing elit.
@@ -125,8 +153,5 @@ Aenean lacinia bibendum nulla sed consectetur. Lorem ipsum dolor sit amet, conse
-Nullam id dolor id nibh ultricies vehicula ut id elit. Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo.
-
------
-
-Want to see something else added? Open an issue.
+Nullam id dolor id nibh ultricies vehicula ut id elit. Sed posuere consectetur
+est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo.
diff --git a/generators/jekyll/templates/app/_includes/footer.html b/generators/jekyll/templates/app/_includes/footer.html
new file mode 100644
index 0000000..73e6df4
--- /dev/null
+++ b/generators/jekyll/templates/app/_includes/footer.html
@@ -0,0 +1,38 @@
+
diff --git a/generators/jekyll/templates/app/_includes/head.html b/generators/jekyll/templates/app/_includes/head.html
new file mode 100644
index 0000000..abe2035
--- /dev/null
+++ b/generators/jekyll/templates/app/_includes/head.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+ {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+ {% feed_meta %}
+
+
+ {% seo %}
+
diff --git a/generators/jekyll/templates/app/_includes/header.html b/generators/jekyll/templates/app/_includes/header.html
new file mode 100644
index 0000000..ee39294
--- /dev/null
+++ b/generators/jekyll/templates/app/_includes/header.html
@@ -0,0 +1,27 @@
+
+
+