diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..595f18c --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "checkJs": true, + "strict": false + }, + "include": ["lib/**/*.js"] +} diff --git a/lib/builder.js b/lib/builder.js index 27cf9fa..5413309 100644 --- a/lib/builder.js +++ b/lib/builder.js @@ -1,35 +1,50 @@ -const fs = require('fs/promises'); -const {marked,set_active_link} = require('./util'); +import fs from "node:fs/promises"; -const template_replace = (template,replacements) => template.replace(/@([a-z]+)/g,(match,word) => replacements[word] || match); +import { marked, set_active_link } from "./util.js"; -function page_name(str) - { - return str - .replace(/^ch[0-9]+-[0-9]+-/,'') - .replace(/-/g,' ') - .split(' ').map(word => word[0].toUpperCase() + word.slice(1)) - .join(' ').split('.').slice(0,-1).join('.'); - } +const template_replace = (template, replacements) => + template.replace(/@([a-z]+)/g, (match, word) => replacements[word] || match); -async function build_page(file,options) - { - const template = options && options.template || ''; - const content = await fs.readFile(file,'utf8'); - const title = page_name(file.split('/').pop()); - set_active_link(options.active_link || file.split('/').pop()); - return template_replace(template,{title,body: marked(content),summary: marked(options.summary || '')}); - } +/** + * @param {string} str + * @returns + */ +function page_name(str) { + return str + .replace(/^ch[0-9]+-[0-9]+-/, "") + .replace(/-/g, " ") + .split(" ") + .map((word) => word[0].toUpperCase() + word.slice(1)) + .join(" ") + .split(".") + .slice(0, -1) + .join("."); +} -async function link_page(file,previous,next) - { - const content = await fs.readFile(file,'utf8'); - let index = content.indexOf('
${prism.highlight(
+ Cl.prettyPrint(event.data.value || Cl.none()),
+ prism.languages.clarity,
+ "Clarity"
+ )}`;
+ case "stx_transfer_event":
+ return `${number_format(
+ event.data.amount,
+ 6
+ )} STX${
+ event.data.sender
+ }${
+ event.data.recipient
+ }`;
+ default:
+ return `${escape_html(
+ JSON.stringify(event)
+ )}`;
+ }
+ })
+ .join("");
+}
-function render_events(events)
- {
- if (!events || !events.length)
- return '';
- return events.map((event,index) =>
- {
- switch (event.type)
- {
- case 'contract_event':
- return `${prism.highlight(event.contract_event.value,prism.languages.clarity,'Clarity')}`;
- case 'stx_transfer_event':
- return `${number_format(event.stx_transfer_event.amount,6)} STX${event.stx_transfer_event.sender}${event.stx_transfer_event.recipient}`;
- default:
- return `${escape_html(JSON.stringify(event))}`;
- }
- }).join('');
- }
+function simple_form(name) {
+ return RegExp("(\\()" + name + "(?=[\\s\\)])");
+}
+// booleans and numbers
+function primitive(pattern) {
+ return RegExp("([\\s([])" + pattern + "(?=[\\s)])");
+}
-function simple_form(name)
- {
- return RegExp('(\\()' + name + '(?=[\\s\\)])');
- }
- // booleans and numbers
- function primitive(pattern)
- {
- return RegExp('([\\s([])' + pattern + '(?=[\\s)])');
- }
-
- // Open parenthesis for look-behind
- const par = '(\\()';
- const endpar = '(?=\\))';
- // End the pattern with look-ahead space
- const space = '(?=\\s)';
+// Open parenthesis for look-behind
+const par = "(\\()";
+const endpar = "(?=\\))";
+// End the pattern with look-ahead space
+const space = "(?=\\s)";
prism.languages.clarity = {
- // Three or four semicolons are considered a heading.
- heading: {
- pattern: /;;;.*/,
- alias: ['comment', 'title'],
- },
- comment: /;;.*/,
- string: [
- {
- pattern: /"(?:[^"\\]|\\.)*"/,
- greedy: true,
- },
- {
- pattern: /0x[0-9a-fA-F]*/,
- greedy: true,
- },
- ],
- symbol: {
- pattern: /'[^()#'\s]+/,
- greedy: true,
- },
- keyword: [
- {
- pattern: RegExp(
- par +
- '(?:or|and|xor|not|begin|let|if|ok|err|unwrap\\!|unwrap-err\\!|unwrap-panic|unwrap-err-panic|match|try\\!|asserts\\!|\
+ // Three or four semicolons are considered a heading.
+ heading: {
+ pattern: /;;;.*/,
+ alias: ["comment", "title"],
+ },
+ comment: /;;.*/,
+ string: [
+ {
+ pattern: /"(?:[^"\\]|\\.)*"/,
+ greedy: true,
+ },
+ {
+ pattern: /0x[0-9a-fA-F]*/,
+ greedy: true,
+ },
+ ],
+ symbol: {
+ pattern: /'[^()#'\s]+/,
+ greedy: true,
+ },
+ keyword: [
+ {
+ pattern: RegExp(
+ par +
+ "(?:or|and|xor|not|begin|let|if|ok|err|unwrap\\!|unwrap-err\\!|unwrap-panic|unwrap-err-panic|match|try\\!|asserts\\!|\
map-get\\?|var-get|contract-map-get\\?|get|tuple|\
define-public|define-private|define-constant|define-map|define-data-var|\
define-fungible-token|define-non-fungible-token|\
-define-read-only)' +
- space
- ),
- lookbehind: true,
- },
- {
- pattern: RegExp(par + '(?:is-eq|is-some|is-none|is-ok|is-er)' + space),
- lookbehind: true,
- },
- {
- pattern: RegExp(
- par +
- '(?:var-set|map-set|map-delete|map-insert|\
+define-read-only)" +
+ space
+ ),
+ lookbehind: true,
+ },
+ {
+ pattern: RegExp(par + "(?:is-eq|is-some|is-none|is-ok|is-er)" + space),
+ lookbehind: true,
+ },
+ {
+ pattern: RegExp(
+ par +
+ "(?:var-set|map-set|map-delete|map-insert|\
ft-transfer\\?|nft-transfer\\?|nft-mint\\?|ft-mint\\?|nft-get-owner\\?|ft-get-balance\\?|\
-contract-call\\?)' +
- space
- ),
- lookbehind: true,
- },
- {
- pattern: RegExp(
- par +
- '(?:list|map|filter|fold|len|concat|append|as-max-len\\?|to-int|to-uint|\
-buff|hash160|sha256|sha512|sha512/256|keccak256|true|false|none)' +
- space
- ),
- lookbehind: true,
- },
- {
- pattern: RegExp(
- par +
- '(?:as-contract|contract-caller|tx-sender|block-height|at-block|get-block-info\\?)' +
- space
- ),
- lookbehind: true,
- },
- {
- pattern: RegExp(par + '(?:is-eq|is-some|is-none|is-ok|is-err)' + space),
- lookbehind: true,
- },
- ],
- boolean: /(?:false|true|none)/,
- number: {
- pattern: primitive('[-]?u?\\d+'),
- lookbehind: true,
- },
- address: {
- pattern: /([\s()])(?:\'[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{28,41})(?=[()\s]|$)/,
- lookbehind: true,
- },
- operator: {
- pattern: /(\()(?:[-+*\/]|[<>]=?|=>?)(?=[()\s]|$)/,
- lookbehind: true,
- },
- function: {
- pattern: /(\()[^()'\s]+(?=[()\s]|$)/,
- lookbehind: true,
- },
- punctuation: /[()']/,
- };
+contract-call\\?)" +
+ space
+ ),
+ lookbehind: true,
+ },
+ {
+ pattern: RegExp(
+ par +
+ "(?:list|map|filter|fold|len|concat|append|as-max-len\\?|to-int|to-uint|\
+buff|hash160|sha256|sha512|sha512/256|keccak256|true|false|none)" +
+ space
+ ),
+ lookbehind: true,
+ },
+ {
+ pattern: RegExp(
+ par +
+ "(?:as-contract|contract-caller|tx-sender|block-height|at-block|get-block-info\\?)" +
+ space
+ ),
+ lookbehind: true,
+ },
+ {
+ pattern: RegExp(par + "(?:is-eq|is-some|is-none|is-ok|is-err)" + space),
+ lookbehind: true,
+ },
+ ],
+ boolean: /(?:false|true|none)/,
+ number: {
+ pattern: primitive("[-]?u?\\d+"),
+ lookbehind: true,
+ },
+ address: {
+ pattern:
+ /([\s()])(?:\'[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{28,41})(?=[()\s]|$)/,
+ lookbehind: true,
+ },
+ operator: {
+ pattern: /(\()(?:[-+*\/]|[<>]=?|=>?)(?=[()\s]|$)/,
+ lookbehind: true,
+ },
+ function: {
+ pattern: /(\()[^()'\s]+(?=[()\s]|$)/,
+ lookbehind: true,
+ },
+ punctuation: /[()']/,
+};
marked.setOptions({
- langPrefix: 'language-',
- highlight: function(code, language)
- {
- return prism.highlight(code,prism.languages[language.toLowerCase()] || prism.languages.plain,language);
- },
+ langPrefix: "language-",
+ highlight: function (code, language) {
+ return prism.highlight(
+ code,
+ prism.languages[language.toLowerCase()] || prism.languages.plain,
+ language
+ );
+ },
});
-let active_link = '';
+let active_link = "";
-const render_superscript = text => text.replace(/([0-9]+)\^([0-9]+)/, (_, n, e) => `${n}${e}`);
+const render_superscript = (text) =>
+ text.replace(/([0-9]+)\^([0-9]+)/, (_, n, e) => `${n}${e}`);
-const render_footnotes = text =>
- {
- const [_,ref] = text.match(/^\[\^([^\]]+)\]/) || [];
- return ref
- ? `${escaped ? code : escape_html(code)}${escaped ? code : escape_html(code)}${
+ escaped ? code : escape_html(code)
+ }${
+ escaped ? code : escape_html(code)
+ }