├── .github └── workflows │ └── jekyll_build.yml ├── .gitignore ├── 404.html ├── GHOST.txt ├── Gemfile ├── LICENSE ├── README.md ├── Rakefile ├── _config.yml ├── _data ├── authors.yml └── tags.yml ├── _includes ├── analytics.html ├── author_pagination.html ├── dynamic_tag_info.html ├── dynamic_title.html ├── facebook.html ├── floating-header.html ├── ghost-logo.html ├── head.html ├── infinity.html ├── location.html ├── navigation.html ├── page-scripts.html ├── point.html ├── post-card-error.html ├── post-card-next.html ├── post-card-previous.html ├── post-card.html ├── post-scripts.html ├── post_pagination.html ├── rss.html ├── site-nav.html ├── subscribe-form.html ├── tag_pagination.html ├── twitter.html └── website.html ├── _layouts ├── author.html ├── default.html ├── error.html ├── feed.xml ├── page.html ├── post.html └── tag.html ├── _plugins ├── jekyll-autgenerator.rb ├── jekyll-capitalize-all.rb └── jekyll-tagsgenerator.rb ├── _posts ├── 1863-11-19-gettysburg-address.md ├── 1865-11-26-down-the-rabbit-hole.md ├── 1871-03-18-looking-glass-house.md ├── 1912-07-24-out-to-sea.md ├── 1948-12-12-the-purpose-of-education.md ├── 1963-08-28-i-have-a-dream.md ├── 2012-09-01-a-full-and-comprehensive-style-test.html ├── 2014-08-12-the-businessman-and-fisherman.md ├── 2017-07-27-advanced-markdown.html ├── 2017-07-27-managing-users.html ├── 2017-07-27-private-sites.html ├── 2017-07-27-the-editor.html ├── 2017-07-27-themes.html ├── 2017-07-27-using-tags.html └── 2017-07-27-welcome.md ├── about └── index.md ├── assets ├── built │ ├── global.css │ ├── global.css.map │ ├── screen.css │ ├── screen.css.map │ ├── screen.edited.css │ ├── screen.edited.css.map │ ├── syntax.css │ └── syntax.css.map ├── css │ ├── .csscomb.json │ ├── csscomb.json │ ├── global.css │ ├── screen.css │ ├── screen.edited.css │ └── syntax.css ├── images │ ├── abraham.jpg │ ├── advanced.jpg │ ├── bear.jpg │ ├── blog-cover.jpg │ ├── blog-icon.png │ ├── bus.jpg │ ├── design.jpg │ ├── edgar.gif │ ├── fables.jpg │ ├── favicon.png │ ├── ghost-logo.svg │ ├── ghost.png │ ├── grapes.jpg │ ├── hannah-cover.jpg │ ├── hannah.jpg │ ├── john.jpg │ ├── lewis.jpeg │ ├── locked.jpg │ ├── martin.jpg │ ├── piano.jpg │ ├── sky.jpg │ ├── speeches.jpg │ ├── summit.jpg │ ├── tags.jpg │ ├── team.jpg │ ├── water.jpg │ ├── waves.jpg │ ├── welcome.jpg │ └── writing.jpg ├── js │ ├── infinitescroll.js │ └── jquery.fitvids.js ├── screenshot-desktop.jpg └── screenshot-mobile.jpg ├── atom.xml ├── gulpfile.js ├── index.html ├── jasper2.gemspec ├── npm-shrinkwrap.json ├── package.json └── script.py /.github/workflows/jekyll_build.yml: -------------------------------------------------------------------------------- 1 | name: Build and deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | github-pages: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: helaili/jekyll-action@v2 15 | with: 16 | token: ${{ secrets.GITHUB_TOKEN }} 17 | target_branch: 'gh-pages' 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Jekyll build 5 | /_site/ 6 | .jekyll-metadata 7 | #Gemfile.lock 8 | 9 | # webstorm 10 | .idea/ 11 | 12 | # others 13 | *.swp 14 | package-lock.json 15 | 16 | # site build 17 | *.gem 18 | *.rbc 19 | .bundle 20 | .config 21 | coverage 22 | InstalledFiles 23 | lib/bundler/man 24 | pkg 25 | rdoc 26 | spec/reports 27 | test/tmp 28 | test/version_tmp 29 | tmp 30 | vendor 31 | Gemfile.lock 32 | node_modules 33 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: error 3 | current: error 4 | title: "404 - Page Not Found" 5 | permalink: 404.html 6 | --- 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {{ page.title }} 18 | 19 | 20 | 21 | 22 | 23 | {% include head.html %} 24 | 25 | 26 |
27 | 28 | 39 | 40 |
41 |
42 | 43 |
44 |

404

45 |

Page not found

46 | Go to the front page → 47 |
48 |
49 |
50 | 51 | 52 | 60 | 61 | 62 |
63 | 64 | 65 | -------------------------------------------------------------------------------- /GHOST.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013-2017 Ghost Foundation - Released under The MIT License. 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "jekyll", "~> 3.9.0" 4 | gem "github-pages", "~> 214" 5 | gem "rake", "~> 13.0.3" 6 | gem "slugify", "~> 1.0.7" 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2021 Fábio Madeira 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Jasper2 2 | 3 | [![Build Status](https://github.com/jekyllt/jasper2/actions/workflows/jekyll_build.yml/badge.svg)](https://github.com/jekyllt/jasper2/actions/workflows/jekyll_build.yml) 4 | [![Ruby](https://img.shields.io/badge/ruby-2.6.3-blue.svg?style=flat)](http://travis-ci.org/jekyllt/jasper2) 5 | [![Jekyll](https://img.shields.io/badge/jekyll-3.9.0-blue.svg?style=flat)](http://travis-ci.org/jekyllt/jasper2) 6 | 7 | This is a full-featured port of Ghost's default theme [Casper](https://github.com/tryghost/casper) 8 | [v2.1.9](https://github.com/TryGhost/Casper/releases/tag/2.1.9) for [Jekyll](https://jekyllrb.com/) / [GitHub Pages](https://pages.github.com/). 9 | 10 | ## Live Demo 11 | 12 | [Ghost's Casper](https://demo.ghost.io) // [Jasper2](https://jekyllt.github.io/jasper2) 13 | 14 | ![home page](https://raw.githubusercontent.com/jekyllt/jasper2/master/assets/screenshot-desktop.jpg) 15 | 16 | 17 | ## Features 18 | 19 | * Out of the box support for multiple authors (via `_data/authors.yml`) 20 | * Full author information including: picture, bio, website, twitter, facebook, etc. 21 | * Tag description(s) and personalised covers (via `_data/tags.yml`) 22 | * Related posts view at the bottom of each post 23 | * All Ghost default pages: Author page(s), Tag page(s), About page(s), 404, etc. 24 | * Pagination (infinite scrolling or standard pagination, i.e. posts across multiple pages) 25 | * Atom Feeds by [Jekyll-feed](https://github.com/jekyll/jekyll-feed) 26 | * Toggleable subscribe button (requires an external service) 27 | * Code Syntax Highlight with [highlight.js](https://highlightjs.org/) 28 | * Support for Google Analytics tracking 29 | * Support for Disqus comments (not Ghost standard) 30 | 31 | 32 | ## Getting Started 33 | 34 | ### Deployment 35 | 36 | There are several alternatives to building and deploying the site: 37 | 38 | 1. build the site with [GitHub Actions](https://github.com/features/actions) which pushes 39 | the resulting files (the contents of `_site/` or `../jasper2-pages/`) 40 | to the *gh-pages* branch. This is the approach that is currently used. See 41 | [jekyll_build.yml](.github/workflows/jekyll_build.yml) for more details. 42 | 43 | 2. generate the site locally (more details below) and push the resulting 44 | HTML to a Github repository, that GitHub Pages then host; 45 | 46 | 3. build the site with [travis-ci](https://travis-ci.org/) (with goodies from 47 | [jekyll-travis](https://github.com/mfenner/jekyll-travis)) automatically pushing the 48 | generated HTML files to a *gh-pages* branch. 49 | 50 | 4. deploy the static website with Jekyll-compatible hosters, such as https://www.netlify.com/, that allow for deployment from the Github repo and publish the website using CDNs. Netlify has a free starter offer. 51 | 52 | For option **2)** simply clone this repository (*master branch*), and then run 53 | `bundle exec jekyll serve` inside the directory. Upload the resulting `_site/` (or `../jasper2-pages/`) 54 | contents to your repository (*master branch* if uploading as your personal page 55 | (e.g. username.github.io) or *gh-pages branch* if uploading as a project page 56 | (as for the [demo](https://github.com/jekyllt/jasper2/tree/gh-pages)). 57 | 58 | For option **3)** you will need to set up travis-ci for your personal fork. Briefly all you 59 | need then is to change your details in *[\_config.yml](_config.yml)* so that you can push 60 | to your github repo. You will also need to generate a secure key to add to your 61 | *[.travis.yml](.travis.yml)* (you can find more info on how to do it in that file). 62 | Also make sure you read the documentation from 63 | [jekyll-travis](https://github.com/mfenner/jekyll-travis). This approach has clear 64 | advantages in that you simply push your file changes to GitHub and all the HTML files 65 | are generated for you and pushed to *gh-pages*. Also you get to know if everything is 66 | still fine with your site builds. Don't hesitate to contact me if you still have any 67 | issues (see below about issue tracking). 68 | 69 | ### Author Pages 70 | 71 | In order to properly generate author pages you need to rename the field *author* in the 72 | front matter of every post to match that of your each author's *username* as defined 73 | in the *[\_data/authors.yml](_data/authors.yml)* file. 74 | With the latest update, multiple author blogs are now supported out of the box. 75 | 76 | ### Compiling Styles 77 | 78 | Following on the way Casper styles are compiled as [described here](https://github.com/tryghost/casper#development): 79 | 80 | Jasper2 styles are compiled using Gulp/PostCSS to polyfill future CSS spec. You'll need Node and Gulp installed globally. After that, from the theme's root directory: 81 | 82 | ```bash 83 | $ npm install 84 | $ gulp 85 | ``` 86 | 87 | Now you can edit `/assets/css/` files, which will be compiled to `/assets/built/` automatically. 88 | 89 | ## Issues and Contributing 90 | 91 | This install builds well with Ruby v2.6.3 and Jekyll v3.9.0. If you run into any problems 92 | please log them on the [issue tracker](https://github.com/jekyllt/jasper2/issues). 93 | 94 | Feel free pull-request your patches and fixes. 95 | 96 | ## Thanks 97 | 98 | Many thanks to the Ghost team for all the design work. Also many thanks to all contributors, 99 | that help keeping the project alive and updated :smile: 100 | 101 | 102 | ## Copyright & License 103 | 104 | Same licence as the one provided by Ghost's team. See Casper's theme [license](GHOST.txt). 105 | 106 | Copyright (C) 2015-2021 - Released under the MIT License. 107 | 108 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 109 | 110 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 111 | 112 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 113 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 114 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | ############################################################################# 2 | # 3 | # Modified version of jekyllrb Rakefile 4 | # https://github.com/jekyll/jekyll/blob/master/Rakefile 5 | # 6 | ############################################################################# 7 | 8 | require 'rake' 9 | require 'date' 10 | require 'yaml' 11 | 12 | CONFIG = YAML.load(File.read('_config.yml')) 13 | USERNAME = CONFIG["username"] 14 | REPO = CONFIG["repo"] 15 | SOURCE_BRANCH = CONFIG["branch"] 16 | DESTINATION_BRANCH = "gh-pages" 17 | CNAME = CONFIG["CNAME"] 18 | 19 | def check_destination 20 | unless Dir.exist? CONFIG["destination"] 21 | sh "git clone https://$GIT_NAME:$GH_TOKEN@github.com/#{USERNAME}/#{REPO}.git #{CONFIG["destination"]}" 22 | end 23 | end 24 | 25 | namespace :site do 26 | desc "Generate the site" 27 | task :build do 28 | check_destination 29 | sh "bundle exec jekyll build" 30 | end 31 | 32 | desc "Generate the site and serve locally" 33 | task :serve do 34 | check_destination 35 | sh "bundle exec jekyll serve" 36 | end 37 | 38 | desc "Generate the site, serve locally and watch for changes" 39 | task :watch do 40 | sh "bundle exec jekyll serve --watch" 41 | end 42 | 43 | desc "Generate the site and push changes to remote origin" 44 | task :deploy do 45 | # Detect pull request 46 | if ENV['TRAVIS_PULL_REQUEST'].to_s.to_i > 0 47 | puts 'Pull request detected. Not proceeding with deploy.' 48 | exit 49 | end 50 | 51 | # Configure git if this is run in Travis CI 52 | if ENV["TRAVIS"] 53 | sh "git config --global user.name $GIT_NAME" 54 | sh "git config --global user.email $GIT_EMAIL" 55 | sh "git config --global push.default simple" 56 | end 57 | 58 | # Make sure destination folder exists as git repo 59 | check_destination 60 | 61 | sh "git checkout #{SOURCE_BRANCH}" 62 | Dir.chdir(CONFIG["destination"]) { sh "git checkout #{DESTINATION_BRANCH}" } 63 | 64 | # Generate the site 65 | sh "bundle exec jekyll build" 66 | 67 | # Commit and push to github 68 | sha = `git log`.match(/[a-z0-9]{40}/)[0] 69 | Dir.chdir(CONFIG["destination"]) do 70 | # check if there is anything to add and commit, and pushes it 71 | sh "if [ -n '$(git status)' ]; then 72 | echo '#{CNAME}' > ./CNAME; 73 | git add --all .; 74 | git commit -m 'Updating to #{USERNAME}/#{REPO}@#{sha}.'; 75 | git push --quiet origin #{DESTINATION_BRANCH}; 76 | fi" 77 | puts "Pushed updated branch #{DESTINATION_BRANCH} to GitHub Pages" 78 | end 79 | end 80 | end 81 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Jekyll configuration 2 | markdown: kramdown 3 | highlighter: rouge 4 | paginate: 100 # it will paginate after this number 5 | language: 'en-uk' 6 | words_per_minute: 200 7 | 8 | # edit baseurl to simply '/' if using as your personal page (instead of a project page) 9 | baseurl: /jasper2/ 10 | 11 | # Website info 12 | title: Ghost 13 | description: The professional publishing platform 14 | cover: assets/images/blog-cover.jpg 15 | logo: assets/images/blog-icon.png 16 | logo_dark: assets/images/favicon.png 17 | favicon: assets/images/favicon.png 18 | CNAME: #add cname for website to be created 19 | 20 | # Social info 21 | navigation: True # show the navbar links 22 | subscribers: True # you need to connect an external service for this to work, 23 | # if 'True' the submit button is disabled for now, but you can change that 24 | # by editing `_includes/subscribe-form.html` 25 | twitter: tryghost # replace by your username 26 | facebook: ghost # replace by your username 27 | 28 | # Disqus 29 | disqus: False 30 | disqus_shortname: jekyllt # replace with your disqus username 31 | 32 | # Google Analytics 33 | google_analytics: UA-69281367-1 # replace with your GA tracking identifier 34 | 35 | # Permalinks 36 | permalink: /:title 37 | # permalink: /author/:author 38 | # permalink: /tag/:tag 39 | 40 | # Authors' info in `_data/authors.yml` 41 | # Tags' info in `_data/tags_info.yml` 42 | 43 | # gems and other configs 44 | plugins_dir: [_plugins] 45 | plugins: [jekyll-paginate, jekyll-feed] 46 | 47 | feed: 48 | path: feed.xml 49 | 50 | # Additional settings available on the front-matter 51 | # Site logo in the index.html (as in demo.ghost.io) 52 | # Author's page cover in _layouts/author.html 53 | # The same for page.html and tag.html layouts 54 | # Post's page cover as a per-post basis _posts/... 55 | # Disqus comments as a per-post basis 56 | # ... 57 | 58 | # Settings for building master branch with travis-ci 59 | # with jekyll-travis 60 | 61 | # Settings for deploy rake task 62 | # Username and repo of Github repo, e.g. 63 | # https://github.com/USERNAME/REPO.git 64 | # username defaults to ENV['GIT_NAME'] used by Travis 65 | # repo defaults to USERNAME.github.io 66 | # Branch defaults to "source" for USERNAME.github.io 67 | # or "master" otherwise 68 | safe: False 69 | lsi: False 70 | username: jekyllt 71 | repo: jasper2 72 | branch: master 73 | relative_source: ../jasper2/ 74 | destination: ../jasper2-pages/ 75 | production_url: https://jekyllt.github.io/jasper2/ 76 | source_url: https://github.com/jekyllt/jasper2/ 77 | 78 | exclude: 79 | - assets/css 80 | - node_modules 81 | - vendor 82 | - .travis.yml 83 | - Gemfile 84 | - Gemfile.lock 85 | - GHOST.txt 86 | - gulpfile.js 87 | - LICENSE 88 | - package.json 89 | - package-lock.json 90 | - Rakefile 91 | - README.md 92 | - script.py 93 | - changelog.md 94 | - "*.Rmd" 95 | - .git* 96 | -------------------------------------------------------------------------------- /_data/authors.yml: -------------------------------------------------------------------------------- 1 | ghost: 2 | username: ghost 3 | name: Ghost 4 | url_full: http://jekyllt.github.io/jasper2/ 5 | url: jekyllt.github.io/jasper2 6 | bio: The professional publishing platform 7 | picture: assets/images/ghost.png 8 | facebook: ghost 9 | twitter: tryghost 10 | cover: False 11 | hannah: 12 | username: hannah 13 | name: Hannah Wolfe 14 | location: London, UK 15 | url_full: http://hannah.wf/ 16 | url: hannah.wf 17 | bio: Hannah is the co-founder and lead developer at Ghost. She spends her days looking after Ghost's developer community, tracking down bugs & ensuring Ghost(Pro) is a happy place. 18 | picture: assets/images/hannah.jpg 19 | facebook: False 20 | twitter: erisds 21 | cover: assets/images/hannah-cover.jpg 22 | john: 23 | username: john 24 | name: John O'Nolan 25 | location: On a plane 26 | url_full: http://john.onolan.org/ 27 | url: john.onolan.org 28 | bio: Founder at Ghost.org. Writes about open source, startup life, non-profits, and publishing platforms. Travels the world with a bag of kites. 29 | picture: assets/images/john.jpg 30 | facebook: False 31 | twitter: False 32 | cover: False 33 | lewis: 34 | username: lewis 35 | name: Lewis Carroll 36 | location: Cheshire, England 37 | url_full: False 38 | url: False 39 | bio: My real name is Charles Lutwidge Dodgson, but people call me Lewis. I'm an English writer, mathematician, logician, Anglican deacon and photographer. People know me best for writing about Alice. 40 | picture: assets/images/lewis.jpeg 41 | facebook: False 42 | twitter: False 43 | cover: False 44 | abraham: 45 | username: abraham 46 | name: Abraham Lincoln 47 | location: Kentucky, USA 48 | url_full: False 49 | url: False 50 | bio: I was the 16th president of the USA until I was assassinated in April of 1865. I led the US through its Civil War - its bloodiest and greatest moral, constitutional and political crisis. 51 | picture: assets/images/abraham.jpg 52 | facebook: False 53 | twitter: False 54 | cover: False 55 | edgar: 56 | username: edgar 57 | name: Edgar Rice Burroughs 58 | location: Chicago, Illinois 59 | url_full: False 60 | url: False 61 | bio: I'm an American novelist, best known for my work writing about a brave jungle hero called Tarzan and his muse, Jane. 62 | picture: assets/images/edgar.gif 63 | facebook: False 64 | twitter: False 65 | cover: False 66 | martin: 67 | username: martin 68 | name: Martin Luther King 69 | location: Memphis, Tennessee 70 | url_full: False 71 | url: False 72 | bio: An American pastor, activist, humanitarian. People know me for leading the African-American Civil Rights movement using nonviolent civil disobedience. 73 | picture: assets/images/martin.jpg 74 | facebook: False 75 | twitter: False 76 | cover: False 77 | -------------------------------------------------------------------------------- /_data/tags.yml: -------------------------------------------------------------------------------- 1 | speeches: 2 | name: speeches 3 | description: Some of the greatest words ever spoken. 4 | cover: assets/images/speeches.jpg 5 | fiction: 6 | name: fiction 7 | description: False 8 | cover: False 9 | fables: 10 | name: fables 11 | description: A series of short stories that make you think. 12 | cover: assets/images/fables.jpg 13 | getting-started: 14 | name: getting-started 15 | description: False 16 | cover: False 17 | -------------------------------------------------------------------------------- /_includes/analytics.html: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /_includes/author_pagination.html: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /_includes/dynamic_tag_info.html: -------------------------------------------------------------------------------- 1 | 2 | {% assign decoded_url = page.url | url_decode %} 3 | {% for tag in site.data.tags %} 4 | {% if decoded_url contains tag[1].name %} 5 | {% assign cover = tag[1].cover %} 6 | {% assign tag_description = tag[1].description %} 7 | {% endif %} 8 | {% endfor %} 9 | -------------------------------------------------------------------------------- /_includes/dynamic_title.html: -------------------------------------------------------------------------------- 1 | 2 | {% if page.url %} 3 | {% if page.url contains "tag/" %} 4 | {% assign title = page.url | remove: 'tag' | remove: '/' | url_decode | replace: '-', ' ' | capitalizeall %} 5 | {% elsif page.url contains "author/" %} 6 | {% assign username = page.url | remove: 'author' | remove: '/' | replace: '-', ' ' | remove: ' ' %} 7 | {% for author in site.data.authors %} 8 | {% if author[1].username == username %} 9 | {% assign title = author[1].name %} 10 | {% endif %} 11 | {% endfor %} 12 | {% endif %} 13 | {% endif %} 14 | {% if title %} 15 | {% assign title = title | append: ' - ' | append: site.title %} 16 | {% endif %} 17 | -------------------------------------------------------------------------------- /_includes/facebook.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/floating-header.html: -------------------------------------------------------------------------------- 1 |
2 | 10 | 11 |
{{ page.title }}
12 |
13 |
Share this {% include point.html %}
14 | 16 | {% include twitter.html %} 17 | 18 | 20 | {% include facebook.html %} 21 | 22 |
23 | 24 |
25 | 26 |
27 |
28 |
29 | -------------------------------------------------------------------------------- /_includes/ghost-logo.html: -------------------------------------------------------------------------------- 1 | Ghost Logo 2 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% if page.content and page.current == 'post' or page.current == 'about' %} 7 | {% assign excerpt = page.content | strip_html | truncatewords: 50, "" %} 8 | {% endif %} 9 | 10 | 11 | 12 | 13 | 14 | 15 | {% if excerpt %} 16 | 17 | 18 | {% endif %}{% if page.tags.size > 0 %} 19 | {% endif %} 20 | 21 | 22 | 23 | 24 | 25 | 26 | {% if page.tags.size > 0 %} 27 | 28 | {% endif %} 29 | 30 | {% if excerpt %} 31 | 32 | {% else %} 33 | 34 | {% endif %} 35 | 36 | 59 | 60 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /_includes/infinity.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/location.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/navigation.html: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /_includes/page-scripts.html: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /_includes/point.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_includes/post-card-error.html: -------------------------------------------------------------------------------- 1 | {% assign words_per_minute = site.words_per_minute | default: 200 %} 2 | 3 | {% assign count = 0 %} 4 | {% for post in site.posts %} 5 | {% assign count = count | plus: 1 %} 6 | {% if count <= 3 %} 7 |
8 | {% if post.cover %} 9 | 10 |
11 |
12 | {% endif %} 13 |
14 | 15 |
16 | {% if post.tags.size > 0 %} 17 | {% for tag in post.tags %} 18 | {% if forloop.index == post.tags.size %} 19 | {{ tag | capitalize }} 20 | {% else %} 21 | {{ tag | capitalize }} 22 | {% endif %} 23 | {% endfor %} 24 | {% endif %} 25 | 26 |

{{ post.title }}

27 |
28 |
29 | {% if post.excerpt %} 30 |

{{ post.excerpt | strip_html | truncatewords: 33, "" }}

31 | {% else %} 32 |

{{ post.content | strip_html | truncatewords: 33, "" }}

33 | {% endif %} 34 |
35 |
36 | 56 |
57 |
58 | {% endif %} 59 | {% endfor %} 60 | -------------------------------------------------------------------------------- /_includes/post-card-next.html: -------------------------------------------------------------------------------- 1 | {% assign words_per_minute = site.words_per_minute | default: 200 %} 2 | 3 |
4 | {% if page.next.cover %} 5 | 6 |
7 |
8 | {% endif %} 9 |
10 | 11 |
12 | {% if page.next.tags.size > 0 %} 13 | {% for tag in page.next.tags %} 14 | {% if forloop.index == page.next.tags.size %} 15 | {{ tag | capitalize }} 16 | {% else %} 17 | {{ tag | capitalize }} 18 | {% endif %} 19 | {% endfor %} 20 | {% endif %} 21 | 22 |

{{ page.next.title }}

23 |
24 |
25 | {% if page.next.excerpt %} 26 |

{{ page.next.excerpt | strip_html | truncatewords: 33, "" }}

27 | {% else %} 28 |

{{ page.next.content | strip_html | truncatewords: 33, "" }}

29 | {% endif %} 30 |
31 |
32 | 52 |
53 |
54 | -------------------------------------------------------------------------------- /_includes/post-card-previous.html: -------------------------------------------------------------------------------- 1 | {% assign words_per_minute = site.words_per_minute | default: 200 %} 2 | 3 |
4 | {% if page.previous.cover %} 5 | 6 |
7 |
8 | {% endif %} 9 |
10 | 11 |
12 | {% if page.previous.tags.size > 0 %} 13 | {% for tag in page.previous.tags %} 14 | {% if forloop.index == page.previous.tags.size %} 15 | {{ tag | capitalize }} 16 | {% else %} 17 | {{ tag | capitalize }} 18 | {% endif %} 19 | {% endfor %} 20 | {% endif %} 21 | 22 |

{{ page.previous.title }}

23 |
24 |
25 | {% if page.previous.excerpt %} 26 |

{{ page.previous.excerpt | strip_html | truncatewords: 33, "" }}

27 | {% else %} 28 |

{{ page.previous.content | strip_html | truncatewords: 33, "" }}

29 | {% endif %} 30 |
31 |
32 | 52 |
53 |
54 | -------------------------------------------------------------------------------- /_includes/post-card.html: -------------------------------------------------------------------------------- 1 | {% assign words_per_minute = site.words_per_minute | default: 200 %} 2 | 3 | {% for post in paginator.posts %} 4 |
5 | {% if post.cover %} 6 | 7 |
8 |
9 | {% endif %} 10 |
11 | 12 |
13 | {% if post.tags.size > 0 %} 14 | {% for tag in post.tags %} 15 | {% if forloop.index == post.tags.size %} 16 | {{ tag | capitalize }} 17 | {% else %} 18 | {{ tag | capitalize }} 19 | {% endif %} 20 | {% endfor %} 21 | {% endif %} 22 | 23 |

{{ post.title }}

24 |
25 |
26 | {% if post.excerpt %} 27 |

{{ post.excerpt | strip_html | truncatewords: 33, "" }}

28 | {% else %} 29 |

{{ post.content | strip_html | truncatewords: 33, "" }}

30 | {% endif %} 31 |
32 |
33 | 53 |
54 |
55 | {% endfor %} 56 | -------------------------------------------------------------------------------- /_includes/post-scripts.html: -------------------------------------------------------------------------------- 1 | 64 | -------------------------------------------------------------------------------- /_includes/post_pagination.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_includes/rss.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/site-nav.html: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /_includes/subscribe-form.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 |
7 | 8 | 9 |
10 | -------------------------------------------------------------------------------- /_includes/tag_pagination.html: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /_includes/twitter.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/website.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_layouts/author.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | current: author 4 | title: Author Page 5 | cover: false 6 | class: 'author-template' 7 | navigation: True 8 | label: Author 9 | logo: 'assets/images/ghost.png' 10 | --- 11 | 12 | 13 | 14 | 15 | 16 | {% for author in site.data.authors %} 17 | {% if author[1].username == page.author %} 18 | 50 | {% endif %} 51 | {% endfor %} 52 | 53 | 54 | 55 |
56 |
57 | 58 |
59 | 60 | {% include post-card.html %} 61 |
62 | 63 |
64 |
65 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | {% include dynamic_title.html %} 11 | {% if title %}{{ title }}{% elsif page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 32 | 33 | 34 | {% include head.html %} 35 | 36 | 37 | 38 | 39 |
40 | 41 | {{ content }} 42 | 43 | 44 | {% if paginator.total_posts > site.paginate %} 45 | {% if page.class == 'home-template' %} 46 | {% include post_pagination.html %} 47 | {% elsif page.class == 'page-template' %} 48 | {% include post_pagination.html %} 49 | {% elsif page.class == 'author-template' %} 50 | {% include author_pagination.html %} 51 | {% elsif page.class == 'tag-template' %} 52 | {% include tag_pagination.html %} 53 | {% else %} 54 | {% include post_pagination.html %} 55 | {% endif %} 56 | {% endif %} 57 | 58 | 59 | 73 | 74 |
75 | 76 | 77 | {% if site.subscribers %} 78 |
79 | 80 |
81 | {% if site.logo %} 82 | 83 | {% endif %} 84 |

Subscribe to {{ site.title }}

85 | 86 | {% include subscribe-form.html placeholder="youremail@example.com" %} 87 |
88 |
89 | {% endif %} 90 | 91 | 92 | 93 | 98 | 99 | 100 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 115 | 116 | 117 | {% if paginator.total_pages > site.paginate %} 118 | 121 | 122 | {% endif %} 123 | 124 | 125 | 126 | {% include analytics.html %} 127 | 128 | 129 | {% if page.class == "post-template" %} 130 | {% include post-scripts.html %} 131 | {% elsif page.class == "page-template" %} 132 | {% include page-scripts.html %} 133 | {% endif %} 134 | 135 | 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /_layouts/error.html: -------------------------------------------------------------------------------- 1 | {{ content }} 2 | -------------------------------------------------------------------------------- /_layouts/feed.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | {% if page.xsl %} 6 | 7 | {% endif %} 8 | 9 | Jekyll 10 | 11 | 12 | {{ site.time | date_to_xmlschema }} 13 | {{ page.url | absolute_url | xml_escape }} 14 | 15 | {% assign title = site.title | default: site.name %} 16 | {% if page.collection != "posts" %} 17 | {% assign collection = page.collection | capitalize %} 18 | {% assign title = title | append: " | " | append: collection %} 19 | {% endif %} 20 | {% if page.category %} 21 | {% assign category = page.category | capitalize %} 22 | {% assign title = title | append: " | " | append: category %} 23 | {% endif %} 24 | 25 | {% if title %} 26 | {{ title | smartify | xml_escape }} 27 | {% endif %} 28 | 29 | {% if site.description %} 30 | {{ site.description | xml_escape }} 31 | {% endif %} 32 | 33 | {% if site.author %} 34 | 35 | {{ site.author.name | default: site.author | xml_escape }} 36 | {% if site.author.email %} 37 | {{ site.author.email | xml_escape }} 38 | {% endif %} 39 | {% if site.author.uri %} 40 | {{ site.author.uri | xml_escape }} 41 | {% endif %} 42 | 43 | {% endif %} 44 | 45 | {% if site.data.authors %} 46 | {% for author in site.data.authors %} 47 | {% if author[1].username == post.author %} 48 | {{ author[1].name | strip_html }} 49 | 50 | {{ author[1].name | default: author[1].name | xml_escape }} 51 | {% if author[1].email %} 52 | {{ author[1].email | xml_escape }} 53 | {% endif %} 54 | {% if author[1].uri %} 55 | {{ author[1].uri | xml_escape }} 56 | {% endif %} 57 | 58 | {% endif %} 59 | {% endfor %} 60 | {% endif %} 61 | 62 | {% assign posts = page.posts %} 63 | {% if page.category %} 64 | {% assign posts = posts | where: "category",page.category %} 65 | {% endif %} 66 | 67 | {% for post in posts limit: 10 %} 68 | 69 | {{ post.title | smartify | strip_html | normalize_whitespace | xml_escape }} 70 | 71 | {{ post.date | date_to_xmlschema }} 72 | {{ post.last_modified_at | default: post.date | date_to_xmlschema }} 73 | {{ post.id | absolute_url | xml_escape }} 74 | {{ post.content | strip | xml_escape }} 75 | 76 | {% assign post_author = post.author | default: post.authors[0] | default: site.author %} 77 | {% assign post_author = site.data.authors[post_author] | default: post_author %} 78 | {% assign post_author_email = post_author.email | default: nil %} 79 | {% assign post_author_uri = post_author.uri | default: nil %} 80 | {% assign post_author_name = post_author.name | default: post_author %} 81 | 82 | 83 | {{ post_author_name | default: "" | xml_escape }} 84 | {% if post_author_email %} 85 | {{ post_author_email | xml_escape }} 86 | {% endif %} 87 | {% if post_author_uri %} 88 | {{ post_author_uri | xml_escape }} 89 | {% endif %} 90 | 91 | 92 | {% if post.category %} 93 | 94 | {% endif %} 95 | 96 | {% for tag in post.tags %} 97 | 98 | {% endfor %} 99 | 100 | {% if post.excerpt and post.excerpt != empty %} 101 | {{ post.excerpt | strip_html | normalize_whitespace | xml_escape }} 102 | {% endif %} 103 | 104 | {% assign post_image = post.image.path | default: post.image %} 105 | {% if post_image %} 106 | {% unless post_image contains "://" %} 107 | {% assign post_image = post_image | absolute_url %} 108 | {% endunless %} 109 | 110 | {% endif %} 111 | 112 | {% endfor %} 113 | 114 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | current: page 4 | class: page-template 5 | disqus: false 6 | --- 7 | 8 | 9 | 11 | 12 | 13 | 18 | 19 | 20 | 21 | 22 |
23 |
24 | 25 |
26 | 27 |
28 |

{{ page.title }}

29 |
30 | 31 | {% if page.cover %} 32 |
33 |
34 | {% endif %} 35 | 36 |
37 | {{ content }} 38 |
39 | 40 |
41 | 42 |
43 |
44 | 45 | 46 | 47 | 48 | {% include page-scripts.html %} 49 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | current: post 4 | class: post-template 5 | disqus: false 6 | --- 7 | 8 | 9 | 10 | 12 | 13 | 18 | 19 | 20 | 21 | 22 |
23 |
24 | 25 |
26 | 27 |
28 |
29 | 30 | {% if page.tags.size > 0 %} 31 | / 32 | {% for tag in page.tags %} 33 | {% if forloop.index == page.tags.size %} 34 | {{ tag | upcase }} 35 | {% else %} 36 | {{ tag | upcase }}, 37 | {% endif %} 38 | {% endfor %} 39 | {% endif %} 40 |
41 |

{{ page.title }}

42 |
43 | 44 | {% if page.cover %} 45 |
46 |
47 | {% endif %} 48 | 49 |
50 |
51 | {{ content }} 52 |
53 |
54 | 55 | 56 | {% if site.subscribers %} 57 | 62 | {% endif %} 63 | 64 |
65 | 66 | 67 | {% for author in site.data.authors %} 68 | {% if author[1].username == page.author %} 69 |
70 | {% if author[1].picture %} 71 | {{ page.author }} 72 | {% endif %} 73 |
74 |

{{ author[1].name }}

75 | {% if author[1].bio %} 76 |

{{ author[1].bio }}

77 | {% else %} 78 |

Read more posts by this author.

79 | {% endif %} 80 |
81 |
82 |
83 | Read More 84 |
85 | {% endif %} 86 | {% endfor %} 87 | 88 |
89 | 90 | 93 | {% if site.disqus or page.disqus %} 94 |
95 |
96 | 109 |
110 | {% endif %} 111 | 112 |
113 | 114 |
115 |
116 | 117 | 118 | 190 | 191 | 192 | {% include floating-header.html %} 193 | 194 | 195 | 196 | 197 | -------------------------------------------------------------------------------- /_layouts/tag.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | current: tag 4 | title: Tag Page 5 | cover: false 6 | class: 'tag-template' 7 | navigation: True 8 | logo: 'assets/images/ghost.png' 9 | --- 10 | 11 | 12 | 13 | 14 | 15 | 16 | {% include dynamic_tag_info.html %} 17 | 32 | 33 | 34 | 35 |
36 |
37 |
38 | 39 | {% include post-card.html %} 40 |
41 |
42 |
43 | -------------------------------------------------------------------------------- /_plugins/jekyll-autgenerator.rb: -------------------------------------------------------------------------------- 1 | module Jekyll 2 | 3 | class AuthorsGenerator < Generator 4 | 5 | safe true 6 | 7 | def generate(site) 8 | site.data['authors'].each do |author, data| 9 | posts = [author, posts_by_author(site, author)] 10 | build_subpages(site, 'author', posts) 11 | end 12 | end 13 | 14 | def build_subpages(site, type, posts) 15 | posts[1] = posts[1].sort_by { |p| -p.date.to_f } 16 | atomize(site, type, posts) 17 | paginate(site, type, posts) 18 | end 19 | 20 | def atomize(site, type, posts) 21 | path = "/author/#{posts[0]}" 22 | atom = AtomPageAuthor.new(site, site.source, path, type, posts[0], posts[1]) 23 | site.pages << atom 24 | end 25 | 26 | def paginate(site, type, posts) 27 | pages = Jekyll::Paginate::Pager.calculate_pages(posts[1], site.config['paginate'].to_i) 28 | (1..pages).each do |num_page| 29 | pager = Jekyll::Paginate::Pager.new(site, num_page, posts[1], pages) 30 | path = "/author/#{posts[0]}" 31 | if num_page > 1 32 | path = path + "/page#{num_page}" 33 | end 34 | newpage = GroupSubPageAuthor.new(site, site.source, path, type, posts[0]) 35 | newpage.pager = pager 36 | site.pages << newpage 37 | 38 | end 39 | end 40 | 41 | private 42 | 43 | def posts_by_author(site, author) 44 | site.posts.docs.select { |post| post.data['author'] == author } 45 | end 46 | end 47 | 48 | class GroupSubPageAuthor < Page 49 | def initialize(site, base, dir, type, val) 50 | @site = site 51 | @base = base 52 | @dir = dir 53 | @name = 'index.html' 54 | 55 | self.process(@name) 56 | self.read_yaml(File.join(base, '_layouts'), "author.html") 57 | self.data["grouptype"] = type 58 | self.data[type] = val 59 | end 60 | end 61 | 62 | class AtomPageAuthor < Page 63 | def initialize(site, base, dir, type, val, posts) 64 | @site = site 65 | @base = base 66 | @dir = dir 67 | @name = 'feed.xml' 68 | 69 | self.process(@name) 70 | self.read_yaml(File.join(base, '_layouts'), "feed.xml") 71 | self.data[type] = val 72 | self.data["grouptype"] = type 73 | self.data["posts"] = posts[0..9] 74 | end 75 | end 76 | end 77 | -------------------------------------------------------------------------------- /_plugins/jekyll-capitalize-all.rb: -------------------------------------------------------------------------------- 1 | require 'liquid' 2 | require 'uri' 3 | 4 | # Capitalize all words of the input 5 | module CapitalizeAll 6 | def capitalizeall(words) 7 | return words.split(' ').map(&:capitalize).join(' ') 8 | end 9 | end 10 | 11 | Liquid::Template.register_filter(CapitalizeAll) 12 | -------------------------------------------------------------------------------- /_plugins/jekyll-tagsgenerator.rb: -------------------------------------------------------------------------------- 1 | require 'slugify' 2 | module Jekyll 3 | 4 | class TagsGenerator < Generator 5 | 6 | safe true 7 | 8 | def generate(site) 9 | site.tags.each do |tag| 10 | build_subpages(site, "tag", tag) 11 | end 12 | end 13 | 14 | def build_subpages(site, type, posts) 15 | posts[1] = posts[1].sort_by { |p| -p.date.to_f } 16 | atomize(site, type, posts) 17 | paginate(site, type, posts) 18 | end 19 | 20 | def atomize(site, type, posts) 21 | path = "/tag/" + posts[0].slugify 22 | atom = AtomPageTags.new(site, site.source, path, type, posts[0], posts[1]) 23 | site.pages << atom 24 | end 25 | 26 | def paginate(site, type, posts) 27 | pages = Jekyll::Paginate::Pager.calculate_pages(posts[1], site.config['paginate'].to_i) 28 | (1..pages).each do |num_page| 29 | pager = Jekyll::Paginate::Pager.new(site, num_page, posts[1], pages) 30 | path = "/tag/" + posts[0].slugify 31 | if num_page > 1 32 | path = path + "/page#{num_page}" 33 | end 34 | newpage = GroupSubPageTags.new(site, site.source, path, type, posts[0]) 35 | newpage.pager = pager 36 | site.pages << newpage 37 | 38 | end 39 | end 40 | end 41 | 42 | class GroupSubPageTags < Page 43 | def initialize(site, base, dir, type, val) 44 | @site = site 45 | @base = base 46 | @dir = dir 47 | @name = 'index.html' 48 | 49 | self.process(@name) 50 | self.read_yaml(File.join(base, '_layouts'), "tag.html") 51 | self.data["grouptype"] = type 52 | self.data[type] = val 53 | end 54 | end 55 | 56 | class AtomPageTags < Page 57 | def initialize(site, base, dir, type, val, posts) 58 | @site = site 59 | @base = base 60 | @dir = dir 61 | @name = 'feed.xml' 62 | 63 | self.process(@name) 64 | self.read_yaml(File.join(base, '_layouts'), "feed.xml") 65 | self.data[type] = val 66 | self.data["grouptype"] = type 67 | self.data["posts"] = posts[0..9] 68 | end 69 | end 70 | end 71 | -------------------------------------------------------------------------------- /_posts/1863-11-19-gettysburg-address.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/bus.jpg 5 | navigation: True 6 | title: Gettysburg Address 7 | date: 1863-11-19 10:18:00 8 | tags: 9 | class: post-template 10 | subclass: 'post' 11 | author: abraham 12 | --- 13 | 14 | Fourscore and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal. 15 | 16 | Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this. 17 | 18 | But, in a larger sense, we can not dedicate-we can not consecrate-we can not hallow-this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us-that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion-that we here highly resolve that these dead shall not have died in vain-that this nation, under God, shall have a new birth of freedom-and that government of the people, by the people, for the people shall not perish from the earth. 19 | -------------------------------------------------------------------------------- /_posts/1912-07-24-out-to-sea.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: 'assets/images/waves.jpg' 5 | navigation: True 6 | title: Out to Sea 7 | date: 1912-07-24 10:18:00 8 | tags: fiction 9 | class: post-template 10 | subclass: 'post' 11 | author: edgar 12 | --- 13 | 14 | I had this story from one who had no business to tell it to me, or to any other. I may credit the seductive influence of an old vintage upon the narrator for the beginning of it, and my own skeptical incredulity during the days that followed for the balance of the strange tale. 15 | 16 | When my convivial host discovered that he had told me so much, and that I was prone to doubtfulness, his foolish pride assumed the task the old vintage had commenced, and so he unearthed written evidence in the form of musty manuscript, and dry official records of the British Colonial Office to support many of the salient features of his remarkable narrative. 17 | 18 | I do not say the story is true, for I did not witness the happenings which it portrays, but the fact that in the telling of it to you I have taken fictitious names for the principal characters quite sufficiently evidences the sincerity of my own belief that it MAY be true. 19 | 20 | The yellow, mildewed pages of the diary of a man long dead, and the records of the Colonial Office dovetail perfectly with the narrative of my convivial host, and so I give you the story as I painstakingly pieced it out from these several various agencies. 21 | 22 | If you do not find it credible you will at least be as one with me in acknowledging that it is unique, remarkable, and interesting. 23 | 24 | From the records of the Colonial Office and from the dead man's diary we learn that a certain young English nobleman, whom we shall call John Clayton, Lord Greystoke, was commissioned to make a peculiarly delicate investigation of conditions in a British West Coast African Colony from whose simple native inhabitants another European power was known to be recruiting soldiers for its native army, which it used solely for the forcible collection of rubber and ivory from the savage tribes along the Congo and the Aruwimi. The natives of the British Colony complained that many of their young men were enticed away through the medium of fair and glowing promises, but that few if any ever returned to their families. 25 | 26 | The Englishmen in Africa went even further, saying that these poor blacks were held in virtual slavery, since after their terms of enlistment expired their ignorance was imposed upon by their white officers, and they were told that they had yet several years to serve. 27 | 28 | And so the Colonial Office appointed John Clayton to a new post in British West Africa, but his confidential instructions centered on a thorough investigation of the unfair treatment of black British subjects by the officers of a friendly European power. Why he was sent, is, however, of little moment to this story, for he never made an investigation, nor, in fact, did he ever reach his destination. 29 | 30 | Clayton was the type of Englishman that one likes best to associate with the noblest monuments of historic achievement upon a thousand victorious battlefields--a strong, virile man --mentally, morally, and physically. 31 | 32 | In stature he was above the average height; his eyes were gray, his features regular and strong; his carriage that of perfect, robust health influenced by his years of army training. 33 | 34 | Political ambition had caused him to seek transference from the army to the Colonial Office and so we find him, still young, entrusted with a delicate and important commission in the service of the Queen. 35 | 36 | When he received this appointment he was both elated and appalled. The preferment seemed to him in the nature of a well-merited reward for painstaking and intelligent service, and as a stepping stone to posts of greater importance and responsibility; but, on the other hand, he had been married to the Hon. Alice Rutherford for scarce a three months, and it was the thought of taking this fair young girl into the dangers and isolation of tropical Africa that appalled him. 37 | 38 | For her sake he would have refused the appointment, but she would not have it so. Instead she insisted that he accept, and, indeed, take her with him. 39 | 40 | There were mothers and brothers and sisters, and aunts and cousins to express various opinions on the subject, but as to what they severally advised history is silent. 41 | 42 | We know only that on a bright May morning in 1888, John, Lord Greystoke, and Lady Alice sailed from Dover on their way to Africa. 43 | 44 | A month later they arrived at Freetown where they chartered a small sailing vessel, the Fuwalda, which was to bear them to their final destination. 45 | 46 | And here John, Lord Greystoke, and Lady Alice, his wife, vanished from the eyes and from the knowledge of men. 47 | 48 | Two months after they weighed anchor and cleared from the port of Freetown a half dozen British war vessels were scouring the south Atlantic for trace of them or their little vessel, and it was almost immediately that the wreckage was found upon the shores of St. Helena which convinced the world that the Fuwalda had gone down with all on board, and hence the search was stopped ere it had scarce begun; though hope lingered in longing hearts for many years. 49 | 50 | The Fuwalda, a barkentine of about one hundred tons, was a vessel of the type often seen in coastwise trade in the far southern Atlantic, their crews composed of the offscourings of the sea--unhanged murderers and cutthroats of every race and every nation. 51 | 52 | The Fuwalda was no exception to the rule. Her officers were swarthy bullies, hating and hated by their crew. The captain, while a competent seaman, was a brute in his treatment of his men. He knew, or at least he used, but two arguments in his dealings with them--a belaying pin and a revolver--nor is it likely that the motley aggregation he signed would have understood aught else. 53 | 54 | So it was that from the second day out from Freetown John Clayton and his young wife witnessed scenes upon the deck of the Fuwalda such as they had believed were never enacted outside the covers of printed stories of the sea. 55 | 56 | It was on the morning of the second day that the first link was forged in what was destined to form a chain of circumstances ending in a life for one then unborn such as has never been paralleled in the history of man. 57 | 58 | Two sailors were washing down the decks of the Fuwalda, the first mate was on duty, and the captain had stopped to speak with John Clayton and Lady Alice. 59 | 60 | The men were working backwards toward the little party who were facing away from the sailors. Closer and closer they came, until one of them was directly behind the captain. In another moment he would have passed by and this strange narrative would never have been recorded. 61 | 62 | But just that instant the officer turned to leave Lord and Lady Greystoke, and, as he did so, tripped against the sailor and sprawled headlong upon the deck, overturning the water- pail so that he was drenched in its dirty contents. 63 | 64 | For an instant the scene was ludicrous; but only for an instant. With a volley of awful oaths, his face suffused with the scarlet of mortification and rage, the captain regained his feet, and with a terrific blow felled the sailor to the deck. 65 | 66 | The man was small and rather old, so that the brutality of the act was thus accentuated. The other seaman, however, was neither old nor small--a huge bear of a man, with fierce black mustachios, and a great bull neck set between massive shoulders. 67 | 68 | As he saw his mate go down he crouched, and, with a low snarl, sprang upon the captain crushing him to his knees with a single mighty blow. 69 | 70 | From scarlet the officer's face went white, for this was mutiny; and mutiny he had met and subdued before in his brutal career. Without waiting to rise he whipped a revolver from his pocket, firing point blank at the great mountain of muscle towering before him; but, quick as he was, John Clayton was almost as quick, so that the bullet which was intended for the sailor's heart lodged in the sailor's leg instead, for Lord Greystoke had struck down the captain's arm as he had seen the weapon flash in the sun. 71 | 72 | Words passed between Clayton and the captain, the former making it plain that he was disgusted with the brutality displayed toward the crew, nor would he countenance anything further of the kind while he and Lady Greystoke remained passengers. 73 | 74 | The captain was on the point of making an angry reply, but, thinking better of it, turned on his heel and black and scowling, strode aft. 75 | 76 | He did not care to antagonize an English official, for the Queen's mighty arm wielded a punitive instrument which he could appreciate, and which he feared--England's far-reaching navy. 77 | 78 | The two sailors picked themselves up, the older man assisting his wounded comrade to rise. The big fellow, who was known among his mates as Black Michael, tried his leg gingerly, and, finding that it bore his weight, turned to Clayton with a word of gruff thanks. 79 | 80 | Though the fellow's tone was surly, his words were evidently well meant. Ere he had scarce finished his little speech he had turned and was limping off toward the forecastle with the very apparent intention of forestalling any further conversation. 81 | 82 | They did not see him again for several days, nor did the captain accord them more than the surliest of grunts when he was forced to speak to them. 83 | 84 | They took their meals in his cabin, as they had before the unfortunate occurrence; but the captain was careful to see that his duties never permitted him to eat at the same time. 85 | 86 | The other officers were coarse, illiterate fellows, but little above the villainous crew they bullied, and were only too glad to avoid social intercourse with the polished English noble and his lady, so that the Claytons were left very much to themselves. 87 | 88 | This in itself accorded perfectly with their desires, but it also rather isolated them from the life of the little ship so that they were unable to keep in touch with the daily happenings which were to culminate so soon in bloody tragedy. 89 | -------------------------------------------------------------------------------- /_posts/1948-12-12-the-purpose-of-education.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/grapes.jpg 5 | navigation: True 6 | title: The Purpose of Education 7 | date: 1948-12-12 10:18:00 8 | tags: speeches 9 | class: post-template 10 | subclass: 'post' 11 | author: martin 12 | --- 13 | 14 | As I engage in the so-called "bull sessions" around and about the school, I too often find that most college men have a misconception of the purpose of education. Most of the "brethren" think that education should equip them with the proper instruments of exploitation so that they can forever trample over the masses. Still others think that education should furnish them with noble ends rather than means to an end. 15 | 16 | It seems to me that education has a two-fold function to perform in the life of man and in society: the one is utility and the other is culture. Education must enable a man to become more efficient, to achieve with increasing facility the ligitimate goals of his life. 17 | 18 | Education must also train one for quick, resolute and effective thinking. To think incisively and to think for one's self is very difficult. We are prone to let our mental life become invaded by legions of half truths, prejudices, and propaganda. At this point, I often wonder whether or not education is fulfilling its purpose. A great majority of the so-called educated people do not think logically and scientifically. Even the press, the classroom, the platform, and the pulpit in many instances do not give us objective and unbiased truths. To save man from the morass of propaganda, in my opinion, is one of the chief aims of education. Education must enable one to sift and weigh evidence, to discern the true from the false, the real from the unreal, and the facts from the fiction. 19 | 20 | The function of education, therefore, is to teach one to think intensively and to think critically. But education which stops with efficiency may prove the greatest menace to society. The most dangerous criminal may be the man gifted with reason, but with no morals. 21 | 22 | The late Eugene Talmadge, in my opinion, possessed one of the better minds of Georgia, or even America. Moreover, he wore the Phi Beta Kappa key. By all measuring rods, Mr. Talmadge could think critically and intensively; yet he contends that I am an inferior being. Are those the types of men we call educated? 23 | 24 | We must remember that intelligence is not enough. Intelligence plus character--that is the goal of true education. The complete education gives one not only power of concentration, but worthy objectives upon which to concentrate. The broad education will, therefore, transmit to one not only the accumulated knowledge of the race but also the accumulated experience of social living. 25 | 26 | If we are not careful, our colleges will produce a group of close-minded, unscientific, illogical propagandists, consumed with immoral acts. Be careful, "brethren!" Be careful, teachers! 27 | -------------------------------------------------------------------------------- /_posts/1963-08-28-i-have-a-dream.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/sky.jpg 5 | navigation: True 6 | title: I Have a Dream 7 | date: 1963-08-28 10:18:00 8 | tags: speeches 9 | class: post-template 10 | subclass: 'post' 11 | author: martin 12 | --- 13 | 14 | I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our nation. 15 | 16 | Five score years ago, a great American, in whose symbolic shadow we stand today, signed the Emancipation Proclamation. This momentous decree came as a great beacon light of hope to millions of Negro slaves who had been seared in the flames of withering injustice. It came as a joyous daybreak to end the long night of their captivity. 17 | 18 | But one hundred years later, the Negro still is not free. One hundred years later, the life of the Negro is still sadly crippled by the manacles of segregation and the chains of discrimination. One hundred years later, the Negro lives on a lonely island of poverty in the midst of a vast ocean of material prosperity. One hundred years later, the Negro is still languished in the corners of American society and finds himself an exile in his own land. And so we've come here today to dramatize a shameful condition. 19 | 20 | In a sense we've come to our nation's capital to cash a check. When the architects of our republic wrote the magnificent words of the Constitution and the Declaration of Independence, they were signing a promissory note to which every American was to fall heir. This note was a promise that all men, yes, black men as well as white men, would be guaranteed the "unalienable Rights" of "Life, Liberty and the pursuit of Happiness." It is obvious today that America has defaulted on this promissory note, insofar as her citizens of color are concerned. Instead of honoring this sacred obligation, America has given the Negro people a bad check, a check which has come back marked "insufficient funds." 21 | 22 | But we refuse to believe that the bank of justice is bankrupt. We refuse to believe that there are insufficient funds in the great vaults of opportunity of this nation. And so, we've come to cash this check, a check that will give us upon demand the riches of freedom and the security of justice. 23 | 24 | We have also come to this hallowed spot to remind America of the fierce urgency of Now. This is no time to engage in the luxury of cooling off or to take the tranquilizing drug of gradualism. Now is the time to make real the promises of democracy. Now is the time to rise from the dark and desolate valley of segregation to the sunlit path of racial justice. Now is the time to lift our nation from the quicksands of racial injustice to the solid rock of brotherhood. Now is the time to make justice a reality for all of God's children. 25 | 26 | It would be fatal for the nation to overlook the urgency of the moment. This sweltering summer of the Negro's legitimate discontent will not pass until there is an invigorating autumn of freedom and equality. Nineteen sixty-three is not an end, but a beginning. And those who hope that the Negro needed to blow off steam and will now be content will have a rude awakening if the nation returns to business as usual. And there will be neither rest nor tranquility in America until the Negro is granted his citizenship rights. The whirlwinds of revolt will continue to shake the foundations of our nation until the bright day of justice emerges. 27 | 28 | But there is something that I must say to my people, who stand on the warm threshold which leads into the palace of justice: In the process of gaining our rightful place, we must not be guilty of wrongful deeds. Let us not seek to satisfy our thirst for freedom by drinking from the cup of bitterness and hatred. We must forever conduct our struggle on the high plane of dignity and discipline. We must not allow our creative protest to degenerate into physical violence. Again and again, we must rise to the majestic heights of meeting physical force with soul force. 29 | 30 | The marvelous new militancy which has engulfed the Negro community must not lead us to a distrust of all white people, for many of our white brothers, as evidenced by their presence here today, have come to realize that their destiny is tied up with our destiny. And they have come to realize that their freedom is inextricably bound to our freedom. 31 | 32 | We cannot walk alone. 33 | 34 | And as we walk, we must make the pledge that we shall always march ahead. 35 | 36 | We cannot turn back. 37 | 38 | There are those who are asking the devotees of civil rights, "When will you be satisfied?" We can never be satisfied as long as the Negro is the victim of the unspeakable horrors of police brutality. We can never be satisfied as long as our bodies, heavy with the fatigue of travel, cannot gain lodging in the motels of the highways and the hotels of the cities. We cannot be satisfied as long as the negro's basic mobility is from a smaller ghetto to a larger one. We can never be satisfied as long as our children are stripped of their self-hood and robbed of their dignity by signs stating: "For Whites Only." We cannot be satisfied as long as a Negro in Mississippi cannot vote and a Negro in New York believes he has nothing for which to vote. No, no, we are not satisfied, and we will not be satisfied until "justice rolls down like waters, and righteousness like a mighty stream." 39 | 40 | I am not unmindful that some of you have come here out of great trials and tribulations. Some of you have come fresh from narrow jail cells. And some of you have come from areas where your quest -- quest for freedom left you battered by the storms of persecution and staggered by the winds of police brutality. You have been the veterans of creative suffering. Continue to work with the faith that unearned suffering is redemptive. Go back to Mississippi, go back to Alabama, go back to South Carolina, go back to Georgia, go back to Louisiana, go back to the slums and ghettos of our northern cities, knowing that somehow this situation can and will be changed. 41 | 42 | Let us not wallow in the valley of despair, I say to you today, my friends. 43 | 44 | And so even though we face the difficulties of today and tomorrow, I still have a dream. It is a dream deeply rooted in the American dream. 45 | 46 | I have a dream that one day this nation will rise up and live out the true meaning of its creed: "We hold these truths to be self-evident, that all men are created equal." 47 | 48 | I have a dream that one day on the red hills of Georgia, the sons of former slaves and the sons of former slave owners will be able to sit down together at the table of brotherhood. 49 | 50 | I have a dream that one day even the state of Mississippi, a state sweltering with the heat of injustice, sweltering with the heat of oppression, will be transformed into an oasis of freedom and justice. 51 | 52 | I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character. 53 | 54 | I have a **dream** today! 55 | 56 | I have a dream that one day, down in Alabama, with its vicious racists, with its governor having his lips dripping with the words of "interposition" and "nullification" -- one day right there in Alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers. 57 | 58 | I have a **dream** today! 59 | 60 | I have a dream that one day every valley shall be exalted, and every hill and mountain shall be made low, the rough places will be made plain, and the crooked places will be made straight; "and the glory of the Lord shall be revealed and all flesh shall see it together." 61 | 62 | This is our hope, and this is the faith that I go back to the South with. 63 | 64 | With this faith, we will be able to hew out of the mountain of despair a stone of hope. With this faith, we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood. With this faith, we will be able to work together, to pray together, to struggle together, to go to jail together, to stand up for freedom together, knowing that we will be free one day. 65 | 66 | And this will be the day -- this will be the day when all of God's children will be able to sing with new meaning: 67 | 68 | > My country 'tis of thee, sweet land of liberty, of thee I sing. 69 | > 70 | > Land where my fathers died, land of the Pilgrim's pride, 71 | > 72 | > From every mountainside, let freedom ring! 73 | 74 | 75 | And if America is to be a great nation, this must become true. 76 | 77 | And so let freedom ring from the prodigious hilltops of New Hampshire. 78 | 79 | > Let freedom ring from the mighty mountains of New York. 80 | > 81 | > Let freedom ring from the heightening Alleghenies of Pennsylvania. 82 | > 83 | > Let freedom ring from the snow-capped Rockies of Colorado. 84 | > 85 | > Let freedom ring from the curvaceous slopes of California. 86 | 87 | 88 | But not only that: 89 | 90 | > Let freedom ring from Stone Mountain of Georgia. 91 | > 92 | > Let freedom ring from Lookout Mountain of Tennessee. 93 | > 94 | > Let freedom ring from every hill and molehill of Mississippi. 95 | > 96 | > From every mountainside, let freedom ring. 97 | 98 | 99 | And when this happens, and when we allow freedom ring, when we let it ring from every village and every hamlet, from every state and every city, we will be able to speed up that day when all of God's children, black men and white men, Jews and Gentiles, Protestants and Catholics, will be able to join hands and sing in the words of the old Negro spiritual: 100 | 101 | *Free at last! Free at last!* 102 | 103 | *Thank God Almighty, we are free at last!* 104 | -------------------------------------------------------------------------------- /_posts/2014-08-12-the-businessman-and-fisherman.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/water.jpg 5 | navigation: True 6 | title: The Businessman & The Fisherman 7 | date: 2014-08-12 10:18:00 8 | tags: fables 9 | class: post-template 10 | subclass: 'post' 11 | logo: assets/images/ghost.png 12 | author: hannah 13 | --- 14 | 15 | An American businessman took a vacation to a small coastal Mexican village on doctor’s orders. Unable to sleep after an urgent phone call from the office the first morning, he walked out to the pier to clear his head. A small boat with just one fisherman had docked, and inside the boat were several large yellowfin tuna. The American complimented the Mexican on the quality of his fish. 16 | 17 | “How long did it take you to catch them?” the American asked. 18 | 19 | “Only a little while,” the Mexican replied in surprisingly good English. 20 | 21 | “Why don’t you stay out longer and catch more fish?” the American then asked. 22 | 23 | “I have enough to support my family and give a few to friends,” the Mexican said as he unloaded them into a basket. 24 | 25 | “But… What do you do with the rest of your time?” 26 | 27 | The Mexican looked up and smiled. “I sleep late, fish a little, play with my children, take a siesta with my wife, Julia, and stroll into the village each evening, where I sip wine and play guitar with my amigos. I have a full and busy life, señor.” 28 | 29 | The American laughed and stood tall. “Sir, I’m a Harvard M.B.A. and can help you. You should spend more time fishing, and with the proceeds, buy a bigger boat. In no time, you could buy several boats with the increased haul. Eventually, you would have a fleet of fishing boats.” 30 | 31 | He continued, “Instead of selling your catch to a middleman, you would sell directly to the consumers, eventually opening your own cannery. You would control the product, processing, and distribution. You would need to leave this small coastal fishing village, of course, and move to Mexico City, then to Los Angeles, and eventually to New York City, where you could run your expanded enterprise with proper management. 32 | 33 | The Mexican fisherman asked, “But, señor, how long will all this take?” 34 | 35 | To which the American replied, “15-20 years, 25 tops.” 36 | 37 | “But what then, señor?” 38 | 39 | The American laughed and said, “That’s the best part. When the time is right, you would announce an IPO and sell your company stock to the public and become very rich. You would make millions.” 40 | 41 | “Millions señor? Then what?" 42 | 43 | “Then you would retire and move to a small coastal fishing village, where you would sleep late, fish a little, play with your kids, take a siesta with your wife, and stroll in to the village in the evenings where you could sip wine and play your guitar with your amigos.” 44 | 45 | 46 | Adapted from the "Anekdote zur Senkung der Arbeitsmoral" by **Heinrich Böll** 47 | 48 | An influential German write and Nobel Prize for Literature in 1972. 49 | -------------------------------------------------------------------------------- /_posts/2017-07-27-advanced-markdown.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/advanced.jpg 5 | navigation: True 6 | title: Advanced Markdown tips 7 | date: 2017-07-27 05:00:00 8 | tags: [Getting started] 9 | class: post-template 10 | subclass: 'post' 11 | author: ghost 12 | --- 13 | 14 | 15 |

There are lots of powerful things you can do with the Ghost editor

16 |

If you've gotten pretty comfortable with all the basics of writing in Ghost, then you may enjoy some more advanced tips about the types of things you can do with Markdown!

17 |

As with the last post about the editor, you'll want to be actually editing this post as you read it so that you can see all the Markdown code we're using.

18 |

Special formatting

19 |

As well as bold and italics, you can also use some other special formatting in Markdown when the need arises, for example:

20 | 25 |

Writing code blocks

26 |

There are two types of code elements which can be inserted in Markdown, the first is inline, and the other is block. Inline code is formatted by wrapping any word or words in back-ticks, like this. Larger snippets of code can be displayed across multiple lines using triple back ticks:

27 |
.my-link {
28 |     text-decoration: underline;
29 | }
30 | 
31 |

If you want to get really fancy, you can even add syntax highlighting using Prism.js.

32 |

Full bleed images

33 |

One neat trick which you can use in Markdown to distinguish between different types of images is to add a #hash value to the end of the source URL, and then target images containing the hash with special styling. For example:

34 |

walking

35 |

which is styled with...

36 |
img[src$="#full"] {
37 |     max-width: 100vw;
38 | }
39 | 
40 |

This creates full-bleed images in the Casper theme, which stretch beyond their usual boundaries right up to the edge of the window. Every theme handles these types of things slightly differently, but it's a great trick to play with if you want to have a variety of image sizes and styles.

41 |

Reference lists

42 |

The quick brown fox, jumped over the lazy dog.

43 |

Another way to insert links in markdown is using reference lists. You might want to use this style of linking to cite reference material in a Wikipedia-style. All of the links are listed at the end of the document, so you can maintain full separation between content and its source or reference.

44 |

Creating footnotes

45 |

The quick brown fox[1] jumped over the lazy dog[2].

46 |

Footnotes are a great way to add additional contextual details when appropriate. Ghost will automatically add footnote content to the very end of your post.

47 |

Full HTML

48 |

Perhaps the best part of Markdown is that you're never limited to just Markdown. You can write HTML directly in the Ghost editor and it will just work as HTML usually does. No limits! Here's a standard YouTube embed code as an example:

49 | 50 |
51 |
52 |
    53 |
  1. Foxes are red ↩︎

    54 |
  2. 55 |
  3. Dogs are usually not red ↩︎

    56 |
  4. 57 |
58 | -------------------------------------------------------------------------------- /_posts/2017-07-27-managing-users.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/team.jpg 5 | navigation: True 6 | title: Managing Ghost users 7 | date: 2017-07-27 07:00:00 8 | tags: [Getting started] 9 | class: post-template 10 | subclass: 'post' 11 | author: ghost 12 | --- 13 | 14 |

Ghost has a number of different user roles for your team

15 |

Authors

16 |

The base user level in Ghost is an author. Authors can write posts, edit their own posts, and publish their own posts. Authors are trusted users. If you don't trust users to be allowed to publish their own posts, you shouldn't invite them to Ghost admin.

17 |

Editors

18 |

Editors are the 2nd user level in Ghost. Editors can do everything that an Author can do, but they can also edit and publish the posts of others - as well as their own. Editors can also invite new authors to the site.

19 |

Administrators

20 |

The top user level in Ghost is Administrator. Again, administrators can do everything that Authors and Editors can do, but they can also edit all site settings and data, not just content. Additionally, administrators have full access to invite, manage or remove any other user of the site.

21 |

The Owner

22 |

There is only ever one owner of a Ghost site. The owner is a special user which has all the same permissions as an Administrator, but with two exceptions: The Owner can never be deleted. And in some circumstances the owner will have access to additional special settings if applicable — for example, billing details, if using Ghost(Pro).

23 |
24 |

It's a good idea to ask all of your users to fill out their user profiles, including bio and social links. These will populate rich structured data for posts and generally create more opportunities for themes to fully populate their design.

25 | -------------------------------------------------------------------------------- /_posts/2017-07-27-private-sites.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/locked.jpg 5 | navigation: True 6 | title: Making your site private 7 | date: 2017-07-27 06:00:00 8 | tags: [Getting started] 9 | class: post-template 10 | subclass: 'post' 11 | author: ghost 12 | --- 13 | 14 |

Sometimes you might want to put your site behind closed doors

15 |

If you've got a publication that you don't want the world to see yet because it's not ready to launch, you can hide your Ghost site behind a simple shared pass-phrase.

16 |

You can toggle this preference on at the bottom of Ghost's General Settings

17 |

private

18 |

Ghost will give you a short, randomly generated pass-phrase which you can share with anyone who needs access to the site while you're working on it. While this setting is enabled, all search engine optimisation features will be switched off to help keep the site off the radar.

19 |

Do remember though, this is not secure authentication. You shouldn't rely on this feature for protecting important private data. It's just a simple, shared pass-phrase for very basic privacy.

20 | -------------------------------------------------------------------------------- /_posts/2017-07-27-the-editor.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/writing.jpg 5 | navigation: True 6 | title: Using the Ghost editor 7 | date: 2017-07-27 09:00:00 8 | tags: [Getting started] 9 | class: post-template 10 | subclass: 'post' 11 | author: ghost 12 | --- 13 | 14 |

Ghost uses a language called Markdown to format text.

15 |

When you go to edit a post and see special characters and colours intertwined between the words, those are Markdown shortcuts which tell Ghost what to do with the words in your document. The biggest benefit of Markdown is that you can quickly apply formatting as you type, without needing to pause.

16 |

At the bottom of the editor, you'll find a toolbar with basic formatting options to help you get started as easily as possible. You'll also notice that there's a ? icon, which contains more advanced shortcuts.

17 |

For now, though, let's run you through some of the basics. You'll want to make sure you're editing this post in order to see all the Markdown we've used.

18 |

Formatting text

19 |

The most common shortcuts are of course, bold text, italic text, and hyperlinks. These generally make up the bulk of any document. You can type the characters out, but you can also use keyboard shortcuts.

20 | 26 |

With just a couple of extra characters here and there, you're well on your way to creating a beautifully formatted story.

27 |

Inserting images

28 |

Images in Markdown look just the same as links, except they're prefixed with an exclamation mark, like this:

29 |

![Image description](/path/to/image.jpg)

30 |

Computer

31 |

Most Markdown editors don't make you type this out, though. In Ghost you can click on the image icon in the toolbar at the bottom of the editor, or you can just click and drag an image from your desktop directly into the editor. Both will upload the image for you and generate the appropriate Markdown.

32 |

Important Note: Ghost does not currently have automatic image resizing, so it's always a good idea to make sure your images aren't gigantic files before uploading them to Ghost.

33 |

Making lists

34 |

Lists in HTML are a formatting nightmare, but in Markdown they become an absolute breeze with just a couple of characters and a bit of smart automation. For numbered lists, just write out the numbers. For bullet lists, just use * or - or +. Like this:

35 |
    36 |
  1. Crack the eggs over a bowl
  2. 37 |
  3. Whisk them together
  4. 38 |
  5. Make an omellete
  6. 39 |
40 |

or

41 | 46 |

Adding quotes

47 |

When you want to pull out a particularly good except in the middle of a piece, you can use > at the beginning of a paragraph to turn it into a Blockquote. You might've seen this formatting before in email clients.

48 |
49 |

A well placed quote guides a reader through a story, helping them to understand the most important points being made

50 |
51 |

All themes handles blockquotes slightly differently. Sometimes they'll look better kept shorter, while other times you can quote fairly hefty amounts of text and get away with it. Generally, the safest option is to use blockquotes sparingly.

52 |

Dividing things up

53 |

If you're writing a piece in parts and you just feel like you need to divide a couple of sections distinctly from each other, a horizontal rule might be just what you need. Dropping --- on a new line will create a sleak divider, anywhere you want it.

54 |
55 |

This should get you going with the vast majority of what you need to do in the editor, but if you're still curious about more advanced tips then check out the Advanced Markdown Guide - or if you'd rather learn about how Ghost taxononomies work, we've got a overview of how to use Ghost tags.

56 | -------------------------------------------------------------------------------- /_posts/2017-07-27-themes.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/design.jpg 5 | navigation: True 6 | title: Setting up your own Ghost theme 7 | date: 2017-07-27 04:00:00 8 | tags: [Getting started] 9 | class: post-template 10 | subclass: 'post' 11 | author: ghost 12 | --- 13 | 14 |

Creating a totally custom design for your publication

15 |

Ghost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be easily adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.

16 |

There are a huge range of both free and premium pre-built themes which you can get from the Ghost Theme Marketplace, or you can simply create your own from scratch.

17 |

marketplace

18 |
19 |

Anyone can write a completely custom Ghost theme, with just some solid knowledge of HTML and CSS

20 |
21 |

Ghost themes are written with a templating language called handlebars, which has a bunch of dynamic helpers to insert your data into template files. Like {{author.name}}, for example, outputs the name of the current author.

22 |

The best way to learn how to write your own Ghost theme is to have a look at the source code for Casper, which is heavily commented and should give you a sense of how everything fits together.

23 | 29 |

We've got full and extensive theme documentation which outlines every template file, context and helper that you can use.

30 |

If you want to chat with other people making Ghost themes to get any advice or help, there's also a #themes channel in our public Slack community which we always recommend joining!

31 | -------------------------------------------------------------------------------- /_posts/2017-07-27-using-tags.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/tags.jpg 5 | navigation: True 6 | title: Organising your content with tags 7 | date: 2017-07-27 08:00:00 8 | tags: [Getting started] 9 | class: post-template 10 | subclass: 'post' 11 | author: ghost 12 | --- 13 | 14 | 15 |

Ghost has a single, powerful organisational taxonomy, called tags.

16 |

It doesn't matter whether you want to call them categories, tags, boxes, or anything else. You can think of Ghost tags a lot like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.

17 |

Basic tagging

18 |

When you write a post, you can assign tags to help differentiate between categories of content. For example, you might tag some posts with News and other posts with Cycling, which would create two distinct categories of content listed on /tag/news/ and /tag/cycling/, respectively.

19 |

If you tag a post with both News and Cycling - then it appears in both sections.

20 |

Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.

21 |

The primary tag

22 |

Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default. So you can add the most important tag which you want to show up in your theme, but also add a bunch of related tags which are less important.

23 |

News, Cycling, Bart Stevens, Extreme Sports

24 |

In this example, News is the primary tag which will be displayed by the theme, but the post will also still receive all the other tags, and show up in their respective archives.

25 |

Private tags

26 |

Sometimes you may want to assign a post a specific tag, but you don't necessarily want that tag appearing in the theme or creating an archive page. In Ghost, hashtags are private and can be used for special styling.

27 |

For example, if you sometimes publish posts with video content - you might want your theme to adapt and get rid of the sidebar for these posts, to give more space for an embedded video to fill the screen. In this case, you could use private tags to tell your theme what to do.

28 |

News, Cycling, #video

29 |

Here, the theme would assign the post publicly displayed tags of News, and Cycling - but it would also keep a private record of the post being tagged with #video.

30 |

In your theme, you could then look for private tags conditionally and give them special formatting:

31 | {% raw %} 32 |
{{#post}}
33 |     {{#has tag="#video"}}
34 |         ...markup for a nice big video post layout...
35 |     {{else}}
36 |         ...regular markup for a post...
37 |     {{/has}}
38 | {{/post}}
39 | 
40 |

You can find documentation for theme development techniques like this and many more over on Ghost's extensive theme documentation.

41 | {% endraw %} 42 | -------------------------------------------------------------------------------- /_posts/2017-07-27-welcome.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | current: post 4 | cover: assets/images/welcome.jpg 5 | navigation: True 6 | title: Welcome to Ghost 7 | date: 2017-07-27 10:00:00 8 | tags: [Getting started] 9 | class: post-template 10 | subclass: 'post' 11 | author: ghost 12 | --- 13 | 14 | Hey! Welcome to Ghost, it's great to have you :) 15 | 16 | We know that first impressions are important, so we've populated your new site with some initial **Getting Started** posts that will help you get familiar with everything in no time. This is the first one! 17 | 18 | ### There are a few things that you should know up-front: 19 | 1. Ghost is designed for ambitious, professional publishers who want to actively build a business around their content. That's who it works best for. If you're using Ghost for some other purpose, that's fine too - but it might not be the best choice for you. 20 | 2. The entire platform can be modified and customized to suit your needs, which is very powerful, but doing so **does** require some knowledge of code. Ghost is not necessarily a good platform for beginners or people who just want a simple personal blog. 21 | 3. For the best experience we recommend downloading the Ghost Desktop App for your computer, which is the best way to access your Ghost site on a desktop device. 22 | 23 | 24 | Ghost is made by an independent non-profit organisation called the Ghost Foundation. We are 100% self funded by revenue from our [Ghost(Pro)](https://ghost.org/pricing) service, and every penny we make is re-invested into funding further development of free, open source technology for modern journalism. 25 | 26 | The main thing you'll want to read about next is probably: [the Ghost editor](https://demo.ghost.io/the-editor/). 27 | 28 | Once you're done reading, you can simply delete the default **Ghost** user from your team to remove all of these introductory posts! 29 | -------------------------------------------------------------------------------- /about/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | current: about 4 | title: About 5 | navigation: true 6 | logo: 'assets/images/ghost.png' 7 | class: page-template 8 | subclass: 'post page' 9 | --- 10 | 11 | Ghost is professional publishing platform designed for modern journalism. This is a demo site of a basic Ghost install to give you a general sense of what a new Ghost site looks like when set up for the first time. 12 | 13 | > If you'd like to set up a site like this for yourself, head over to [Ghost.org](https://ghost.org/) and start a free 14 day trial to give Ghost a try! 14 | 15 | If you're a developer: Ghost is a completely open source (MIT) Node.js application built on a JSON API with an Ember.js admin client. It works with MySQL and SQLite, and is publicly available [on Github](https://github.com/TryGhost/ghost). 16 | 17 | If you need help with using Ghost, you'll find a ton of useful articles on [our knowledgebase](https://help.ghost.org/), as well as extensive [developer documentation](https://docs.ghost.org/). 18 | -------------------------------------------------------------------------------- /assets/built/global.css: -------------------------------------------------------------------------------- 1 | a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,ul,var,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}img{max-width:100%}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}a{background-color:transparent}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn,em,i{font-style:italic}h1{margin:.67em 0;font-size:2em}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}mark{background-color:#fdffb6}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;color:inherit;font:inherit}button{overflow:visible;border:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input:focus{outline:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{padding:0;border:0}textarea{overflow:auto}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}html{overflow-y:scroll;font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body,html{overflow-x:hidden}body{color:#3c484e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1.5rem;line-height:1.6em;font-weight:400;font-style:normal;letter-spacing:0;text-rendering:optimizeLegibility;background:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:"liga" on}::selection{text-shadow:none;background:#cbeafb}hr{position:relative;display:block;width:100%;margin:2.5em 0 3.5em;padding:0;height:1px;border:0;border-top:1px solid #e3e9ed}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{margin:0;padding:0;border:0}textarea{resize:vertical}blockquote,dl,ol,p,ul{margin:0 0 1.5em}ol,ul{padding-left:1.3em;padding-right:1.5em}ol ol,ol ul,ul ol,ul ul{margin:.5em 0 1em}ul{list-style:disc}ol{list-style:decimal}li{margin:.5em 0;padding-left:.3em;line-height:1.6em}dt{float:left;margin:0 20px 0 0;width:120px;color:#15171a;font-weight:500;text-align:right}dd{margin:0 0 5px;text-align:left}blockquote{margin:1.5em 0;padding:0 1.6em;border-left:.5em solid #e5eff5}blockquote p{margin:.8em 0;font-size:1.2em;font-weight:300}blockquote small{display:inline-block;margin:.8em 0 .8em 1.5em;font-size:.9em;opacity:.8}blockquote small:before{content:"\2014 \00A0"}blockquote cite{font-weight:700}blockquote cite a{font-weight:400}a{color:#26a8ed;text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{margin-top:0;line-height:1.15;font-weight:700;text-rendering:optimizeLegibility}h1{margin:0 0 .5em;font-size:5rem;font-weight:700}@media (max-width:500px){h1{font-size:2.2rem}}h2{margin:1.5em 0 .5em;font-size:2rem}@media (max-width:500px){h2{font-size:1.8rem}}h3{margin:1.5em 0 .5em;font-size:1.8rem;font-weight:500}@media (max-width:500px){h3{font-size:1.7rem}}h4{margin:1.5em 0 .5em;font-size:1.6rem;font-weight:500}h5,h6{margin:1.5em 0 .5em;font-size:1.4rem;font-weight:500}@media (-ms-high-contrast:active),(-ms-high-contrast:none){blockquote,ol,p,ul{width:100%}} 2 | /*# sourceMappingURL=global.css.map */ 3 | -------------------------------------------------------------------------------- /assets/built/global.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["global.css"],"names":[],"mappings":"AAqBA,8YA6EI,SAAU,AACV,UAAW,AACX,SAAU,AACV,aAAc,AACd,eAAgB,AAChB,uBAAyB,CAC5B,AACD,KACI,aAAe,CAClB,AACD,MAEI,eAAiB,CACpB,AACD,aAEI,WAAa,CAChB,AACD,oDAII,WAAY,AACZ,YAAc,CACjB,AAKD,IACI,cAAgB,CACnB,AACD,KACI,sBAAuB,AACvB,uBAAwB,AAExB,0BAA2B,AAC3B,6BAA+B,CAClC,AACD,iBAGI,kBAAoB,CACvB,AACD,EACI,4BAA8B,CACjC,AACD,iBAEI,SAAW,CACd,AACD,SAEI,eAAkB,CACrB,AACD,SAGI,iBAAmB,CACtB,AACD,GACI,eAAiB,AACjB,aAAe,CAClB,AACD,MACI,aAAe,CAClB,AACD,QAEI,kBAAmB,AACnB,cAAe,AACf,cAAe,AACf,uBAAyB,CAC5B,AACD,IACI,SAAY,CACf,AACD,IACI,aAAgB,CACnB,AACD,IACI,QAAU,CACb,AACD,eACI,eAAiB,CACpB,AACD,KACI,wBAA0B,CAC7B,AACD,kBAII,gCAAkC,AAClC,aAAe,CAClB,AACD,sCAKI,SAAU,AACV,cAAe,AACf,YAAc,CACjB,AACD,OACI,iBAAkB,AAClB,WAAa,CAChB,AACD,cAEI,mBAAqB,CACxB,AACD,oEAKI,eAAgB,AAEhB,yBAA2B,CAC9B,AACD,sCAEI,cAAgB,CACnB,AACD,iDAEI,UAAW,AACX,QAAU,CACb,AACD,MACI,kBAAoB,CACvB,AACD,YACI,YAAc,CACjB,AACD,uCAEI,sBAAuB,AACvB,SAAW,CACd,AACD,4FAEI,WAAa,CAChB,AACD,mBACI,uBAAwB,AAExB,4BAA8B,CACjC,AACD,+FAEI,uBAAyB,CAC5B,AACD,OACI,UAAW,AACX,QAAU,CACb,AACD,SACI,aAAe,CAClB,AACD,MACI,iBAAkB,AAClB,wBAA0B,CAC7B,AACD,MAEI,SAAW,CACd,AAOD,KAEI,kBAAmB,AACnB,gBAAiB,AAEjB,yCAA8C,CACjD,AACD,UANI,iBAAmB,CAqBtB,AAfD,KAEI,cAAqC,AACrC,yHAAyI,AACzI,iBAAkB,AAClB,kBAAmB,AACnB,gBAAiB,AACjB,kBAAmB,AACnB,iBAAkB,AAClB,kCAAmC,AACnC,gBAAiB,AAEjB,mCAAoC,AACpC,kCAAmC,AACnC,oCAAsC,CACzC,AAED,YACI,iBAAkB,AAClB,kBAA+C,CAClD,AAED,GACI,kBAAmB,AACnB,cAAe,AACf,WAAY,AACZ,qBAAsB,AACtB,UAAW,AACX,WAAY,AACZ,SAAU,AACV,4BAAsD,CACzD,AAED,kCAMI,qBAAuB,CAC1B,AAED,SACI,SAAU,AACV,UAAW,AACX,QAAU,CACb,AAED,SACI,eAAiB,CACpB,AAED,sBAKI,gBAAoB,CACvB,AAED,MAEI,mBAAoB,AACpB,mBAAqB,CACxB,AAED,wBAII,iBAAoB,CACvB,AAED,GACI,eAAiB,CACpB,AAED,GACI,kBAAoB,CACvB,AAED,GACI,cAAgB,AAChB,kBAAoB,AACpB,iBAAmB,CACtB,AAED,GACI,WAAY,AACZ,kBAAmB,AACnB,YAAa,AACb,cAAuB,AACvB,gBAAiB,AACjB,gBAAkB,CACrB,AAED,GACI,eAAkB,AAClB,eAAiB,CACpB,AAED,WACI,eAAgB,AAChB,gBAAyB,AACzB,8BAA0C,CAC7C,AAED,aACI,cAAgB,AAChB,gBAAiB,AACjB,eAAiB,CACpB,AAED,iBACI,qBAAsB,AACtB,yBAA4B,AAC5B,eAAiB,AACjB,UAAa,CAChB,AAED,wBACI,qBAAuB,CAC1B,AAED,gBACI,eAAkB,CACrB,AACD,kBACI,eAAoB,CACvB,AAED,EACI,cAAiC,AACjC,oBAAsB,CACzB,AAED,QACI,yBAA2B,CAC9B,AAED,kBAMI,aAAc,AACd,iBAAkB,AAClB,gBAAiB,AACjB,iCAAmC,CACtC,AAED,GACI,gBAAoB,AACpB,eAAgB,AAChB,eAAiB,CACpB,AACD,yBACI,GACI,gBAAkB,CACrB,CACJ,AAED,GACI,oBAAwB,AACxB,cAAgB,CACnB,AACD,yBACI,GACI,gBAAkB,CACrB,CACJ,AAED,GACI,oBAAwB,AACxB,iBAAkB,AAClB,eAAiB,CACpB,AACD,yBACI,GACI,gBAAkB,CACrB,CACJ,AAED,GACI,oBAAwB,AACxB,iBAAkB,AAClB,eAAiB,CACpB,AAQD,MALI,oBAAwB,AACxB,iBAAkB,AAClB,eAAiB,CAOpB,AAED,2DAII,mBACI,UAAY,CACf,CACJ","file":"global.css","sourcesContent":["/* Variables\n/* ---------------------------------------------------------- */\n\n:root {\n /* Colours */\n --blue: #3eb0ef;\n --green: #a4d037;\n --purple: #ad26b4;\n --yellow: #fecd35;\n --red: #f05230;\n --darkgrey: #15171A;\n --midgrey: #738a94;\n --lightgrey: #c5d2d9;\n --whitegrey: #e5eff5;\n --pink: #fa3a57;\n --brown: #a3821a;\n}\n\n/* Reset\n/* ---------------------------------------------------------- */\n\nhtml,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline;\n}\nbody {\n line-height: 1;\n}\nol,\nul {\n list-style: none;\n}\nblockquote,\nq {\n quotes: none;\n}\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n content: \"\";\n content: none;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\nimg {\n max-width: 100%;\n}\nhtml {\n box-sizing: border-box;\n font-family: sans-serif;\n\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\n*,\n*:before,\n*:after {\n box-sizing: inherit;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nb,\nstrong {\n font-weight: bold;\n}\ni,\nem,\ndfn {\n font-style: italic;\n}\nh1 {\n margin: 0.67em 0;\n font-size: 2em;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nmark {\n background-color: #fdffb6;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0; /* 3 */\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n}\nbutton {\n overflow: visible;\n border: none;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\n/* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n cursor: pointer; /* 3 */\n\n -webkit-appearance: button; /* 2 */\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\ninput {\n line-height: normal;\n}\ninput:focus {\n outline: none;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n box-sizing: content-box; /* 2 */\n\n -webkit-appearance: textfield; /* 1 */\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nlegend {\n padding: 0; /* 2 */\n border: 0; /* 1 */\n}\ntextarea {\n overflow: auto;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\ntd,\nth {\n padding: 0;\n}\n\n\n/* ==========================================================================\n Base styles: opinionated defaults\n ========================================================================== */\n\nhtml {\n overflow-x: hidden;\n overflow-y: scroll;\n font-size: 62.5%;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n overflow-x: hidden;\n color: color(var(--midgrey) l(-25%));\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\n font-size: 1.5rem;\n line-height: 1.6em;\n font-weight: 400;\n font-style: normal;\n letter-spacing: 0;\n text-rendering: optimizeLegibility;\n background: #fff;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -moz-font-feature-settings: \"liga\" on;\n}\n\n::selection {\n text-shadow: none;\n background: color(var(--blue) lightness(+30%));\n}\n\nhr {\n position: relative;\n display: block;\n width: 100%;\n margin: 2.5em 0 3.5em;\n padding: 0;\n height: 1px;\n border: 0;\n border-top: 1px solid color(var(--lightgrey) l(+10%));\n}\n\naudio,\ncanvas,\niframe,\nimg,\nsvg,\nvideo {\n vertical-align: middle;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n border: 0;\n}\n\ntextarea {\n resize: vertical;\n}\n\np,\nul,\nol,\ndl,\nblockquote {\n margin: 0 0 1.5em 0;\n}\n\nol,\nul {\n padding-left: 1.3em;\n padding-right: 1.5em;\n}\n\nol ol,\nul ul,\nul ol,\nol ul {\n margin: 0.5em 0 1em;\n}\n\nul {\n list-style: disc;\n}\n\nol {\n list-style: decimal;\n}\n\nli {\n margin: 0.5em 0;\n padding-left: 0.3em;\n line-height: 1.6em;\n}\n\ndt {\n float: left;\n margin: 0 20px 0 0;\n width: 120px;\n color: var(--darkgrey);\n font-weight: 500;\n text-align: right;\n}\n\ndd {\n margin: 0 0 5px 0;\n text-align: left;\n}\n\nblockquote {\n margin: 1.5em 0;\n padding: 0 1.6em 0 1.6em;\n border-left: var(--whitegrey) 0.5em solid;\n}\n\nblockquote p {\n margin: 0.8em 0;\n font-size: 1.2em;\n font-weight: 300;\n}\n\nblockquote small {\n display: inline-block;\n margin: 0.8em 0 0.8em 1.5em;\n font-size: 0.9em;\n opacity: 0.8;\n}\n/* Quotation marks */\nblockquote small:before {\n content: \"\\2014 \\00A0\";\n}\n\nblockquote cite {\n font-weight: bold;\n}\nblockquote cite a {\n font-weight: normal;\n}\n\na {\n color: color(var(--blue) l(-5%));\n text-decoration: none;\n}\n\na:hover {\n text-decoration: underline;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n line-height: 1.15;\n font-weight: 700;\n text-rendering: optimizeLegibility;\n}\n\nh1 {\n margin: 0 0 0.5em 0;\n font-size: 5rem;\n font-weight: 700;\n}\n@media (max-width: 500px) {\n h1 {\n font-size: 2.2rem;\n }\n}\n\nh2 {\n margin: 1.5em 0 0.5em 0;\n font-size: 2rem;\n}\n@media (max-width: 500px) {\n h2 {\n font-size: 1.8rem;\n }\n}\n\nh3 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.8rem;\n font-weight: 500;\n}\n@media (max-width: 500px) {\n h3 {\n font-size: 1.7rem;\n }\n}\n\nh4 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.6rem;\n font-weight: 500;\n}\n\nh5 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.4rem;\n font-weight: 500;\n}\n\nh6 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.4rem;\n font-weight: 500;\n}\n\n@media all and (-ms-high-contrast: none), (-ms-high-contrast:active) {\n p, ol, ul{\n width: 100%;\n }\n blockquote {\n width: 100%;\n }\n}\n"],"sourceRoot":"/source/"} -------------------------------------------------------------------------------- /assets/built/screen.edited.css: -------------------------------------------------------------------------------- 1 | .pagination{position:relative;width:80%;max-width:800px;margin:4rem auto;font-family:Open Sans,sans-serif;font-size:1.3rem;color:#9eabb3;text-align:center}.pagination a{color:#3eb0ef;transition:all .2s ease}.newer-posts,.older-posts{position:absolute;display:inline-block;padding:0 15px;border:1px solid #bfc8cd;text-decoration:none;border-radius:4px;transition:border .3s ease}.older-posts{right:0}.page-number{display:inline-block;padding:2px 0;min-width:100px}.newer-posts{left:0}.newer-posts:hover,.older-posts:hover{color:#3eb0ef;border-color:#98a0a4}.extra-pagination{display:none;border-bottom:1px solid #ebf2f6}.extra-pagination:after{display:block;content:"";width:7px;height:7px;border:1px solid #e7eef2;position:absolute;bottom:-5px;left:50%;margin-left:-5px;background:#fff;border-radius:100%;box-shadow:0 0 0 5px #fff}.extra-pagination .pagination{width:auto}.paged .main-header{max-height:30vh}.paged .extra-pagination{display:block}.pagination{padding-top:4rem;border-top:1px solid #bfc8cd;word-wrap:break-word}.pagination:before{display:block;content:"";width:7px;height:7px;border:1px solid #bfc8cd;position:absolute;top:-5px;left:50%;margin-left:-5px;background:#f4f8fb;border-radius:100%;box-shadow:0 0 0 5px #f4f8fb}.highlighter-rouge{overflow-x:auto;max-width:100%;min-width:100%}.highlight code,.highlight pre,.highlight table,.highlight tbody,.highlight tr,figure.highlight,td.code{border:none;min-width:100%;max-width:100%}.highlight table,.highlight td pre{padding:0;margin:0}.highlight table td{border:none;margin:none;padding:none}.highlight table td:first-child,.highlight table td:last-child{background:none} 2 | /*# sourceMappingURL=screen.edited.css.map */ 3 | -------------------------------------------------------------------------------- /assets/built/screen.edited.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["screen.edited.css"],"names":[],"mappings":"AAcA,YACI,kBAAmB,AACnB,UAAW,AACX,gBAAiB,AACjB,iBAAkB,AAClB,iCAAqC,AACrC,iBAAkB,AAClB,cAAe,AACf,iBAAmB,CACtB,AAED,cACI,cAAe,AACf,uBAA0B,CAC7B,AAGD,0BAEI,kBAAmB,AACnB,qBAAsB,AACtB,eAAgB,AAChB,yBAA0B,AAC1B,qBAAsB,AACtB,kBAAmB,AACnB,0BAA6B,CAChC,AAED,aACI,OAAS,CACZ,AAED,aACI,qBAAsB,AACtB,cAAe,AACf,eAAiB,CACpB,AAED,aACI,MAAQ,CACX,AAED,sCAEI,cAAe,AACf,oBAAsB,CACzB,AAED,kBACI,aAAc,AACd,+BAAiC,CACpC,AACD,wBACI,cAAe,AACf,WAAY,AACZ,UAAW,AACX,WAAY,AACZ,yBAA0B,AAC1B,kBAAmB,AACnB,YAAa,AACb,SAAU,AACV,iBAAkB,AAClB,gBAAiB,AACjB,mBAAoB,AACpB,yBAA2B,CAC9B,AACD,8BACI,UAAY,CACf,AAGD,oBACI,eAAiB,CACpB,AAGD,yBACI,aAAe,CAClB,AAGD,YACI,iBAAkB,AAClB,6BAA8B,AAC9B,oBAAsB,CACzB,AAID,mBACI,cAAe,AACf,WAAY,AACZ,UAAW,AACX,WAAY,AACZ,yBAA0B,AAC1B,kBAAmB,AACnB,SAAU,AACV,SAAU,AACV,iBAAkB,AAClB,mBAAoB,AACpB,mBAAoB,AACpB,4BAA8B,CACjC,AAED,mBACI,gBAAiB,AACjB,eAAgB,AAChB,cAAgB,CACnB,AAED,wGAOI,YAAa,AACb,eAAgB,AAChB,cAAgB,CACnB,AAED,mCAEI,UAAW,AACX,QAAU,CACb,AAED,oBACI,YAAa,AACb,YAAa,AACb,YAAc,CACjB,AAED,+DAEI,eAAiB,CACpB","file":"screen.edited.css","sourcesContent":["/* Table of Contents\n/* ------------------------------------------------------------\n\nThis is a development CSS file which is built to a minified\nproduction stylesheet in assets/built/screen.css\n\n12. Pagination\n\n*/\n\n/* 12. Pagination - Tools to let you flick between pages\n/* ---------------------------------------------------------- */\n\n/* The main wrapper for our pagination links */\n.pagination {\n position: relative;\n width: 80%;\n max-width: 800px;\n margin: 4rem auto;\n font-family: \"Open Sans\", sans-serif;\n font-size: 1.3rem;\n color: #9EABB3;\n text-align: center;\n}\n\n.pagination a {\n color: #3eb0ef;\n transition: all 0.2s ease;\n}\n\n/* Push the previous/next links out to the left/right */\n.older-posts,\n.newer-posts {\n position: absolute;\n display: inline-block;\n padding: 0 15px;\n border: #bfc8cd 1px solid;\n text-decoration: none;\n border-radius: 4px;\n transition: border 0.3s ease;\n}\n\n.older-posts {\n right: 0;\n}\n\n.page-number {\n display: inline-block;\n padding: 2px 0;\n min-width: 100px;\n}\n\n.newer-posts {\n left: 0;\n}\n\n.older-posts:hover,\n.newer-posts:hover {\n color: #3eb0ef;\n border-color: #98a0a4;\n}\n\n.extra-pagination {\n display: none;\n border-bottom: #EBF2F6 1px solid;\n}\n.extra-pagination:after {\n display: block;\n content: \"\";\n width: 7px;\n height: 7px;\n border: #E7EEF2 1px solid;\n position: absolute;\n bottom: -5px;\n left: 50%;\n margin-left: -5px;\n background: #FFF;\n border-radius: 100%;\n box-shadow: #FFF 0 0 0 5px;\n}\n.extra-pagination .pagination {\n width: auto;\n}\n\n/* On page2+ make all the headers smaller */\n.paged .main-header {\n max-height: 30vh;\n}\n\n/* On page2+ show extra pagination controls at the top of post list */\n.paged .extra-pagination {\n display: block;\n}\n\n/* Every post, on every page, gets this style on its
tag */\n.pagination {\n padding-top: 4rem;\n border-top: #bfc8cd 1px solid;\n word-wrap: break-word;\n}\n\n/* Add a little circle in the middle of the border-bottom on our .post\n just for the lolz and stylepoints. */\n.pagination:before {\n display: block;\n content: \"\";\n width: 7px;\n height: 7px;\n border: #bfc8cd 1px solid;\n position: absolute;\n top: -5px;\n left: 50%;\n margin-left: -5px;\n background: #f4f8fb;\n border-radius: 100%;\n box-shadow: #f4f8fb 0 0 0 5px;\n}\n\n.highlighter-rouge {\n overflow-x: auto;\n max-width: 100%;\n min-width: 100%;\n}\n\nfigure.highlight,\n.highlight pre,\n.highlight code,\n.highlight table,\n.highlight tbody,\n.highlight tr,\ntd.code {\n border: none;\n min-width: 100%;\n max-width: 100%;\n}\n\n.highlight table,\n.highlight td pre {\n padding: 0;\n margin: 0;\n}\n\n.highlight table td {\n border: none;\n margin: none;\n padding: none;\n}\n\n.highlight table td:first-child,\n.highlight table td:last-child {\n background: none;\n}\n"],"sourceRoot":"/source/"} -------------------------------------------------------------------------------- /assets/built/syntax.css: -------------------------------------------------------------------------------- 1 | a,abbr,acronym,address,applet,article,aside,audio,big,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,ul,var,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}img{max-width:100%}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}a{background-color:transparent}a:active,a:hover{outline:0}b,strong{font-weight:700}dfn,em,i{font-style:italic}h1{margin:.67em 0;font-size:2em}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}mark{background-color:#fdffb6}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;color:inherit;font:inherit}button{overflow:visible;border:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input:focus{outline:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}legend{padding:0;border:0}textarea{overflow:auto}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}html{overflow-y:scroll;font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body,html{overflow-x:hidden}body{color:#3c484e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:1.5rem;line-height:1.6em;font-weight:400;font-style:normal;letter-spacing:0;text-rendering:optimizeLegibility;background:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:"liga" on}::selection{text-shadow:none;background:#cbeafb}hr{position:relative;display:block;width:100%;margin:2.5em 0 3.5em;padding:0;height:1px;border:0;border-top:1px solid #e3e9ed}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{margin:0;padding:0;border:0}textarea{resize:vertical}blockquote,dl,ol,p,ul{margin:0 0 1.5em}ol,ul{padding-left:1.3em;padding-right:1.5em}ol ol,ol ul,ul ol,ul ul{margin:.5em 0 1em}ul{list-style:disc}ol{list-style:decimal}li{margin:.5em 0;padding-left:.3em;line-height:1.6em}dt{float:left;margin:0 20px 0 0;width:120px;color:#15171a;font-weight:500;text-align:right}dd{margin:0 0 5px;text-align:left}blockquote{margin:1.5em 0;padding:0 1.6em;border-left:.5em solid #e5eff5}blockquote p{margin:.8em 0;font-size:1.2em;font-weight:300}blockquote small{display:inline-block;margin:.8em 0 .8em 1.5em;font-size:.9em;opacity:.8}blockquote small:before{content:"\2014 \00A0"}blockquote cite{font-weight:700}blockquote cite a{font-weight:400}a{color:#26a8ed;text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4,h5,h6{margin-top:0;line-height:1.15;font-weight:700;text-rendering:optimizeLegibility}h1{margin:0 0 .5em;font-size:5rem;font-weight:700}@media (max-width:500px){h1{font-size:2.2rem}}h2{margin:1.5em 0 .5em;font-size:2rem}@media (max-width:500px){h2{font-size:1.8rem}}h3{margin:1.5em 0 .5em;font-size:1.8rem;font-weight:500}@media (max-width:500px){h3{font-size:1.7rem}}h4{margin:1.5em 0 .5em;font-size:1.6rem;font-weight:500}h5,h6{margin:1.5em 0 .5em;font-size:1.4rem;font-weight:500}@media (-ms-high-contrast:active),(-ms-high-contrast:none){blockquote,ol,p,ul{width:100%}}.highlight .hll,.highlight pre{background:#0e0f11}.highlight .c{color:#75715e}.highlight .err{color:#960050;background-color:#1e0010}.highlight .k{color:#66d9ef}.highlight .l{color:#ae81ff}.highlight .n{color:#f8f8f2}.highlight .o{color:#f92672}.highlight .p{color:#f8f8f2}.highlight .c1,.highlight .cm,.highlight .cp,.highlight .cs{color:#75715e}.highlight .ge{font-style:italic}.highlight .gs{font-weight:700}.highlight .kc,.highlight .kd{color:#66d9ef}.highlight .kn{color:#f92672}.highlight .kp,.highlight .kr,.highlight .kt{color:#66d9ef}.highlight .ld{color:#e6db74}.highlight .m{color:#ae81ff}.highlight .s{color:#e6db74}.highlight .na{color:#a6e22e}.highlight .nb{color:#f8f8f2}.highlight .nc{color:#a6e22e}.highlight .no{color:#66d9ef}.highlight .nd{color:#a6e22e}.highlight .ni{color:#f8f8f2}.highlight .ne,.highlight .nf{color:#a6e22e}.highlight .nl,.highlight .nn{color:#f8f8f2}.highlight .nx{color:#a6e22e}.highlight .py{color:#f8f8f2}.highlight .nt{color:#f92672}.highlight .nv{color:#f8f8f2}.highlight .ow{color:#f92672}.highlight .w{color:#f8f8f2}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#ae81ff}.highlight .s2,.highlight .sb,.highlight .sc,.highlight .sd{color:#e6db74}.highlight .se{color:#ae81ff}.highlight .s1,.highlight .sh,.highlight .si,.highlight .sr,.highlight .ss,.highlight .sx{color:#e6db74}.highlight .bp,.highlight .vc,.highlight .vg,.highlight .vi{color:#f8f8f2}.highlight .il{color:#ae81ff}.highlight .gu{color:#75715e}.highlight .gd{color:#f92672}.highlight .gi{color:#a6e22e} 2 | /*# sourceMappingURL=syntax.css.map */ 3 | -------------------------------------------------------------------------------- /assets/css/.csscomb.json: -------------------------------------------------------------------------------- 1 | { 2 | "remove-empty-rulesets": true, 3 | "always-semicolon": true, 4 | "color-case": "lower", 5 | "block-indent": " ", 6 | "color-shorthand": true, 7 | "element-case": "lower", 8 | "eof-newline": true, 9 | "leading-zero": true, 10 | "quotes": "double", 11 | "space-before-colon": "", 12 | "space-after-colon": " ", 13 | "space-before-combinator": " ", 14 | "space-after-combinator": " ", 15 | "space-between-declarations": "\n", 16 | "space-before-opening-brace": " ", 17 | "space-after-opening-brace": "\n", 18 | "space-after-selector-delimiter": "\n", 19 | "space-before-selector-delimiter": "", 20 | "space-before-closing-brace": "\n", 21 | "strip-spaces": true, 22 | "tab-size": 4, 23 | "unitless-zero": true, 24 | "sort-order": [ [ 25 | "content", 26 | "visibility", 27 | "position", 28 | "top", 29 | "right", 30 | "bottom", 31 | "left", 32 | "z-index", 33 | "order", 34 | "flex", 35 | "flex-grow", 36 | "flex-shrink", 37 | "flex-basis", 38 | "align-self", 39 | "display", 40 | "flex-flow", 41 | "flex-direction", 42 | "flex-wrap", 43 | "justify-content", 44 | "align-items", 45 | "align-content", 46 | "flex-order", 47 | "flex-pack", 48 | "flex-align", 49 | "float", 50 | "clear", 51 | "overflow", 52 | "overflow-x", 53 | "overflow-y", 54 | "-webkit-overflow-scrolling", 55 | "clip", 56 | "box-sizing", 57 | "margin", 58 | "margin-top", 59 | "margin-right", 60 | "margin-bottom", 61 | "margin-left", 62 | "padding", 63 | "padding-top", 64 | "padding-right", 65 | "padding-bottom", 66 | "padding-left", 67 | "min-width", 68 | "min-height", 69 | "max-width", 70 | "max-height", 71 | "width", 72 | "height", 73 | "outline", 74 | "outline-width", 75 | "outline-style", 76 | "outline-color", 77 | "outline-offset", 78 | "border", 79 | "border-spacing", 80 | "border-collapse", 81 | "border-width", 82 | "border-style", 83 | "border-color", 84 | "border-top", 85 | "border-top-width", 86 | "border-top-style", 87 | "border-top-color", 88 | "border-right", 89 | "border-right-width", 90 | "border-right-style", 91 | "border-right-color", 92 | "border-bottom", 93 | "border-bottom-width", 94 | "border-bottom-style", 95 | "border-bottom-color", 96 | "border-left", 97 | "border-left-width", 98 | "border-left-style", 99 | "border-left-color", 100 | "border-image", 101 | "border-image-source", 102 | "border-image-slice", 103 | "border-image-width", 104 | "border-image-outset", 105 | "border-image-repeat", 106 | "border-top-image", 107 | "border-right-image", 108 | "border-bottom-image", 109 | "border-left-image", 110 | "border-corner-image", 111 | "border-top-left-image", 112 | "border-top-right-image", 113 | "border-bottom-right-image", 114 | "border-bottom-left-image", 115 | "color", 116 | "font", 117 | "font-family", 118 | "font-size", 119 | "line-height", 120 | "font-weight", 121 | "font-style", 122 | "font-variant", 123 | "font-size-adjust", 124 | "font-stretch", 125 | "font-feature-settings", 126 | "letter-spacing", 127 | "text-rendering", 128 | "text-align", 129 | "text-align-last", 130 | "text-decoration", 131 | "text-emphasis", 132 | "text-emphasis-position", 133 | "text-emphasis-style", 134 | "text-emphasis-color", 135 | "text-indent", 136 | "text-justify", 137 | "text-outline", 138 | "text-transform", 139 | "text-wrap", 140 | "text-overflow", 141 | "text-overflow-ellipsis", 142 | "text-overflow-mode", 143 | "text-shadow", 144 | "white-space", 145 | "word-spacing", 146 | "word-wrap", 147 | "word-break", 148 | "tab-size", 149 | "hyphens", 150 | "user-select", 151 | "fill", 152 | "stroke", 153 | "background", 154 | "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", 155 | "background-color", 156 | "background-image", 157 | "background-attachment", 158 | "background-position", 159 | "background-position-x", 160 | "background-position-y", 161 | "background-clip", 162 | "background-origin", 163 | "background-size", 164 | "background-repeat", 165 | "border-radius", 166 | "border-top-left-radius", 167 | "border-top-right-radius", 168 | "border-bottom-right-radius", 169 | "border-bottom-left-radius", 170 | "box-decoration-break", 171 | "box-shadow", 172 | "table-layout", 173 | "caption-side", 174 | "empty-cells", 175 | "list-style", 176 | "list-style-position", 177 | "list-style-type", 178 | "list-style-image", 179 | "quotes", 180 | "counter-increment", 181 | "counter-reset", 182 | "vertical-align", 183 | "src", 184 | "opacity", 185 | "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", 186 | "filter", 187 | "resize", 188 | "cursor", 189 | "nav-index", 190 | "nav-up", 191 | "nav-right", 192 | "nav-down", 193 | "nav-left", 194 | "transition", 195 | "transition-delay", 196 | "transition-timing-function", 197 | "transition-duration", 198 | "transition-property", 199 | "transform", 200 | "transform-origin", 201 | "animation", 202 | "animation-name", 203 | "animation-duration", 204 | "animation-play-state", 205 | "animation-timing-function", 206 | "animation-delay", 207 | "animation-iteration-count", 208 | "animation-direction", 209 | "animation-fill-mode", 210 | "pointer-events", 211 | "unicode-bidi", 212 | "direction", 213 | "columns", 214 | "column-span", 215 | "column-width", 216 | "column-count", 217 | "column-fill", 218 | "column-gap", 219 | "column-rule", 220 | "column-rule-width", 221 | "column-rule-style", 222 | "column-rule-color", 223 | "break-before", 224 | "break-inside", 225 | "break-after", 226 | "page-break-before", 227 | "page-break-inside", 228 | "page-break-after", 229 | "orphans", 230 | "widows", 231 | "zoom", 232 | "max-zoom", 233 | "min-zoom", 234 | "user-zoom", 235 | "orientation" 236 | ] ] 237 | } 238 | -------------------------------------------------------------------------------- /assets/css/csscomb.json: -------------------------------------------------------------------------------- 1 | { 2 | "remove-empty-rulesets": true, 3 | "always-semicolon": true, 4 | "color-case": "lower", 5 | "block-indent": " ", 6 | "color-shorthand": true, 7 | "element-case": "lower", 8 | "eof-newline": true, 9 | "leading-zero": true, 10 | "quotes": "double", 11 | "space-before-colon": "", 12 | "space-after-colon": " ", 13 | "space-before-combinator": " ", 14 | "space-after-combinator": " ", 15 | "space-between-declarations": "\n", 16 | "space-before-opening-brace": " ", 17 | "space-after-opening-brace": "\n", 18 | "space-after-selector-delimiter": "\n", 19 | "space-before-selector-delimiter": "", 20 | "space-before-closing-brace": "\n", 21 | "strip-spaces": true, 22 | "tab-size": 4, 23 | "unitless-zero": true, 24 | "sort-order": [ [ 25 | "content", 26 | "visibility", 27 | "position", 28 | "top", 29 | "right", 30 | "bottom", 31 | "left", 32 | "z-index", 33 | "order", 34 | "flex", 35 | "flex-grow", 36 | "flex-shrink", 37 | "flex-basis", 38 | "align-self", 39 | "display", 40 | "flex-flow", 41 | "flex-direction", 42 | "justify-content", 43 | "align-items", 44 | "align-content", 45 | "flex-wrap", 46 | "flex-order", 47 | "flex-pack", 48 | "flex-align", 49 | "float", 50 | "clear", 51 | "box-sizing", 52 | "width", 53 | "height", 54 | "min-width", 55 | "min-height", 56 | "max-width", 57 | "max-height", 58 | "overflow", 59 | "overflow-x", 60 | "overflow-y", 61 | "clip", 62 | "margin", 63 | "margin-top", 64 | "margin-right", 65 | "margin-bottom", 66 | "margin-left", 67 | "padding", 68 | "padding-top", 69 | "padding-right", 70 | "padding-bottom", 71 | "padding-left", 72 | "outline", 73 | "outline-width", 74 | "outline-style", 75 | "outline-color", 76 | "outline-offset", 77 | "border", 78 | "border-spacing", 79 | "border-collapse", 80 | "border-width", 81 | "border-style", 82 | "border-color", 83 | "border-top", 84 | "border-top-width", 85 | "border-top-style", 86 | "border-top-color", 87 | "border-right", 88 | "border-right-width", 89 | "border-right-style", 90 | "border-right-color", 91 | "border-bottom", 92 | "border-bottom-width", 93 | "border-bottom-style", 94 | "border-bottom-color", 95 | "border-left", 96 | "border-left-width", 97 | "border-left-style", 98 | "border-left-color", 99 | "border-image", 100 | "border-image-source", 101 | "border-image-slice", 102 | "border-image-width", 103 | "border-image-outset", 104 | "border-image-repeat", 105 | "border-top-image", 106 | "border-right-image", 107 | "border-bottom-image", 108 | "border-left-image", 109 | "border-corner-image", 110 | "border-top-left-image", 111 | "border-top-right-image", 112 | "border-bottom-right-image", 113 | "border-bottom-left-image", 114 | "table-layout", 115 | "caption-side", 116 | "empty-cells", 117 | "list-style", 118 | "list-style-position", 119 | "list-style-type", 120 | "list-style-image", 121 | "quotes", 122 | "counter-increment", 123 | "counter-reset", 124 | "vertical-align", 125 | "stroke", 126 | "fill", 127 | "stroke-width", 128 | "stroke-opacity", 129 | "color", 130 | "font", 131 | "font-family", 132 | "font-size", 133 | "line-height", 134 | "font-weight", 135 | "font-style", 136 | "font-variant", 137 | "font-size-adjust", 138 | "font-stretch", 139 | "text-rendering", 140 | "font-feature-settings", 141 | "letter-spacing", 142 | "hyphens", 143 | "text-align", 144 | "text-align-last", 145 | "text-decoration", 146 | "text-emphasis", 147 | "text-emphasis-position", 148 | "text-emphasis-style", 149 | "text-emphasis-color", 150 | "text-indent", 151 | "text-justify", 152 | "text-outline", 153 | "text-transform", 154 | "text-wrap", 155 | "text-overflow", 156 | "text-overflow-ellipsis", 157 | "text-overflow-mode", 158 | "text-shadow", 159 | "white-space", 160 | "word-spacing", 161 | "word-wrap", 162 | "word-break", 163 | "tab-size", 164 | "user-select", 165 | "src", 166 | "resize", 167 | "cursor", 168 | "nav-index", 169 | "nav-up", 170 | "nav-right", 171 | "nav-down", 172 | "nav-left", 173 | "background", 174 | "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", 175 | "background-color", 176 | "background-image", 177 | "background-size", 178 | "background-attachment", 179 | "background-position", 180 | "background-position-x", 181 | "background-position-y", 182 | "background-clip", 183 | "background-origin", 184 | "background-repeat", 185 | "border-radius", 186 | "border-top-left-radius", 187 | "border-top-right-radius", 188 | "border-bottom-right-radius", 189 | "border-bottom-left-radius", 190 | "box-decoration-break", 191 | "box-shadow", 192 | "opacity", 193 | "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", 194 | "filter", 195 | "transition", 196 | "transition-delay", 197 | "transition-timing-function", 198 | "transition-duration", 199 | "transition-property", 200 | "transform", 201 | "transform-origin", 202 | "animation", 203 | "animation-name", 204 | "animation-duration", 205 | "animation-play-state", 206 | "animation-timing-function", 207 | "animation-delay", 208 | "animation-iteration-count", 209 | "animation-direction", 210 | "animation-fill-mode", 211 | "pointer-events", 212 | "unicode-bidi", 213 | "direction", 214 | "columns", 215 | "column-span", 216 | "column-width", 217 | "column-count", 218 | "column-fill", 219 | "column-gap", 220 | "column-rule", 221 | "column-rule-width", 222 | "column-rule-style", 223 | "column-rule-color", 224 | "break-before", 225 | "break-inside", 226 | "break-after", 227 | "page-break-before", 228 | "page-break-inside", 229 | "page-break-after", 230 | "orphans", 231 | "widows", 232 | "zoom", 233 | "max-zoom", 234 | "min-zoom", 235 | "user-zoom", 236 | "orientation", 237 | "-webkit-overflow-scrolling", 238 | "-ms-overflow-scrolling" 239 | ] ] 240 | } 241 | -------------------------------------------------------------------------------- /assets/css/global.css: -------------------------------------------------------------------------------- 1 | /* Variables 2 | /* ---------------------------------------------------------- */ 3 | 4 | :root { 5 | /* Colours */ 6 | --blue: #3eb0ef; 7 | --green: #a4d037; 8 | --purple: #ad26b4; 9 | --yellow: #fecd35; 10 | --red: #f05230; 11 | --darkgrey: #15171A; 12 | --midgrey: #738a94; 13 | --lightgrey: #c5d2d9; 14 | --whitegrey: #e5eff5; 15 | --pink: #fa3a57; 16 | --brown: #a3821a; 17 | } 18 | 19 | /* Reset 20 | /* ---------------------------------------------------------- */ 21 | 22 | html, 23 | body, 24 | div, 25 | span, 26 | applet, 27 | object, 28 | iframe, 29 | h1, 30 | h2, 31 | h3, 32 | h4, 33 | h5, 34 | h6, 35 | p, 36 | blockquote, 37 | pre, 38 | a, 39 | abbr, 40 | acronym, 41 | address, 42 | big, 43 | cite, 44 | code, 45 | del, 46 | dfn, 47 | em, 48 | img, 49 | ins, 50 | kbd, 51 | q, 52 | s, 53 | samp, 54 | small, 55 | strike, 56 | strong, 57 | sub, 58 | sup, 59 | tt, 60 | var, 61 | dl, 62 | dt, 63 | dd, 64 | ol, 65 | ul, 66 | li, 67 | fieldset, 68 | form, 69 | label, 70 | legend, 71 | table, 72 | caption, 73 | tbody, 74 | tfoot, 75 | thead, 76 | tr, 77 | th, 78 | td, 79 | article, 80 | aside, 81 | canvas, 82 | details, 83 | embed, 84 | figure, 85 | figcaption, 86 | footer, 87 | header, 88 | hgroup, 89 | menu, 90 | nav, 91 | output, 92 | ruby, 93 | section, 94 | summary, 95 | time, 96 | mark, 97 | audio, 98 | video { 99 | margin: 0; 100 | padding: 0; 101 | border: 0; 102 | font: inherit; 103 | font-size: 100%; 104 | vertical-align: baseline; 105 | } 106 | body { 107 | line-height: 1; 108 | } 109 | ol, 110 | ul { 111 | list-style: none; 112 | } 113 | blockquote, 114 | q { 115 | quotes: none; 116 | } 117 | blockquote:before, 118 | blockquote:after, 119 | q:before, 120 | q:after { 121 | content: ""; 122 | content: none; 123 | } 124 | table { 125 | border-spacing: 0; 126 | border-collapse: collapse; 127 | } 128 | img { 129 | max-width: 100%; 130 | } 131 | html { 132 | box-sizing: border-box; 133 | font-family: sans-serif; 134 | 135 | -ms-text-size-adjust: 100%; 136 | -webkit-text-size-adjust: 100%; 137 | } 138 | *, 139 | *:before, 140 | *:after { 141 | box-sizing: inherit; 142 | } 143 | a { 144 | background-color: transparent; 145 | } 146 | a:active, 147 | a:hover { 148 | outline: 0; 149 | } 150 | b, 151 | strong { 152 | font-weight: bold; 153 | } 154 | i, 155 | em, 156 | dfn { 157 | font-style: italic; 158 | } 159 | h1 { 160 | margin: 0.67em 0; 161 | font-size: 2em; 162 | } 163 | small { 164 | font-size: 80%; 165 | } 166 | sub, 167 | sup { 168 | position: relative; 169 | font-size: 75%; 170 | line-height: 0; 171 | vertical-align: baseline; 172 | } 173 | sup { 174 | top: -0.5em; 175 | } 176 | sub { 177 | bottom: -0.25em; 178 | } 179 | img { 180 | border: 0; 181 | } 182 | svg:not(:root) { 183 | overflow: hidden; 184 | } 185 | mark { 186 | background-color: #fdffb6; 187 | } 188 | code, 189 | kbd, 190 | pre, 191 | samp { 192 | font-family: monospace, monospace; 193 | font-size: 1em; 194 | } 195 | button, 196 | input, 197 | optgroup, 198 | select, 199 | textarea { 200 | margin: 0; /* 3 */ 201 | color: inherit; /* 1 */ 202 | font: inherit; /* 2 */ 203 | } 204 | button { 205 | overflow: visible; 206 | border: none; 207 | } 208 | button, 209 | select { 210 | text-transform: none; 211 | } 212 | button, 213 | html input[type="button"], 214 | /* 1 */ 215 | input[type="reset"], 216 | input[type="submit"] { 217 | cursor: pointer; /* 3 */ 218 | 219 | -webkit-appearance: button; /* 2 */ 220 | } 221 | button[disabled], 222 | html input[disabled] { 223 | cursor: default; 224 | } 225 | button::-moz-focus-inner, 226 | input::-moz-focus-inner { 227 | padding: 0; 228 | border: 0; 229 | } 230 | input { 231 | line-height: normal; 232 | } 233 | input:focus { 234 | outline: none; 235 | } 236 | input[type="checkbox"], 237 | input[type="radio"] { 238 | box-sizing: border-box; /* 1 */ 239 | padding: 0; /* 2 */ 240 | } 241 | input[type="number"]::-webkit-inner-spin-button, 242 | input[type="number"]::-webkit-outer-spin-button { 243 | height: auto; 244 | } 245 | input[type="search"] { 246 | box-sizing: content-box; /* 2 */ 247 | 248 | -webkit-appearance: textfield; /* 1 */ 249 | } 250 | input[type="search"]::-webkit-search-cancel-button, 251 | input[type="search"]::-webkit-search-decoration { 252 | -webkit-appearance: none; 253 | } 254 | legend { 255 | padding: 0; /* 2 */ 256 | border: 0; /* 1 */ 257 | } 258 | textarea { 259 | overflow: auto; 260 | } 261 | table { 262 | border-spacing: 0; 263 | border-collapse: collapse; 264 | } 265 | td, 266 | th { 267 | padding: 0; 268 | } 269 | 270 | 271 | /* ========================================================================== 272 | Base styles: opinionated defaults 273 | ========================================================================== */ 274 | 275 | html { 276 | overflow-x: hidden; 277 | overflow-y: scroll; 278 | font-size: 62.5%; 279 | 280 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 281 | } 282 | body { 283 | overflow-x: hidden; 284 | color: color(var(--midgrey) l(-25%)); 285 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif; 286 | font-size: 1.5rem; 287 | line-height: 1.6em; 288 | font-weight: 400; 289 | font-style: normal; 290 | letter-spacing: 0; 291 | text-rendering: optimizeLegibility; 292 | background: #fff; 293 | 294 | -webkit-font-smoothing: antialiased; 295 | -moz-osx-font-smoothing: grayscale; 296 | -moz-font-feature-settings: "liga" on; 297 | } 298 | 299 | ::selection { 300 | text-shadow: none; 301 | background: color(var(--blue) lightness(+30%)); 302 | } 303 | 304 | hr { 305 | position: relative; 306 | display: block; 307 | width: 100%; 308 | margin: 2.5em 0 3.5em; 309 | padding: 0; 310 | height: 1px; 311 | border: 0; 312 | border-top: 1px solid color(var(--lightgrey) l(+10%)); 313 | } 314 | 315 | audio, 316 | canvas, 317 | iframe, 318 | img, 319 | svg, 320 | video { 321 | vertical-align: middle; 322 | } 323 | 324 | fieldset { 325 | margin: 0; 326 | padding: 0; 327 | border: 0; 328 | } 329 | 330 | textarea { 331 | resize: vertical; 332 | } 333 | 334 | p, 335 | ul, 336 | ol, 337 | dl, 338 | blockquote { 339 | margin: 0 0 1.5em 0; 340 | } 341 | 342 | ol, 343 | ul { 344 | padding-left: 1.3em; 345 | padding-right: 1.5em; 346 | } 347 | 348 | ol ol, 349 | ul ul, 350 | ul ol, 351 | ol ul { 352 | margin: 0.5em 0 1em; 353 | } 354 | 355 | ul { 356 | list-style: disc; 357 | } 358 | 359 | ol { 360 | list-style: decimal; 361 | } 362 | 363 | li { 364 | margin: 0.5em 0; 365 | padding-left: 0.3em; 366 | line-height: 1.6em; 367 | } 368 | 369 | dt { 370 | float: left; 371 | margin: 0 20px 0 0; 372 | width: 120px; 373 | color: var(--darkgrey); 374 | font-weight: 500; 375 | text-align: right; 376 | } 377 | 378 | dd { 379 | margin: 0 0 5px 0; 380 | text-align: left; 381 | } 382 | 383 | blockquote { 384 | margin: 1.5em 0; 385 | padding: 0 1.6em 0 1.6em; 386 | border-left: var(--whitegrey) 0.5em solid; 387 | } 388 | 389 | blockquote p { 390 | margin: 0.8em 0; 391 | font-size: 1.2em; 392 | font-weight: 300; 393 | } 394 | 395 | blockquote small { 396 | display: inline-block; 397 | margin: 0.8em 0 0.8em 1.5em; 398 | font-size: 0.9em; 399 | opacity: 0.8; 400 | } 401 | /* Quotation marks */ 402 | blockquote small:before { 403 | content: "\2014 \00A0"; 404 | } 405 | 406 | blockquote cite { 407 | font-weight: bold; 408 | } 409 | blockquote cite a { 410 | font-weight: normal; 411 | } 412 | 413 | a { 414 | color: color(var(--blue) l(-5%)); 415 | text-decoration: none; 416 | } 417 | 418 | a:hover { 419 | text-decoration: underline; 420 | } 421 | 422 | h1, 423 | h2, 424 | h3, 425 | h4, 426 | h5, 427 | h6 { 428 | margin-top: 0; 429 | line-height: 1.15; 430 | font-weight: 700; 431 | text-rendering: optimizeLegibility; 432 | } 433 | 434 | h1 { 435 | margin: 0 0 0.5em 0; 436 | font-size: 5rem; 437 | font-weight: 700; 438 | } 439 | @media (max-width: 500px) { 440 | h1 { 441 | font-size: 2.2rem; 442 | } 443 | } 444 | 445 | h2 { 446 | margin: 1.5em 0 0.5em 0; 447 | font-size: 2rem; 448 | } 449 | @media (max-width: 500px) { 450 | h2 { 451 | font-size: 1.8rem; 452 | } 453 | } 454 | 455 | h3 { 456 | margin: 1.5em 0 0.5em 0; 457 | font-size: 1.8rem; 458 | font-weight: 500; 459 | } 460 | @media (max-width: 500px) { 461 | h3 { 462 | font-size: 1.7rem; 463 | } 464 | } 465 | 466 | h4 { 467 | margin: 1.5em 0 0.5em 0; 468 | font-size: 1.6rem; 469 | font-weight: 500; 470 | } 471 | 472 | h5 { 473 | margin: 1.5em 0 0.5em 0; 474 | font-size: 1.4rem; 475 | font-weight: 500; 476 | } 477 | 478 | h6 { 479 | margin: 1.5em 0 0.5em 0; 480 | font-size: 1.4rem; 481 | font-weight: 500; 482 | } 483 | 484 | @media all and (-ms-high-contrast: none), (-ms-high-contrast:active) { 485 | p, ol, ul{ 486 | width: 100%; 487 | } 488 | blockquote { 489 | width: 100%; 490 | } 491 | } 492 | -------------------------------------------------------------------------------- /assets/css/screen.edited.css: -------------------------------------------------------------------------------- 1 | /* Table of Contents 2 | /* ------------------------------------------------------------ 3 | 4 | This is a development CSS file which is built to a minified 5 | production stylesheet in assets/built/screen.css 6 | 7 | 12. Pagination 8 | 9 | */ 10 | 11 | /* 12. Pagination - Tools to let you flick between pages 12 | /* ---------------------------------------------------------- */ 13 | 14 | /* The main wrapper for our pagination links */ 15 | .pagination { 16 | position: relative; 17 | width: 80%; 18 | max-width: 800px; 19 | margin: 4rem auto; 20 | font-family: "Open Sans", sans-serif; 21 | font-size: 1.3rem; 22 | color: #9EABB3; 23 | text-align: center; 24 | } 25 | 26 | .pagination a { 27 | color: #3eb0ef; 28 | transition: all 0.2s ease; 29 | } 30 | 31 | /* Push the previous/next links out to the left/right */ 32 | .older-posts, 33 | .newer-posts { 34 | position: absolute; 35 | display: inline-block; 36 | padding: 0 15px; 37 | border: #bfc8cd 1px solid; 38 | text-decoration: none; 39 | border-radius: 4px; 40 | transition: border 0.3s ease; 41 | } 42 | 43 | .older-posts { 44 | right: 0; 45 | } 46 | 47 | .page-number { 48 | display: inline-block; 49 | padding: 2px 0; 50 | min-width: 100px; 51 | } 52 | 53 | .newer-posts { 54 | left: 0; 55 | } 56 | 57 | .older-posts:hover, 58 | .newer-posts:hover { 59 | color: #3eb0ef; 60 | border-color: #98a0a4; 61 | } 62 | 63 | .extra-pagination { 64 | display: none; 65 | border-bottom: #EBF2F6 1px solid; 66 | } 67 | .extra-pagination:after { 68 | display: block; 69 | content: ""; 70 | width: 7px; 71 | height: 7px; 72 | border: #E7EEF2 1px solid; 73 | position: absolute; 74 | bottom: -5px; 75 | left: 50%; 76 | margin-left: -5px; 77 | background: #FFF; 78 | border-radius: 100%; 79 | box-shadow: #FFF 0 0 0 5px; 80 | } 81 | .extra-pagination .pagination { 82 | width: auto; 83 | } 84 | 85 | /* On page2+ make all the headers smaller */ 86 | .paged .main-header { 87 | max-height: 30vh; 88 | } 89 | 90 | /* On page2+ show extra pagination controls at the top of post list */ 91 | .paged .extra-pagination { 92 | display: block; 93 | } 94 | 95 | /* Every post, on every page, gets this style on its
tag */ 96 | .pagination { 97 | padding-top: 4rem; 98 | border-top: #bfc8cd 1px solid; 99 | word-wrap: break-word; 100 | } 101 | 102 | /* Add a little circle in the middle of the border-bottom on our .post 103 | just for the lolz and stylepoints. */ 104 | .pagination:before { 105 | display: block; 106 | content: ""; 107 | width: 7px; 108 | height: 7px; 109 | border: #bfc8cd 1px solid; 110 | position: absolute; 111 | top: -5px; 112 | left: 50%; 113 | margin-left: -5px; 114 | background: #f4f8fb; 115 | border-radius: 100%; 116 | box-shadow: #f4f8fb 0 0 0 5px; 117 | } 118 | 119 | .highlighter-rouge { 120 | overflow-x: auto; 121 | max-width: 100%; 122 | min-width: 100%; 123 | } 124 | 125 | figure.highlight, 126 | .highlight pre, 127 | .highlight code, 128 | .highlight table, 129 | .highlight tbody, 130 | .highlight tr, 131 | td.code { 132 | border: none; 133 | min-width: 100%; 134 | max-width: 100%; 135 | } 136 | 137 | .highlight table, 138 | .highlight td pre { 139 | padding: 0; 140 | margin: 0; 141 | } 142 | 143 | .highlight table td { 144 | border: none; 145 | margin: none; 146 | padding: none; 147 | } 148 | 149 | .highlight table td:first-child, 150 | .highlight table td:last-child { 151 | background: none; 152 | } 153 | -------------------------------------------------------------------------------- /assets/css/syntax.css: -------------------------------------------------------------------------------- 1 | @import "global.css"; 2 | .highlight pre { background: color(var(--darkgrey) l(-3%)); } 3 | .highlight .hll { background: color(var(--darkgrey) l(-3%)); } 4 | .highlight .c { color: #75715e } /* Comment */ 5 | .highlight .err { color: #960050; background-color: #1e0010 } /* Error */ 6 | .highlight .k { color: #66d9ef } /* Keyword */ 7 | .highlight .l { color: #ae81ff } /* Literal */ 8 | .highlight .n { color: #f8f8f2 } /* Name */ 9 | .highlight .o { color: #f92672 } /* Operator */ 10 | .highlight .p { color: #f8f8f2 } /* Punctuation */ 11 | .highlight .cm { color: #75715e } /* Comment.Multiline */ 12 | .highlight .cp { color: #75715e } /* Comment.Preproc */ 13 | .highlight .c1 { color: #75715e } /* Comment.Single */ 14 | .highlight .cs { color: #75715e } /* Comment.Special */ 15 | .highlight .ge { font-style: italic } /* Generic.Emph */ 16 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 17 | .highlight .kc { color: #66d9ef } /* Keyword.Constant */ 18 | .highlight .kd { color: #66d9ef } /* Keyword.Declaration */ 19 | .highlight .kn { color: #f92672 } /* Keyword.Namespace */ 20 | .highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ 21 | .highlight .kr { color: #66d9ef } /* Keyword.Reserved */ 22 | .highlight .kt { color: #66d9ef } /* Keyword.Type */ 23 | .highlight .ld { color: #e6db74 } /* Literal.Date */ 24 | .highlight .m { color: #ae81ff } /* Literal.Number */ 25 | .highlight .s { color: #e6db74 } /* Literal.String */ 26 | .highlight .na { color: #a6e22e } /* Name.Attribute */ 27 | .highlight .nb { color: #f8f8f2 } /* Name.Builtin */ 28 | .highlight .nc { color: #a6e22e } /* Name.Class */ 29 | .highlight .no { color: #66d9ef } /* Name.Constant */ 30 | .highlight .nd { color: #a6e22e } /* Name.Decorator */ 31 | .highlight .ni { color: #f8f8f2 } /* Name.Entity */ 32 | .highlight .ne { color: #a6e22e } /* Name.Exception */ 33 | .highlight .nf { color: #a6e22e } /* Name.Function */ 34 | .highlight .nl { color: #f8f8f2 } /* Name.Label */ 35 | .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ 36 | .highlight .nx { color: #a6e22e } /* Name.Other */ 37 | .highlight .py { color: #f8f8f2 } /* Name.Property */ 38 | .highlight .nt { color: #f92672 } /* Name.Tag */ 39 | .highlight .nv { color: #f8f8f2 } /* Name.Variable */ 40 | .highlight .ow { color: #f92672 } /* Operator.Word */ 41 | .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ 42 | .highlight .mf { color: #ae81ff } /* Literal.Number.Float */ 43 | .highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ 44 | .highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ 45 | .highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ 46 | .highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ 47 | .highlight .sc { color: #e6db74 } /* Literal.String.Char */ 48 | .highlight .sd { color: #e6db74 } /* Literal.String.Doc */ 49 | .highlight .s2 { color: #e6db74 } /* Literal.String.Double */ 50 | .highlight .se { color: #ae81ff } /* Literal.String.Escape */ 51 | .highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ 52 | .highlight .si { color: #e6db74 } /* Literal.String.Interpol */ 53 | .highlight .sx { color: #e6db74 } /* Literal.String.Other */ 54 | .highlight .sr { color: #e6db74 } /* Literal.String.Regex */ 55 | .highlight .s1 { color: #e6db74 } /* Literal.String.Single */ 56 | .highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ 57 | .highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ 58 | .highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ 59 | .highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ 60 | .highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ 61 | .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ 62 | 63 | .highlight .gh { } /* Generic Heading & Diff Header */ 64 | .highlight .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ 65 | .highlight .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ 66 | .highlight .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ 67 | -------------------------------------------------------------------------------- /assets/images/abraham.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/abraham.jpg -------------------------------------------------------------------------------- /assets/images/advanced.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/advanced.jpg -------------------------------------------------------------------------------- /assets/images/bear.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/bear.jpg -------------------------------------------------------------------------------- /assets/images/blog-cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/blog-cover.jpg -------------------------------------------------------------------------------- /assets/images/blog-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/blog-icon.png -------------------------------------------------------------------------------- /assets/images/bus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/bus.jpg -------------------------------------------------------------------------------- /assets/images/design.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/design.jpg -------------------------------------------------------------------------------- /assets/images/edgar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/edgar.gif -------------------------------------------------------------------------------- /assets/images/fables.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/fables.jpg -------------------------------------------------------------------------------- /assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/favicon.png -------------------------------------------------------------------------------- /assets/images/ghost-logo.svg: -------------------------------------------------------------------------------- 1 | Ghost Logo 2 | -------------------------------------------------------------------------------- /assets/images/ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/ghost.png -------------------------------------------------------------------------------- /assets/images/grapes.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/grapes.jpg -------------------------------------------------------------------------------- /assets/images/hannah-cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/hannah-cover.jpg -------------------------------------------------------------------------------- /assets/images/hannah.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/hannah.jpg -------------------------------------------------------------------------------- /assets/images/john.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/john.jpg -------------------------------------------------------------------------------- /assets/images/lewis.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/lewis.jpeg -------------------------------------------------------------------------------- /assets/images/locked.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/locked.jpg -------------------------------------------------------------------------------- /assets/images/martin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/martin.jpg -------------------------------------------------------------------------------- /assets/images/piano.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/piano.jpg -------------------------------------------------------------------------------- /assets/images/sky.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/sky.jpg -------------------------------------------------------------------------------- /assets/images/speeches.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/speeches.jpg -------------------------------------------------------------------------------- /assets/images/summit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/summit.jpg -------------------------------------------------------------------------------- /assets/images/tags.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/tags.jpg -------------------------------------------------------------------------------- /assets/images/team.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/team.jpg -------------------------------------------------------------------------------- /assets/images/water.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/water.jpg -------------------------------------------------------------------------------- /assets/images/waves.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/waves.jpg -------------------------------------------------------------------------------- /assets/images/welcome.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/welcome.jpg -------------------------------------------------------------------------------- /assets/images/writing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/images/writing.jpg -------------------------------------------------------------------------------- /assets/js/infinitescroll.js: -------------------------------------------------------------------------------- 1 | // Code snippet inspired by https://github.com/douglasrodrigues5/ghost-blog-infinite-scroll 2 | $(function ($) { 3 | var currentPage = 1; 4 | var pathname = window.location.pathname; 5 | var $document = $(document); 6 | var $result = $('.post-feed'); 7 | var buffer = 100; 8 | 9 | var ticking = false; 10 | var isLoading = false; 11 | 12 | var lastScrollY = window.scrollY; 13 | var lastWindowHeight = window.innerHeight; 14 | var lastDocumentHeight = $document.height(); 15 | 16 | // remove hash params from pathname 17 | pathname = pathname.replace(/#(.*)$/g, '').replace('/\//g', '/'); 18 | 19 | function onScroll() { 20 | lastScrollY = window.scrollY; 21 | requestTick(); 22 | } 23 | 24 | function onResize() { 25 | lastWindowHeight = window.innerHeight; 26 | lastDocumentHeight = $document.height(); 27 | requestTick(); 28 | } 29 | 30 | function requestTick() { 31 | if (!ticking) { 32 | requestAnimationFrame(infiniteScroll) 33 | } 34 | ticking = true; 35 | } 36 | 37 | function infiniteScroll () { 38 | // return if already loading 39 | if (isLoading) { 40 | return; 41 | } 42 | 43 | // return if not scroll to the bottom 44 | if (lastScrollY + lastWindowHeight <= lastDocumentHeight - buffer) { 45 | ticking = false; 46 | return; 47 | } 48 | 49 | // return if currentPage is the last page already 50 | if (currentPage === maxPages) { 51 | return; 52 | } 53 | 54 | isLoading = true; 55 | 56 | // next page 57 | currentPage++; 58 | 59 | // Load more 60 | var nextPage = pathname + 'page' + currentPage + '/'; 61 | 62 | $.get(nextPage, function (content) { 63 | $result.append($(content).find('.post').hide().fadeIn(100)); 64 | 65 | }).fail(function (xhr) { 66 | // 404 indicates we've run out of pages 67 | if (xhr.status === 404) { 68 | window.removeEventListener('scroll', onScroll, {passive: true}); 69 | window.removeEventListener('resize', onResize); 70 | } 71 | 72 | }).always(function () { 73 | lastDocumentHeight = $document.height(); 74 | isLoading = false; 75 | ticking = false; 76 | }); 77 | } 78 | 79 | window.addEventListener('scroll', onScroll, {passive: true}); 80 | window.addEventListener('resize', onResize); 81 | 82 | infiniteScroll(); 83 | }); 84 | -------------------------------------------------------------------------------- /assets/js/jquery.fitvids.js: -------------------------------------------------------------------------------- 1 | /*jshint browser:true */ 2 | /*! 3 | * FitVids 1.3 4 | * 5 | * 6 | * Copyright 2017, Chris Coyier + Dave Rupert + Ghost Foundation 7 | * This is an unofficial release, ported by John O'Nolan 8 | * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ 9 | * Released under the MIT license 10 | * 11 | */ 12 | 13 | ;(function( $ ){ 14 | 15 | 'use strict'; 16 | 17 | $.fn.fitVids = function( options ) { 18 | var settings = { 19 | customSelector: null, 20 | ignore: null 21 | }; 22 | 23 | if(!document.getElementById('fit-vids-style')) { 24 | // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js 25 | var head = document.head || document.getElementsByTagName('head')[0]; 26 | var css = '.fluid-width-video-container{flex-grow: 1;width:100%;}.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; 27 | var div = document.createElement("div"); 28 | div.innerHTML = '

x

'; 29 | head.appendChild(div.childNodes[1]); 30 | } 31 | 32 | if ( options ) { 33 | $.extend( settings, options ); 34 | } 35 | 36 | return this.each(function(){ 37 | var selectors = [ 38 | 'iframe[src*="player.vimeo.com"]', 39 | 'iframe[src*="youtube.com"]', 40 | 'iframe[src*="youtube-nocookie.com"]', 41 | 'iframe[src*="kickstarter.com"][src*="video.html"]', 42 | 'object', 43 | 'embed' 44 | ]; 45 | 46 | if (settings.customSelector) { 47 | selectors.push(settings.customSelector); 48 | } 49 | 50 | var ignoreList = '.fitvidsignore'; 51 | 52 | if(settings.ignore) { 53 | ignoreList = ignoreList + ', ' + settings.ignore; 54 | } 55 | 56 | var $allVideos = $(this).find(selectors.join(',')); 57 | $allVideos = $allVideos.not('object object'); // SwfObj conflict patch 58 | $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. 59 | 60 | $allVideos.each(function(){ 61 | var $this = $(this); 62 | if($this.parents(ignoreList).length > 0) { 63 | return; // Disable FitVids on this video. 64 | } 65 | if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } 66 | if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) 67 | { 68 | $this.attr('height', 9); 69 | $this.attr('width', 16); 70 | } 71 | var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), 72 | width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), 73 | aspectRatio = height / width; 74 | if(!$this.attr('name')){ 75 | var videoName = 'fitvid' + $.fn.fitVids._count; 76 | $this.attr('name', videoName); 77 | $.fn.fitVids._count++; 78 | } 79 | $this.wrap('
').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%'); 80 | $this.removeAttr('height').removeAttr('width'); 81 | }); 82 | }); 83 | }; 84 | 85 | // Internal counter for unique video names. 86 | $.fn.fitVids._count = 0; 87 | 88 | // Works with either jQuery or Zepto 89 | })( window.jQuery || window.Zepto ); 90 | -------------------------------------------------------------------------------- /assets/screenshot-desktop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/screenshot-desktop.jpg -------------------------------------------------------------------------------- /assets/screenshot-mobile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jekyllt/jasper2/09420fc417962f78d0e15c1b5cd6c6a8684ec747/assets/screenshot-mobile.jpg -------------------------------------------------------------------------------- /atom.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | 6 | 7 | {{ site.name | xml_escape }} - Articles 8 | {% if site.description %}{{ site.description | xml_escape }}{% endif %} 9 | 10 | {{ site.url }} 11 | {% for post in site.posts %} 12 | {% unless post.link %} 13 | 14 | {{ post.title | xml_escape }} 15 | {% if post.excerpt %} 16 | {{ post.excerpt | xml_escape }} 17 | {% else %} 18 | {{ post.content | xml_escape }} 19 | {% endif %} 20 | {{ post.date | date: "%a, %d %b %Y %H:%M:%S %z" }} 21 | 22 | {{ site.url }}{{ post.url }} 23 | {{ site.url }}{{ post.url }} 24 | 25 | {% endunless %} 26 | {% endfor %} 27 | 28 | 29 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | 3 | // gulp plugins and utils 4 | var gutil = require('gulp-util'); 5 | var livereload = require('gulp-livereload'); 6 | var postcss = require('gulp-postcss'); 7 | var sourcemaps = require('gulp-sourcemaps'); 8 | var zip = require('gulp-zip'); 9 | 10 | // postcss plugins 11 | var autoprefixer = require('autoprefixer'); 12 | var colorFunction = require('postcss-color-function'); 13 | var cssnano = require('cssnano'); 14 | var customProperties = require('postcss-custom-properties'); 15 | var easyimport = require('postcss-easy-import'); 16 | 17 | var swallowError = function swallowError(error) { 18 | gutil.log(error.toString()); 19 | gutil.beep(); 20 | this.emit('end'); 21 | }; 22 | 23 | var nodemonServerInit = function () { 24 | livereload.listen(1234); 25 | }; 26 | 27 | gulp.task('build', ['css'], function (/* cb */) { 28 | return nodemonServerInit(); 29 | }); 30 | 31 | gulp.task('css', function () { 32 | var processors = [ 33 | easyimport, 34 | customProperties, 35 | colorFunction(), 36 | autoprefixer({browsers: ['last 2 versions']}), 37 | cssnano() 38 | ]; 39 | 40 | return gulp.src('assets/css/*.css') 41 | .on('error', swallowError) 42 | .pipe(sourcemaps.init()) 43 | .pipe(postcss(processors)) 44 | .pipe(sourcemaps.write('.')) 45 | .pipe(gulp.dest('assets/built/')) 46 | .pipe(livereload()); 47 | }); 48 | 49 | gulp.task('watch', function () { 50 | gulp.watch('assets/css/**', ['css']); 51 | }); 52 | 53 | gulp.task('zip', ['css'], function() { 54 | var targetDir = 'dist/'; 55 | var themeName = require('./package.json').name; 56 | var filename = themeName + '.zip'; 57 | 58 | return gulp.src([ 59 | '**', 60 | '!node_modules', '!node_modules/**', 61 | '!dist', '!dist/**' 62 | ]) 63 | .pipe(zip(filename)) 64 | .pipe(gulp.dest(targetDir)); 65 | }); 66 | 67 | gulp.task('default', ['build'], function () { 68 | gulp.start('watch'); 69 | }); 70 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | current: home 4 | class: 'home-template' 5 | navigation: True 6 | --- 7 | 8 | 9 | 11 | 12 | 13 | 28 | 29 | 30 |
31 |
32 | 33 |
34 | 35 | {% include post-card.html %} 36 |
37 | 38 |
39 |
40 | -------------------------------------------------------------------------------- /jasper2.gemspec: -------------------------------------------------------------------------------- 1 | # ruby 2 | # coding: utf-8 3 | # frozen_string_literal: true 4 | 5 | Gem::Specification.new do |s| 6 | s.name = 'jasper2' 7 | s.version = '0.1.0' 8 | s.authors = ['Fábio Madeira', 'Contributors'] 9 | s.email = ['biomadeira@icloud.com'] 10 | s.homepage = 'https://github.com/jekyllt/jasper2' 11 | s.summary = "This is a full-featured port of Ghost's default theme Casper v2 for Jekyll" 12 | 13 | s.files = `git ls-files -z`.split("\x0").select do |f| 14 | f.match(%r{^(assets|about|_(includes|layouts|data|plugins|posts)/|(LICENSE|README)((\.(txt|md)|$)))}i) 15 | end 16 | 17 | s.platform = Gem::Platform::RUBY 18 | s.license = 'MIT' 19 | 20 | s.add_dependency 'jekyll', '> 3.9', '< 5.0' 21 | s.add_dependency 'jekyll-paginate', '~> 1.1' 22 | s.add_dependency 'jekyll-feed', '~> 0.15' 23 | s.add_development_dependency 'rake', '~> 13.0' 24 | s.add_development_dependency 'slugify', '~> 1.0' 25 | end 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "casper", 3 | "description": "The default personal blogging theme for Ghost. Beautiful, minimal and responsive.", 4 | "demo": "https://demo.ghost.io", 5 | "version": "2.1.9", 6 | "scripts": { 7 | "gulp": "gulp" 8 | }, 9 | "engines": { 10 | "ghost": ">=1.2.0" 11 | }, 12 | "license": "MIT", 13 | "screenshots": { 14 | "desktop": "assets/screenshot-desktop.jpg", 15 | "mobile": "assets/screenshot-mobile.jpg" 16 | }, 17 | "author": { 18 | "name": "Ghost Foundation", 19 | "email": "hello@ghost.org", 20 | "url": "https://ghost.org" 21 | }, 22 | "gpm": { 23 | "type": "theme", 24 | "categories": [ 25 | "Minimal", 26 | "Magazine" 27 | ] 28 | }, 29 | "keywords": [ 30 | "ghost", 31 | "theme" 32 | ], 33 | "repository": { 34 | "type": "git", 35 | "url": "https://github.com/TryGhost/Casper.git" 36 | }, 37 | "bugs": "https://github.com/TryGhost/Casper/issues", 38 | "contributors": "https://github.com/TryGhost/Casper/graphs/contributors", 39 | "devDependencies": { 40 | "autoprefixer": "6.3.6", 41 | "cssnano": "3.7.1", 42 | "gulp": "3.9.1", 43 | "gulp-livereload": "3.8.1", 44 | "gulp-postcss": "6.1.1", 45 | "gulp-sourcemaps": "1.6.0", 46 | "gulp-util": "3.0.7", 47 | "gulp-watch": "4.3.8", 48 | "gulp-zip": "4.0.0", 49 | "postcss-color-function": "2.0.1", 50 | "postcss-custom-properties": "5.0.1", 51 | "postcss-easy-import": "1.0.1" 52 | }, 53 | "config": { 54 | "posts_per_page": 25 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /script.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | Little script that replaces comment characters to html, 5 | found in the *.hbs files. 6 | """ 7 | 8 | import os 9 | import glob 10 | 11 | if __name__ == '__main__': 12 | 13 | os.chdir(os.path.join(os.environ['HOME'], 14 | "Downloads", "Casper-master")) 15 | for filename in glob.glob("*.hbs"): 16 | print(filename) 17 | 18 | # Read in the file 19 | with open(filename, 'r') as infile : 20 | filedata = infile.read() 21 | 22 | # Replace the target string 23 | # Replacing comments 24 | filedata = filedata.replace('{{!--', '') 26 | 27 | # Write the file out again 28 | with open(filename, 'w') as outfile: 29 | outfile.write(filedata) 30 | --------------------------------------------------------------------------------