sass-site/source/helpers/type.ts

108 lines
3.1 KiB
TypeScript
Raw Normal View History

2023-06-19 23:55:26 +02:00
import {LoremIpsum} from 'lorem-ipsum';
import seedrandom from 'seedrandom';
import truncate from 'truncate-html';
2023-06-19 23:55:26 +02:00
import {typogrify} from 'typogr';
2023-03-08 21:59:19 +01:00
2023-06-19 23:55:26 +02:00
import {markdownEngine} from './engines';
2023-03-08 21:59:19 +01:00
const lorem = new LoremIpsum({
random: seedrandom("Feelin' Sassy!"),
});
2023-03-08 21:59:19 +01:00
/**
* Returns block of generated `lorem ipsum` text.
*
* @see https://github.com/knicklabs/lorem-ipsum.js
*/
export const getLorem = (type: string, number = 1) => {
switch (type) {
case 'sentence':
case 'sentences':
return lorem.generateSentences(number);
case 'paragraph':
case 'paragraphs':
return lorem.generateParagraphs(number);
case 'word':
case 'words':
return lorem.generateWords(number);
}
return '';
};
/**
2023-06-22 20:02:01 +02:00
* Strips leading whitespace from each line of a string,
* based on the whitespace of the first line.
*
* @see https://github.com/sindresorhus/strip-indent
2023-06-22 20:02:01 +02:00
* @see https://github.com/jamiebuilds/min-indent
*/
export const stripIndent = (contents: string) => {
// Find leading whitespace of first line (ignoring initial newlines)
2023-06-22 21:28:43 +02:00
const match = /^[\n\r]*([ \t]*)(?=\S)/.exec(contents);
2023-06-22 20:02:01 +02:00
if (match?.[1]?.length) {
// Strip leading whitespace based on first line
2023-06-22 21:28:43 +02:00
return contents.replaceAll(
new RegExp(`^[ \\t]{${match[1].length}}`, 'gm'),
''
);
}
2023-06-22 21:28:43 +02:00
return contents;
};
/**
* Truncates an HTML string without breaking tags.
*
* @see https://github.com/oe/truncate-html
*/
export const truncateHTML = (html: string, words = 170) =>
2023-06-19 23:55:26 +02:00
truncate(html, words, {byWords: true, keepWhitespaces: true});
2023-03-08 21:59:19 +01:00
/**
* Renders block of Markdown into HTML.
*/
export const markdown = (content: string) =>
markdownEngine.render(stripIndent(content));
2023-03-08 21:59:19 +01:00
/**
* Renders single line of Markdown into HTML, without wrapping `<p>`.
*/
export const markdownInline = (content: string) =>
markdownEngine.renderInline(content);
/**
* Applies various transformations to plain text in order to yield
* typographically-improved HTML.
*
* @see https://github.com/ekalinin/typogr.js
*/
export const typogr = (content: string) => typogrify(content);
2023-03-09 23:32:49 +01:00
/**
* Appends full page URL to internal links (for embedding in another page).
*/
export const replaceInternalLinks = (content: string, url: string) =>
content.replace(/href="#/g, `href="${url}#`);
2023-05-24 18:54:23 +02:00
/**
* Checks if a given string starts with a comparison string.
*/
export const startsWith = (str: string, check: string) => str.startsWith(check);
2023-06-20 18:13:03 +02:00
// eslint-disable-next-line @typescript-eslint/no-explicit-any
2023-03-09 23:32:49 +01:00
export default function typePlugin(eleventyConfig: any) {
// filters...
eleventyConfig.addLiquidFilter('truncateHTML', truncateHTML);
2023-03-09 23:32:49 +01:00
eleventyConfig.addLiquidFilter('markdown', markdown);
eleventyConfig.addLiquidFilter('markdownInline', markdownInline);
eleventyConfig.addLiquidFilter('typogr', typogr);
eleventyConfig.addLiquidFilter('replaceInternalLinks', replaceInternalLinks);
2023-05-24 18:54:23 +02:00
eleventyConfig.addLiquidFilter('startsWith', startsWith);
2023-03-09 23:32:49 +01:00
// shortcodes...
eleventyConfig.addLiquidShortcode('lorem', getLorem);
// paired shortcodes...
eleventyConfig.addPairedLiquidShortcode('markdown', markdown);
eleventyConfig.addPairedLiquidShortcode('typogr', typogr);
}