diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 86f0fcf79b..eafcc13056 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -17,7 +17,7 @@ If you've got an idea for a new feature, please start by suggesting it in the [f If you're going to work on Ghost core you'll need to go through a slightly more involved install and setup process than the usual Ghost CLI version. -First you'll need to fork both [Ghost](https://github.com/tryghost/ghost) and [Ghost-Admin](https://github.com/tryghost/ghost-admin) to your personal Github account, and then follow the detailed [install from source](https://docs.ghost.org/install/source/) setup guide. +First you'll need to fork both [Ghost](https://github.com/tryghost/ghost) and [Ghost-Admin](https://github.com/tryghost/ghost-admin) to your personal Github account, and then follow the detailed [install from source](https://ghost.org/docs/install/source/) setup guide. ### Branching Guide diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index dd0c8b832a..193ac03e49 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ # You can add one username per supported platform and one custom link open_collective: ghost -custom: https://docs.ghost.org/concepts/contributing/ +custom: https://ghost.org/docs/concepts/contributing/ diff --git a/.github/ISSUE_TEMPLATE/--anything-else.md b/.github/ISSUE_TEMPLATE/--anything-else.md index d33157ddd7..e3054a5f01 100644 --- a/.github/ISSUE_TEMPLATE/--anything-else.md +++ b/.github/ISSUE_TEMPLATE/--anything-else.md @@ -17,8 +17,8 @@ Alternatively, check out these resources below. Thanks! 😁. - [Forum](https://forum.ghost.org/c/help) - [Theme Support](https://forum.ghost.org/c/themes) -- [Theme Docs](http://themes.ghost.org/) -- [API Docs](https://api.ghost.org/) +- [Theme Docs](https://ghost.org/docs/api/v2/handlebars-themes/) +- [API Docs](https://ghost.org/docs/api/v2/) - [Feature Requests / Ideas](https://forum.ghost.org/c/Ideas) -- [Contributing Guide](https://docs.ghost.org/docs/contributing) -- [Self-hoster Docs](https://docs.ghost.org/) +- [Contributing Guide](https://ghost.org/docs/concepts/contributing/) +- [Self-hoster Docs](https://ghost.org/docs/) diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md index 4aa2b6e703..cdb5cbc48d 100644 --- a/.github/SUPPORT.md +++ b/.github/SUPPORT.md @@ -7,7 +7,7 @@ Please **_do not_** raise an issue on GitHub. We have a **help** category in our **[forum](https://forum.ghost.org/)** where you can get quick answers, help with debugging weird issues, and general help with any aspect of Ghost. There's also an **ideas** category for feature requests. -Our extensive **documentation** can be found at https://docs.ghost.org/. +Our extensive **documentation** can be found at https://ghost.org/docs/. Please go to https://forum.ghost.org and signup to join our community. You can create a new account, or signup using Google, Twitter or Facebook. diff --git a/.github/label-actions.yml b/.github/label-actions.yml index 8097888380..c13c346045 100644 --- a/.github/label-actions.yml +++ b/.github/label-actions.yml @@ -7,7 +7,7 @@ issues: comment: | Hey @{issue-author} :wave: We ask that you please do not use GitHub for help or support 😄. We use GitHub solely for bug-tracking and on-going feature development. - Many questions can be answered by reviewing our [documentation](https://docs.ghost.org). If you can't find an answer then our [forum](https://forum.ghost.org) is a great place to get community support, plus it helps create a central location for searching problems/solutions. + Many questions can be answered by reviewing our [documentation](https://ghost.org/docs/). If you can't find an answer then our [forum](https://forum.ghost.org) is a great place to get community support, plus it helps create a central location for searching problems/solutions. FYI: Many projects have their own support guidelines and GitHub will highlight them for you as it did here, or the project owners will use issue templates to point you in the right direction. Reading the guidelines or issue templates before opening issues can save you and project maintainers valuable time. close: true diff --git a/PRIVACY.md b/PRIVACY.md index 0e57cd069d..6d94fbd9a4 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -2,7 +2,7 @@ This is a plain English summary of all of the components within Ghost which may affect your privacy in some way. Please keep in mind that if you use third party Themes or Apps with Ghost, there may be additional things not listed here. -Each of the items listed in this document can be disabled via Ghost's `config.[env].json` file. Check out the [configuration guide](https://docs.ghost.org/docs/config#section-privacy) for details. +Each of the items listed in this document can be disabled via Ghost's `config.[env].json` file. Check out the [configuration guide](https://ghost.org/docs/concepts/config/#privacy) for details. ## Official Services @@ -11,9 +11,9 @@ Some official services for Ghost are enabled by default. These services connect ### Automatic Update Checks -When a new session is started, Ghost pings a Ghost.org service to check if the current version of Ghost is the latest version of Ghost. If an update is available, a notification on the About Page appears to let you know. +When a new session is started, Ghost pings a Ghost.org service to check if the current version of Ghost is the latest version of Ghost. If an update is available, a notification on the About Page appears to let you know. -Ghost will collect basic anonymised usage statistics from your blog before sending the request to the service. You can disable collecting statistics using the [privacy configuration](https://docs.ghost.org/docs/config#section-update-check). You will still receive notifications from the service. +Ghost will collect basic anonymised usage statistics from your blog before sending the request to the service. You can disable collecting statistics using the [privacy configuration](https://ghost.org/docs/concepts/config/). You will still receive notifications from the service. All of the information and code related to this service is available in the [update-check.js](https://github.com/TryGhost/Ghost/blob/master/core/server/update-check.js) file. diff --git a/README.md b/README.md index c64dcc6d2e..e9f504a8f9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Features | Showcase | Forum | - Documentation | + Documentation | Contributing | Donate | Twitter @@ -69,7 +69,7 @@ $ npm install ghost-cli -g   -Then, if installing locally add the `local` flag to get up and running in under a minute - [Local install docs](https://docs.ghost.org/install/local) +Then, if installing locally add the `local` flag to get up and running in under a minute - [Local install docs](https://ghost.org/docs/install/local/) ``` $ ghost install local @@ -77,7 +77,7 @@ $ ghost install local   -or on a server run the full install, including automatic SSL setup using LetsEncrypt - [Production install docs](https://docs.ghost.org/install/ubuntu/) +or on a server run the full install, including automatic SSL setup using LetsEncrypt - [Production install docs](https://ghost.org/docs/install/ubuntu/) ``` $ ghost install @@ -85,7 +85,7 @@ $ ghost install   -Check out our [official documentation](https://docs.ghost.org) for more information about our [recommended hosting stack](https://docs.ghost.org/concepts/hosting) & properly [upgrading Ghost](https://docs.ghost.org/docs/upgrade), plus everything you need to develop your own Ghost [themes](https://docs.ghost.org/api/handlebars-themes) or work with [our API](https://api.ghost.org/docs). +Check out our [official documentation](https://ghost.org/docs/) for more information about our [recommended hosting stack](https://ghost.org/docs/concepts/hosting/) & properly [upgrading Ghost](https://ghost.org/faq/upgrade-to-ghost-2-0/), plus everything you need to develop your own Ghost [themes](https://ghost.org/docs/api/v2/handlebars-themes/) or work with [our API](https://ghost.org/docs/api/v2/).   @@ -101,7 +101,7 @@ To stay up to date with all the latest news and product updates, make sure you [ # Contributors & Advanced Developers -For anyone wishing to contribute to Ghost or to hack/customise core files we recommend following our full development setup guides: [General Contributor Guide](https://docs.ghost.org/concepts/contributing) | [Developer Setup Instructions](https://docs.ghost.org/install/source) | [Admin Client development guide](https://docs.ghost.org/install/source/#ghost-admin) +For anyone wishing to contribute to Ghost or to hack/customise core files we recommend following our full development setup guides: [General Contributor Guide](https://ghost.org/docs/concepts/contributing/) | [Developer Setup Instructions](https://ghost.org/docs/install/source/) | [Admin Client development guide](https://ghost.org/docs/install/source/#ghost-admin)   diff --git a/SECURITY.md b/SECURITY.md index d2995de842..9fa77b7339 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,6 +4,6 @@ Potential security vulnerabilities can be reported directly us at `security@ghos The full, up-to-date details of our security policy and procedure can always be found in our documentation: -https://docs.ghost.org/security/ +https://ghost.org/docs/concepts/security/ Please refer to this before emailing us. Thanks for helping make Ghost safe for everyone 🙏. \ No newline at end of file diff --git a/content/adapters/README.md b/content/adapters/README.md index 2a7520baa4..e541cfc417 100644 --- a/content/adapters/README.md +++ b/content/adapters/README.md @@ -18,5 +18,5 @@ This default adapter can be found in `core/server/adapters/scheduling/Scheduling To override any of the default adapters, you have to add a folder (`content/adapters/storage` or `content/adapters/scheduling`) and copy your adapter to it. Please follow our detailed guides: -https://docs.ghost.org/v1/docs/using-a-custom-storage-module -https://docs.ghost.org/v1/docs/using-a-custom-scheduling-module +https://ghost.org/docs/concepts/storage-adapters/ +https://ghost.org/docs/concepts/custom-schedulers/ diff --git a/content/settings/README.md b/content/settings/README.md index 30f526c5e7..77bfc12a96 100644 --- a/content/settings/README.md +++ b/content/settings/README.md @@ -2,7 +2,7 @@ ### routes.yaml -To find out more about `routes.yaml` configuration and how to use it visit [documentation](https://docs.ghost.org/api/handlebars-themes/routing/#base-configuration). +To find out more about `routes.yaml` configuration and how to use it visit [documentation](https://ghost.org/docs/api/v2/handlebars-themes/routing/). This is how the default `routes.yaml` file looks like: diff --git a/core/frontend/apps/subscribers/lib/helpers/index.js b/core/frontend/apps/subscribers/lib/helpers/index.js index 947420c564..e1b6a7f463 100644 --- a/core/frontend/apps/subscribers/lib/helpers/index.js +++ b/core/frontend/apps/subscribers/lib/helpers/index.js @@ -11,7 +11,7 @@ module.exports = function registerHelpers(ghost) { flagKey: 'subscribers', flagName: 'Subscribers', helperName: 'subscribe_form', - helpUrl: 'https://docs.ghost.org/faq/enable-subscribers-feature/' + helpUrl: 'https://ghost.org/faq/enable-subscribers-feature/' }, () => { return require('./subscribe_form').apply(self, args); }); diff --git a/core/frontend/helpers/get.js b/core/frontend/helpers/get.js index fdb14821bf..c098d44a85 100644 --- a/core/frontend/helpers/get.js +++ b/core/frontend/helpers/get.js @@ -223,7 +223,7 @@ module.exports = function getLabsWrapper() { // Even though this is a labs enabled helper, really we want users to upgrade to v2 API. errMessagePath: 'warnings.helpers.get.apiRequired.message', errContextPath: 'warnings.helpers.get.apiRequired.context', - helpUrl: 'https://docs.ghost.org/api/handlebars-themes/packagejson/', + helpUrl: 'https://ghost.org/docs/api/v2/handlebars-themes/packagejson/', async: true }, function executeHelper() { return get.apply(self, args); diff --git a/core/frontend/helpers/pagination.js b/core/frontend/helpers/pagination.js index adbcc54dfc..0a1316e151 100644 --- a/core/frontend/helpers/pagination.js +++ b/core/frontend/helpers/pagination.js @@ -19,7 +19,7 @@ pagination = function (options) { throw new errors.IncorrectUsageError({ level: 'normal', message: i18n.t('warnings.helpers.pagination.invalidData'), - help: 'https://docs.ghost.org/api/handlebars-themes/helpers/pagination/' + help: 'https://ghost.org/docs/api/v2/handlebars-themes/helpers/pagination/' }); } diff --git a/core/frontend/services/redirects/validation.js b/core/frontend/services/redirects/validation.js index f279f62aba..59307c35ca 100644 --- a/core/frontend/services/redirects/validation.js +++ b/core/frontend/services/redirects/validation.js @@ -9,7 +9,7 @@ const validate = (redirects) => { if (!_.isArray(redirects)) { throw new common.errors.ValidationError({ message: common.i18n.t('errors.utils.redirectsWrongFormat'), - help: 'https://docs.ghost.org/concepts/redirects/' + help: 'https://ghost.org/docs/api/v2/handlebars-themes/routing/redirects/' }); } @@ -18,7 +18,7 @@ const validate = (redirects) => { throw new common.errors.ValidationError({ message: common.i18n.t('errors.utils.redirectsWrongFormat'), context: redirect, - help: 'https://docs.ghost.org/concepts/redirects/' + help: 'https://ghost.org/docs/api/v2/handlebars-themes/routing/redirects/' }); } }); diff --git a/core/server/api/v0.1/mail.js b/core/server/api/v0.1/mail.js index 3a2ff54c45..066b538a81 100644 --- a/core/server/api/v0.1/mail.js +++ b/core/server/api/v0.1/mail.js @@ -28,7 +28,7 @@ function sendMail(object) { type: 'warn', message: [ common.i18n.t('warnings.index.unableToSendEmail'), - common.i18n.t('common.seeLinkForInstructions', {link: 'https://docs.ghost.org/mail/'}) + common.i18n.t('common.seeLinkForInstructions', {link: 'https://ghost.org/docs/concepts/config/#mail'}) ].join(' ') }] }, diff --git a/core/server/api/v2/mail.js b/core/server/api/v2/mail.js index 143894b17e..1da14e4835 100644 --- a/core/server/api/v2/mail.js +++ b/core/server/api/v2/mail.js @@ -18,7 +18,7 @@ _private.sendMail = (object) => { type: 'warn', message: [ common.i18n.t('warnings.index.unableToSendEmail'), - common.i18n.t('common.seeLinkForInstructions', {link: 'https://docs.ghost.org/mail/'}) + common.i18n.t('common.seeLinkForInstructions', {link: 'https://ghost.org/docs/concepts/config/#mail'}) ].join(' ') }] }, diff --git a/core/server/data/db/migrator.js b/core/server/data/db/migrator.js index 081013f9c8..623c5d8e33 100644 --- a/core/server/data/db/migrator.js +++ b/core/server/data/db/migrator.js @@ -58,7 +58,7 @@ module.exports.isDbCompatible = (connection) => { message: 'Your database version is not compatible with Ghost 2.0.', help: 'Want to keep your DB? Use Ghost < 1.0.0 or the "0.11" branch.' + '\n\n\n' + - 'Want to migrate Ghost 0.11 to 2.0? Please visit https://docs.ghost.org/v1/docs/migrating-to-ghost-1-0-0' + 'Want to migrate Ghost 0.11 to 2.0? Please visit https://ghost.org/faq/upgrade-to-ghost-1-0/' }); }) .catch((err) => { diff --git a/core/server/data/importer/importers/data/index.js b/core/server/data/importer/importers/data/index.js index f19d0ae6f7..54eaae401d 100644 --- a/core/server/data/importer/importers/data/index.js +++ b/core/server/data/importer/importers/data/index.js @@ -59,14 +59,14 @@ DataImporter = { if (!importData.meta) { throw new common.errors.IncorrectUsageError({ message: 'Wrong importer structure. `meta` is missing.', - help: 'https://docs.ghost.org/api/migration/#json-file-structure' + help: 'https://ghost.org/docs/api/v2/migration/#json-file-structure' }); } if (!importData.meta.version) { throw new common.errors.IncorrectUsageError({ message: 'Wrong importer structure. `meta.version` is missing.', - help: 'https://docs.ghost.org/api/migration/#json-file-structure' + help: 'https://ghost.org/docs/api/v2/migration/#json-file-structure' }); } @@ -76,7 +76,7 @@ DataImporter = { if (!semver.valid(importData.meta.version)) { return Promise.reject(new common.errors.InternalServerError({ message: 'Detected unsupported file structure.', - help: 'Please install Ghost 1.0, import the file and then update your blog to Ghost 2.0.\nVisit https://docs.ghost.org/faq/upgrade-to-ghost-1-0 or ask for help in our https://forum.ghost.org.' + help: 'Please install Ghost 1.0, import the file and then update your blog to Ghost 2.0.\nVisit https://ghost.org/faq/upgrade-to-ghost-1-0 or ask for help in our https://forum.ghost.org.' })); } diff --git a/core/server/data/schema/default-settings.json b/core/server/data/schema/default-settings.json index 3fb8e12795..d1867a111e 100644 --- a/core/server/data/schema/default-settings.json +++ b/core/server/data/schema/default-settings.json @@ -92,7 +92,7 @@ "defaultValue": "{}" }, "navigation": { - "defaultValue": "[{\"label\":\"Home\", \"url\":\"/\"},{\"label\":\"Tag\", \"url\":\"/tag/getting-started/\"}, {\"label\":\"Author\", \"url\":\"/author/ghost/\"},{\"label\":\"Help\", \"url\":\"https://docs.ghost.org\"}]" + "defaultValue": "[{\"label\":\"Home\", \"url\":\"/\"},{\"label\":\"Tag\", \"url\":\"/tag/getting-started/\"}, {\"label\":\"Author\", \"url\":\"/author/ghost/\"},{\"label\":\"Help\", \"url\":\"https://ghost.org/docs/\"}]" }, "slack": { "defaultValue": "[{\"url\":\"\", \"username\":\"Ghost\"}]" diff --git a/core/server/data/schema/fixtures/fixtures.json b/core/server/data/schema/fixtures/fixtures.json index 904fe2dcc8..d5c5fc3bb8 100644 --- a/core/server/data/schema/fixtures/fixtures.json +++ b/core/server/data/schema/fixtures/fixtures.json @@ -455,7 +455,7 @@ { "title": "Creating a custom theme", "slug": "themes", - "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v1.0.0/images/marketplace.jpg\",\"caption\":\"Anyone can write a completely custom Ghost theme with some solid knowledge of HTML and CSS\"}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org/marketplace/\"]],[\"code\"],[\"a\",[\"href\",\"https://github.com/TryGhost/Casper\"]],[\"a\",[\"href\",\"https://docs.ghost.org/api/handlebars-themes/\"]],[\"strong\"],[\"a\",[\"href\",\"https://forum.ghost.org/c/themes\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.\"]]],[1,\"p\",[[0,[],0,\"There are a huge range of both free and premium pre-built themes which you can get from the \"],[0,[0],1,\"Ghost Theme Marketplace\"],[0,[],0,\", or you can create your own from scratch.\"]]],[10,0],[1,\"p\",[[0,[],0,\"Ghost themes are written with a templating language called handlebars, which has a set of dynamic helpers to insert your data into template files. For example: \"],[0,[1],1,\"{{author.name}}\"],[0,[],0,\" outputs the name of the current author.\"]]],[1,\"p\",[[0,[],0,\"The best way to learn how to write your own Ghost theme is to have a look at \"],[0,[2],1,\"the source code for Casper\"],[0,[],0,\", which is heavily commented and should give you a sense of how everything fits together.\"]]],[3,\"ul\",[[[0,[1],1,\"default.hbs\"],[0,[],0,\" is the main template file, all contexts will load inside this file unless specifically told to use a different template.\"]],[[0,[1],1,\"post.hbs\"],[0,[],0,\" is the file used in the context of viewing a post.\"]],[[0,[1],1,\"index.hbs\"],[0,[],0,\" is the file used in the context of viewing the home page.\"]],[[0,[],0,\"and so on\"]]]],[1,\"p\",[[0,[],0,\"We've got \"],[0,[3],1,\"full and extensive theme documentation\"],[0,[],0,\" which outlines every template file, context and helper that you can use.\"]]],[1,\"p\",[[0,[],0,\"If you want to chat with other people making Ghost themes to get any advice or help, there's also a \"],[0,[4],1,\"themes\"],[0,[],0,\" section on our \"],[0,[5],1,\"public Ghost forum\"],[0,[],0,\".\"]]]]}", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v1.0.0/images/marketplace.jpg\",\"caption\":\"Anyone can write a completely custom Ghost theme with some solid knowledge of HTML and CSS\"}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org/marketplace/\"]],[\"code\"],[\"a\",[\"href\",\"https://github.com/TryGhost/Casper\"]],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/\"]],[\"strong\"],[\"a\",[\"href\",\"https://forum.ghost.org/c/themes\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.\"]]],[1,\"p\",[[0,[],0,\"There are a huge range of both free and premium pre-built themes which you can get from the \"],[0,[0],1,\"Ghost Theme Marketplace\"],[0,[],0,\", or you can create your own from scratch.\"]]],[10,0],[1,\"p\",[[0,[],0,\"Ghost themes are written with a templating language called handlebars, which has a set of dynamic helpers to insert your data into template files. For example: \"],[0,[1],1,\"{{author.name}}\"],[0,[],0,\" outputs the name of the current author.\"]]],[1,\"p\",[[0,[],0,\"The best way to learn how to write your own Ghost theme is to have a look at \"],[0,[2],1,\"the source code for Casper\"],[0,[],0,\", which is heavily commented and should give you a sense of how everything fits together.\"]]],[3,\"ul\",[[[0,[1],1,\"default.hbs\"],[0,[],0,\" is the main template file, all contexts will load inside this file unless specifically told to use a different template.\"]],[[0,[1],1,\"post.hbs\"],[0,[],0,\" is the file used in the context of viewing a post.\"]],[[0,[1],1,\"index.hbs\"],[0,[],0,\" is the file used in the context of viewing the home page.\"]],[[0,[],0,\"and so on\"]]]],[1,\"p\",[[0,[],0,\"We've got \"],[0,[3],1,\"full and extensive theme documentation\"],[0,[],0,\" which outlines every template file, context and helper that you can use.\"]]],[1,\"p\",[[0,[],0,\"If you want to chat with other people making Ghost themes to get any advice or help, there's also a \"],[0,[4],1,\"themes\"],[0,[],0,\" section on our \"],[0,[5],1,\"public Ghost forum\"],[0,[],0,\".\"]]]]}", "featured": false, "page": false, "status": "published", @@ -470,7 +470,7 @@ { "title": "Apps & integrations", "slug": "apps-integrations", - "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"markdown\",{\"markdown\":\"\\n\"}]],\"markups\":[[\"a\",[\"href\",\"https://zapier.com\"]],[\"strong\"],[\"a\",[\"href\",\"https://docs.ghost.org/api/handlebars-themes/\"]],[\"em\"],[\"a\",[\"href\",\"https://docs.ghost.org/integrations/disqus/\"]],[\"a\",[\"href\",\"https://docs.ghost.org/integrations/discourse/\"]],[\"a\",[\"href\",\"https://help.ghost.org/article/89-mathjax\"]],[\"a\",[\"href\",\"https://prismjs.com/\"]],[\"a\",[\"href\",\"https://www.google.com/forms/\"]],[\"a\",[\"href\",\"https://www.typeform.com/\"]],[\"a\",[\"href\",\"https://docs.ghost.org/api/\"]],[\"a\",[\"href\",\"/themes/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"There are three primary ways to work with third-party services in Ghost: using Zapier, editing your theme, or using the Ghost API.\"]]],[1,\"h1\",[[0,[],0,\"Zapier\"]]],[1,\"p\",[[0,[],0,\"You can connect your Ghost site to over 1,000 external services using the official integration with \"],[0,[0],1,\"Zapier\"],[0,[],0,\".\"]]],[1,\"p\",[[0,[],0,\"Zapier sets up automations with Triggers and Actions, which allows you to create and customise a wide range of connected applications.\"]]],[1,\"blockquote\",[[0,[1],1,\"Example\"],[0,[],0,\": When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).\"]]],[1,\"p\",[[0,[1],1,\"Here are the most popular Ghost<>Zapier automation templates:\"],[0,[],0,\" \"]]],[10,0],[1,\"h1\",[[0,[],0,\"Editing your theme\"]]],[1,\"p\",[[0,[],0,\"One of the biggest advantages of using Ghost over centralised platforms is that you have total control over the front end of your site. Either customise your existing theme, or create a new theme from scratch with our \"],[0,[2],1,\"Theme SDK\"],[0,[],0,\". \"]]],[1,\"p\",[[0,[],0,\"You can integrate \"],[0,[3],1,\"any\"],[0,[],0,\" front end code into a Ghost theme without restriction, and it will work just fine. No restrictions!\"]]],[1,\"p\",[[0,[1],1,\"Here are some common examples\"],[0,[],0,\":\"]]],[3,\"ul\",[[[0,[],0,\"Include comments on a Ghost blog with \"],[0,[4],1,\"Disqus\"],[0,[],0,\" or \"],[0,[5],1,\"Discourse\"]],[[0,[],0,\"Implement \"],[0,[6],1,\"MathJAX\"],[0,[],0,\" with a little bit of JavaScript\"]],[[0,[],0,\"Add syntax highlighting to your code snippets using \"],[0,[7],1,\"Prism.js\"]],[[0,[],0,\"Integrate any dynamic forms from \"],[0,[8],1,\"Google\"],[0,[],0,\" or \"],[0,[9],1,\"Typeform\"],[0,[],0,\" to capture data\"]],[[0,[],0,\"Just about anything which uses JavaScript, APIs and Markup.\"]]]],[1,\"h1\",[[0,[],0,\"Using the Public API\"]]],[1,\"p\",[[0,[],0,\"Ghost itself is driven by a set of core APIs, and so you can access the Public Ghost JSON API from external webpages or applications in order to pull data and display it in other places.\"]]],[1,\"blockquote\",[[0,[],0,\"The Ghost API is \"],[0,[10],1,\"thoroughly documented\"],[0,[],0,\" and straightforward to work with for developers of almost any level. \"]]],[1,\"p\",[[0,[],0,\"Alright, the last post in our welcome-series! If you're curious about creating your own Ghost theme from scratch, here are \"],[0,[11],1,\"some more details\"],[0,[],0,\" on how that works.\"]]]]}", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"markdown\",{\"markdown\":\"\\n\"}]],\"markups\":[[\"a\",[\"href\",\"https://zapier.com\"]],[\"strong\"],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/\"]],[\"em\"],[\"a\",[\"href\",\"https://ghost.org/integrations/disqus/\"]],[\"a\",[\"href\",\"https://ghost.org/integrations/discourse/\"]],[\"a\",[\"href\",\"https://ghost.org/integrations/\"]],[\"a\",[\"href\",\"https://prismjs.com/\"]],[\"a\",[\"href\",\"https://www.google.com/forms/\"]],[\"a\",[\"href\",\"https://www.typeform.com/\"]],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/\"]],[\"a\",[\"href\",\"/themes/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"There are three primary ways to work with third-party services in Ghost: using Zapier, editing your theme, or using the Ghost API.\"]]],[1,\"h1\",[[0,[],0,\"Zapier\"]]],[1,\"p\",[[0,[],0,\"You can connect your Ghost site to over 1,000 external services using the official integration with \"],[0,[0],1,\"Zapier\"],[0,[],0,\".\"]]],[1,\"p\",[[0,[],0,\"Zapier sets up automations with Triggers and Actions, which allows you to create and customise a wide range of connected applications.\"]]],[1,\"blockquote\",[[0,[1],1,\"Example\"],[0,[],0,\": When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).\"]]],[1,\"p\",[[0,[1],1,\"Here are the most popular Ghost<>Zapier automation templates:\"],[0,[],0,\" \"]]],[10,0],[1,\"h1\",[[0,[],0,\"Editing your theme\"]]],[1,\"p\",[[0,[],0,\"One of the biggest advantages of using Ghost over centralised platforms is that you have total control over the front end of your site. Either customise your existing theme, or create a new theme from scratch with our \"],[0,[2],1,\"Theme SDK\"],[0,[],0,\". \"]]],[1,\"p\",[[0,[],0,\"You can integrate \"],[0,[3],1,\"any\"],[0,[],0,\" front end code into a Ghost theme without restriction, and it will work just fine. No restrictions!\"]]],[1,\"p\",[[0,[1],1,\"Here are some common examples\"],[0,[],0,\":\"]]],[3,\"ul\",[[[0,[],0,\"Include comments on a Ghost blog with \"],[0,[4],1,\"Disqus\"],[0,[],0,\" or \"],[0,[5],1,\"Discourse\"]],[[0,[],0,\"Implement \"],[0,[6],1,\"MathJAX\"],[0,[],0,\" with a little bit of JavaScript\"]],[[0,[],0,\"Add syntax highlighting to your code snippets using \"],[0,[7],1,\"Prism.js\"]],[[0,[],0,\"Integrate any dynamic forms from \"],[0,[8],1,\"Google\"],[0,[],0,\" or \"],[0,[9],1,\"Typeform\"],[0,[],0,\" to capture data\"]],[[0,[],0,\"Just about anything which uses JavaScript, APIs and Markup.\"]]]],[1,\"h1\",[[0,[],0,\"Using the Public API\"]]],[1,\"p\",[[0,[],0,\"Ghost itself is driven by a set of core APIs, and so you can access the Public Ghost JSON API from external webpages or applications in order to pull data and display it in other places.\"]]],[1,\"blockquote\",[[0,[],0,\"The Ghost API is \"],[0,[10],1,\"thoroughly documented\"],[0,[],0,\" and straightforward to work with for developers of almost any level. \"]]],[1,\"p\",[[0,[],0,\"Alright, the last post in our welcome-series! If you're curious about creating your own Ghost theme from scratch, here are \"],[0,[11],1,\"some more details\"],[0,[],0,\" on how that works.\"]]]]}", "featured": false, "page": false, "status": "published", @@ -485,7 +485,7 @@ { "title": "Organising your content", "slug": "organising-content", - "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}]],\"cards\":[],\"markups\":[[\"strong\"],[\"code\"],[\"em\"],[\"a\",[\"href\",\"https://docs.ghost.org/api/handlebars-themes/\"]],[\"a\",[\"href\",\"http://yaml.org/spec/1.2/spec.html\",\"rel\",\"noreferrer nofollow noopener\"]],[\"a\",[\"href\",\"https://docs.ghost.org/concepts/routing/\"]],[\"a\",[\"href\",\"/apps-integrations/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost has a flexible organisational taxonomy called\"],[0,[0],1,\" tags\"],[0,[],0,\" which can be used to configure your site structure using \"],[0,[0],1,\"dynamic routing\"],[0,[],0,\". \"]]],[1,\"h1\",[[0,[],0,\"Basic Tagging\"]]],[1,\"p\",[[0,[],0,\"You can think of tags like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.\"]]],[1,\"p\",[[0,[],0,\"When you create content for your publication you can assign tags to help differentiate between categories of content. \"]]],[1,\"p\",[[0,[],0,\"For example you may tag some content with News and other content with Podcast, which would create two distinct categories of content listed on \"],[0,[1],1,\"/tag/news/\"],[0,[],0,\" and \"],[0,[1],1,\"/tag/weather/\"],[0,[],0,\", respectively.\"]]],[1,\"p\",[[0,[],0,\"If you tag a post with both \"],[0,[1],1,\"News\"],[0,[],0,\" \"],[0,[2],1,\"and\"],[0,[],0,\" \"],[0,[1],1,\"Weather\"],[0,[],0,\" - then it appears in both sections. Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.\"]]],[1,\"h1\",[[0,[],0,\"The primary tag\"]]],[1,\"p\",[[0,[],0,\"Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default. \"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", Technology, Startup\"]]],[1,\"p\",[[0,[],0,\"So you can add the most important tag which you want to show up in your theme, but also add related tags which are less important.\"]]],[1,\"h1\",[[0,[],0,\"Private tags\"]]],[1,\"p\",[[0,[],0,\"Sometimes you may want to assign a post a specific tag, but you don't necessarily want that tag appearing in the theme or creating an archive page. In Ghost, hashtags are private and can be used for special styling.\"]]],[1,\"p\",[[0,[],0,\"For example, if you sometimes publish posts with video content - you might want your theme to adapt and get rid of the sidebar for these posts, to give more space for an embedded video to fill the screen. In this case, you could use private tags to tell your theme what to do.\"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", #video\"]]],[1,\"p\",[[0,[],0,\"Here, the theme would assign the post publicly displayed tags of News - but it would also keep a private record of the post being tagged with #video. In your theme, you could then look for private tags conditionally and give them special formatting. \"]]],[1,\"blockquote\",[[0,[2],0,\"You can find documentation for theme development techniques like this and many more over on Ghost's extensive \"],[0,[3],1,\"theme documentation\"],[0,[],1,\".\"]]],[1,\"h1\",[[0,[],0,\"Dynamic Routing\"]]],[1,\"p\",[[0,[],0,\"Dynamic routing gives you the ultimate freedom to build a custom publication to suit your needs. Routes are rules that map URL patterns to your content and templates. \"]]],[1,\"p\",[[0,[],0,\"For example, you may not want content tagged with \"],[0,[1],1,\"News\"],[0,[],0,\" to exist on: \"],[0,[1],1,\"example.com/tag/news\"],[0,[],0,\". Instead, you want it to exist on \"],[0,[1],1,\"example.com/news\"],[0,[],0,\" . \"]]],[1,\"p\",[[0,[],0,\"In this case you can use dynamic routes to create customised collections of content on your site. It's also possible to use multiple templates in your theme to render each content type differently.\"]]],[1,\"p\",[[0,[],0,\"There are lots of use cases for dynamic routing with Ghost, here are a few common examples: \"]]],[3,\"ul\",[[[0,[],0,\"Setting a custom home page with its own template\"]],[[0,[],0,\"Having separate content hubs for blog and podcast, that render differently, and have custom RSS feeds to support two types of content\"]],[[0,[],0,\"Creating a founders column as a unique view, by filtering content created by specific authors\"]],[[0,[],0,\"Including dates in permalinks for your posts\"]],[[0,[],0,\"Setting posts to have a URL relative to their primary tag like \"],[0,[1],1,\"example.com/europe/story-title/\"],[1,[],0,0]]]],[1,\"blockquote\",[[0,[2],0,\"Dynamic routing can be configured in Ghost using \"],[0,[4],1,\"YAML\"],[0,[],0,\" files. Read our dynamic routing \"],[0,[5],1,\"documentation\"],[0,[],1,\" for further details.\"]]],[1,\"p\",[[0,[],0,\"You can further customise your site using \"],[0,[6],1,\"Apps & Integrations\"],[0,[],0,\".\"]]]]}", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}]],\"cards\":[],\"markups\":[[\"strong\"],[\"code\"],[\"em\"],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/\"]],[\"a\",[\"href\",\"http://yaml.org/spec/1.2/spec.html\",\"rel\",\"noreferrer nofollow noopener\"]],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/routing/\"]],[\"a\",[\"href\",\"/apps-integrations/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost has a flexible organisational taxonomy called\"],[0,[0],1,\" tags\"],[0,[],0,\" which can be used to configure your site structure using \"],[0,[0],1,\"dynamic routing\"],[0,[],0,\". \"]]],[1,\"h1\",[[0,[],0,\"Basic Tagging\"]]],[1,\"p\",[[0,[],0,\"You can think of tags like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.\"]]],[1,\"p\",[[0,[],0,\"When you create content for your publication you can assign tags to help differentiate between categories of content. \"]]],[1,\"p\",[[0,[],0,\"For example you may tag some content with News and other content with Podcast, which would create two distinct categories of content listed on \"],[0,[1],1,\"/tag/news/\"],[0,[],0,\" and \"],[0,[1],1,\"/tag/weather/\"],[0,[],0,\", respectively.\"]]],[1,\"p\",[[0,[],0,\"If you tag a post with both \"],[0,[1],1,\"News\"],[0,[],0,\" \"],[0,[2],1,\"and\"],[0,[],0,\" \"],[0,[1],1,\"Weather\"],[0,[],0,\" - then it appears in both sections. Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.\"]]],[1,\"h1\",[[0,[],0,\"The primary tag\"]]],[1,\"p\",[[0,[],0,\"Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default. \"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", Technology, Startup\"]]],[1,\"p\",[[0,[],0,\"So you can add the most important tag which you want to show up in your theme, but also add related tags which are less important.\"]]],[1,\"h1\",[[0,[],0,\"Private tags\"]]],[1,\"p\",[[0,[],0,\"Sometimes you may want to assign a post a specific tag, but you don't necessarily want that tag appearing in the theme or creating an archive page. In Ghost, hashtags are private and can be used for special styling.\"]]],[1,\"p\",[[0,[],0,\"For example, if you sometimes publish posts with video content - you might want your theme to adapt and get rid of the sidebar for these posts, to give more space for an embedded video to fill the screen. In this case, you could use private tags to tell your theme what to do.\"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", #video\"]]],[1,\"p\",[[0,[],0,\"Here, the theme would assign the post publicly displayed tags of News - but it would also keep a private record of the post being tagged with #video. In your theme, you could then look for private tags conditionally and give them special formatting. \"]]],[1,\"blockquote\",[[0,[2],0,\"You can find documentation for theme development techniques like this and many more over on Ghost's extensive \"],[0,[3],1,\"theme documentation\"],[0,[],1,\".\"]]],[1,\"h1\",[[0,[],0,\"Dynamic Routing\"]]],[1,\"p\",[[0,[],0,\"Dynamic routing gives you the ultimate freedom to build a custom publication to suit your needs. Routes are rules that map URL patterns to your content and templates. \"]]],[1,\"p\",[[0,[],0,\"For example, you may not want content tagged with \"],[0,[1],1,\"News\"],[0,[],0,\" to exist on: \"],[0,[1],1,\"example.com/tag/news\"],[0,[],0,\". Instead, you want it to exist on \"],[0,[1],1,\"example.com/news\"],[0,[],0,\" . \"]]],[1,\"p\",[[0,[],0,\"In this case you can use dynamic routes to create customised collections of content on your site. It's also possible to use multiple templates in your theme to render each content type differently.\"]]],[1,\"p\",[[0,[],0,\"There are lots of use cases for dynamic routing with Ghost, here are a few common examples: \"]]],[3,\"ul\",[[[0,[],0,\"Setting a custom home page with its own template\"]],[[0,[],0,\"Having separate content hubs for blog and podcast, that render differently, and have custom RSS feeds to support two types of content\"]],[[0,[],0,\"Creating a founders column as a unique view, by filtering content created by specific authors\"]],[[0,[],0,\"Including dates in permalinks for your posts\"]],[[0,[],0,\"Setting posts to have a URL relative to their primary tag like \"],[0,[1],1,\"example.com/europe/story-title/\"],[1,[],0,0]]]],[1,\"blockquote\",[[0,[2],0,\"Dynamic routing can be configured in Ghost using \"],[0,[4],1,\"YAML\"],[0,[],0,\" files. Read our dynamic routing \"],[0,[5],1,\"documentation\"],[0,[],1,\" for further details.\"]]],[1,\"p\",[[0,[],0,\"You can further customise your site using \"],[0,[6],1,\"Apps & Integrations\"],[0,[],0,\".\"]]]]}", "featured": false, "page": false, "status": "published", diff --git a/core/server/lib/fs/package-json/parse.js b/core/server/lib/fs/package-json/parse.js index 7134708900..47b55b50f1 100644 --- a/core/server/lib/fs/package-json/parse.js +++ b/core/server/lib/fs/package-json/parse.js @@ -30,7 +30,7 @@ function parsePackageJson(path) { if (!hasRequiredKeys) { err = new Error(common.i18n.t('errors.utils.parsepackagejson.nameOrVersionMissing')); err.context = path; - err.help = common.i18n.t('errors.utils.parsepackagejson.willBeRequired', {url: 'https://docs.ghost.org/api/handlebars-themes/'}); + err.help = common.i18n.t('errors.utils.parsepackagejson.willBeRequired', {url: 'https://ghost.org/docs/api/v2/handlebars-themes/'}); return Promise.reject(err); } @@ -39,7 +39,7 @@ function parsePackageJson(path) { } catch (parseError) { err = new Error(common.i18n.t('errors.utils.parsepackagejson.themeFileIsMalformed')); err.context = path; - err.help = common.i18n.t('errors.utils.parsepackagejson.willBeRequired', {url: 'https://docs.ghost.org/api/handlebars-themes/'}); + err.help = common.i18n.t('errors.utils.parsepackagejson.willBeRequired', {url: 'https://ghost.org/docs/api/v2/handlebars-themes/'}); return Promise.reject(err); } diff --git a/core/server/models/post.js b/core/server/models/post.js index 48c4ca06be..760e5331f8 100644 --- a/core/server/models/post.js +++ b/core/server/models/post.js @@ -350,7 +350,7 @@ Post = ghostBookshelf.Model.extend({ } catch (err) { throw new common.errors.ValidationError({ message: 'Invalid mobiledoc structure.', - help: 'https://docs.ghost.org/concepts/posts/' + help: 'https://ghost.org/docs/concepts/posts/' }); } } diff --git a/core/server/services/auth/authenticate.js b/core/server/services/auth/authenticate.js index 76858b5367..0b12c6a7cc 100644 --- a/core/server/services/auth/authenticate.js +++ b/core/server/services/auth/authenticate.js @@ -42,7 +42,7 @@ const authenticate = { return next(new common.errors.UnauthorizedError({ message: common.i18n.t('errors.middleware.auth.accessDenied'), context: common.i18n.t('errors.middleware.auth.clientCredentialsNotProvided'), - help: common.i18n.t('errors.middleware.auth.forInformationRead', {url: 'https://api.ghost.org/docs/client-authentication'}) + help: common.i18n.t('errors.middleware.auth.forInformationRead', {url: 'https://ghost.org/faq/upgrade-to-ghost-2-0/'}) })); } @@ -60,7 +60,7 @@ const authenticate = { return next(new common.errors.UnauthorizedError({ message: common.i18n.t('errors.middleware.auth.accessDenied'), context: common.i18n.t('errors.middleware.auth.clientCredentialsNotValid'), - help: common.i18n.t('errors.middleware.auth.forInformationRead', {url: 'https://api.ghost.org/docs/client-authentication'}) + help: common.i18n.t('errors.middleware.auth.forInformationRead', {url: 'https://ghost.org/faq/upgrade-to-ghost-2-0/'}) })); } diff --git a/core/server/services/auth/authorize.js b/core/server/services/auth/authorize.js index fcc9737db3..852980757b 100644 --- a/core/server/services/auth/authorize.js +++ b/core/server/services/auth/authorize.js @@ -27,7 +27,7 @@ const authorize = { return next(new common.errors.NoPermissionError({ message: common.i18n.t('errors.middleware.auth.publicAPIDisabled.error'), context: common.i18n.t('errors.middleware.auth.publicAPIDisabled.context'), - help: common.i18n.t('errors.middleware.auth.forInformationRead', {url: 'https://docs.ghost.org/api/content/'}) + help: common.i18n.t('errors.middleware.auth.forInformationRead', {url: 'https://ghost.org/docs/api/v2/content/'}) })); } diff --git a/core/server/services/mail/GhostMailer.js b/core/server/services/mail/GhostMailer.js index bbd2718613..7ebdeb7744 100644 --- a/core/server/services/mail/GhostMailer.js +++ b/core/server/services/mail/GhostMailer.js @@ -48,7 +48,7 @@ GhostMailer.prototype.getDomain = function () { GhostMailer.prototype.send = function (message) { var self = this, to, - help = common.i18n.t('errors.api.authentication.checkEmailConfigInstructions', {url: 'https://docs.ghost.org/mail/'}), + help = common.i18n.t('errors.api.authentication.checkEmailConfigInstructions', {url: 'https://ghost.org/docs/concepts/config/#mail'}), errorMessage = common.i18n.t('errors.mail.failedSendingEmail.error'); // important to clone message as we modify it diff --git a/core/server/services/slack.js b/core/server/services/slack.js index 250e65e599..7413eaf8b8 100644 --- a/core/server/services/slack.js +++ b/core/server/services/slack.js @@ -117,7 +117,7 @@ function ping(post) { common.logging.error(new common.errors.GhostError({ err: err, context: common.i18n.t('errors.services.ping.requestFailed.error', {service: 'slack'}), - help: common.i18n.t('errors.services.ping.requestFailed.help', {url: 'https://docs.ghost.org'}) + help: common.i18n.t('errors.services.ping.requestFailed.help', {url: 'https://ghost.org/docs/'}) })); }); } diff --git a/core/server/services/xmlrpc.js b/core/server/services/xmlrpc.js index ffb9e74728..d8d5220418 100644 --- a/core/server/services/xmlrpc.js +++ b/core/server/services/xmlrpc.js @@ -83,7 +83,7 @@ function ping(post) { err: err, message: err.message, context: common.i18n.t('errors.services.ping.requestFailed.error', {service: 'xmlrpc'}), - help: common.i18n.t('errors.services.ping.requestFailed.help', {url: 'https://docs.ghost.org'}) + help: common.i18n.t('errors.services.ping.requestFailed.help', {url: 'https://ghost.org/docs/'}) })); }); }); diff --git a/core/server/translations/en.json b/core/server/translations/en.json index 9173f5d109..84f3a7ae25 100644 --- a/core/server/translations/en.json +++ b/core/server/translations/en.json @@ -605,7 +605,7 @@ "isDeprecated": "Warning: pageUrl is deprecated, please use page_url instead\nThe helper pageUrl has been replaced with page_url in Ghost 0.4.2, and will be removed entirely in Ghost 0.6\nIn your theme's pagination.hbs file, pageUrl should be renamed to page_url" }, "pagination": { - "invalidData": "The \\{\\{pagination\\}\\} helper was used outside of a paginated context. See https://docs.ghost.org/api/handlebars-themes/helpers/pagination/.", + "invalidData": "The \\{\\{pagination\\}\\} helper was used outside of a paginated context. See https://ghost.org/docs/api/v2/handlebars-themes/helpers/pagination/.", "valuesMustBeDefined": "All values must be defined for page, pages, limit and total", "nextPrevValuesMustBeNumeric": "Invalid value, Next/Prev must be a number", "valuesMustBeNumeric": "Invalid value, check page, pages, limit and total are numbers" diff --git a/core/server/update-check.js b/core/server/update-check.js index 06fd55f91b..cc4c858c7a 100644 --- a/core/server/update-check.js +++ b/core/server/update-check.js @@ -49,7 +49,7 @@ function updateCheckError(err) { }, internal); err.context = common.i18n.t('errors.updateCheck.checkingForUpdatesFailed.error'); - err.help = common.i18n.t('errors.updateCheck.checkingForUpdatesFailed.help', {url: 'https://docs.ghost.org'}); + err.help = common.i18n.t('errors.updateCheck.checkingForUpdatesFailed.help', {url: 'https://ghost.org/docs/'}); common.logging.error(err); } @@ -131,7 +131,7 @@ function updateCheckData() { * With the privacy setting `useUpdateCheck` you can control if you want to expose data/stats from your blog to the * service. Enabled or disabled, you will receive the latest notification available from the service. * - * @see https://docs.ghost.org/concepts/config/#privacy + * @see https://ghost.org/docs/concepts/config/#privacy * @returns {Promise} */ function updateCheckRequest() { diff --git a/core/server/web/shared/middlewares/custom-redirects.js b/core/server/web/shared/middlewares/custom-redirects.js index 0476e2e4c5..0245aa7aa8 100644 --- a/core/server/web/shared/middlewares/custom-redirects.js +++ b/core/server/web/shared/middlewares/custom-redirects.js @@ -72,7 +72,7 @@ _private.registerRoutes = () => { common.logging.error(new common.errors.IncorrectUsageError({ message: common.i18n.t('errors.middleware.redirects.register'), context: err.message, - help: 'https://docs.ghost.org/concepts/redirects/' + help: 'https://ghost.org/docs/api/v2/handlebars-themes/routing/redirects/' })); } } @@ -82,7 +82,7 @@ _private.registerRoutes = () => { /** * - you can extend Ghost with a custom redirects file - * - see https://github.com/TryGhost/Ghost/issues/7707 and https://docs.ghost.org/concepts/redirects/ + * - see https://github.com/TryGhost/Ghost/issues/7707 and https://ghost.org/docs/api/v2/handlebars-themes/routing/redirects/ * - file loads synchronously, because we need to register the routes before anything else */ exports.use = function use(siteApp) { diff --git a/core/test/unit/apps/amp/amp_content_spec.js b/core/test/unit/apps/amp/amp_content_spec.js index 8619aceac6..a898c96288 100644 --- a/core/test/unit/apps/amp/amp_content_spec.js +++ b/core/test/unit/apps/amp/amp_content_spec.js @@ -110,7 +110,7 @@ describe('{{amp_content}} helper', function () { describe('Transforms and sanitizes HTML', function () { beforeEach(function () { - ampContentHelper.__set__('urlUtils', urlUtils.getInstance({url: 'https://blog.ghost.org/'})); + ampContentHelper.__set__('urlUtils', urlUtils.getInstance({url: 'https://ghost.org/blog/'})); }); afterEach(function () { @@ -120,7 +120,7 @@ describe('{{amp_content}} helper', function () { it('can transform img tags to amp-img', function (done) { const GIF1x1 = Buffer.from('R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==', 'base64'); - nock('https://blog.ghost.org') + nock('https://ghost.org/blog/') .get('/content/images/2019/06/test.jpg') .reply(200, GIF1x1); @@ -129,7 +129,7 @@ describe('{{amp_content}} helper', function () { updated_at: 'Wed Jul 27 2016 18:17:22 GMT+0200 (CEST)', id: 1 }, - expectedResult = '', + expectedResult = '', ampResult = ampContentHelper.call(testData); ampResult.then(function (rendered) { @@ -189,7 +189,7 @@ describe('{{amp_content}} helper', function () { updated_at: 'Wed Jul 27 2016 18:17:22 GMT+0200 (CEST)', id: 1 }, - expectedResult = '

Hello

' + ' ' + ' ' + @@ -260,7 +260,7 @@ describe('{{amp_content}} helper', function () { should.exist(rendered); rendered.string.should.equal(''); should.exist(ampedHTML); - ampedHTML.should.be.equal('The Ghost Logo'); + ampedHTML.should.be.equal('The Ghost Logo'); should.exist(sanitizedHTML); sanitizedHTML.should.be.equal(''); done(); diff --git a/core/test/unit/data/schema/integrity_spec.js b/core/test/unit/data/schema/integrity_spec.js index 9cb42232fa..9054b63bc3 100644 --- a/core/test/unit/data/schema/integrity_spec.js +++ b/core/test/unit/data/schema/integrity_spec.js @@ -20,7 +20,7 @@ var should = require('should'), describe('DB version integrity', function () { // Only these variables should need updating const currentSchemaHash = 'fda0398e93a74b2dc435cb4c026679ba'; - const currentFixturesHash = 'c434227059c5b72f9af9e51bdd4f9be3'; + const currentFixturesHash = '40e10c96ee9a08164a637dc6b37d7b6b'; // If this test is failing, then it is likely a change has been made that requires a DB version bump, // and the values above will need updating as confirmation diff --git a/core/test/unit/helpers/get_spec.js b/core/test/unit/helpers/get_spec.js index 0e71d28b6b..c7a3636d3b 100644 --- a/core/test/unit/helpers/get_spec.js +++ b/core/test/unit/helpers/get_spec.js @@ -46,7 +46,7 @@ describe('{{#get}} helper', function () { 'string', '' + 'See https://ghost.org/docs/api/v2/handlebars-themes/packagejson/");' ); done(); diff --git a/core/test/unit/helpers/pagination_spec.js b/core/test/unit/helpers/pagination_spec.js index d20032f035..8c1a3009e3 100644 --- a/core/test/unit/helpers/pagination_spec.js +++ b/core/test/unit/helpers/pagination_spec.js @@ -28,7 +28,7 @@ describe('{{pagination}} helper', function () { return function () { helpers.pagination.call(data); }; - }, expectedMessage = 'The {{pagination}} helper was used outside of a paginated context. See https://docs.ghost.org/api/handlebars-themes/helpers/pagination/.'; + }, expectedMessage = 'The {{pagination}} helper was used outside of a paginated context. See https://ghost.org/docs/api/v2/handlebars-themes/helpers/pagination/.'; runHelper('not an object').should.throwError(expectedMessage); runHelper(function () { diff --git a/core/test/unit/lib/fs/package-json/parse_spec.js b/core/test/unit/lib/fs/package-json/parse_spec.js index 38129ce8a2..ffd1d21628 100644 --- a/core/test/unit/lib/fs/package-json/parse_spec.js +++ b/core/test/unit/lib/fs/package-json/parse_spec.js @@ -45,7 +45,7 @@ describe('lib/fs/package-json: parse', function () { .catch(function (err) { err.message.should.equal('"name" or "version" is missing from theme package.json file.'); err.context.should.equal(tmpFile.name); - err.help.should.equal('This will be required in future. Please see https://docs.ghost.org/api/handlebars-themes/'); + err.help.should.equal('This will be required in future. Please see https://ghost.org/docs/api/v2/handlebars-themes/'); done(); }) @@ -70,7 +70,7 @@ describe('lib/fs/package-json: parse', function () { .catch(function (err) { err.message.should.equal('"name" or "version" is missing from theme package.json file.'); err.context.should.equal(tmpFile.name); - err.help.should.equal('This will be required in future. Please see https://docs.ghost.org/api/handlebars-themes/'); + err.help.should.equal('This will be required in future. Please see https://ghost.org/docs/api/v2/handlebars-themes/'); done(); }) @@ -93,7 +93,7 @@ describe('lib/fs/package-json: parse', function () { .catch(function (err) { err.message.should.equal('Theme package.json file is malformed'); err.context.should.equal(tmpFile.name); - err.help.should.equal('This will be required in future. Please see https://docs.ghost.org/api/handlebars-themes/'); + err.help.should.equal('This will be required in future. Please see https://ghost.org/docs/api/v2/handlebars-themes/'); done(); }) diff --git a/core/test/unit/services/themes/validate_spec.js b/core/test/unit/services/themes/validate_spec.js index c1fbbedc64..dafec58707 100644 --- a/core/test/unit/services/themes/validate_spec.js +++ b/core/test/unit/services/themes/validate_spec.js @@ -69,7 +69,7 @@ describe('Themes', function () { fatal: true, level: 'error', rule: 'Replace the {{#if author.cover}} helper with {{#if author.cover_image}}', - details: 'The cover attribute was replaced with cover_image.
Instead of {{#if author.cover}} you need to use {{#if author.cover_image}}.
See the object attributes of authorhere.', + details: 'The cover attribute was replaced with cover_image.
Instead of {{#if author.cover}} you need to use {{#if author.cover_image}}.
See the object attributes of authorhere.', failures: [{}], code: 'GS001-DEPR-CON-AC' } @@ -97,7 +97,7 @@ describe('Themes', function () { fatal: true, level: 'error', rule: 'Replace the {{#if author.cover}} helper with {{#if author.cover_image}}', - details: 'The cover attribute was replaced with cover_image.
Instead of {{#if author.cover}} you need to use {{#if author.cover_image}}.
See the object attributes of authorhere.', + details: 'The cover attribute was replaced with cover_image.
Instead of {{#if author.cover}} you need to use {{#if author.cover_image}}.
See the object attributes of authorhere.', failures: [{}], code: 'GS001-DEPR-CON-AC' } diff --git a/core/test/unit/web/middleware/url-redirects_spec.js b/core/test/unit/web/middleware/url-redirects_spec.js index c6778a1662..ac0d4647a3 100644 --- a/core/test/unit/web/middleware/url-redirects_spec.js +++ b/core/test/unit/web/middleware/url-redirects_spec.js @@ -333,7 +333,7 @@ describe('UNIT: url redirects', function () { it('url and admin url are different, protocol is different, request is not secure', function (done) { urlRedirects.__set__('urlUtils', urlUtils.getInstance({ - url: 'http://blog.ghost.org', + url: 'http://ghost.org/blog/', adminUrl: 'http://something.com' })); @@ -350,7 +350,7 @@ describe('UNIT: url redirects', function () { it('url and admin url are different, protocol is different, request is secure', function (done) { urlRedirects.__set__('urlUtils', urlUtils.getInstance({ - url: 'http://blog.ghost.org', + url: 'http://ghost.org/blog/', adminUrl: 'http://something.com' })); diff --git a/core/test/utils/fixtures/export/default_export.json b/core/test/utils/fixtures/export/default_export.json index bb253a44df..776027ad0e 100644 --- a/core/test/utils/fixtures/export/default_export.json +++ b/core/test/utils/fixtures/export/default_export.json @@ -1861,10 +1861,10 @@ "uuid": "4bcae678-0c29-4f70-8395-f63ae5f4fa91", "title": "Creating a custom theme", "slug": "themes", - "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v1.0.0/images/marketplace.jpg\",\"caption\":\"Anyone can write a completely custom Ghost theme with some solid knowledge of HTML and CSS\"}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org/marketplace/\"]],[\"code\"],[\"a\",[\"href\",\"https://github.com/TryGhost/Casper\"]],[\"a\",[\"href\",\"https://docs.ghost.org/api/handlebars-themes/\"]],[\"strong\"],[\"a\",[\"href\",\"https://forum.ghost.org/c/themes\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.\"]]],[1,\"p\",[[0,[],0,\"There are a huge range of both free and premium pre-built themes which you can get from the \"],[0,[0],1,\"Ghost Theme Marketplace\"],[0,[],0,\", or you can create your own from scratch.\"]]],[10,0],[1,\"p\",[[0,[],0,\"Ghost themes are written with a templating language called handlebars, which has a set of dynamic helpers to insert your data into template files. For example: \"],[0,[1],1,\"{{author.name}}\"],[0,[],0,\" outputs the name of the current author.\"]]],[1,\"p\",[[0,[],0,\"The best way to learn how to write your own Ghost theme is to have a look at \"],[0,[2],1,\"the source code for Casper\"],[0,[],0,\", which is heavily commented and should give you a sense of how everything fits together.\"]]],[3,\"ul\",[[[0,[1],1,\"default.hbs\"],[0,[],0,\" is the main template file, all contexts will load inside this file unless specifically told to use a different template.\"]],[[0,[1],1,\"post.hbs\"],[0,[],0,\" is the file used in the context of viewing a post.\"]],[[0,[1],1,\"index.hbs\"],[0,[],0,\" is the file used in the context of viewing the home page.\"]],[[0,[],0,\"and so on\"]]]],[1,\"p\",[[0,[],0,\"We've got \"],[0,[3],1,\"full and extensive theme documentation\"],[0,[],0,\" which outlines every template file, context and helper that you can use.\"]]],[1,\"p\",[[0,[],0,\"If you want to chat with other people making Ghost themes to get any advice or help, there's also a \"],[0,[4],1,\"themes\"],[0,[],0,\" section on our \"],[0,[5],1,\"public Ghost forum\"],[0,[],0,\".\"]]]]}", - "html": "

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

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

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

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

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

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

If you want to chat with other people making Ghost themes to get any advice or help, there's also a themes section on our public Ghost forum.

", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v1.0.0/images/marketplace.jpg\",\"caption\":\"Anyone can write a completely custom Ghost theme with some solid knowledge of HTML and CSS\"}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org/marketplace/\"]],[\"code\"],[\"a\",[\"href\",\"https://github.com/TryGhost/Casper\"]],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/\"]],[\"strong\"],[\"a\",[\"href\",\"https://forum.ghost.org/c/themes\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.\"]]],[1,\"p\",[[0,[],0,\"There are a huge range of both free and premium pre-built themes which you can get from the \"],[0,[0],1,\"Ghost Theme Marketplace\"],[0,[],0,\", or you can create your own from scratch.\"]]],[10,0],[1,\"p\",[[0,[],0,\"Ghost themes are written with a templating language called handlebars, which has a set of dynamic helpers to insert your data into template files. For example: \"],[0,[1],1,\"{{author.name}}\"],[0,[],0,\" outputs the name of the current author.\"]]],[1,\"p\",[[0,[],0,\"The best way to learn how to write your own Ghost theme is to have a look at \"],[0,[2],1,\"the source code for Casper\"],[0,[],0,\", which is heavily commented and should give you a sense of how everything fits together.\"]]],[3,\"ul\",[[[0,[1],1,\"default.hbs\"],[0,[],0,\" is the main template file, all contexts will load inside this file unless specifically told to use a different template.\"]],[[0,[1],1,\"post.hbs\"],[0,[],0,\" is the file used in the context of viewing a post.\"]],[[0,[1],1,\"index.hbs\"],[0,[],0,\" is the file used in the context of viewing the home page.\"]],[[0,[],0,\"and so on\"]]]],[1,\"p\",[[0,[],0,\"We've got \"],[0,[3],1,\"full and extensive theme documentation\"],[0,[],0,\" which outlines every template file, context and helper that you can use.\"]]],[1,\"p\",[[0,[],0,\"If you want to chat with other people making Ghost themes to get any advice or help, there's also a \"],[0,[4],1,\"themes\"],[0,[],0,\" section on our \"],[0,[5],1,\"public Ghost forum\"],[0,[],0,\".\"]]]]}", + "html": "

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

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

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

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

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

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

If you want to chat with other people making Ghost themes to get any advice or help, there's also a themes section on our public Ghost forum.

", "comment_id": "5c2ca6dfe015a6761618233f", - "plaintext": "Ghost comes with a beautiful default theme called Casper, which is designed to\nbe a clean, readable publication layout and can be adapted for most purposes.\nHowever, Ghost can also be completely themed to suit your needs. Rather than\njust giving you a few basic settings which act as a poor proxy for code, we just\nlet you write code.\n\nThere are a huge range of both free and premium pre-built themes which you can\nget from the Ghost Theme Marketplace [https://ghost.org/marketplace/], or you can\ncreate your own from scratch.\n\nAnyone can write a completely custom Ghost theme with some solid knowledge of\nHTML and CSSGhost themes are written with a templating language called\nhandlebars, which has a set of dynamic helpers to insert your data into template\nfiles. For example: {{author.name}} outputs the name of the current author.\n\nThe best way to learn how to write your own Ghost theme is to have a look at \nthe\nsource code for Casper [https://github.com/TryGhost/Casper], which is heavily\ncommented and should give you a sense of how everything fits together.\n\n * default.hbs is the main template file, all contexts will load inside this\n file unless specifically told to use a different template.\n * post.hbs is the file used in the context of viewing a post.\n * index.hbs is the file used in the context of viewing the home page.\n * and so on\n\nWe've got full and extensive theme documentation\n[https://docs.ghost.org/api/handlebars-themes/] which outlines every template file,\ncontext and helper that you can use.\n\nIf you want to chat with other people making Ghost themes to get any advice or\nhelp, there's also a themes section on our public Ghost forum\n[https://forum.ghost.org/c/themes].", + "plaintext": "Ghost comes with a beautiful default theme called Casper, which is designed to\nbe a clean, readable publication layout and can be adapted for most purposes.\nHowever, Ghost can also be completely themed to suit your needs. Rather than\njust giving you a few basic settings which act as a poor proxy for code, we just\nlet you write code.\n\nThere are a huge range of both free and premium pre-built themes which you can\nget from the Ghost Theme Marketplace [https://ghost.org/marketplace/], or you can\ncreate your own from scratch.\n\nAnyone can write a completely custom Ghost theme with some solid knowledge of\nHTML and CSSGhost themes are written with a templating language called\nhandlebars, which has a set of dynamic helpers to insert your data into template\nfiles. For example: {{author.name}} outputs the name of the current author.\n\nThe best way to learn how to write your own Ghost theme is to have a look at \nthe\nsource code for Casper [https://github.com/TryGhost/Casper], which is heavily\ncommented and should give you a sense of how everything fits together.\n\n * default.hbs is the main template file, all contexts will load inside this\n file unless specifically told to use a different template.\n * post.hbs is the file used in the context of viewing a post.\n * index.hbs is the file used in the context of viewing the home page.\n * and so on\n\nWe've got full and extensive theme documentation\n[https://ghost.org/docs/api/v2/handlebars-themes/] which outlines every template file,\ncontext and helper that you can use.\n\nIf you want to chat with other people making Ghost themes to get any advice or\nhelp, there's also a themes section on our public Ghost forum\n[https://forum.ghost.org/c/themes].", "feature_image": "https://static.ghost.org/v2.0.0/images/creating-a-custom-theme.jpg", "featured": 0, "page": 0, @@ -1896,10 +1896,10 @@ "uuid": "d8694730-91c5-4c0f-b38e-674af8c0135f", "title": "Apps & integrations", "slug": "apps-integrations", - "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"markdown\",{\"markdown\":\"\\n\"}]],\"markups\":[[\"a\",[\"href\",\"https://zapier.com\"]],[\"strong\"],[\"a\",[\"href\",\"https://docs.ghost.org/api/handlebars-themes/\"]],[\"em\"],[\"a\",[\"href\",\"https://docs.ghost.org/integrations/disqus/\"]],[\"a\",[\"href\",\"https://docs.ghost.org/integrations/discourse/\"]],[\"a\",[\"href\",\"https://help.ghost.org/article/89-mathjax\"]],[\"a\",[\"href\",\"https://prismjs.com/\"]],[\"a\",[\"href\",\"https://www.google.com/forms/\"]],[\"a\",[\"href\",\"https://www.typeform.com/\"]],[\"a\",[\"href\",\"https://docs.ghost.org/api/\"]],[\"a\",[\"href\",\"/themes/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"There are three primary ways to work with third-party services in Ghost: using Zapier, editing your theme, or using the Ghost API.\"]]],[1,\"h1\",[[0,[],0,\"Zapier\"]]],[1,\"p\",[[0,[],0,\"You can connect your Ghost site to over 1,000 external services using the official integration with \"],[0,[0],1,\"Zapier\"],[0,[],0,\".\"]]],[1,\"p\",[[0,[],0,\"Zapier sets up automations with Triggers and Actions, which allows you to create and customise a wide range of connected applications.\"]]],[1,\"blockquote\",[[0,[1],1,\"Example\"],[0,[],0,\": When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).\"]]],[1,\"p\",[[0,[1],1,\"Here are the most popular Ghost<>Zapier automation templates:\"],[0,[],0,\" \"]]],[10,0],[1,\"h1\",[[0,[],0,\"Editing your theme\"]]],[1,\"p\",[[0,[],0,\"One of the biggest advantages of using Ghost over centralised platforms is that you have total control over the front end of your site. Either customise your existing theme, or create a new theme from scratch with our \"],[0,[2],1,\"Theme SDK\"],[0,[],0,\". \"]]],[1,\"p\",[[0,[],0,\"You can integrate \"],[0,[3],1,\"any\"],[0,[],0,\" front end code into a Ghost theme without restriction, and it will work just fine. No restrictions!\"]]],[1,\"p\",[[0,[1],1,\"Here are some common examples\"],[0,[],0,\":\"]]],[3,\"ul\",[[[0,[],0,\"Include comments on a Ghost blog with \"],[0,[4],1,\"Disqus\"],[0,[],0,\" or \"],[0,[5],1,\"Discourse\"]],[[0,[],0,\"Implement \"],[0,[6],1,\"MathJAX\"],[0,[],0,\" with a little bit of JavaScript\"]],[[0,[],0,\"Add syntax highlighting to your code snippets using \"],[0,[7],1,\"Prism.js\"]],[[0,[],0,\"Integrate any dynamic forms from \"],[0,[8],1,\"Google\"],[0,[],0,\" or \"],[0,[9],1,\"Typeform\"],[0,[],0,\" to capture data\"]],[[0,[],0,\"Just about anything which uses JavaScript, APIs and Markup.\"]]]],[1,\"h1\",[[0,[],0,\"Using the Public API\"]]],[1,\"p\",[[0,[],0,\"Ghost itself is driven by a set of core APIs, and so you can access the Public Ghost JSON API from external webpages or applications in order to pull data and display it in other places.\"]]],[1,\"blockquote\",[[0,[],0,\"The Ghost API is \"],[0,[10],1,\"thoroughly documented\"],[0,[],0,\" and straightforward to work with for developers of almost any level. \"]]],[1,\"p\",[[0,[],0,\"Alright, the last post in our welcome-series! If you're curious about creating your own Ghost theme from scratch, here are \"],[0,[11],1,\"some more details\"],[0,[],0,\" on how that works.\"]]]]}", - "html": "

There are three primary ways to work with third-party services in Ghost: using Zapier, editing your theme, or using the Ghost API.

Zapier

You can connect your Ghost site to over 1,000 external services using the official integration with Zapier.

Zapier sets up automations with Triggers and Actions, which allows you to create and customise a wide range of connected applications.

Example: When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).

Here are the most popular Ghost<>Zapier automation templates:

\n

Editing your theme

One of the biggest advantages of using Ghost over centralised platforms is that you have total control over the front end of your site. Either customise your existing theme, or create a new theme from scratch with our Theme SDK.

You can integrate any front end code into a Ghost theme without restriction, and it will work just fine. No restrictions!

Here are some common examples:

Using the Public API

Ghost itself is driven by a set of core APIs, and so you can access the Public Ghost JSON API from external webpages or applications in order to pull data and display it in other places.

The Ghost API is thoroughly documented and straightforward to work with for developers of almost any level.

Alright, the last post in our welcome-series! If you're curious about creating your own Ghost theme from scratch, here are some more details on how that works.

", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"markdown\",{\"markdown\":\"\\n\"}]],\"markups\":[[\"a\",[\"href\",\"https://zapier.com\"]],[\"strong\"],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/\"]],[\"em\"],[\"a\",[\"href\",\"https://ghost.org/integrations/disqus/\"]],[\"a\",[\"href\",\"https://ghost.org/integrations/discourse/\"]],[\"a\",[\"href\",\"https://ghost.org/integrations/\"]],[\"a\",[\"href\",\"https://prismjs.com/\"]],[\"a\",[\"href\",\"https://www.google.com/forms/\"]],[\"a\",[\"href\",\"https://www.typeform.com/\"]],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/\"]],[\"a\",[\"href\",\"/themes/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"There are three primary ways to work with third-party services in Ghost: using Zapier, editing your theme, or using the Ghost API.\"]]],[1,\"h1\",[[0,[],0,\"Zapier\"]]],[1,\"p\",[[0,[],0,\"You can connect your Ghost site to over 1,000 external services using the official integration with \"],[0,[0],1,\"Zapier\"],[0,[],0,\".\"]]],[1,\"p\",[[0,[],0,\"Zapier sets up automations with Triggers and Actions, which allows you to create and customise a wide range of connected applications.\"]]],[1,\"blockquote\",[[0,[1],1,\"Example\"],[0,[],0,\": When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).\"]]],[1,\"p\",[[0,[1],1,\"Here are the most popular Ghost<>Zapier automation templates:\"],[0,[],0,\" \"]]],[10,0],[1,\"h1\",[[0,[],0,\"Editing your theme\"]]],[1,\"p\",[[0,[],0,\"One of the biggest advantages of using Ghost over centralised platforms is that you have total control over the front end of your site. Either customise your existing theme, or create a new theme from scratch with our \"],[0,[2],1,\"Theme SDK\"],[0,[],0,\". \"]]],[1,\"p\",[[0,[],0,\"You can integrate \"],[0,[3],1,\"any\"],[0,[],0,\" front end code into a Ghost theme without restriction, and it will work just fine. No restrictions!\"]]],[1,\"p\",[[0,[1],1,\"Here are some common examples\"],[0,[],0,\":\"]]],[3,\"ul\",[[[0,[],0,\"Include comments on a Ghost blog with \"],[0,[4],1,\"Disqus\"],[0,[],0,\" or \"],[0,[5],1,\"Discourse\"]],[[0,[],0,\"Implement \"],[0,[6],1,\"MathJAX\"],[0,[],0,\" with a little bit of JavaScript\"]],[[0,[],0,\"Add syntax highlighting to your code snippets using \"],[0,[7],1,\"Prism.js\"]],[[0,[],0,\"Integrate any dynamic forms from \"],[0,[8],1,\"Google\"],[0,[],0,\" or \"],[0,[9],1,\"Typeform\"],[0,[],0,\" to capture data\"]],[[0,[],0,\"Just about anything which uses JavaScript, APIs and Markup.\"]]]],[1,\"h1\",[[0,[],0,\"Using the Public API\"]]],[1,\"p\",[[0,[],0,\"Ghost itself is driven by a set of core APIs, and so you can access the Public Ghost JSON API from external webpages or applications in order to pull data and display it in other places.\"]]],[1,\"blockquote\",[[0,[],0,\"The Ghost API is \"],[0,[10],1,\"thoroughly documented\"],[0,[],0,\" and straightforward to work with for developers of almost any level. \"]]],[1,\"p\",[[0,[],0,\"Alright, the last post in our welcome-series! If you're curious about creating your own Ghost theme from scratch, here are \"],[0,[11],1,\"some more details\"],[0,[],0,\" on how that works.\"]]]]}", + "html": "

There are three primary ways to work with third-party services in Ghost: using Zapier, editing your theme, or using the Ghost API.

Zapier

You can connect your Ghost site to over 1,000 external services using the official integration with Zapier.

Zapier sets up automations with Triggers and Actions, which allows you to create and customise a wide range of connected applications.

Example: When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).

Here are the most popular Ghost<>Zapier automation templates:

\n

Editing your theme

One of the biggest advantages of using Ghost over centralised platforms is that you have total control over the front end of your site. Either customise your existing theme, or create a new theme from scratch with our Theme SDK.

You can integrate any front end code into a Ghost theme without restriction, and it will work just fine. No restrictions!

Here are some common examples:

Using the Public API

Ghost itself is driven by a set of core APIs, and so you can access the Public Ghost JSON API from external webpages or applications in order to pull data and display it in other places.

The Ghost API is thoroughly documented and straightforward to work with for developers of almost any level.

Alright, the last post in our welcome-series! If you're curious about creating your own Ghost theme from scratch, here are some more details on how that works.

", "comment_id": "5c2ca6dfe015a67616182341", - "plaintext": "There are three primary ways to work with third-party services in Ghost: using\nZapier, editing your theme, or using the Ghost API.\n\nZapier\nYou can connect your Ghost site to over 1,000 external services using the\nofficial integration with Zapier [https://zapier.com].\n\nZapier sets up automations with Triggers and Actions, which allows you to create\nand customise a wide range of connected applications.\n\nExample: When someone new subscribes to a newsletter on a Ghost site (Trigger)\nthen the contact information is automatically pushed into MailChimp (Action).\nHere are the most popular Ghost<>Zapier automation templates: \n\nEditing your theme\nOne of the biggest advantages of using Ghost over centralised platforms is that\nyou have total control over the front end of your site. Either customise your\nexisting theme, or create a new theme from scratch with our Theme SDK\n[https://docs.ghost.org/api/handlebars-themes/]. \n\nYou can integrate any front end code into a Ghost theme without restriction,\nand it will work just fine. No restrictions!\n\nHere are some common examples:\n\n * Include comments on a Ghost blog with Disqus\n [https://docs.ghost.org/integrations/disqus/] or Discourse\n [https://docs.ghost.org/integrations/discourse/]\n * Implement MathJAX [https://help.ghost.org/article/89-mathjax] with a little\n bit of JavaScript\n * Add syntax highlighting to your code snippets using Prism.js\n [https://prismjs.com/]\n * Integrate any dynamic forms from Google [https://www.google.com/forms/] or \n Typeform [https://www.typeform.com/] to capture data\n * Just about anything which uses JavaScript, APIs and Markup.\n\nUsing the Public API\nGhost itself is driven by a set of core APIs, and so you can access the Public\nGhost JSON API from external webpages or applications in order to pull data and\ndisplay it in other places.\n\nThe Ghost API is thoroughly documented [https://docs.ghost.org/api/] and\nstraightforward to work with for developers of almost any level. Alright, the\nlast post in our welcome-series! If you're curious about creating your own Ghost\ntheme from scratch, here are some more details [/themes/] on how that works.", + "plaintext": "There are three primary ways to work with third-party services in Ghost: using\nZapier, editing your theme, or using the Ghost API.\n\nZapier\nYou can connect your Ghost site to over 1,000 external services using the\nofficial integration with Zapier [https://zapier.com].\n\nZapier sets up automations with Triggers and Actions, which allows you to create\nand customise a wide range of connected applications.\n\nExample: When someone new subscribes to a newsletter on a Ghost site (Trigger)\nthen the contact information is automatically pushed into MailChimp (Action).\nHere are the most popular Ghost<>Zapier automation templates: \n\nEditing your theme\nOne of the biggest advantages of using Ghost over centralised platforms is that\nyou have total control over the front end of your site. Either customise your\nexisting theme, or create a new theme from scratch with our Theme SDK\n[https://ghost.org/docs/api/v2/handlebars-themes/]. \n\nYou can integrate any front end code into a Ghost theme without restriction,\nand it will work just fine. No restrictions!\n\nHere are some common examples:\n\n * Include comments on a Ghost blog with Disqus\n [https://ghost.org/integrations/disqus/] or Discourse\n [https://ghost.org/integrations/discourse/]\n * Implement MathJAX [https://ghost.org/integrations/] with a little\n bit of JavaScript\n * Add syntax highlighting to your code snippets using Prism.js\n [https://prismjs.com/]\n * Integrate any dynamic forms from Google [https://www.google.com/forms/] or \n Typeform [https://www.typeform.com/] to capture data\n * Just about anything which uses JavaScript, APIs and Markup.\n\nUsing the Public API\nGhost itself is driven by a set of core APIs, and so you can access the Public\nGhost JSON API from external webpages or applications in order to pull data and\ndisplay it in other places.\n\nThe Ghost API is thoroughly documented [https://ghost.org/docs/api/v2/] and\nstraightforward to work with for developers of almost any level. Alright, the\nlast post in our welcome-series! If you're curious about creating your own Ghost\ntheme from scratch, here are some more details [/themes/] on how that works.", "feature_image": "https://static.ghost.org/v2.0.0/images/app-integrations.jpg", "featured": 0, "page": 0, @@ -1931,10 +1931,10 @@ "uuid": "71b5ca8d-17ce-4cd8-b843-01f0b2d041b5", "title": "Organising your content", "slug": "organising-content", - "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}]],\"cards\":[],\"markups\":[[\"strong\"],[\"code\"],[\"em\"],[\"a\",[\"href\",\"https://docs.ghost.org/api/handlebars-themes/\"]],[\"a\",[\"href\",\"http://yaml.org/spec/1.2/spec.html\",\"rel\",\"noreferrer nofollow noopener\"]],[\"a\",[\"href\",\"https://docs.ghost.org/concepts/routing/\"]],[\"a\",[\"href\",\"/apps-integrations/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost has a flexible organisational taxonomy called\"],[0,[0],1,\" tags\"],[0,[],0,\" which can be used to configure your site structure using \"],[0,[0],1,\"dynamic routing\"],[0,[],0,\". \"]]],[1,\"h1\",[[0,[],0,\"Basic Tagging\"]]],[1,\"p\",[[0,[],0,\"You can think of tags like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.\"]]],[1,\"p\",[[0,[],0,\"When you create content for your publication you can assign tags to help differentiate between categories of content. \"]]],[1,\"p\",[[0,[],0,\"For example you may tag some content with News and other content with Podcast, which would create two distinct categories of content listed on \"],[0,[1],1,\"/tag/news/\"],[0,[],0,\" and \"],[0,[1],1,\"/tag/weather/\"],[0,[],0,\", respectively.\"]]],[1,\"p\",[[0,[],0,\"If you tag a post with both \"],[0,[1],1,\"News\"],[0,[],0,\" \"],[0,[2],1,\"and\"],[0,[],0,\" \"],[0,[1],1,\"Weather\"],[0,[],0,\" - then it appears in both sections. Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.\"]]],[1,\"h1\",[[0,[],0,\"The primary tag\"]]],[1,\"p\",[[0,[],0,\"Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default. \"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", Technology, Startup\"]]],[1,\"p\",[[0,[],0,\"So you can add the most important tag which you want to show up in your theme, but also add related tags which are less important.\"]]],[1,\"h1\",[[0,[],0,\"Private tags\"]]],[1,\"p\",[[0,[],0,\"Sometimes you may want to assign a post a specific tag, but you don't necessarily want that tag appearing in the theme or creating an archive page. In Ghost, hashtags are private and can be used for special styling.\"]]],[1,\"p\",[[0,[],0,\"For example, if you sometimes publish posts with video content - you might want your theme to adapt and get rid of the sidebar for these posts, to give more space for an embedded video to fill the screen. In this case, you could use private tags to tell your theme what to do.\"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", #video\"]]],[1,\"p\",[[0,[],0,\"Here, the theme would assign the post publicly displayed tags of News - but it would also keep a private record of the post being tagged with #video. In your theme, you could then look for private tags conditionally and give them special formatting. \"]]],[1,\"blockquote\",[[0,[2],0,\"You can find documentation for theme development techniques like this and many more over on Ghost's extensive \"],[0,[3],1,\"theme documentation\"],[0,[],1,\".\"]]],[1,\"h1\",[[0,[],0,\"Dynamic Routing\"]]],[1,\"p\",[[0,[],0,\"Dynamic routing gives you the ultimate freedom to build a custom publication to suit your needs. Routes are rules that map URL patterns to your content and templates. \"]]],[1,\"p\",[[0,[],0,\"For example, you may not want content tagged with \"],[0,[1],1,\"News\"],[0,[],0,\" to exist on: \"],[0,[1],1,\"example.com/tag/news\"],[0,[],0,\". Instead, you want it to exist on \"],[0,[1],1,\"example.com/news\"],[0,[],0,\" . \"]]],[1,\"p\",[[0,[],0,\"In this case you can use dynamic routes to create customised collections of content on your site. It's also possible to use multiple templates in your theme to render each content type differently.\"]]],[1,\"p\",[[0,[],0,\"There are lots of use cases for dynamic routing with Ghost, here are a few common examples: \"]]],[3,\"ul\",[[[0,[],0,\"Setting a custom home page with its own template\"]],[[0,[],0,\"Having separate content hubs for blog and podcast, that render differently, and have custom RSS feeds to support two types of content\"]],[[0,[],0,\"Creating a founders column as a unique view, by filtering content created by specific authors\"]],[[0,[],0,\"Including dates in permalinks for your posts\"]],[[0,[],0,\"Setting posts to have a URL relative to their primary tag like \"],[0,[1],1,\"example.com/europe/story-title/\"],[1,[],0,0]]]],[1,\"blockquote\",[[0,[2],0,\"Dynamic routing can be configured in Ghost using \"],[0,[4],1,\"YAML\"],[0,[],0,\" files. Read our dynamic routing \"],[0,[5],1,\"documentation\"],[0,[],1,\" for further details.\"]]],[1,\"p\",[[0,[],0,\"You can further customise your site using \"],[0,[6],1,\"Apps & Integrations\"],[0,[],0,\".\"]]]]}", - "html": "

Ghost has a flexible organisational taxonomy called tags which can be used to configure your site structure using dynamic routing.

Basic Tagging

You can think of tags like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.

When you create content for your publication you can assign tags to help differentiate between categories of content.

For example you may tag some content with  News and other content with Podcast, which would create two distinct categories of content listed on /tag/news/ and /tag/weather/, respectively.

If you tag a post with both News and Weather - then it appears in both sections. Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.

The primary tag

Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default.

News, Technology, Startup

So you can add the most important tag which you want to show up in your theme, but also add related tags which are less important.

Private tags

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

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

News, #video

Here, the theme would assign the post publicly displayed tags of News - but it would also keep a private record of the post being tagged with #video. In your theme, you could then look for private tags conditionally and give them special formatting.

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

Dynamic Routing

Dynamic routing gives you the ultimate freedom to build a custom publication to suit your needs. Routes are rules that map URL patterns to your content and templates.

For example, you may not want content tagged with News to exist on: example.com/tag/news. Instead, you want it to exist on example.com/news .

In this case you can use dynamic routes to create customised collections of content on your site. It's also possible to use multiple templates in your theme to render each content type differently.

There are lots of use cases for dynamic routing with Ghost, here are a few common examples:

Dynamic routing can be configured in Ghost using YAML files. Read our dynamic routing documentation for further details.

You can further customise your site using Apps & Integrations.

", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}]],\"cards\":[],\"markups\":[[\"strong\"],[\"code\"],[\"em\"],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/\"]],[\"a\",[\"href\",\"http://yaml.org/spec/1.2/spec.html\",\"rel\",\"noreferrer nofollow noopener\"]],[\"a\",[\"href\",\"https://ghost.org/docs/api/v2/handlebars-themes/routing/\"]],[\"a\",[\"href\",\"/apps-integrations/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost has a flexible organisational taxonomy called\"],[0,[0],1,\" tags\"],[0,[],0,\" which can be used to configure your site structure using \"],[0,[0],1,\"dynamic routing\"],[0,[],0,\". \"]]],[1,\"h1\",[[0,[],0,\"Basic Tagging\"]]],[1,\"p\",[[0,[],0,\"You can think of tags like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.\"]]],[1,\"p\",[[0,[],0,\"When you create content for your publication you can assign tags to help differentiate between categories of content. \"]]],[1,\"p\",[[0,[],0,\"For example you may tag some content with News and other content with Podcast, which would create two distinct categories of content listed on \"],[0,[1],1,\"/tag/news/\"],[0,[],0,\" and \"],[0,[1],1,\"/tag/weather/\"],[0,[],0,\", respectively.\"]]],[1,\"p\",[[0,[],0,\"If you tag a post with both \"],[0,[1],1,\"News\"],[0,[],0,\" \"],[0,[2],1,\"and\"],[0,[],0,\" \"],[0,[1],1,\"Weather\"],[0,[],0,\" - then it appears in both sections. Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.\"]]],[1,\"h1\",[[0,[],0,\"The primary tag\"]]],[1,\"p\",[[0,[],0,\"Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default. \"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", Technology, Startup\"]]],[1,\"p\",[[0,[],0,\"So you can add the most important tag which you want to show up in your theme, but also add related tags which are less important.\"]]],[1,\"h1\",[[0,[],0,\"Private tags\"]]],[1,\"p\",[[0,[],0,\"Sometimes you may want to assign a post a specific tag, but you don't necessarily want that tag appearing in the theme or creating an archive page. In Ghost, hashtags are private and can be used for special styling.\"]]],[1,\"p\",[[0,[],0,\"For example, if you sometimes publish posts with video content - you might want your theme to adapt and get rid of the sidebar for these posts, to give more space for an embedded video to fill the screen. In this case, you could use private tags to tell your theme what to do.\"]]],[1,\"blockquote\",[[0,[2,0],1,\"News\"],[0,[],1,\", #video\"]]],[1,\"p\",[[0,[],0,\"Here, the theme would assign the post publicly displayed tags of News - but it would also keep a private record of the post being tagged with #video. In your theme, you could then look for private tags conditionally and give them special formatting. \"]]],[1,\"blockquote\",[[0,[2],0,\"You can find documentation for theme development techniques like this and many more over on Ghost's extensive \"],[0,[3],1,\"theme documentation\"],[0,[],1,\".\"]]],[1,\"h1\",[[0,[],0,\"Dynamic Routing\"]]],[1,\"p\",[[0,[],0,\"Dynamic routing gives you the ultimate freedom to build a custom publication to suit your needs. Routes are rules that map URL patterns to your content and templates. \"]]],[1,\"p\",[[0,[],0,\"For example, you may not want content tagged with \"],[0,[1],1,\"News\"],[0,[],0,\" to exist on: \"],[0,[1],1,\"example.com/tag/news\"],[0,[],0,\". Instead, you want it to exist on \"],[0,[1],1,\"example.com/news\"],[0,[],0,\" . \"]]],[1,\"p\",[[0,[],0,\"In this case you can use dynamic routes to create customised collections of content on your site. It's also possible to use multiple templates in your theme to render each content type differently.\"]]],[1,\"p\",[[0,[],0,\"There are lots of use cases for dynamic routing with Ghost, here are a few common examples: \"]]],[3,\"ul\",[[[0,[],0,\"Setting a custom home page with its own template\"]],[[0,[],0,\"Having separate content hubs for blog and podcast, that render differently, and have custom RSS feeds to support two types of content\"]],[[0,[],0,\"Creating a founders column as a unique view, by filtering content created by specific authors\"]],[[0,[],0,\"Including dates in permalinks for your posts\"]],[[0,[],0,\"Setting posts to have a URL relative to their primary tag like \"],[0,[1],1,\"example.com/europe/story-title/\"],[1,[],0,0]]]],[1,\"blockquote\",[[0,[2],0,\"Dynamic routing can be configured in Ghost using \"],[0,[4],1,\"YAML\"],[0,[],0,\" files. Read our dynamic routing \"],[0,[5],1,\"documentation\"],[0,[],1,\" for further details.\"]]],[1,\"p\",[[0,[],0,\"You can further customise your site using \"],[0,[6],1,\"Apps & Integrations\"],[0,[],0,\".\"]]]]}", + "html": "

Ghost has a flexible organisational taxonomy called tags which can be used to configure your site structure using dynamic routing.

Basic Tagging

You can think of tags like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.

When you create content for your publication you can assign tags to help differentiate between categories of content.

For example you may tag some content with  News and other content with Podcast, which would create two distinct categories of content listed on /tag/news/ and /tag/weather/, respectively.

If you tag a post with both News and Weather - then it appears in both sections. Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.

The primary tag

Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default.

News, Technology, Startup

So you can add the most important tag which you want to show up in your theme, but also add related tags which are less important.

Private tags

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

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

News, #video

Here, the theme would assign the post publicly displayed tags of News - but it would also keep a private record of the post being tagged with #video. In your theme, you could then look for private tags conditionally and give them special formatting.

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

Dynamic Routing

Dynamic routing gives you the ultimate freedom to build a custom publication to suit your needs. Routes are rules that map URL patterns to your content and templates.

For example, you may not want content tagged with News to exist on: example.com/tag/news. Instead, you want it to exist on example.com/news .

In this case you can use dynamic routes to create customised collections of content on your site. It's also possible to use multiple templates in your theme to render each content type differently.

There are lots of use cases for dynamic routing with Ghost, here are a few common examples:

Dynamic routing can be configured in Ghost using YAML files. Read our dynamic routing documentation for further details.

You can further customise your site using Apps & Integrations.

", "comment_id": "5c2ca6dfe015a67616182343", - "plaintext": "Ghost has a flexible organisational taxonomy called tags which can be used to\nconfigure your site structure using dynamic routing. \n\nBasic Tagging\nYou can think of tags like Gmail labels. By tagging posts with one or more\nkeyword, you can organise articles into buckets of related content.\n\nWhen you create content for your publication you can assign tags to help\ndifferentiate between categories of content. \n\nFor example you may tag some content with  News and other content with Podcast,\nwhich would create two distinct categories of content listed on /tag/news/ and \n/tag/weather/, respectively.\n\nIf you tag a post with both News and Weather - then it appears in both\nsections. Tag archives are like dedicated home-pages for each category of\ncontent that you have. They have their own pages, their own RSS feeds, and can\nsupport their own cover images and meta data.\n\nThe primary tag\nInside the Ghost editor, you can drag and drop tags into a specific order. The\nfirst tag in the list is always given the most importance, and some themes will\nonly display the primary tag (the first tag in the list) by default. \n\nNews, Technology, StartupSo you can add the most important tag which you want to\nshow up in your theme, but also add related tags which are less important.\n\nPrivate tags\nSometimes you may want to assign a post a specific tag, but you don't\nnecessarily want that tag appearing in the theme or creating an archive page. In\nGhost, hashtags are private and can be used for special styling.\n\nFor example, if you sometimes publish posts with video content - you might want\nyour theme to adapt and get rid of the sidebar for these posts, to give more\nspace for an embedded video to fill the screen. In this case, you could use\nprivate tags to tell your theme what to do.\n\nNews, #videoHere, the theme would assign the post publicly displayed tags of\nNews - but it would also keep a private record of the post being tagged with\n#video. In your theme, you could then look for private tags conditionally and\ngive them special formatting. \n\nYou can find documentation for theme development techniques like this and many\nmore over on Ghost's extensive theme documentation\n[https://docs.ghost.org/api/handlebars-themes/].Dynamic Routing\nDynamic routing gives you the ultimate freedom to build a custom publication to\nsuit your needs. Routes are rules that map URL patterns to your content and\ntemplates. \n\nFor example, you may not want content tagged with News to exist on: \nexample.com/tag/news. Instead, you want it to exist on example.com/news . \n\nIn this case you can use dynamic routes to create customised collections of\ncontent on your site. It's also possible to use multiple templates in your theme\nto render each content type differently.\n\nThere are lots of use cases for dynamic routing with Ghost, here are a few\ncommon examples: \n\n * Setting a custom home page with its own template\n * Having separate content hubs for blog and podcast, that render differently,\n and have custom RSS feeds to support two types of content\n * Creating a founders column as a unique view, by filtering content created by\n specific authors\n * Including dates in permalinks for your posts\n * Setting posts to have a URL relative to their primary tag like \n example.com/europe/story-title/\n \n\nDynamic routing can be configured in Ghost using YAML\n[http://yaml.org/spec/1.2/spec.html] files. Read our dynamic routing \ndocumentation [https://docs.ghost.org/concepts/routing/] for further\ndetails.You can further customise your site using Apps & Integrations\n[/apps-integrations/].", + "plaintext": "Ghost has a flexible organisational taxonomy called tags which can be used to\nconfigure your site structure using dynamic routing. \n\nBasic Tagging\nYou can think of tags like Gmail labels. By tagging posts with one or more\nkeyword, you can organise articles into buckets of related content.\n\nWhen you create content for your publication you can assign tags to help\ndifferentiate between categories of content. \n\nFor example you may tag some content with  News and other content with Podcast,\nwhich would create two distinct categories of content listed on /tag/news/ and \n/tag/weather/, respectively.\n\nIf you tag a post with both News and Weather - then it appears in both\nsections. Tag archives are like dedicated home-pages for each category of\ncontent that you have. They have their own pages, their own RSS feeds, and can\nsupport their own cover images and meta data.\n\nThe primary tag\nInside the Ghost editor, you can drag and drop tags into a specific order. The\nfirst tag in the list is always given the most importance, and some themes will\nonly display the primary tag (the first tag in the list) by default. \n\nNews, Technology, StartupSo you can add the most important tag which you want to\nshow up in your theme, but also add related tags which are less important.\n\nPrivate tags\nSometimes you may want to assign a post a specific tag, but you don't\nnecessarily want that tag appearing in the theme or creating an archive page. In\nGhost, hashtags are private and can be used for special styling.\n\nFor example, if you sometimes publish posts with video content - you might want\nyour theme to adapt and get rid of the sidebar for these posts, to give more\nspace for an embedded video to fill the screen. In this case, you could use\nprivate tags to tell your theme what to do.\n\nNews, #videoHere, the theme would assign the post publicly displayed tags of\nNews - but it would also keep a private record of the post being tagged with\n#video. In your theme, you could then look for private tags conditionally and\ngive them special formatting. \n\nYou can find documentation for theme development techniques like this and many\nmore over on Ghost's extensive theme documentation\n[https://ghost.org/docs/api/v2/handlebars-themes/].Dynamic Routing\nDynamic routing gives you the ultimate freedom to build a custom publication to\nsuit your needs. Routes are rules that map URL patterns to your content and\ntemplates. \n\nFor example, you may not want content tagged with News to exist on: \nexample.com/tag/news. Instead, you want it to exist on example.com/news . \n\nIn this case you can use dynamic routes to create customised collections of\ncontent on your site. It's also possible to use multiple templates in your theme\nto render each content type differently.\n\nThere are lots of use cases for dynamic routing with Ghost, here are a few\ncommon examples: \n\n * Setting a custom home page with its own template\n * Having separate content hubs for blog and podcast, that render differently,\n and have custom RSS feeds to support two types of content\n * Creating a founders column as a unique view, by filtering content created by\n specific authors\n * Including dates in permalinks for your posts\n * Setting posts to have a URL relative to their primary tag like \n example.com/europe/story-title/\n \n\nDynamic routing can be configured in Ghost using YAML\n[http://yaml.org/spec/1.2/spec.html] files. Read our dynamic routing \ndocumentation [https://ghost.org/docs/api/v2/handlebars-themes/routing/] for further\ndetails.You can further customise your site using Apps & Integrations\n[/apps-integrations/].", "feature_image": "https://static.ghost.org/v2.0.0/images/organising-your-content.jpg", "featured": 0, "page": 0, @@ -2442,7 +2442,7 @@ { "id": "5c2ca6e0e015a67616182420", "key": "navigation", - "value": "[{\"label\":\"Home\", \"url\":\"/\"},{\"label\":\"Tag\", \"url\":\"/tag/getting-started/\"}, {\"label\":\"Author\", \"url\":\"/author/ghost/\"},{\"label\":\"Help\", \"url\":\"https://docs.ghost.org\"}]", + "value": "[{\"label\":\"Home\", \"url\":\"/\"},{\"label\":\"Tag\", \"url\":\"/tag/getting-started/\"}, {\"label\":\"Author\", \"url\":\"/author/ghost/\"},{\"label\":\"Help\", \"url\":\"https://ghost.org/docs/\"}]", "type": "blog", "created_at": "2019-01-02T11:56:16.000Z", "created_by": "1", diff --git a/core/test/utils/fixtures/export/valid.json b/core/test/utils/fixtures/export/valid.json index e00fccf4db..04da7fb25d 100644 --- a/core/test/utils/fixtures/export/valid.json +++ b/core/test/utils/fixtures/export/valid.json @@ -1090,10 +1090,10 @@ "uuid": "8c414ae2-dce6-4b0f-8ee6-5c403fa2ae86", "title": "Setting up your own Ghost theme", "slug": "themes", - "mobiledoc": "{\"version\":\"0.3.1\",\"markups\":[],\"atoms\":[],\"cards\":[[\"card-markdown\",{\"cardName\":\"card-markdown\",\"markdown\":\"Creating a totally custom design for your publication\\n\\nGhost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be easily adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.\\n\\nThere are a huge range of both free and premium pre-built themes which you can get from the [Ghost Theme Marketplace](https://ghost.org/marketplace/), or you can simply create your own from scratch.\\n\\n[![marketplace](https://static.ghost.org/v1.0.0/images/marketplace.jpg)](https://ghost.org/marketplace/)\\n\\n> Anyone can write a completely custom Ghost theme, with just some solid knowledge of HTML and CSS\\n\\nGhost themes are written with a templating language called handlebars, which has a bunch of dynamic helpers to insert your data into template files. Like `{{author.name}}`, for example, outputs the name of the current author.\\n\\nThe best way to learn how to write your own Ghost theme is to have a look at [the source code for Casper](https://github.com/TryGhost/Casper), which is heavily commented and should give you a sense of how everything fits together.\\n\\n- `default.hbs` is the main template file, all contexts will load inside this file unless specifically told to use a different template.\\n- `post.hbs` is the file used in the context of viewing a post.\\n- `index.hbs` is the file used in the context of viewing the home page.\\n- and so on\\n\\nWe've got [full and extensive theme documentation](https://docs.ghost.org/api/handlebars-themes/) which outlines every template file, context and helper that you can use.\\n\\nIf you want to chat with other people making Ghost themes to get any advice or help, there's also a **themes** section on our [public Ghost forum](https://forum.ghost.org/c/themes).\"}]],\"sections\":[[10,0]]}", - "html": "

Creating a totally custom design for your publication

\n

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

\n

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

\n

\"marketplace\"

\n
\n

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

\n
\n

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

\n

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

\n\n

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

\n

If you want to chat with other people making Ghost themes to get any advice or help, there's also a themes section on our public Ghost forum.

", + "mobiledoc": "{\"version\":\"0.3.1\",\"markups\":[],\"atoms\":[],\"cards\":[[\"card-markdown\",{\"cardName\":\"card-markdown\",\"markdown\":\"Creating a totally custom design for your publication\\n\\nGhost comes with a beautiful default theme called Casper, which is designed to be a clean, readable publication layout and can be easily adapted for most purposes. However, Ghost can also be completely themed to suit your needs. Rather than just giving you a few basic settings which act as a poor proxy for code, we just let you write code.\\n\\nThere are a huge range of both free and premium pre-built themes which you can get from the [Ghost Theme Marketplace](https://ghost.org/marketplace/), or you can simply create your own from scratch.\\n\\n[![marketplace](https://static.ghost.org/v1.0.0/images/marketplace.jpg)](https://ghost.org/marketplace/)\\n\\n> Anyone can write a completely custom Ghost theme, with just some solid knowledge of HTML and CSS\\n\\nGhost themes are written with a templating language called handlebars, which has a bunch of dynamic helpers to insert your data into template files. Like `{{author.name}}`, for example, outputs the name of the current author.\\n\\nThe best way to learn how to write your own Ghost theme is to have a look at [the source code for Casper](https://github.com/TryGhost/Casper), which is heavily commented and should give you a sense of how everything fits together.\\n\\n- `default.hbs` is the main template file, all contexts will load inside this file unless specifically told to use a different template.\\n- `post.hbs` is the file used in the context of viewing a post.\\n- `index.hbs` is the file used in the context of viewing the home page.\\n- and so on\\n\\nWe've got [full and extensive theme documentation](https://ghost.org/docs/api/v2/handlebars-themes/) which outlines every template file, context and helper that you can use.\\n\\nIf you want to chat with other people making Ghost themes to get any advice or help, there's also a **themes** section on our [public Ghost forum](https://forum.ghost.org/c/themes).\"}]],\"sections\":[[10,0]]}", + "html": "

Creating a totally custom design for your publication

\n

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

\n

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

\n

\"marketplace\"

\n
\n

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

\n
\n

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

\n

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

\n\n

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

\n

If you want to chat with other people making Ghost themes to get any advice or help, there's also a themes section on our public Ghost forum.

", "amp": "1", - "plaintext": "Creating a totally custom design for your publication\n\nGhost comes with a beautiful default theme called Casper, which is designed to\nbe a clean, readable publication layout and can be easily adapted for most\npurposes. However, Ghost can also be completely themed to suit your needs.\nRather than just giving you a few basic settings which act as a poor proxy for\ncode, we just let you write code.\n\nThere are a huge range of both free and premium pre-built themes which you can\nget from the Ghost Theme Marketplace [https://ghost.org/marketplace/], or you can\nsimply create your own from scratch.\n\n [https://ghost.org/marketplace/]\n\nAnyone can write a completely custom Ghost theme, with just some solid knowledge\nof HTML and CSS\n\nGhost themes are written with a templating language called handlebars, which has\na bunch of dynamic helpers to insert your data into template files. Like \n{{author.name}}, for example, outputs the name of the current author.\n\nThe best way to learn how to write your own Ghost theme is to have a look at \nthe\nsource code for Casper [https://github.com/TryGhost/Casper], which is heavily\ncommented and should give you a sense of how everything fits together.\n\n * default.hbs is the main template file, all contexts will load inside this\n file unless specifically told to use a different template.\n * post.hbs is the file used in the context of viewing a post.\n * index.hbs is the file used in the context of viewing the home page.\n * and so on\n\nWe've got full and extensive theme documentation\n[https://docs.ghost.org/api/handlebars-themes/] which outlines every template file,\ncontext and helper that you can use.\n\nIf you want to chat with other people making Ghost themes to get any advice or\nhelp, there's also a themes category on our public Ghost forum\n[https://forum.ghost.org/c/themes].", + "plaintext": "Creating a totally custom design for your publication\n\nGhost comes with a beautiful default theme called Casper, which is designed to\nbe a clean, readable publication layout and can be easily adapted for most\npurposes. However, Ghost can also be completely themed to suit your needs.\nRather than just giving you a few basic settings which act as a poor proxy for\ncode, we just let you write code.\n\nThere are a huge range of both free and premium pre-built themes which you can\nget from the Ghost Theme Marketplace [https://ghost.org/marketplace/], or you can\nsimply create your own from scratch.\n\n [https://ghost.org/marketplace/]\n\nAnyone can write a completely custom Ghost theme, with just some solid knowledge\nof HTML and CSS\n\nGhost themes are written with a templating language called handlebars, which has\na bunch of dynamic helpers to insert your data into template files. Like \n{{author.name}}, for example, outputs the name of the current author.\n\nThe best way to learn how to write your own Ghost theme is to have a look at \nthe\nsource code for Casper [https://github.com/TryGhost/Casper], which is heavily\ncommented and should give you a sense of how everything fits together.\n\n * default.hbs is the main template file, all contexts will load inside this\n file unless specifically told to use a different template.\n * post.hbs is the file used in the context of viewing a post.\n * index.hbs is the file used in the context of viewing the home page.\n * and so on\n\nWe've got full and extensive theme documentation\n[https://ghost.org/docs/api/v2/handlebars-themes/] which outlines every template file,\ncontext and helper that you can use.\n\nIf you want to chat with other people making Ghost themes to get any advice or\nhelp, there's also a themes category on our public Ghost forum\n[https://forum.ghost.org/c/themes].", "feature_image": "https://static.ghost.org/v1.0.0/images/design.jpg", "featured": 0, "page": 0, diff --git a/core/test/utils/fixtures/themes/casper/README.md b/core/test/utils/fixtures/themes/casper/README.md index 9932e956b4..f990349652 100644 --- a/core/test/utils/fixtures/themes/casper/README.md +++ b/core/test/utils/fixtures/themes/casper/README.md @@ -12,7 +12,7 @@ The default theme for [Ghost](http://github.com/tryghost/ghost/). This is the la Ghost uses a simple templating language called [Handlebars](http://handlebarsjs.com/) for its themes. -We've documented our default theme pretty heavily so that it should be fairly easy to work out what's going on just by reading the code and the comments. Once you feel comfortable with how everything works, we also have full [theme API documentation](https://docs.ghost.org/api/handlebars-themes/) which explains every possible Handlebars helper and template. +We've documented our default theme pretty heavily so that it should be fairly easy to work out what's going on just by reading the code and the comments. Once you feel comfortable with how everything works, we also have full [theme API documentation](https://ghost.org/docs/api/v2/handlebars-themes/) which explains every possible Handlebars helper and template. **The main files are:**
Name:Bill Gates
Telephone: