0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-03-11 02:12:21 -05:00

Removed 80 char wordwrap in excerpts

refs: https://github.com/TryGhost/Team/issues/1609

- remove the 80 char wordwrap
- this makes the function the same as used in the post serializer
- updated references everywhere to use the same function
This commit is contained in:
Hannah Wolfe 2022-05-13 08:56:13 +01:00
parent 6b3a657f88
commit f436d23f87
5 changed files with 104 additions and 218 deletions

View file

@ -1,7 +1,7 @@
const logging = require('@tryghost/logging'); const logging = require('@tryghost/logging');
const {createIrreversibleMigration} = require('../../utils'); const {createIrreversibleMigration} = require('../../utils');
const mobiledocLib = require('../../../../lib/mobiledoc'); const mobiledocLib = require('../../../../lib/mobiledoc');
const htmlToText = require('html-to-text'); const htmlToPlaintext = require('../../../../../shared/html-to-plaintext');
module.exports = createIrreversibleMigration(async (knex) => { module.exports = createIrreversibleMigration(async (knex) => {
logging.info('Starting re-generation of posts html.'); logging.info('Starting re-generation of posts html.');
@ -45,17 +45,8 @@ module.exports = createIrreversibleMigration(async (knex) => {
html: html html: html
}; };
// NOTE: block comes straight from the Post model
// https://github.com/TryGhost/Ghost/blob/4.0.0-alpha.2/core/server/models/post.js#L484
if (html !== post.html || !post.plaintext) { if (html !== post.html || !post.plaintext) {
const plaintext = htmlToText.fromString(html, { const plaintext = htmlToPlaintext(html);
wordwrap: 80,
ignoreImage: true,
hideLinkHrefIfSameAsText: true,
preserveNewlines: true,
returnDomByDefault: true,
uppercaseHeadings: false
});
if (plaintext !== post.plaintext) { if (plaintext !== post.plaintext) {
updatedAttrs.plaintext = plaintext; updatedAttrs.plaintext = plaintext;

View file

@ -7,7 +7,7 @@ const api = require('../../api').endpoints;
const apiShared = require('../../api').shared; const apiShared = require('../../api').shared;
const {URL} = require('url'); const {URL} = require('url');
const mobiledocLib = require('../../lib/mobiledoc'); const mobiledocLib = require('../../lib/mobiledoc');
const htmlToText = require('html-to-text'); const htmlToPlaintext = require('../../../shared/html-to-plaintext');
const {isUnsplashImage, isLocalContentImage} = require('@tryghost/kg-default-cards/lib/utils'); const {isUnsplashImage, isLocalContentImage} = require('@tryghost/kg-default-cards/lib/utils');
const {textColorForBackgroundColor, darkenToContrastThreshold} = require('@tryghost/color-utils'); const {textColorForBackgroundColor, darkenToContrastThreshold} = require('@tryghost/color-utils');
const logging = require('@tryghost/logging'); const logging = require('@tryghost/logging');
@ -49,20 +49,6 @@ const getSite = () => {
}); });
}; };
const htmlToPlaintext = (html) => {
// same options as used in Post model for generating plaintext but without `wordwrap: 80`
// to avoid replacement strings being split across lines and for mail clients to handle
// word wrapping based on user preferences
return htmlToText.fromString(html, {
wordwrap: false,
ignoreImage: true,
hideLinkHrefIfSameAsText: true,
preserveNewlines: true,
returnDomByDefault: true,
uppercaseHeadings: false
});
};
/** /**
* createUnsubscribeUrl * createUnsubscribeUrl
* *

View file

@ -2,7 +2,7 @@ module.exports = function htmlToPlaintext(html) {
const htmlToText = require('html-to-text'); const htmlToText = require('html-to-text');
return htmlToText.fromString(html, { return htmlToText.fromString(html, {
wordwrap: 80, wordwrap: false,
ignoreImage: true, ignoreImage: true,
hideLinkHrefIfSameAsText: true, hideLinkHrefIfSameAsText: true,
preserveNewlines: true, preserveNewlines: true,

View file

@ -77,16 +77,11 @@ Object {
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/, "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/,
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"excerpt": "Unlike posts, pages in Ghost don't appear in the main feed. They're separate, "excerpt": "Unlike posts, pages in Ghost don't appear in the main feed. They're separate, individual pages which only show up when you link to them. Great for content which is important, but separate from your usual posts.
individual pages which only show up when you link to them. Great for content
which is important, but separate from your usual posts.
An about page is a great example of one you might want to set up early on so An about page is a great example of one you might want to set up early on so people can find out more about you, and what you do. Why should people subscribe to your site and become a member? Details help!
people can find out more about you, and what you do. Why should people subscribe
to your site and become a member? Details help!
> Tip: If you're reading any post or page on your site and you notice something > Tip: If you're reading any post or page on your site and you notice something y",
y",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -121,17 +116,14 @@ y",
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/, "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/,
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"excerpt": "If you want to set up a contact page for people to be able to reach out to you, "excerpt": "If you want to set up a contact page for people to be able to reach out to you, the simplest way is to set up a simple page like this and list the different ways people can reach out to you.
the simplest way is to set up a simple page like this and list the different
ways people can reach out to you.
For example, here's how to reach us! For example, here's how to reach us!
* @Ghost [https://twitter.com/ghost] on Twitter * @Ghost [https://twitter.com/ghost] on Twitter
* @Ghost [https://www.facebook.com/ghost] on Facebook * @Ghost [https://www.facebook.com/ghost] on Facebook
* @Ghost [https://instagram.com/ghost] on Instagram * @Ghost [https://instagram.com/ghost] on Instagram
If you prefer to use a contact form, almost all of the great embedded form If you prefer to use a contact form, almost all of the great embedded form services work great with Ghost and are",
services work great with Ghost and are",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -166,13 +158,9 @@ services work great with Ghost and are",
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/, "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/,
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"excerpt": "Oh hey, you clicked every link of our starter content and even clicked this "excerpt": "Oh hey, you clicked every link of our starter content and even clicked this small link in the footer! If you like Ghost and you're enjoying the product so far, we'd hugely appreciate your support in any way you care to show it.
small link in the footer! If you like Ghost and you're enjoying the product so
far, we'd hugely appreciate your support in any way you care to show it.
Ghost is a non-profit organization, and we give away all our intellectual Ghost is a non-profit organization, and we give away all our intellectual property as open source software. If you believe in what we do, there are a number of ways you can give us a hand, and we hugely appreciate all of them:
property as open source software. If you believe in what we do, there are a
number of ways you can give us a hand, and we hugely appreciate all of them:
* Contribute code via GitHub [https://gith", * Contribute code via GitHub [https://gith",
"feature_image": null, "feature_image": null,
@ -209,12 +197,9 @@ number of ways you can give us a hand, and we hugely appreciate all of them:
"created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/, "created_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/,
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"excerpt": "Wondering how Ghost fares when it comes to privacy and GDPR rules? Good news: "excerpt": "Wondering how Ghost fares when it comes to privacy and GDPR rules? Good news: Ghost does not use any tracking cookies of any kind.
Ghost does not use any tracking cookies of any kind.
You can integrate any products, services, ads or integrations with Ghost You can integrate any products, services, ads or integrations with Ghost yourself if you want to, but it's always a good idea to disclose how subscriber data will be used by putting together a privacy page.",
yourself if you want to, but it's always a good idea to disclose how subscriber
data will be used by putting together a privacy page.",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -284,7 +269,7 @@ exports[`Pages Content API Can request pages 2: [headers] 1`] = `
Object { Object {
"access-control-allow-origin": "*", "access-control-allow-origin": "*",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"content-length": "9207", "content-length": "9192",
"content-type": "application/json; charset=utf-8", "content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Accept-Encoding", "vary": "Accept-Encoding",

View file

@ -266,14 +266,11 @@ Object {
* Praesent * Praesent
* Pellentesque * Pellentesque
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijkl
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac Definition listConsectetur ad",
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijklDefinition listConsectetur ad",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -620,13 +617,9 @@ mi vitae est. Mauris placerat eleifend leo.
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable "excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to ", Ghost takes 0% payment fees, so everything you make is yours to ",
"feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png", "feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png",
@ -641,29 +634,19 @@ Ghost takes 0% payment fees, so everything you make is yours to ",
"og_description": null, "og_description": null,
"og_image": null, "og_image": null,
"og_title": null, "og_title": null,
"plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable "plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to keep! Ghost takes 0% payment fees, so everything you make is yours to keep!
Using subscriptions, you can build an independent media business like Using subscriptions, you can build an independent media business like Stratechery [https://stratechery.com], The Information [https://www.theinformation.com], or The Browser [https://thebrowser.com].
Stratechery [https://stratechery.com], The Information
[https://www.theinformation.com], or The Browser [https://thebrowser.com].
The creator economy is just getting started, and Ghost allows you to build The creator economy is just getting started, and Ghost allows you to build something based on technology that you own and control.
something based on technology that you own and control.
[https://thebrowser.com]The Browser has over 10,000 paying subscribersMost https://thebrowser.comThe Browser has over 10,000 paying subscribers
successful subscription businesses publish a mix of free and paid posts to
attract a new audience, and upsell the most loyal members to a premium offering. Most successful subscription businesses publish a mix of free and paid posts to attract a new audience, and upsell the most loyal members to a premium offering. You can also mix different access levels within the same post, showing a free preview to logged out members and then, right when you're ready for a cliffhanger, that's a good time to...",
You can also mix different access levels within the same post, showing a free
preview to logged out members and then, right when you're ready for a
cliffhanger, that's a good time to...",
"primary_author": Object { "primary_author": Object {
"bio": "You can delete this user to remove all the welcome posts", "bio": "You can delete this user to remove all the welcome posts",
"cover_image": null, "cover_image": null,
@ -854,11 +837,15 @@ cliffhanger, that's a good time to...",
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "testing "excerpt": "testing
mctesters mctesters
* test * test
* line * line
* items", * items
",
"feature_image": "http://placekitten.com/500/200", "feature_image": "http://placekitten.com/500/200",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -933,13 +920,8 @@ mctesters
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "HTML Ipsum Presents "excerpt": "HTML Ipsum Presents
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum o",
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien
ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae,
ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
ipsum rutrum or",
"feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg", "feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -1054,7 +1036,7 @@ exports[`Posts Content API Can filter posts by authors 2: [headers] 1`] = `
Object { Object {
"access-control-allow-origin": "*", "access-control-allow-origin": "*",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"content-length": "54909", "content-length": "54894",
"content-type": "application/json; charset=utf-8", "content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Accept-Encoding", "vary": "Accept-Encoding",
@ -1092,14 +1074,11 @@ Object {
* Praesent * Praesent
* Pellentesque * Pellentesque
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijkl
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac Definition listConsectetur ad",
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijklDefinition listConsectetur ad",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -1137,11 +1116,15 @@ mi vitae est. Mauris placerat eleifend leo.
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "testing "excerpt": "testing
mctesters mctesters
* test * test
* line * line
* items", * items
",
"feature_image": "http://placekitten.com/500/200", "feature_image": "http://placekitten.com/500/200",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -1228,13 +1211,8 @@ mctesters
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "HTML Ipsum Presents "excerpt": "HTML Ipsum Presents
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum o",
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien
ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae,
ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
ipsum rutrum or",
"feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg", "feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -1768,13 +1746,9 @@ Object {
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable "excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to ", Ghost takes 0% payment fees, so everything you make is yours to ",
"feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png", "feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png",
@ -1789,29 +1763,19 @@ Ghost takes 0% payment fees, so everything you make is yours to ",
"og_description": null, "og_description": null,
"og_image": null, "og_image": null,
"og_title": null, "og_title": null,
"plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable "plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to keep! Ghost takes 0% payment fees, so everything you make is yours to keep!
Using subscriptions, you can build an independent media business like Using subscriptions, you can build an independent media business like Stratechery [https://stratechery.com], The Information [https://www.theinformation.com], or The Browser [https://thebrowser.com].
Stratechery [https://stratechery.com], The Information
[https://www.theinformation.com], or The Browser [https://thebrowser.com].
The creator economy is just getting started, and Ghost allows you to build The creator economy is just getting started, and Ghost allows you to build something based on technology that you own and control.
something based on technology that you own and control.
[https://thebrowser.com]The Browser has over 10,000 paying subscribersMost https://thebrowser.comThe Browser has over 10,000 paying subscribers
successful subscription businesses publish a mix of free and paid posts to
attract a new audience, and upsell the most loyal members to a premium offering. Most successful subscription businesses publish a mix of free and paid posts to attract a new audience, and upsell the most loyal members to a premium offering. You can also mix different access levels within the same post, showing a free preview to logged out members and then, right when you're ready for a cliffhanger, that's a good time to...",
You can also mix different access levels within the same post, showing a free
preview to logged out members and then, right when you're ready for a
cliffhanger, that's a good time to...",
"primary_author": Object { "primary_author": Object {
"bio": "You can delete this user to remove all the welcome posts", "bio": "You can delete this user to remove all the welcome posts",
"cover_image": null, "cover_image": null,
@ -2026,14 +1990,11 @@ cliffhanger, that's a good time to...",
* Praesent * Praesent
* Pellentesque * Pellentesque
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijkl
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac Definition listConsectetur ad",
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijklDefinition listConsectetur ad",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -2087,11 +2048,15 @@ mi vitae est. Mauris placerat eleifend leo.
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "testing "excerpt": "testing
mctesters mctesters
* test * test
* line * line
* items", * items
",
"feature_image": "http://placekitten.com/500/200", "feature_image": "http://placekitten.com/500/200",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -2172,13 +2137,8 @@ mctesters
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "HTML Ipsum Presents "excerpt": "HTML Ipsum Presents
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum o",
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien
ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae,
ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
ipsum rutrum or",
"feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg", "feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -2321,7 +2281,7 @@ exports[`Posts Content API Can include relations 2: [headers] 1`] = `
Object { Object {
"access-control-allow-origin": "*", "access-control-allow-origin": "*",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"content-length": "65238", "content-length": "65223",
"content-type": "application/json; charset=utf-8", "content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Accept-Encoding", "vary": "Accept-Encoding",
@ -2620,13 +2580,9 @@ Object {
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable "excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to ", Ghost takes 0% payment fees, so everything you make is yours to ",
"feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png", "feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png",
@ -2641,29 +2597,19 @@ Ghost takes 0% payment fees, so everything you make is yours to ",
"og_description": null, "og_description": null,
"og_image": null, "og_image": null,
"og_title": null, "og_title": null,
"plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable "plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to keep! Ghost takes 0% payment fees, so everything you make is yours to keep!
Using subscriptions, you can build an independent media business like Using subscriptions, you can build an independent media business like Stratechery [https://stratechery.com], The Information [https://www.theinformation.com], or The Browser [https://thebrowser.com].
Stratechery [https://stratechery.com], The Information
[https://www.theinformation.com], or The Browser [https://thebrowser.com].
The creator economy is just getting started, and Ghost allows you to build The creator economy is just getting started, and Ghost allows you to build something based on technology that you own and control.
something based on technology that you own and control.
[https://thebrowser.com]The Browser has over 10,000 paying subscribersMost https://thebrowser.comThe Browser has over 10,000 paying subscribers
successful subscription businesses publish a mix of free and paid posts to
attract a new audience, and upsell the most loyal members to a premium offering. Most successful subscription businesses publish a mix of free and paid posts to attract a new audience, and upsell the most loyal members to a premium offering. You can also mix different access levels within the same post, showing a free preview to logged out members and then, right when you're ready for a cliffhanger, that's a good time to...",
You can also mix different access levels within the same post, showing a free
preview to logged out members and then, right when you're ready for a
cliffhanger, that's a good time to...",
"published_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/, "published_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/,
"reading_time": 1, "reading_time": 1,
"slug": "sell", "slug": "sell",
@ -2764,14 +2710,11 @@ cliffhanger, that's a good time to...",
* Praesent * Praesent
* Pellentesque * Pellentesque
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijkl
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac Definition listConsectetur ad",
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijklDefinition listConsectetur ad",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -2807,11 +2750,15 @@ mi vitae est. Mauris placerat eleifend leo.
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "testing "excerpt": "testing
mctesters mctesters
* test * test
* line * line
* items", * items
",
"feature_image": "http://placekitten.com/500/200", "feature_image": "http://placekitten.com/500/200",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -2854,13 +2801,8 @@ mctesters
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "HTML Ipsum Presents "excerpt": "HTML Ipsum Presents
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum o",
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien
ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae,
ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
ipsum rutrum or",
"feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg", "feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -2928,7 +2870,7 @@ exports[`Posts Content API Can request posts 2: [headers] 1`] = `
Object { Object {
"access-control-allow-origin": "*", "access-control-allow-origin": "*",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"content-length": "46357", "content-length": "46342",
"content-type": "application/json; charset=utf-8", "content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Accept-Encoding", "vary": "Accept-Encoding",
@ -3111,13 +3053,9 @@ Object {
"custom_excerpt": null, "custom_excerpt": null,
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable "excerpt": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to ", Ghost takes 0% payment fees, so everything you make is yours to ",
"feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png", "feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png",
@ -3132,29 +3070,19 @@ Ghost takes 0% payment fees, so everything you make is yours to ",
"og_description": null, "og_description": null,
"og_image": null, "og_image": null,
"og_title": null, "og_title": null,
"plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable "plaintext": "For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.
recurring revenue stream from their creative work, Ghost has built-in payments
allowing you to create a subscription commerce business.
Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to Connect your Stripe [https://stripe.com] account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.
quickly and easily create monthly and yearly premium plans for members to
subscribe to, as well as complimentary plans for friends and family.
Ghost takes 0% payment fees, so everything you make is yours to keep! Ghost takes 0% payment fees, so everything you make is yours to keep!
Using subscriptions, you can build an independent media business like Using subscriptions, you can build an independent media business like Stratechery [https://stratechery.com], The Information [https://www.theinformation.com], or The Browser [https://thebrowser.com].
Stratechery [https://stratechery.com], The Information
[https://www.theinformation.com], or The Browser [https://thebrowser.com].
The creator economy is just getting started, and Ghost allows you to build The creator economy is just getting started, and Ghost allows you to build something based on technology that you own and control.
something based on technology that you own and control.
[https://thebrowser.com]The Browser has over 10,000 paying subscribersMost https://thebrowser.comThe Browser has over 10,000 paying subscribers
successful subscription businesses publish a mix of free and paid posts to
attract a new audience, and upsell the most loyal members to a premium offering. Most successful subscription businesses publish a mix of free and paid posts to attract a new audience, and upsell the most loyal members to a premium offering. You can also mix different access levels within the same post, showing a free preview to logged out members and then, right when you're ready for a cliffhanger, that's a good time to...",
You can also mix different access levels within the same post, showing a free
preview to logged out members and then, right when you're ready for a
cliffhanger, that's a good time to...",
"published_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/, "published_at": StringMatching /\\\\d\\{4\\}-\\\\d\\{2\\}-\\\\d\\{2\\}T\\\\d\\{2\\}:\\\\d\\{2\\}:\\\\d\\{2\\}\\\\\\.000\\\\\\+\\\\d\\{2\\}:\\\\d\\{2\\}/,
"reading_time": 1, "reading_time": 1,
"slug": "sell", "slug": "sell",
@ -3255,14 +3183,11 @@ cliffhanger, that's a good time to...",
* Praesent * Praesent
* Pellentesque * Pellentesque
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijkl
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac Definition listConsectetur ad",
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo.
1234abcdefghijklDefinition listConsectetur ad",
"feature_image": null, "feature_image": null,
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -3298,11 +3223,15 @@ mi vitae est. Mauris placerat eleifend leo.
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "testing "excerpt": "testing
mctesters mctesters
* test * test
* line * line
* items", * items
",
"feature_image": "http://placekitten.com/500/200", "feature_image": "http://placekitten.com/500/200",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -3345,13 +3274,8 @@ mctesters
"custom_template": null, "custom_template": null,
"email_subject": null, "email_subject": null,
"excerpt": "HTML Ipsum Presents "excerpt": "HTML Ipsum Presents
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac
turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum o",
sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies
mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien
ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae,
ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
ipsum rutrum or",
"feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg", "feature_image": "http://127.0.0.1:2369/content/images/2018/hey.jpg",
"feature_image_alt": null, "feature_image_alt": null,
"feature_image_caption": null, "feature_image_caption": null,
@ -3419,7 +3343,7 @@ exports[`Posts Content API Can request posts from different origin 2: [headers]
Object { Object {
"access-control-allow-origin": "*", "access-control-allow-origin": "*",
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0", "cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
"content-length": "46357", "content-length": "46342",
"content-type": "application/json; charset=utf-8", "content-type": "application/json; charset=utf-8",
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/, "etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,
"vary": "Accept-Encoding", "vary": "Accept-Encoding",