├── .gitignore ├── _docs ├── _defaults.md ├── devices │ ├── ios.md │ └── android.md ├── media │ ├── video.md │ ├── documents.md │ └── images.md └── contact-syncing │ ├── facebook.md │ └── phone.md ├── siteicon.png ├── touch-icon.png ├── images ├── favicon.png ├── _screenshot.png ├── menu.svg └── emblem.svg ├── apple-touch-icon.png ├── 404.md ├── robots.txt ├── _posts ├── _defaults.md ├── 2016-01-12-media-support.md └── 2016-02-05-general-fixes-and-improvements.md ├── Gemfile ├── _plugins └── replace-regex.rb ├── _sass ├── _tables.scss ├── _mixins.scss ├── _code.scss ├── _pygments.scss ├── _typography.scss ├── _layout.scss └── _normalize.scss ├── changelog.html ├── css └── main.scss ├── search.html ├── LICENSE ├── index.md ├── _config.yml ├── Gemfile.lock ├── README.md ├── _layouts └── default.html └── scripts ├── search.js └── lunr.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | .sass-cache/ 3 | .jekyll-metadata -------------------------------------------------------------------------------- /_docs/_defaults.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 3 | category: 4 | order: 1 5 | --- 6 | -------------------------------------------------------------------------------- /siteicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Welding-Torch/tsec/HEAD/siteicon.png -------------------------------------------------------------------------------- /touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Welding-Torch/tsec/HEAD/touch-icon.png -------------------------------------------------------------------------------- /images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Welding-Torch/tsec/HEAD/images/favicon.png -------------------------------------------------------------------------------- /apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Welding-Torch/tsec/HEAD/apple-touch-icon.png -------------------------------------------------------------------------------- /images/_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Welding-Torch/tsec/HEAD/images/_screenshot.png -------------------------------------------------------------------------------- /404.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Not Found 3 | permalink: /404.html 4 | sitemap: false 5 | --- 6 | 7 | This page doesn't exist! 8 | -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | sitemap: false 4 | --- 5 | User-agent: * 6 | Sitemap: {{ site.url }}/sitemap.xml 7 | Disallow: /search/ -------------------------------------------------------------------------------- /_posts/_defaults.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 3 | type: major 4 | --- 5 | 6 | This release introduces 7 | 8 | **Features:** 9 | 10 | * 11 | 12 | **Fixes:** 13 | 14 | * 15 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'jekyll', '3.8.4' 4 | 5 | group :jekyll_plugins do 6 | gem 'jekyll-feed', '0.11.0' 7 | gem 'jekyll-seo-tag', '2.5.0' 8 | gem 'jekyll-sitemap', '1.2.0' 9 | end 10 | -------------------------------------------------------------------------------- /images/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /images/emblem.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_plugins/replace-regex.rb: -------------------------------------------------------------------------------- 1 | module Jekyll 2 | module RegexFilter 3 | def replace_regex(input, regex_string, replace_string) 4 | regex = Regexp.new regex_string 5 | input.gsub regex, replace_string 6 | end 7 | end 8 | end 9 | 10 | Liquid::Template.register_filter(Jekyll::RegexFilter) 11 | -------------------------------------------------------------------------------- /_sass/_tables.scss: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | margin-bottom: 1.75em; 4 | } 5 | 6 | tr { 7 | border-bottom: 1px solid #EEE; 8 | } 9 | 10 | tr:nth-child(even) { 11 | background: #fcfcfc; 12 | } 13 | 14 | td, th { 15 | padding: 8px; 16 | text-align: left; 17 | } 18 | 19 | th { 20 | padding-bottom: 4px; 21 | } 22 | -------------------------------------------------------------------------------- /_docs/devices/ios.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: iOS 3 | category: Devices 4 | order: 1 5 | --- 6 | 7 | Use ChatApp on most of your Apple devices. Only the latest versions are supported. 8 | 9 | To install ChatApp on your device: 10 | 11 | 1. Open the App Store 12 | 2. Search for ChatApp 13 | 3. Select **Install** 14 | 15 | ![](//placehold.it/800x600) 16 | -------------------------------------------------------------------------------- /_docs/devices/android.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Android 3 | category: Devices 4 | order: 2 5 | --- 6 | 7 | Use ChatApp on all of your Android devices. Every version is supported. 8 | 9 | To install ChatApp on your device: 10 | 11 | 1. Open the Google Play Store 12 | 2. Search for ChatApp 13 | 3. Select **Install** 14 | 15 | ![](//placehold.it/800x600) 16 | -------------------------------------------------------------------------------- /_posts/2016-01-12-media-support.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Media support 3 | type: major 4 | --- 5 | 6 | ChatApp introduces media support! Send images, videos and documents to your contacts. 7 | 8 | **Features:** 9 | 10 | * Image support 11 | * Video support 12 | * Document support 13 | 14 | **Fixes:** 15 | 16 | * Edge case contact syncing issue 17 | * All memory leaks obliterated 18 | -------------------------------------------------------------------------------- /_docs/media/video.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Video 3 | category: Media 4 | order: 2 5 | --- 6 | 7 | Share video to your friends! Send videos from your computer, phone, camera or YouTube. 8 | 9 | To share a video: 10 | 11 | 1. Open a message with someone 12 | 2. Select the **Send Media** button 13 | 3. Pick a video or paste a YouTube link 14 | 15 | > Videos can use up a lot of bandwidth so be aware of your mobile data. 16 | 17 | ![](//placehold.it/800x600) 18 | -------------------------------------------------------------------------------- /_posts/2016-02-05-general-fixes-and-improvements.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: General fixes and improvements 3 | type: minor 4 | --- 5 | 6 | This release fixes a few minor issues reported by users. We've also made a few quality of life improvements. 7 | 8 | **Features:** 9 | 10 | * Streamlined access to contact details 11 | * Better sort order for archived messages 12 | 13 | **Fixes:** 14 | 15 | * Input sometimes getting stuck 16 | * One more memory leak obliterated 17 | -------------------------------------------------------------------------------- /_docs/media/documents.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Documents 3 | category: Media 4 | order: 3 5 | --- 6 | 7 | Share documents with your friends! Send work or school projects from your computer or phone. 8 | 9 | To share a document: 10 | 11 | 1. Open a message with someone 12 | 2. Select the **Send Media** button 13 | 3. Pick a document 14 | 15 | > Changes made to documents after sending are not saved back, you'll have to get contacts to send you updated versions. 16 | 17 | ![](//placehold.it/800x600) 18 | -------------------------------------------------------------------------------- /_docs/contact-syncing/facebook.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Facebook 3 | category: Contact Syncing 4 | order: 1 5 | --- 6 | 7 | Sync your Facebook contacts with ChatApp. Any of your Facebook friends with ChatApp accounts are automatically added to your contact list! 8 | 9 | > Signing up with Facebook automatically starts syncing contacts. 10 | 11 | To sync your contacts: 12 | 13 | 1. Open your *User Settings* 14 | 2. Select the **Connect Facebook** button 15 | 3. Authorise ChatApp 16 | 17 | ![](//placehold.it/800x600) -------------------------------------------------------------------------------- /_docs/media/images.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Images 3 | category: Media 4 | order: 1 5 | --- 6 | 7 | Share images with your friends! Send photos and pictures from your computer, phone or camera. 8 | 9 | > Images are stored until you choose to remove them. 10 | 11 | To share an image: 12 | 13 | 1. Open a message with someone 14 | 2. Select the **Send Media** button 15 | 3. Pick an image 16 | 17 | ![](//placehold.it/800x600) 18 | 19 | Supported types: 20 | 21 | * JPEG 22 | * PNG 23 | * BMP 24 | * GIF 25 | 26 | Unsupported types: 27 | 28 | * SVG 29 | * WEBP 30 | -------------------------------------------------------------------------------- /_docs/contact-syncing/phone.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Phone 3 | category: Contact Syncing 4 | order: 2 5 | --- 6 | 7 | Sync your phone contacts with ChatApp. ChatApp saves your phone contacts and adds anyone with an email address to your contact list! 8 | 9 | > Syncing contacts with your phone restores any previously synced contacts. 10 | 11 | To sync your contacts: 12 | 13 | 1. Open your *User Settings* on your phone app 14 | 2. Select the **Sync Contacts** button 15 | 3. Authorise ChatApp permissions 16 | 4. Select some or all of your contacts 17 | 18 | ![](//placehold.it/800x600) 19 | -------------------------------------------------------------------------------- /_sass/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin flex-direction($values) { 2 | -webkit-flex-direction: $values; 3 | flex-direction: $values; 4 | } 5 | 6 | @mixin flex-flow($values) { 7 | -webkit-flex-flow: $values; 8 | flex-flow: $values; 9 | } 10 | 11 | @mixin align-items($values) { 12 | -webkit-align-items: $values; 13 | align-items: $values; 14 | } 15 | 16 | @mixin justify-content($values) { 17 | -webkit-justify-content: $values; 18 | justify-content: $values; 19 | } 20 | 21 | @mixin flex($values) { 22 | -webkit-flex: $values; 23 | flex: $values; 24 | } 25 | 26 | @mixin display-flex() { 27 | display: -webkit-flex; 28 | display: flex; 29 | } 30 | 31 | @mixin display-inline-flex() { 32 | display: -webkit-inline-flex; 33 | display: inline-flex; 34 | } 35 | -------------------------------------------------------------------------------- /changelog.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Change Log 3 | --- 4 | 5 |

Subscribe with RSS to keep up with the latest changes.

6 | 7 | 8 | 9 |
10 | {% for change in site.posts %} 11 |
12 |

{{ change.title }}

13 |

{{ change.date | date: "%B %d, %Y" }} {{ change.type }}

14 | 15 | {{ change.content }} 16 | 17 | 18 |
19 | {% endfor %} 20 |
21 | -------------------------------------------------------------------------------- /css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | sitemap: false 4 | --- 5 | 6 | $baseurl: "{{ site.baseurl }}"; 7 | $body-background-color: #2B2E31; 8 | 9 | $content-max-width: 800px; 10 | $content-color: #222; 11 | $content-background-color: #fff; 12 | 13 | $brand-colour: #3583d6; 14 | $brand-colour-light: mix($brand-colour, $content-background-color, 10%); 15 | 16 | $nav-header-background-color: $brand-colour; 17 | $nav-header-height: 60px; 18 | $nav-background-color: #f5f5f5; 19 | $nav-width: 300px; 20 | 21 | $space: 20px; 22 | 23 | $mobile-break: 700px; 24 | $full-width-break: $nav-width + ($space * 4) + $content-max-width; 25 | 26 | @import "mixins"; 27 | @import "normalize"; 28 | @import "pygments"; 29 | @import "typography"; 30 | @import "code"; 31 | @import "tables"; 32 | @import "layout"; 33 | -------------------------------------------------------------------------------- /_sass/_code.scss: -------------------------------------------------------------------------------- 1 | pre, code, tt { 2 | font-family: Inconsolata, Consolas, Courier, "Courier New", "Liberation Mono", monospace; 3 | font-size: 0.85em; 4 | white-space: pre-wrap; 5 | border-radius: 2px; 6 | line-height: 1.4; 7 | font-weight: 400; 8 | background-color: #404145; 9 | color: #FAFAFA; 10 | border-radius: 2px; 11 | } 12 | 13 | pre { 14 | box-sizing: border-box; 15 | margin: 0 0 1.75em 0; 16 | width: 100%; 17 | padding: 10px; 18 | font-size: 0.9em; 19 | white-space: pre; 20 | overflow: auto; 21 | border-radius: 3px; 22 | 23 | code, tt { 24 | font-size: inherit; 25 | white-space: pre-wrap; 26 | background: transparent; 27 | border: none; 28 | padding: 0 29 | } 30 | } 31 | 32 | blockquote > code, 33 | li > code, 34 | p > code { 35 | padding: 4px 6px; 36 | white-space: nowrap; 37 | } 38 | -------------------------------------------------------------------------------- /search.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: Search 3 | sitemap: false 4 | --- 5 | 6 |

Loading results

7 | 8 | 9 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 CloudCannon 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 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Welcome 3 | --- 4 | 5 | This is the **Edition** template from [CloudCannon](http://cloudcannon.com/). 6 | **Edition** is perfect for documenting your product, application or service. 7 | It's populated with example content to give you some ideas. 8 | 9 | ChatApp is a fictional chat application for sending messages and media to others. 10 | Teams and friend groups would use ChatApp to stay up to date if it existed. 11 | 12 | > [Sign up](http://example.com/signup) or learn more about ChatApp at [example.com](http://example.com/). 13 | 14 | ### Getting Started 15 | 16 | Getting a message sent is quick and easy with ChatApp: 17 | 18 | 1. Sign up for an account 19 | 2. Add your friends from their email addresses 20 | 3. Type a message or send a photo 21 | 22 | > Feel free to send us a message at [feedback@example.com](mailto:feedback@example.com) with your feedback. 23 | 24 | ### Features 25 | 26 | Explore more of ChatApp by reading about our features: 27 | 28 | #### Media 29 | 30 | Send images, videos and other media to people. Sources include your computer, phone and Facebook. 31 | 32 | #### Contact Syncing 33 | 34 | Sync your contact list with your phone and/or Facebook contacts. Never lose your contacts between devices again! 35 | 36 | #### Devices 37 | 38 | ChatApp is available everywhere. Find out how to set it up on your all your devices. 39 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # ---- 2 | # Site 3 | 4 | title: TSEC Geeks website 5 | url: "https://welding-torch/tsec.github.io" 6 | baseurl: 7 | google_analytics_key: 8 | show_full_navigation: true 9 | 10 | # Values for the jekyll-seo-tag gem (https://github.com/jekyll/jekyll-seo-tag) 11 | logo: /siteicon.png 12 | description: A website for TSEC Geeks 13 | author: 14 | name: 15 | email: 16 | twitter: # twitter username without the @ symbol 17 | social: 18 | name: TSEC Geeks social 19 | links: 20 | - https://github.com/Welding-Torch 21 | 22 | # ----- 23 | # Build 24 | 25 | timezone: IST 26 | 27 | permalink: pretty 28 | 29 | plugins: 30 | - jekyll-sitemap 31 | - jekyll-seo-tag 32 | - jekyll-feed 33 | 34 | exclude: 35 | - Gemfile 36 | - Gemfile.lock 37 | - README.md 38 | - LICENCE 39 | 40 | collections: 41 | docs: 42 | title: Documentation 43 | permalink: /:path/ 44 | output: true 45 | 46 | defaults: 47 | - 48 | scope: 49 | path: "" 50 | values: 51 | layout: default 52 | - 53 | scope: 54 | path: "" 55 | type: "docs" 56 | values: 57 | seo: 58 | type: Article 59 | _comments: 60 | category: Group navigation links with this field 61 | order: Used to sort links in the navigation 62 | _options: 63 | content: 64 | width: 800 65 | height: 2000 66 | - 67 | scope: 68 | path: "" 69 | type: "posts" 70 | values: 71 | _comments: 72 | type: Marks the impact of this release 73 | 74 | # ----------- 75 | # CloudCannon 76 | 77 | types: 78 | - minor 79 | - major 80 | 81 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | addressable (2.5.2) 5 | public_suffix (>= 2.0.2, < 4.0) 6 | colorator (1.1.0) 7 | concurrent-ruby (1.0.5) 8 | em-websocket (0.5.1) 9 | eventmachine (>= 0.12.9) 10 | http_parser.rb (~> 0.6.0) 11 | eventmachine (1.2.7) 12 | ffi (1.9.25) 13 | forwardable-extended (2.6.0) 14 | http_parser.rb (0.6.0) 15 | i18n (0.9.5) 16 | concurrent-ruby (~> 1.0) 17 | jekyll (3.8.4) 18 | addressable (~> 2.4) 19 | colorator (~> 1.0) 20 | em-websocket (~> 0.5) 21 | i18n (~> 0.7) 22 | jekyll-sass-converter (~> 1.0) 23 | jekyll-watch (~> 2.0) 24 | kramdown (~> 1.14) 25 | liquid (~> 4.0) 26 | mercenary (~> 0.3.3) 27 | pathutil (~> 0.9) 28 | rouge (>= 1.7, < 4) 29 | safe_yaml (~> 1.0) 30 | jekyll-feed (0.11.0) 31 | jekyll (~> 3.3) 32 | jekyll-sass-converter (1.5.2) 33 | sass (~> 3.4) 34 | jekyll-seo-tag (2.5.0) 35 | jekyll (~> 3.3) 36 | jekyll-sitemap (1.2.0) 37 | jekyll (~> 3.3) 38 | jekyll-watch (2.0.0) 39 | listen (~> 3.0) 40 | kramdown (1.17.0) 41 | liquid (4.0.0) 42 | listen (3.1.5) 43 | rb-fsevent (~> 0.9, >= 0.9.4) 44 | rb-inotify (~> 0.9, >= 0.9.7) 45 | ruby_dep (~> 1.2) 46 | mercenary (0.3.6) 47 | pathutil (0.16.1) 48 | forwardable-extended (~> 2.6) 49 | public_suffix (3.0.3) 50 | rb-fsevent (0.10.3) 51 | rb-inotify (0.9.10) 52 | ffi (>= 0.5.0, < 2) 53 | rouge (3.3.0) 54 | ruby_dep (1.5.0) 55 | safe_yaml (1.0.4) 56 | sass (3.6.0) 57 | sass-listen (~> 4.0.0) 58 | sass-listen (4.0.0) 59 | rb-fsevent (~> 0.9, >= 0.9.4) 60 | rb-inotify (~> 0.9, >= 0.9.7) 61 | 62 | PLATFORMS 63 | ruby 64 | 65 | DEPENDENCIES 66 | jekyll (= 3.8.4) 67 | jekyll-feed (= 0.11.0) 68 | jekyll-seo-tag (= 2.5.0) 69 | jekyll-sitemap (= 1.2.0) 70 | 71 | BUNDLED WITH 72 | 1.16.4 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Edition 2 | 3 | Product documentation template for Jekyll. Browse through a [live demo](https://long-pig.cloudvent.net/). 4 | Start documenting your product, application, service or website with this configurable theme. 5 | 6 | ![Edition template screenshot](images/_screenshot.png) 7 | 8 | Edition was made by [CloudCannon](http://cloudcannon.com/), the Cloud CMS for Jekyll. 9 | 10 | Find more templates, themes and step-by-step Jekyll tutorials at [CloudCannon Academy](https://learn.cloudcannon.com/). 11 | 12 | [![Deploy to CloudCannon](https://buttons.cloudcannon.com/deploy.svg)](https://app.cloudcannon.com/register#sites/connect/github/CloudCannon/edition-jekyll-template) 13 | 14 | ## Features 15 | 16 | * Two column layout 17 | * Full text search 18 | * Pre-styled components 19 | * Auto-generated navigation based on category 20 | * Optimised for editing in [CloudCannon](http://cloudcannon.com/) 21 | * Change log 22 | * RSS/Atom feed 23 | * SEO tags 24 | * Google Analytics 25 | 26 | ## Setup 27 | 28 | 1. Add your site and author details in `_config.yml`. 29 | 2. Get a workflow going to see your site's output (with [CloudCannon](https://app.cloudcannon.com/) or Jekyll locally). 30 | 31 | ## Develop 32 | 33 | Edition was built with [Jekyll](http://jekyllrb.com/) version 3.3.1, but should support newer versions as well. 34 | 35 | Install the dependencies with [Bundler](http://bundler.io/): 36 | 37 | ~~~bash 38 | $ bundle install 39 | ~~~ 40 | 41 | Run `jekyll` commands through Bundler to ensure you're using the right versions: 42 | 43 | ~~~bash 44 | $ bundle exec jekyll serve 45 | ~~~ 46 | 47 | ## Editing 48 | 49 | Edition is already optimised for adding, updating and removing documentation pages in CloudCannon. 50 | 51 | ### Documentation pages 52 | 53 | * Add, update or remove a documentation page in the *Documentation* collection. 54 | * Change the category of a documentation page to move it to another section in the navigation. 55 | * Documentation pages are organised in the navigation by category, with URLs based on the path inside the `_docs` folder. 56 | 57 | ### Change log 58 | 59 | * Add, update or remove change log entries from your posts. 60 | * Tag entries as minor or major in the front matter. 61 | 62 | ### Search 63 | 64 | * Add `excluded_in_search: true` to any documentation page's front matter to exclude that page in the search results. 65 | 66 | ### Navigation 67 | 68 | * Change `site.show_full_navigation` to control all or only the current navigation group being open. 69 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% seo %} 9 | {% feed_meta %} 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {% if jekyll.environment == 'production' and site.google_analytics_key != '' %} 18 | 23 | 24 | {% endif %} 25 | 26 | 27 | 28 |
29 |

30 | {{ site.title }} logo 31 | {{ site.title }} 32 | 33 |

34 | 35 |
36 | 37 | 38 |
39 | 40 | 70 |
71 | 72 |
73 | 77 |
78 | {{ content }} 79 |
80 |
81 | 82 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /scripts/search.js: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | (function () { 5 | function getQueryVariable(variable) { 6 | var query = window.location.search.substring(1), 7 | vars = query.split("&"); 8 | 9 | for (var i = 0; i < vars.length; i++) { 10 | var pair = vars[i].split("="); 11 | 12 | if (pair[0] === variable) { 13 | return decodeURIComponent(pair[1].replace(/\+/g, '%20')).trim(); 14 | } 15 | } 16 | } 17 | 18 | function getPreview(query, content, previewLength) { 19 | previewLength = previewLength || (content.length * 2); 20 | 21 | var parts = query.split(" "), 22 | match = content.toLowerCase().indexOf(query.toLowerCase()), 23 | matchLength = query.length, 24 | preview; 25 | 26 | // Find a relevant location in content 27 | for (var i = 0; i < parts.length; i++) { 28 | if (match >= 0) { 29 | break; 30 | } 31 | 32 | match = content.toLowerCase().indexOf(parts[i].toLowerCase()); 33 | matchLength = parts[i].length; 34 | } 35 | 36 | // Create preview 37 | if (match >= 0) { 38 | var start = match - (previewLength / 2), 39 | end = start > 0 ? match + matchLength + (previewLength / 2) : previewLength; 40 | 41 | preview = content.substring(start, end).trim(); 42 | 43 | if (start > 0) { 44 | preview = "..." + preview; 45 | } 46 | 47 | if (end < content.length) { 48 | preview = preview + "..."; 49 | } 50 | 51 | // Highlight query parts 52 | preview = preview.replace(new RegExp("(" + parts.join("|") + ")", "gi"), "$1"); 53 | } else { 54 | // Use start of content if no match found 55 | preview = content.substring(0, previewLength).trim() + (content.length > previewLength ? "..." : ""); 56 | } 57 | 58 | return preview; 59 | } 60 | 61 | function displaySearchResults(results, query) { 62 | var searchResultsEl = document.getElementById("search-results"), 63 | searchProcessEl = document.getElementById("search-process"); 64 | 65 | if (results.length) { 66 | var resultsHTML = ""; 67 | results.forEach(function (result) { 68 | var item = window.data[result.ref], 69 | contentPreview = getPreview(query, item.content, 170), 70 | titlePreview = getPreview(query, item.title); 71 | 72 | resultsHTML += "
  • " + titlePreview + "

    " + contentPreview + "

  • "; 73 | }); 74 | 75 | searchResultsEl.innerHTML = resultsHTML; 76 | searchProcessEl.innerText = "Showing"; 77 | } else { 78 | searchResultsEl.style.display = "none"; 79 | searchProcessEl.innerText = "No"; 80 | } 81 | } 82 | 83 | window.index = lunr(function () { 84 | this.field("id"); 85 | this.field("title", {boost: 10}); 86 | this.field("category"); 87 | this.field("url"); 88 | this.field("content"); 89 | }); 90 | 91 | var query = decodeURIComponent((getQueryVariable("q") || "").replace(/\+/g, "%20")), 92 | searchQueryContainerEl = document.getElementById("search-query-container"), 93 | searchQueryEl = document.getElementById("search-query"), 94 | searchInputEl = document.getElementById("search-input"); 95 | 96 | searchInputEl.value = query; 97 | searchQueryEl.innerText = query; 98 | searchQueryContainerEl.style.display = "inline"; 99 | 100 | for (var key in window.data) { 101 | window.index.add(window.data[key]); 102 | } 103 | 104 | displaySearchResults(window.index.search(query), query); // Hand the results off to be displayed 105 | })(); -------------------------------------------------------------------------------- /_sass/_pygments.scss: -------------------------------------------------------------------------------- 1 | .highlight { 2 | .hll { background-color: #ffffcc } 3 | .c { color: #87ceeb} /* Comment */ 4 | .err { color: #ffffff} /* Error */ 5 | .g { color: #ffffff} /* Generic */ 6 | .k { color: #f0e68c} /* Keyword */ 7 | .l { color: #ffffff} /* Literal */ 8 | .n { color: #ffffff} /* Name */ 9 | .o { color: #ffffff} /* Operator */ 10 | .x { color: #ffffff} /* Other */ 11 | .p { color: #ffffff} /* Punctuation */ 12 | .cm { color: #87ceeb} /* Comment.Multiline */ 13 | .cp { color: #cd5c5c} /* Comment.Preproc */ 14 | .c1 { color: #87ceeb} /* Comment.Single */ 15 | .cs { color: #87ceeb} /* Comment.Special */ 16 | .gd { color: #0000c0; font-weight: bold; background-color: #008080 } /* Generic.Deleted */ 17 | .ge { color: #c000c0; text-decoration: underline} /* Generic.Emph */ 18 | .gr { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Error */ 19 | .gh { color: #cd5c5c} /* Generic.Heading */ 20 | .gi { color: #ffffff; background-color: #0000c0 } /* Generic.Inserted */ 21 | span.go { color: #add8e6; font-weight: bold; background-color: #4d4d4d } /* Generic.Output, qualified with span to prevent applying this style to the Go language, see #1153. */ 22 | .gp { color: #ffffff} /* Generic.Prompt */ 23 | .gs { color: #ffffff} /* Generic.Strong */ 24 | .gu { color: #cd5c5c} /* Generic.Subheading */ 25 | .gt { color: #c0c0c0; font-weight: bold; background-color: #c00000 } /* Generic.Traceback */ 26 | .kc { color: #f0e68c} /* Keyword.Constant */ 27 | .kd { color: #f0e68c} /* Keyword.Declaration */ 28 | .kn { color: #f0e68c} /* Keyword.Namespace */ 29 | .kp { color: #f0e68c} /* Keyword.Pseudo */ 30 | .kr { color: #f0e68c} /* Keyword.Reserved */ 31 | .kt { color: #bdb76b} /* Keyword.Type */ 32 | .ld { color: #ffffff} /* Literal.Date */ 33 | .m { color: #EAB289} /* Literal.Number */ 34 | .s { color: #EAB289} /* Literal.String */ 35 | .na { color: #8CF0E8} /* Name.Attribute */ 36 | .nb { color: #ffffff} /* Name.Builtin */ 37 | .nc { color: #ffffff} /* Name.Class */ 38 | .no { color: #ffa0a0} /* Name.Constant */ 39 | .nd { color: #ffffff} /* Name.Decorator */ 40 | .ni { color: #ffdead} /* Name.Entity */ 41 | .ne { color: #ffffff} /* Name.Exception */ 42 | .nf { color: #ffffff} /* Name.Function */ 43 | .nl { color: #ffffff} /* Name.Label */ 44 | .nn { color: #ffffff} /* Name.Namespace */ 45 | .nx { color: #ffffff} /* Name.Other */ 46 | .py { color: #ffffff} /* Name.Property */ 47 | .nt { color: #f0e68c} /* Name.Tag */ 48 | .nv { color: #98fb98} /* Name.Variable */ 49 | .ow { color: #ffffff} /* Operator.Word */ 50 | .w { color: #ffffff} /* Text.Whitespace */ 51 | .mf { color: #ffffff} /* Literal.Number.Float */ 52 | .mh { color: #ffffff} /* Literal.Number.Hex */ 53 | .mi { color: #ffffff} /* Literal.Number.Integer */ 54 | .mo { color: #ffffff} /* Literal.Number.Oct */ 55 | .sb { color: #ffffff} /* Literal.String.Backtick */ 56 | .sc { color: #ffffff} /* Literal.String.Char */ 57 | .sd { color: #ffffff} /* Literal.String.Doc */ 58 | .s2 { color: #ffffff} /* Literal.String.Double */ 59 | .se { color: #ffffff} /* Literal.String.Escape */ 60 | .sh { color: #ffffff} /* Literal.String.Heredoc */ 61 | .si { color: #ffffff} /* Literal.String.Interpol */ 62 | .sx { color: #ffffff} /* Literal.String.Other */ 63 | .sr { color: #ffffff} /* Literal.String.Regex */ 64 | .s1 { color: #ffffff} /* Literal.String.Single */ 65 | .ss { color: #ffffff} /* Literal.String.Symbol */ 66 | .bp { color: #ffffff} /* Name.Builtin.Pseudo */ 67 | .vc { color: #98fb98} /* Name.Variable.Class */ 68 | .vg { color: #98fb98} /* Name.Variable.Global */ 69 | .vi { color: #98fb98} /* Name.Variable.Instance */ 70 | .il { color: #ffffff} /* Literal.Number.Integer.Long */ 71 | .bash .nv { 72 | -webkit-user-select: none; 73 | -moz-user-select: none; 74 | -ms-user-select: none; 75 | -o-user-select: none; 76 | user-select: none; 77 | } 78 | .language-bash & .nb { 79 | color: #99D4FF; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /_sass/_typography.scss: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | max-height: 100%; 4 | font-size: 10px; 5 | -webkit-tap-highlight-color: transparent; 6 | } 7 | 8 | body { 9 | height: 100%; 10 | max-height: 100%; 11 | font-family: "Merriweather", serif; 12 | letter-spacing: 0.01rem; 13 | font-size: 1.8em; 14 | line-height: 1.75em; 15 | color: #3A4145; 16 | font-weight: 400; 17 | -webkit-font-feature-settings: 'kern' 1; 18 | -moz-font-feature-settings: 'kern' 1; 19 | -o-font-feature-settings: 'kern' 1; 20 | text-rendering: geometricPrecision; 21 | } 22 | 23 | h1, 24 | h2, 25 | h3, 26 | h4, 27 | h5, 28 | h6, 29 | input, 30 | label, 31 | select, 32 | textarea, 33 | table { 34 | -webkit-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1; 35 | -moz-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1; 36 | -o-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1; 37 | font-family: "Open Sans", sans-serif; 38 | text-rendering: geometricPrecision; 39 | } 40 | 41 | h1, 42 | h2, 43 | h3, 44 | h4, 45 | h5, 46 | h6 { 47 | color: #2E2E2E; 48 | line-height: 1.15em; 49 | margin: 0 0 0.4em 0; 50 | font-weight: 600; 51 | } 52 | 53 | h1 { 54 | font-size: 5rem; 55 | letter-spacing: -2px; 56 | text-indent: -3px; 57 | } 58 | 59 | h2 { 60 | font-size: 3.6rem; 61 | letter-spacing: -1px; 62 | } 63 | 64 | h3 { 65 | font-size: 3rem; 66 | } 67 | 68 | h4 { 69 | font-size: 2.3rem; 70 | } 71 | 72 | h5 { 73 | font-size: 2rem; 74 | } 75 | 76 | h6 { 77 | font-size: 2rem; 78 | } 79 | 80 | a { 81 | color: #4A4A4A; 82 | transition: color 0.2s ease; 83 | } 84 | 85 | a:hover { 86 | color: #111; 87 | } 88 | 89 | p, 90 | ul, 91 | ol, 92 | dl, 93 | figure { 94 | -webkit-font-feature-settings: 'liga' 1, 'onum' 1, 'kern' 1; 95 | -moz-font-feature-settings: 'liga' 1, 'onum' 1, 'kern' 1; 96 | -o-font-feature-settings: 'liga' 1, 'onum' 1, 'kern' 1; 97 | margin: 0 0 1.75em 0; 98 | text-rendering: geometricPrecision; 99 | } 100 | 101 | ol, 102 | ul { 103 | padding-left: 3rem; 104 | } 105 | 106 | ol ol, 107 | ul ul, 108 | ul ol, 109 | ol ul { 110 | margin: 0 0 0.4em 0; 111 | padding-left: 2em; 112 | } 113 | 114 | dl dt { 115 | float: left; 116 | width: 180px; 117 | overflow: hidden; 118 | clear: left; 119 | text-align: right; 120 | text-overflow: ellipsis; 121 | white-space: nowrap; 122 | font-weight: 700; 123 | margin-bottom: 1em; 124 | } 125 | 126 | dl dd { 127 | margin-left: 200px; 128 | margin-bottom: 1em; 129 | } 130 | 131 | li { 132 | margin: 0.4em 0; 133 | } 134 | 135 | li li { 136 | margin: 0; 137 | } 138 | 139 | hr { 140 | display: block; 141 | height: 1px; 142 | border: 0; 143 | border-top: #eee 1px solid; 144 | margin: 3.2em 0; 145 | padding: 0; 146 | } 147 | 148 | mark { 149 | background-color: #fdffb6 150 | } 151 | 152 | kbd { 153 | display: inline-block; 154 | margin-bottom: 0.4em; 155 | padding: 1px 8px; 156 | border: #CCC 1px solid; 157 | color: #666; 158 | text-shadow: #FFF 0 1px 0; 159 | font-size: 0.9em; 160 | font-weight: 700; 161 | background: #F4F4F4; 162 | border-radius: 4px; 163 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 1px 0 0 #fff inset; 164 | } 165 | 166 | @media only screen and (max-width: 900px) { 167 | blockquote { 168 | margin-left: 0; 169 | } 170 | 171 | hr { 172 | margin: 2.4em 0; 173 | } 174 | 175 | ol, 176 | ul { 177 | padding-left: 2em; 178 | } 179 | 180 | h1 { 181 | font-size: 4.5rem; 182 | text-indent: -2px; 183 | } 184 | 185 | h2 { 186 | font-size: 3.6rem; 187 | } 188 | 189 | h3 { 190 | font-size: 3.1rem; 191 | } 192 | 193 | h4 { 194 | font-size: 2.5rem; 195 | } 196 | 197 | h5 { 198 | font-size: 2.2rem; 199 | } 200 | 201 | h6 { 202 | font-size: 1.8rem; 203 | } 204 | } 205 | 206 | @media only screen and (max-width: 500px) { 207 | hr { 208 | margin: 1.75em 0; 209 | } 210 | 211 | p, 212 | ul, 213 | ol, 214 | dl { 215 | font-size: 0.95em; 216 | margin: 0 0 2.5rem 0; 217 | } 218 | 219 | h1, 220 | h2, 221 | h3, 222 | h4, 223 | h5, 224 | h6 { 225 | margin: 0 0 0.3em 0; 226 | } 227 | 228 | h1 { 229 | font-size: 2.8rem; 230 | letter-spacing: -1px; 231 | } 232 | 233 | h2 { 234 | font-size: 2.4rem; 235 | letter-spacing: 0; 236 | } 237 | 238 | h3 { 239 | font-size: 2.1rem; 240 | } 241 | 242 | h4 { 243 | font-size: 1.9rem; 244 | } 245 | 246 | h5 { 247 | font-size: 1.8rem; 248 | } 249 | 250 | h6 { 251 | font-size: 1.8rem; 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /_sass/_layout.scss: -------------------------------------------------------------------------------- 1 | input::-ms-clear, 2 | input::-ms-reveal { 3 | display: none !important; 4 | } 5 | 6 | body { 7 | height: auto; 8 | overflow-x: hidden; 9 | background-color: $body-background-color; 10 | 11 | &.nav-open { 12 | overflow: hidden; 13 | 14 | nav, 15 | header > form { 16 | display: block; 17 | } 18 | 19 | header { 20 | bottom: 0; 21 | } 22 | } 23 | 24 | &::before { 25 | content: ""; 26 | background-color: $content-background-color; 27 | position: fixed; 28 | top: 0; 29 | right: 0; 30 | bottom: 0; 31 | left: 0; 32 | z-index: -1; 33 | } 34 | 35 | @media (min-width: $mobile-break) { 36 | padding: 0 0 0 $nav-width; 37 | 38 | &.nav-open { 39 | overflow: auto; 40 | } 41 | 42 | &::after, 43 | &::before { 44 | content: ""; 45 | position: fixed; 46 | top: 0; 47 | bottom: 0; 48 | z-index: -1; 49 | } 50 | 51 | &::after { 52 | left: 0; 53 | width: $nav-width; 54 | background-color: $nav-background-color; 55 | } 56 | 57 | #search-input, 58 | &::after { 59 | box-shadow: inset -10px 0 10px -10px rgba(0, 0, 0, 0.1); 60 | } 61 | 62 | &::before { 63 | left: $nav-width; 64 | right: 0; 65 | background-color: $content-background-color; 66 | } 67 | } 68 | } 69 | 70 | .main { 71 | margin-top: $space + $nav-header-height; 72 | 73 | @media (min-width: $mobile-break) { 74 | margin-top: 0; 75 | } 76 | } 77 | 78 | header { 79 | $emblem-size: 35px; 80 | $emblem-vertical-padding: ($nav-header-height - $emblem-size) / 2; 81 | $emblem-horizontal-padding: $space; 82 | 83 | position: absolute; 84 | top: 0; 85 | left: 0; 86 | right: 0; 87 | overflow-x: hidden; 88 | z-index: 1; 89 | background-color: $nav-background-color; 90 | 91 | ul { 92 | padding: 0; 93 | margin: 0; 94 | } 95 | 96 | h1 { 97 | padding: $emblem-vertical-padding $emblem-horizontal-padding; 98 | height: $nav-header-height; 99 | box-sizing: border-box; 100 | background-color: $brand-colour; 101 | color: #fff; 102 | margin: 0; 103 | font-size: 1.7rem; 104 | line-height: 0.8; 105 | letter-spacing: 0; 106 | font-weight: 600; 107 | text-indent: 0; 108 | @include display-flex(); 109 | @include flex-direction(row); 110 | @include align-items(center); 111 | border-bottom: 1px solid rgba(0, 0, 0, 0.075); 112 | 113 | img { 114 | height: $emblem-size; 115 | width: $emblem-size; 116 | margin-right: $space - 5; 117 | } 118 | } 119 | 120 | $nav-image: $baseurl + "/images/menu.svg"; 121 | .open-nav { 122 | background-image: url($nav-image); 123 | background-color: transparent; 124 | background-repeat: no-repeat; 125 | background-size: 100%; 126 | width: $emblem-size; 127 | height: $emblem-size; 128 | border: 0; 129 | position: absolute; 130 | top: $emblem-vertical-padding; 131 | right: $emblem-horizontal-padding; 132 | border-radius: 2px; 133 | 134 | &:focus { 135 | outline: none; 136 | background-color: rgba(0, 0, 0, 0.05); 137 | } 138 | 139 | &:hover { 140 | background-color: rgba(0, 0, 0, 0.1); 141 | } 142 | } 143 | 144 | @media (min-width: $mobile-break) { 145 | background-color: transparent; 146 | width: $nav-width; 147 | right: auto; 148 | bottom: auto; 149 | 150 | .open-nav { 151 | display: none; 152 | } 153 | 154 | h1 { 155 | box-shadow: inset -10px 0 10px -10px rgba(0, 0, 0, 0.1); 156 | } 157 | } 158 | } 159 | 160 | .content { 161 | position: relative; 162 | background-color: $content-background-color; 163 | color: $content-color; 164 | 165 | h3::before { 166 | content: ""; 167 | @extend hr; 168 | margin: 60px 0; 169 | } 170 | } 171 | 172 | .content, 173 | .page-header { 174 | max-width: $content-max-width; 175 | padding: 0 ($space + 5) $space; 176 | margin: $space auto 0 auto; 177 | } 178 | 179 | .page-header { 180 | h2, 181 | h3 { 182 | margin: 0; 183 | line-height: 1.2; 184 | letter-spacing: -1px; 185 | } 186 | 187 | h2 { 188 | font-size: 2rem; 189 | margin-left: -1px; 190 | color: #888; 191 | letter-spacing: 0; 192 | } 193 | 194 | h3 { 195 | font-size: 4rem; 196 | margin-left: -4px; 197 | } 198 | 199 | @media (min-width: $mobile-break) { 200 | h2 { 201 | font-size: 2.65rem; 202 | } 203 | 204 | h3 { 205 | font-size: 5.4rem; 206 | } 207 | } 208 | 209 | @media (min-width: $full-width-break) { 210 | margin-top: 55px; 211 | } 212 | } 213 | 214 | nav, 215 | header > form { 216 | display: none; 217 | 218 | @media (min-width: $mobile-break) { 219 | display: block; 220 | } 221 | } 222 | 223 | nav > ul { 224 | padding: $space / 2 0; 225 | 226 | & + ul { 227 | border-top: 1px solid rgba(0, 0, 0, 0.075); 228 | } 229 | } 230 | 231 | .nav-item { 232 | display: block; 233 | font-family: "Open Sans", sans-serif; 234 | line-height: 1; 235 | margin: 0; 236 | 237 | nav:not(.full-navigation) & > ul { 238 | display: none; 239 | } 240 | 241 | nav:not(.full-navigation) &.current > ul { 242 | display: block; 243 | } 244 | 245 | > a { 246 | color: #666; 247 | text-decoration: none; 248 | font-size: 1.4rem; 249 | padding: $space / 2 0 $space / 2 $space * 2; 250 | display: block; 251 | } 252 | 253 | &.current > a, 254 | > a:active, 255 | > a:hover { 256 | color: #111; 257 | } 258 | 259 | &.top-level > a { 260 | line-height: 1.5; 261 | font-weight: 600; 262 | padding-left: $space; 263 | } 264 | } 265 | 266 | .settings-panel-example { 267 | @extend p; 268 | @include display-flex(); 269 | @include flex-direction(column); 270 | 271 | .example { 272 | max-width: 300px; 273 | background-color: #fafafa; 274 | margin: 0; 275 | padding: 0; 276 | font-size: 0; 277 | line-height: 1; 278 | border-radius: 2px; 279 | overflow: hidden; 280 | } 281 | 282 | @media (min-width: 960px) { 283 | @include flex-direction(row); 284 | 285 | .details { 286 | @include flex(1); 287 | margin-right: 20px; 288 | } 289 | 290 | p + .highlight > pre { 291 | margin-bottom: 0; 292 | } 293 | 294 | .example { 295 | @include flex(0 0 300px); 296 | max-width: 100%; 297 | } 298 | } 299 | } 300 | 301 | .highlight { 302 | margin-left: 0; 303 | margin-right: 0; 304 | } 305 | 306 | h3 + .warning { 307 | margin-top: 1.75em; 308 | } 309 | 310 | 311 | h4 code { 312 | background: $nav-background-color; 313 | color: $content-color; 314 | background-color: transparent; 315 | font-weight: 700; 316 | padding: 0; 317 | font-size: 1.1em; 318 | line-height: 1; 319 | } 320 | 321 | h4 svg { 322 | vertical-align: middle; 323 | margin-right: 6px; 324 | position: relative; 325 | top: -2px; 326 | fill: #2E2E2E; 327 | height: 23px; 328 | } 329 | 330 | .required { 331 | position: relative; 332 | } 333 | 334 | .required::after { 335 | content: "REQUIRED"; 336 | font-size: 12px; 337 | position: absolute; 338 | top: 5px; 339 | line-height: 1; 340 | color: $brand-colour; 341 | padding-left: 5px; 342 | } 343 | 344 | #search-results { 345 | margin: 0; 346 | padding: 0; 347 | 348 | li { 349 | list-style: none; 350 | margin: 0; 351 | padding: 0; 352 | 353 | h4 { 354 | font-size: 2rem; 355 | } 356 | 357 | p { 358 | line-height: 1.5; 359 | } 360 | } 361 | } 362 | 363 | 364 | #search-input { 365 | -webkit-appearance: none; 366 | display: block; 367 | margin: 0; 368 | padding: 10px 20px 10px 15px; 369 | width: 100%; 370 | box-sizing: border-box; 371 | border: 0; 372 | border-bottom: 1px solid rgba(0, 0, 0, 0.075); 373 | border-left: 5px solid transparent; 374 | font-size: 1.5rem; 375 | font-weight: 600; 376 | line-height: 1.8; 377 | 378 | &:focus { 379 | outline: none; 380 | border-left-color: $brand-colour; 381 | } 382 | } 383 | 384 | .changelog { 385 | &, 386 | > div { 387 | margin: 0; 388 | padding: 0; 389 | list-style: none; 390 | } 391 | 392 | .date { 393 | color: #888; 394 | font-style: italic; 395 | } 396 | } 397 | 398 | .badge { 399 | font-family: "Open Sans", sans-serif; 400 | padding: 2px 5px; 401 | text-transform: uppercase; 402 | font-size: 0.8rem; 403 | border-radius: 2px; 404 | background: #eee; 405 | font-weight: bold; 406 | 407 | &.major { 408 | background: $brand-colour; 409 | color: #fff; 410 | } 411 | } 412 | 413 | blockquote { 414 | border-left: 5px solid #FD0; 415 | padding: 10px 15px; 416 | margin-left: -15px; 417 | margin-right: -10px; 418 | background-color: $brand-colour-light; 419 | border-color: $brand-colour; 420 | 421 | p:last-child { 422 | margin-bottom: 0; 423 | } 424 | 425 | @media (max-width: $full-width-break) { 426 | margin-left: 0; 427 | margin-right: 0; 428 | } 429 | } 430 | 431 | img { 432 | max-width: 100%; 433 | height: auto; 434 | } 435 | 436 | .editor-link { 437 | display: none; 438 | margin-top: 0; 439 | 440 | .btn { 441 | border: 0; 442 | border-radius: 2px; 443 | width: 100%; 444 | max-width: 500px; 445 | box-sizing: border-box; 446 | font-size: 2rem; 447 | text-decoration: none; 448 | padding: 10px 15px; 449 | margin: 0; 450 | font-size: 18px; 451 | cursor: pointer; 452 | background-color: #f7e064; 453 | color: #333; 454 | box-shadow: 1px 1px 5px 0 rgba(0, 0, 0, 0.2); 455 | 456 | &:hover { 457 | background-color: #f4d525; 458 | color: #333; 459 | } 460 | } 461 | 462 | } 463 | 464 | .cms-editor-active .editor-link { 465 | display: block; 466 | } 467 | -------------------------------------------------------------------------------- /_sass/_normalize.scss: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | font-size: 2em; 137 | margin: 0.67em 0; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | background: #ff0; 146 | color: #000; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | font-size: 75%; 164 | line-height: 0; 165 | position: relative; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | -moz-box-sizing: content-box; 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-appearance: textfield; /* 1 */ 359 | -moz-box-sizing: content-box; 360 | -webkit-box-sizing: content-box; /* 2 */ 361 | box-sizing: content-box; 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | border: 1px solid #c0c0c0; 381 | margin: 0 2px; 382 | padding: 0.35em 0.625em 0.75em; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; /* 2 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-collapse: collapse; 421 | border-spacing: 0; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } 428 | -------------------------------------------------------------------------------- /scripts/lunr.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.7.0 3 | * Copyright (C) 2016 Oliver Nightingale 4 | * MIT Licensed 5 | * @license 6 | */ 7 | !function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.7.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.tokenizer.load=function(t){var e=this.registeredFunctions[t];if(!e)throw new Error("Cannot load un-registered function: "+t);return e},t.tokenizer.label="default",t.tokenizer.registeredFunctions={"default":t.tokenizer},t.tokenizer.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing tokenizer: "+n),e.label=n,this.registeredFunctions[n]=e},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();rp;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n