diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000000..ad4e4fa2f1d
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,9 @@
+*
+
+!lib/
+!source/
+!.ruby-version
+!Gemfile
+!Gemfile.lock
+!config.rb
+
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000000..3069c432317
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+source/javascripts/lib/* linguist-vendored
diff --git a/.gitignore b/.gitignore
index f6fc8c00b25..1d5d08dd245 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,9 +14,14 @@ tmp
*.DS_STORE
build/
.cache
+.vagrant
+.sass-cache
# YARD artifacts
.yardoc
_yardoc
doc/
-.idea/
\ No newline at end of file
+.idea/
+
+# Vagrant artifacts
+ubuntu-*-console.log
diff --git a/.ruby-version b/.ruby-version
new file mode 100644
index 00000000000..fa7adc7ac72
--- /dev/null
+++ b/.ruby-version
@@ -0,0 +1 @@
+3.3.5
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 3280d947c9a..00000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-sudo: false
-
-language: ruby
-
-rvm:
- - 1.9.3
- - 2.0.0
-
-cache: bundler
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 59ee6a441e5..55dfc05a6cb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,245 @@
# Changelog
+## Version 2.10.0
+
+*April 13, 2021*
+
+* Add support for Ruby 3.0 (thanks @shaun-scale)
+* Add requirement for Git on installing dependencies
+* Bump nokogiri from 1.11.2 to 1.11.3
+* Bump middleman from 4.3.11 to [`d180ca3`](https://github.com/middleman/middleman/commit/d180ca337202873f2601310c74ba2b6b4cf063ec)
+
+## Version 2.9.2
+
+*March 30, 2021*
+
+* __[Security]__ Bump kramdown from 2.3.0 to 2.3.1
+* Bump nokogiri from 1.11.1 to 1.11.2
+
+## Version 2.9.1
+
+*February 27, 2021*
+
+* Fix Slate language tabs not working if localStorage is disabled
+
+## Version 2.9.0
+
+*January 19, 2021*
+
+* __Drop support for Ruby 2.3 and 2.4__
+* __[Security]__ Bump nokogiri from 1.10.10 to 1.11.1
+* __[Security]__ Bump redcarpet from 3.5.0 to 3.5.1
+* Specify slate is not supported on Ruby 3.x
+* Bump rouge from 3.24.0 to 3.26.0
+
+## Version 2.8.0
+
+*October 27, 2020*
+
+* Remove last trailing newline when using the copy code button
+* Rework docker image and make available at slatedocs/slate
+* Improve Dockerfile layout to improve caching (thanks @micvbang)
+* Bump rouge from 3.20 to 3.24
+* Bump nokogiri from 1.10.9 to 1.10.10
+* Bump middleman from 4.3.8 to 4.3.11
+* Bump lunr.js from 2.3.8 to 2.3.9
+
+## Version 2.7.1
+
+*August 13, 2020*
+
+* __[security]__ Bumped middleman from 4.3.7 to 4.3.8
+
+_Note_: Slate uses redcarpet, not kramdown, for rendering markdown to HTML, and so was unaffected by the security vulnerability in middleman.
+If you have changed slate to use kramdown, and with GFM, you may need to install the `kramdown-parser-gfm` gem.
+
+## Version 2.7.0
+
+*June 21, 2020*
+
+* __[security]__ Bumped rack in Gemfile.lock from 2.2.2 to 2.2.3
+* Bumped bundled jQuery from 3.2.1 to 3.5.1
+* Bumped bundled lunr from 0.5.7 to 2.3.8
+* Bumped imagesloaded from 3.1.8 to 4.1.4
+* Bumped rouge from 3.17.0 to 3.20.0
+* Bumped redcarpet from 3.4.0 to 3.5.0
+* Fix color of highlighted code being unreadable when printing page
+* Add clipboard icon for "Copy to Clipboard" functionality to code boxes (see note below)
+* Fix handling of ToC selectors that contain punctutation (thanks @gruis)
+* Fix language bar truncating languages that overflow screen width
+* Strip HTML tags from ToC title before displaying it in title bar in JS (backup to stripping done in Ruby code) (thanks @atic)
+
+To enable the new clipboard icon, you need to add `code_clipboard: true` to the frontmatter of source/index.html.md.
+See [this line](https://github.com/slatedocs/slate/blame/main/source/index.html.md#L19) for an example of usage.
+
+## Version 2.6.1
+
+*May 30, 2020*
+
+* __[security]__ update child dependency activesupport in Gemfile.lock to 5.4.2.3
+* Update Middleman in Gemfile.lock to 4.3.7
+* Replace Travis-CI with GitHub actions for continuous integration
+* Replace Spectrum with GitHub discussions
+
+## Version 2.6.0
+
+*May 18, 2020*
+
+__Note__: 2.5.0 was "pulled" due to a breaking bug discovered after release. It is recommended to skip it, and move straight to 2.6.0.
+
+* Fix large whitespace gap in middle column for sections with codeblocks
+* Fix highlighted code elements having a different background than rest of code block
+* Change JSON keys to have a different font color than their values
+* Disable asset hashing for woff and woff2 elements due to middleman bug breaking woff2 asset hashing in general
+* Move Dockerfile to Debian from Alpine
+* Converted repo to a [GitHub template](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)
+* Update sassc to 2.3.0 in Gemfile.lock
+
+## Version 2.5.0
+
+*May 8, 2020*
+
+* __[security]__ update nokogiri to ~> 1.10.8
+* Update links in example docs to https://github.com/slatedocs/slate from https://github.com/lord/slate
+* Update LICENSE to include full Apache 2.0 text
+* Test slate against Ruby 2.5 and 2.6 on Travis-CI
+* Update Vagrantfile to use Ubuntu 18.04 (thanks @bradthurber)
+* Parse arguments and flags for deploy.sh on script start, instead of potentially after building source files
+* Install nodejs inside Vagrantfile (thanks @fernandoaguilar)
+* Add Dockerfile for running slate (thanks @redhatxl)
+* update middleman-syntax and rouge to ~>3.2
+* update middleman to 4.3.6
+
+## Version 2.4.0
+
+*October 19, 2019*
+
+- Move repository from lord/slate to slatedocs/slate
+- Fix documentation to point at new repo link, thanks to [Arun](https://github.com/slash-arun), [Gustavo Gawryszewski](https://github.com/gawry), and [Daniel Korbit](https://github.com/danielkorbit)
+- Update `nokogiri` to 1.10.4
+- Update `ffi` in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
+- Update `rack` to 2.0.7 in `Gemfile.lock` to fix security warnings, thanks to [Grey Baker](https://github.com/greysteil) and [jakemack](https://github.com/jakemack)
+- Update middleman to `4.3` and relax constraints on middleman related gems, thanks to [jakemack](https://github.com/jakemack)
+- Add sass gem, thanks to [jakemack](https://github.com/jakemack)
+- Activate `asset_cache` in middleman to improve cacheability of static files, thanks to [Sam Gilman](https://github.com/thenengah)
+- Update to using bundler 2 for `Gemfile.lock`, thanks to [jakemack](https://github.com/jakemack)
+
+## Version 2.3.1
+
+*July 5, 2018*
+
+- Update `sprockets` in `Gemfile.lock` to fix security warnings
+
+## Version 2.3
+
+*July 5, 2018*
+
+- Allows strikethrough in markdown by default.
+- Upgrades jQuery to 3.2.1, thanks to [Tomi Takussaari](https://github.com/TomiTakussaari)
+- Fixes invalid HTML in `layout.erb`, thanks to [Eric Scouten](https://github.com/scouten) for pointing out
+- Hopefully fixes Vagrant memory issues, thanks to [Petter Blomberg](https://github.com/p-blomberg) for the suggestion
+- Cleans HTML in headers before setting `document.title`, thanks to [Dan Levy](https://github.com/justsml)
+- Allows trailing whitespace in markdown files, thanks to [Samuel Cousin](https://github.com/kuzyn)
+- Fixes pushState/replaceState problems with scrolling not changing the document hash, thanks to [Andrey Fedorov](https://github.com/anfedorov)
+- Removes some outdated examples, thanks [@al-tr](https://github.com/al-tr), [Jerome Dahdah](https://github.com/jdahdah), and [Ricardo Castro](https://github.com/mccricardo)
+- Fixes `nav-padding` bug, thanks [Jerome Dahdah](https://github.com/jdahdah)
+- Code style fixes thanks to [Sebastian Zaremba](https://github.com/vassyz)
+- Nokogiri version bump thanks to [Grey Baker](https://github.com/greysteil)
+- Fix to default `index.md` text thanks to [Nick Busey](https://github.com/NickBusey)
+
+Thanks to everyone who contributed to this release!
+
+## Version 2.2
+
+*January 19, 2018*
+
+- Fixes bugs with some non-roman languages not generating unique headers
+- Adds editorconfig, thanks to [Jay Thomas](https://github.com/jaythomas)
+- Adds optional `NestingUniqueHeadCounter`, thanks to [Vladimir Morozov](https://github.com/greenhost87)
+- Small fixes to typos and language, thx [Emir Ribić](https://github.com/ribice), [Gregor Martynus](https://github.com/gr2m), and [Martius](https://github.com/martiuslim)!
+- Adds links to Spectrum chat for questions in README and ISSUE_TEMPLATE
+
+## Version 2.1
+
+*October 30, 2017*
+
+- Right-to-left text stylesheet option, thanks to [Mohammad Hossein Rabiee](https://github.com/mhrabiee)
+- Fix for HTML5 history state bug, thanks to [Zach Toolson](https://github.com/ztoolson)
+- Small styling changes, typo fixes, small bug fixes from [Marian Friedmann](https://github.com/rnarian), [Ben Wilhelm](https://github.com/benwilhelm), [Fouad Matin](https://github.com/fouad), [Nicolas Bonduel](https://github.com/NicolasBonduel), [Christian Oliff](https://github.com/coliff)
+
+Thanks to everyone who submitted PRs for this version!
+
+## Version 2.0
+
+*July 17, 2017*
+
+- All-new statically generated table of contents
+ - Should be much faster loading and scrolling for large pages
+ - Smaller Javascript file sizes
+ - Avoids the problem with the last link in the ToC not ever highlighting if the section was shorter than the page
+ - Fixes control-click not opening in a new page
+ - Automatically updates the HTML title as you scroll
+- Updated design
+ - New default colors!
+ - New spacings and sizes!
+ - System-default typefaces, just like GitHub
+- Added search input delay on large corpuses to reduce lag
+- We even bumped the major version cause hey, why not?
+- Various small bug fixes
+
+Thanks to everyone who helped debug or wrote code for this version! It was a serious community effort, and I couldn't have done it alone.
+
+## Version 1.5
+
+*February 23, 2017*
+
+- Add [multiple tabs per programming language](https://github.com/lord/slate/wiki/Multiple-language-tabs-per-programming-language) feature
+- Upgrade Middleman to add Ruby 1.4.0 compatibility
+- Switch default code highlighting color scheme to better highlight JSON
+- Various small typo and bug fixes
+
+## Version 1.4
+
+*November 24, 2016*
+
+- Upgrade Middleman and Rouge gems, should hopefully solve a number of bugs
+- Update some links in README
+- Fix broken Vagrant startup script
+- Fix some problems with deploy.sh help message
+- Fix bug with language tabs not hiding properly if no error
+- Add `!default` to SASS variables
+- Fix bug with logo margin
+- Bump tested Ruby versions in .travis.yml
+
+## Version 1.3.3
+
+*June 11, 2016*
+
+Documentation and example changes.
+
+## Version 1.3.2
+
+*February 3, 2016*
+
+A small bugfix for slightly incorrect background colors on code samples in some cases.
+
+## Version 1.3.1
+
+*January 31, 2016*
+
+A small bugfix for incorrect whitespace in code blocks.
+
+## Version 1.3
+
+*January 27, 2016*
+
+We've upgraded Middleman and a number of other dependencies, which should fix quite a few bugs.
+
+Instead of `rake build` and `rake deploy`, you should now run `bundle exec middleman build --clean` to build your server, and `./deploy.sh` to deploy it to Github Pages.
+
## Version 1.2
-*June 20, 2014*
+*June 20, 2015*
**Fixes:**
@@ -21,7 +258,7 @@
## Version 1.1
-*July 27th, 2014*
+*July 27, 2014*
**Fixes:**
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000000..cc17fd98d59
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@lord.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index b04fc955ca5..00000000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Contributing to Slate
-
-Thanks for contributing to Slate! A couple of quick guidelines for submitting PRs:
-
-- Please point your pull requests at the `dev` branch, and keep your commit messages clear and informative.
-- Please make sure your contributions work in the most recent version of Chrome, Firefox, and IE.
-- If you're implementing a new feature, even if it's relatively small, it's nice to open an issue before you start so that others know what you're working on and can help make sure you're on the right track.
-
-Thanks again! Happy coding.
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 8183c7a8b04..f9940a5f840 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,12 +1,37 @@
-FROM ubuntu:trusty
-
-RUN apt-get update
-RUN apt-get install -yq ruby ruby-dev build-essential git
-RUN gem install --no-ri --no-rdoc bundler
-ADD Gemfile /app/Gemfile
-ADD Gemfile.lock /app/Gemfile.lock
-RUN cd /app; bundle install
-ADD . /app
-EXPOSE 4567
-WORKDIR /app
-CMD ["bundle", "exec", "middleman", "server"]
+FROM 471112705198.dkr.ecr.us-east-1.amazonaws.com/zappi/base/ruby:3.3.5-3 AS builder
+
+# ARGs & ENVs
+ENV BUNDLE_PATH="/srv/bundle"
+ARG CODE_PATH="/srv/code"
+
+WORKDIR ${CODE_PATH}
+
+# Cache, install & clean ruby gem dependencies
+COPY Gemfile Gemfile.lock ./
+RUN mkdir -p ${BUNDLE_PATH} && \
+ export BUNDLER_VERSION=$(cat Gemfile.lock | tail -1 | tr -d "[:space:]") && \
+ gem install bundler -v "${BUNDLER_VERSION}" && \
+ bundle config set frozen 'true' && \
+ bundle config set without "test development" && \
+ bundle install --jobs 8 --retry 3 && \
+ rm -rf ${BUNDLE_PATH}/{cache,ruby/*/cache}
+
+# Copy the rest of the app
+ADD . ${CODE_PATH}
+
+# Generate static files from raw docs
+RUN bundle exec middleman build
+
+FROM 471112705198.dkr.ecr.us-east-1.amazonaws.com/docker-hub/zappi/nginx:1.27.4
+
+# ARGs & ENVs
+ARG CODE_PATH="/srv/code"
+
+WORKDIR ${CODE_PATH}
+
+# Copy files from builder
+COPY --from=builder --chown=nginx:nginx ${CODE_PATH}/build/ ${CODE_PATH}/build/
+USER nginx:nginx
+
+ARG GIT_RELEASE
+ENV GIT_RELEASE="${GIT_RELEASE:-unset}"
diff --git a/Gemfile b/Gemfile
index 3a2a2e01a82..509ce5ee87f 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,12 +1,13 @@
+ruby '>= 2.5'
source 'https://rubygems.org'
# Middleman
-gem 'middleman', '~>3.3.10'
-gem 'middleman-gh-pages', '~> 0.0.3'
-gem 'middleman-syntax', '~> 2.0.0'
-gem 'middleman-autoprefixer', '~> 2.4.4'
-gem 'rouge', '~> 1.9.0'
-gem 'redcarpet', '~> 3.3.1'
-
-gem 'rake', '~> 10.4.2'
-gem 'therubyracer', '~> 0.12.1', platforms: :ruby
+gem 'middleman', '~> 4.4'
+gem 'middleman-syntax', '~> 3.2'
+gem 'middleman-autoprefixer', '~> 2.7'
+gem 'middleman-sprockets', '~> 4.1'
+gem 'rouge', '~> 3.21'
+gem 'redcarpet', '~> 3.5.0'
+gem 'nokogiri'
+gem 'sass'
+gem 'webrick'
diff --git a/Gemfile.lock b/Gemfile.lock
index f9978492816..4b79c0b578c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,140 +1,148 @@
GEM
remote: https://rubygems.org/
specs:
- activesupport (4.1.11)
- i18n (~> 0.6, >= 0.6.9)
- json (~> 1.7, >= 1.7.7)
- minitest (~> 5.1)
- thread_safe (~> 0.1)
- tzinfo (~> 1.1)
- autoprefixer-rails (5.2.0.1)
+ activesupport (6.1.4.1)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 1.6, < 2)
+ minitest (>= 5.1)
+ tzinfo (~> 2.0)
+ zeitwerk (~> 2.3)
+ addressable (2.8.0)
+ public_suffix (>= 2.0.2, < 5.0)
+ autoprefixer-rails (9.5.1.1)
execjs
- json
- celluloid (0.16.0)
- timers (~> 4.0.0)
- chunky_png (1.3.4)
+ backports (3.21.0)
coffee-script (2.4.1)
coffee-script-source
execjs
- coffee-script-source (1.9.1.1)
- compass (1.0.3)
- chunky_png (~> 1.2)
- compass-core (~> 1.0.2)
- compass-import-once (~> 1.0.5)
- rb-fsevent (>= 0.9.3)
- rb-inotify (>= 0.9)
- sass (>= 3.3.13, < 3.5)
- compass-core (1.0.3)
- multi_json (~> 1.0)
- sass (>= 3.3.0, < 3.5)
- compass-import-once (1.0.5)
- sass (>= 3.2, < 3.5)
+ coffee-script-source (1.12.2)
+ concurrent-ruby (1.1.8)
+ contracts (0.13.0)
+ dotenv (2.7.6)
erubis (2.7.0)
- execjs (2.5.2)
- ffi (1.9.8)
- haml (4.0.6)
+ execjs (2.7.0)
+ fast_blank (1.0.1)
+ fastimage (2.2.5)
+ ffi (1.15.0)
+ haml (5.2.2)
+ temple (>= 0.8.0)
tilt
- hike (1.2.3)
- hitimes (1.2.2)
- hooks (0.4.0)
- uber (~> 0.0.4)
- i18n (0.7.0)
- json (1.8.3)
- kramdown (1.7.0)
- libv8 (3.16.14.7)
- listen (2.10.1)
- celluloid (~> 0.16.0)
- rb-fsevent (>= 0.9.3)
- rb-inotify (>= 0.9)
- middleman (3.3.12)
+ hamster (3.0.0)
+ concurrent-ruby (~> 1.0)
+ hashie (3.6.0)
+ i18n (1.6.0)
+ concurrent-ruby (~> 1.0)
+ kramdown (2.3.1)
+ rexml
+ listen (3.0.8)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ memoist (0.16.2)
+ middleman (4.4.0)
coffee-script (~> 2.2)
- compass (>= 1.0.0, < 2.0.0)
- compass-import-once (= 1.0.5)
- execjs (~> 2.0)
haml (>= 4.0.5)
- kramdown (~> 1.2)
- middleman-core (= 3.3.12)
- middleman-sprockets (>= 3.1.2)
- sass (>= 3.4.0, < 4.0)
- uglifier (~> 2.5)
- middleman-autoprefixer (2.4.4)
- autoprefixer-rails (~> 5.2.0)
+ kramdown (>= 2.3.0)
+ middleman-cli (= 4.4.0)
+ middleman-core (= 4.4.0)
+ middleman-autoprefixer (2.10.1)
+ autoprefixer-rails (~> 9.1)
middleman-core (>= 3.3.3)
- middleman-core (3.3.12)
- activesupport (~> 4.1.0)
- bundler (~> 1.1)
+ middleman-cli (4.4.0)
+ thor (>= 0.17.0, < 2.0)
+ middleman-core (4.4.0)
+ activesupport (>= 6.1, < 7.0)
+ addressable (~> 2.4)
+ backports (~> 3.6)
+ bundler (~> 2.0)
+ contracts (~> 0.13.0)
+ dotenv
erubis
- hooks (~> 0.3)
- i18n (~> 0.7.0)
- listen (>= 2.7.9, < 3.0)
- padrino-helpers (~> 0.12.3)
- rack (>= 1.4.5, < 2.0)
- rack-test (~> 0.6.2)
- thor (>= 0.15.2, < 2.0)
- tilt (~> 1.4.1, < 2.0)
- middleman-gh-pages (0.0.3)
- rake (> 0.9.3)
- middleman-sprockets (3.4.2)
- middleman-core (>= 3.3)
- sprockets (~> 2.12.1)
- sprockets-helpers (~> 1.1.0)
- sprockets-sass (~> 1.3.0)
- middleman-syntax (2.0.0)
- middleman-core (~> 3.2)
- rouge (~> 1.0)
- minitest (5.7.0)
- multi_json (1.11.1)
- padrino-helpers (0.12.5)
- i18n (~> 0.6, >= 0.6.7)
- padrino-support (= 0.12.5)
- tilt (~> 1.4.1)
- padrino-support (0.12.5)
- activesupport (>= 3.1)
- rack (1.6.4)
- rack-test (0.6.3)
- rack (>= 1.0)
- rake (10.4.2)
- rb-fsevent (0.9.5)
- rb-inotify (0.9.5)
- ffi (>= 0.5.0)
- redcarpet (3.3.1)
- ref (1.0.5)
- rouge (1.9.0)
- sass (3.4.14)
- sprockets (2.12.3)
- hike (~> 1.2)
- multi_json (~> 1.0)
- rack (~> 1.0)
- tilt (~> 1.1, != 1.3.0)
- sprockets-helpers (1.1.0)
- sprockets (~> 2.0)
- sprockets-sass (1.3.1)
- sprockets (~> 2.0)
- tilt (~> 1.1)
- therubyracer (0.12.2)
- libv8 (~> 3.16.14.0)
- ref
- thor (0.19.1)
- thread_safe (0.3.5)
- tilt (1.4.1)
- timers (4.0.1)
- hitimes
- tzinfo (1.2.2)
- thread_safe (~> 0.1)
- uber (0.0.13)
- uglifier (2.7.1)
- execjs (>= 0.3.0)
- json (>= 1.8.0)
+ execjs (~> 2.0)
+ fast_blank
+ fastimage (~> 2.0)
+ hamster (~> 3.0)
+ hashie (~> 3.4)
+ i18n (~> 1.6.0)
+ listen (~> 3.0.0)
+ memoist (~> 0.14)
+ padrino-helpers (~> 0.15.0)
+ parallel
+ rack (>= 1.4.5, < 3)
+ sassc (~> 2.0)
+ servolux
+ tilt (~> 2.0.9)
+ toml
+ uglifier (~> 3.0)
+ webrick
+ middleman-sprockets (4.1.1)
+ middleman-core (~> 4.0)
+ sprockets (>= 3.0)
+ middleman-syntax (3.2.0)
+ middleman-core (>= 3.2)
+ rouge (~> 3.2)
+ mini_portile2 (2.8.7)
+ minitest (5.14.4)
+ nokogiri (1.16.7)
+ mini_portile2 (~> 2.8.2)
+ racc (~> 1.4)
+ nokogiri (1.16.7-aarch64-linux)
+ racc (~> 1.4)
+ padrino-helpers (0.15.1)
+ i18n (>= 0.6.7, < 2)
+ padrino-support (= 0.15.1)
+ tilt (>= 1.4.1, < 3)
+ padrino-support (0.15.1)
+ parallel (1.21.0)
+ parslet (2.0.0)
+ public_suffix (4.0.6)
+ racc (1.8.1)
+ rack (2.2.10)
+ rb-fsevent (0.10.4)
+ rb-inotify (0.10.1)
+ ffi (~> 1.0)
+ redcarpet (3.5.1)
+ rexml (3.2.5)
+ rouge (3.26.0)
+ sass (3.7.4)
+ sass-listen (~> 4.0.0)
+ sass-listen (4.0.0)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ sassc (2.4.0)
+ ffi (~> 1.9)
+ servolux (0.13.0)
+ sprockets (3.7.2)
+ concurrent-ruby (~> 1.0)
+ rack (> 1, < 3)
+ temple (0.8.2)
+ thor (1.1.0)
+ tilt (2.0.10)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ tzinfo (2.0.4)
+ concurrent-ruby (~> 1.0)
+ uglifier (3.2.0)
+ execjs (>= 0.3.0, < 3)
+ webrick (1.7.0)
+ zeitwerk (2.4.2)
PLATFORMS
+ aarch64-linux
ruby
DEPENDENCIES
- middleman (~> 3.3.10)
- middleman-autoprefixer (~> 2.4.4)
- middleman-gh-pages (~> 0.0.3)
- middleman-syntax (~> 2.0.0)
- rake (~> 10.4.2)
- redcarpet (~> 3.3.1)
- rouge (~> 1.9.0)
- therubyracer (~> 0.12.1)
+ middleman (~> 4.4)
+ middleman-autoprefixer (~> 2.7)
+ middleman-sprockets (~> 4.1)
+ middleman-syntax (~> 3.2)
+ nokogiri
+ redcarpet (~> 3.5.0)
+ rouge (~> 3.21)
+ sass
+ webrick
+
+RUBY VERSION
+ ruby 3.3.5p137
+
+BUNDLED WITH
+ 2.2.15
diff --git a/LICENSE b/LICENSE
index 5ceddf59f68..261eeb9e9f8 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,13 +1,201 @@
-Copyright 2008-2013 Concur Technologies, Inc.
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
-Licensed under the Apache License, Version 2.0 (the "License"); you may
-not use this file except in compliance with the License. You may obtain
-a copy of the License at
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- http://www.apache.org/licenses/LICENSE-2.0
+ 1. Definitions.
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-License for the specific language governing permissions and limitations
-under the License.
\ No newline at end of file
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
index efb7e1eb8cd..2744e63b7a8 100644
--- a/README.md
+++ b/README.md
@@ -1,122 +1,81 @@
-Slate
-========
+
Features
------------
-* **Clean, intuitive design** — with Slate, the description of your API is on the left side of your documentation, and all the code examples are on the right side. Inspired by [Stripe's](https://stripe.com/docs/api) and [Paypal's](https://developer.paypal.com/webapps/developer/docs/api/) API docs. Slate is responsive, so it looks great on tablets, phones, and even print.
+* **Clean, intuitive design** — With Slate, the description of your API is on the left side of your documentation, and all the code examples are on the right side. Inspired by [Stripe's](https://stripe.com/docs/api) and [PayPal's](https://developer.paypal.com/webapps/developer/docs/api/) API docs. Slate is responsive, so it looks great on tablets, phones, and even in print.
-* **Everything on a single page** — gone are the days where your users had to search through a million pages to find what they wanted. Slate puts the entire documentation on a single page. We haven't sacrificed linkability, though. As you scroll, your browser's hash will update to the nearest header, so linking to a particular point in the documentation is still natural and easy.
+* **Everything on a single page** — Gone are the days when your users had to search through a million pages to find what they wanted. Slate puts the entire documentation on a single page. We haven't sacrificed linkability, though. As you scroll, your browser's hash will update to the nearest header, so linking to a particular point in the documentation is still natural and easy.
-* **Slate is just Markdown** — when you write docs with Slate, you're just writing Markdown, which makes it simple to edit and understand. Everything is written in Markdown — even the code samples are just Markdown code blocks!
+* **Slate is just Markdown** — When you write docs with Slate, you're just writing Markdown, which makes it simple to edit and understand. Everything is written in Markdown — even the code samples are just Markdown code blocks.
-* **Write code samples in multiple languages** — if your API has bindings in multiple programming languages, you easily put in tabs to switch between them. In your document, you'll distinguish different languages by specifying the language name at the top of each code block, just like with Github Flavored Markdown!
+* **Write code samples in multiple languages** — If your API has bindings in multiple programming languages, you can easily put in tabs to switch between them. In your document, you'll distinguish different languages by specifying the language name at the top of each code block, just like with GitHub Flavored Markdown.
-* **Out-of-the-box syntax highlighting** for [almost 60 languages](http://rouge.jayferd.us/demo), no configuration required.
+* **Out-of-the-box syntax highlighting** for [over 100 languages](https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers), no configuration required.
* **Automatic, smoothly scrolling table of contents** on the far left of the page. As you scroll, it displays your current position in the document. It's fast, too. We're using Slate at TripIt to build documentation for our new API, where our table of contents has over 180 entries. We've made sure that the performance remains excellent, even for larger documents.
-* **Let your users update your documentation for you** — by default, your Slate-generated documentation is hosted in a public Github repository. Not only does this mean you get free hosting for your docs with Github Pages, but it also makes it's simple for other developers to make pull requests to your docs if they find typos or other problems. Of course, if you don't want to, you're welcome to not use Github and host your docs elsewhere!
+* **Let your users update your documentation for you** — By default, your Slate-generated documentation is hosted in a public GitHub repository. Not only does this mean you get free hosting for your docs with GitHub Pages, but it also makes it simple for other developers to make pull requests to your docs if they find typos or other problems. Of course, if you don't want to use GitHub, you're also welcome to host your docs elsewhere.
-Getting starting with Slate is super easy! Simply fork this repository, and then follow the instructions below. Or, if you'd like to check out what Slate is capable of, take a look at the [sample docs](http://tripit.github.io/slate).
+* **RTL Support** Full right-to-left layout for RTL languages such as Arabic, Persian (Farsi), Hebrew etc.
-
+Getting started with Slate is super easy! Simply press the green "use this template" button above and follow the instructions below. Or, if you'd like to check out what Slate is capable of, take a look at the [sample docs](https://slatedocs.github.io/slate/).
Getting Started with Slate
------------------------------
-### Prerequisites
-
-You're going to need:
-
- - **Linux or OS X** — Windows may work, but is unsupported.
- - **Ruby, version 1.9.3 or newer**
- - **Bundler** — If Ruby is already installed, but the `bundle` command doesn't work, just run `gem install bundler` in a terminal.
-
-### Getting Set Up
-
- 1. Fork this repository on Github.
- 2. Clone *your forked repository* (not our original one) to your hard drive with `git clone https://github.com/YOURUSERNAME/slate.git`
- 3. `cd slate`
- 4. Install all dependencies: `bundle install`
- 5. Start the test server: `bundle exec middleman server`
-
-Or use the included Dockerfile! (must install Docker first)
+To get started with Slate, please check out the [Getting Started](https://github.com/slatedocs/slate/wiki#getting-started)
+section in our [wiki](https://github.com/slatedocs/slate/wiki).
-```shell
-docker build -t slate .
-docker run -d -p 4567:4567 slate
-```
+We support running Slate in three different ways:
+* [Natively](https://github.com/slatedocs/slate/wiki/Using-Slate-Natively)
+* [Using Vagrant](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Vagrant)
+* [Using Docker](https://github.com/slatedocs/slate/wiki/Using-Slate-in-Docker)
-You can now see the docs at . Whoa! That was fast!
-
-*Note: if you're using the Docker setup on OSX, the docs will be
-availalable at the output of `boot2docker ip` instead of `localhost:4567`.*
+Companies Using Slate
+---------------------------------
-Now that Slate is all set up your machine, you'll probably want to learn more about [editing Slate markdown](https://github.com/tripit/slate/wiki/Markdown-Syntax), or [how to publish your docs](https://github.com/tripit/slate/wiki/Deploying-Slate).
+* [NASA](https://api.nasa.gov)
+* [Sony](http://developers.cimediacloud.com)
+* [Best Buy](https://bestbuyapis.github.io/api-documentation/)
+* [Travis-CI](https://docs.travis-ci.com/api/)
+* [Greenhouse](https://developers.greenhouse.io/harvest.html)
+* [WooCommerce](http://woocommerce.github.io/woocommerce-rest-api-docs/)
+* [Dwolla](https://docs.dwolla.com/)
+* [Clearbit](https://clearbit.com/docs)
+* [Coinbase](https://developers.coinbase.com/api)
+* [Parrot Drones](http://developer.parrot.com/docs/bebop/)
-Examples of Slate in the Wild
----------------------------------
+You can view more in [the list on the wiki](https://github.com/slatedocs/slate/wiki/Slate-in-the-Wild).
-* [Travis-CI's API docs](http://docs.travis-ci.com/api/)
-* [Mozilla's localForage docs](http://mozilla.github.io/localForage/)
-* [Mozilla Recroom](http://mozilla.github.io/recroom/)
-* [ChaiOne Gameplan API docs](http://chaione.github.io/gameplanb2b/#introduction)
-* [Drcaban's Build a Quine tutorial](http://drcabana.github.io/build-a-quine/#introduction)
-* [PricePlow API docs](https://www.priceplow.com/api/documentation)
-* [Emerging Threats API docs](http://apidocs.emergingthreats.net/)
-* [Appium docs](http://appium.io/slate/en/master)
-* [Golazon Developer](http://developer.golazon.com)
-* [Dwolla API docs](https://docs.dwolla.com/)
-* [RozpisyZapasu API docs](http://www.rozpisyzapasu.cz/dev/api/)
-* [Codestar Framework Docs](http://codestarframework.com/documentation/)
-* [Buddycloud API](http://buddycloud.com/api)
-* [Crafty Clicks API](https://craftyclicks.co.uk/api/)
-* [Paracel API Reference](http://paracel.io/docs/api_reference.html)
-* [Switch Payments Documentation](http://switchpayments.com/docs/) & [API](http://switchpayments.com/developers/)
-* [Coinbase API Reference](https://developers.coinbase.com/api)
-* [Whispir.io API](https://whispir.github.io/api)
-* [NASA API](https://data.nasa.gov/developer/external/planetary/)
-* [CardPay API](https://developers.cardpay.com/)
-* [IBM Cloudant](https://docs-testb.cloudant.com/content-review/_design/couchapp/index.html)
-* [Bitrix basis components](http://bbc.bitrix.expert/)
-* [viagogo API Documentation](http://developer.viagogo.net/)
-* [Fidor Bank API Documentation](http://docs.fidor.de/)
-* [Market Prophit API Documentation](http://developer.marketprophit.com/)
-
-(Feel free to add your site to this list in a pull request!)
-
-Need Help? Found a bug?
+Questions? Need Help? Found a bug?
--------------------
-Just [submit a issue](https://github.com/tripit/slate/issues) to the Slate Github if you need any help. And, of course, feel free to submit pull requests with bug fixes or changes.
+If you've got questions about setup, deploying, special feature implementation in your fork, or just want to chat with the developer, please feel free to [start a thread in our Discussions tab](https://github.com/slatedocs/slate/discussions)!
+Found a bug with upstream Slate? Go ahead and [submit an issue](https://github.com/slatedocs/slate/issues). And, of course, feel free to submit pull requests with bug fixes or changes to the `dev` branch.
Contributors
--------------------
-Slate was built by [Robert Lord](https://lord.io) while at [TripIt](http://tripit.com).
+Slate was built by [Robert Lord](https://lord.io) while at [TripIt](https://www.tripit.com/). The project is now maintained by [Matthew Peveler](https://github.com/MasterOdin) and [Mike Ralphson](https://github.com/MikeRalphson).
Thanks to the following people who have submitted major pull requests:
- [@chrissrogers](https://github.com/chrissrogers)
- [@bootstraponline](https://github.com/bootstraponline)
- [@realityking](https://github.com/realityking)
+- [@cvkef](https://github.com/cvkef)
-Also, thanks to [Sauce Labs](http://saucelabs.com) for helping sponsor the project.
-
-Special Thanks
---------------------
-- [Middleman](https://github.com/middleman/middleman)
-- [jquery.tocify.js](https://github.com/gfranko/jquery.tocify.js)
-- [middleman-syntax](https://github.com/middleman/middleman-syntax)
-- [middleman-gh-pages](https://github.com/neo/middleman-gh-pages)
-- [Font Awesome](http://fortawesome.github.io/Font-Awesome/)
+Also, thanks to [Sauce Labs](http://saucelabs.com) for sponsoring the development of the responsive styles.
diff --git a/Rakefile b/Rakefile
deleted file mode 100644
index 6a952e1e914..00000000000
--- a/Rakefile
+++ /dev/null
@@ -1,6 +0,0 @@
-require 'middleman-gh-pages'
-require 'rake/clean'
-
-CLOBBER.include('build')
-
-task :default => [:build]
diff --git a/config.rb b/config.rb
index 43bceaa5a43..6f8b677f617 100644
--- a/config.rb
+++ b/config.rb
@@ -1,3 +1,6 @@
+# Unique header generation
+require './lib/unique_head.rb'
+
# Markdown
set :markdown_engine, :redcarpet
set :markdown,
@@ -5,9 +8,11 @@
smartypants: true,
disable_indented_code_blocks: true,
prettify: true,
+ strikethrough: true,
tables: true,
with_toc_data: true,
- no_intra_emphasis: true
+ no_intra_emphasis: true,
+ renderer: UniqueHeadCounter
# Assets
set :css_dir, 'stylesheets'
@@ -17,6 +22,12 @@
# Activate the syntax highlighter
activate :syntax
+ready do
+ require './lib/monokai_sublime_slate.rb'
+ require './lib/multilang.rb'
+end
+
+activate :sprockets
activate :autoprefixer do |config|
config.browsers = ['last 2 version', 'Firefox ESR']
@@ -30,9 +41,23 @@
# Build Configuration
configure :build do
+ # We do want to hash woff and woff2 as there's a bug where woff2 will use
+ # woff asset hash which breaks things. Trying to use a combination of ignore and
+ # rewrite_ignore does not work as it conflicts weirdly with relative_assets. Disabling
+ # the .woff2 extension only does not work as .woff will still activate it so have to
+ # have both. See https://github.com/slatedocs/slate/issues/1171 for more details.
+ activate :asset_hash, :exts => app.config[:asset_extensions] - %w[.woff .woff2]
+ # If you're having trouble with Middleman hanging, commenting
+ # out the following two lines has been known to help
activate :minify_css
activate :minify_javascript
- # activate :relative_assets
- # activate :asset_hash
# activate :gzip
end
+
+# Deploy Configuration
+# If you want Middleman to listen on a different port, you can set that below
+set :port, 4567
+
+helpers do
+ require './lib/toc_data.rb'
+end
diff --git a/docker-compose.test.yml b/docker-compose.test.yml
new file mode 100644
index 00000000000..cab80790d62
--- /dev/null
+++ b/docker-compose.test.yml
@@ -0,0 +1,11 @@
+version: "2.2"
+services:
+ app:
+ image: ${IMAGE_NAME}:${VERSION}
+ command:
+ - bundle
+ - exec
+ - middleman
+ - serve
+ ports:
+ - 4567
diff --git a/font-selection.json b/font-selection.json
deleted file mode 100755
index 5e78f5d8621..00000000000
--- a/font-selection.json
+++ /dev/null
@@ -1,148 +0,0 @@
-{
- "IcoMoonType": "selection",
- "icons": [
- {
- "icon": {
- "paths": [
- "M438.857 73.143q119.429 0 220.286 58.857t159.714 159.714 58.857 220.286-58.857 220.286-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857zM512 785.714v-108.571q0-8-5.143-13.429t-12.571-5.429h-109.714q-7.429 0-13.143 5.714t-5.714 13.143v108.571q0 7.429 5.714 13.143t13.143 5.714h109.714q7.429 0 12.571-5.429t5.143-13.429zM510.857 589.143l10.286-354.857q0-6.857-5.714-10.286-5.714-4.571-13.714-4.571h-125.714q-8 0-13.714 4.571-5.714 3.429-5.714 10.286l9.714 354.857q0 5.714 5.714 10t13.714 4.286h105.714q8 0 13.429-4.286t6-10z"
- ],
- "attrs": [],
- "isMulticolor": false,
- "tags": [
- "exclamation-circle"
- ],
- "defaultCode": 61546,
- "grid": 14
- },
- "attrs": [],
- "properties": {
- "id": 100,
- "order": 4,
- "prevSize": 28,
- "code": 58880,
- "name": "exclamation-sign",
- "ligatures": ""
- },
- "setIdx": 0,
- "iconIdx": 0
- },
- {
- "icon": {
- "paths": [
- "M585.143 786.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-54.857v-292.571q0-8-5.143-13.143t-13.143-5.143h-182.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h54.857v182.857h-54.857q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h256q8 0 13.143-5.143t5.143-13.143zM512 274.286v-91.429q0-8-5.143-13.143t-13.143-5.143h-109.714q-8 0-13.143 5.143t-5.143 13.143v91.429q0 8 5.143 13.143t13.143 5.143h109.714q8 0 13.143-5.143t5.143-13.143zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z"
- ],
- "attrs": [],
- "isMulticolor": false,
- "tags": [
- "info-circle"
- ],
- "defaultCode": 61530,
- "grid": 14
- },
- "attrs": [],
- "properties": {
- "id": 85,
- "order": 3,
- "name": "info-sign",
- "prevSize": 28,
- "code": 58882
- },
- "setIdx": 0,
- "iconIdx": 2
- },
- {
- "icon": {
- "paths": [
- "M733.714 419.429q0-16-10.286-26.286l-52-51.429q-10.857-10.857-25.714-10.857t-25.714 10.857l-233.143 232.571-129.143-129.143q-10.857-10.857-25.714-10.857t-25.714 10.857l-52 51.429q-10.286 10.286-10.286 26.286 0 15.429 10.286 25.714l206.857 206.857q10.857 10.857 25.714 10.857 15.429 0 26.286-10.857l310.286-310.286q10.286-10.286 10.286-25.714zM877.714 512q0 119.429-58.857 220.286t-159.714 159.714-220.286 58.857-220.286-58.857-159.714-159.714-58.857-220.286 58.857-220.286 159.714-159.714 220.286-58.857 220.286 58.857 159.714 159.714 58.857 220.286z"
- ],
- "attrs": [],
- "isMulticolor": false,
- "tags": [
- "check-circle"
- ],
- "defaultCode": 61528,
- "grid": 14
- },
- "attrs": [],
- "properties": {
- "id": 83,
- "order": 9,
- "prevSize": 28,
- "code": 58886,
- "name": "ok-sign"
- },
- "setIdx": 0,
- "iconIdx": 6
- },
- {
- "icon": {
- "paths": [
- "M658.286 475.429q0-105.714-75.143-180.857t-180.857-75.143-180.857 75.143-75.143 180.857 75.143 180.857 180.857 75.143 180.857-75.143 75.143-180.857zM950.857 950.857q0 29.714-21.714 51.429t-51.429 21.714q-30.857 0-51.429-21.714l-196-195.429q-102.286 70.857-228 70.857-81.714 0-156.286-31.714t-128.571-85.714-85.714-128.571-31.714-156.286 31.714-156.286 85.714-128.571 128.571-85.714 156.286-31.714 156.286 31.714 128.571 85.714 85.714 128.571 31.714 156.286q0 125.714-70.857 228l196 196q21.143 21.143 21.143 51.429z"
- ],
- "width": 951,
- "attrs": [],
- "isMulticolor": false,
- "tags": [
- "search"
- ],
- "defaultCode": 61442,
- "grid": 14
- },
- "attrs": [],
- "properties": {
- "id": 2,
- "order": 1,
- "prevSize": 28,
- "code": 58887,
- "name": "icon-search"
- },
- "setIdx": 0,
- "iconIdx": 7
- }
- ],
- "height": 1024,
- "metadata": {
- "name": "slate",
- "license": "SIL OFL 1.1"
- },
- "preferences": {
- "showGlyphs": true,
- "showQuickUse": true,
- "showQuickUse2": true,
- "showSVGs": true,
- "fontPref": {
- "prefix": "icon-",
- "metadata": {
- "fontFamily": "slate",
- "majorVersion": 1,
- "minorVersion": 0,
- "description": "Based on FontAwesome",
- "license": "SIL OFL 1.1"
- },
- "metrics": {
- "emSize": 1024,
- "baseline": 6.25,
- "whitespace": 50
- },
- "resetPoint": 58880,
- "showSelector": false,
- "selector": "class",
- "classSelector": ".icon",
- "showMetrics": false,
- "showMetadata": true,
- "showVersion": true,
- "ie7": false
- },
- "imagePref": {
- "prefix": "icon-",
- "png": true,
- "useClassSelector": true,
- "color": 4473924,
- "bgColor": 16777215
- },
- "historySize": 100,
- "showCodes": true,
- "gridSize": 16,
- "showLiga": false
- }
-}
diff --git a/lib/monokai_sublime_slate.rb b/lib/monokai_sublime_slate.rb
new file mode 100644
index 00000000000..cd2de33172d
--- /dev/null
+++ b/lib/monokai_sublime_slate.rb
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*- #
+# frozen_string_literal: true
+
+# this is based on https://github.com/rouge-ruby/rouge/blob/master/lib/rouge/themes/monokai_sublime.rb
+# but without the added background, and changed styling for JSON keys to be soft_yellow instead of white
+
+module Rouge
+ module Themes
+ class MonokaiSublimeSlate < CSSTheme
+ name 'monokai.sublime.slate'
+
+ palette :black => '#000000'
+ palette :bright_green => '#a6e22e'
+ palette :bright_pink => '#f92672'
+ palette :carmine => '#960050'
+ palette :dark => '#49483e'
+ palette :dark_grey => '#888888'
+ palette :dark_red => '#aa0000'
+ palette :dimgrey => '#75715e'
+ palette :emperor => '#555555'
+ palette :grey => '#999999'
+ palette :light_grey => '#aaaaaa'
+ palette :light_violet => '#ae81ff'
+ palette :soft_cyan => '#66d9ef'
+ palette :soft_yellow => '#e6db74'
+ palette :very_dark => '#1e0010'
+ palette :whitish => '#f8f8f2'
+ palette :orange => '#f6aa11'
+ palette :white => '#ffffff'
+
+ style Generic::Heading, :fg => :grey
+ style Literal::String::Regex, :fg => :orange
+ style Generic::Output, :fg => :dark_grey
+ style Generic::Prompt, :fg => :emperor
+ style Generic::Strong, :bold => false
+ style Generic::Subheading, :fg => :light_grey
+ style Name::Builtin, :fg => :orange
+ style Comment::Multiline,
+ Comment::Preproc,
+ Comment::Single,
+ Comment::Special,
+ Comment, :fg => :dimgrey
+ style Error,
+ Generic::Error,
+ Generic::Traceback, :fg => :carmine
+ style Generic::Deleted,
+ Generic::Inserted,
+ Generic::Emph, :fg => :dark
+ style Keyword::Constant,
+ Keyword::Declaration,
+ Keyword::Reserved,
+ Name::Constant,
+ Keyword::Type, :fg => :soft_cyan
+ style Literal::Number::Float,
+ Literal::Number::Hex,
+ Literal::Number::Integer::Long,
+ Literal::Number::Integer,
+ Literal::Number::Oct,
+ Literal::Number,
+ Literal::String::Char,
+ Literal::String::Escape,
+ Literal::String::Symbol, :fg => :light_violet
+ style Literal::String::Doc,
+ Literal::String::Double,
+ Literal::String::Backtick,
+ Literal::String::Heredoc,
+ Literal::String::Interpol,
+ Literal::String::Other,
+ Literal::String::Single,
+ Literal::String, :fg => :soft_yellow
+ style Name::Attribute,
+ Name::Class,
+ Name::Decorator,
+ Name::Exception,
+ Name::Function, :fg => :bright_green
+ style Name::Variable::Class,
+ Name::Namespace,
+ Name::Entity,
+ Name::Builtin::Pseudo,
+ Name::Variable::Global,
+ Name::Variable::Instance,
+ Name::Variable,
+ Text::Whitespace,
+ Text,
+ Name, :fg => :white
+ style Name::Label, :fg => :bright_pink
+ style Operator::Word,
+ Name::Tag,
+ Keyword,
+ Keyword::Namespace,
+ Keyword::Pseudo,
+ Operator, :fg => :bright_pink
+ end
+ end
+ end
diff --git a/lib/multilang.rb b/lib/multilang.rb
new file mode 100644
index 00000000000..36fbe5b1f07
--- /dev/null
+++ b/lib/multilang.rb
@@ -0,0 +1,16 @@
+module Multilang
+ def block_code(code, full_lang_name)
+ if full_lang_name
+ parts = full_lang_name.split('--')
+ rouge_lang_name = (parts) ? parts[0] : "" # just parts[0] here causes null ref exception when no language specified
+ super(code, rouge_lang_name).sub("highlight #{rouge_lang_name}") do |match|
+ match + " tab-" + full_lang_name
+ end
+ else
+ super(code, full_lang_name)
+ end
+ end
+end
+
+require 'middleman-core/renderers/redcarpet'
+Middleman::Renderers::MiddlemanRedcarpetHTML.send :include, Multilang
diff --git a/lib/nesting_unique_head.rb b/lib/nesting_unique_head.rb
new file mode 100644
index 00000000000..01278371c17
--- /dev/null
+++ b/lib/nesting_unique_head.rb
@@ -0,0 +1,22 @@
+# Nested unique header generation
+require 'middleman-core/renderers/redcarpet'
+
+class NestingUniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
+ def initialize
+ super
+ @@headers_history = {} if !defined?(@@headers_history)
+ end
+
+ def header(text, header_level)
+ friendly_text = text.gsub(/<[^>]*>/,"").parameterize
+ @@headers_history[header_level] = text.parameterize
+
+ if header_level > 1
+ for i in (header_level - 1).downto(1)
+ friendly_text.prepend("#{@@headers_history[i]}-") if @@headers_history.key?(i)
+ end
+ end
+
+ return "#{text}"
+ end
+end
diff --git a/lib/toc_data.rb b/lib/toc_data.rb
new file mode 100644
index 00000000000..4a04efee26f
--- /dev/null
+++ b/lib/toc_data.rb
@@ -0,0 +1,31 @@
+require 'nokogiri'
+
+def toc_data(page_content)
+ html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content)
+
+ # get a flat list of headers
+ headers = []
+ html_doc.css('h1, h2, h3').each do |header|
+ headers.push({
+ id: header.attribute('id').to_s,
+ content: header.children,
+ title: header.children.to_s.gsub(/<[^>]*>/, ''),
+ level: header.name[1].to_i,
+ children: []
+ })
+ end
+
+ [3,2].each do |header_level|
+ header_to_nest = nil
+ headers = headers.reject do |header|
+ if header[:level] == header_level
+ header_to_nest[:children].push header if header_to_nest
+ true
+ else
+ header_to_nest = header if header[:level] < header_level
+ false
+ end
+ end
+ end
+ headers
+end
diff --git a/lib/unique_head.rb b/lib/unique_head.rb
new file mode 100644
index 00000000000..d42bab2aa9d
--- /dev/null
+++ b/lib/unique_head.rb
@@ -0,0 +1,24 @@
+# Unique header generation
+require 'middleman-core/renderers/redcarpet'
+require 'digest'
+class UniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
+ def initialize
+ super
+ @head_count = {}
+ end
+ def header(text, header_level)
+ friendly_text = text.gsub(/<[^>]*>/,"").parameterize
+ if friendly_text.strip.length == 0
+ # Looks like parameterize removed the whole thing! It removes many unicode
+ # characters like Chinese and Russian. To get a unique URL, let's just
+ # URI escape the whole header
+ friendly_text = Digest::SHA1.hexdigest(text)[0,10]
+ end
+ @head_count[friendly_text] ||= 0
+ @head_count[friendly_text] += 1
+ if @head_count[friendly_text] > 1
+ friendly_text += "-#{@head_count[friendly_text]}"
+ end
+ return "#{text}"
+ end
+end
diff --git a/source/fonts/slate.eot b/source/fonts/slate.eot
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.svg b/source/fonts/slate.svg
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.ttf b/source/fonts/slate.ttf
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.woff b/source/fonts/slate.woff
old mode 100755
new mode 100644
diff --git a/source/fonts/slate.woff2 b/source/fonts/slate.woff2
old mode 100755
new mode 100644
diff --git a/source/images/logo.png b/source/images/logo.png
deleted file mode 100644
index fa1f13da819..00000000000
Binary files a/source/images/logo.png and /dev/null differ
diff --git a/source/images/zappi-favicon-32x32.png b/source/images/zappi-favicon-32x32.png
new file mode 100644
index 00000000000..6dcf8338a6d
Binary files /dev/null and b/source/images/zappi-favicon-32x32.png differ
diff --git a/source/images/zappi-logo.png b/source/images/zappi-logo.png
new file mode 100644
index 00000000000..243a99993a4
Binary files /dev/null and b/source/images/zappi-logo.png differ
diff --git a/source/includes/_errors.md b/source/includes/_errors.md
index 56cffb34d22..91cacfc01a6 100644
--- a/source/includes/_errors.md
+++ b/source/includes/_errors.md
@@ -1,20 +1,18 @@
-# Errors
+# Error Codes
-
+The Zappi API uses the following error codes:
-The Kittn API uses the following error codes:
-
-
-Error Code | Meaning
----------- | -------
-400 | Bad Request -- Your request sucks
-401 | Unauthorized -- Your API key is wrong
-403 | Forbidden -- The kitten requested is hidden for administrators only
-404 | Not Found -- The specified kitten could not be found
-405 | Method Not Allowed -- You tried to access a kitten with an invalid method
-406 | Not Acceptable -- You requested a format that isn't json
-410 | Gone -- The kitten requested has been removed from our servers
-418 | I'm a teapot
-429 | Too Many Requests -- You're requesting too many kittens! Slow down!
-500 | Internal Server Error -- We had a problem with our server. Try again later.
-503 | Service Unavailable -- We're temporarially offline for maintanance. Please try again later.
+Error Code | HTTP Status Code | Error Message
+--------- | ----------- | -----------
+1000 | 400 | Unable to process the request. Invalid input.
+1002 | 400 | Unable to process the request. Invalid request headers.
+1010 | 401 | Invalid credentials. Integration does not exist.
+1011 | 401 | Access token expired.
+1012 | 401 | Access token invalid.
+1020 | 403 | Not permitted to access this resource.
+1021 | 403 | Request could not be processed.
+1030 | 404 | Resource not found.
+1031 | 409 | The requested resource already exists.
+1050 | 429 | Rate limit reached. Please try again later.
+1060 | 500 | Internal server error. Unable to process request.
+1061 | 503 | Service unavailable.
diff --git a/source/index.html.md b/source/index.html.md
new file mode 100644
index 00000000000..dd2b70a05e4
--- /dev/null
+++ b/source/index.html.md
@@ -0,0 +1,822 @@
+---
+title: API Reference
+
+language_tabs: # must be one of https://git.io/vQNgJ
+ - shell
+
+toc_footers:
+ - Contact support@zappistore.com for API Credentials
+
+includes:
+ - errors
+
+search: true
+
+code_clipboard: true
+---
+
+# Zappi API
+
+The Zappi API is REST-based and returns responses in JSON.
+
+To use our API, you’ll need to contact us in order to have a public integration created.
+
+# Beta
+
+Please note that as we are still finalizing our API, this spec is subject to change and should not be considered final.
+
+# Change Log
+
+## 4 August 2022
+
+Added `delivered_at` to the order payload, as part of the metadata object.
+
+## 9 May 2022
+
+Increased rate limit for numerous endpoints.
+
+## 5 April 2022
+
+Added `workspace_id` optional query parameter to the `GET /products` endpoint.
+
+## 10 January 2022
+
+Added `deliverables_last_updated_at` to the order payload, as part of the metadata object.
+
+## 9 December 2021
+
+Added `customer_hashed_email_address` to the order payload, as part of the metadata object.
+
+## 15 November 2021
+
+Added `visibility` to the `GET order/{id}/deliverables` payload.
+
+## 16 August 2021
+
+Added `visibility` to the order payload.
+
+## 19 July 2021
+
+Added `workspace_id` as an optional parameter on `POST /orders.`
+Added `workspace_id` to the order payload.
+
+## 14 July 2021
+
+Added `root_workspace_id` to `GET public_integrations/identity` payload.
+Added `GET /workspaces/{id}` endpoint.
+
+## 15 April 2021
+
+Updated `GET /Orders` rate limit from 10 to 20.
+Increased default pagination size from 30 to 100.
+
+## 8 April 2021
+
+Added `product_id` and `country_code` to the order payload.
+
+# API Overview
+
+Zappi allows 3rd parties to create public integrations on our platform. This will allow other companies and developers to build integrations which can be installed by different customer groups. All public integrations will need to be reviewed and approved by Zappi. Access tokens for public integrations will expire, and will need to be regenerated when necessary, using the client credentials oAuth flow. In order to make use of a public integration, a customer group will need to install it. Public integrations can be uninstalled at any point in time.
+
+## Public Integrations
+
+In order for a public integration to be made available, the 3rd-party would need to register this public integration on our platform.
+
+Public Integrations will need to be reviewed and approved by Zappi. Once an integration has been approved by Zappi, this integration will be made available to customers on the platform.
+
+### Registration
+
+We will require the following on registration of an Public Integration:
+
+
+Field | Description | Required
+--------- | ----------- | -----------
+Integration Name | Any name used to identify the Public Integration | Yes
+Author | Company or person who built the integration| Yes
+Description | A description of the integration | Yes
+Callback URI Host | A list of valid hosts to be used in any callback URIs | No
+
+Each Public Integration will be assigned the following:
+
+Field | Description
+--------- | -----------
+Client ID | The client identifier to be used for oAuth Client Credentials flow
+Client Secret | The client secret to be used for oAuth Client Credentials flow
+
+### Installation
+
+Once a Public Integration is installed on a subdomain, the Public Integration will be able to make API requests on behalf of the customer group.
+
+
+# Authentication
+
+## oAuth Process
+
+
+> Example Request:
+
+```shell
+curl "http://api.zappi.io/v1/public_integrations/authorize" \
+ -H "Authorization: Basic 12345 " \
+```
+
+> Example Response:
+
+```json
+{
+ "access_token": "abcdefghijk",
+ "expires_in": 86400,
+ "token_type": "Bearer"
+}
+```
+
+In order to obtain an access token, a request will need to be made to: _POST /public_integrations/authorize_
+
+
+#### Headers
+
+Field | Description
+--------- | -----------
+Authorization | Basic ``
+
+#### Response Body
+
+Field | Description | Data Type
+--------- | ----------- | -----------
+access_token | The access token | The Access Token
+expires_in | When the access token expires | DateTime
+token_type | This will be `bearer`| String
+
+### Access Token
+
+All requests made by a public integration must have the access token and the installation UUID in the headers, as follows:
+
+_Authorization: Bearer `>`_
+
+_X-Zappi-Installation: ``_
+
+
+### Token Expiration
+
+Public Integration access tokens expire after 24 hours.
+
+
+## Identification
+
+> Example Request:
+
+```shell
+curl "http://api.zappi.io/v1/public_integrations" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "client_id": "123456789",
+ "installation_uuid": "123456-789-12345-6789-123456",
+ "subdomain_url": "https://subdomain.zappi.io",
+ "root_workspace_id": 999
+}
+```
+
+In order to view information pertaining to a public integration installation, a request will need to be made to: _GET /public_integrations/identity_
+
+#### Response Body
+
+Field | Description | Data Type
+--------- | ----------- | -----------
+client_id | The Client ID of the public integration | String
+installation_uuid | The installation UUID belonging to the customer group/public integration installation | String
+root_workspace_id | The ID of the root workspace for this customer group | Integer
+subdomain_url | The subdomain URL of the customer group | String
+
+## Permissions
+
+Each integration is assigned a set of permissions. The permissions will determine what actions the integration can perform. Currently all integrations are provided with all the following scopes.
+
+Scope | Label | Description
+--------- | ----------- | -----------
+read_orders | View orders and order deliverables | View orders belonging to the Customer Group
+write_orders | Create orders | Create orders
+read_event_subscriptions | View event subscriptions | View event subscriptions
+write_event_subscriptions | Create/delete event subscriptions | Subscribe to events
+read_workspaces | View workspaces | View workspaces belonging to the Customer and Customer Group
+
+# Rate Limits
+
+
+Max Requests | Interval (seconds) | Endpoints
+--------- | ----------- | -----------
+60 | 60 | GET /event_subscriptions
+5 | 60 | POST /event_subscriptions
+60 | 60 | GET /event_subscriptions/{id}
+60 | 60 | DELETE /event_subscriptions/{id}
+60 | 60 | GET /orders
+60 | 60 | GET /orders/{id}
+60 |60 | GET /orders/{id}/delverables
+5 | 60 | POST /orders
+60 | 60 | GET /products
+1 | 300 | POST /public_integrations/authorize
+60 | 60 | GET /public_integrations/identity
+60 | 60 | GET /workspaces/{id}
+
+
+# Pagination
+
+Requests that return multiple items will be paginated using cursor pagination.The maximum number of results returned may differ, depending on API traffic.
+
+Field | Description | Required
+--------- | ----------- | -----------
+limit | The number of results in the response | No
+cursor | Identifies where the next set of results should begin. Each API response that contains multiple items will have a `next_cursor` field. | No
+
+
+
+# API Endpoints
+
+## Event Subscriptions
+
+### GET /event_subscriptions
+
+> Example Request:
+
+```shell
+curl "https://api.zappi.io/v1/event_subscriptions" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "event_subscriptions": [
+ {
+ "callback_uri": "https://api.callback_url.com/",
+ "event_type": "order_completed",
+ "id": 1,
+ "order_id": 4
+ }
+ ],
+ "next_cursor": null
+}
+```
+
+ Returns the list of event subscriptions.
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Event Subscription ID | Integer
+callback_uri | The URI to notify when the event occurs | String
+event_type | Type of event subscribed to: `order_completed` | String
+order_id | The order ID | String
+
+
+
+### GET /event_subscriptions/{id}
+
+> Example Request:
+
+```shell
+curl "https://api.zappi.io/v1/event_subscriptions/1" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "event_subscription": {
+ "callback_uri": "https://api.callback_url.com/",
+ "event_type": "order_completed",
+ "id": 1,
+ "order_id": 4
+ }
+}
+```
+
+ Event subscription details
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Event Subscription ID | Integer
+callback_uri | The URI to notify when the event occurs | String
+event_type | Type of event subscribed to: `order_completed` | String
+order_id | The order ID | String
+
+
+### POST /event_subscriptions
+
+> Example Request:
+
+```shell
+curl "https://api.zappi.io/v1/event_subscriptions" \
+ -X POST \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456" \
+ -d '{"event_subscription": {"callback_uri":"https://api.callback_url.com/","event_type":"order_completed","order_id": 4}}'
+}
+
+```
+
+> Example Response:
+
+```json
+{
+ "event_subscription": {
+ "callback_uri": "https://api.callback_url.com/",
+ "event_type": "order_completed",
+ "id": 1,
+ "order_id": 4
+ }
+}
+```
+
+ Subscribe to an event
+
+#### Request Body
+
+Field Name | Description | Data Type | Required
+--------- | ----------- | ----------- | -----------
+callback_uri | The URI to notify when the event occurs. This URI needs to be whitelisted beforehand. | String | Yes
+event_type | Type of event subscribed to: `order_completed` | Integer | Yes
+order_id | The order ID | Integer | Yes
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Event Subscription ID | Integer
+callback_uri | The URI to notify when the event occurs | String
+event_type | Type of event subscribed to: `order_completed` | String
+order_id | The order ID | String
+
+#### Event Subscription Callback Payload
+
+> Example Event subscription Callback JSON:
+
+```json
+{
+ "callback_uri": "https://api.callback_url.com/url",
+ "event_datetime": "2020-11-25T11:20:00Z",
+ "event_reference": "1-1-1",
+ "event_type": "order_completed",
+ "order_id": 4
+}
+```
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+callback_uri | The URI to notify when the event occurs | String
+event_datetime | The URI to notify when the event occurs. This URI needs to be whitelisted beforehand. | DateTime
+event_reference | The unique reference for the event | String
+event_type | Type of event subscribed to: `order_completed` | String
+order_id | The order ID | String
+
+
+### DELETE /event_subscriptions/{id}
+
+> Example Request:
+
+```shell
+curl "https://api.zappi.io/v1/event_subscriptions/1" \
+ -X DELETE \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+}
+
+```
+
+ Deletes an event subscription
+
+## Orders
+
+### GET /orders
+
+> Example Request:
+
+```shell
+curl "https://api.zappi.io/v1/orders?limit=2&customer_email=name@domain.com" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "next_cursor": 2,
+ "orders": [
+ {
+ "analyze_url": "https://subdomain.zappi.io/project_setup/zappi-product-test/1/analyze_project",
+ "configure_url": "",
+ "id": 1,
+ "status": "complete",
+ "title": "An order title",
+ "workspace_id": 1234,
+ "visibility": "public",
+ "product_id": 4,
+ "country_code": "US",
+ "metadata": {
+ "customer_hashed_email_address": "abcdefghijklmnopq12345",
+ "deliverables_last_updated_at": "2021-12-30T11:46:15Z",
+ "delivered_at": "2021-12-29T00:00:00Z"
+ }
+ },
+ {
+ "analyze_url": "https://subdomain.zappi.io/project_setup/zappi-product-test/2/analyze_project",
+ "configure_url": "https://subdomain.zappi.io/project_setup/mmr-impackt-lite/2/start_new_project",
+ "id": 2,
+ "status": "configuration",
+ "title": "Another order title",
+ "workspace_id": 1234,
+ "visibility": "public",
+ "product_id": 3,
+ "country_code": "GB",
+ "metadata": {
+ "customer_hashed_email_address": "abcdefghijklmnopq12345",
+ "deliverables_last_updated_at": null,
+ "delivered_at": null
+ }
+ }
+ ]
+}
+```
+
+ Returns the list of orders available to the customer in the customer group
+
+#### Query String
+
+Field Name | Description | Data Type | Required
+--------- | ----------- | ----------- | -----------
+customer_email | The email address of the customer the request is being made on behalf of. | String | Yes
+
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Order Id | Integer
+title | Order title | String
+product_id | Product ID | Integer
+country_code | Fieldwork country’s ISO 3166-1 alpha-2 code | String
+status | The status of the order: `configuration`, `processing`, `complete` | String
+configure_url | The URL that will go to the configuration page of the order on the Zappi platform | String
+analyze_url | The URL that will go to the analysis page of the order on the Zappi platform | String
+workspace_id | The workspace ID that the order is in | Integer
+visibility | The visibility of the order: `private`, `public` (available to everyone in the organisation | String
+metadata | Extra data pertaining to the order | Object
+
+#### Order Metadata
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+customer_hashed_email_address | The SHA 256 hash of the customer email address. Base16 encoded. All lower case | String
+deliverables_last_updated_at | The ISO8601 timestamp of the most recent generation of deliverables for the order. | DateTime
+delivered_at | The ISO8601 timestamp of the delivery date of the order. i.e the date when the fieldwork was completed and the study was closed. | DateTime
+
+For the customer email address "name.surname@domain.com", the hash provided via API would be "b3204d933a7eb98d6f7ed8dbab916a885692a6d78f6f67deb185710c7cd05cee".
+
+### GET /orders/{id}
+
+> Example Request:
+
+```shell
+curl "GET https://api.zappi.io/v1/orders/2?customer_email=name@domain.com" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "order": {
+ "analyze_url": "https://subdomain.zappi.io/project_setup/zappi-product-test/2/analyze_project",
+ "configure_url": "https://subdomain.zappi.io/project_setup/zappi-product-test/2/start_new_project",
+ "id": 2,
+ "status": "configuration",
+ "title": "Another order title",
+ "workspace_id": 1234,
+ "visibility": "public",
+ "product_id": 4,
+ "country_code": "US",
+ "metadata": {
+ "customer_hashed_email_address": "abcdefghijklmnopq12345",
+ "deliverables_last_updated_at": null,
+ "delivered_at": null
+ }
+ }
+}
+```
+
+ Returns the list of orders available to the customer in the customer group
+
+#### Query String
+
+Field Name | Description | Data Type | Required
+--------- | ----------- | ----------- | -----------
+customer_email | The email address of the customer the request is being made on behalf of. | String | Yes
+
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Order Id | Integer
+analyze_url | The URL that will go to the analysis page of the order on the Zappi platform | String
+country_code | Fieldwork country’s ISO 3166-1 alpha-2 code | String
+configure_url | The URL that will go to the configuration page of the order on the Zappi platform | String
+product_id | Product ID | Integer
+status | The status of the order: `configuration`, `processing`, `complete` | String
+title | Order title | String
+visibility | The visibility of the order: `private`, `public` (available to everyone in the organisation | String
+workspace_id | The workspace ID that the order is in | Integer
+metadata | Extra data pertaining to the order | Object
+
+### GET /orders/{id}/deliverables
+
+> Example Request:
+
+```shell
+curl "https://api.zappi.io/v1/orders/3/deliverables" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "deliverables": {
+ "report": {
+ "pdf": "https://s3.amazonaws.com/zappi.api-exports/production/3/report_3.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A123456%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201202T103901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=123456",
+ "xlsx": "https://s3.amazonaws.com/zappi.api-exports/production/3/report_3.xlsx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A123456%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201202T103901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=123456",
+ "pptx": "https://s3.amazonaws.com/zappi.api-exports/production/3/report_3.pptx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A123456%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201202T103901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=123456",
+ "visibility": "public"
+ },
+ "survey_questionnaires": {
+ "pdf": [
+ "https://s3.amazonaws.com/zappi.api-exports/production/3/3/survey_questionnaire_1_3.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A123456%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201202T103901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=123456"
+ ],
+ "visibility": "private"
+ },
+ "survey_respondent_data": {
+ "csv": "https://s3.amazonaws.com/zappi.api-exports/production/3/survey_respondent_data_3.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A123456%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201202T103901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=123456",
+ "sav": "https://s3.amazonaws.com/zappi.api-exports/production/3/survey_respondent_data_3.sav?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A123456%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201202T103901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=123456",
+ "visibility": "public"
+ },
+ "survey_metadata": {
+ "xlsx":
+"https://s3.amazonaws.com/zappi.api-exports/production/3/survey_metadata_3.xlxs?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=A123456%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201202T103901Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=123456",
+ "visibility": "public"
+ }
+}
+```
+
+ Returns all the deliverables for the order
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+deliverables | List of all deliverables available for the order. URLs will expire after a certain period of time. | JSON
+
+#### Deliverables
+
+Export Type | Description | Format | Pre-requisite event
+--------- | ----------- | ----------- | -----------
+report | The full report with analysis | `.pdf`, `.pptx`, `.xlsx` | `order_complete`
+survey_metadata | The survey metadata | `.xls` | `order_complete`
+survey_responses | The raw respondent data | `.pdf`, `.pptx` | `order_complete`
+survey_questionnaire | The survey questionnaire | `.pdf` | `order_complete`
+
+
+
+
+
+
+### POST /orders
+
+> Example Request:
+
+```shell
+curl "https://api.zappi.io/v1/orders" \
+ -X POST \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456" \
+ -d '{"order":{"product_id":1,"title":"An Order Title", "customer_email":"user@domain.com","workspace_id":1234}'
+}
+
+```
+
+> Example Response:
+
+```json
+{
+ "order": {
+ "analyze_url": "https://subdomain.zappi.io/project_setup/zappi-concept-test/4/analyze_project",
+ "configure_url": "https://subdomain.zappi.io/project_setup/zappi-concept-test/4/start_new_project",
+ "id": 4,
+ "status": "configuration",
+ "title": "An Order Title",
+ "workspace_id": 1,
+ "visibility": "public",
+ "metadata": {
+ "customer_hashed_email_address": "abcdefghijklmnopq12345",
+ "deliverables_last_updated_at": null,
+ "delivered_at": null
+ }
+ }
+}
+```
+
+ Create an unconfigured order
+
+#### Request Body
+
+Field Name | Description | Data Type | Required
+--------- | ----------- | ----------- | -----------
+customer_email | Email address of the customer creating the order | String | Yes
+product_id | Product ID | Integer | Yes
+title | The title of the order | String | Yes
+workspace_id | The workspace to create the order under (defaults to the root workspace) | Integer | No
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Order ID | Integer
+analyze_url | The URL that will direct users to the analysis page of the order on the Zappi platform | String
+configure_url | The URL that will direct users to the configuration page of the order on the Zappi platform | String
+status | The status of the order: `configuration`, `processing`, `complete` | String
+title | Order title | String
+product_id | Product ID | Integer
+country_code | Fieldwork country’s ISO 3166-1 alpha-2 code | String
+visibility | The visibility of the order: `private`, `public` (available to everyone in the organisation | String
+workspace_id | The workspace ID that the order is in | Integer
+metadata | Extra data pertaining to the order | Object
+
+## Products
+
+### GET /products
+
+> Example Request:
+
+```shell
+curl "http://api.zappi.io/v1/products?workspace_id=1234" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "next_cursor": 3,
+ "products": [
+ {
+ "description": "A product description.",
+ "id": 2,
+ "name": "Product 2"
+ },
+ {
+ "description": "Another product description.",
+ "id": 3,
+ "name": "Product 3"
+ }
+ ]
+}
+```
+
+#### Query String
+
+Field Name | Description | Data Type | Required
+--------- | ----------- | ----------- | -----------
+workspace_id | The workspace ID to fetch available products for. Defaults to the customer's root workspace. | Integer | No
+
+ Returns the list of products available for the customer group
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Product ID | Integer
+name | Product Name | String
+description | Product description | String
+
+## Workspaces
+
+### GET /workspaces/{id}
+
+> Example Request:
+
+```shell
+curl "http://api.zappi.io/v1/workspaces/12345" \
+ -H "Authorization: Bearer abcdefghijk" \
+ -H "X-Zappi-Installation": "123456-789-12345-6789-123456"
+```
+
+> Example Response:
+
+```json
+{
+ "workspace": {
+ "children": [
+ {
+ "children": [],
+ "id": 1,
+ "label": "worspace 1"
+ },
+ {
+ "children": [],
+ "id": 2,
+ "label": "workspace 2"
+ },
+ {
+ "children": [],
+ "id": 3,
+ "label": "workspace 3"
+ },
+ {
+ "children": [
+ {
+ "children": [],
+ "id": 4,
+ "label": "workjspace 4"
+ },
+ {
+ "children": [],
+ "id": 5,
+ "label": "workspace 5"
+ },
+ {
+ "children": [],
+ "id": 6,
+ "label": "workspace 6"
+ },
+ {
+ "children": [],
+ "id": 7,
+ "label": "workspace 7"
+ },
+ {
+ "children": [],
+ "id": 8,
+ "label": "workspace 8"
+ }
+ ],
+ "id": 9,
+ "label": "workspace 9"
+ }
+ ],
+ "id": 12345,
+ "label": "root workspace"
+ }
+}
+```
+
+ Workspace details.
+
+#### Query String
+
+Field Name | Description | Data Type | Required
+--------- | ----------- | ----------- | -----------
+customer_email | The email address of the customer the request is being made on behalf of. | String | Yes
+
+#### Response Body
+
+Field Name | Description | Data Type
+--------- | ----------- | -----------
+id | Workspace ID | Integer
+children | The child workspaces for this workspace | String
+label | Workspace title | String
+
+# Event Types
+
+Event Type | Description
+--------- | -----------
+order_complete | The order is completed. All survey responses have been collected. The report has been generated and is published on the platform. All deliverables have been uploaded to AWS S3.
+
+# Visibility
+
+Visibility Type | Description
+--------- | -----------
+private | The entity has not been shared with the organisation but may be shared with individual users and user groups.
+public | The entity has been shared with the entire organisation.
+
+The visibility is determined by the sharing options assigned on the platform.
+
+# Webhook Security
+
+All requests made by Zappi to the provided callback_uri will have a hash signature with each payload. This hash signature is passed along in the headers as X-Zappi-Signature. The HMAC hexdigest will be used to compute the hash.
+
+
diff --git a/source/index.md b/source/index.md
deleted file mode 100644
index 4c1fa8c9f7d..00000000000
--- a/source/index.md
+++ /dev/null
@@ -1,168 +0,0 @@
----
-title: API Reference
-
-language_tabs:
- - shell
- - ruby
- - python
-
-toc_footers:
- - Sign Up for a Developer Key
- - Documentation Powered by Slate
-
-includes:
- - errors
-
-search: true
----
-
-# Introduction
-
-Welcome to the Kittn API! You can use our API to access Kittn API endpoints, which can get information on various cats, kittens, and breeds in our database.
-
-We have language bindings in Shell, Ruby, and Python! You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.
-
-This example API documentation page was created with [Slate](http://github.com/tripit/slate). Feel free to edit it and use it as a base for your own API's documentation.
-
-# Authentication
-
-> To authorize, use this code:
-
-```ruby
-require 'kittn'
-
-api = Kittn::APIClient.authorize!('meowmeowmeow')
-```
-
-```python
-import kittn
-
-api = kittn.authorize('meowmeowmeow')
-```
-
-```shell
-# With shell, you can just pass the correct header with each request
-curl "api_endpoint_here"
- -H "Authorization: meowmeowmeow"
-```
-
-> Make sure to replace `meowmeowmeow` with your API key.
-
-Kittn uses API keys to allow access to the API. You can register a new Kittn API key at our [developer portal](http://example.com/developers).
-
-Kittn expects for the API key to be included in all API requests to the server in a header that looks like the following:
-
-`Authorization: meowmeowmeow`
-
-
-
-# Kittens
-
-## Get All Kittens
-
-```ruby
-require 'kittn'
-
-api = Kittn::APIClient.authorize!('meowmeowmeow')
-api.kittens.get
-```
-
-```python
-import kittn
-
-api = kittn.authorize('meowmeowmeow')
-api.kittens.get()
-```
-
-```shell
-curl "http://example.com/api/kittens"
- -H "Authorization: meowmeowmeow"
-```
-
-> The above command returns JSON structured like this:
-
-```json
-[
- {
- "id": 1,
- "name": "Fluffums",
- "breed": "calico",
- "fluffiness": 6,
- "cuteness": 7
- },
- {
- "id": 2,
- "name": "Isis",
- "breed": "unknown",
- "fluffiness": 5,
- "cuteness": 10
- }
-]
-```
-
-This endpoint retrieves all kittens.
-
-### HTTP Request
-
-`GET http://example.com/api/kittens`
-
-### Query Parameters
-
-Parameter | Default | Description
---------- | ------- | -----------
-include_cats | false | If set to true, the result will also include cats.
-available | true | If set to false, the result will include kittens that have already been adopted.
-
-
-
-## Get a Specific Kitten
-
-```ruby
-require 'kittn'
-
-api = Kittn::APIClient.authorize!('meowmeowmeow')
-api.kittens.get(2)
-```
-
-```python
-import kittn
-
-api = kittn.authorize('meowmeowmeow')
-api.kittens.get(2)
-```
-
-```shell
-curl "http://example.com/api/kittens/2"
- -H "Authorization: meowmeowmeow"
-```
-
-> The above command returns JSON structured like this:
-
-```json
-{
- "id": 2,
- "name": "Isis",
- "breed": "unknown",
- "fluffiness": 5,
- "cuteness": 10
-}
-```
-
-This endpoint retrieves a specific kitten.
-
-
-
-### HTTP Request
-
-`GET http://example.com/kittens/`
-
-### URL Parameters
-
-Parameter | Description
---------- | -----------
-ID | The ID of the kitten to retrieve
-
diff --git a/source/javascripts/all.js b/source/javascripts/all.js
index ffaa9b01307..5f5d4067ba6 100644
--- a/source/javascripts/all.js
+++ b/source/javascripts/all.js
@@ -1,4 +1,2 @@
-//= require ./lib/_energize
-//= require ./app/_lang
+//= require ./all_nosearch
//= require ./app/_search
-//= require ./app/_toc
diff --git a/source/javascripts/all_nosearch.js b/source/javascripts/all_nosearch.js
index 818bc4e5095..026e5a20039 100644
--- a/source/javascripts/all_nosearch.js
+++ b/source/javascripts/all_nosearch.js
@@ -1,3 +1,27 @@
//= require ./lib/_energize
-//= require ./app/_lang
+//= require ./app/_copy
//= require ./app/_toc
+//= require ./app/_lang
+
+function adjustLanguageSelectorWidth() {
+ const elem = $('.dark-box > .lang-selector');
+ elem.width(elem.parent().width());
+}
+
+$(function() {
+ loadToc($('#toc'), '.toc-link', '.toc-list-h2', 10);
+ setupLanguages($('body').data('languages'));
+ $('.content').imagesLoaded( function() {
+ window.recacheHeights();
+ window.refreshToc();
+ });
+
+ $(window).resize(function() {
+ adjustLanguageSelectorWidth();
+ });
+ adjustLanguageSelectorWidth();
+});
+
+window.onpopstate = function() {
+ activateLanguage(getLanguageFromQueryString());
+};
diff --git a/source/javascripts/app/_copy.js b/source/javascripts/app/_copy.js
new file mode 100644
index 00000000000..4dfbbb6c06d
--- /dev/null
+++ b/source/javascripts/app/_copy.js
@@ -0,0 +1,15 @@
+function copyToClipboard(container) {
+ const el = document.createElement('textarea');
+ el.value = container.textContent.replace(/\n$/, '');
+ document.body.appendChild(el);
+ el.select();
+ document.execCommand('copy');
+ document.body.removeChild(el);
+}
+
+function setupCodeCopy() {
+ $('pre.highlight').prepend('');
+ $('.copy-clipboard').on('click', function() {
+ copyToClipboard(this.parentNode.children[1]);
+ });
+}
diff --git a/source/javascripts/app/_lang.js b/source/javascripts/app/_lang.js
index 1a124bb68ae..cc5ac8b6bd8 100644
--- a/source/javascripts/app/_lang.js
+++ b/source/javascripts/app/_lang.js
@@ -1,3 +1,5 @@
+//= require ../lib/_jquery
+
/*
Copyright 2008-2013 Concur Technologies, Inc.
@@ -13,13 +15,14 @@ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
*/
-(function (global) {
+;(function () {
'use strict';
var languages = [];
- global.setupLanguages = setupLanguages;
- global.activateLanguage = activateLanguage;
+ window.setupLanguages = setupLanguages;
+ window.activateLanguage = activateLanguage;
+ window.getLanguageFromQueryString = getLanguageFromQueryString;
function activateLanguage(language) {
if (!language) return;
@@ -28,11 +31,13 @@ under the License.
$(".lang-selector a").removeClass('active');
$(".lang-selector a[data-language-name='" + language + "']").addClass('active');
for (var i=0; i < languages.length; i++) {
- $(".highlight." + languages[i]).hide();
+ $(".highlight.tab-" + languages[i]).hide();
+ $(".lang-specific." + languages[i]).hide();
}
- $(".highlight." + language).show();
+ $(".highlight.tab-" + language).show();
+ $(".lang-specific." + language).show();
- global.toc.calculateHeights();
+ window.recacheHeights();
// scroll to the new location of the position
if ($(window.location.hash).get(0)) {
@@ -93,7 +98,7 @@ under the License.
// gets the language set in the query string
function getLanguageFromQueryString() {
if (location.search.length >= 1) {
- var language = parseURL(location.search).language
+ var language = parseURL(location.search).language;
if (language) {
return language;
} else if (jQuery.inArray(location.search.substr(1), languages) != -1) {
@@ -124,11 +129,16 @@ under the License.
history.pushState({}, '', '?' + generateNewQueryString(language) + '#' + hash);
// save language as next default
- localStorage.setItem("language", language);
+ if (localStorage) {
+ localStorage.setItem("language", language);
+ }
}
function setupLanguages(l) {
- var defaultLanguage = localStorage.getItem("language");
+ var defaultLanguage = null;
+ if (localStorage) {
+ defaultLanguage = localStorage.getItem("language");
+ }
languages = l;
@@ -137,7 +147,9 @@ under the License.
// the language is in the URL, so use that language!
activateLanguage(presetLanguage);
- localStorage.setItem("language", presetLanguage);
+ if (localStorage) {
+ localStorage.setItem("language", presetLanguage);
+ }
} else if ((defaultLanguage !== null) && (jQuery.inArray(defaultLanguage, languages) != -1)) {
// the language was the last selected one saved in localstorage, so use that language!
activateLanguage(defaultLanguage);
@@ -155,8 +167,5 @@ under the License.
activateLanguage(language);
return false;
});
- window.onpopstate = function() {
- activateLanguage(getLanguageFromQueryString());
- };
});
-})(window);
+})();
diff --git a/source/javascripts/app/_search.js b/source/javascripts/app/_search.js
index 91f38a04edf..cdf6a7695f4 100644
--- a/source/javascripts/app/_search.js
+++ b/source/javascripts/app/_search.js
@@ -1,49 +1,76 @@
//= require ../lib/_lunr
+//= require ../lib/_jquery
//= require ../lib/_jquery.highlight
-(function () {
+;(function () {
'use strict';
var content, searchResults;
var highlightOpts = { element: 'span', className: 'search-highlight' };
+ var searchDelay = 0;
+ var timeoutHandle = 0;
+ var index;
- var index = new lunr.Index();
+ function populate() {
+ index = lunr(function(){
+
+ this.ref('id');
+ this.field('title', { boost: 10 });
+ this.field('body');
+ this.pipeline.add(lunr.trimmer, lunr.stopWordFilter);
+ var lunrConfig = this;
+
+ $('h1, h2', 'h3').each(function() {
+ var title = $(this);
+ var body = title.nextUntil('h1, h2', 'h3');
+ lunrConfig.add({
+ id: title.prop('id'),
+ title: title.text(),
+ body: body.text()
+ });
+ });
- index.ref('id');
- index.field('title', { boost: 10 });
- index.field('body');
- index.pipeline.add(lunr.trimmer, lunr.stopWordFilter);
+ });
+ determineSearchDelay();
+ }
$(populate);
$(bind);
- function populate() {
- $('h1, h2').each(function() {
- var title = $(this);
- var body = title.nextUntil('h1, h2');
- index.add({
- id: title.prop('id'),
- title: title.text(),
- body: body.text()
- });
- });
+ function determineSearchDelay() {
+ if (index.tokenSet.toArray().length>5000) {
+ searchDelay = 300;
+ }
}
function bind() {
content = $('.content');
searchResults = $('.search-results');
- $('#input-search').on('keyup', search);
+ $('#input-search').on('keyup',function(e) {
+ var wait = function() {
+ return function(executingFunction, waitTime){
+ clearTimeout(timeoutHandle);
+ timeoutHandle = setTimeout(executingFunction, waitTime);
+ };
+ }();
+ wait(function(){
+ search(e);
+ }, searchDelay);
+ });
}
function search(event) {
+
+ var searchInput = $('#input-search')[0];
+
unhighlight();
searchResults.addClass('visible');
// ESC clears the field
- if (event.keyCode === 27) this.value = '';
+ if (event.keyCode === 27) searchInput.value = '';
- if (this.value) {
- var results = index.search(this.value).filter(function(r) {
+ if (searchInput.value) {
+ var results = index.search(searchInput.value).filter(function(r) {
return r.score > 0.0001;
});
@@ -53,10 +80,10 @@
var elem = document.getElementById(result.ref);
searchResults.append("