sass-site/source/helpers/components/index.ts

75 lines
2.6 KiB
TypeScript
Raw Normal View History

2023-06-19 23:55:26 +02:00
import {highlight, languages} from 'prismjs';
2023-03-09 23:32:49 +01:00
import PrismLoader from 'prismjs/components/index';
2023-06-19 23:55:26 +02:00
import {liquidEngine} from '../engines';
import {stripIndent} from '../type';
2023-06-19 23:55:26 +02:00
import {default as codeExample} from './codeExample';
import {compatibility, implStatus} from './compatibility';
import {getDocTocData, getToc} from './toc';
2023-03-09 23:32:49 +01:00
2023-06-19 23:55:26 +02:00
export {codeExample};
export {compatibility, implStatus};
export {getDocTocData, getToc};
2023-03-09 23:32:49 +01:00
/**
* Returns HTML for a fun fact that's not directly relevant to the main
* documentation.
*/
2023-06-22 21:18:23 +02:00
export const funFact = async (contents: string) =>
liquidEngine.renderFile('fun_fact', {
contents: stripIndent(contents),
2023-03-09 23:32:49 +01:00
});
2023-05-07 18:58:40 +02:00
/**
2023-06-22 21:18:23 +02:00
* Returns HTML for a heads-up warning related to the main documentation.
2023-05-07 18:58:40 +02:00
*/
2023-06-22 21:18:23 +02:00
export const headsUp = async (contents: string) =>
liquidEngine.renderFile('heads_up', {
contents: stripIndent(contents),
2023-05-07 18:58:40 +02:00
});
2023-03-09 23:32:49 +01:00
/**
* Returns HTML for a code block with syntax highlighting via [Prism][].
*
* This should be equivalent to the [11ty `{% highlight %}` tag][hl-tag], except
* this tag can wrap dynamic content (partials, variables, etc), while the 11ty
* tag only wraps plain text.
*
* [Prism]: https://prismjs.com/
* [hl-tag]: https://www.11ty.dev/docs/plugins/syntaxhighlight/#usage
*
* @see https://prismjs.com/
*/
2023-03-10 22:20:13 +01:00
export const codeBlock = (contents: string, language: string, padding = 0) => {
2023-03-09 23:32:49 +01:00
if (!languages[language]) {
PrismLoader(language);
}
const code = `${contents}${'\n'.repeat(padding + 1)}`;
const html = highlight(code, languages[language], language);
2023-03-09 23:32:49 +01:00
const attr = `language-${language}`;
return `<pre class="${attr}"><code class="${attr}">${html.replaceAll(
'\n',
'&#10;'
)}</code></pre>`;
2023-03-09 23:32:49 +01:00
};
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 componentsPlugin(eleventyConfig: any) {
// filters...
eleventyConfig.addLiquidFilter('implStatus', implStatus);
2023-05-24 18:54:23 +02:00
eleventyConfig.addLiquidFilter('getDocTocData', getDocTocData);
2023-05-25 17:00:51 +02:00
eleventyConfig.addLiquidFilter('getToc', getToc);
2023-03-09 23:32:49 +01:00
// paired shortcodes...
eleventyConfig.addPairedLiquidShortcode('code', codeBlock);
eleventyConfig.addPairedLiquidShortcode('codeExample', codeExample);
// Ideally this could be used with named args, but that's not supported yet in
// 11ty's implementation of LiquidJS:
// https://github.com/11ty/eleventy/issues/2679
// In the meantime, check the order in the function definition of
// `compatibility` in `source/helpers/components/compatibility.ts`.
2023-03-09 23:32:49 +01:00
eleventyConfig.addPairedLiquidShortcode('compatibility', compatibility);
eleventyConfig.addPairedLiquidShortcode('funFact', funFact);
2023-05-07 18:58:40 +02:00
eleventyConfig.addPairedLiquidShortcode('headsUp', headsUp);
2023-03-09 23:32:49 +01:00
}