diff --git a/package-lock.json b/package-lock.json
index 4f2262a..33c430a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,7 @@
"rehype-raw": "^6.1.1",
"rehype-sanitize": "^5.0.1",
"rehype-stringify": "^9.0.3",
+ "remark-breaks": "^3.0.3",
"remark-gfm": "^3.0.1",
"remark-parse": "^10.0.1",
"remark-rehype": "^10.1.0",
@@ -2778,6 +2779,19 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/mdast-util-newline-to-break": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-1.0.0.tgz",
+ "integrity": "sha512-491LcYv3gbGhhCrLoeALncQmega2xPh+m3gbsIhVsOX4sw85+ShLFPvPyibxc1Swx/6GtzxgVodq+cGa/47ULg==",
+ "dependencies": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-find-and-replace": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/mdast-util-phrasing": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz",
@@ -4121,6 +4135,20 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/remark-breaks": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-3.0.3.tgz",
+ "integrity": "sha512-C7VkvcUp1TPUc2eAYzsPdaUh8Xj4FSbQnYA5A9f80diApLZscTDeG7efiWP65W8hV2sEy3JuGVU0i6qr5D8Hug==",
+ "dependencies": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-newline-to-break": "^1.0.0",
+ "unified": "^10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/remark-gfm": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz",
@@ -7084,6 +7112,15 @@
"mdast-util-to-markdown": "^1.3.0"
}
},
+ "mdast-util-newline-to-break": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-1.0.0.tgz",
+ "integrity": "sha512-491LcYv3gbGhhCrLoeALncQmega2xPh+m3gbsIhVsOX4sw85+ShLFPvPyibxc1Swx/6GtzxgVodq+cGa/47ULg==",
+ "requires": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-find-and-replace": "^2.0.0"
+ }
+ },
"mdast-util-phrasing": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz",
@@ -7944,6 +7981,16 @@
"unified": "^10.0.0"
}
},
+ "remark-breaks": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-3.0.3.tgz",
+ "integrity": "sha512-C7VkvcUp1TPUc2eAYzsPdaUh8Xj4FSbQnYA5A9f80diApLZscTDeG7efiWP65W8hV2sEy3JuGVU0i6qr5D8Hug==",
+ "requires": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-newline-to-break": "^1.0.0",
+ "unified": "^10.0.0"
+ }
+ },
"remark-gfm": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz",
diff --git a/package.json b/package.json
index 46872a2..0d65b42 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,7 @@
"rehype-raw": "^6.1.1",
"rehype-sanitize": "^5.0.1",
"rehype-stringify": "^9.0.3",
+ "remark-breaks": "^3.0.3",
"remark-gfm": "^3.0.1",
"remark-parse": "^10.0.1",
"remark-rehype": "^10.1.0",
diff --git a/src/lib/Comment.svelte b/src/lib/Comment.svelte
index ae50760..e2efe5d 100644
--- a/src/lib/Comment.svelte
+++ b/src/lib/Comment.svelte
@@ -140,7 +140,7 @@
diff --git a/src/lib/markdown/rendering.js b/src/lib/markdown/rendering.js
index 7b10bfb..b6acedc 100644
--- a/src/lib/markdown/rendering.js
+++ b/src/lib/markdown/rendering.js
@@ -9,6 +9,7 @@ import remarkRehype from 'remark-rehype';
import rehypeHighlight from 'rehype-highlight'
import rehypeStringify from 'rehype-stringify';
import rehypeSanitize, { defaultSchema } from 'rehype-sanitize';
+import remarkBreaks from 'remark-breaks';
import glsl from 'highlight.js/lib/languages/glsl'
import deepmerge from 'deepmerge';
import { compile } from 'html-to-text';
@@ -17,6 +18,11 @@ const convert = compile({
wordwrap: false,
});
+// todo: convert to cohost-like age ruleset system?
+// previous age schemas didn't really affect anything since they were exclusively
+// sanitization related, but fourth age adds linebreaks, so now i have to
+// actually bother with it
+
const THIRD_AGE_SCHEMA = deepmerge(defaultSchema, {
attributes: {
"*": ["style"],
@@ -24,15 +30,24 @@ const THIRD_AGE_SCHEMA = deepmerge(defaultSchema, {
tagNames: ["video", "audio", "aside"], // consistency with current rules,
});
+const LINEBREAK_CUTOFF = new Date("2023-05-10T15:00:00-04:00");
+
const externalRel = ['nofollow', 'noopener', 'noreferrer'];
/**
* @param {string} src
* @param {boolean} [xhtml]
+ * @param {Date} [date]
*/
-export function renderPostMarkdown(src, xhtml) {
- return unified()
- .use(remarkParse)
+export function renderPostMarkdown(src, xhtml, date) {
+ let stack = unified()
+ .use(remarkParse);
+
+ if ((date || new Date()) > LINEBREAK_CUTOFF) {
+ stack = stack.use(remarkBreaks);
+ }
+
+ return stack
.use(remarkGfm, {
singleTilde: false,
})
@@ -71,8 +86,9 @@ export function renderPostMarkdown(src, xhtml) {
/**
* @param {StorageBlock[]} blocks
+ * @param {Date} [date]
*/
-export function renderPostSummaryMarkdown(blocks) {
+export function renderPostSummaryMarkdown(blocks, date) {
const origBlocks = blocks.filter(block => block.type === 'markdown');
const readmoreIndex = origBlocks.findIndex(
(block) => block.markdown.content === "---"
@@ -80,16 +96,23 @@ export function renderPostSummaryMarkdown(blocks) {
if (readmoreIndex > -1) {
origBlocks.splice(readmoreIndex);
}
- return renderPostMarkdown(origBlocks.map(b => b.markdown.content).join('\n\n'));
+ return renderPostMarkdown(origBlocks.map(b => b.markdown.content).join('\n\n'), false, date);
}
/**
* @param {string} src
+ * @param {Date} [date]
* @returns string
*/
-export function renderCommentMarkdown(src) {
- return unified()
- .use(remarkParse)
+export function renderCommentMarkdown(src, date) {
+ let stack = unified()
+ .use(remarkParse);
+
+ if ((date || new Date()) > LINEBREAK_CUTOFF) {
+ stack = stack.use(remarkBreaks);
+ }
+
+ return stack
.use(remarkGfm, {
singleTilde: false,
})
@@ -112,25 +135,28 @@ export function renderCommentMarkdown(src) {
/**
* @param {string} src
+ * @param {Date} [date]
* @returns string
*/
-export function renderPlaintext(src) {
- const renderedBody = renderCommentMarkdown(src);
+export function renderPlaintext(src, date) {
+ const renderedBody = renderCommentMarkdown(src, date);
return convert(renderedBody);
}
/**
* @param {string} src
+ * @param {Date} [date]
* @returns string
*/
-export function renderPostPlaintext(src) {
- const renderedBody = renderPostMarkdown(src);
+export function renderPostPlaintext(src, date) {
+ const renderedBody = renderPostMarkdown(src, false, date);
return convert(renderedBody);
}
/**
* @param {StorageBlock[]} blocks
+ * @param {Date} [date]
* @returns string
*/
-export function renderPostSummaryPlaintext(blocks) {
- const renderedBody = renderPostSummaryMarkdown(blocks);
+export function renderPostSummaryPlaintext(blocks, date) {
+ const renderedBody = renderPostSummaryMarkdown(blocks, date);
return convert(renderedBody);
}
\ No newline at end of file
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 8c53052..a71ea97 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -206,7 +206,7 @@
diff --git a/src/routes/[post=slug]/+page.svelte b/src/routes/[post=slug]/+page.svelte
index d040220..c792150 100644
--- a/src/routes/[post=slug]/+page.svelte
+++ b/src/routes/[post=slug]/+page.svelte
@@ -33,7 +33,7 @@
// metadata
const canonicalURL = `${config.siteURL}/${getPostSlug(post)}/`;
- const summary = renderPostSummaryPlaintext(post.blocks);
+ const summary = renderPostSummaryPlaintext(post.blocks, post.publishedAt ? new Date(post.publishedAt) : undefined);
const image = getPostImages(post)[0];
@@ -128,7 +128,7 @@
{/if}
- {@html renderPostMarkdown(post.plainTextBody)}
+ {@html renderPostMarkdown(post.plainTextBody, false, post.publishedAt ? new Date(post.publishedAt) : undefined)}
diff --git a/src/routes/rss.xml/+server.js b/src/routes/rss.xml/+server.js
index ae8287c..5b1cca0 100644
--- a/src/routes/rss.xml/+server.js
+++ b/src/routes/rss.xml/+server.js
@@ -31,7 +31,7 @@ const xml = (/** @type {Post[]} */ posts) => minifyXML(`
.map(post => `
-
${post.headline}
- ${renderPostSummaryPlaintext(post.blocks)}
+ ${renderPostSummaryPlaintext(post.blocks, post.publishedAt ? new Date(post.publishedAt) : undefined)}
${config.siteURL}/${getPostSlug(post)}/
${post.postingProject.displayName}
${getPostPublishDate(post)?.toUTCString()}
@@ -39,7 +39,7 @@ const xml = (/** @type {Post[]} */ posts) => minifyXML(`
``
: ''}
`)}