Comparing version 1.1.0 to 1.2.0
# Changelog | ||
## 1.2.0 | ||
*2021-04-01* | ||
- Added function `eleventyPlugin()` for use with Eleventy's `addPlugin` method. | ||
- Added configuration option `outputFolder` to configure the folder the compiled HTML files are placed in. | ||
- Added configuration option `templatesFolder` to configure the folder templates are placed in. | ||
- Added CLI options `--outputFolder`, `--templatesFolder`, `--eleventy`, and `--defaultStyles` to change configuration options. | ||
- Added support for tables. | ||
- Added a warning when the parser detects non-repetition-based `#time` function syntax is being used. | ||
## 1.1.0 | ||
*2021-03-28* | ||
- Added `parse` CLI command to implement `parse()`. | ||
- Added support for a table of contents. | ||
- Added a generated table of contents if there are over 4 headings. | ||
- Added support for `nowiki` tag. | ||
@@ -8,0 +17,0 @@ - Added support for `onlyinclude`, `includeonly`, and `noinclude` tags in templates. |
{ | ||
"name": "wikity", | ||
"version": "1.1.0", | ||
"version": "1.2.0", | ||
"description": "Wikitext as a templating language, with built-in Eleventy support.", | ||
@@ -12,2 +12,6 @@ "main": "src/index.js", | ||
}, | ||
"files": [ | ||
"src/*.js", | ||
"src/*.d.ts" | ||
], | ||
"keywords": [ | ||
@@ -22,3 +26,11 @@ "eleventy", | ||
], | ||
"repository": { | ||
"type": "git", | ||
"url": "git+https://github.com/Nixinova/Wikity.git" | ||
}, | ||
"author": "Nixinova (https://nixinova.com)", | ||
"bugs": { | ||
"url": "https://github.com/Nixinova/Wikity/issues" | ||
}, | ||
"homepage": "https://github.com/Nixinova/Wikity#readme", | ||
"license": "ISC", | ||
@@ -29,4 +41,3 @@ "dependencies": { | ||
"glob": "^7.1.6", | ||
"html-formatter": "^0.1.9", | ||
"novasheets": "1.0.0-pre3" | ||
"html-formatter": "^0.1.9" | ||
}, | ||
@@ -38,4 +49,4 @@ "peerDependencies": { | ||
"@types/node": "^14.14.37", | ||
"typescript": "^4.2.3" | ||
"typescript": "~4.2.3" | ||
} | ||
} |
@@ -15,7 +15,13 @@ # Wikity | ||
- `wikity.compile(directory?: string, options?: object)` | ||
- Compile Wikitext files into HTML. Find outputted files in folder `wikity-out/`. | ||
### Node | ||
- `wikity.compile(folder?: string, options?: object): void` | ||
- Compile all Wikitext (`.wiki`) files into HTML. | ||
- `directory?: string` | ||
- The folder to compile (default: `.`, the current directory). | ||
- `options?: object` | ||
- `outputFolder?: string` | ||
- Where outputted HTML files shall be placed (default: `wikity-out`). | ||
- `templatesFolder?: string` | ||
- What folder to place templates in (default: `'templates'`). | ||
- `eleventy?: boolean` | ||
@@ -27,11 +33,15 @@ - Whether [front matter](https://www.11ty.dev/docs/data-frontmatter/) will be added to the outputted HTML for Eleventy to read (default: `false`). | ||
- Custom CSS to style the wiki pages (default: `''`). | ||
- `wikity.clean()` | ||
- Clean up residual folders after compilation. | ||
- `wikity.eleventyPlugin(folder?: string, options?: object): void` | ||
- An implementation of `compile` for use with Eleventy's `addPlugin` API. | ||
- `wikity.parse(input: string): string` | ||
- Parse raw wikitext input into HTML. | ||
Calling `wikity()` will compile all `.wiki` files into their corresponding `.html` versions. | ||
Outputted files are located in the `wikity-out/` directory. | ||
```js | ||
const wikity = require('wikity'); | ||
wikity.compile(); // compile all .wiki files inside this directory | ||
// compile all .wiki files inside this directory | ||
wikity.compile(); | ||
// parse wikitext from an input string | ||
let html = wikity.parse(`'''bold''' [[link|text]]`); // <b>bold</b> <a href="/link"...>text</a> | ||
``` | ||
@@ -44,5 +54,19 @@ | ||
const wikity = require('wikity'); | ||
wikity.compile('.', { eleventy: true }); | ||
module.exports = function (eleventyConfig) { | ||
eleventyConfig.addPlugin( () => wikity.eleventyPlugin() ); | ||
} | ||
``` | ||
### Command-line | ||
```cmd | ||
$ wikity help | ||
Display a help message | ||
$ wikity (compile|-c) [<folder>] [-o <folder>] [-t <folder>] [-e] [-d] | ||
Compile Wikity with various options | ||
$ wikity parse <input> | ||
Parse raw input into HTML | ||
$ wikity version | ||
Display the latest version of Wikity | ||
``` | ||
## Usage | ||
@@ -52,3 +76,3 @@ | ||
Any wiki templates (called using `{{template name}}`) must be inside the `templates/` folder. | ||
Any wiki templates (called using `{{template name}}`) must be inside the `templates/` folder by default. | ||
@@ -82,2 +106,7 @@ ### Wiki markup | ||
| `{{{arg\|default val}}}` | *(ditto but 'default val' if unset)* | | ||
| `{\| style="margin:1em"` | *table opening* | | ||
| `! Cell heading` | **Cell heading** | | ||
| `\|- class="new-row"` | *new table row* | | ||
| `\| Cell content` | Cell content | | ||
| `\|}` | *table closing* | | ||
| `{{#if:non-empty-string\|text}}` | text | | ||
@@ -90,13 +119,13 @@ | `{{#ifeq:1\|2\|true\|false}}` | false | | ||
| `{{#time:dd/mm/yy\|2021-03-28}}` | 28/03/21 | | ||
| `{{lc:TEXT}}` | text | | ||
| `{{ucfirst:text}}` | Text | | ||
| `{{len:12345}}` | 5 | | ||
| `{{sub:string|2|4}}` | ring | | ||
| `{{pos:text|x}}` | 2 | | ||
| `{{padleft:text|5|_}}` | _text | | ||
| `{{padright:msg|5|_}}` | msg__ | | ||
| `{{replace:Message|e|3}}` | M3ssag3 | | ||
| `{{explode:A-B-C-D|-|2}}` | C | | ||
| `{{urlencode:t e x t}}` | t%20e%20x%20t | | ||
| `{{urldecode:a%20b%27c}}` | a b'c | | ||
| `{{#lc:TEXT}}` | text | | ||
| `{{#ucfirst:text}}` | Text | | ||
| `{{#len:12345}}` | 5 | | ||
| `{{#sub:string\|2\|4}}` | ring | | ||
| `{{#pos:text\|x}}` | 2 | | ||
| `{{#padleft:text\|5\|_}}` | _text | | ||
| `{{#padright:msg\|5\|_}}` | msg__ | | ||
| `{{#replace:Message\|e\|3}}` | M3ssag3 | | ||
| `{{#explode:A-B-C-D\|-\|2}}` | C | | ||
| `{{#urlencode:t e x t}}` | t%20e%20x%20t | | ||
| `{{#urldecode:a%20b%27c}}` | a b'c | | ||
| `<noinclude>No</noinclude>` | *(blank outside a template)* | | ||
@@ -103,0 +132,0 @@ | `<onlyinclude>Yes</onlyinclude>` | Yes | |
@@ -8,10 +8,10 @@ #!/usr/bin/env node | ||
const index_1 = __importDefault(require("./index")); | ||
const VERSION = '1.1.0'; | ||
const VERSION = '1.2.0'; | ||
const indent = (n) => ' '.repeat(n * 4); | ||
const usage = (command, ...desc) => { | ||
console.log('\n' + indent(2) + command); | ||
for (let msg of desc) | ||
console.log(indent(3) + msg); | ||
desc.forEach((msg) => console.log(indent(2.5) + msg)); | ||
}; | ||
const arg = (n) => process.argv[n + 1] || ''; | ||
const args = process.argv.slice(1); | ||
if (!arg(1)) { | ||
@@ -22,12 +22,19 @@ console.log('Type `wikity help` for a list of commands.'); | ||
console.log(`\n${indent(1)}Wikity CLI commands:`); | ||
usage(`wikity [--]h[elp]`, `Display this help message.`); | ||
usage(`wikity [--]c[ompile] [<folder>]`, `Compile wikitext files from a given folder.`); | ||
usage(`wikity [--]p[arse] "<input>"`, `Parse raw wikitext from the command line.`); | ||
usage(`wikity [--]v[ersion]`, `Display the current version of Wikity.`); | ||
usage(`wikity (help|-h)`, `Display this help message.`); | ||
usage(`wikity (compile|-c) [<folder>] [-o <folder>] [-t <folder>] [-e] [-d]`, `Compile wikitext files from a given folder.`, ` [<folder>]\n${indent(3.5)}Input folder ('.' (current folder) if unset).`, ` (-o|--outputFolder) <folder>\n${indent(3.5)}Folder that compiled HTML files are placed in ('wikity-out' if unset).`, ` (-t|--templatesFolder) <folder>\n${indent(3.5)}Where to place wiki templates ('templates' if unset).`, ` (-e|--eleventy)\n${indent(3.5)}Compiles files with Eleventy front matter (false if unset).`, ` (-d|--defaultStyles)\n${indent(3.5)}Add default wiki styling to all pages (true if unset).`); | ||
usage(`wikity (parse|-p) "<input>"`, `Parse raw wikitext from the command line.`); | ||
usage(`wikity (version|-v)`, `Display the current version of Wikity.`); | ||
} | ||
else if (arg(1).includes('c')) { | ||
index_1.default.compile(arg(2) || '.', { eleventy: !!arg(3) }); | ||
const configArgs = args.slice(2); | ||
const folder = arg(2) || '.'; | ||
const outputFolder = configArgs.join(' ').includes('-o') && configArgs.filter((_, i) => { var _a; return (_a = configArgs[i - 1]) === null || _a === void 0 ? void 0 : _a.includes('-o'); }).join(' ') || ''; | ||
const templatesFolder = configArgs.join(' ').includes('-t') && configArgs.filter((_, i) => { var _a; return (_a = configArgs[i - 1]) === null || _a === void 0 ? void 0 : _a.includes('-t'); }).join(' ') || ''; | ||
const eleventy = configArgs.join(' ').includes('-e'); | ||
const defaultStyles = configArgs.join(' ').includes('-d'); | ||
index_1.default.compile(folder, { outputFolder, templatesFolder, eleventy, defaultStyles }); | ||
} | ||
else if (arg(1).includes('p')) { | ||
console.log(index_1.default.parse(arg(2))); | ||
const input = arg(2); | ||
console.log(index_1.default.parse(input)); | ||
} | ||
@@ -34,0 +41,0 @@ else if (arg(1).includes('v')) { |
@@ -1,2 +0,2 @@ | ||
import { Config } from './types'; | ||
import { Config } from './common'; | ||
export declare function compile(dir?: string, config?: Config): void; |
@@ -7,5 +7,4 @@ "use strict"; | ||
const formatter = require('html-formatter'); | ||
const novasheets = require('novasheets'); | ||
const parse_1 = require("./parse"); | ||
const OUT_FOLDER = 'wikity-out/'; | ||
const common_1 = require("./common"); | ||
function compile(dir = '.', config = {}) { | ||
@@ -18,6 +17,7 @@ let stylesCreated = false; | ||
let data = fs.readFileSync(file, { encoding: 'utf8' }); | ||
let content = parse_1.parse(data); | ||
let content = parse_1.parse(data, config); | ||
let outText = content.toString(); | ||
let [, folder, filename] = file.match(/^(.+?[\/\\])((?:templates[\/\\])?[^\/\\]+)$/); | ||
let outFolder = (dir || folder || '.') + '/' + OUT_FOLDER; | ||
const templatesFolder = config.templatesFolder || 'templates'; | ||
let [, folder, filename] = file.match(common_1.RegExpBuilder(common_1.RawString `^(.+?[\/\\]) ((?:${templatesFolder}[\/\\])?[^\/\\]+)$`, '')); | ||
let outFolder = (dir || folder || '.') + '/' + (config.outputFolder || 'wikity-out') + '/'; | ||
let outFilename = filename.replace(/ /g, '_').replace('.wiki', '.html'); | ||
@@ -98,3 +98,3 @@ let url = outFilename.replace(/(?<=^|\/)\w/g, m => m.toUpperCase()); | ||
if (config.defaultStyles !== false) { | ||
styles += novasheets.parse(` | ||
styles += ` | ||
body {font-family: sans-serif; margin: 4em; max-width: 1000px; background: #eee;} | ||
@@ -108,11 +108,15 @@ main {margin: 3em -1em; background: #fff; padding: 1em;} | ||
a:not(:hover) {text-decoration: none;} | ||
a.internal-link {color: #04a;} &:visited {color: #26d;} | ||
a.external-link {color: #36b;} &:visited {color: #58d;} &::after {content: '\\1f855';} | ||
a.redlink {color: #d33;} &:visited {color: #b44;} | ||
a.internal-link {color: #04a;} | ||
a.internal-link:visited {color: #26d;} | ||
a.external-link {color: #36b;} | ||
&:visited {color: #58d;} | ||
a.external-link&::after {content: '\\1f855';} | ||
a.redlink {color: #d33;} | ||
a.redlink:visited {color: #b44;} | ||
#toc {display: inline-block; border: 1px solid #aab; padding: 8px; background-color: #f8f8f8; font-size: 95%;} | ||
&-heading {display: block; text-align: center;} | ||
& ol {margin: 0 0 0 1.3em;} | ||
&.toc-hidden {height: 1em;} % ol {display: none;} | ||
`.replace(/^\s+/gm, '')); | ||
#toc-heading {display: block; text-align: center;} | ||
#toc ol {margin: 0 0 0 1.3em;} | ||
#toc.toc-hidden {height: 1em;} % ol {display: none;} | ||
`.replace(/^\s+/gm, ''); | ||
} | ||
@@ -119,0 +123,0 @@ if (config.customStyles) |
import { compile } from './compile'; | ||
import { plugin } from './eleventy'; | ||
declare const _default: { | ||
compile: typeof compile; | ||
parse: (data: string) => string; | ||
eleventyPlugin: typeof plugin; | ||
}; | ||
export = _default; |
"use strict"; | ||
const compile_1 = require("./compile"); | ||
const parse_1 = require("./parse"); | ||
const eleventy_1 = require("./eleventy"); | ||
module.exports = { | ||
compile: compile_1.compile, | ||
parse: (data) => parse_1.parse(data).toString(), | ||
eleventyPlugin: eleventy_1.plugin, | ||
}; |
@@ -1,2 +0,2 @@ | ||
import { Result } from './types'; | ||
export declare function parse(data: string): Result; | ||
import { Config, Result } from './common'; | ||
export declare function parse(data: string, config?: Config): Result; |
118
src/parse.js
@@ -7,8 +7,6 @@ "use strict"; | ||
const dateFormat = require('dateformat'); | ||
const types_1 = require("./types"); | ||
const re = (regex, flag = 'mgi') => RegExp(regex.replace(/ /g, '').replace(/\|\|.+?\|\|/g, ''), flag); | ||
const r = String.raw; | ||
const common_1 = require("./common"); | ||
const MAX_RECURSION = 50; | ||
const arg = `\s*([^|}]+?)\s*`; | ||
function parse(data) { | ||
const arg = common_1.RawString `\s*([^|}]+?)\s*`; | ||
function parse(data, config = {}) { | ||
const vars = {}; | ||
@@ -28,6 +26,6 @@ const metadata = {}; | ||
// Nowiki: <nowiki></nowiki> | ||
.replace(re(r `<nowiki> ([^]+?) </nowiki>`), (_, m) => `%NOWIKI#${nowikis.push(m), nowikiCount++}%`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `<nowiki> ([^]+?) </nowiki>`), (_, m) => `%NOWIKI#${nowikis.push(m), nowikiCount++}%`) | ||
// Sanitise unacceptable HTML | ||
.replace(re(r `<(/?) \s* (?= script|link|meta|iframe|frameset|object|embed|applet|form|input|button|textarea )`), '<$1') | ||
.replace(re(r `(?<= <[^>]+ ) (\bon(\w+))`), 'data-$2') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `<(/?) \s* (?= script|link|meta|iframe|frameset|object|embed|applet|form|input|button|textarea )`), '<$1') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `(?<= <[^>]+ ) (\bon(\w+))`), 'data-$2') | ||
// Comments: <!-- --> | ||
@@ -38,27 +36,27 @@ .replace(/<!--[^]+?-->/g, '') | ||
// Metadata: displayTitle, __NOTOC__, etc | ||
.replace(re(r `{{ \s* displayTitle: ([^}]+) }}`), (_, title) => (metadata.displayTitle = title, '')) | ||
.replace(re(r `__NOINDEX__`), () => (metadata.noindex = true, '')) | ||
.replace(re(r `__NOTOC__`), () => (metadata.notoc = true, '')) | ||
.replace(re(r `__FORCETOC__`), () => (metadata.toc = true, '')) | ||
.replace(re(r `__TOC__`), () => (metadata.toc = true, `<toc></toc>`)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* displayTitle: ([^}]+) }}`), (_, title) => (metadata.displayTitle = title, '')) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `__NOINDEX__`), () => (metadata.noindex = true, '')) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `__NOTOC__`), () => (metadata.notoc = true, '')) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `__FORCETOC__`), () => (metadata.toc = true, '')) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `__TOC__`), () => (metadata.toc = true, `<toc></toc>`)) | ||
// Magic words: {{!}}, {{reflist}}, etc | ||
.replace(re(r `{{ \s* ! \s* }}`), '|') | ||
.replace(re(r `{{ \s* = \s* }}`), '=') | ||
.replace(re(r `{{ \s* [Rr]eflist \s* }}`), '<references/>') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* ! \s* }}`), '|') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* = \s* }}`), '=') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* [Rr]eflist \s* }}`), '<references/>') | ||
// String functions: {{lc:}}, {{ucfirst:}}, {{len:}}, etc | ||
.replace(re(r `{{ \s* #? urlencode: ${arg} }}`), (_, m) => encodeURI(m)) | ||
.replace(re(r `{{ \s* #? urldecode: ${arg} }}`), (_, m) => decodeURI(m)) | ||
.replace(re(r `{{ \s* #? lc: ${arg} }}`), (_, m) => m.toLowerCase()) | ||
.replace(re(r `{{ \s* #? uc: ${arg} }}`), (_, m) => m.toUpperCase()) | ||
.replace(re(r `{{ \s* #? lcfirst: ${arg} }}`), (_, m) => m[0].toLowerCase() + m.substr(1)) | ||
.replace(re(r `{{ \s* #? ucfirst: ${arg} }}`), (_, m) => m[0].toUpperCase() + m.substr(1)) | ||
.replace(re(r `{{ \s* #? len: ${arg} }}`), (_, m) => m.length) | ||
.replace(re(r `{{ \s* #? pos: ${arg} \|${arg} (?: \s*\|${arg} )? }}`), (_, find, str, n = 0) => find.substr(n).indexOf(str)) | ||
.replace(re(r `{{ \s* #? sub: ${arg} \|${arg} (?:\|${arg})? }}`), (_, str, from, len) => str.substr(+from - 1, +len)) | ||
.replace(re(r `{{ \s* #? padleft: ${arg} \|${arg} \|${arg} }}`), (_, str, n, char) => str.padStart(+n, char)) | ||
.replace(re(r `{{ \s* #? padright: ${arg} \|${arg} \|${arg} }}`), (_, str, n, char) => str.padEnd(+n, char)) | ||
.replace(re(r `{{ \s* #? replace: ${arg} \|${arg} \|${arg} }}`), (_, str, find, rep) => str.split(find).join(rep)) | ||
.replace(re(r `{{ \s* #? explode: ${arg} \|${arg} \|${arg} }}`), (_, str, delim, pos) => str.split(delim)[+pos]) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? urlencode: ${arg} }}`), (_, m) => encodeURI(m)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? urldecode: ${arg} }}`), (_, m) => decodeURI(m)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? lc: ${arg} }}`), (_, m) => m.toLowerCase()) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? uc: ${arg} }}`), (_, m) => m.toUpperCase()) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? lcfirst: ${arg} }}`), (_, m) => m[0].toLowerCase() + m.substr(1)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? ucfirst: ${arg} }}`), (_, m) => m[0].toUpperCase() + m.substr(1)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? len: ${arg} }}`), (_, m) => m.length) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? pos: ${arg} \|${arg} (?: \s*\|${arg} )? }}`), (_, find, str, n = 0) => find.substr(n).indexOf(str)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? sub: ${arg} \|${arg} (?:\|${arg})? }}`), (_, str, from, len) => str.substr(+from - 1, +len)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? padleft: ${arg} \|${arg} \|${arg} }}`), (_, str, n, char) => str.padStart(+n, char)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? padright: ${arg} \|${arg} \|${arg} }}`), (_, str, n, char) => str.padEnd(+n, char)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? replace: ${arg} \|${arg} \|${arg} }}`), (_, str, find, rep) => str.split(find).join(rep)) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* #? explode: ${arg} \|${arg} \|${arg} }}`), (_, str, delim, pos) => str.split(delim)[+pos]) | ||
// Parser functions: {{#if:}}, {{#switch:}}, etc | ||
.replace(re(r `{{ \s* (#\w+) \s* : \s* ( [^{}]+ ) \s* }} ( ?!} )`), (_, name, content) => { | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* (#\w+) \s* : \s* ( [^{}]+ ) \s* }} ( ?!} )`), (_, name, content) => { | ||
if (/{{\s*#/.test(content)) | ||
@@ -76,3 +74,3 @@ return _; | ||
case '#var': | ||
if (re(r `{{ \s* #vardefine \s* : \s* ${args[0]}`).test(outText)) | ||
if (common_1.RegExpBuilder(common_1.RawString `{{ \s* #vardefine \s* : \s* ${args[0]}`).test(outText)) | ||
return _; // wait until var is set | ||
@@ -86,10 +84,16 @@ return vars[args[0]] || args[1] || ''; | ||
case '#date': | ||
case '#datetime': return dateFormat(args[1] ? new Date(args[1]) : new Date(), args[0]); | ||
case '#datetime': | ||
// make sure the characters are not inside a string | ||
let parsedMatch = args[0].replace(/".+?"/g, '').replace(/'.+?'/g, ''); | ||
if (/[abcefgijkqruvx]/i.test(parsedMatch)) { | ||
console.warn(`<Wikity> [WARN] Wikity does not use Wikipedia's #time function syntax. Use repetition-based formatting instead.`); | ||
} | ||
return dateFormat(args[1] ? new Date(args[1]) : new Date(), args[0]); | ||
} | ||
}) | ||
// Templates: {{template}} | ||
.replace(re(r `{{ \s* ([^#}|]+?) (\|[^}]+)? }} (?!})`), (_, title, params = '') => { | ||
.replace(common_1.RegExpBuilder(common_1.RawString `{{ \s* ([^#}|]+?) (\|[^}]+)? }} (?!})`), (_, title, params = '') => { | ||
if (/{{/.test(params)) | ||
return _; | ||
const page = 'templates/' + title.trim().replace(/ /g, '_'); | ||
const page = (config.templatesFolder || 'templates') + '/' + title.trim().replace(/ /g, '_'); | ||
// Retrieve template content | ||
@@ -108,3 +112,3 @@ let content = ''; | ||
// Substitite arguments | ||
const argMatch = (arg) => re(r `{{{ \s* ${arg} (?:\|([^}]*))? \s* }}}`); | ||
const argMatch = (arg) => common_1.RegExpBuilder(common_1.RawString `{{{ \s* ${arg} (?:\|([^}]*))? \s* }}}`); | ||
let args = params.split('|').slice(1); | ||
@@ -122,24 +126,30 @@ for (let i in args) { | ||
// Markup: '''bold''' and '''italic''' | ||
.replace(re(r `''' ([^']+?) '''`), '<b>$1</b>') | ||
.replace(re(r `'' ([^']+?) ''`), '<i>$1</i>') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `''' ([^']+?) '''`), '<b>$1</b>') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `'' ([^']+?) ''`), '<i>$1</i>') | ||
// Headings: ==heading== | ||
.replace(re(r `^ (=+) \s* (.+?) \s* \1 \s* $`), (_, lvl, txt) => `<h${lvl.length} id="${encodeURI(txt.replace(/ /g, '_'))}">${txt}</h${lvl.length}>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ (=+) \s* (.+?) \s* \1 \s* $`), (_, lvl, txt) => `<h${lvl.length} id="${encodeURI(txt.replace(/ /g, '_'))}">${txt}</h${lvl.length}>`) | ||
// Internal links: [[Page]] and [[Page|Text]] | ||
.replace(re(r `\[\[ ([^\]|]+?) \]\]`), `<a class="internal-link" title="$1" href="/$1">$1</a>`) | ||
.replace(re(r `\[\[ ([^\]|]+?) \| ([^\]]+?) \]\]`), `<a class="internal-link" title="$1" href="/$1">$2</a>`) | ||
.replace(re(r `(</a>)([a-z]+)`), '$2$1') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `\[\[ ([^\]|]+?) \]\]`), `<a class="internal-link" title="$1" href="/$1">$1</a>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `\[\[ ([^\]|]+?) \| ([^\]]+?) \]\]`), `<a class="internal-link" title="$1" href="/$1">$2</a>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `(</a>)([a-z]+)`), '$2$1') | ||
// External links: [href Page] and just [href] | ||
.replace(re(r `\[ ((?:\w+:)?\/\/ [^\s\]]+) (\s [^\]]+?)? \]`), (_, href, txt) => `<a class="external-link" href="${href}">${txt || '[' + (++rawExtLinkCount) + ']'}</a>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `\[ ((?:\w+:)?\/\/ [^\s\]]+) (\s [^\]]+?)? \]`), (_, href, txt) => `<a class="external-link" href="${href}">${txt || '[' + (++rawExtLinkCount) + ']'}</a>`) | ||
// Bulleted list: *item | ||
.replace(re(r `^ (\*+) (.+?) $`), (_, lvl, txt) => `${'<ul>'.repeat(lvl.length)}<li>${txt}</li>${'</ul>'.repeat(lvl.length)}`) | ||
.replace(re(r `</ul> (\s*?) <ul>`), '$1') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ (\*+) (.+?) $`), (_, lvl, txt) => `${'<ul>'.repeat(lvl.length)}<li>${txt}</li>${'</ul>'.repeat(lvl.length)}`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `</ul> (\s*?) <ul>`), '$1') | ||
// Numbered list: #item | ||
.replace(re(r `^ (#+) (.+?) $`), (_, lvl, txt) => `${'<ol>'.repeat(lvl.length)}<li>${txt}</li>${'</ol>'.repeat(lvl.length)}`) | ||
.replace(re(r `</ol> (\s*?) <ol>`), '$1') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ (#+) (.+?) $`), (_, lvl, txt) => `${'<ol>'.repeat(lvl.length)}<li>${txt}</li>${'</ol>'.repeat(lvl.length)}`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `</ol> (\s*?) <ol>`), '$1') | ||
// Definition list: ;head, :item | ||
.replace(re(r `^ ; (.+) $`), '<dl><dt>$1</dt></dl>') | ||
.replace(re(r `^ (:+) (.+?) $`), (_, lvl, txt) => `${'<dl>'.repeat(lvl.length)}<dd>${txt}</dd>${'</dl>'.repeat(lvl.length)}`) | ||
.replace(re(r `</dl> (\s*?) <dl>`), '$1') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ ; (.+) $`), '<dl><dt>$1</dt></dl>') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ (:+) (.+?) $`), (_, lvl, txt) => `${'<dl>'.repeat(lvl.length)}<dd>${txt}</dd>${'</dl>'.repeat(lvl.length)}`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `</dl> (\s*?) <dl>`), '$1') | ||
// Tables: {|, |, |-, |} | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ \{\| (.*?) $`), (_, attrs) => `<table ${attrs}><tr>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ ! ([^]+?) (?= \n^[!|] )`), (_, content) => `<th>${content}</th>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ \|[^-}] ([^]*?) (?= \n^[!|] )`), (_, content) => `<td>${content}</td>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ \|- (.*?) $`), (_, attrs) => `</tr><tr ${attrs}>`) | ||
.replace(common_1.RegExpBuilder(common_1.RawString `^ \|\}`), `</tr></table>`) | ||
// References: <ref></ref>, <references/> | ||
.replace(re(r `<ref> (.+?) </ref>`), (_, text) => { | ||
.replace(common_1.RegExpBuilder(common_1.RawString `<ref> (.+?) </ref>`), (_, text) => { | ||
refs.push(text); | ||
@@ -149,6 +159,6 @@ refCount++; | ||
}) | ||
.replace(re(r `<references \s* /?>`), '<ol>' + refs.map((ref, i) => `<li id="ref-${+i + 1}"> <a href="#cite-${+i + 1}">ā</a> ${ref} </li>`).join('\n') + '</ol>') | ||
.replace(common_1.RegExpBuilder(common_1.RawString `<references \s* /?>`), '<ol>' + refs.map((ref, i) => `<li id="ref-${+i + 1}"> <a href="#cite-${+i + 1}">ā</a> ${ref} </li>`).join('\n') + '</ol>') | ||
// Nonstandard: ``code`` and ```code blocks``` | ||
.replace(re(r ` \`\`\` ([^\`]+?) \`\`\` `), '<pre>$1</pre>') | ||
.replace(re(r ` \`\` ([^\`]+?) \`\` `), '<code>$1</code>') | ||
.replace(common_1.RegExpBuilder(common_1.RawString ` \`\`\` ([^\`]+?) \`\`\` `), '<pre>$1</pre>') | ||
.replace(common_1.RegExpBuilder(common_1.RawString ` \`\` ([^\`]+?) \`\` `), '<code>$1</code>') | ||
// Spacing | ||
@@ -159,3 +169,3 @@ .replace(/(\r?\n){2}/g, '\n</p><p>\n') | ||
} | ||
let result = new types_1.Result(outText); | ||
let result = new common_1.Result(outText); | ||
result.metadata = metadata; | ||
@@ -162,0 +172,0 @@ return result; |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
34211
5
19
0
0
129
3
418
- Removednovasheets@1.0.0-pre3
- Removednovasheets@1.0.0-pre3(transitive)