mirror of
https://github.com/wassname/talk.git
synced 2026-07-07 19:58:38 +08:00
Fix merge conflicts
This commit is contained in:
-275
@@ -1,275 +0,0 @@
|
||||
## Contents
|
||||
|
||||
- [Installation](#installation) - install the application on a machine
|
||||
- [Via Docker](#installation-from-docker)
|
||||
- [Via Source](#installation-from-source)
|
||||
- [Setup](#setup) - setup the application for first use
|
||||
- [Usage](#usage) - connect the application to a website
|
||||
|
||||
# Installation
|
||||
|
||||
## Requirements
|
||||
|
||||
- Any flavour of Linux, OSX or Windows
|
||||
- 1GB memory (minimum)
|
||||
- 5GB storage (minimum)
|
||||
- [MongoDB](https://www.mongodb.com/) v3.4 or later
|
||||
- [Redis](https://redis.io/) v3.2 or later
|
||||
- SSL Certificate
|
||||
- This application assumes that you will be serving this application in a
|
||||
production environment, and therefore requires that you serve it behind a
|
||||
webserver with a valid SSL certificate. This is chosen in order to secure
|
||||
user's sessions.
|
||||
|
||||
## Installation From Docker
|
||||
|
||||
We currently support packaging the Talk application via Docker, which automates
|
||||
the dependency install and asset build process. This is the recommended way to
|
||||
deploy the application when used in production.
|
||||
|
||||
Available as [coralproject/talk](https://hub.docker.com/r/coralproject/talk/) on Docker Hub.
|
||||
|
||||
Images are tagged using the following notation:
|
||||
|
||||
- `x` (where `x` is the major version number): any minor or patch updates will be included in this. If you're ok getting
|
||||
new features occasionally and all the bug fixes, this is the tag for you.
|
||||
- `x.y` (where `y` is the minor version number): any patch updates will be
|
||||
included with this tag. If you like getting fixes and having features change
|
||||
only when you want, this is the tag for you. **(recommended)**
|
||||
- `x.y.z` (where `z` is the patch version): this tag never gets updated, and
|
||||
essentially freezes your version, this should only be used when you are either
|
||||
extending Talk or are sure of a specific version you want to freeze.
|
||||
|
||||
We provide tags with `*-onbuild` that can be used for easy plugin integration and
|
||||
acts as a customization endpoint. Instructions are provided in the `PLUGINS.md`
|
||||
document as to how to use it.
|
||||
|
||||
### Requirements
|
||||
|
||||
There are some runtime requirements for running Talk for Docker:
|
||||
|
||||
- [Docker](https://www.docker.com/) v1.13.0 or later
|
||||
- [Docker Compose](https://docs.docker.com/compose/) v1.10.0 or later
|
||||
|
||||
_Please be sure to check the versions of these requirements. Incorrect versions
|
||||
of these may lead to unexpected errors!_
|
||||
|
||||
### Installing
|
||||
|
||||
An example docker-compose.yml:
|
||||
|
||||
```yaml
|
||||
version: '2'
|
||||
services:
|
||||
talk:
|
||||
image: coralproject/talk:1.5
|
||||
restart: always
|
||||
ports:
|
||||
- "5000:5000"
|
||||
depends_on:
|
||||
- mongo
|
||||
- redis
|
||||
environment:
|
||||
- TALK_MONGO_URL=mongodb://mongo/talk
|
||||
- TALK_REDIS_URL=redis://redis
|
||||
mongo:
|
||||
image: mongo:3.2
|
||||
restart: always
|
||||
volumes:
|
||||
- mongo:/data/db
|
||||
redis:
|
||||
image: redis:3.2
|
||||
restart: always
|
||||
volumes:
|
||||
- redis:/data
|
||||
volumes:
|
||||
mongo:
|
||||
external: false
|
||||
redis:
|
||||
external: false
|
||||
```
|
||||
|
||||
At this stage, you should refer to the `README.md` for configuration variables
|
||||
that are specific to your installation. Some pre-defined fields have been filled
|
||||
in the above example which are consistent with Docker Compose naming conventions
|
||||
for [Docker Links](https://docs.docker.com/compose/networking/#links).
|
||||
|
||||
### Scaling
|
||||
|
||||
If you are interested in splitting apart services, you can simply adjust the
|
||||
command being executed in the container to optimize for your use case. An
|
||||
example would be if you wanted to run the API server and the job processor
|
||||
on different machines. You can achieve this easily with docker compose:
|
||||
|
||||
```yaml
|
||||
version: '2'
|
||||
services:
|
||||
talk-api:
|
||||
image: coralproject/talk:1.5
|
||||
command: cli serve
|
||||
restart: always
|
||||
ports:
|
||||
- "5000:5000"
|
||||
depends_on:
|
||||
- mongo
|
||||
- redis
|
||||
environment:
|
||||
- TALK_MONGO_URL=mongodb://mongo/talk
|
||||
- TALK_REDIS_URL=redis://redis
|
||||
talk-jobs:
|
||||
image: coralproject/talk:1.5
|
||||
command: cli jobs process
|
||||
restart: always
|
||||
ports:
|
||||
- "5001:5000"
|
||||
depends_on:
|
||||
- mongo
|
||||
- redis
|
||||
environment:
|
||||
- TALK_MONGO_URL=mongodb://mongo/talk
|
||||
- TALK_REDIS_URL=redis://redis
|
||||
mongo:
|
||||
image: mongo:3.2
|
||||
restart: always
|
||||
volumes:
|
||||
- mongo:/data/db
|
||||
redis:
|
||||
image: redis:3.2
|
||||
restart: always
|
||||
volumes:
|
||||
- redis:/data
|
||||
volumes:
|
||||
mongo:
|
||||
external: false
|
||||
redis:
|
||||
external: false
|
||||
```
|
||||
|
||||
Note that the only difference is in the `command` key. From this, you are able
|
||||
to discretely control which modules are running in order to have the maximum
|
||||
flexibility when managing your application.
|
||||
|
||||
### Running
|
||||
|
||||
If you're using docker compose:
|
||||
|
||||
```bash
|
||||
# Start the services using compose
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
If you're using plain docker:
|
||||
|
||||
```bash
|
||||
docker run -d -P coralproject/talk:latest
|
||||
```
|
||||
|
||||
## Installation From Source
|
||||
|
||||
This provides information on how to setup the application from source. Note that
|
||||
this is not recommended for production deploys, but will work for development
|
||||
and testing purposes.
|
||||
|
||||
### Requirements
|
||||
|
||||
There are some runtime requirements for running Talk from source:
|
||||
|
||||
- [Node](https://nodejs.org/) ~7.8
|
||||
- [Yarn](https://yarnpkg.com/) ^0.22.0
|
||||
|
||||
_Please be sure to check the versions of these requirements. Incorrect versions
|
||||
of these may lead to unexpected errors!_
|
||||
|
||||
### Installing
|
||||
|
||||
#### Download
|
||||
|
||||
It is highly recommended that you download a released version as the code
|
||||
available in `master` may not be stable. You can download the latest release
|
||||
from the [releases page](https://github.com/coralproject/talk/releases).
|
||||
|
||||
You can also clone the git repository via:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/coralproject/talk.git
|
||||
```
|
||||
|
||||
#### Building
|
||||
|
||||
We now have to install the dependencies and build the static assets.
|
||||
|
||||
```bash
|
||||
# Install package dependancies
|
||||
yarn
|
||||
|
||||
# Build static files
|
||||
yarn build
|
||||
```
|
||||
|
||||
After you create/modify the `plugins.json` (refer to `PLUGINS.md` for plugin
|
||||
docs) file, you can re-run the following to install their dependencies:
|
||||
|
||||
```bash
|
||||
# Reconcile plugins
|
||||
./bin/cli plugins reconcile
|
||||
|
||||
# Build static files
|
||||
yarn build
|
||||
```
|
||||
|
||||
### Running
|
||||
|
||||
Refer to the `README.md` file for required configuration variables to add to the
|
||||
environment.
|
||||
|
||||
You can start the server after configuring the server using the command:
|
||||
|
||||
```bash
|
||||
yarn start
|
||||
```
|
||||
|
||||
This will setup the server to serve everything on a single node.js process and
|
||||
is designed to be used in production.
|
||||
|
||||
You can see other scripts we've made available by consulting the `package.json`
|
||||
file under the `scripts` key including:
|
||||
|
||||
- `yarn test` run unit tests
|
||||
- `yarn e2e` run end to end tests
|
||||
- `yarn build-watch` watch for changes to client files and build static assets
|
||||
- `yarn dev-start` watch for changes to server files and reload the server while
|
||||
also sourcing a `.env` file in your local directory for configuration
|
||||
|
||||
# Setup
|
||||
|
||||
Once you've installed Talk (either via Docker or source), you still need to
|
||||
setup the application. If you are unfamiliar with any terminology used in the
|
||||
setup process, refer to the `TERMINOLOGY.md` document.
|
||||
|
||||
## Via Web
|
||||
|
||||
If you want to perform your setup via the web, you can navigate to your
|
||||
installation of Talk at the path `/admin/install`. There you will be asked a
|
||||
series of questions for your installation.
|
||||
|
||||
## Via CLI
|
||||
|
||||
If you want to perform your setup through the terminal, you can simply run:
|
||||
|
||||
```bash
|
||||
cli setup
|
||||
```
|
||||
|
||||
And follow the instructions to perform initial setup and create your first user
|
||||
account.
|
||||
|
||||
|
||||
# Usage
|
||||
|
||||
After setup is complete, you can then refer to the `/admin/configure` path to
|
||||
get the embed code that you can copy/paste onto your blog or website in order to
|
||||
start using Talk.
|
||||
|
||||
_In order for the embed to work correctly, you will need to whitelist the domain
|
||||
that is allowed to embed your site on the `/admin/configure` page, failure to do
|
||||
so will result in the comment stream not loading._
|
||||
@@ -1,3 +0,0 @@
|
||||
# Talk Plugins
|
||||
|
||||
Our documentation for Talk has moved! Utilize [this hyperlink](https://coralproject.github.io/talk/plugins.html) via click or tap to navigate your browser to the new location!
|
||||
@@ -5,106 +5,9 @@ Online comments are broken. Our open-source Talk tool rethinks how moderation, c
|
||||
Third party licenses are available via the `/client/3rdpartylicenses.txt`
|
||||
endpoint when the server is running with built assets.
|
||||
|
||||
## Contributing to Talk
|
||||
|
||||
See our [Contribution Guide](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md).
|
||||
|
||||
## Documentation
|
||||
|
||||
### General
|
||||
|
||||
See our [Talk Documentation & Guides](https://coralproject.github.io/talk/index.html).
|
||||
|
||||
### Plugins
|
||||
|
||||
See our guide to using and building [Talk Plugins](https://github.com/coralproject/talk/blob/master/PLUGINS.md).
|
||||
|
||||
### Recipes
|
||||
|
||||
Recipes are plugin templates provided by the Coral Core team. Developers can use these recipes to build their own plugins. You can find all the Talk recipes here: https://github.com/coralproject/talk-recipes/
|
||||
|
||||
## Usage
|
||||
|
||||
### Installation
|
||||
|
||||
To set up a development environment or build from source, see [INSTALL.md](https://github.com/coralproject/talk/blob/master/INSTALL.md).
|
||||
|
||||
To launch a Talk server of your own from your browser without any need to muck about in a terminal or think about engineering concepts, stay tuned. We will launch [our installer](https://github.com/coralproject/talk-install) shortly!
|
||||
|
||||
### Configuration
|
||||
|
||||
The Talk application looks for the following configuration values either as environment variables:
|
||||
|
||||
- `TALK_MONGO_URL` (*required*) - the database connection string for the MongoDB database.
|
||||
- `TALK_REDIS_URL` (*required*) - the database connection string for the Redis database.
|
||||
- `TALK_ROOT_URL` (*required*) - root url of the installed application externally
|
||||
available in the format: `<scheme>://<host>` without the path.
|
||||
- `TALK_JWT_SECRET` (*required*) - a long and cryptographical secure random string which will be used to
|
||||
sign and verify tokens via a `HS256` algorithm.
|
||||
- `TALK_JWT_EXPIRY` (_optional_) - the expiry duration (`exp`) for the tokens issued for logged in sessions (Default `1 day`)
|
||||
- `TALK_JWT_ISSUER` (_optional_) - the issuer (`iss`) claim for login JWT tokens (Default `process.env.TALK_ROOT_URL`)
|
||||
- `TALK_JWT_AUDIENCE` (_optional_) - the audience (`aud`) claim for login JWT tokens (Default `talk`)
|
||||
- `TALK_SMTP_EMAIL` (*required for email*) - the address to send emails from using the
|
||||
SMTP provider.
|
||||
- `TALK_SMTP_USERNAME` (*required for email*) - username of the SMTP provider you are using.
|
||||
- `TALK_SMTP_PASSWORD` (*required for email*) - password for the SMTP provider you are using.
|
||||
- `TALK_SMTP_HOST` (*required for email*) - SMTP host url with format `smtp.domain.com`.
|
||||
- `TALK_SMTP_PORT` (*required for email*) - SMTP port.
|
||||
- `TALK_INSTALL_LOCK` (_optional for dynamic setup_) - When `TRUE`, disables the dynamic setup endpoint. (Default `FALSE`)
|
||||
- `TALK_RECAPTCHA_SECRET` (*required for reCAPTCHA support*) - server secret used for enabling reCAPTCHA powered logins. If not provided it will instead default to providing only a time based lockout.
|
||||
- `TALK_RECAPTCHA_PUBLIC` (*required for reCAPTCHA support*) - client secret used for enabling reCAPTCHA powered logins. If not provided it will instead default to providing only a time based lockout.
|
||||
- `TALK_PLUGINS_JSON` (_optional_) - used to specify the plugin config via the environment
|
||||
- `TALK_KEEP_ALIVE` (_optional_) - The keepalive timeout that should be used to send keep alive messages through the websocket to keep the socket alive. (Default `30s`)
|
||||
- `TALK_DISABLE_AUTOFLAG_SUSPECT_WORDS` (_optional_) When `TRUE`, disables flagging of comments that match the suspect word filter. (Default `FALSE`)
|
||||
|
||||
Refer to the wiki page on [Configuration Loading](https://github.com/coralproject/talk/wiki/Configuration-Loading) for
|
||||
alternative methods of loading configuration during development.
|
||||
|
||||
### Running Migrations
|
||||
|
||||
We have a migration tool that can be run using `bin/cli migration run`. This will detect new migrations available and prompt you to backup your database before proceeding with the migration. Migrations are required with major version releases.
|
||||
|
||||
### Using Trust
|
||||
|
||||
Talk ships with core components we call "Trust". This allows Talk to automate certain actions based on previous user behavior.
|
||||
|
||||
Our first feature is the notion of Karma. Talk will automatically pre-moderate comments of users who have a negative karma score. You can [see more how karma works here](/services/karma.js).
|
||||
|
||||
## Supported Browsers
|
||||
|
||||
### Web
|
||||
|
||||
- Chrome: latest 2 versions
|
||||
- Firefox: latest 2 versions, and most recent extended support version, if any
|
||||
- Safari: latest 2 versions
|
||||
- Internet Explorer: IE Edge, 11
|
||||
|
||||
### iOS Devices
|
||||
|
||||
- iPad
|
||||
- iPad Pro
|
||||
- iPhone 7 Plus
|
||||
- iPhone 7
|
||||
- iPhone 6 Plus
|
||||
- iPhone 6
|
||||
- iPhone 5
|
||||
|
||||
### iOS Browsers
|
||||
|
||||
- Chrome for iOS: latest version
|
||||
- Firefox for iOS: latest version
|
||||
- Safari for iOS: latest version
|
||||
|
||||
### Android Devices
|
||||
|
||||
- Galaxy S5
|
||||
- Nexus 5X
|
||||
- Nexus 6P
|
||||
|
||||
### Android Browsers
|
||||
|
||||
- Chrome for Android: latest version
|
||||
- Firefox for Android: latest version
|
||||
See our [Talk Documentation & Guides](https://coralproject.github.io/talk/).
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
# Product's Terminology
|
||||
|
||||
This is a guide to have a common language to talk about "Talk".
|
||||
|
||||
## Definitions
|
||||
|
||||
* Site - a top level site, aka nytimes.com
|
||||
* Section - the section of a site, aka, Politics.
|
||||
* Subsection - the section of a site, aka, Politics.
|
||||
* Asset - An article/video/etc identified by URL.
|
||||
|
||||
* Embed - Things we put on a asset: comment box, ToS, Stream, etc…
|
||||
* Stream - All the activity on a certain asset. Container for Comments, actions, user
|
||||
* Thread - defined by a parent and everything below. All replies to a comment and their replies, etc…
|
||||
* Comment - a kind of user-generated content submitted by a comment author
|
||||
* A parent comment has replies to it
|
||||
* A child comments is a reply to another comment
|
||||
* A comment can be both a parent comment and a child of another comment
|
||||
* A top-level comment is a comment that is not a reply to any other comment
|
||||
* A nth-level comment refers to the number of replies away from the top-level comment
|
||||
|
||||
* User - an item to represent a person using Talk. It could be a moderator, reader, etc.
|
||||
* User Roles:
|
||||
* Active: some who takes action (logged in or not)
|
||||
* Passive: some who just reads, no actions performed
|
||||
* Comment Author: The user who wrote the comment
|
||||
* Staff Member: someone who works for an organization (tagged for leverage in trust)
|
||||
* Moderator: someone with the ability to access the moderation queue and perform moderation actions
|
||||
* Administrator: has the ability to change the setup of their coral space
|
||||
* Public Profile: information about users shown in public
|
||||
* Private Profile: information about users shown only to user about themselves
|
||||
* Protected Profile: information about users that only moderators and admins can see
|
||||
|
||||
* Queue - Group of items based on a query, aka - moderation queue
|
||||
* Target - The item/s on which an action is performed
|
||||
|
||||
## Actions
|
||||
|
||||
Actions are performed by users on items. Actions themselves are items. This requires two relationships: action on item, and user performs action.
|
||||
|
||||
### Flag
|
||||
* A Flagger(user) performs a Flag
|
||||
* A Flag is performed on a Comment or a username or profile content
|
||||
|
||||
|
||||
## Moderation Actions and Status
|
||||
|
||||
Comments contain a field `status`. As moderation actions are peformed, the status changes.
|
||||
|
||||
* Initial status is empty.
|
||||
* When a moderator Approves, the status is set to 'approved'.
|
||||
* When a moderator Rejects, the status is set to 'reject'.
|
||||
|
||||
### Pre and post moderation
|
||||
|
||||
Comments can be set to be premoderated or postmoderated.
|
||||
|
||||
Premoderation means that moderation has to occur _before_ a comment is shown on the site:
|
||||
|
||||
* New comments are shown in the moderator queues immediately.
|
||||
* The are not shown to users until (aka in streams) until they are approved by a moderator.
|
||||
|
||||
Postmoderation means that comments appear on the site _before_ any moderation action is taken.
|
||||
|
||||
* New comments appear in comment streams immediately.
|
||||
* New comments do not appear in moderation queues unless they are flagged by other users.
|
||||
|
||||
### Word lists
|
||||
|
||||
* Banned words - words that the site never allows in a comment
|
||||
* Suspect words - words whose usage needs to be approved by a moderator before being shown in the stream
|
||||
* Approved words - words that are usually Banned or Suspect sitewide, but approved for use in a specific article stream
|
||||
|
||||
@@ -125,6 +125,12 @@ if (process.env.NODE_ENV === 'test' && !CONFIG.JWT_SECRET) {
|
||||
);
|
||||
}
|
||||
|
||||
// If this is not employing a HMAC based signing method, then we need to turn
|
||||
// the secret into a buffer.
|
||||
if (!CONFIG.JWT_ALG.startsWith('HS')) {
|
||||
CONFIG.JWT_SECRET = Buffer.from(CONFIG.JWT_SECRET);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// External database url's
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
Vendored
-6
@@ -1,6 +0,0 @@
|
||||
// Place your settings in this file to overwrite default and user settings.
|
||||
{
|
||||
"files.associations": {
|
||||
"*.html": "liquid"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Page Not Found"
|
||||
search: exclude
|
||||
---
|
||||
|
||||
Sorry, but the page you were trying to view does not exist. Try searching for it or looking at the URL to see if it looks correct.
|
||||
@@ -1,26 +0,0 @@
|
||||
FROM ruby:2.1
|
||||
MAINTAINER mrafayaleem@gmail.com
|
||||
|
||||
RUN apt-get clean \
|
||||
&& mv /var/lib/apt/lists /var/lib/apt/lists.broke \
|
||||
&& mkdir -p /var/lib/apt/lists/partial
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
RUN apt-get install -y \
|
||||
node \
|
||||
python-pygments \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/
|
||||
|
||||
WORKDIR /tmp
|
||||
ADD Gemfile /tmp/
|
||||
ADD Gemfile.lock /tmp/
|
||||
RUN bundle install
|
||||
|
||||
VOLUME /src
|
||||
EXPOSE 4000
|
||||
|
||||
WORKDIR /src
|
||||
ENTRYPOINT ["jekyll"]
|
||||
|
||||
Regular → Executable
+9
-2
@@ -1,4 +1,11 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem 'github-pages', group: :jekyll_plugins
|
||||
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
|
||||
gem "github-pages", group: :jekyll_plugins
|
||||
|
||||
group :jekyll_plugins do
|
||||
gem "jekyll-paginate"
|
||||
gem "jekyll-sitemap"
|
||||
gem "jekyll-gist"
|
||||
gem "jekyll-feed"
|
||||
gem "jemoji"
|
||||
end
|
||||
+35
-26
@@ -11,7 +11,7 @@ GEM
|
||||
coffee-script (2.4.1)
|
||||
coffee-script-source
|
||||
execjs
|
||||
coffee-script-source (1.12.2)
|
||||
coffee-script-source (1.11.1)
|
||||
colorator (1.1.0)
|
||||
ethon (0.10.1)
|
||||
ffi (>= 1.3.0)
|
||||
@@ -21,22 +21,22 @@ GEM
|
||||
ffi (1.9.18)
|
||||
forwardable-extended (2.6.0)
|
||||
gemoji (3.0.0)
|
||||
github-pages (138)
|
||||
github-pages (145)
|
||||
activesupport (= 4.2.8)
|
||||
github-pages-health-check (= 1.3.3)
|
||||
jekyll (= 3.4.3)
|
||||
github-pages-health-check (= 1.3.4)
|
||||
jekyll (= 3.4.5)
|
||||
jekyll-avatar (= 0.4.2)
|
||||
jekyll-coffeescript (= 1.0.1)
|
||||
jekyll-default-layout (= 0.1.4)
|
||||
jekyll-feed (= 0.9.2)
|
||||
jekyll-gist (= 1.4.0)
|
||||
jekyll-github-metadata (= 2.3.1)
|
||||
jekyll-github-metadata (= 2.5.1)
|
||||
jekyll-mentions (= 1.2.0)
|
||||
jekyll-optional-front-matter (= 0.1.2)
|
||||
jekyll-optional-front-matter (= 0.2.0)
|
||||
jekyll-paginate (= 1.1.0)
|
||||
jekyll-readme-index (= 0.1.0)
|
||||
jekyll-redirect-from (= 0.12.1)
|
||||
jekyll-relative-links (= 0.4.0)
|
||||
jekyll-relative-links (= 0.4.1)
|
||||
jekyll-sass-converter (= 1.5.0)
|
||||
jekyll-seo-tag (= 2.2.3)
|
||||
jekyll-sitemap (= 1.0.0)
|
||||
@@ -50,11 +50,11 @@ GEM
|
||||
jekyll-theme-midnight (= 0.0.4)
|
||||
jekyll-theme-minimal (= 0.0.4)
|
||||
jekyll-theme-modernist (= 0.0.4)
|
||||
jekyll-theme-primer (= 0.1.8)
|
||||
jekyll-theme-primer (= 0.3.1)
|
||||
jekyll-theme-slate (= 0.0.4)
|
||||
jekyll-theme-tactile (= 0.0.4)
|
||||
jekyll-theme-time-machine (= 0.0.4)
|
||||
jekyll-titles-from-headings (= 0.1.5)
|
||||
jekyll-titles-from-headings (= 0.2.0)
|
||||
jemoji (= 0.8.0)
|
||||
kramdown (= 1.13.2)
|
||||
liquid (= 3.0.6)
|
||||
@@ -63,7 +63,7 @@ GEM
|
||||
minima (= 2.1.1)
|
||||
rouge (= 1.11.1)
|
||||
terminal-table (~> 1.4)
|
||||
github-pages-health-check (1.3.3)
|
||||
github-pages-health-check (1.3.4)
|
||||
addressable (~> 2.3)
|
||||
net-dns (~> 0.8)
|
||||
octokit (~> 4.0)
|
||||
@@ -72,8 +72,8 @@ GEM
|
||||
html-pipeline (2.6.0)
|
||||
activesupport (>= 2)
|
||||
nokogiri (>= 1.4)
|
||||
i18n (0.8.1)
|
||||
jekyll (3.4.3)
|
||||
i18n (0.8.6)
|
||||
jekyll (3.4.5)
|
||||
addressable (~> 2.4)
|
||||
colorator (~> 1.0)
|
||||
jekyll-sass-converter (~> 1.0)
|
||||
@@ -94,21 +94,21 @@ GEM
|
||||
jekyll (~> 3.3)
|
||||
jekyll-gist (1.4.0)
|
||||
octokit (~> 4.2)
|
||||
jekyll-github-metadata (2.3.1)
|
||||
jekyll-github-metadata (2.5.1)
|
||||
jekyll (~> 3.1)
|
||||
octokit (~> 4.0, != 4.4.0)
|
||||
jekyll-mentions (1.2.0)
|
||||
activesupport (~> 4.0)
|
||||
html-pipeline (~> 2.3)
|
||||
jekyll (~> 3.0)
|
||||
jekyll-optional-front-matter (0.1.2)
|
||||
jekyll-optional-front-matter (0.2.0)
|
||||
jekyll (~> 3.0)
|
||||
jekyll-paginate (1.1.0)
|
||||
jekyll-readme-index (0.1.0)
|
||||
jekyll (~> 3.0)
|
||||
jekyll-redirect-from (0.12.1)
|
||||
jekyll (~> 3.3)
|
||||
jekyll-relative-links (0.4.0)
|
||||
jekyll-relative-links (0.4.1)
|
||||
jekyll (~> 3.3)
|
||||
jekyll-sass-converter (1.5.0)
|
||||
sass (~> 3.4)
|
||||
@@ -135,7 +135,7 @@ GEM
|
||||
jekyll (~> 3.3)
|
||||
jekyll-theme-modernist (0.0.4)
|
||||
jekyll (~> 3.3)
|
||||
jekyll-theme-primer (0.1.8)
|
||||
jekyll-theme-primer (0.3.1)
|
||||
jekyll (~> 3.3)
|
||||
jekyll-theme-slate (0.0.4)
|
||||
jekyll (~> 3.3)
|
||||
@@ -143,7 +143,7 @@ GEM
|
||||
jekyll (~> 3.3)
|
||||
jekyll-theme-time-machine (0.0.4)
|
||||
jekyll (~> 3.3)
|
||||
jekyll-titles-from-headings (0.1.5)
|
||||
jekyll-titles-from-headings (0.2.0)
|
||||
jekyll (~> 3.3)
|
||||
jekyll-watch (1.5.0)
|
||||
listen (~> 3.0, < 3.1)
|
||||
@@ -158,25 +158,29 @@ GEM
|
||||
rb-fsevent (>= 0.9.3)
|
||||
rb-inotify (>= 0.9.7)
|
||||
mercenary (0.3.6)
|
||||
mini_portile2 (2.1.0)
|
||||
mini_portile2 (2.2.0)
|
||||
minima (2.1.1)
|
||||
jekyll (~> 3.3)
|
||||
minitest (5.10.2)
|
||||
multipart-post (2.0.0)
|
||||
net-dns (0.8.0)
|
||||
nokogiri (1.6.8.1)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
nokogiri (1.8.0)
|
||||
mini_portile2 (~> 2.2.0)
|
||||
octokit (4.7.0)
|
||||
sawyer (~> 0.8.0, >= 0.5.3)
|
||||
pathutil (0.14.0)
|
||||
forwardable-extended (~> 2.6)
|
||||
public_suffix (2.0.5)
|
||||
rb-fsevent (0.9.8)
|
||||
rb-inotify (0.9.8)
|
||||
ffi (>= 0.5.0)
|
||||
rb-fsevent (0.10.2)
|
||||
rb-inotify (0.9.10)
|
||||
ffi (>= 0.5.0, < 2)
|
||||
rouge (1.11.1)
|
||||
safe_yaml (1.0.4)
|
||||
sass (3.4.24)
|
||||
sass (3.5.1)
|
||||
sass-listen (~> 4.0.0)
|
||||
sass-listen (4.0.0)
|
||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||
rb-inotify (~> 0.9, >= 0.9.7)
|
||||
sawyer (0.8.1)
|
||||
addressable (>= 2.3.5, < 2.6)
|
||||
faraday (~> 0.8, < 1.0)
|
||||
@@ -187,13 +191,18 @@ GEM
|
||||
ethon (>= 0.8.0)
|
||||
tzinfo (1.2.3)
|
||||
thread_safe (~> 0.1)
|
||||
unicode-display_width (1.2.1)
|
||||
unicode-display_width (1.3.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
github-pages
|
||||
jekyll-feed
|
||||
jekyll-gist
|
||||
jekyll-paginate
|
||||
jekyll-sitemap
|
||||
jemoji
|
||||
|
||||
BUNDLED WITH
|
||||
1.15.0
|
||||
1.15.2
|
||||
|
||||
Regular → Executable
+2
-2
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Tom Johnson
|
||||
Copyright (c) 2017 Michael Rose
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,9 @@
|
||||
# Coral Talk Documentation
|
||||
|
||||
To preview the documentation, run:
|
||||
|
||||
```bash
|
||||
docker run --rm --volume=$PWD:/srv/jekyll -p 127.0.0.1:4000:4000 -it jekyll/jekyll:pages jekyll serve
|
||||
```
|
||||
|
||||
From the `docs` directory. Then visit: [http://127.0.0.1:4000/talk/](http://127.0.0.1:4000/talk/).
|
||||
Executable
+75
@@ -0,0 +1,75 @@
|
||||
require "bundler/gem_tasks"
|
||||
require "jekyll"
|
||||
require "listen"
|
||||
|
||||
def listen_ignore_paths(base, options)
|
||||
[
|
||||
/_config\.ya?ml/,
|
||||
/_site/,
|
||||
/\.jekyll-metadata/
|
||||
]
|
||||
end
|
||||
|
||||
def listen_handler(base, options)
|
||||
site = Jekyll::Site.new(options)
|
||||
Jekyll::Command.process_site(site)
|
||||
proc do |modified, added, removed|
|
||||
t = Time.now
|
||||
c = modified + added + removed
|
||||
n = c.length
|
||||
relative_paths = c.map{ |p| Pathname.new(p).relative_path_from(base).to_s }
|
||||
print Jekyll.logger.message("Regenerating:", "#{relative_paths.join(", ")} changed... ")
|
||||
begin
|
||||
Jekyll::Command.process_site(site)
|
||||
puts "regenerated in #{Time.now - t} seconds."
|
||||
rescue => e
|
||||
puts "error:"
|
||||
Jekyll.logger.warn "Error:", e.message
|
||||
Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
task :preview do
|
||||
base = Pathname.new('.').expand_path
|
||||
options = {
|
||||
"source" => base.join('test').to_s,
|
||||
"destination" => base.join('test/_site').to_s,
|
||||
"force_polling" => false,
|
||||
"serving" => true,
|
||||
"theme" => "minimal-mistakes-jekyll"
|
||||
}
|
||||
|
||||
options = Jekyll.configuration(options)
|
||||
|
||||
ENV["LISTEN_GEM_DEBUGGING"] = "1"
|
||||
listener = Listen.to(
|
||||
base.join("_includes"),
|
||||
base.join("_layouts"),
|
||||
base.join("_sass"),
|
||||
base.join("assets"),
|
||||
options["source"],
|
||||
:ignore => listen_ignore_paths(base, options),
|
||||
:force_polling => options['force_polling'],
|
||||
&(listen_handler(base, options))
|
||||
)
|
||||
|
||||
begin
|
||||
listener.start
|
||||
Jekyll.logger.info "Auto-regeneration:", "enabled for '#{options["source"]}'"
|
||||
|
||||
unless options['serving']
|
||||
trap("INT") do
|
||||
listener.stop
|
||||
puts " Halting auto-regeneration."
|
||||
exit 0
|
||||
end
|
||||
|
||||
loop { sleep 1000 }
|
||||
end
|
||||
rescue ThreadError
|
||||
# You pressed Ctrl-C, oh my!
|
||||
end
|
||||
|
||||
Jekyll::Commands::Serve.process(options)
|
||||
end
|
||||
Regular → Executable
+232
-82
@@ -1,102 +1,252 @@
|
||||
repository: coralproject/talk
|
||||
# Welcome to Jekyll!
|
||||
#
|
||||
# This config file is meant for settings that affect your entire site, values
|
||||
# which you are expected to set up once and rarely need to edit after that.
|
||||
# For technical reasons, this file is *NOT* reloaded automatically when you use
|
||||
# `jekyll serve`. If you change this file, please restart the server process.
|
||||
|
||||
output: web
|
||||
# this property is useful for conditional filtering of content that is separate from the PDF.
|
||||
# Site Settings
|
||||
locale : "en"
|
||||
title : "Coral Talk Documentation"
|
||||
title_separator : "-"
|
||||
name : "The Coral Project"
|
||||
description : "Documentation and guides for Coral Talk."
|
||||
url : https://coralproject.github.io # the base hostname & protocol for your site e.g. "https://mmistakes.github.io"
|
||||
baseurl : /talk # the subpath of your site, e.g. "/blog"
|
||||
repository : "coralproject/talk" # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes"
|
||||
teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png"
|
||||
# breadcrumbs : false # true, false (default)
|
||||
words_per_minute : 200
|
||||
comments:
|
||||
provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "custom"
|
||||
disqus:
|
||||
shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-
|
||||
discourse:
|
||||
server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org
|
||||
facebook:
|
||||
# https://developers.facebook.com/docs/plugins/comments
|
||||
appid :
|
||||
num_posts : # 5 (default)
|
||||
colorscheme : # "light" (default), "dark"
|
||||
staticman:
|
||||
allowedFields : ['name', 'email', 'url', 'message']
|
||||
branch : "master"
|
||||
commitMessage : "New comment."
|
||||
filename : comment-{@timestamp}
|
||||
format : "yml"
|
||||
moderation : true
|
||||
path : "docs/_data/comments/{options.slug}" # "/_data/comments/{options.slug}" (default)
|
||||
requiredFields : ['name', 'email', 'message']
|
||||
transforms:
|
||||
email : "md5"
|
||||
generatedFields:
|
||||
date:
|
||||
type : "date"
|
||||
options:
|
||||
format : "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds"
|
||||
atom_feed:
|
||||
path : # blank (default) uses feed.xml
|
||||
|
||||
topnav_title: Coral Talk Documentation
|
||||
# this appears on the top navigation bar next to the home button
|
||||
# SEO Related
|
||||
google_site_verification :
|
||||
bing_site_verification :
|
||||
alexa_site_verification :
|
||||
yandex_site_verification :
|
||||
|
||||
site_title: Coral Talk Documentation
|
||||
# this appears in the html browser tab for the site title (seen mostly by search engines, not users)
|
||||
# Social Sharing
|
||||
twitter:
|
||||
username :
|
||||
facebook:
|
||||
username :
|
||||
app_id :
|
||||
publisher :
|
||||
og_image : # Open Graph/Twitter default site image
|
||||
# For specifying social profiles
|
||||
# - https://developers.google.com/structured-data/customize/social-profiles
|
||||
social:
|
||||
type : # Person or Organization (defaults to Person)
|
||||
name : # If the user or organization name differs from the site's name
|
||||
links: # An array of links to social media profiles
|
||||
|
||||
company_name: The Coral Project
|
||||
# this appears in the footer
|
||||
# Analytics
|
||||
analytics:
|
||||
provider : false # false (default), "google", "google-universal", "custom"
|
||||
google:
|
||||
tracking_id :
|
||||
|
||||
github_editme_path:
|
||||
# if you're using Github, provide the basepath to the branch you've created for reviews, following the sample here. if not, leave this value blank.
|
||||
|
||||
disqus_shortname:
|
||||
# if you're using disqus for comments, add the shortname here. if not, leave this value blank.
|
||||
# Site Author
|
||||
author:
|
||||
name : "Your Name"
|
||||
avatar : # path of avatar image, e.g. "/assets/images/bio-photo.jpg"
|
||||
bio : "I am an amazing person."
|
||||
location : "Somewhere"
|
||||
email :
|
||||
uri :
|
||||
bitbucket :
|
||||
codepen :
|
||||
dribbble :
|
||||
flickr :
|
||||
facebook :
|
||||
foursquare :
|
||||
github :
|
||||
gitlab :
|
||||
google_plus :
|
||||
keybase :
|
||||
instagram :
|
||||
lastfm :
|
||||
linkedin :
|
||||
pinterest :
|
||||
soundcloud :
|
||||
stackoverflow : # "123456/username" (the last part of your profile url, e.g. http://stackoverflow.com/users/123456/username)
|
||||
steam :
|
||||
tumblr :
|
||||
twitter :
|
||||
vine :
|
||||
weibo :
|
||||
xing :
|
||||
youtube : # "https://youtube.com/c/MichaelRoseDesign"
|
||||
|
||||
host: 127.0.0.1
|
||||
# the preview server used. Leave as is.
|
||||
|
||||
port: 4000
|
||||
# the port where the preview is rendered. You can leave this as is unless you have other Jekyll builds using this same port that might cause conflicts. in that case, use another port such as 4006.
|
||||
|
||||
# Reading Files
|
||||
include:
|
||||
- .htaccess
|
||||
- swagger.yml
|
||||
- _pages
|
||||
exclude:
|
||||
- .idea/
|
||||
- .gitignore
|
||||
# these are the files and directories that jekyll will exclude from the build
|
||||
- "*.sublime-project"
|
||||
- "*.sublime-workspace"
|
||||
- vendor
|
||||
- .asset-cache
|
||||
- .bundle
|
||||
- .jekyll-assets-cache
|
||||
- .sass-cache
|
||||
- assets/js/plugins
|
||||
- assets/js/_main.js
|
||||
- assets/js/vendor
|
||||
- Capfile
|
||||
- CHANGELOG
|
||||
- config
|
||||
- Gemfile
|
||||
- Gruntfile.js
|
||||
- gulpfile.js
|
||||
- LICENSE
|
||||
- log
|
||||
- node_modules
|
||||
- package.json
|
||||
- Rakefile
|
||||
- README.md
|
||||
- tmp
|
||||
keep_files:
|
||||
- .git
|
||||
- .svn
|
||||
encoding: "utf-8"
|
||||
markdown_ext: "markdown,mkdown,mkdn,mkd,md"
|
||||
|
||||
feedback_subject_line:
|
||||
|
||||
feedback_email:
|
||||
# used as a contact email for the Feedback link in the top navigation bar
|
||||
|
||||
feedback_disable: true
|
||||
# if you uncomment the previous line, the Feedback link gets removed
|
||||
|
||||
# feedback_text: "Need help?"
|
||||
# if you uncomment the previous line, it changes the Feedback text
|
||||
|
||||
# feedback_link: "http://helpy.io/"
|
||||
# if you uncomment the previous line, it changes where the feedback link points to
|
||||
|
||||
highlighter: rouge
|
||||
# library used for syntax highlighting
|
||||
|
||||
# Conversion
|
||||
markdown: kramdown
|
||||
highlighter: rouge
|
||||
lsi: false
|
||||
excerpt_separator: "\n\n"
|
||||
incremental: false
|
||||
|
||||
|
||||
# Markdown Processing
|
||||
kramdown:
|
||||
input: GFM
|
||||
auto_ids: true
|
||||
hard_wrap: false
|
||||
syntax_highlighter: rouge
|
||||
input: GFM
|
||||
hard_wrap: false
|
||||
auto_ids: true
|
||||
footnote_nr: 1
|
||||
entity_output: as_char
|
||||
toc_levels: 1..6
|
||||
smart_quotes: lsquo,rsquo,ldquo,rdquo
|
||||
enable_coderay: false
|
||||
|
||||
# filter used to process markdown. note that kramdown differs from github-flavored markdown in some subtle ways
|
||||
|
||||
# Sass/SCSS
|
||||
sass:
|
||||
sass_dir: _sass
|
||||
style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
|
||||
|
||||
|
||||
# Outputting
|
||||
permalink: /:categories/:title/
|
||||
paginate: 5 # amount of posts to show
|
||||
paginate_path: /page:num/
|
||||
timezone: # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
|
||||
|
||||
# Plugins (previously gems:)
|
||||
plugins:
|
||||
- jekyll-paginate
|
||||
- jekyll-sitemap
|
||||
- jekyll-gist
|
||||
- jekyll-feed
|
||||
- jemoji
|
||||
|
||||
# mimic GitHub Pages with --safe
|
||||
whitelist:
|
||||
- jekyll-paginate
|
||||
- jekyll-sitemap
|
||||
- jekyll-gist
|
||||
- jekyll-feed
|
||||
- jemoji
|
||||
|
||||
|
||||
# Archives
|
||||
# Type
|
||||
# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default)
|
||||
# - Jekyll Archives plugin archive pages ~> type: jekyll-archives
|
||||
# Path (examples)
|
||||
# - Archive page should exist at path when using Liquid method or you can
|
||||
# expect broken links (especially with breadcrumbs enabled)
|
||||
# - <base_path>/tags/my-awesome-tag/index.html ~> path: /tags/
|
||||
# - <base_path/categories/my-awesome-category/index.html ~> path: /categories/
|
||||
# - <base_path/my-awesome-category/index.html ~> path: /
|
||||
# category_archive:
|
||||
# type: liquid
|
||||
# path: /categories/
|
||||
# tag_archive:
|
||||
# type: liquid
|
||||
# path: /tags/
|
||||
# https://github.com/jekyll/jekyll-archives
|
||||
# jekyll-archives:
|
||||
# enabled:
|
||||
# - categories
|
||||
# - tags
|
||||
# layouts:
|
||||
# category: archive-taxonomy
|
||||
# tag: archive-taxonomy
|
||||
# permalinks:
|
||||
# category: /categories/:name/
|
||||
# tag: /tags/:name/
|
||||
|
||||
|
||||
# HTML Compression
|
||||
# - http://jch.penibelst.de/
|
||||
compress_html:
|
||||
clippings: all
|
||||
ignore:
|
||||
envs: development
|
||||
|
||||
# Collections
|
||||
collections:
|
||||
tooltips:
|
||||
output: false
|
||||
# collections are declared here. this renders the content in _tooltips and processes it, but doesn't output it as actual files in the output unless you change output to true
|
||||
docs:
|
||||
output: true
|
||||
permalink: /:collection/:path/
|
||||
|
||||
# Defaults
|
||||
defaults:
|
||||
-
|
||||
scope:
|
||||
# _docs
|
||||
- scope:
|
||||
path: ""
|
||||
type: "pages"
|
||||
type: docs
|
||||
values:
|
||||
layout: "page"
|
||||
comments: true
|
||||
search: true
|
||||
sidebar: talk_sidebar
|
||||
-
|
||||
scope:
|
||||
path: ""
|
||||
type: "tooltips"
|
||||
values:
|
||||
layout: "page"
|
||||
comments: true
|
||||
search: true
|
||||
tooltip: true
|
||||
|
||||
-
|
||||
scope:
|
||||
path: ""
|
||||
type: "posts"
|
||||
values:
|
||||
layout: "post"
|
||||
comments: true
|
||||
search: true
|
||||
sidebar: home_sidebar
|
||||
|
||||
# these are defaults used for the frontmatter for these file types
|
||||
|
||||
sidebars:
|
||||
- talk_sidebar
|
||||
|
||||
description: "Documentation and guides for Coral Talk."
|
||||
# the description is used in the feed.xml file
|
||||
|
||||
# needed for sitemap.xml file only
|
||||
url: https://coralproject.github.io/talk/
|
||||
layout: single
|
||||
read_time: false
|
||||
author_profile: false
|
||||
share: false
|
||||
comments: false
|
||||
sidebar:
|
||||
nav: "docs"
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
tip: '<div class="alert alert-success" role="alert"><i class="fa fa-check-square-o"></i> <b>Tip: </b>'
|
||||
note: '<div class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note: </b>'
|
||||
important: '<div class="alert alert-warning" role="alert"><i class="fa fa-warning"></i> <b>Important: </b>'
|
||||
warning: '<div class="alert alert-danger" role="alert"><i class="fa fa-exclamation-circle"></i> <b>Warning: </b>'
|
||||
end: '</div>'
|
||||
|
||||
callout_danger: '<div class="bs-callout bs-callout-danger">'
|
||||
callout_default: '<div class="bs-callout bs-callout-default">'
|
||||
callout_primary: '<div class="bs-callout bs-callout-primary">'
|
||||
callout_success: '<div class="bs-callout bs-callout-success">'
|
||||
callout_info: '<div class="bs-callout bs-callout-info">'
|
||||
callout_warning: '<div class="bs-callout bs-callout-warning">'
|
||||
|
||||
hr_faded: '<hr class="faded"/>'
|
||||
hr_shaded: '<hr class="shaded"/>'
|
||||
Executable
+70
@@ -0,0 +1,70 @@
|
||||
# main links
|
||||
main:
|
||||
- title: "Github"
|
||||
url: https://github.com/coralproject/talk/
|
||||
- title: "CircleCI"
|
||||
url: https://circleci.com/gh/coralproject/talk/
|
||||
- title: "Docker"
|
||||
url: https://hub.docker.com/r/coralproject/talk/
|
||||
- title: "Roadmap"
|
||||
url: https://www.pivotaltracker.com/n/projects/1863625
|
||||
- title: "Blog"
|
||||
url: https://coralproject.net/
|
||||
|
||||
|
||||
docs:
|
||||
- title: "FAQ"
|
||||
url: /docs/faq
|
||||
- title: "Installation"
|
||||
url: /docs/install/
|
||||
children:
|
||||
- title: "Source"
|
||||
url: /docs/install/source/
|
||||
- title: "Docker"
|
||||
url: /docs/install/docker/
|
||||
- title: "First Setup"
|
||||
url: /docs/install/setup/
|
||||
- title: "Microservices"
|
||||
url: /docs/install/microservices/
|
||||
- title: "Troubleshooting"
|
||||
url: /docs/install/troubleshooting/
|
||||
- title: "Running"
|
||||
children:
|
||||
- title: "Configuration"
|
||||
url: /docs/running/configuration/
|
||||
- title: "Secrets"
|
||||
url: /docs/running/secrets/
|
||||
- title: "Database Migrations"
|
||||
url: /docs/running/migrations/
|
||||
- title: "Architecture"
|
||||
url: /docs/architecture/
|
||||
children:
|
||||
- title: "Tags"
|
||||
url: /docs/architecture/tags/
|
||||
- title: "Metadata"
|
||||
url: /docs/architecture/metadata/
|
||||
- title: "Command Line Interface"
|
||||
url: /docs/architecture/cli/
|
||||
- title: "Client"
|
||||
url: /docs/architecture/client
|
||||
- title: "Plugins"
|
||||
url: /docs/plugins/
|
||||
children:
|
||||
- title: "Quickstart"
|
||||
url: /docs/plugins/quickstart/
|
||||
- title: "Client API"
|
||||
url: /docs/plugins/client/
|
||||
- title: "Server API"
|
||||
url: /docs/plugins/server/
|
||||
- title: "Experimental"
|
||||
url: /docs/plugins/experimental/
|
||||
- title: "Development"
|
||||
children:
|
||||
- title: "Tools"
|
||||
url: /docs/development/tools/
|
||||
- title: "Contributor's Guide"
|
||||
url: /docs/development/contributing/
|
||||
- title: "Code of Conduct"
|
||||
url: /docs/development/code-of-conduct/
|
||||
- title: "REST API"
|
||||
url: /docs/development/rest/
|
||||
@@ -1,89 +0,0 @@
|
||||
# This is your sidebar TOC. The sidebar code loops through sections here and provides the appropriate formatting.
|
||||
|
||||
entries:
|
||||
- title: Sidebar
|
||||
levels: one
|
||||
folders:
|
||||
|
||||
- title: Talk
|
||||
output: web
|
||||
folderitems:
|
||||
- title: About
|
||||
url: /index.html
|
||||
output: web
|
||||
- title: Contribute
|
||||
url: /contribute.html
|
||||
output: web
|
||||
- title: FAQ
|
||||
url: /faq.html
|
||||
output: web
|
||||
|
||||
- title: Installation
|
||||
output: web
|
||||
folderitems:
|
||||
- title: Getting Started
|
||||
output: web
|
||||
url: /install.html
|
||||
- title: Configuration
|
||||
output: web
|
||||
url: /configuration.html
|
||||
- title: Source
|
||||
url: /install-source.html
|
||||
output: web
|
||||
- title: Docker
|
||||
url: /install-docker.html
|
||||
output: web
|
||||
- title: Setup
|
||||
url: /install-setup.html
|
||||
output: web
|
||||
- title: Microservice Deployments
|
||||
url: /install-microservices.html
|
||||
output: web
|
||||
- title: Troubleshooting
|
||||
url: /install-troubleshooting.html
|
||||
output: web
|
||||
|
||||
- title: Architecture
|
||||
output: web
|
||||
folderitems:
|
||||
- title: Overview
|
||||
url: /architecture.html
|
||||
output: web
|
||||
- title: Tags
|
||||
url: /architecture-tags.html
|
||||
output: web
|
||||
- title: Metadata API
|
||||
url: /architecture-metadata.html
|
||||
output: web
|
||||
- title: cli
|
||||
url: /architecture-cli.html
|
||||
output: web
|
||||
|
||||
- title: Plugins
|
||||
output: web
|
||||
folderitems:
|
||||
- title: Overview
|
||||
url: /plugins.html
|
||||
output: web
|
||||
- title: Quickstart
|
||||
url: /plugins-quickstart.html
|
||||
output: web
|
||||
- title: Client API
|
||||
url: /plugins-client.html
|
||||
output: web
|
||||
- title: Server API
|
||||
url: /plugins-server.html
|
||||
output: web
|
||||
- title: Experimental
|
||||
url: /plugins-experimental.html
|
||||
output: web
|
||||
|
||||
- title: Development
|
||||
output: web
|
||||
folderitems:
|
||||
- title: Client Architecture
|
||||
url: /client-architecture.html
|
||||
output: web
|
||||
- title: Tools
|
||||
url: /tools.html
|
||||
output: web
|
||||
@@ -1,4 +0,0 @@
|
||||
allowed-tags:
|
||||
- installation
|
||||
- plugins
|
||||
- development
|
||||
@@ -1,17 +0,0 @@
|
||||
## Topnav single links
|
||||
## if you want to list an external url, use external_url instead of url. the theme will apply a different link base.
|
||||
topnav:
|
||||
- title: Topnav
|
||||
items:
|
||||
- title: Github
|
||||
external_url: https://github.com/coralproject
|
||||
- title: CircleCI
|
||||
external_url: https://circleci.com/gh/coralproject/talk
|
||||
- title: Docker
|
||||
external_url: https://hub.docker.com/r/coralproject/talk/
|
||||
- title: Roadmap
|
||||
external_url: https://www.pivotaltracker.com/n/projects/1863625
|
||||
- title: Home
|
||||
external_url: https://coralproject.net
|
||||
- title: Blog
|
||||
external_url: https://coralproject.net
|
||||
Executable
+802
@@ -0,0 +1,802 @@
|
||||
# User interface text and labels
|
||||
|
||||
# English (default)
|
||||
# -----------------
|
||||
en: &DEFAULT_EN
|
||||
page : "Page"
|
||||
pagination_previous : "Previous"
|
||||
pagination_next : "Next"
|
||||
breadcrumb_home_label : "Home"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "Toggle Menu"
|
||||
toc_label : "On This Page"
|
||||
ext_link_label : "Direct Link"
|
||||
less_than : "less than"
|
||||
minute_read : "minute read"
|
||||
share_on_label : "Share on"
|
||||
meta_label :
|
||||
tags_label : "Tags:"
|
||||
categories_label : "Categories:"
|
||||
date_label : "Updated:"
|
||||
comments_label : "Leave a Comment"
|
||||
comments_title : "Comments"
|
||||
more_label : "Learn More"
|
||||
related_label : "You May Also Enjoy"
|
||||
follow_label : "Follow:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Powered by"
|
||||
website_label : "Website"
|
||||
email_label : "Email"
|
||||
recent_posts : "Recent Posts"
|
||||
undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
|
||||
comment_form_info : "Your email address will not be published. Required fields are marked"
|
||||
comment_form_comment_label : "Comment"
|
||||
comment_form_md_info : "Markdown is supported."
|
||||
comment_form_name_label : "Name"
|
||||
comment_form_email_label : "Email address"
|
||||
comment_form_website_label : "Website (optional)"
|
||||
comment_btn_submit : "Submit Comment"
|
||||
comment_btn_submitted : "Submitted"
|
||||
comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved."
|
||||
comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again."
|
||||
loading_label : "Loading..."
|
||||
en-US:
|
||||
<<: *DEFAULT_EN
|
||||
en-CA:
|
||||
<<: *DEFAULT_EN
|
||||
en-GB:
|
||||
<<: *DEFAULT_EN
|
||||
en-AU:
|
||||
<<: *DEFAULT_EN
|
||||
|
||||
# Spanish
|
||||
# --------------
|
||||
es: &DEFAULT_ES
|
||||
page : "Página"
|
||||
pagination_previous : "Anterior"
|
||||
pagination_next : "Siguiente"
|
||||
breadcrumb_home_label : "Inicio"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label :
|
||||
toc_label : "Contenidos"
|
||||
ext_link_label : "Enlace"
|
||||
less_than : "menos de"
|
||||
minute_read : "minuto de lectura"
|
||||
share_on_label : "Compartir"
|
||||
meta_label :
|
||||
tags_label : "Etiquetas:"
|
||||
categories_label : "Categorías:"
|
||||
date_label : "Actualizado:"
|
||||
comments_label : "Comentar"
|
||||
comments_title :
|
||||
more_label : "Ver más"
|
||||
related_label : "Podrías ver también"
|
||||
follow_label : "Seguir:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Powered by"
|
||||
website_label : "Sitio web"
|
||||
email_label : "Email"
|
||||
recent_posts : "Entradas recientes"
|
||||
undefined_wpm : "Parametro words_per_minute (Palabras por minuto) no definido en _config.yml"
|
||||
comment_form_info : "Su dirección de correo no será publicada. Se han resaltado los campos requeridos"
|
||||
comment_form_comment_label : "Comentario"
|
||||
comment_form_md_info : "Markdown está soportado."
|
||||
comment_form_name_label : "Nombre"
|
||||
comment_form_email_label : "Dirección de E-mail"
|
||||
comment_form_website_label : "Sitio web (opcional)"
|
||||
comment_btn_submit : "Enviar Commentario"
|
||||
comment_btn_submitted : "Enviado"
|
||||
comment_success_msg : "Gracias por su comentario!, Este se visualizará en el sitio una vez haya sido aprobado"
|
||||
comment_error_msg : "Lo sentimos, ha ocurrido un error al enviar su comentario. Por favor asegurese que todos los campos han sido diligenciados e intente de nuevo"
|
||||
loading_label : "Cargando..."
|
||||
es-ES:
|
||||
<<: *DEFAULT_ES
|
||||
es-CO:
|
||||
<<: *DEFAULT_ES
|
||||
|
||||
# French
|
||||
# -----------------
|
||||
fr: &DEFAULT_FR
|
||||
page : "Page"
|
||||
pagination_previous : "Précédent"
|
||||
pagination_next : "Suivant"
|
||||
breadcrumb_home_label : "Accueil"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label :
|
||||
toc_label : "Sur cette page"
|
||||
ext_link_label : "Lien direct"
|
||||
less_than : "moins de"
|
||||
minute_read : "minute de lecture"
|
||||
share_on_label : "Partager sur"
|
||||
meta_label :
|
||||
tags_label : "Tags :"
|
||||
categories_label : "Catégories :"
|
||||
date_label : "Mis à jour :"
|
||||
comments_label : "Laisser un commentaire"
|
||||
comments_title :
|
||||
more_label : "Lire plus"
|
||||
related_label : "Vous pourriez aimer aussi"
|
||||
follow_label : "Contact"
|
||||
feed_label : "Flux"
|
||||
powered_by : "Propulsé par"
|
||||
website_label : "Site"
|
||||
email_label : "Email"
|
||||
recent_posts : "Posts récents"
|
||||
undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml"
|
||||
comments_title : "Commentaires"
|
||||
comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués"
|
||||
comment_form_comment_label : "Commentaire"
|
||||
comment_form_md_info : "Markdown est supporté."
|
||||
comment_form_name_label : "Nom"
|
||||
comment_form_email_label : "Adresse mail"
|
||||
comment_form_website_label : "Site web (optionnel)"
|
||||
comment_btn_submit : "Envoyer"
|
||||
comment_btn_submitted : "Envoyé"
|
||||
comment_success_msg : "Merci pour votre commentaire, il sera visible sur le site une fois approuvé."
|
||||
comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez."
|
||||
loading_label : "Chargement..."
|
||||
fr-FR:
|
||||
<<: *DEFAULT_FR
|
||||
fr-BE:
|
||||
<<: *DEFAULT_FR
|
||||
fr-CH:
|
||||
<<: *DEFAULT_FR
|
||||
|
||||
# Turkish
|
||||
# -----------------
|
||||
tr: &DEFAULT_TR
|
||||
page : "Sayfa"
|
||||
pagination_previous : "Önceki"
|
||||
pagination_next : "Sonraki"
|
||||
breadcrumb_home_label : "Ana Sayfa"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label :
|
||||
toc_label : "İçindekiler"
|
||||
ext_link_label : "Doğrudan Bağlantı"
|
||||
less_than : "Şu süreden az: "
|
||||
minute_read : "dakika tahmini okuma süresi"
|
||||
share_on_label : "Paylaş"
|
||||
meta_label :
|
||||
tags_label : "Etiketler:"
|
||||
categories_label : "Kategoriler:"
|
||||
date_label : "Güncelleme tarihi:"
|
||||
comments_label : "Yorum yapın"
|
||||
comments_title : "Yorumlar"
|
||||
more_label : "Daha fazlasını öğrenin"
|
||||
related_label : "Bunlar ilginizi çekebilir:"
|
||||
follow_label : "Takip et:"
|
||||
feed_label : "RSS"
|
||||
powered_by : "Emeği geçenler: "
|
||||
website_label : "Web sayfası"
|
||||
email_label : "E-posta"
|
||||
recent_posts : "Son yazılar"
|
||||
undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi"
|
||||
comment_form_info : "Email adresiniz gösterilmeyecektir. Zorunlu alanlar işaretlenmiştir"
|
||||
comment_form_comment_label : "Yorumunuz"
|
||||
comment_form_md_info : "Markdown desteklenmektedir."
|
||||
comment_form_name_label : "Adınız"
|
||||
comment_form_email_label : "Email adresiniz"
|
||||
comment_form_website_label : "Websiteniz (opsiyonel)"
|
||||
comment_btn_submit : "Yorum Yap"
|
||||
comment_btn_submitted : "Gönderildi"
|
||||
comment_success_msg : "Yorumunuz için teşekkürler! Yorumunuz onaylandıktan sonra sitede gösterilecektir."
|
||||
comment_error_msg : "Maalesef bir hata oluştu. Lütfen zorunlu olan tüm alanları doldurduğunuzdan emin olun ve sonrasında tekrar deneyin."
|
||||
loading_label : "Yükleniyor..."
|
||||
tr-TR:
|
||||
<<: *DEFAULT_TR
|
||||
|
||||
# Portuguese
|
||||
# -----------------
|
||||
pt: &DEFAULT_PT
|
||||
page : "Página"
|
||||
pagination_previous : "Anterior"
|
||||
pagination_next : "Seguinte"
|
||||
breadcrumb_home_label : "Início"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label :
|
||||
toc_label : "Nesta Página"
|
||||
ext_link_label : "Link Direto"
|
||||
less_than : "menos de"
|
||||
minute_read : "minutos de leitura"
|
||||
share_on_label : "Partilhar no"
|
||||
meta_label :
|
||||
tags_label : "Etiquetas:"
|
||||
categories_label : "Categorias:"
|
||||
date_label : "Atualizado:"
|
||||
comments_label : "Deixe um Comentário"
|
||||
comments_title : "Comentários"
|
||||
more_label : "Saber mais"
|
||||
related_label : "Também pode gostar de"
|
||||
follow_label : "Siga:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Feito com"
|
||||
website_label : "Site"
|
||||
email_label : "Email"
|
||||
recent_posts : "Artigos Recentes"
|
||||
undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml"
|
||||
comment_form_info : "O seu endereço email não será publicado. Os campos obrigatórios estão assinalados"
|
||||
comment_form_comment_label : "Comentário"
|
||||
comment_form_md_info : "Markdown é suportado."
|
||||
comment_form_name_label : "Nome"
|
||||
comment_form_email_label : "Endereço Email"
|
||||
comment_form_website_label : "Site (opcional)"
|
||||
comment_btn_submit : "Sumbeter Comentário"
|
||||
comment_btn_submitted : "Submetido"
|
||||
comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado."
|
||||
comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente."
|
||||
loading_label : "A carregar..."
|
||||
# Brazilian Portuguese
|
||||
pt-BR:
|
||||
page : "Página"
|
||||
pagination_previous : "Anterior"
|
||||
pagination_next : "Próxima"
|
||||
breadcrumb_home_label : "Home"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label :
|
||||
toc_label : "Nesta página"
|
||||
ext_link_label : "Link direto"
|
||||
less_than : "meno que"
|
||||
minute_read : "minutos de leitura"
|
||||
share_on_label : "Compartilhe em"
|
||||
meta_label :
|
||||
tags_label : "Tags:"
|
||||
categories_label : "Categorias:"
|
||||
date_label : "Atualizado em:"
|
||||
comments_label : "Deixe um comentário"
|
||||
comments_title :
|
||||
more_label : "Aprenda Mais"
|
||||
related_label : "Você Talvez Goste Também"
|
||||
follow_label : "Acompanhe em"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Feito com"
|
||||
website_label : "Site"
|
||||
email_label : "Email"
|
||||
recent_posts : "Postagens recentes"
|
||||
undefined_wpm : "Parâmetro indefinido em word_per_minute no _config.yml"
|
||||
comment_form_info :
|
||||
comment_form_comment_label :
|
||||
comment_form_md_info :
|
||||
comment_form_name_label :
|
||||
comment_form_email_label :
|
||||
comment_form_website_label :
|
||||
comment_btn_submit :
|
||||
comment_btn_submitted :
|
||||
comment_success_msg :
|
||||
comment_error_msg :
|
||||
loading_label :
|
||||
pt-PT:
|
||||
<<: *DEFAULT_PT
|
||||
|
||||
# Italian
|
||||
# -----------------
|
||||
it: &DEFAULT_IT
|
||||
page : "Pagina"
|
||||
pagination_previous : "Precedente"
|
||||
pagination_next : "Prossima"
|
||||
breadcrumb_home_label : "Home"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label :
|
||||
toc_label : "Indice della pagina"
|
||||
ext_link_label : "Link"
|
||||
less_than : "meno di"
|
||||
minute_read : "minuto/i di lettura"
|
||||
share_on_label : "Condividi"
|
||||
meta_label :
|
||||
tags_label : "Tags:"
|
||||
categories_label : "Categorie:"
|
||||
date_label : "Aggiornato:"
|
||||
comments_label : "Scrivi un commento"
|
||||
comments_title :
|
||||
more_label : "Scopri di più"
|
||||
related_label : "Potrebbe Piacerti Anche"
|
||||
follow_label : "Segui:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Powered by"
|
||||
website_label : "Website"
|
||||
email_label : "Email"
|
||||
recent_posts : "Articoli Recenti"
|
||||
undefined_wpm : "Parametro words_per_minute non definito in _config.yml"
|
||||
comment_form_info : "Il tuo indirizzo email non sarà pubblicato. Sono segnati i campi obbligatori"
|
||||
comment_form_comment_label : "Commenta"
|
||||
comment_form_md_info : "Il linguaggio Markdown è supportato"
|
||||
comment_form_name_label : "Nome"
|
||||
comment_form_email_label : "Indirizzo email"
|
||||
comment_form_website_label : "Sito Web (opzionale)"
|
||||
comment_btn_submit : "Invia commento"
|
||||
comment_btn_submitted : "Inviato"
|
||||
comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato."
|
||||
comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova."
|
||||
loading_label : "Caricamento..."
|
||||
it-IT:
|
||||
<<: *DEFAULT_IT
|
||||
|
||||
# Chinese (zh-CN Chinese - China)
|
||||
# -----------------
|
||||
zh: &DEFAULT_ZH
|
||||
page : "页面"
|
||||
pagination_previous : "向前"
|
||||
pagination_next : "向后"
|
||||
breadcrumb_home_label : "首页"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "切换菜单"
|
||||
toc_label : "在本页上"
|
||||
ext_link_label : "直接链接"
|
||||
less_than : "少于"
|
||||
minute_read : "分钟 阅读"
|
||||
share_on_label : "分享"
|
||||
meta_label :
|
||||
tags_label : "标签:"
|
||||
categories_label : "分类:"
|
||||
date_label : "最新的:"
|
||||
comments_label : "留下评论"
|
||||
comments_title : "评论"
|
||||
more_label : "了解更多"
|
||||
related_label : "猜您还喜欢"
|
||||
follow_label : "关注:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "技术来自于"
|
||||
website_label : "网站"
|
||||
email_label : "电子邮箱"
|
||||
recent_posts : "最新文章"
|
||||
undefined_wpm : "_config.yml配置中words_per_minute字段未定义"
|
||||
comment_form_info : "您的电子邮箱地址并不会被展示。请填写标记为必须的字段。"
|
||||
comment_form_comment_label : "评论"
|
||||
comment_form_md_info : "Markdown语法已支持。"
|
||||
comment_form_name_label : "姓名"
|
||||
comment_form_email_label : "电子邮箱"
|
||||
comment_form_website_label : "网站(可选)"
|
||||
comment_btn_submit : "提交评论"
|
||||
comment_btn_submitted : "已提交"
|
||||
comment_success_msg : "感谢您的评论!被批准后它会立即在此站点展示。"
|
||||
comment_error_msg : "很抱歉,您的提交存在错误。请确保所有必填字段都已填写正确,然后再试一次。"
|
||||
loading_label : "正在加载..."
|
||||
zh-CN:
|
||||
<<: *DEFAULT_ZH
|
||||
zh-HK:
|
||||
<<: *DEFAULT_ZH
|
||||
zh-SG:
|
||||
<<: *DEFAULT_ZH
|
||||
# Taiwan (Traditional Chinese)
|
||||
zh-TW:
|
||||
page : "頁面"
|
||||
pagination_previous : "較舊"
|
||||
pagination_next : "較新"
|
||||
breadcrumb_home_label : "首頁"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "切換選單"
|
||||
toc_label : "本頁"
|
||||
ext_link_label : "外部連結"
|
||||
less_than : "少於"
|
||||
minute_read : "分鐘閱讀"
|
||||
share_on_label : "分享到"
|
||||
meta_label :
|
||||
tags_label : "標籤:"
|
||||
categories_label : "分類:"
|
||||
date_label : "更新時間:"
|
||||
comments_label : "留言"
|
||||
comments_title : "留言內容"
|
||||
more_label : "了解更多"
|
||||
related_label : "猜您有與趣"
|
||||
follow_label : "追蹤:"
|
||||
feed_label : "RSS Feed"
|
||||
powered_by : "Powered by"
|
||||
website_label : "網站"
|
||||
email_label : "電子信箱"
|
||||
recent_posts : "最新文章"
|
||||
undefined_wpm : "_config.yml 中未定義 words_per_minute"
|
||||
comment_form_info : "您的電子信箱不會被公開. 必填部份已標記"
|
||||
comment_form_comment_label : "留言內容"
|
||||
comment_form_md_info : "支援Markdown語法。"
|
||||
comment_form_name_label : "名字"
|
||||
comment_form_email_label : "電子信箱帳號"
|
||||
comment_form_website_label : "網頁 (可選填)"
|
||||
comment_btn_submit : "送出留言"
|
||||
comment_btn_submitted : "已送出"
|
||||
comment_success_msg : "感謝您的留言! 審核後將會顯示在站上。"
|
||||
comment_error_msg : "抱歉,部份資料輸入有問題。請確認資料填寫正確後再試一次。"
|
||||
loading_label : "載入中..."
|
||||
|
||||
# German / Deutsch
|
||||
# -----------------
|
||||
de: &DEFAULT_DE
|
||||
page : "Seite"
|
||||
pagination_previous : "Vorherige"
|
||||
pagination_next : "Nächste"
|
||||
breadcrumb_home_label : "Home"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label :
|
||||
toc_label : "Auf dieser Seite"
|
||||
ext_link_label : "Direkter Link"
|
||||
less_than : "weniger als"
|
||||
minute_read : "Minuten zum lesen"
|
||||
share_on_label : "Teilen auf"
|
||||
meta_label :
|
||||
tags_label : "Tags:"
|
||||
categories_label : "Kategorien:"
|
||||
date_label : "Aktualisiert:"
|
||||
comments_label : "Hinterlassen sie einen Kommentar"
|
||||
comments_title : "Kommentare"
|
||||
more_label : "Mehr anzeigen"
|
||||
related_label : "Ihnen gefällt vielleicht auch"
|
||||
follow_label : "Folgen:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Powered by"
|
||||
website_label : "Webseite"
|
||||
email_label : "E-Mail"
|
||||
recent_posts : "Aktuelle Beiträge"
|
||||
undefined_wpm : "Undefinierter Parameter words_per_minute in _config.yml"
|
||||
comment_form_info : "Ihre E-Mail Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert"
|
||||
comment_form_comment_label : "Kommentar"
|
||||
comment_form_md_info : "Markdown wird unterstützt."
|
||||
comment_form_name_label : "Name"
|
||||
comment_form_email_label : "E-Mail Addresse"
|
||||
comment_form_website_label : "Webseite (optional)"
|
||||
comment_btn_submit : "Kommentar absenden"
|
||||
comment_btn_submitted : "Versendet"
|
||||
comment_success_msg : "Danke für ihren Kommentar! Er wird auf der Seite angezeigt, nachdem er geprüft wurde."
|
||||
comment_error_msg : "Entschuldigung, es gab einen Fehler. Bitte füllen sie alle benötigten Felder aus und versuchen sie es erneut."
|
||||
loading_label : "Lade..."
|
||||
de-DE:
|
||||
<<: *DEFAULT_DE
|
||||
de-AT:
|
||||
<<: *DEFAULT_DE
|
||||
de-CH:
|
||||
<<: *DEFAULT_DE
|
||||
de-BE:
|
||||
<<: *DEFAULT_DE
|
||||
de-LI:
|
||||
<<: *DEFAULT_DE
|
||||
de-LU:
|
||||
<<: *DEFAULT_DE
|
||||
|
||||
# Nepali (Nepal)
|
||||
# -----------------
|
||||
ne: &DEFAULT_NE
|
||||
page : "पृष्ठ"
|
||||
pagination_previous : "अघिल्लो"
|
||||
pagination_next : "अर्को"
|
||||
breadcrumb_home_label : "गृह"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "टगल मेनु"
|
||||
toc_label : "यो पृष्ठमा"
|
||||
ext_link_label : "सिधा सम्पर्क"
|
||||
less_than : "कम्तिमा"
|
||||
minute_read : "मिनेट पढ्नुहोस्"
|
||||
share_on_label : "शेयर गर्नुहोस्"
|
||||
meta_label :
|
||||
tags_label : "ट्यागहरू:"
|
||||
categories_label : "वर्गहरु:"
|
||||
date_label : "अद्यावधिक:"
|
||||
comments_label : "टिप्पणी दिनुहोस्"
|
||||
comments_title : "टिप्पणीहरू"
|
||||
more_label : "अझै सिक्नुहोस्"
|
||||
related_label : "तपाईं रुचाउन सक्नुहुन्छ "
|
||||
follow_label : "पछ्याउनुहोस्:"
|
||||
feed_label : "फिड"
|
||||
powered_by : "Powered by"
|
||||
website_label : "वेबसाइट"
|
||||
email_label : "इमेल"
|
||||
recent_posts : "ताजा लेखहरु"
|
||||
undefined_wpm : "अपरिभाषित प्यारामिटर शब्दहरू_प्रति_मिनेट at _config.yml"
|
||||
comment_form_info : "तपाइँको इमेल ठेगाना प्रकाशित गरिने छैन।आवश्यक जानकारीहरुमा चिन्ह लगाइको छ"
|
||||
comment_form_comment_label : "टिप्पणी"
|
||||
comment_form_md_info : "मार्कडाउन समर्थित छ।"
|
||||
comment_form_name_label : "नाम"
|
||||
comment_form_email_label : "इमेल ठेगाना"
|
||||
comment_form_website_label : "वेबसाइट (वैकल्पिक)"
|
||||
comment_btn_submit : "टिप्पणी दिनुहोस् "
|
||||
comment_btn_submitted : "टिप्पणी भयो"
|
||||
comment_success_msg : "तपाईंको टिप्पणीको लागि धन्यवाद! एक पटक यो अनुमोदन गरेपछी यो साइटमा देखाउनेछ।"
|
||||
comment_error_msg : "माफ गर्नुहोस्, तपाईंको टिप्पणी त्रुटि थियो।सबै आवश्यक जानकारीहरु पूरा गरिएको छ भने निश्चित गर्नुहोस् र फेरि प्रयास गर्नुहोस्।"
|
||||
loading_label : "लोड हुँदैछ ..."
|
||||
ne-NP:
|
||||
<<: *DEFAULT_NE
|
||||
|
||||
# Korean
|
||||
# --------------
|
||||
ko: &DEFAULT_KO
|
||||
page : "페이지"
|
||||
pagination_previous : "이전"
|
||||
pagination_next : "다음"
|
||||
breadcrumb_home_label : "Home"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "토글 메뉴"
|
||||
toc_label : "On This Page"
|
||||
ext_link_label : "직접 링크"
|
||||
less_than : "최대"
|
||||
minute_read : "분 소요"
|
||||
share_on_label : "공유하기"
|
||||
meta_label :
|
||||
tags_label : "태그:"
|
||||
categories_label : "카테고리:"
|
||||
date_label : "업데이트:"
|
||||
comments_label : "댓글남기기"
|
||||
comments_title : "댓글"
|
||||
more_label : "더 보기"
|
||||
related_label : "참고"
|
||||
follow_label : "팔로우:"
|
||||
feed_label : "피드"
|
||||
powered_by : "Powered by"
|
||||
website_label : "웹사이트"
|
||||
email_label : "이메일"
|
||||
recent_posts : "최근 포스트"
|
||||
undefined_wpm : "Undefined parameter words_per_minute at _config.yml"
|
||||
comment_form_info : "이메일은 공개되지 않습니다. 작성 필요 필드:"
|
||||
comment_form_comment_label : "댓글"
|
||||
comment_form_md_info : "마크다운을 지원합니다."
|
||||
comment_form_name_label : "이름"
|
||||
comment_form_email_label : "이메일"
|
||||
comment_form_website_label : "웹사이트(선택사항)"
|
||||
comment_btn_submit : "댓글 등록"
|
||||
comment_btn_submitted : "등록됨"
|
||||
comment_success_msg : "감사합니다! 댓글이 머지된 후 확인하실 수 있습니다."
|
||||
comment_error_msg : "댓글 등록에 문제가 있습니다. 필요 필드를 작성했는지 확인하고 다시 시도하세요."
|
||||
loading_label : "로딩중..."
|
||||
ko-KR:
|
||||
<<: *DEFAULT_KO
|
||||
|
||||
# Russian / Русский
|
||||
# -----------------
|
||||
ru: &DEFAULT_RU
|
||||
page : "Страница"
|
||||
pagination_previous : "Предыдущая"
|
||||
pagination_next : "Следующая"
|
||||
breadcrumb_home_label : "Главная"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "Выпадающее меню"
|
||||
toc_label : "Содержание"
|
||||
ext_link_label : "Прямая ссылка"
|
||||
less_than : "менее"
|
||||
minute_read : "мин на чтение"
|
||||
share_on_label : "Поделиться"
|
||||
meta_label :
|
||||
tags_label : "Метки:"
|
||||
categories_label : "Разделы:"
|
||||
date_label : "Дата изменения:"
|
||||
comments_label : "Оставить комментарий"
|
||||
comments_title : "Комментарии"
|
||||
more_label : "Читать далее"
|
||||
related_label : "Вам также может понравиться"
|
||||
follow_label : "Связаться со мной:"
|
||||
feed_label : "RSS-лента"
|
||||
powered_by : "Сайт работает на"
|
||||
website_label : "Сайт"
|
||||
email_label : "Электронная почта"
|
||||
recent_posts : "Свежие записи"
|
||||
undefined_wpm : "Не определён параметр words_per_minute в _config.yml"
|
||||
comment_form_info : "Ваш адрес электронной почты не будет опубликован. Обязательные поля помечены"
|
||||
comment_form_comment_label : "Комментарий"
|
||||
comment_form_md_info : "Поддерживается синтаксис Markdown."
|
||||
comment_form_name_label : "Имя"
|
||||
comment_form_email_label : "Электронная почта"
|
||||
comment_form_website_label : "Ссылка на сайт (необязательно)"
|
||||
comment_btn_submit : "Оставить комментарий"
|
||||
comment_btn_submitted : "Отправлено"
|
||||
comment_success_msg : "Спасибо за Ваш комментарий! Он будет опубликован на сайте после проверки."
|
||||
comment_error_msg : "К сожалению, произошла ошибка с отправкой комментария. Пожалуйста, убедитесь, что все обязательные поля заполнены и попытайтесь снова."
|
||||
loading_label : "Отправка..."
|
||||
ru-RU:
|
||||
<<: *DEFAULT_RU
|
||||
|
||||
# Lithuanian / Lietuviškai
|
||||
# -----------------
|
||||
lt: &DEFAULT_LT
|
||||
page : "Puslapis"
|
||||
pagination_previous : "Ankstesnis"
|
||||
pagination_next : "Sekantis"
|
||||
breadcrumb_home_label : "Pagrindinis"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "Meniu rodymas"
|
||||
toc_label : "Turinys"
|
||||
ext_link_label : "Tiesioginė nuoroda"
|
||||
less_than : "mažiau nei"
|
||||
minute_read : "min. skaitymo"
|
||||
share_on_label : "Pasidalinti"
|
||||
meta_label :
|
||||
tags_label : "Žymės:"
|
||||
categories_label : "Kategorijos:"
|
||||
date_label : "Atnaujinta:"
|
||||
comments_label : "Palikti komentarą"
|
||||
comments_title : "Komentaras"
|
||||
more_label : "Skaityti daugiau"
|
||||
related_label : "Taip pat turėtų patikti"
|
||||
follow_label : "Sekti:"
|
||||
feed_label : "Šaltinis"
|
||||
powered_by : "Sukurta su"
|
||||
website_label : "Tinklapis"
|
||||
email_label : "El. paštas"
|
||||
recent_posts : "Naujausi įrašai"
|
||||
undefined_wpm : "Nedeklaruotas parametras words_per_minute faile _config.yml"
|
||||
comment_form_info : "El. pašto adresas nebus viešinamas. Būtini laukai pažymėti."
|
||||
comment_form_comment_label : "Komentaras"
|
||||
comment_form_md_info : "Markdown palaikomas."
|
||||
comment_form_name_label : "Vardas"
|
||||
comment_form_email_label : "El. paštas"
|
||||
comment_form_website_label : "Tinklapis (nebūtina)"
|
||||
comment_btn_submit : "Komentuoti"
|
||||
comment_btn_submitted : "Įrašytas"
|
||||
comment_success_msg : "Ačiū už komentarą! Jis bus parodytas kai bus patvirtintas."
|
||||
comment_error_msg : "Atleiskite, įvyko netikėta klaida įrašant komentarą. Pasitikrinkite ar užpildėte visus būtinus laukus ir pamėginkite dar kartą."
|
||||
loading_label : "Kraunama..."
|
||||
lt-LT:
|
||||
<<: *DEFAULT_LT
|
||||
|
||||
# Greek
|
||||
# --------------
|
||||
gr: &DEFAULT_GR
|
||||
page : "Σελίδα"
|
||||
pagination_previous : "Προηγούμενo"
|
||||
pagination_next : "Επόμενo"
|
||||
breadcrumb_home_label : "Αρχική"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "Μενού"
|
||||
toc_label : "Περιεχόμενα"
|
||||
ext_link_label : "Εξωτερικός Σύνδεσμος"
|
||||
less_than : "Λιγότερο από"
|
||||
minute_read : "λεπτά ανάγνωσης"
|
||||
share_on_label : "Μοιραστείτε το"
|
||||
meta_label :
|
||||
tags_label : "Ετικέτες:"
|
||||
categories_label : "Κατηγορίες:"
|
||||
date_label : "Ενημερώθηκε:"
|
||||
comments_label : "Αφήστε ένα σχόλιο"
|
||||
comments_title : "Σχόλια"
|
||||
more_label : "Διάβαστε περισσότερα"
|
||||
related_label : "Σχετικές αναρτήσεις"
|
||||
follow_label : "Ακολουθήστε:"
|
||||
feed_label : "RSS Feed"
|
||||
powered_by : "Δημιουργήθηκε με"
|
||||
website_label : "Ιστοσελίδα"
|
||||
email_label : "Email"
|
||||
recent_posts : "Τελευταίες αναρτήσεις"
|
||||
undefined_wpm : "Δεν έχει οριστεί η παράμετρος words_per_minute στο αρχείο _config.yml"
|
||||
comment_form_info : "Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα απαιτούμενα πεδία εμφανίζονται με αστερίσκο"
|
||||
comment_form_comment_label : "Σχόλιο"
|
||||
comment_form_md_info : "Το πεδίο υποστηρίζει Markdown."
|
||||
comment_form_name_label : "Όνομα"
|
||||
comment_form_email_label : "Διεύθυνση email"
|
||||
comment_form_website_label : "Ιστοσελίδα (προαιρετικό)"
|
||||
comment_btn_submit : "Υπόβαλε ένα σχόλιο"
|
||||
comment_btn_submitted : "Έχει υποβληθεί"
|
||||
comment_success_msg : "Ευχαριστούμε για το σχόλιό σας! Θα εμφανιστεί στην ιστοσελίδα αφού εγκριθεί."
|
||||
comment_error_msg : "Λυπούμαστε, παρουσιάστηκε σφάλμα με την υποβολή σας. Παρακαλούμε βεβαιωθείτε ότι έχετε όλα τα απαιτούμενα πεδία συμπληρωμένα και δοκιμάστε ξανά."
|
||||
loading_label : "Φόρτωση..."
|
||||
gr-GR:
|
||||
<<: *DEFAULT_GR
|
||||
|
||||
# Swedish
|
||||
# -----------------
|
||||
sv: &DEFAULT_SV
|
||||
page : "Sidan"
|
||||
pagination_previous : "Föregående"
|
||||
pagination_next : "Nästa"
|
||||
breadcrumb_home_label : "Hem"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "Meny ridå"
|
||||
toc_label : "På denna sida"
|
||||
ext_link_label : "Direkt länk"
|
||||
less_than : "mindre än"
|
||||
minute_read : "minut läsning"
|
||||
share_on_label : "Dela på"
|
||||
meta_label :
|
||||
tags_label : "Taggar:"
|
||||
categories_label : "Kategorier:"
|
||||
date_label : "Uppdaterades:"
|
||||
comments_label : "Lämna en kommentar"
|
||||
comments_title : "Kommentarer"
|
||||
more_label : "Lär dig mer"
|
||||
related_label : "Du kanske vill även läsa:"
|
||||
follow_label : "Följ:"
|
||||
feed_label : "Flöde"
|
||||
powered_by : "Framställd med"
|
||||
website_label : "Webbsida"
|
||||
email_label : "E-post"
|
||||
recent_posts : "Senaste inlägg"
|
||||
undefined_wpm : "Odefinerade parametrar words_per_minute i _config.yml"
|
||||
comment_form_info : "Din e-post adress kommer inte att publiceras. Obligatoriska fält är markerade."
|
||||
comment_form_comment_label : "Kommentar"
|
||||
comment_form_md_info : "Använd Markdown för text-formateringen."
|
||||
comment_form_name_label : "Namn"
|
||||
comment_form_email_label : "E-post adress"
|
||||
comment_form_website_label : "Webdsida (valfritt)"
|
||||
comment_btn_submit : "Skicka en kommentar"
|
||||
comment_btn_submitted : "Kommentaren har tagits emot"
|
||||
comment_success_msg : "Tack för din kommentar! Den kommer att visas på sidan så fort den har godkännts."
|
||||
comment_error_msg : "Tyvärr det har blivit något fel i en av fälten, se till att du fyller i alla rutor och försök igen."
|
||||
loading_label : "Laddar..."
|
||||
sv-SE:
|
||||
<<: *DEFAULT_SV
|
||||
sv-FI:
|
||||
<<: *DEFAULT_SV
|
||||
|
||||
# Dutch
|
||||
# -----------------
|
||||
nl: &DEFAULT_NL
|
||||
page : "Pagina"
|
||||
pagination_previous : "Vorige"
|
||||
pagination_next : "Volgende"
|
||||
breadcrumb_home_label : "Home"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "Wissel Menu"
|
||||
toc_label : "Op deze pagina"
|
||||
ext_link_label : "Directe Link"
|
||||
less_than : "minder dan"
|
||||
minute_read : "minuut gelezen"
|
||||
share_on_label : "Deel op"
|
||||
meta_label :
|
||||
tags_label : "Labels:"
|
||||
categories_label : "Categorieën:"
|
||||
date_label : "Bijgewerkt:"
|
||||
comments_label : "Laat een reactie achter"
|
||||
comments_title : "Commentaren"
|
||||
more_label : "Meer informatie"
|
||||
related_label : "Bekijk ook eens"
|
||||
follow_label : "Volg:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Aangedreven door"
|
||||
website_label : "Website"
|
||||
email_label : "Email"
|
||||
recent_posts : "Recente berichten"
|
||||
undefined_wpm : "Niet gedefinieerde parameter words_per_minute bij _config.yml"
|
||||
comment_form_info : "Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd"
|
||||
comment_form_comment_label : "Commentaar"
|
||||
comment_form_md_info : "Markdown wordt ondersteund."
|
||||
comment_form_name_label : "Naam"
|
||||
comment_form_email_label : "E-mailadres"
|
||||
comment_form_website_label : "Website (optioneel)"
|
||||
comment_btn_submit : "Commentaar toevoegen"
|
||||
comment_btn_submitted : "Toegevoegd"
|
||||
comment_success_msg : "Bedankt voor uw reactie! Het zal op de site worden weergegeven zodra het is goedgekeurd."
|
||||
comment_error_msg : "Sorry, er is een fout opgetreden bij uw inzending. Zorg ervoor dat alle vereiste velden zijn voltooid en probeer het opnieuw."
|
||||
loading_label : "Laden..."
|
||||
nl-BE:
|
||||
<<: *DEFAULT_NL
|
||||
nl-NL:
|
||||
<<: *DEFAULT_NL
|
||||
|
||||
# Indonesian
|
||||
# -----------------
|
||||
id: &DEFAULT_ID
|
||||
page : "Halaman"
|
||||
pagination_previous : "Kembali"
|
||||
pagination_next : "Maju"
|
||||
breadcrumb_home_label : "Home"
|
||||
breadcrumb_separator : "/"
|
||||
menu_label : "Menu Toggle"
|
||||
toc_label : "Pada Halaman Ini"
|
||||
ext_link_label : "Link langsung"
|
||||
less_than : "Kurang dari"
|
||||
minute_read : "Waktu baca"
|
||||
share_on_label : "Berbagi di"
|
||||
meta_label :
|
||||
tags_label : "Golongan:"
|
||||
categories_label : "Kategori:"
|
||||
date_label : "Diupdate:"
|
||||
comments_label : "Tinggalkan komentar"
|
||||
comments_title : "Komentar"
|
||||
more_label : "Pelajari lagi"
|
||||
related_label : "Anda juga akan suka"
|
||||
follow_label : "Ikuti:"
|
||||
feed_label : "Feed"
|
||||
powered_by : "Didukung oleh"
|
||||
website_label : "Website"
|
||||
email_label : "Email"
|
||||
recent_posts : "Posting terbaru"
|
||||
undefined_wpm : "Parameter terdeskripsi words_per_minute di _config.yml"
|
||||
comment_form_info : "Email Anda tidak akan dipublish. Kolom yang diperlukan ditandai"
|
||||
comment_form_comment_label : "Komentar"
|
||||
comment_form_md_info : "Markdown disupport."
|
||||
comment_form_name_label : "Nama"
|
||||
comment_form_email_label : "Alamat email"
|
||||
comment_form_website_label : "Website (opsional)"
|
||||
comment_btn_submit : "Submit Komentar"
|
||||
comment_btn_submitted : "Telah disubmit"
|
||||
comment_success_msg : "Terimakasih atas komentar Anda! Komentar ini akan tampil setelah disetujui."
|
||||
comment_error_msg : "Maaf, ada kesalahan pada submisi Anda. Pastikan seluruh kolom sudah dilengkapi dan coba kembali."
|
||||
loading_label : "Sedang meload..."
|
||||
id-ID:
|
||||
<<: *DEFAULT_ID
|
||||
|
||||
# Another locale
|
||||
# --------------
|
||||
#
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Frequently Asked Questions
|
||||
sidebar: talk_sidebar
|
||||
permalink: faq.html
|
||||
summary:
|
||||
permalink: /docs/faq/
|
||||
---
|
||||
|
||||
### How are new stories/assets added to Talk? Is there an API?
|
||||
@@ -27,7 +25,7 @@ The scraping mechanism utilizes [metascraper](https://www.npmjs.com/package/meta
|
||||
|
||||
If tighter CMS integration is required to push custom data into assets and/or keep data in sync as changes are made in a CMS an _active_ push based workflow must be implemented.
|
||||
|
||||
This is an ideal candidate for a plugin. If you are interested in working on it, please [contact us](https://coralproject.net/contact.html)!
|
||||
This is an ideal candidate for a plugin. If you are interested in working on it, please [contact us](https://coralproject.net/contact)!
|
||||
|
||||
#### Manual asset creation
|
||||
|
||||
@@ -43,7 +41,7 @@ In addition, Talk Server ships with [GraphiQL](https://github.com/graphql/graphi
|
||||
|
||||
To access GraphiQL:
|
||||
|
||||
* [Install Talk](install-source.html).
|
||||
* [Install Talk](install-source).
|
||||
* Open http://localhost:3000/api/v1/graph/iql in your browser. (Note, your server an port may differ.)
|
||||
|
||||
### Where is documentation for a specific component?
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Installation
|
||||
sidebar: talk_sidebar
|
||||
permalink: install.html
|
||||
summary:
|
||||
title: Installation Overview
|
||||
permalink: /docs/install/
|
||||
---
|
||||
|
||||
## Requirements
|
||||
@@ -16,7 +14,8 @@ Talk requires MongoDB and Redis.
|
||||
|
||||
While Talk can be installed in many ways, we support two install paths:
|
||||
|
||||
* [Install from Source](install-source.html) (development)
|
||||
* [Install via Docker](install-docker.html) (deployment)
|
||||
* [Install from Source](source) (development)
|
||||
* [Install via Docker](docker) (deployment)
|
||||
|
||||
If you have success installing Talk in another way, please consider [contributing to this documentation](faq.html#how-do-i-contribute-to-these-docs)!
|
||||
If you have success installing Talk in another way, please consider
|
||||
[contributing to this documentation](faq#how-do-i-contribute-to-these-docs)!
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Installation From Docker
|
||||
sidebar: talk_sidebar
|
||||
permalink: install-docker.html
|
||||
summary:
|
||||
permalink: /docs/install/docker/
|
||||
---
|
||||
|
||||
We currently support packaging the Talk application via Docker, which automates
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Installation From Source
|
||||
sidebar: talk_sidebar
|
||||
permalink: install-source.html
|
||||
summary:
|
||||
permalink: /docs/install/source/
|
||||
---
|
||||
|
||||
This provides information on how to setup the application from source. Note that
|
||||
@@ -1,8 +1,6 @@
|
||||
---
|
||||
title: Setup
|
||||
sidebar: talk_sidebar
|
||||
permalink: install-setup.html
|
||||
summary:
|
||||
title: First Setup
|
||||
permalink: /docs/install/setup/
|
||||
---
|
||||
|
||||
Once you've installed Talk (either via Docker or source), you still need to
|
||||
@@ -1,9 +1,6 @@
|
||||
---
|
||||
title: Microservice Deployments
|
||||
keywords: install
|
||||
sidebar: talk_sidebar
|
||||
permalink: install-microservices.html
|
||||
summary:
|
||||
permalink: /docs/install/microservices/
|
||||
---
|
||||
|
||||
In Talk, we seek to deliver the simplicity of a monolith with the advantages of
|
||||
@@ -1,9 +1,6 @@
|
||||
---
|
||||
title: Installation Troubleshooting
|
||||
keywords: install
|
||||
sidebar: talk_sidebar
|
||||
permalink: install-troubleshooting.html
|
||||
summary:
|
||||
permalink: /docs/install/troubleshooting/
|
||||
---
|
||||
|
||||
This page tracks common issues that arise when installing Talk and provides resolutions.
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
title: Configuration
|
||||
permalink: /docs/running/configuration/
|
||||
---
|
||||
|
||||
{% include toc %}
|
||||
|
||||
## Overview
|
||||
{:.no_toc}
|
||||
|
||||
Talk, like many web applications, requires manual configuration via environment
|
||||
variables to configure the server for your specific needs. This is following the
|
||||
standard [12 Factor App Manifesto](https://12factor.net/) which requires that
|
||||
said configuration lives as environment variables.
|
||||
|
||||
During development, we can utilize a `.env` file, which takes the form of
|
||||
`NAME=VALUE`. For example:
|
||||
|
||||
```bash
|
||||
TALK_MONGO_URL=mongodb://some-awesome-mongo-instance
|
||||
TALK_REDIS_URL=redis://some-awesome-redis-instance
|
||||
TALK_ROOT_URL=https://my-awesome-talk.com
|
||||
# ... and so on
|
||||
```
|
||||
|
||||
When you place a file titled `.env` at the root of the project, and start the
|
||||
application with `yarn dev-start`, it will read in the contents of the `.env`
|
||||
file as if they were environment variables. This is done via the
|
||||
[dotenv](https://github.com/motdotla/dotenv) package. In production, using this
|
||||
method is discouraged, as it promotes bad practices such as storing config in a
|
||||
file.
|
||||
|
||||
## Variables
|
||||
|
||||
The Talk application looks for the following configuration values either as
|
||||
environment variables. Refer to the
|
||||
[config.js](https://github.com/coralproject/talk/blob/master/config.js) file to
|
||||
see how the configuration is parsed.
|
||||
|
||||
### Database
|
||||
|
||||
- `TALK_MONGO_URL` (*required*) - the database connection string for the MongoDB database.
|
||||
- `TALK_REDIS_URL` (*required*) - the database connection string for the Redis database.
|
||||
|
||||
### Server
|
||||
|
||||
- `TALK_ROOT_URL` (*required*) - root url of the installed application externally
|
||||
available in the format: `<scheme>://<host>` without the path.
|
||||
- `TALK_KEEP_ALIVE` (_optional_) - The keepalive timeout that should be used to
|
||||
send keep alive messages through the websocket to keep the socket alive. (Default `30s`)
|
||||
- `TALK_INSTALL_LOCK` (_optional for dynamic setup_) - When `TRUE`, disables the dynamic setup endpoint. (Default `FALSE`)
|
||||
|
||||
### JWT
|
||||
|
||||
The following are configuration shared with every type of secret used.
|
||||
|
||||
- `TALK_JWT_ALG` (_optional_) - the algorithm used to sign/verify JWT's used for
|
||||
session management. Read up about alternative algorithms on the
|
||||
[jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken#algorithms-supported) package. (Default `HS256`)
|
||||
- `TALK_JWT_EXPIRY` (_optional_) - the expiry duration (`exp`) for the tokens
|
||||
issued for logged in sessions. (Default `1 day`)
|
||||
- `TALK_JWT_ISSUER` (_optional_) - the issuer (`iss`) claim for login JWT
|
||||
tokens. (Default `process.env.TALK_ROOT_URL`)
|
||||
- `TALK_JWT_AUDIENCE` (_optional_) - the audience (`aud`) claim for login JWT
|
||||
tokens. (Default `talk`)
|
||||
- `TALK_JWT_COOKIE_NAME` (_optional_) - the name of the cookie to extract the
|
||||
JWT from (Default `authorization`)
|
||||
- `TALK_JWT_CLEAR_COOKIE_LOGOUT` (_optional_) - when `FALSE`, Talk will not
|
||||
clear the cookie with name `TALK_JWT_COOKIE_NAME` when logging out (Default
|
||||
`TRUE`)
|
||||
|
||||
**You must also specify secrets as either the `TALK_JWT_SECRET` or the `TALK_JWT_SECRETS`
|
||||
variable. Refer to the [Secrets Documentation]({{ "/docs/running/secrets/" | absolute_url }})
|
||||
on the contents of those variables.**
|
||||
|
||||
### Email
|
||||
|
||||
- `TALK_SMTP_EMAIL` (*required for email*) - the address to send emails from
|
||||
using the SMTP provider.
|
||||
- `TALK_SMTP_USERNAME` (*required for email*) - username of the SMTP provider
|
||||
you are using.
|
||||
- `TALK_SMTP_PASSWORD` (*required for email*) - password for the SMTP provider
|
||||
you are using.
|
||||
- `TALK_SMTP_HOST` (*required for email*) - SMTP host url with format
|
||||
`smtp.domain.com`, note the lack of protocol on the domain.
|
||||
- `TALK_SMTP_PORT` (*required for email*) - SMTP port.
|
||||
|
||||
|
||||
### Recaptcha
|
||||
|
||||
- `TALK_RECAPTCHA_SECRET` (*required for reCAPTCHA support*) - server secret used for enabling reCAPTCHA powered logins. If not provided it will instead default to providing only a time based lockout.
|
||||
- `TALK_RECAPTCHA_PUBLIC` (*required for reCAPTCHA support*) - client secret used for enabling reCAPTCHA powered logins. If not provided it will instead default to providing only a time based lockout.
|
||||
|
||||
### Plugins
|
||||
|
||||
- `TALK_PLUGINS_JSON` (_optional_) - used to specify the plugin config via the
|
||||
environment.
|
||||
- `TALK_DISABLE_AUTOFLAG_SUSPECT_WORDS` (_optional_) When `TRUE`, disables flagging of comments that match the suspect word filter. (Default `FALSE`)
|
||||
@@ -0,0 +1,106 @@
|
||||
---
|
||||
title: Secrets
|
||||
permalink: /docs/running/secrets/
|
||||
---
|
||||
|
||||
{% include toc %}
|
||||
|
||||
## Secret Types
|
||||
|
||||
We support two types of secrets.
|
||||
|
||||
- Shared secrets
|
||||
- Asymmetric Secrets
|
||||
|
||||
### Shared Secret
|
||||
|
||||
You would use a shared secret when you have no need to share the tokens with
|
||||
other applications in your organization.
|
||||
|
||||
Supported signing algorithms:
|
||||
|
||||
- HS256
|
||||
- HS384
|
||||
- HS512
|
||||
|
||||
These must be provided in the form:
|
||||
|
||||
```json
|
||||
{
|
||||
"secret": "<my secret key>"
|
||||
}
|
||||
```
|
||||
|
||||
### Asymmetric Secret
|
||||
|
||||
You would use a asymmetric secret when you want to share the token in your
|
||||
organization, and would like to pass an existing auth token to Talk in order to
|
||||
authenticate your users. (Documentation on how to do this is pending!).
|
||||
|
||||
Supported signing algorithms:
|
||||
|
||||
- RS256
|
||||
- RS384
|
||||
- RS512
|
||||
- ES256
|
||||
- ES384
|
||||
- ES512
|
||||
|
||||
These must be provided in the form:
|
||||
|
||||
```json
|
||||
{
|
||||
"public": "<the PEM encoded public key>",
|
||||
"private": "<the PEM encoded private key>"
|
||||
}
|
||||
```
|
||||
|
||||
Note that when using the asymmetric keys as discussed above, the certificates
|
||||
must have their newlines replaced with `\\n`, this is to ensure that the
|
||||
newlines are preserved after JSON decoding. Not doing so will result in parsing
|
||||
errors.
|
||||
|
||||
## Authentication Types
|
||||
|
||||
Talk also supports two methods of providing authenticationd details.
|
||||
|
||||
- Single key: this is used when your secrets do not need to be rotated.
|
||||
- Multiple keys: this is used when you expect to rotate your secrets.
|
||||
|
||||
### Single Key
|
||||
|
||||
When using a single key, you can utilize the following configuration style:
|
||||
|
||||
- `TALK_JWT_SECRET` (*required*) - The shared secret or certificate (depending
|
||||
on your choice of `TALK_JWT_ALG`) used for jwt tokens.
|
||||
|
||||
An example of this:
|
||||
|
||||
```bash
|
||||
# for a shared secret
|
||||
TALK_JWT_SECRET={"secret": "<my secret string>"}
|
||||
|
||||
# for a asymmetric secret
|
||||
TALK_JWT_SECRET={"private": "<my private key>", "public": "<my public key>"}
|
||||
```
|
||||
|
||||
### Multiple Key
|
||||
|
||||
When using a multiple keys, you can utilize the following configuration style:
|
||||
|
||||
- `TALK_JWT_SECRETS` (_optional_) - used when specifying multiple secrets used
|
||||
for key rotations. This is a JSON encoded array, where each element matches
|
||||
the JWT Secret pattern.
|
||||
|
||||
All secrets also get a `kid` field which uniquely identifies a given key and
|
||||
will sign all tokens with that `kid` for later identification.
|
||||
|
||||
An example of this:
|
||||
|
||||
```bash
|
||||
# for a shared secret
|
||||
TALK_JWT_SECRETS=[{"kid" "1", "secret": "<my secret string>"}, {"kid" "2", "secret": "<my other secret string>"}]
|
||||
|
||||
# for a asymmetric secret
|
||||
TALK_JWT_SECRETS=[{"kid": "1", "private": "<my private key>", "public": "<my public key>"}, {"kid": "2", "private": "<my other private key>", "public": "<my other public key>"}]
|
||||
```
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
title: Database Migrations
|
||||
permalink: /docs/running/migrations/
|
||||
---
|
||||
|
||||
On major version changes, database migrations are usually required. The
|
||||
application will refuse to start until all pending migrations are ran. This also
|
||||
applies to empty databases.
|
||||
|
||||
## Running Migrations
|
||||
|
||||
We have a migration tool that can be run using `bin/cli migration run`. This
|
||||
will detect new migrations available and prompt you to backup your database
|
||||
before proceeding with the migration. Migrations are required with major version
|
||||
releases.
|
||||
@@ -1,9 +1,6 @@
|
||||
---
|
||||
title: Architecture Overview
|
||||
keywords: architecture
|
||||
sidebar: talk_sidebar
|
||||
permalink: architecture.html
|
||||
summary:
|
||||
permalink: /docs/architecture/
|
||||
---
|
||||
|
||||
## Talk's Architecture
|
||||
@@ -17,7 +14,7 @@ Talk consists of four distinct layers of code:
|
||||
|
||||
### Plugins
|
||||
|
||||
Talk plugins deliver the features and functionality that can be changed or removed. Much of the default functionality is delivered by core plugins allowing developers to have control over any non-essential functionality.
|
||||
Talk plugins deliver the features and functionality that can be changed or removed. Much of the default functionality is delivered by core plugins allowing developers to have control over any non-essential functionality.
|
||||
|
||||
### Plugin API
|
||||
|
||||
@@ -31,7 +28,7 @@ Our goal is to continually extend our plugin infrastructure making the Core as p
|
||||
|
||||
### cli
|
||||
|
||||
Talk ships with [a cli tool](architecture-cli.html) that exposes functionality to the command line. We seek to provide cli functionality for all features that could need to be accomplished programmatically or prior to the server's startup.
|
||||
Talk ships with [a cli tool]({{ "/docs/architecture/cli" | absolute_url }}) that exposes functionality to the command line. We seek to provide cli functionality for all features that could need to be accomplished programmatically or prior to the server's startup.
|
||||
|
||||
## Thinking about Plugins, the Plugin API and Core?
|
||||
|
||||
@@ -53,7 +50,7 @@ Most work for Talk happens in the Plugin space. If the answers to any of these q
|
||||
* Is this something that only some users will want/need?
|
||||
* Is this something that we want devs to iterate on widely?
|
||||
|
||||
You should [build it as a plugin](plugins-quickstart.html). Feel free to explore here on your own or reach out to us. We love to advise on plugins, so please feel free to [file an issue](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md) and we will start a conversation. We will help you conceptualize, architect and promote your plugin if it is in line with our values.
|
||||
You should [build it as a plugin]({{ "/docs/plugins/quickstart" | absolute_url }}). Feel free to explore here on your own or reach out to us. We love to advise on plugins, so please feel free to [let us know]({{ "/docs/development/contributing" | absolute_url }}#writing-code) and we will start a conversation. We will help you conceptualize, architect and promote your plugin if it is in line with our values.
|
||||
|
||||
### Does it need updates to the Plugin API?
|
||||
|
||||
@@ -61,7 +58,7 @@ If you answered yes above:
|
||||
|
||||
* Do I need to extend the Plugin API to support my plugin?
|
||||
|
||||
Often times all the functionality a plugin needs is in the Core, but the Plugin API doesn't expose it. In these cases, we seek to iteratively extend the Talk Plugin API. All Plugin API contributions from the community must begin by [filing an Issue](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md).
|
||||
Often times all the functionality a plugin needs is in the Core, but the Plugin API doesn't expose it. In these cases, we seek to iteratively extend the Talk Plugin API. All Plugin API contributions from the community must begin by [let us know]({{ "/docs/development/contributing" | absolute_url }}#writing-code).
|
||||
|
||||
Note: we are stabilizing the process by which new Plugin API bindings are created, agreed upon and ultimately made part of our Plugins Contract. If you are interested in this process, please reach out to us.
|
||||
|
||||
@@ -77,4 +74,4 @@ We seek to keep Core as lean as possible.
|
||||
|
||||
Amazing! We are always looking to extend the capabilities of Talk. We look forward to discussing what you've got to bring!
|
||||
|
||||
Please see our [contributing guide](](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md)) for more information.
|
||||
Please see our [contributing guide]({{ "/docs/development/contributing" | absolute_url }}) for more information.
|
||||
@@ -1,12 +1,9 @@
|
||||
---
|
||||
title: Tags
|
||||
keywords: architecture
|
||||
sidebar: talk_sidebar
|
||||
permalink: architecture-tags.html
|
||||
summary:
|
||||
permalink: /docs/architecture/tags/
|
||||
---
|
||||
|
||||
Tags are essentially strings that can be added to models. Currently, tags can be added to [Users, Comments and Assets](https://github.com/coralproject/talk/blob/ced449a1489d47c25d604020fa2e0b3b7a741353/graph/typeDefs.graphql#L144). If you would like to add tags to other models, you can extend this schema using [GraphQL hooks](plugins-server.html#graphql-hooks).
|
||||
Tags are essentially strings that can be added to models. Currently, tags can be added to [Users, Comments and Assets](https://github.com/coralproject/talk/blob/ced449a1489d47c25d604020fa2e0b3b7a741353/graph/typeDefs.graphql#L144). If you would like to add tags to other models, you can extend this schema using [GraphQL hooks]({{ "/docs/plugins/server" | absolute_url }}#graphql-hooks).
|
||||
|
||||
## Tag Definitions
|
||||
|
||||
@@ -21,7 +18,7 @@ Note that along with the `name`, tag definitions contains:
|
||||
|
||||
Whenever a tag is 'handled' by the server, it references this definition to determine that tag's behavior.
|
||||
|
||||
See [Plugin API Documentation](plugins-server.html#field-tags) for more information.
|
||||
See [Plugin API Documentation]({{ "/docs/plugins/server" | absolute_url }}#field-tags) for more information.
|
||||
|
||||
### Creating a Tag Definition
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
---
|
||||
title: Metadata
|
||||
keywords: architecture
|
||||
sidebar: talk_sidebar
|
||||
permalink: architecture-metadata.html
|
||||
summary:
|
||||
permalink: /docs/architecture/metadata/
|
||||
---
|
||||
|
||||
_Metadata_ allows you to add fields to models that are not represented in the core schema.
|
||||
@@ -89,4 +86,4 @@ Since metadata can be added by the core and multiple plugins, collisions may occ
|
||||
|
||||
### Querying by metadata fields
|
||||
|
||||
We currently do not have a clean way to index metadata fields. As a result queries that match against metadata fields will not scale. If you have a need to match, sort, etc... by a metadata field, [please let us know](https://github.com/coralproject/talk/blob/master/CONTRIBUTING.md#writing-code).
|
||||
We currently do not have a clean way to index metadata fields. As a result queries that match against metadata fields will not scale. If you have a need to match, sort, etc... by a metadata field, [please let us know]({{ "/docs/development/contributing" | absolute_url }}#writing-code).
|
||||
@@ -1,16 +1,13 @@
|
||||
---
|
||||
title: The Talk cli
|
||||
keywords: architecture
|
||||
sidebar: talk_sidebar
|
||||
permalink: architecture-cli.html
|
||||
summary:
|
||||
title: Command Line Interface (cli)
|
||||
permalink: /docs/architecture/cli/
|
||||
---
|
||||
|
||||
Talk ships with a cli tool that allows access to a wide variety of functionality.
|
||||
|
||||
It is designed to provide a convenient way for engineers to perform key tasks without the need to muck about in the UI. It also opens the door for scripts to perform operations programmatically.
|
||||
|
||||
Note: the cli tool requires [the Talk environment to be configured](configuration.html) either via env vars or by using a `.cli` file via `bin/cli -c .env [command] ....`
|
||||
Note: the cli tool requires [the Talk environment to be configured]({{ "/docs/running/configuration" | absolute_url }}) either via env vars or by using a `.cli` file via `bin/cli -c .env [command] ....`
|
||||
|
||||
## Using the cli
|
||||
|
||||
@@ -28,7 +25,7 @@ bin/cli [options] [commands] [arguments]
|
||||
|
||||
If you're a heavy cli user, consider adding the `bin` folder to your PATH so you can run `cli` from anywhere!
|
||||
|
||||
If you are using [our Docker environment](install-docker.html), the bin folder will already be in the PATH.
|
||||
If you are using [our Docker environment]({{ "/docs/install/docker" | absolute_url }}), the bin folder will already be in the PATH.
|
||||
|
||||
## What can I do with the cli?
|
||||
|
||||
@@ -136,4 +133,4 @@ Please secure your environments and credentials or the cli tool becomes a conven
|
||||
|
||||
The Talk cli is based on the excellent [commander](https://github.com/tj/commander.js/) library.
|
||||
|
||||
At the time of writing, there are no plugin hooks for the cli tool. If you would like to change this, whether by writing code yourself or recommending a need, please [write and issue](https://github.com/coralproject/talk/blob/053b687959d45bcd682a1a2a4b604ebfab7441bb/CONTRIBUTING.md#writing-code).
|
||||
At the time of writing, there are no plugin hooks for the cli tool. If you would like to change this, whether by writing code yourself or recommending a need, please [write and issue]({{ "/docs/development/contributing" | absolute_url }}#writing-code).
|
||||
@@ -1,9 +1,6 @@
|
||||
---
|
||||
title: Core Client Architecture
|
||||
keywords: homepage
|
||||
sidebar: talk_sidebar
|
||||
permalink: client-architecture.html
|
||||
summary:
|
||||
title: Client Architecture
|
||||
permalink: /docs/architecture/client
|
||||
---
|
||||
|
||||
## The Stack
|
||||
@@ -108,13 +105,14 @@ We found some really good tradeoffs while building Talk.
|
||||
|
||||
|
||||
## Test
|
||||
[How we do testing at Coral with Talk](/tools.html)
|
||||
[How we do testing at Coral with Talk]({{ "/docs/development/tools" | absolute_url }})
|
||||
|
||||
|
||||
## Lint
|
||||
For linting in Talk we use `eslint:recommended`
|
||||
|
||||
You can find more info about the rules and best practices here:
|
||||
|
||||
http://eslint.org/docs/rules/#best-practices
|
||||
|
||||
## Lint the code
|
||||
@@ -124,5 +122,5 @@ yarn lint
|
||||
|
||||
|
||||
## The Future of the Frontend
|
||||
- Preact
|
||||
- Reselect
|
||||
- [Preact](https://github.com/developit/preact)
|
||||
- [Reselect](https://github.com/reactjs/reselect)
|
||||
@@ -1,11 +1,12 @@
|
||||
---
|
||||
title: Plugins Overview
|
||||
keywords: plugins
|
||||
sidebar: talk_sidebar
|
||||
permalink: plugins.html
|
||||
summary:
|
||||
permalink: /docs/plugins/
|
||||
---
|
||||
|
||||
## Recipes
|
||||
|
||||
Recipes are plugin templates provided by the Coral Core team. Developers can use these recipes to build their own plugins. You can find all the Talk recipes here: https://github.com/coralproject/talk-recipes/
|
||||
|
||||
## Plugin Registration
|
||||
|
||||
In order for a plugin to be active in a Talk install, it must be _registered_. The parsing order for the plugin registration is as follows:
|
||||
@@ -1,18 +1,15 @@
|
||||
---
|
||||
title: Plugins Quickstart
|
||||
keywords: plugins
|
||||
sidebar: talk_sidebar
|
||||
permalink: plugins-quickstart.html
|
||||
summary:
|
||||
permalink: /docs/plugins/quickstart/
|
||||
---
|
||||
|
||||
This tutorial walks through the mechanics of creating and publishing a Talk plugin. Along the way I call out some particular habits and techniques that I employ. If you have other practices that you find valuable, please don't hesitate to [contribute!](faq.html#how-do-i-contribute-to-these-docs)
|
||||
This tutorial walks through the mechanics of creating and publishing a Talk plugin. Along the way I call out some particular habits and techniques that I employ. If you have other practices that you find valuable, please don't hesitate to [contribute!]({{ "/docs/faq" | absolute_url }}#how-do-i-contribute-to-these-docs)
|
||||
|
||||
We will create a plugin that exposes a route that allows assets to be created or updated.
|
||||
|
||||
## Setup the environment
|
||||
|
||||
Before I begin working on the plugin, I've installed [Talk from source](/install-source.html).
|
||||
Before I begin working on the plugin, I've installed [Talk from source]({{ "/docs/development/tools" | absolute_url }}).
|
||||
|
||||
### Watch the Server
|
||||
|
||||
@@ -81,7 +78,7 @@ git clone https://github.com/jde/talk-plugin-asset-manager.git
|
||||
|
||||
Add the plugin to the plugins.json file:
|
||||
|
||||
```
|
||||
```json
|
||||
{
|
||||
"server": [
|
||||
...
|
||||
@@ -98,11 +95,11 @@ But wait! Talk looks in `talk/plugins/[plugin-name]` for plugin code. Why couldn
|
||||
|
||||
We could have.
|
||||
|
||||
This would make it _a little_ easier to register, but _a lot_ harder to cleanly manage in version control. In order to avoid it being sucked into your Talk repo, you would have to manually `.gitignore` it or use [sub modules]() or something similar.
|
||||
This would make it _a little_ easier to register, but _a lot_ harder to cleanly manage in version control. In order to avoid it being sucked into your Talk repo, you would have to manually `.gitignore` it or use sub modules or something similar.
|
||||
|
||||
As a user of a Linux_y_ os, I prefer to create a symbolic link.
|
||||
|
||||
```
|
||||
```bash
|
||||
cd $CORALPATH/talk/plugins
|
||||
ln -s $CORALPATH/talk-plugin-asset-manager
|
||||
```
|
||||
@@ -113,14 +110,14 @@ Now, as far as Talk knows, our plugin is right there in the folder. Git is wise,
|
||||
|
||||
All plugins contain server and/or client index files, which export all plugin functionality.
|
||||
|
||||
```
|
||||
```js
|
||||
// talk-plugin-asset-manager/index.js
|
||||
module.exports = {};
|
||||
```
|
||||
|
||||
## Build the feature!
|
||||
|
||||
Now that the plugin is set up I can get down to writing the feature. My goal is to allow my CMS to push new assets as they are created into Talk. To accomplish this, I will create a POST endpoint using Talk's [route api](plugins-server.html#field-router).
|
||||
Now that the plugin is set up I can get down to writing the feature. My goal is to allow my CMS to push new assets as they are created into Talk. To accomplish this, I will create a POST endpoint using Talk's [route api]({{ "/docs/plugins/server" | absolute_url }}#field-router).
|
||||
|
||||
### Create a route
|
||||
|
||||
@@ -130,7 +127,7 @@ _Always namespace all universals with your plugin's unique name._
|
||||
|
||||
To ensure everything is hooked up, I'll log the request body (POST payload in this case) to the console and echo it as the response:
|
||||
|
||||
```
|
||||
```js
|
||||
// talk-plugin-asset-manager/index.js
|
||||
module.exports = {
|
||||
router(router) {
|
||||
@@ -146,15 +143,15 @@ When I save this file, I reflexively check my console to be sure that the server
|
||||
|
||||
To test that this works, I can:
|
||||
|
||||
```
|
||||
$ curl -H "Content-Type: application/json" -X POST -d '{"url":"http://localhost:3000/my-article.html","title":"My Article"}' http://localhost:3000/api/v1/asset-manager
|
||||
{"url":"http://localhost:3000/my-article.html","title":"My Article"}
|
||||
```bash
|
||||
$ curl -H "Content-Type: application/json" -X POST -d '{"url":"http://localhost:3000/my-article","title":"My Article"}' http://localhost:3000/api/v1/asset-manager
|
||||
{"url":"http://localhost:3000/my-article","title":"My Article"}
|
||||
```
|
||||
|
||||
After hitting the endpoint, I can also look at the terminal running `yarn dev-start` and see my `console.log()` and the access log:
|
||||
|
||||
```
|
||||
{ url: 'http://localhost:3000/my-article.html',
|
||||
{ url: 'http://localhost:3000/my-article',
|
||||
title: 'My Article' }
|
||||
POST /api/v1/asset-manager 200 1.379 ms - 68
|
||||
```
|
||||
@@ -165,7 +162,7 @@ When I save this asset, I will use Talk's [asset model](https://github.com/coral
|
||||
|
||||
Mongo has a handy method [findOneAndUpdate](https://docs.mongodb.com/v3.2/reference/method/db.collection.findOneAndUpdate/) that will take care determining whether or not this asset exists, then either updating or inserting it. Whenever possible, we recommend using these atomic patterns that prevent multiple queries to the db and the efficiency problems and race conditions that they cause.
|
||||
|
||||
```
|
||||
```js
|
||||
// talk-plugin-asset-manager/index.js
|
||||
|
||||
const AssetModel = require('models/asset');
|
||||
@@ -206,7 +203,7 @@ Some things to make this production ready:
|
||||
* commenting
|
||||
* adding tests
|
||||
* validating data
|
||||
* [adding security](https://github.com/coralproject/talk/blob/b805451d376d2892c81c58d8822a85563e469b88/routes/api/users/index.js#L14)
|
||||
* [adding security](https://github.com/coralproject/talk/blob/b805451d376d2892c81c58d8822a85563e469b88/routes/api/users/index.js#L14)
|
||||
* incorporating [domain whitelisting](https://github.com/coralproject/talk/blob/b805451d376d2892c81c58d8822a85563e469b88/services/assets.js#L60).
|
||||
|
||||
It is important to realize that when you're writing a Talk plugin you are writing a program that may be touched by other devs and could grow in size and complexity. Bring your best engineering sensibilities to bear.
|
||||
@@ -215,23 +212,23 @@ It is important to realize that when you're writing a Talk plugin you are writin
|
||||
|
||||
### Publish to npm
|
||||
|
||||
In order to [register](plugins.html#plugin-registration) your _published_ plugin, you will need to [publish it to npm](https://docs.npmjs.com/getting-started/publishing-npm-packages).
|
||||
In order to [register]({{ "/docs/plugins" | absolute_url }}#plugin-registration) your _published_ plugin, you will need to [publish it to npm](https://docs.npmjs.com/getting-started/publishing-npm-packages).
|
||||
|
||||
Once the package is published, update `plugins.json` to use the published plugin:
|
||||
|
||||
```
|
||||
```json
|
||||
{
|
||||
"server": [
|
||||
...
|
||||
// ...
|
||||
{"talk-plugin-asset-manager": "^0.1"}
|
||||
],
|
||||
...
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
Finally, run the `reconcile` script to install the plugin from npm.
|
||||
|
||||
```
|
||||
```bash
|
||||
$ bin/cli plugins reconcile
|
||||
```
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
---
|
||||
title: Client Plugin API
|
||||
keywords: homepage
|
||||
sidebar: talk_sidebar
|
||||
permalink: plugins-client.html
|
||||
summary:
|
||||
permalink: /docs/plugins/client/
|
||||
---
|
||||
We can build plugins to extend the client side functionality of Talk.
|
||||
|
||||
{% include toc title="API" %}
|
||||
|
||||
## Overview
|
||||
|
||||
We can build plugins to extend the client side functionality of Talk.
|
||||
|
||||
The ultimate goal of our client side plugin architecture is to allow developers
|
||||
to build on existing concepts without needing to understand core code while
|
||||
@@ -16,7 +18,7 @@ providing complete power and flexibility of javascript, css and html.
|
||||
* [Reactions](#reactions)
|
||||
* [Styling](#styling-plugins)
|
||||
|
||||
Advanced users will quickly realize that our plugins have complete access to core code. If you would like to write advanced plugins that reach outside of our published API as described in this document, please see [our notes on experimental plugins](/plugins/EXPERIMENTAL.md).
|
||||
Advanced users will quickly realize that our plugins have complete access to core code. If you would like to write advanced plugins that reach outside of our published API as described in this document, please see [our notes on experimental plugins]({{ "/docs/plugins/experimental/" | absolute_url }}).
|
||||
|
||||
Under the hood our plugins are powered by *React*, *Redux* and *GraphQL*. We can also build them with simple vanilla javascript.
|
||||
|
||||
@@ -274,8 +276,10 @@ The plugins injected in the CommentBox such as `commentInputDetailArea` will inh
|
||||
```
|
||||
|
||||
### The server folder and the index file
|
||||
|
||||
Read more about the `/server` and how to extend Talk here.
|
||||
[talk/PLUGINS.md at master · coralproject/talk · GitHub](https://github.com/coralproject/talk/blob/master/PLUGINS.md)
|
||||
|
||||
[Server API]({{ "/docs/plugins/server/" | absolute_url }})
|
||||
|
||||
## ESlint and Babel
|
||||
In talk we use `eslint:recommended` and Babel with the latest ECMAScript Features. But you can use your own!
|
||||
@@ -1,13 +1,12 @@
|
||||
---
|
||||
title: Server Plugin API
|
||||
keywords: homepage
|
||||
sidebar: talk_sidebar
|
||||
permalink: plugins-server.html
|
||||
summary:
|
||||
permalink: /docs/plugins/server/
|
||||
---
|
||||
|
||||
{% include toc title="API" %}
|
||||
|
||||
## The Server Folder
|
||||
The server functionality of our plugin lives inside the `server` folder. The `server`
|
||||
The server functionality of our plugin lives inside the `server` folder. The `server`
|
||||
folder must have an `index.js` file that exports the configuration of our plugin.
|
||||
|
||||
```
|
||||
@@ -141,7 +140,7 @@ the resolvers function. These must return a promise or a value.
|
||||
```
|
||||
|
||||
Should return a resolver map as described in the
|
||||
[Apollo Docs](http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-map).
|
||||
[Apollo Docs](http://dev.apollodata.com/tools/graphql-tools/resolvers#Resolver-map).
|
||||
|
||||
This will merge with the existing resolvers in core and from previous plugins.
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
---
|
||||
title: Experimental Plugin API
|
||||
keywords: homepage
|
||||
sidebar: talk_sidebar
|
||||
permalink: plugins-experimental.html
|
||||
summary:
|
||||
permalink: /docs/plugins/experimental/
|
||||
---
|
||||
|
||||
Talk plugins are, in essence, small programs that hook into the core application in a variety of ways. Ultimately, this code can do anything that javascript is capable of. In addition, plugins can import any core code to hook into talk at any level.
|
||||
@@ -1,9 +1,6 @@
|
||||
---
|
||||
title: Tooling
|
||||
keywords: homepage
|
||||
sidebar: talk_sidebar
|
||||
permalink: tools.html
|
||||
summary:
|
||||
title: Development Tooling
|
||||
permalink: /docs/development/tools
|
||||
---
|
||||
|
||||
## Debugging
|
||||
@@ -32,5 +29,5 @@ Redux Devtool is an amazing debug tool. You can easily see what' happening with
|
||||
|
||||
Talk ships with GraphiQL, a live data layer IDE. We strongly recommend using GraphiQL early and often as you work with all things queries, mutations and subscriptions!
|
||||
|
||||
* [Install Talk](install-source.html).
|
||||
* [Install Talk]({{ "/docs/install/source" | absolute_url }}).
|
||||
* Open http://localhost:3000/api/v1/graph/iql in your browser. (Note, your server an port may differ.)
|
||||
@@ -1,10 +1,13 @@
|
||||
# Contributor's Guide
|
||||
---
|
||||
title: Contributor's Guide
|
||||
permalink: /docs/development/contributing/
|
||||
---
|
||||
|
||||
Welcome! We are very excited that you are interested in contributing to Talk.
|
||||
|
||||
This document is a companion to help you approach contributing. If it does not do so, please [let us know how we can improve it](https://github.com/coralproject/talk/issues)!
|
||||
|
||||
By contributing to this project you agree to the [Code of Conduct](https://coralproject.net/code-of-conduct.html).
|
||||
By contributing to this project you agree to the [Code of Conduct](https://coralproject.net/code-of-conduct).
|
||||
|
||||
## What should I Contribute?
|
||||
|
||||
@@ -32,7 +35,7 @@ Please file issues if:
|
||||
|
||||
Coral has adopted an iterative, agile development philosophy. All contributions that make it into the Talk repo should start with a story or this form:
|
||||
|
||||
`As a [type of person] I'd like to be able to [do something] so that I can [get some result].`
|
||||
> As a [type of person] I'd like to be able to [do something] so that I can [get some result].
|
||||
|
||||
This exercise does two things:
|
||||
|
||||
@@ -53,7 +56,7 @@ We are looking for _documentarians_ to:
|
||||
* create new / missing sections, and
|
||||
* take the lead in making sections, or the over all structure better.
|
||||
|
||||
Information about how to update docs can be found in our [FAQ](faq.html#how-do-i-contribute-to-these-docs).
|
||||
Information about how to update docs can be found in our [FAQ]({{ "/docs/faq" | absolute_url }}#how-do-i-contribute-to-these-docs).
|
||||
|
||||
If you'd like to discuss a contribution, please [file an issue](https://github.com/coralproject/talk/issues) describing the changes you would like to see.
|
||||
|
||||
@@ -61,7 +64,7 @@ If you'd like to discuss a contribution, please [file an issue](https://github.c
|
||||
|
||||
Talk's tranlations are stored in `.yml` files [here](https://github.com/coralproject/talk/tree/master/locales).
|
||||
|
||||
Translations can be submitted via pull request. If you do not use github, you can use 'en.yml' as a template and [email](https://coralproject.net/contact.html) the translations to us. We can import it into the repo.
|
||||
Translations can be submitted via pull request. If you do not use github, you can use 'en.yml' as a template and [email](https://coralproject.net/contact) the translations to us. We can import it into the repo.
|
||||
|
||||
## I want to contribute but I'm not sure what to do!
|
||||
|
||||
@@ -73,7 +76,7 @@ Please visit our product roadmap here: https://www.pivotaltracker.com/n/projects
|
||||
|
||||
### Discussion Forum
|
||||
|
||||
If you'd like to discuss what we're up to, please visit or [community](https://community.coralproject.net/) or [contact us](https://coralproject.net/contact.html).
|
||||
If you'd like to discuss what we're up to, please visit or [community](https://community.coralproject.net/) or [contact us](https://coralproject.net/contact).
|
||||
|
||||
### Integrations
|
||||
|
||||
@@ -82,5 +85,3 @@ Have a favorite analytics engine? Data science service? CMS? Auth platform? Depl
|
||||
### Favorite Features?
|
||||
|
||||
Do you have a favorite feature of an existing platform that's not yet been done in Talk? Sounds like Talk needs that feature.
|
||||
|
||||
## Thanks!
|
||||
@@ -1,4 +1,7 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
---
|
||||
title: Contributor Covenant Code of Conduct
|
||||
permalink: /docs/development/code-of-conduct/
|
||||
---
|
||||
|
||||
## Our Pledge
|
||||
|
||||
@@ -9,8 +12,7 @@ We commit to enforce and evolve this code over the duration of the project.
|
||||
|
||||
## Expected behavior
|
||||
|
||||
|
||||
* Be supportive of each other.
|
||||
* Be supportive of each other.
|
||||
* Be collaborative. Involve others in brainstorms, sketching sessions, code reviews, planning documents, and the like. It’s not only okay to ask for help or feedback often, it’s unacceptable not to do so.
|
||||
* Be generous and kind in both giving and accepting critique. Critique is a natural and important part of our culture. Good critiques are kind, respectful, clear, and constructive, focused on goals and requirements rather than personal preferences. You are expected to give and receive criticism with grace.
|
||||
* Be humane. Be polite and friendly in all forms of communication, especially remote communication, where opportunities for misunderstanding are greater. Use sarcasm carefully. Tone is hard to decipher online; make judicious use of emoji to aid in communication.
|
||||
@@ -19,8 +21,8 @@ We commit to enforce and evolve this code over the duration of the project.
|
||||
* Respect people’s boundaries.
|
||||
* Do not make it personal.
|
||||
* Use welcoming and inclusive language.
|
||||
* Offer to help if you see someone struggling or otherwise in need of assistance (taking care not to be patronizing or disrespectful).
|
||||
* If someone approaches you looking for help, be generous with your time; if you’re under a deadline, direct them to someone else who may be of assistance.
|
||||
* Offer to help if you see someone struggling or otherwise in need of assistance (taking care not to be patronizing or disrespectful).
|
||||
* If someone approaches you looking for help, be generous with your time; if you’re under a deadline, direct them to someone else who may be of assistance.
|
||||
* Go out of your way to include people in jokes or memes, recognizing that we want to build an environment free of cliques.
|
||||
* Show empathy towards other community members
|
||||
|
||||
@@ -34,6 +36,7 @@ Harassment includes, but is not limited to: deliberate intimidation; stalking; u
|
||||
Furthermore, any behavior or language which is unwelcoming—whether or not it rises to the level of harassment—is also strongly discouraged. Much exclusionary behavior takes the form of microaggressions—subtle put-downs which may be unconsciously delivered. Regardless of intent, microaggressions can have a significant negative impact on victims and have no place on our team.
|
||||
|
||||
Other inappropriate behavior:
|
||||
|
||||
* Threats
|
||||
* Slurs
|
||||
* Pornography
|
||||
@@ -43,7 +46,7 @@ Other inappropriate behavior:
|
||||
* Impersonation of someone else
|
||||
* Violating someone’s privacy
|
||||
|
||||
If you feel that someone has harassed you or otherwise treated you or someone else inappropriately, please alert the project lead at andrewl@mozillafoundation.org.
|
||||
If you feel that someone has harassed you or otherwise treated you or someone else inappropriately, please alert the project lead at [andrewl@mozillafoundation.org](mailto:andrewl@mozillafoundation.org).
|
||||
|
||||
|
||||
## Our Responsibilities
|
||||
@@ -61,13 +64,14 @@ This Code of Conduct applies both within project spaces and in public spaces whe
|
||||
These guidelines are ambitious, and we’re not always going to succeed in meeting them. When something goes wrong—whether it’s a microaggression or an instance of harassment — there are a number of things you can do to address the situation. Depending on your comfort level and the severity of the situation, here are some suggestions:
|
||||
|
||||
* Address it directly. If you’re comfortable bringing up the incident with the person who instigated it, pull them aside to discuss how it affected you. Be sure to approach these conversations in a forgiving spirit: an angry or tense conversation will not do either of you any good. If you’re unsure how to go about that, try discussing with your manager or with the people and culture team first—they might have some advice about how to make this conversation happen.
|
||||
|
||||
If you’re too frustrated to have a direct conversation, there are a number of alternate routes you can take.
|
||||
|
||||
* Talk to a peer or mentor. Your colleagues are likely to have personal and professional experience on which to draw that could be of use to you. If you have someone you’re comfortable approaching, reach out and discuss the situation with them. They may be able to advise on how they would handle it, or direct you to someone who can. The flip side of this, of course, is that you should also be available when your colleagues reach out to you.
|
||||
|
||||
* Contact the project lead, Andrew Losowsky, andrewl@mozillafoundation.org, or the technical lead. We will work with you to help you figure out how to ensure that any conflict doesn’t interfere with your work, in confidence if you would prefer.
|
||||
* Contact the project lead, Andrew Losowsky, [andrewl@mozillafoundation.org](mailto:andrewl@mozillafoundation.org), or the technical lead. We will work with you to help you figure out how to ensure that any conflict doesn’t interfere with your work, in confidence if you would prefer.
|
||||
|
||||
* Talk to Chris Lawrence. Chris oversees the project. He can be contacted at clawrence@mozillafoundation.org.
|
||||
* Talk to Chris Lawrence. Chris oversees the project. He can be contacted at [clawrence@mozillafoundation.org](mailto:clawrence@mozillafoundation.org).
|
||||
|
||||
If you feel you have been unfairly accused of violating this code of conduct, you should contact Chris with a concise description of your grievance.
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
title: REST API
|
||||
permalink: /docs/development/rest/
|
||||
---
|
||||
|
||||
Talk provides REST API documentation at [swagger.yaml]({{ "swagger.yaml" | absolute_url }}).
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<!-- start custom analytics snippet -->
|
||||
|
||||
<!-- end custom analytics snippet -->
|
||||
@@ -0,0 +1,9 @@
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', '{{ site.analytics.google.tracking_id }}', 'auto');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', '{{ site.analytics.google.tracking_id }}']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
{% if site.analytics.provider and page.analytics != false %}
|
||||
|
||||
{% case site.analytics.provider %}
|
||||
{% when "google" %}
|
||||
{% include /analytics-providers/google.html %}
|
||||
{% when "google-universal" %}
|
||||
{% include /analytics-providers/google-universal.html %}
|
||||
{% when "custom" %}
|
||||
{% include /analytics-providers/custom.html %}
|
||||
{% endcase %}
|
||||
|
||||
{% endif %}
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
{% if post.header.teaser %}
|
||||
{% capture teaser %}{{ post.header.teaser }}{% endcapture %}
|
||||
{% else %}
|
||||
{% assign teaser = site.teaser %}
|
||||
{% endif %}
|
||||
|
||||
{% if post.id %}
|
||||
{% assign title = post.title | markdownify | remove: "<p>" | remove: "</p>" %}
|
||||
{% else %}
|
||||
{% assign title = post.title %}
|
||||
{% endif %}
|
||||
|
||||
<div class="{{ include.type | default: "list" }}__item">
|
||||
<article class="archive__item" itemscope itemtype="http://schema.org/CreativeWork">
|
||||
{% if include.type == "grid" and teaser %}
|
||||
<div class="archive__item-teaser">
|
||||
<img src=
|
||||
{% if teaser contains "://" %}
|
||||
"{{ teaser }}"
|
||||
{% else %}
|
||||
"{{ teaser | absolute_url }}"
|
||||
{% endif %}
|
||||
alt="">
|
||||
</div>
|
||||
{% endif %}
|
||||
<h2 class="archive__item-title" itemprop="headline">
|
||||
{% if post.link %}
|
||||
<a href="{{ post.link }}">{{ title }}</a> <a href="{{ post.url | absolute_url }}" rel="permalink"><i class="fa fa-link" aria-hidden="true" title="permalink"></i><span class="sr-only">Permalink</span></a>
|
||||
{% else %}
|
||||
<a href="{{ post.url | absolute_url }}" rel="permalink">{{ title }}</a>
|
||||
{% endif %}
|
||||
</h2>
|
||||
{% if post.read_time %}
|
||||
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
|
||||
{% endif %}
|
||||
{% if post.excerpt %}<p class="archive__item-excerpt" itemprop="description">{{ post.excerpt | markdownify | strip_html | truncate: 160 }}</p>{% endif %}
|
||||
</article>
|
||||
</div>
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
layout: default
|
||||
type: archive
|
||||
---
|
||||
|
||||
<div class="post-header">
|
||||
<h1 class="post-title-main">{{ page.title }}</h1>
|
||||
</div>
|
||||
<div class="post-content">
|
||||
|
||||
{{ content }}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
<!--
|
||||
<li>
|
||||
<a href="http://link-to-whatever-social-network.com/user/" itemprop="sameAs">
|
||||
<i class="fa fa-fw" aria-hidden="true"></i> Custom Social Profile Link
|
||||
</a>
|
||||
</li>
|
||||
-->
|
||||
Executable
+249
@@ -0,0 +1,249 @@
|
||||
{% if page.author and site.data.authors[page.author] %}
|
||||
{% assign author = site.data.authors[page.author] %}
|
||||
{% else %}
|
||||
{% assign author = site.author %}
|
||||
{% endif %}
|
||||
|
||||
<div itemscope itemtype="http://schema.org/Person">
|
||||
|
||||
{% if author.avatar %}
|
||||
<div class="author__avatar">
|
||||
{% if author.avatar contains "://" %}
|
||||
<img src="{{ author.avatar }}" alt="{{ author.name }}" itemprop="image">
|
||||
{% else %}
|
||||
<img src="{{ author.avatar | absolute_url }}" class="author__avatar" alt="{{ author.name }}" itemprop="image">
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="author__content">
|
||||
<h3 class="author__name" itemprop="name">{{ author.name }}</h3>
|
||||
{% if author.bio %}
|
||||
<p class="author__bio" itemprop="description">
|
||||
{{ author.bio }}
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="author__urls-wrapper">
|
||||
<button class="btn btn--inverse">{{ site.data.ui-text[site.locale].follow_label | remove: ":" | default: "Follow" }}</button>
|
||||
<ul class="author__urls social-icons">
|
||||
{% if author.location %}
|
||||
<li itemprop="homeLocation" itemscope itemtype="http://schema.org/Place">
|
||||
<i class="fa fa-fw fa-map-marker" aria-hidden="true"></i> <span itemprop="name">{{ author.location }}</span>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.uri %}
|
||||
<li>
|
||||
<a href="{{ author.uri }}" itemprop="url">
|
||||
<i class="fa fa-fw fa-chain" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].website_label | default: "Website" }}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.email %}
|
||||
<li>
|
||||
<a href="mailto:{{ author.email }}">
|
||||
<meta itemprop="email" content="{{ author.email }}" />
|
||||
<i class="fa fa-fw fa-envelope-square" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].email_label | default: "Email" }}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.keybase %}
|
||||
<li>
|
||||
<a href="https://keybase.io/{{ author.keybase }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-key" aria-hidden="true"></i> Keybase
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.twitter %}
|
||||
<li>
|
||||
<a href="https://twitter.com/{{ author.twitter }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-twitter-square" aria-hidden="true"></i> Twitter
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.facebook %}
|
||||
<li>
|
||||
<a href="https://www.facebook.com/{{ author.facebook }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-facebook-square" aria-hidden="true"></i> Facebook
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.google_plus %}
|
||||
<li>
|
||||
<a href="https://plus.google.com/+{{ author.google_plus }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-google-plus-square" aria-hidden="true"></i> Google+
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.linkedin %}
|
||||
<li>
|
||||
<a href="https://www.linkedin.com/in/{{ author.linkedin }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-linkedin-square" aria-hidden="true"></i> LinkedIn
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.xing %}
|
||||
<li>
|
||||
<a href="https://www.xing.com/profile/{{ author.xing }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-xing-square" aria-hidden="true"></i> XING
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.instagram %}
|
||||
<li>
|
||||
<a href="https://instagram.com/{{ author.instagram }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-instagram" aria-hidden="true"></i> Instagram
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.tumblr %}
|
||||
<li>
|
||||
<a href="https://{{ author.tumblr }}.tumblr.com" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-tumblr-square" aria-hidden="true"></i> Tumblr
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.bitbucket %}
|
||||
<li>
|
||||
<a href="https://bitbucket.org/{{ author.bitbucket }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-bitbucket" aria-hidden="true"></i> Bitbucket
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.github %}
|
||||
<li>
|
||||
<a href="https://github.com/{{ author.github }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-github" aria-hidden="true"></i> GitHub
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.gitlab %}
|
||||
<li>
|
||||
<a href="https://gitlab.com/{{ author.gitlab }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-gitlab" aria-hidden="true"></i> Gitlab
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.stackoverflow %}
|
||||
<li>
|
||||
<a href="https://www.stackoverflow.com/users/{{ author.stackoverflow }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-stack-overflow" aria-hidden="true"></i> Stackoverflow
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.lastfm %}
|
||||
<li>
|
||||
<a href="https://last.fm/user/{{ author.lastfm }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-lastfm-square" aria-hidden="true"></i> Last.fm
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.dribbble %}
|
||||
<li>
|
||||
<a href="https://dribbble.com/{{ author.dribbble }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-dribbble" aria-hidden="true"></i> Dribbble
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.pinterest %}
|
||||
<li>
|
||||
<a href="https://www.pinterest.com/{{ author.pinterest }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-pinterest" aria-hidden="true"></i> Pinterest
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.foursquare %}
|
||||
<li>
|
||||
<a href="https://foursquare.com/{{ author.foursquare }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-foursquare" aria-hidden="true"></i> Foursquare
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.steam %}
|
||||
<li>
|
||||
<a href="https://steamcommunity.com/id/{{ author.steam }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-steam-square" aria-hidden="true"></i> Steam
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.youtube %}
|
||||
{% if author.youtube contains "://" %}
|
||||
<li>
|
||||
<a href="{{ author.youtube }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-youtube-square" aria-hidden="true"></i> YouTube
|
||||
</a>
|
||||
</li>
|
||||
{% else author.youtube %}
|
||||
<li>
|
||||
<a href="https://www.youtube.com/user/{{ author.youtube }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-youtube-square" aria-hidden="true"></i> YouTube
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if author.soundcloud %}
|
||||
<li>
|
||||
<a href="https://soundcloud.com/{{ author.soundcloud }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-soundcloud" aria-hidden="true"></i> Soundcloud
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.weibo %}
|
||||
<li>
|
||||
<a href="https://www.weibo.com/{{ author.weibo }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-weibo" aria-hidden="true"></i> Weibo
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.flickr %}
|
||||
<li>
|
||||
<a href="https://www.flickr.com/{{ author.flickr }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-flickr" aria-hidden="true"></i> Flickr
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.codepen %}
|
||||
<li>
|
||||
<a href="https://codepen.io/{{ author.codepen }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-codepen" aria-hidden="true"></i> CodePen
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if author.vine %}
|
||||
<li>
|
||||
<a href="https://vine.co/u/{{ author.vine }}" itemprop="sameAs">
|
||||
<i class="fa fa-fw fa-vine" aria-hidden="true"></i> Vine
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% include author-profile-custom-links.html %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
{% if site.url %}
|
||||
{% assign base_path = site.url | append: site.baseurl %}
|
||||
{% else %}
|
||||
{% assign base_path = site.github.url %}
|
||||
{% endif %}
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
{% case site.category_archive.type %}
|
||||
{% when "liquid" %}
|
||||
{% assign path_type = "#" %}
|
||||
{% when "jekyll-archives" %}
|
||||
{% assign path_type = nil %}
|
||||
{% endcase %}
|
||||
|
||||
{% if page.collection != 'posts' %}
|
||||
{% assign path_type = nil %}
|
||||
{% assign crumb_path = '/' %}
|
||||
{% else %}
|
||||
{% assign crumb_path = site.category_archive.path %}
|
||||
{% endif %}
|
||||
|
||||
<nav class="breadcrumbs">
|
||||
<ol itemscope itemtype="http://schema.org/BreadcrumbList">
|
||||
{% assign crumbs = page.url | split: '/' %}
|
||||
{% assign i = 1 %}
|
||||
{% for crumb in crumbs offset: 1 %}
|
||||
{% if forloop.first %}
|
||||
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
|
||||
<a href="{{ site.url }}{{ site.baseurl }}/" itemprop="item"><span itemprop="name">{{ site.data.ui-text[site.locale].breadcrumb_home_label | default: "Home" }}</span></a>
|
||||
<meta itemprop="position" content="{{ i }}" />
|
||||
</li>
|
||||
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
|
||||
{% endif %}
|
||||
{% if forloop.last %}
|
||||
<li class="current">{{ page.title }}</li>
|
||||
{% else %}
|
||||
{% assign i = i | plus: 1 %}
|
||||
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
|
||||
<a href="{{ crumb | downcase | replace: '%20', '-' | prepend: path_type | prepend: crumb_path | absolute_url }}" itemprop="item"><span itemprop="name">{{ crumb | replace: '-', ' ' | replace: '%20', ' ' | capitalize }}</span></a>
|
||||
<meta itemprop="position" content="{{ i }}" />
|
||||
</li>
|
||||
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</nav>
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
<!--[if lt IE 9]>
|
||||
<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</div>
|
||||
<![endif]-->
|
||||
@@ -1 +0,0 @@
|
||||
<div markdown="span" class="bs-callout bs-callout-{{include.type}}">{{include.content}}</div>
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
{% case site.category_archive.type %}
|
||||
{% when "liquid" %}
|
||||
{% assign path_type = "#" %}
|
||||
{% when "jekyll-archives" %}
|
||||
{% assign path_type = nil %}
|
||||
{% endcase %}
|
||||
|
||||
{% if site.category_archive.path %}
|
||||
{% comment %}
|
||||
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
|
||||
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
|
||||
{% endcomment %}
|
||||
{% capture page_categories %}{% for category in page.categories %}{{ category | downcase }}#{{ category }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
|
||||
{% assign category_hashes = (page_categories | split: ',' | sort:0) %}
|
||||
|
||||
<p class="page__taxonomy">
|
||||
<strong><i class="fa fa-fw fa-folder-open" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].categories_label | default: "Categories:" }} </strong>
|
||||
<span itemprop="keywords">
|
||||
{% for hash in category_hashes %}
|
||||
{% assign keyValue = hash | split: '#' %}
|
||||
{% capture category_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
|
||||
<a href="{{ category_word | slugify | prepend: path_type | prepend: site.category_archive.path | absolute_url }}" class="page__taxonomy-item" rel="tag">{{ category_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
|
||||
{% endfor %}
|
||||
</span>
|
||||
</p>
|
||||
{% endif %}
|
||||
Executable
+22
@@ -0,0 +1,22 @@
|
||||
<article id="comment{{ include.index }}" class="js-comment comment" itemprop="comment" itemscope itemtype="http://schema.org/Comment">
|
||||
<div class="comment__avatar-wrapper">
|
||||
<img class="comment__avatar" src="https://www.gravatar.com/avatar/{{ include.email }}?d=mm&s=80">
|
||||
</div>
|
||||
<div class="comment__content-wrapper">
|
||||
<h3 class="comment__author" itemprop="author" itemscope itemtype="http://schema.org/Person">
|
||||
{% unless include.url == blank %}
|
||||
<span itemprop="name"><a rel="external nofollow" itemprop="url" href="{{ include.url }}">{{ include.name }}</a></span>
|
||||
{% else %}
|
||||
<span itemprop="name">{{ include.name }}</span>
|
||||
{% endunless %}
|
||||
</h3>
|
||||
<p class="comment__date">
|
||||
{% if include.date %}
|
||||
{% if include.index %}<a href="#comment{{ include.index }}" itemprop="url">{% endif %}
|
||||
<time datetime="{{ include.date | date_to_xmlschema }}" itemprop="datePublished">{{ include.date | date: "%B %d, %Y at %I:%M %p" }}</time>
|
||||
{% if include.index %}</a>{% endif %}
|
||||
{% endif %}
|
||||
</p>
|
||||
<div itemprop="text">{{ include.message | markdownify }}</div>
|
||||
</div>
|
||||
</article>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<!-- start custom comments snippet -->
|
||||
|
||||
<!-- end custom comments snippet -->
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
{% if site.comments.discourse.server %}
|
||||
{% capture canonical %}{% if site.permalink contains '.html' %}{{ page.url | absolute_url }}{% else %}{{ page.url | absolute_url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
|
||||
<script type="text/javascript">
|
||||
DiscourseEmbed = { discourseUrl: '//{{ site.comments.discourse.server }}/',
|
||||
discourseEmbedUrl: '{{ canonical }}' };
|
||||
(function () {
|
||||
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
|
||||
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the comments powered by <a href="https://www.discourse.org/">Discourse.</a></noscript>
|
||||
{% endif %}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
{% if site.comments.disqus.shortname %}
|
||||
<script type="text/javascript">
|
||||
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
|
||||
var disqus_shortname = '{{ site.comments.disqus.shortname }}';
|
||||
|
||||
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
|
||||
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||
(function () {
|
||||
var s = document.createElement('script'); s.async = true;
|
||||
s.type = 'text/javascript';
|
||||
s.src = '//' + disqus_shortname + '.disqus.com/count.js';
|
||||
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
|
||||
}());
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||
{% endif %}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
<div id="fb-root"></div>
|
||||
<script>(function(d, s, id) {
|
||||
var js, fjs = d.getElementsByTagName(s)[0];
|
||||
if (d.getElementById(id)) return;
|
||||
js = d.createElement(s); js.id = id;
|
||||
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5{% if site.comments.facebook.appid %}&appId={{ site.comments.facebook.appid }}{% endif %}";
|
||||
fjs.parentNode.insertBefore(js, fjs);
|
||||
}(document, 'script', 'facebook-jssdk'));</script>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<script async type="text/javascript" src="//apis.google.com/js/plusone.js?callback=gpcb"></script>
|
||||
<noscript>Please enable JavaScript to view the <a href="https://plus.google.com/">comments powered by Google+.</a></noscript>
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{% if site.comments.provider and page.comments %}
|
||||
{% case site.comments.provider %}
|
||||
{% when "disqus" %}
|
||||
{% include /comments-providers/disqus.html %}
|
||||
{% when "discourse" %}
|
||||
{% include /comments-providers/discourse.html %}
|
||||
{% when "facebook" %}
|
||||
{% include /comments-providers/facebook.html %}
|
||||
{% when "google-plus" %}
|
||||
{% include /comments-providers/google-plus.html %}
|
||||
{% when "staticman" %}
|
||||
{% include /comments-providers/staticman.html %}
|
||||
{% when "custom" %}
|
||||
{% include /comments-providers/custom.html %}
|
||||
{% endcase %}
|
||||
{% endif %}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
{% if site.repository and site.staticman.branch %}
|
||||
<script>
|
||||
(function ($) {
|
||||
var $comments = $('.js-comments');
|
||||
|
||||
$('#new_comment').submit(function () {
|
||||
var form = this;
|
||||
|
||||
$(form).addClass('disabled');
|
||||
$('#comment-form-submit').html('<i class="fa fa-spinner fa-spin fa-fw"></i> {{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}');
|
||||
|
||||
$.ajax({
|
||||
type: $(this).attr('method'),
|
||||
url: $(this).attr('action'),
|
||||
data: $(this).serialize(),
|
||||
contentType: 'application/x-www-form-urlencoded',
|
||||
success: function (data) {
|
||||
$('#comment-form-submit').html('{{ site.data.ui-text[site.locale].comment_btn_submitted | default: "Submitted" }}');
|
||||
$('.page__comments-form .js-notice').removeClass('notice--danger');
|
||||
$('.page__comments-form .js-notice').addClass('notice--success');
|
||||
showAlert('{{ site.data.ui-text[site.locale].comment_success_msg | default: "Thanks for your comment! It will show on the site once it has been approved." }}');
|
||||
},
|
||||
error: function (err) {
|
||||
console.log(err);
|
||||
$('#comment-form-submit').html('{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}');
|
||||
$('.page__comments-form .js-notice').removeClass('notice--success');
|
||||
$('.page__comments-form .js-notice').addClass('notice--danger');
|
||||
showAlert('{{ site.data.ui-text[site.locale].comment_error_msg | default: "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." }}');
|
||||
$(form).removeClass('disabled');
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
function showAlert(message) {
|
||||
$('.page__comments-form .js-notice').removeClass('hidden');
|
||||
$('.page__comments-form .js-notice-text').html(message);
|
||||
}
|
||||
})(jQuery);
|
||||
</script>
|
||||
{% endif %}
|
||||
Executable
+95
@@ -0,0 +1,95 @@
|
||||
<div class="page__comments">
|
||||
{% capture comments_label %}{{ site.data.ui-text[site.locale].comments_label | default: "Comments" }}{% endcapture %}
|
||||
{% case site.comments.provider %}
|
||||
{% when "discourse" %}
|
||||
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||
<section id="discourse-comments"></section>
|
||||
{% when "disqus" %}
|
||||
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||
<section id="disqus_thread"></section>
|
||||
{% when "facebook" %}
|
||||
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||
<section class="fb-comments" data-href="{{ page.url | absolute_url }}" data-mobile="true" data-num-posts="{{ site.comments.facebook.num_posts | default: 5 }}" data-width="100%" data-colorscheme="{{ site.comments.facebook.colorscheme | default: 'light' }}"></section>
|
||||
{% when "google-plus" %}
|
||||
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||
<section id="g-comments" class="g-comments">Loading Google+ Comments ...</section>
|
||||
<script>
|
||||
function initComment() {
|
||||
gapi.comments.render("g-comments", {
|
||||
href: "{{ page.url | absolute_url }}",
|
||||
width: "624",
|
||||
first_party_property: "BLOGGER",
|
||||
view_type: "FILTERED_POSTMOD"
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<script async type="text/javascript" src="https://apis.google.com/js/plusone.js" onload="initComment()" />
|
||||
<noscript>Please enable JavaScript to view the <a href="https://plus.google.com/">comments powered by Google+.</a></noscript>-->
|
||||
{% when "staticman" %}
|
||||
<section id="static-comments">
|
||||
{% if site.repository and site.staticman.branch %}
|
||||
<!-- Start static comments -->
|
||||
<div class="js-comments">
|
||||
{% if site.data.comments[page.slug] %}
|
||||
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}</h4>
|
||||
{% assign comments = site.data.comments[page.slug] | sort %}
|
||||
|
||||
{% for comment in comments %}
|
||||
{% assign email = comment[1].email %}
|
||||
{% assign name = comment[1].name %}
|
||||
{% assign url = comment[1].url %}
|
||||
{% assign date = comment[1].date %}
|
||||
{% assign message = comment[1].message %}
|
||||
{% include comment.html index=forloop.index email=email name=name url=url date=date message=message %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<!-- End static comments -->
|
||||
|
||||
<!-- Start new comment form -->
|
||||
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}</h4>
|
||||
<p class="small">{{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} <span class="required">*</span></p>
|
||||
<form id="new_comment" class="page__comments-form js-form form" method="post" action="https://api.staticman.net/v1/entry/{{ site.repository }}/{{ site.staticman.branch }}">
|
||||
<div class="form__spinner">
|
||||
<i class="fa fa-spinner fa-spin fa-3x fa-fw"></i>
|
||||
<span class="sr-only">{{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}</span>
|
||||
</div>
|
||||
|
||||
<fieldset>
|
||||
<label for="comment-form-message">{{ site.data.ui-text[site.locale].comment_form_comment_label | default: "Comment" }} <small class="required">*</small></label>
|
||||
<textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea>
|
||||
<div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">{{ site.data.ui-text[site.locale].comment_form_md_info | default: "Markdown is supported." }}</a></div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label for="comment-form-name">{{ site.data.ui-text[site.locale].comment_form_name_label | default: "Name" }} <small class="required">*</small></label>
|
||||
<input type="text" id="comment-form-name" name="fields[name]" tabindex="2" />
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label for="comment-form-email">{{ site.data.ui-text[site.locale].comment_form_email_label | default: "Email address" }} <small class="required">*</small></label>
|
||||
<input type="email" id="comment-form-email" name="fields[email]" tabindex="3" />
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label for="comment-form-url">{{ site.data.ui-text[site.locale].comment_form_website_label | default: "Website (optional)" }}</label>
|
||||
<input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/>
|
||||
</fieldset>
|
||||
<fieldset class="hidden" style="display: none;">
|
||||
<input type="hidden" name="options[slug]" value="{{ page.slug }}">
|
||||
<label for="comment-form-location">Not used. Leave blank if you are a human.</label>
|
||||
<input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/>
|
||||
</fieldset>
|
||||
<!-- Start comment form alert messaging -->
|
||||
<p class="hidden js-notice">
|
||||
<strong class="js-notice-text"></strong>
|
||||
</p>
|
||||
<!-- End comment form alert messaging -->
|
||||
<fieldset>
|
||||
<button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--large">{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}</button>
|
||||
</fieldset>
|
||||
</form>
|
||||
<!-- End new comment form -->
|
||||
{% endif %}
|
||||
</section>
|
||||
{% when "custom" %}
|
||||
<section id="custom-comments"></section>
|
||||
{% endcase %}
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
{% assign sidebar = site.data.sidebars.talk_sidebar.entries %}
|
||||
@@ -1,16 +0,0 @@
|
||||
{% if site.disqus_shortname %}
|
||||
|
||||
<div id="disqus_thread"></div>
|
||||
<script type="text/javascript">
|
||||
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
|
||||
var disqus_shortname = '{{site.disqus_shortname}}'; // required: replace example with your forum shortname
|
||||
|
||||
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||
{% endif %}
|
||||
Executable
+50
@@ -0,0 +1,50 @@
|
||||
{% if include.id %}
|
||||
{% assign feature_row = page.[include.id] %}
|
||||
{% else %}
|
||||
{% assign feature_row = page.feature_row %}
|
||||
{% endif %}
|
||||
|
||||
<div class="feature__wrapper">
|
||||
|
||||
{% for f in feature_row %}
|
||||
|
||||
{% if f.url contains "://" %}
|
||||
{% capture f_url %}{{ f.url }}{% endcapture %}
|
||||
{% else %}
|
||||
{% capture f_url %}{{ f.url | absolute_url }}{% endcapture %}
|
||||
{% endif %}
|
||||
|
||||
<div class="feature__item{% if include.type %}--{{ include.type }}{% endif %}">
|
||||
<div class="archive__item">
|
||||
{% if f.image_path %}
|
||||
<div class="archive__item-teaser">
|
||||
<img src=
|
||||
{% if f.image_path contains "://" %}
|
||||
"{{ f.image_path }}"
|
||||
{% else %}
|
||||
"{{ f.image_path | absolute_url }}"
|
||||
{% endif %}
|
||||
alt="{% if f.alt %}{{ f.alt }}{% endif %}">
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="archive__item-body">
|
||||
{% if f.title %}
|
||||
<h2 class="archive__item-title">{{ f.title }}</h2>
|
||||
{% endif %}
|
||||
|
||||
{% if f.excerpt %}
|
||||
<div class="archive__item-excerpt">
|
||||
{{ f.excerpt | markdownify }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if f.url %}
|
||||
<p><a href="{{ f_url }}" class="btn {{ f.btn_class }}">{{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
@@ -1,13 +0,0 @@
|
||||
<li>
|
||||
{% if site.feedback_text %}
|
||||
{% assign feedback_text = site.feedback_text %}
|
||||
{% else %}
|
||||
{% assign feedback_text = "Feedback" %}
|
||||
{% endif %}
|
||||
|
||||
{% if site.feedback_link %}
|
||||
<a class="email" title="Submit feedback" href="{{site.feedback_link}}">{{feedback_text}}</a>
|
||||
{% else %}
|
||||
<a class="email" title="Submit feedback" href="#" onclick="javascript:window.location='mailto:{{site.feedback_email}}?subject={{site.feedback_subject_line}} feedback&body=I have some feedback about the {{page.title}} page: ' + window.location.href;"><i class="fa fa-envelope-o"></i> {{feedback_text}}</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
<figure class="{{ include.class }}">
|
||||
<img src=
|
||||
{% if include.image_path contains "://" %}
|
||||
"{{ include.image_path }}"
|
||||
{% else %}
|
||||
"{{ include.image_path | absolute_url }}"
|
||||
{% endif %}
|
||||
alt="{% if include.alt %}{{ include.alt }}{% endif %}">
|
||||
{% if include.caption %}
|
||||
<figcaption>{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}</figcaption>
|
||||
{% endif %}
|
||||
</figure>
|
||||
@@ -1,9 +1,25 @@
|
||||
<footer>
|
||||
<div class="row">
|
||||
<div class="col-lg-12 footer">
|
||||
©{{ site.time | date: "%Y" }} {{site.company_name}}. All rights reserved. <br />
|
||||
{% if page.last_updated %}<span>Page last updated:</span> {{page.last_updated}}<br/>{% endif %} Site last generated: {{ site.time | date: "%b %-d, %Y" }} <br />
|
||||
<p><img src="{{ "images/company_logo.png" }}" alt="Company logo"/></p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<div class="page__footer-follow">
|
||||
<ul class="social-icons">
|
||||
{% if site.data.ui-text[site.locale].follow_label %}
|
||||
<li><strong>{{ site.data.ui-text[site.locale].follow_label }}</strong></li>
|
||||
{% endif %}
|
||||
{% if site.twitter.username %}
|
||||
<li><a href="https://twitter.com/{{ site.twitter.username }}"><i class="fa fa-fw fa-twitter-square" aria-hidden="true"></i> Twitter</a></li>
|
||||
{% endif %}
|
||||
{% if site.facebook.username %}
|
||||
<li><a href="https://facebook.com/{{ site.facebook.username }}"><i class="fa fa-fw fa-facebook-square" aria-hidden="true"></i> Facebook</a></li>
|
||||
{% endif %}
|
||||
{% if site.author.github %}
|
||||
<li><a href="http://github.com/{{ site.author.github }}"><i class="fa fa-fw fa-github" aria-hidden="true"></i> GitHub</a></li>
|
||||
{% endif %}
|
||||
{% if site.author.gitlab %}
|
||||
<li><a href="http://gitlab.com/{{ site.author.gitlab }}"><i class="fa fa-fw fa-gitlab" aria-hidden="true"></i> Gitlab</a></li>
|
||||
{% endif %}
|
||||
{% if site.author.bitbucket %}
|
||||
<li><a href="http://bitbucket.org/{{ site.author.bitbucket }}"><i class="fa fa-fw fa-bitbucket" aria-hidden="true"></i> Bitbucket</a></li>
|
||||
{% endif %}
|
||||
<li><a href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ '/feed.xml' | absolute_url }}{% endif %}"><i class="fa fa-fw fa-rss-square" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].feed_label | default: "Feed" }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="page__footer-copyright">© {{ site.time | date: '%Y' }} {{ site.name | default: site.title }}. {{ site.data.ui-text[site.locale].powered_by | default: "Powered by" }} <a href="http://jekyllrb.com" rel="nofollow">Jekyll</a> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
|
||||
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
<!-- start custom footer snippets -->
|
||||
|
||||
<!-- end custom footer snippets -->
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
{% if include.id %}
|
||||
{% assign gallery = page.[include.id] %}
|
||||
{% else %}
|
||||
{% assign gallery = page.gallery %}
|
||||
{% endif %}
|
||||
|
||||
{% if gallery.size == 2 %}
|
||||
{% assign gallery_layout = 'half' %}
|
||||
{% elsif gallery.size >= 3 %}
|
||||
{% assign gallery_layout = 'third' %}
|
||||
{% else %}
|
||||
{% assign gallery_layout = '' %}
|
||||
{% endif %}
|
||||
|
||||
<figure class="{{ gallery_layout }} {{ include.class }}">
|
||||
{% for img in gallery %}
|
||||
{% if img.url %}
|
||||
<a href=
|
||||
{% if img.url contains "://" %}
|
||||
"{{ img.url }}"
|
||||
{% else %}
|
||||
"{{ img.url | absolute_url }}"
|
||||
{% endif %}
|
||||
{% if img.title %}title="{{ img.title }}"{% endif %}
|
||||
>
|
||||
<img src=
|
||||
{% if img.image_path contains "://" %}
|
||||
"{{ img.image_path }}"
|
||||
{% else %}
|
||||
"{{ img.image_path | absolute_url }}"
|
||||
{% endif %}
|
||||
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
|
||||
</a>
|
||||
{% else %}
|
||||
<img src=
|
||||
{% if img.image_path contains "://" %}
|
||||
"{{ img.image_path }}"
|
||||
{% else %}
|
||||
"{{ img.image_path | absolute_url }}"
|
||||
{% endif %}
|
||||
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if include.caption %}
|
||||
<figcaption>{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}</figcaption>
|
||||
{% endif %}
|
||||
</figure>
|
||||
@@ -1,6 +0,0 @@
|
||||
<!-- the google_analytics_id gets auto inserted from the config file -->
|
||||
|
||||
{% if site.google_analytics %}
|
||||
|
||||
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create','{{site.google_analytics}}','auto');ga('require','displayfeatures');ga('send','pageview');</script>
|
||||
{% endif %}
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
<!--
|
||||
# Jekyll Group-By-Array 0.1.0
|
||||
# https://github.com/mushishi78/jekyll-group-by-array
|
||||
# © 2015 Max White <mushishi78@gmail.com>
|
||||
# MIT License
|
||||
-->
|
||||
|
||||
<!-- Initialize -->
|
||||
{% assign __empty_array = '' | split: ',' %}
|
||||
{% assign group_names = __empty_array %}
|
||||
{% assign group_items = __empty_array %}
|
||||
|
||||
<!-- Map -->
|
||||
{% assign __names = include.collection | map: include.field %}
|
||||
|
||||
<!-- Flatten -->
|
||||
{% assign __names = __names | join: ',' | join: ',' | split: ',' %}
|
||||
|
||||
<!-- Uniq -->
|
||||
{% assign __names = __names | sort %}
|
||||
{% for name in __names | sort %}
|
||||
|
||||
<!-- If not equal to previous then it must be unique as sorted -->
|
||||
{% unless name == previous %}
|
||||
|
||||
<!-- Push to group_names -->
|
||||
{% assign group_names = group_names | push: name %}
|
||||
{% endunless %}
|
||||
|
||||
{% assign previous = name %}
|
||||
{% endfor %}
|
||||
|
||||
|
||||
<!-- group_items -->
|
||||
{% for name in group_names %}
|
||||
|
||||
<!-- Collect if contains -->
|
||||
{% assign __item = __empty_array %}
|
||||
{% for __element in include.collection %}
|
||||
{% if __element[include.field] contains name %}
|
||||
{% assign __item = __item | push: __element %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<!-- Push to group_items -->
|
||||
{% assign group_items = group_items | push: __item %}
|
||||
{% endfor %}
|
||||
Regular → Executable
+25
-27
@@ -1,36 +1,34 @@
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="{% if page.summary %}{{ page.summary | strip_html | strip_newlines | truncate: 160 }}{% endif %}">
|
||||
<meta name="keywords" content="{{page.tags}}{% if page.tags %}, {% endif %} {{page.keywords}}">
|
||||
<title>{{ page.title }} | {{ site.site_title }}</title>
|
||||
<link rel="stylesheet" href="{{ "css/syntax.css" }}">
|
||||
|
||||
{% include seo.html %}
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
|
||||
<!--<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">-->
|
||||
<link rel="stylesheet" href="{{ "css/modern-business.css" }}">
|
||||
<link rel="stylesheet" href="{{ "css/lavish-bootstrap.css" }}">
|
||||
<link rel="stylesheet" href="{{ "css/customstyles.css" }}">
|
||||
<link rel="stylesheet" href="{{ "css/theme-blue.css" }}">
|
||||
<link href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ '/feed.xml' | absolute_url }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ site.title }} Feed">
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
|
||||
<script src="{{ "js/jquery.navgoco.min.js" }}"></script>
|
||||
<!-- http://t.co/dKP3o1e -->
|
||||
<meta name="HandheldFriendly" content="True">
|
||||
<meta name="MobileOptimized" content="320">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<script>
|
||||
document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js ';
|
||||
</script>
|
||||
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/2.0.0/anchor.min.js"></script>
|
||||
<script src="{{ "js/toc.js" }}"></script>
|
||||
<script src="{{ "js/customscripts.js" }}"></script>
|
||||
<!-- For all browsers -->
|
||||
<link rel="stylesheet" href="{{ '/assets/css/main.css' | absolute_url }}">
|
||||
|
||||
<link rel="shortcut icon" href="{{ "images/favicon.ico" }}">
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
||||
<!--[if lte IE 9]>
|
||||
<style>
|
||||
/* old IE unsupported flexbox fixes */
|
||||
.greedy-nav .site-title {
|
||||
padding-right: 3em;
|
||||
}
|
||||
.greedy-nav button {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
<![endif]-->
|
||||
|
||||
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.url }}">
|
||||
<meta http-equiv="cleartype" content="on">
|
||||
Executable
+5
@@ -0,0 +1,5 @@
|
||||
<!-- start custom head snippets -->
|
||||
|
||||
<!-- insert favicons. use http://realfavicongenerator.net/ -->
|
||||
|
||||
<!-- end custom head snippets -->
|
||||
@@ -1,33 +0,0 @@
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="{% if page.summary %}{{ page.summary | strip_html | strip_newlines | truncate: 160 }}{% endif %}">
|
||||
<meta name="keywords" content="{{page.tags}}{% if page.tags %}, {% endif %} {{page.keywords}}">
|
||||
<title>{% if page.homepage == true %} {{site.homepage_title}} {% elsif page.title %}{{ page.title }}{% endif %} | {{ site.site_title }}</title>
|
||||
|
||||
|
||||
<link rel="stylesheet" href="{{ "/css/syntax.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/font-awesome.min.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/modern-business.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/lavish-bootstrap.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/customstyles.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/theme-green.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/syntax.css" | prepend: site.baseurl | prepend: site.url }}">
|
||||
<link rel="stylesheet" href="{{ "/css/printstyles.css" | prepend: site.baseurl }}">
|
||||
|
||||
<script>
|
||||
Prince.addScriptFunc("datestamp", function() {
|
||||
return "PDF last generated: {{ site.time | date: '%B %d, %Y' }}";
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
Prince.addScriptFunc("guideName", function() {
|
||||
return "{{site.print_title}} User Guide";
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<figure>{% if {{include.url}} %}<a class="no_icon" target="_blank" href="{{include.url}}">{% endif %}<img class="docimage" src="images/{{include.file}}" alt="{{include.alt}}" {% if {{include.max-width}} %}style="max-width: {{include.max-width}}px"{% endif %} />{% if {{include.url}} %}</a>{% endif %}{% if {{include.caption}} %}<figcaption>{{include.caption}}</figcaption>{% endif %}</figure>
|
||||
@@ -1 +0,0 @@
|
||||
<div markdown="span" class="alert alert-warning" role="alert"><i class="fa fa-warning"></i> <b>Important:</b> {{include.content}}</div>
|
||||
@@ -1,130 +0,0 @@
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$('#toc').toc({ minimumHeaders: 0, listType: 'ul', showSpeed: 0, headers: 'h2,h3,h4' });
|
||||
});
|
||||
|
||||
</script>
|
||||
<!-- shuffle -->
|
||||
<script>
|
||||
var shuffleme = (function( $ ) {
|
||||
'use strict';
|
||||
|
||||
var $grid = $('#grid'),
|
||||
$filterOptions = $('.filter-options'),
|
||||
$sizer = $grid.find('.shuffle_sizer'),
|
||||
|
||||
init = function() {
|
||||
|
||||
// None of these need to be executed synchronously
|
||||
setTimeout(function() {
|
||||
listen();
|
||||
setupFilters();
|
||||
}, 100);
|
||||
|
||||
// instantiate the plugin
|
||||
$grid.shuffle({
|
||||
itemSelector: '[class*="col-"]',
|
||||
sizer: $sizer
|
||||
});
|
||||
},
|
||||
|
||||
// Set up button clicks
|
||||
setupFilters = function() {
|
||||
var $btns = $filterOptions.children();
|
||||
$btns.on('click', function() {
|
||||
var $this = $(this),
|
||||
isActive = $this.hasClass( 'active' ),
|
||||
group = isActive ? 'all' : $this.data('group');
|
||||
|
||||
// Hide current label, show current label in title
|
||||
if ( !isActive ) {
|
||||
$('.filter-options .active').removeClass('active');
|
||||
}
|
||||
|
||||
$this.toggleClass('active');
|
||||
|
||||
// Filter elements
|
||||
$grid.shuffle( 'shuffle', group );
|
||||
});
|
||||
|
||||
$btns = null;
|
||||
},
|
||||
|
||||
// Re layout shuffle when images load. This is only needed
|
||||
// below 768 pixels because the .picture-item height is auto and therefore
|
||||
// the height of the picture-item is dependent on the image
|
||||
// I recommend using imagesloaded to determine when an image is loaded
|
||||
// but that doesn't support IE7
|
||||
listen = function() {
|
||||
var debouncedLayout = $.throttle( 300, function() {
|
||||
$grid.shuffle('update');
|
||||
});
|
||||
|
||||
// Get all images inside shuffle
|
||||
$grid.find('img').each(function() {
|
||||
var proxyImage;
|
||||
|
||||
// Image already loaded
|
||||
if ( this.complete && this.naturalWidth !== undefined ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If none of the checks above matched, simulate loading on detached element.
|
||||
proxyImage = new Image();
|
||||
$( proxyImage ).on('load', function() {
|
||||
$(this).off('load');
|
||||
debouncedLayout();
|
||||
});
|
||||
|
||||
proxyImage.src = this.src;
|
||||
});
|
||||
|
||||
// Because this method doesn't seem to be perfect.
|
||||
setTimeout(function() {
|
||||
debouncedLayout();
|
||||
}, 500);
|
||||
};
|
||||
|
||||
return {
|
||||
init: init
|
||||
};
|
||||
}( jQuery ));
|
||||
|
||||
|
||||
|
||||
$(document).ready(function() {
|
||||
shuffleme.init();
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<!-- new attempt-->
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
|
||||
/* initialize shuffle plugin */
|
||||
var $grid = $('#grid');
|
||||
|
||||
$grid.shuffle({
|
||||
itemSelector: '.item' // the selector for the items in the grid
|
||||
});
|
||||
|
||||
});</script>
|
||||
|
||||
<script>
|
||||
$('#filter a').click(function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
// set active class
|
||||
$('#filter a').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
|
||||
// get group name from clicked item
|
||||
var groupName = $(this).attr('data-group');
|
||||
|
||||
// reshuffle grid
|
||||
$grid.shuffle('shuffle', groupName );
|
||||
});</script>
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<img class="inline" src="images/{{include.file}}" alt="{{include.alt}}" />
|
||||
@@ -1,44 +0,0 @@
|
||||
{% comment %}Get links from each sidebar, as listed in the _config.yml file under sidebars{% endcomment %}
|
||||
|
||||
{% for sidebar in site.sidebars %}
|
||||
{% for entry in site.data.sidebars[sidebar].entries %}
|
||||
{% for folder in entry.folders %}
|
||||
{% for folderitem in folder.folderitems %}
|
||||
{% if folderitem.url contains "html#" %}
|
||||
[{{folderitem.url | remove: "/" }}]: {{folderitem.url | remove: "/"}}
|
||||
{% else %}
|
||||
[{{folderitem.url | remove: "/" | remove: ".html"}}]: {{folderitem.url | remove: "/"}}
|
||||
{% endif %}
|
||||
{% for subfolders in folderitem.subfolders %}
|
||||
{% for subfolderitem in subfolders.subfolderitems %}
|
||||
[{{subfolderitem.url | remove: "/" | remove: ".html"}}]: {{subfolderitem.url | remove: "/"}}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
|
||||
{% comment %} Get links from topnav {% endcomment %}
|
||||
|
||||
{% for entry in site.data.topnav.topnav %}
|
||||
{% for item in entry.items %}
|
||||
{% if item.external_url == null %}
|
||||
[{{item.url | remove: "/" | remove: ".html"}}]: {{item.url | remove: "/"}}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
{% comment %}Get links from topnav dropdowns {% endcomment %}
|
||||
|
||||
{% for entry in site.data.topnav.topnav_dropdowns %}
|
||||
{% for folder in entry.folders %}
|
||||
{% for folderitem in folder.folderitems %}
|
||||
{% if folderitem.external_url == null %}
|
||||
[{{folderitem.url | remove: "/" | remove: ".html"}}]: {{folderitem.url | remove: "/"}}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
<div class="masthead">
|
||||
<div class="masthead__inner-wrap">
|
||||
<div class="masthead__menu">
|
||||
<nav id="site-nav" class="greedy-nav">
|
||||
<a class="site-title" href="{{ '/' | absolute_url }}">{{ site.title }}</a>
|
||||
<ul class="visible-links">
|
||||
{% for link in site.data.navigation.main %}
|
||||
{% if link.url contains 'http' %}
|
||||
{% assign domain = '' %}
|
||||
{% else %}
|
||||
{% assign domain = site.url | append: site.baseurl %}
|
||||
{% endif %}
|
||||
<li class="masthead__menu-item"><a href="{{ domain }}{{ link.url }}">{{ link.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<button><div class="navicon"></div></button>
|
||||
<ul class="hidden-links hidden"></ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
{% assign navigation = site.data.navigation[include.nav] %}
|
||||
|
||||
<nav class="nav__list">
|
||||
{% if page.sidebar.title %}<h3 class="nav__title" style="padding-left: 0;">{{ page.sidebar.title }}</h3>{% endif %}
|
||||
<input id="ac-toc" name="accordion-toc" type="checkbox" />
|
||||
<label for="ac-toc">{{ site.data.ui-text[site.locale].menu_label | default: "Toggle Menu" }}</label>
|
||||
<ul class="nav__items">
|
||||
{% for nav in navigation %}
|
||||
<li>
|
||||
{% if nav.url %}
|
||||
{% comment %} internal/external URL check {% endcomment %}
|
||||
{% if nav.url contains "://" %}
|
||||
{% assign domain = "" %}
|
||||
{% else %}
|
||||
{% assign domain = site.url | append: site.baseurl %}
|
||||
{% endif %}
|
||||
|
||||
<a href="{{ domain }}{{ nav.url }}"><span class="nav__sub-title">{{ nav.title }}</span></a>
|
||||
{% else %}
|
||||
<span class="nav__sub-title">{{ nav.title }}</span>
|
||||
{% endif %}
|
||||
|
||||
{% if nav.children != null %}
|
||||
<ul>
|
||||
{% for child in nav.children %}
|
||||
{% comment %} internal/external URL check {% endcomment %}
|
||||
{% if child.url contains "://" %}
|
||||
{% assign domain = "" %}
|
||||
{% else %}
|
||||
{% assign domain = site.url | append: site.baseurl %}
|
||||
{% endif %}
|
||||
|
||||
{% comment %} set "active" class on current page {% endcomment %}
|
||||
{% if child.url == page.url %}
|
||||
{% assign active = "active" %}
|
||||
{% else %}
|
||||
{% assign active = "" %}
|
||||
{% endif %}
|
||||
|
||||
<li><a href="{{ domain }}{{ child.url }}" class="{{ active }}">{{ child.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</nav>
|
||||
@@ -1 +0,0 @@
|
||||
<div markdown="span" class="alert alert-info" role="alert"><i class="fa fa-info-circle"></i> <b>Note:</b> {{include.content}}</div>
|
||||
Executable
+53
@@ -0,0 +1,53 @@
|
||||
{% if page.header.image contains "://" %}
|
||||
{% capture img_path %}{{ page.header.image }}{% endcapture %}
|
||||
{% else %}
|
||||
{% capture img_path %}{{ page.header.image | absolute_url }}{% endcapture %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.header.cta_url contains "://" %}
|
||||
{% capture cta_path %}{{ page.header.cta_url }}{% endcapture %}
|
||||
{% else %}
|
||||
{% capture cta_path %}{{ page.header.cta_url | absolute_url }}{% endcapture %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.header.overlay_image contains "://" %}
|
||||
{% capture overlay_img_path %}{{ page.header.overlay_image }}{% endcapture %}
|
||||
{% elsif page.header.overlay_image %}
|
||||
{% capture overlay_img_path %}{{ page.header.overlay_image | absolute_url }}{% endcapture %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.header.overlay_filter contains "rgba" %}
|
||||
{% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %}
|
||||
{% elsif page.header.overlay_filter %}
|
||||
{% capture overlay_filter %}rgba(0, 0, 0, {{ page.header.overlay_filter }}){% endcapture %}
|
||||
{% endif %}
|
||||
|
||||
<div class="page__hero{% if page.header.overlay_color or page.header.overlay_image %}--overlay{% endif %}"
|
||||
style="{% if page.header.overlay_color %}background-color: {{ page.header.overlay_color | default: 'transparent' }};{% endif %} {% if overlay_img_path %}background-image: {% if overlay_filter %}linear-gradient({{ overlay_filter }}, {{ overlay_filter }}), {% endif %}url('{{ overlay_img_path }}');{% endif %}"
|
||||
>
|
||||
{% if page.header.overlay_color or page.header.overlay_image %}
|
||||
<div class="wrapper">
|
||||
<h1 class="page__title" itemprop="headline">
|
||||
{% if paginator and site.paginate_show_page_num %}
|
||||
{{ site.title }}{% unless paginator.page == 1 %} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}
|
||||
{% else %}
|
||||
{{ page.title | default: site.title | markdownify | remove: "<p>" | remove: "</p>" }}
|
||||
{% endif %}
|
||||
</h1>
|
||||
{% if page.excerpt %}
|
||||
<p class="page__lead">{{ page.excerpt | markdownify | remove: "<p>" | remove: "</p>" }}</p>
|
||||
{% endif %}
|
||||
{% if site.read_time and page.read_time %}
|
||||
<p class="page__meta"><i class="fa fa-clock-o" aria-hidden="true"></i> {% include read-time.html %}</p>
|
||||
{% endif %}
|
||||
{% if page.header.cta_url %}
|
||||
<p><a href="{{ cta_path }}" class="btn btn--light-outline btn--large">{{ page.header.cta_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
<img src="{{ img_path }}" alt="{{ page.title }}" class="page__hero-image">
|
||||
{% endif %}
|
||||
{% if page.header.caption %}
|
||||
<span class="page__hero-caption">{{ page.header.caption | markdownify | remove: "<p>" | remove: "</p>" }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
{% capture video_id %}{{ page.header.video.id }}{% endcapture %}
|
||||
{% capture video_provider %}{{ page.header.video.provider }}{% endcapture %}
|
||||
|
||||
{% include video id=video_id provider=video_provider %}
|
||||
Executable
+7
@@ -0,0 +1,7 @@
|
||||
{% if site.tag_archive.type and page.tags[0] %}
|
||||
{% include tag-list.html %}
|
||||
{% endif %}
|
||||
|
||||
{% if site.category_archive.type and page.categories[0] %}
|
||||
{% include category-list.html %}
|
||||
{% endif %}
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
{% if paginator.total_pages > 1 %}
|
||||
<nav class="pagination">
|
||||
{% assign first_page_path = site.paginate_path | replace: 'page:num', '' | replace: '//', '/' | absolute_url %}
|
||||
<ul>
|
||||
{% comment %} Link for previous page {% endcomment %}
|
||||
{% if paginator.previous_page %}
|
||||
{% if paginator.previous_page == 1 %}
|
||||
<li><a href="{{ first_page_path }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
|
||||
{% else %}
|
||||
<li><a href="{{ site.paginate_path | replace: ':num', paginator.previous_page | replace: '//', '/' | absolute_url }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</span></a></li>
|
||||
{% endif %}
|
||||
|
||||
{% comment %} First page {% endcomment %}
|
||||
{% if paginator.page == 1 %}
|
||||
<li><a href="#" class="disabled current">1</a></li>
|
||||
{% else %}
|
||||
<li><a href="{{ first_page_path }}">1</a></li>
|
||||
{% endif %}
|
||||
|
||||
{% assign page_start = 2 %}
|
||||
{% if paginator.page > 4 %}
|
||||
{% assign page_start = paginator.page | minus: 2 %}
|
||||
{% comment %} Ellipsis for truncated links {% endcomment %}
|
||||
<li><a href="#" class="disabled">…</a></li>
|
||||
{% endif %}
|
||||
|
||||
{% assign page_end = paginator.total_pages | minus: 1 %}
|
||||
{% assign pages_to_end = paginator.total_pages | minus: paginator.page %}
|
||||
{% if pages_to_end > 4 %}
|
||||
{% assign page_end = paginator.page | plus: 2 %}
|
||||
{% endif %}
|
||||
|
||||
{% for index in (page_start..page_end) %}
|
||||
{% if index == paginator.page %}
|
||||
<li><a href="{{ site.paginate_path | replace: ':num', index | replace: '//', '/' | absolute_url }}" class="disabled current">{{ index }}</a></li>
|
||||
{% else %}
|
||||
{% comment %} Distance from current page and this link {% endcomment %}
|
||||
{% assign dist = paginator.page | minus: index %}
|
||||
{% if dist < 0 %}
|
||||
{% comment %} Distance must be a positive value {% endcomment %}
|
||||
{% assign dist = 0 | minus: dist %}
|
||||
{% endif %}
|
||||
<li><a href="{{ site.paginate_path | replace: ':num', index | absolute_url }}">{{ index }}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% comment %} Ellipsis for truncated links {% endcomment %}
|
||||
{% if pages_to_end > 3 %}
|
||||
<li><a href="#" class="disabled">…</a></li>
|
||||
{% endif %}
|
||||
|
||||
{% if paginator.page == paginator.total_pages %}
|
||||
<li><a href="#" class="disabled current">{{ paginator.page }}</a></li>
|
||||
{% else %}
|
||||
<li><a href="{{ site.paginate_path | replace: ':num', paginator.total_pages | replace: '//', '/' | absolute_url }}">{{ paginator.total_pages }}</a></li>
|
||||
{% endif %}
|
||||
|
||||
{% comment %} Link next page {% endcomment %}
|
||||
{% if paginator.next_page %}
|
||||
<li><a href="{{ site.paginate_path | replace: ':num', paginator.next_page | replace: '//', '/' | absolute_url }}">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a></li>
|
||||
{% else %}
|
||||
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</span></a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
{% if page.previous or page.next %}
|
||||
<nav class="pagination">
|
||||
{% if page.previous %}
|
||||
<a href="{{ page.previous.url | absolute_url }}" class="pagination--pager" title="{{ page.previous.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
|
||||
{% else %}
|
||||
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
|
||||
{% endif %}
|
||||
{% if page.next %}
|
||||
<a href="{{ page.next.url | absolute_url }}" class="pagination--pager" title="{{ page.next.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
|
||||
{% else %}
|
||||
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
{% endif %}
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
{% assign words_per_minute = site.words_per_minute | default: 200 %}
|
||||
|
||||
{% if post.read_time %}
|
||||
{% assign words = post.content | strip_html | number_of_words %}
|
||||
{% elsif page.read_time %}
|
||||
{% assign words = page.content | strip_html | number_of_words %}
|
||||
{% endif %}
|
||||
|
||||
{% if words < words_per_minute %}
|
||||
{{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||
{% elsif words == words_per_minute %}
|
||||
1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||
{% else %}
|
||||
{{ words | divided_by:words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||
{% endif %}
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
<script src="{{ '/assets/js/main.min.js' | absolute_url }}"></script>
|
||||
|
||||
{% include analytics.html %}
|
||||
{% include /comments-providers/scripts.html %}
|
||||
Executable
+147
@@ -0,0 +1,147 @@
|
||||
<!-- begin SEO -->
|
||||
{% if site.url %}
|
||||
{% assign seo_url = site.url | append: site.baseurl %}
|
||||
{% endif %}
|
||||
{% assign seo_url = seo_url | default: site.github.url %}
|
||||
|
||||
{% if page.title %}
|
||||
{% assign seo_title = page.title | append: " " | append: site.title_separator | append: " " | append: site.title %}
|
||||
{% endif %}
|
||||
|
||||
{% if seo_title %}
|
||||
{% assign seo_title = seo_title | markdownify | strip_html | strip_newlines | escape_once %}
|
||||
{% endif %}
|
||||
|
||||
{% if site.url %}
|
||||
{% assign canonical_url = page.url | replace: "index.html", "" | prepend: site.url %}
|
||||
{% endif %}
|
||||
|
||||
<title>{{ seo_title | default: site.title }}{% if paginator %}{% unless paginator.page == 1 %} {{ site.title_separator }} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}{% endif %}</title>
|
||||
|
||||
{% assign seo_description = page.description | default: page.excerpt | default: site.description %}
|
||||
{% if seo_description %}
|
||||
{% assign seo_description = seo_description | markdownify | strip_html | strip_newlines | escape_once %}
|
||||
{% endif %}
|
||||
|
||||
<meta name="description" content="{{ seo_description }}">
|
||||
|
||||
{% assign seo_author = page.author | default: page.author[0] | default: site.author.name %}
|
||||
{% if seo_author %}
|
||||
{% if seo_author.twitter %}
|
||||
{% assign seo_author_twitter = seo_author.twitter %}
|
||||
{% else %}
|
||||
{% if site.data.authors and site.data.authors[seo_author] %}
|
||||
{% assign seo_author_twitter = site.data.authors[seo_author].twitter %}
|
||||
{% else %}
|
||||
{% assign seo_author_twitter = seo_author %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% assign seo_author_twitter = seo_author_twitter | replace: "@", "" %}
|
||||
{% endif %}
|
||||
|
||||
<meta name="author" content="{{ seo_author }}">
|
||||
|
||||
<meta property="og:locale" content="{{ site.locale | replace: "-", "_" | default: "en_US" }}">
|
||||
<meta property="og:site_name" content="{{ site.title }}">
|
||||
<meta property="og:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
|
||||
|
||||
{% if seo_url %}
|
||||
<link rel="canonical" href="{{ page.url | prepend: seo_url | replace: "/index.html", "/" }}">
|
||||
<meta property="og:url" content="{{ page.url | prepend: seo_url | replace: "/index.html", "/" }}">
|
||||
{% endif %}
|
||||
|
||||
{% if page.excerpt %}
|
||||
<meta property="og:description" content="{{ seo_description }}">
|
||||
{% endif %}
|
||||
|
||||
{% if site.twitter.username %}
|
||||
<meta name="twitter:site" content="@{{ site.twitter.username | replace: "@", "" }}">
|
||||
<meta name="twitter:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
|
||||
<meta name="twitter:description" content="{{ seo_description }}">
|
||||
<meta name="twitter:url" content="{{ canonical_url }}">
|
||||
|
||||
{% if page.header.image %}
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:image" content="{% if page.header.image contains "://" %}{{ page.header.image }}{% else %}{{ page.header.image | absolute_url }}{% endif %}">
|
||||
{% else %}
|
||||
<meta name="twitter:card" content="summary">
|
||||
{% if page.header.teaser %}
|
||||
<meta name="twitter:image" content="{% if page.header.teaser contains "://" %}{{ page.header.teaser }}{% else %}{{ page.header.teaser | absolute_url }}{% endif %}">
|
||||
{% elsif site.og_image %}
|
||||
<meta name="twitter:image" content="{{ site.og_image | absolute_url }}">
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if seo_author_twitter %}
|
||||
<meta name="twitter:creator" content="@{{ seo_author_twitter }}">
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if site.facebook %}
|
||||
{% if site.facebook.publisher %}
|
||||
<meta property="article:publisher" content="{{ site.facebook.publisher }}">
|
||||
{% endif %}
|
||||
|
||||
{% if site.facebook.app_id %}
|
||||
<meta property="fb:app_id" content="{{ site.facebook.app_id }}">
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if page.header.image %}
|
||||
<meta property="og:image" content="{% if page.header.image contains "://" %}{{ page.header.image }}{% else %}{{ page.header.image | absolute_url }}{% endif %}">
|
||||
{% elsif page.header.overlay_image %}
|
||||
<meta property="og:image" content="{% if page.header.overlay_image contains "://" %}{{ page.header.overlay_image }}{% else %}{{ page.header.overlay_image | absolute_url }}{% endif %}">
|
||||
{% elsif page.header.teaser %}
|
||||
<meta property="og:image" content="{% if page.header.teaser contains "://" %}{{ page.header.teaser }}{% else %}{{ page.header.teaser | absolute_url }}{% endif %}">
|
||||
{% elsif site.og_image %}
|
||||
<meta property="og:image" content="{% if site.og_image contains "://" %}{{ site.og_image }}{% else %}{{ site.og_image | absolute_url }}{% endif %}">
|
||||
{% endif %}
|
||||
|
||||
{% if page.date %}
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="article:published_time" content="{{ page.date | date_to_xmlschema }}">
|
||||
{% endif %}
|
||||
|
||||
{% if paginator.previous_page %}
|
||||
<link rel="prev" href="{{ paginator.previous_page_path | prepend: seo_url }}">
|
||||
{% endif %}
|
||||
{% if paginator.next_page %}
|
||||
<link rel="next" href="{{ paginator.next_page_path | prepend: seo_url }}">
|
||||
{% endif %}
|
||||
|
||||
{% if site.og_image %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "http://schema.org",
|
||||
"@type": "Organization",
|
||||
"url": {{ seo_url | jsonify }},
|
||||
"logo": {{ site.og_image | absolute_url | jsonify }}
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
{% if site.social %}
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context" : "http://schema.org",
|
||||
"@type" : "{% if site.social.type %}{{ site.social.type }}{% else %}Person{% endif %}",
|
||||
"name" : "{{ site.social.name | default: site.name }}",
|
||||
"url" : {{ seo_url | jsonify }},
|
||||
"sameAs" : {{ site.social.links | jsonify }}
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
{% if site.google_site_verification %}
|
||||
<meta name="google-site-verification" content="{{ site.google_site_verification }}" />
|
||||
{% endif %}
|
||||
{% if site.bing_site_verification %}
|
||||
<meta name="msvalidate.01" content="{{ site.bing_site_verification }}">
|
||||
{% endif %}
|
||||
{% if site.alexa_site_verification %}
|
||||
<meta name="alexaVerifyID" content="{{ site.alexa_site_verification }}">
|
||||
{% endif %}
|
||||
{% if site.yandex_site_verification %}
|
||||
<meta name="yandex-verification" content="{{ site.yandex_site_verification }}">
|
||||
{% endif %}
|
||||
<!-- end SEO -->
|
||||
Regular → Executable
+23
-55
@@ -1,55 +1,23 @@
|
||||
{% include custom/sidebarconfigs.html %}
|
||||
|
||||
<ul id="mysidebar" class="nav">
|
||||
<li class="sidebarTitle">{{sidebar[0].product}} {{sidebar[0].version}}</li>
|
||||
{% for entry in sidebar %}
|
||||
{% for folder in entry.folders %}
|
||||
{% if folder.output contains "web" %}
|
||||
<li>
|
||||
<a href="#">{{ folder.title }}</a>
|
||||
<ul>
|
||||
{% for folderitem in folder.folderitems %}
|
||||
{% if folderitem.output contains "web" %}
|
||||
{% if folderitem.external_url %}
|
||||
<li><a href="{{folderitem.external_url}}" target="_blank">{{folderitem.title}}</a></li>
|
||||
{% elsif page.url == folderitem.url %}
|
||||
<li class="active"><a href="{{folderitem.url | remove: "/"}}">{{folderitem.title}}</a></li>
|
||||
{% else %}
|
||||
<li><a href="{{folderitem.url | remove: "/"}}">{{folderitem.title}}</a></li>
|
||||
{% endif %}
|
||||
{% for subfolders in folderitem.subfolders %}
|
||||
{% if subfolders.output contains "web" %}
|
||||
<li class="subfolders">
|
||||
<a href="#">{{ subfolders.title }}</a>
|
||||
<ul>
|
||||
{% for subfolderitem in subfolders.subfolderitems %}
|
||||
{% if subfolderitem.output contains "web" %}
|
||||
{% if subfolderitem.external_url %}
|
||||
<li><a href="{{subfolderitem.external_url}}" target="_blank">{{subfolderitem.title}}</a></li>
|
||||
{% elsif page.url == subfolderitem.url %}
|
||||
<li class="active"><a href="{{subfolderitem.url | remove: "/"}}">{{subfolderitem.title}}</a></li>
|
||||
{% else %}
|
||||
<li><a href="{{subfolderitem.url | remove: "/"}}">{{subfolderitem.title}}</a></li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
<!-- if you aren't using the accordion, uncomment this block:
|
||||
<p class="external">
|
||||
<a href="#" id="collapseAll">Collapse All</a> | <a href="#" id="expandAll">Expand All</a>
|
||||
</p>
|
||||
-->
|
||||
</ul>
|
||||
|
||||
<!-- this highlights the active parent class in the navgoco sidebar. this is critical so that the parent expands when you're viewing a page. This must appear below the sidebar code above. Otherwise, if placed inside customscripts.js, the script runs before the sidebar code runs and the class never gets inserted.-->
|
||||
<script>$("li.active").parents('li').toggleClass("active");</script>
|
||||
{% if page.author_profile or layout.author_profile or page.sidebar %}
|
||||
<div class="sidebar sticky">
|
||||
{% if page.author_profile or layout.author_profile %}{% include author-profile.html %}{% endif %}
|
||||
{% if page.sidebar %}
|
||||
{% for s in page.sidebar %}
|
||||
{% if s.image %}
|
||||
<img src=
|
||||
{% if s.image contains "://" %}
|
||||
"{{ s.image }}"
|
||||
{% else %}
|
||||
"{{ s.image | absolute_url }}"
|
||||
{% endif %}
|
||||
alt="{% if s.image_alt %}{{ s.image_alt }}{% endif %}">
|
||||
{% endif %}
|
||||
{% if s.title %}<h3>{{ s.title }}</h3>{% endif %}
|
||||
{% if s.text %}{{ s.text | markdownify }}{% endif %}
|
||||
{% endfor %}
|
||||
{% if page.sidebar.nav %}
|
||||
{% include nav_list nav=page.sidebar.nav %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
Executable
+13
@@ -0,0 +1,13 @@
|
||||
<section class="page__share">
|
||||
{% if site.data.ui-text[site.locale].share_on_label %}
|
||||
<h4 class="page__share-title">{{ site.data.ui-text[site.locale].share_on_label | default: "Share on" }}</h4>
|
||||
{% endif %}
|
||||
|
||||
<a href="https://twitter.com/intent/tweet?{% if site.twitter.username %}via={{ site.twitter.username }}&{% endif %}text={{ page.title }} {{ page.url | absolute_url }}" class="btn btn--twitter" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Twitter"><i class="fa fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a>
|
||||
|
||||
<a href="https://www.facebook.com/sharer/sharer.php?u={{ page.url | absolute_url }}" class="btn btn--facebook" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Facebook"><i class="fa fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a>
|
||||
|
||||
<a href="https://plus.google.com/share?url={{ page.url | absolute_url }}" class="btn btn--google-plus" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Google Plus"><i class="fa fa-fw fa-google-plus" aria-hidden="true"></i><span> Google+</span></a>
|
||||
|
||||
<a href="https://www.linkedin.com/shareArticle?mini=true&url={{ page.url | absolute_url }}" class="btn btn--linkedin" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} LinkedIn"><i class="fa fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a>
|
||||
</section>
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
{% case site.tag_archive.type %}
|
||||
{% when "liquid" %}
|
||||
{% assign path_type = "#" %}
|
||||
{% when "jekyll-archives" %}
|
||||
{% assign path_type = nil %}
|
||||
{% endcase %}
|
||||
|
||||
{% if site.tag_archive.path %}
|
||||
{% comment %}
|
||||
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
|
||||
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
|
||||
{% endcomment %}
|
||||
{% capture page_tags %}{% for tag in page.tags %}{{ tag | downcase }}#{{ tag }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
|
||||
{% assign tag_hashes = (page_tags | split: ',' | sort:0) %}
|
||||
|
||||
<p class="page__taxonomy">
|
||||
<strong><i class="fa fa-fw fa-tags" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].tags_label | default: "Tags:" }} </strong>
|
||||
<span itemprop="keywords">
|
||||
{% for hash in tag_hashes %}
|
||||
{% assign keyValue = hash | split: '#' %}
|
||||
{% capture tag_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
|
||||
<a href="{{ tag_word | slugify | prepend: path_type | prepend: site.tag_archive.path | absolute_url }}" class="page__taxonomy-item" rel="tag">{{ tag_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
|
||||
{% endfor %}
|
||||
</span>
|
||||
</p>
|
||||
{% endif %}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user