jekyll_pages_api 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/CONTRIBUTING.md +22 -0
- data/Gemfile +4 -0
- data/LICENSE.md +31 -0
- data/README.md +37 -0
- data/Rakefile +2 -0
- data/jekyll_pages_api.gemspec +26 -0
- data/lib/jekyll/site.rb +17 -0
- data/lib/jekyll_pages_api/filters.rb +38 -0
- data/lib/jekyll_pages_api/generator.rb +44 -0
- data/lib/jekyll_pages_api/page.rb +44 -0
- data/lib/jekyll_pages_api/page_without_a_file.rb +10 -0
- data/lib/jekyll_pages_api/version.rb +3 -0
- data/lib/jekyll_pages_api.rb +2 -0
- data/spec/filters_spec.rb +7 -0
- data/spec/integration_spec.rb +62 -0
- data/spec/page_spec.rb +19 -0
- data/spec/site/.gitignore +3 -0
- data/spec/site/Gemfile +7 -0
- data/spec/site/_config.yml +14 -0
- data/spec/site/_includes/footer.html +55 -0
- data/spec/site/_includes/head.html +12 -0
- data/spec/site/_includes/header.html +27 -0
- data/spec/site/_layouts/default.html +20 -0
- data/spec/site/_layouts/page.html +14 -0
- data/spec/site/_layouts/post.html +15 -0
- data/spec/site/_posts/2015-01-26-welcome-to-jekyll.markdown +25 -0
- data/spec/site/_sass/_base.scss +204 -0
- data/spec/site/_sass/_layout.scss +236 -0
- data/spec/site/_sass/_syntax-highlighting.scss +67 -0
- data/spec/site/about.md +11 -0
- data/spec/site/css/main.scss +52 -0
- data/spec/site/feed.xml +30 -0
- data/spec/site/index.html +23 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/shell.rb +6 -0
- metadata +175 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4485de15e66a09dedf59a42575b00ae341f442e9
|
4
|
+
data.tar.gz: f1063959c1529374a696d1be62521fa451de8b71
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a589f6459b68d956a086a1c81a0cc6736115d6e403c38733626d6e90cc5ff601a42fb751031d3d017b62b9dad17038fced9ce7c1bcf46113510e03baff01f3b7
|
7
|
+
data.tar.gz: 0f791a9cfe8bf63305e66d0248fba0372ce911425edbbc35ab357497b7143413807ece67b91ebb1821dfc46ac39090b9d95102e0d1a322dce7fd074d021a9f5c
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
## Welcome!
|
2
|
+
|
3
|
+
We're so glad you're thinking about contributing to an 18F open source project! If you're unsure or afraid of anything, just ask or submit the issue or pull request anyways. The worst that can happen is that you'll be politely asked to change something. We appreciate any sort of contribution, and don't want a wall of rules to get in the way of that.
|
4
|
+
|
5
|
+
Before contributing, we encourage you to read our CONTRIBUTING policy (you are here), our LICENSE, and our README, all of which should be in this repository. If you have any questions, or want to read more about our underlying policies, you can consult the 18F Open Source Policy GitHub repository at https://github.com/18f/open-source-policy, or just shoot us an email/official government letterhead note to [18f@gsa.gov](mailto:18f@gsa.gov).
|
6
|
+
|
7
|
+
## Running tests
|
8
|
+
|
9
|
+
```bash
|
10
|
+
bundle
|
11
|
+
bundle exec rspec
|
12
|
+
```
|
13
|
+
|
14
|
+
## Public domain
|
15
|
+
|
16
|
+
This project is in the public domain within the United States, and
|
17
|
+
copyright and related rights in the work worldwide are waived through
|
18
|
+
the [CC0 1.0 Universal public domain dedication](https://creativecommons.org/publicdomain/zero/1.0/).
|
19
|
+
|
20
|
+
All contributions to this project will be released under the CC0
|
21
|
+
dedication. By submitting a pull request, you are agreeing to comply
|
22
|
+
with this waiver of copyright interest.
|
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
As a work of the United States Government, this project is in the
|
2
|
+
public domain within the United States.
|
3
|
+
|
4
|
+
Additionally, we waive copyright and related rights in the work
|
5
|
+
worldwide through the CC0 1.0 Universal public domain dedication.
|
6
|
+
|
7
|
+
## CC0 1.0 Universal Summary
|
8
|
+
|
9
|
+
This is a human-readable summary of the [Legal Code (read the full text)](https://creativecommons.org/publicdomain/zero/1.0/legalcode).
|
10
|
+
|
11
|
+
### No Copyright
|
12
|
+
|
13
|
+
The person who associated a work with this deed has dedicated the work to
|
14
|
+
the public domain by waiving all of his or her rights to the work worldwide
|
15
|
+
under copyright law, including all related and neighboring rights, to the
|
16
|
+
extent allowed by law.
|
17
|
+
|
18
|
+
You can copy, modify, distribute and perform the work, even for commercial
|
19
|
+
purposes, all without asking permission.
|
20
|
+
|
21
|
+
### Other Information
|
22
|
+
|
23
|
+
In no way are the patent or trademark rights of any person affected by CC0,
|
24
|
+
nor are the rights that other persons may have in the work or in how the
|
25
|
+
work is used, such as publicity or privacy rights.
|
26
|
+
|
27
|
+
Unless expressly stated otherwise, the person who associated a work with
|
28
|
+
this deed makes no warranties about the work, and disclaims liability for
|
29
|
+
all uses of the work, to the fullest extent permitted by applicable law.
|
30
|
+
When using or citing the work, you should not imply endorsement by the
|
31
|
+
author or the affirmer.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Jekyll Pages API [![Build Status](https://travis-ci.org/18F/jekyll_pages_api.svg?branch=master)](https://travis-ci.org/18F/jekyll_pages_api)
|
2
|
+
|
3
|
+
Jekyll Pages API is a [Jekyll Plugin](http://jekyllrb.com/docs/plugins/) gem that generates a JSON file with data for all the Pages in your Site. [Jekyll](http://jekyllrb.com), if you're not familiar, is a static website generator written in Ruby.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
group :jekyll_plugins do
|
11
|
+
gem 'jekyll_pages_api'
|
12
|
+
end
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
```bash
|
18
|
+
bundle
|
19
|
+
bundle exec jekyll serve
|
20
|
+
```
|
21
|
+
|
22
|
+
You can then see the generated JSON file at http://localhost:4000/api/v1/pages.json, which will look something like this:
|
23
|
+
|
24
|
+
```json
|
25
|
+
{
|
26
|
+
"entries": [
|
27
|
+
{
|
28
|
+
"title": "18F Hub",
|
29
|
+
"url": "/",
|
30
|
+
"body": "18F is a digital services team within GSA..."
|
31
|
+
},
|
32
|
+
...
|
33
|
+
]
|
34
|
+
}
|
35
|
+
```
|
36
|
+
|
37
|
+
This endpoint will be re-generated any time your site it rebuilt.
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'jekyll_pages_api/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "jekyll_pages_api"
|
8
|
+
spec.version = JekyllPagesApi::VERSION
|
9
|
+
spec.authors = ["Aidan Feldman"]
|
10
|
+
spec.email = ["aidan.feldman@gsa.gov"]
|
11
|
+
spec.summary = %q{A Jekyll Plugin that generates a JSON file with data for all the Pages in your Site.}
|
12
|
+
spec.homepage = "https://github.com/18F/jekyll_pages_api"
|
13
|
+
spec.license = "CC0-1.0"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency "htmlentities", "~> 4.3"
|
21
|
+
spec.add_dependency "jekyll", "~> 2.0"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
26
|
+
end
|
data/lib/jekyll/site.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'jekyll/site'
|
2
|
+
require_relative '../jekyll_pages_api/generator'
|
3
|
+
|
4
|
+
module Jekyll
|
5
|
+
class Site
|
6
|
+
# monkey-patch to make an after_render hook
|
7
|
+
alias_method :orig_render, :render
|
8
|
+
def render
|
9
|
+
orig_render
|
10
|
+
after_render
|
11
|
+
end
|
12
|
+
|
13
|
+
def after_render
|
14
|
+
JekyllPagesApi::Generator.new(self).generate
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'htmlentities'
|
2
|
+
require 'liquid'
|
3
|
+
|
4
|
+
module JekyllPagesApi
|
5
|
+
# This is a hack to allow the module functions to be used
|
6
|
+
class Filters
|
7
|
+
include Liquid::StandardFilters
|
8
|
+
|
9
|
+
def decode_html(str)
|
10
|
+
html_decoder.decode(str)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Slight tweak of
|
14
|
+
# https://github.com/Shopify/liquid/blob/v2.6.1/lib/liquid/standardfilters.rb#L71-L74
|
15
|
+
# to replace newlines with spaces.
|
16
|
+
def condense(str)
|
17
|
+
str.to_s.gsub(/\s+/m, ' '.freeze).strip
|
18
|
+
end
|
19
|
+
|
20
|
+
def text_only(str)
|
21
|
+
# apply each filter in order
|
22
|
+
[
|
23
|
+
:strip_html,
|
24
|
+
:condense,
|
25
|
+
:decode_html
|
26
|
+
].reduce(str) do |result, filter|
|
27
|
+
self.send(filter, result)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def html_decoder
|
35
|
+
@html_decoder = HTMLEntities.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'page'
|
2
|
+
require_relative 'page_without_a_file'
|
3
|
+
|
4
|
+
module JekyllPagesApi
|
5
|
+
class Generator
|
6
|
+
attr_reader :site
|
7
|
+
|
8
|
+
def initialize(site)
|
9
|
+
@site = site
|
10
|
+
end
|
11
|
+
|
12
|
+
def pages
|
13
|
+
self.site.pages.map{|page| Page.new(page) }.select(&:html?)
|
14
|
+
end
|
15
|
+
|
16
|
+
def pages_data
|
17
|
+
self.pages.map(&:to_json)
|
18
|
+
end
|
19
|
+
|
20
|
+
def data
|
21
|
+
{
|
22
|
+
entries: pages_data
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def dest_dir
|
27
|
+
File.join('api', 'v1')
|
28
|
+
end
|
29
|
+
|
30
|
+
def page
|
31
|
+
# based on https://github.com/jekyll/jekyll-sitemap/blob/v0.7.0/lib/jekyll-sitemap.rb#L51-L54
|
32
|
+
page = PageWithoutAFile.new(self.site, File.dirname(__FILE__), self.dest_dir, 'pages.json')
|
33
|
+
page.content = self.data.to_json
|
34
|
+
page.data['layout'] = nil
|
35
|
+
page.render(Hash.new, self.site.site_payload)
|
36
|
+
|
37
|
+
page
|
38
|
+
end
|
39
|
+
|
40
|
+
def generate
|
41
|
+
self.site.pages << self.page
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'filters'
|
2
|
+
|
3
|
+
module JekyllPagesApi
|
4
|
+
# wrapper for a Jekyll::Page
|
5
|
+
class Page
|
6
|
+
attr_reader :page
|
7
|
+
|
8
|
+
def initialize(page)
|
9
|
+
@page = page
|
10
|
+
end
|
11
|
+
|
12
|
+
def html?
|
13
|
+
%w(.html .md).include?(self.page.ext)
|
14
|
+
end
|
15
|
+
|
16
|
+
def filterer
|
17
|
+
@filterer ||= Filters.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def title
|
21
|
+
self.filterer.decode_html(self.page.data['title'] || '')
|
22
|
+
end
|
23
|
+
|
24
|
+
def base_url
|
25
|
+
self.page.site.baseurl
|
26
|
+
end
|
27
|
+
|
28
|
+
def url
|
29
|
+
[self.base_url, self.page.url].join
|
30
|
+
end
|
31
|
+
|
32
|
+
def body_text
|
33
|
+
self.filterer.text_only(self.page.content)
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_json
|
37
|
+
{
|
38
|
+
title: self.title,
|
39
|
+
url: self.url,
|
40
|
+
body: self.body_text
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'support/shell'
|
3
|
+
|
4
|
+
describe "integration" do
|
5
|
+
BUILD_DIR = File.join(Dir.pwd, 'spec', 'site')
|
6
|
+
JSON_PATH = File.join(BUILD_DIR, '_site', 'api', 'v1', 'pages.json')
|
7
|
+
|
8
|
+
def read_json(path)
|
9
|
+
contents = File.read(path)
|
10
|
+
JSON.parse(contents)
|
11
|
+
end
|
12
|
+
|
13
|
+
def entries_data
|
14
|
+
json = read_json(JSON_PATH)
|
15
|
+
json['entries']
|
16
|
+
end
|
17
|
+
|
18
|
+
def homepage_data
|
19
|
+
entries_data.find{|page| page['url'] == '/' }
|
20
|
+
end
|
21
|
+
|
22
|
+
before(:context) do
|
23
|
+
# http://bundler.io/man/bundle-exec.1.html#Shelling-out
|
24
|
+
Bundler.with_clean_env do
|
25
|
+
Dir.chdir(BUILD_DIR) do
|
26
|
+
run_cmd('bundle')
|
27
|
+
run_cmd('bundle exec jekyll build')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "generates the JSON file" do
|
33
|
+
expect(File.exist?(JSON_PATH)).to be_truthy
|
34
|
+
end
|
35
|
+
|
36
|
+
it "includes an entry for every page" do
|
37
|
+
urls = entries_data.map{|page| page['url'] }
|
38
|
+
expect(urls).to eq(%w(
|
39
|
+
/about/
|
40
|
+
/index.html
|
41
|
+
))
|
42
|
+
end
|
43
|
+
|
44
|
+
it "removes liquid tags" do
|
45
|
+
entries_data.each do |page|
|
46
|
+
expect(page['body']).to_not include('{%')
|
47
|
+
expect(page['body']).to_not include('{{')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "removes HTML tags" do
|
52
|
+
entries_data.each do |page|
|
53
|
+
expect(page['body']).to_not include('<')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "condenses the content" do
|
58
|
+
entries_data.each do |page|
|
59
|
+
expect(page['body']).to_not match(/\s{2,}/m)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/spec/page_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
describe JekyllPagesApi::Page do
|
2
|
+
describe '#url' do
|
3
|
+
it "returns the path" do
|
4
|
+
site = instance_double(Jekyll::Site, baseurl: Jekyll::Configuration::DEFAULTS['baseurl'])
|
5
|
+
jekyll_page = instance_double(Jekyll::Page, site: site, url: '/foo/')
|
6
|
+
page = JekyllPagesApi::Page.new(jekyll_page)
|
7
|
+
|
8
|
+
expect(page.url).to eq('/foo/')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "prepends the baseurl" do
|
12
|
+
site = instance_double(Jekyll::Site, baseurl: '/base')
|
13
|
+
jekyll_page = instance_double(Jekyll::Page, site: site, url: '/foo/')
|
14
|
+
page = JekyllPagesApi::Page.new(jekyll_page)
|
15
|
+
|
16
|
+
expect(page.url).to eq('/base/foo/')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/site/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# Site settings
|
2
|
+
title: Your awesome title
|
3
|
+
email: your-email@domain.com
|
4
|
+
description: > # this means to ignore newlines until "baseurl:"
|
5
|
+
Write an awesome description for your new site here. You can edit this
|
6
|
+
line in _config.yml. It will appear in your document head meta (for
|
7
|
+
Google search results) and in your feed.xml site description.
|
8
|
+
baseurl: "" # the subpath of your site, e.g. /blog/
|
9
|
+
url: "http://yourdomain.com" # the base hostname & protocol for your site
|
10
|
+
twitter_username: jekyllrb
|
11
|
+
github_username: jekyll
|
12
|
+
|
13
|
+
# Build settings
|
14
|
+
markdown: kramdown
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<footer class="site-footer">
|
2
|
+
|
3
|
+
<div class="wrapper">
|
4
|
+
|
5
|
+
<h2 class="footer-heading">{{ site.title }}</h2>
|
6
|
+
|
7
|
+
<div class="footer-col-wrapper">
|
8
|
+
<div class="footer-col footer-col-1">
|
9
|
+
<ul class="contact-list">
|
10
|
+
<li>{{ site.title }}</li>
|
11
|
+
<li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
|
12
|
+
</ul>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<div class="footer-col footer-col-2">
|
16
|
+
<ul class="social-media-list">
|
17
|
+
{% if site.github_username %}
|
18
|
+
<li>
|
19
|
+
<a href="https://github.com/{{ site.github_username }}">
|
20
|
+
<span class="icon icon--github">
|
21
|
+
<svg viewBox="0 0 16 16">
|
22
|
+
<path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
|
23
|
+
</svg>
|
24
|
+
</span>
|
25
|
+
|
26
|
+
<span class="username">{{ site.github_username }}</span>
|
27
|
+
</a>
|
28
|
+
</li>
|
29
|
+
{% endif %}
|
30
|
+
|
31
|
+
{% if site.twitter_username %}
|
32
|
+
<li>
|
33
|
+
<a href="https://twitter.com/{{ site.twitter_username }}">
|
34
|
+
<span class="icon icon--twitter">
|
35
|
+
<svg viewBox="0 0 16 16">
|
36
|
+
<path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
|
37
|
+
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
|
38
|
+
</svg>
|
39
|
+
</span>
|
40
|
+
|
41
|
+
<span class="username">{{ site.twitter_username }}</span>
|
42
|
+
</a>
|
43
|
+
</li>
|
44
|
+
{% endif %}
|
45
|
+
</ul>
|
46
|
+
</div>
|
47
|
+
|
48
|
+
<div class="footer-col footer-col-3">
|
49
|
+
<p class="text">{{ site.description }}</p>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
</div>
|
54
|
+
|
55
|
+
</footer>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<head>
|
2
|
+
<meta charset="utf-8">
|
3
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
4
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
5
|
+
|
6
|
+
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
|
7
|
+
<meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
|
8
|
+
|
9
|
+
<link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
|
10
|
+
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
|
11
|
+
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" />
|
12
|
+
</head>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<header class="site-header">
|
2
|
+
|
3
|
+
<div class="wrapper">
|
4
|
+
|
5
|
+
<a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
|
6
|
+
|
7
|
+
<nav class="site-nav">
|
8
|
+
<a href="#" class="menu-icon">
|
9
|
+
<svg viewBox="0 0 18 15">
|
10
|
+
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
|
11
|
+
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
|
12
|
+
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
|
13
|
+
</svg>
|
14
|
+
</a>
|
15
|
+
|
16
|
+
<div class="trigger">
|
17
|
+
{% for page in site.pages %}
|
18
|
+
{% if page.title %}
|
19
|
+
<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
|
20
|
+
{% endif %}
|
21
|
+
{% endfor %}
|
22
|
+
</div>
|
23
|
+
</nav>
|
24
|
+
|
25
|
+
</div>
|
26
|
+
|
27
|
+
</header>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
|
4
|
+
{% include head.html %}
|
5
|
+
|
6
|
+
<body>
|
7
|
+
|
8
|
+
{% include header.html %}
|
9
|
+
|
10
|
+
<div class="page-content">
|
11
|
+
<div class="wrapper">
|
12
|
+
{{ content }}
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
{% include footer.html %}
|
17
|
+
|
18
|
+
</body>
|
19
|
+
|
20
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
layout: default
|
3
|
+
---
|
4
|
+
<div class="post">
|
5
|
+
|
6
|
+
<header class="post-header">
|
7
|
+
<h1 class="post-title">{{ page.title }}</h1>
|
8
|
+
<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
|
9
|
+
</header>
|
10
|
+
|
11
|
+
<article class="post-content">
|
12
|
+
{{ content }}
|
13
|
+
</article>
|
14
|
+
|
15
|
+
</div>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
layout: post
|
3
|
+
title: "Welcome to Jekyll!"
|
4
|
+
date: 2015-01-26 02:53:40
|
5
|
+
categories: jekyll update
|
6
|
+
---
|
7
|
+
You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.
|
8
|
+
|
9
|
+
To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.
|
10
|
+
|
11
|
+
Jekyll also offers powerful support for code snippets:
|
12
|
+
|
13
|
+
{% highlight ruby %}
|
14
|
+
def print_hi(name)
|
15
|
+
puts "Hi, #{name}"
|
16
|
+
end
|
17
|
+
print_hi('Tom')
|
18
|
+
#=> prints 'Hi, Tom' to STDOUT.
|
19
|
+
{% endhighlight %}
|
20
|
+
|
21
|
+
Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll’s dedicated Help repository][jekyll-help].
|
22
|
+
|
23
|
+
[jekyll]: http://jekyllrb.com
|
24
|
+
[jekyll-gh]: https://github.com/jekyll/jekyll
|
25
|
+
[jekyll-help]: https://github.com/jekyll/jekyll-help
|