@kenjura/ursa 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nvmrc +1 -0
- package/.vscode/launch.json +20 -0
- package/CHANGELOG.md +41 -0
- package/README.md +32 -0
- package/TODO.md +16 -0
- package/lib/index.js +9 -0
- package/meta/character-sheet/css/character-sheet.css +10 -0
- package/meta/character-sheet/js/components.js +37 -0
- package/meta/character-sheet/js/main.js +7 -0
- package/meta/character-sheet/js/model.js +15 -0
- package/meta/character-sheet-template.html +76 -0
- package/meta/character-sheet.css +50 -0
- package/meta/cssui.bundle.min.css +11 -0
- package/meta/default-template.html +22 -0
- package/meta/default.css +154 -0
- package/meta/goudy_bookletter_1911-webfont.woff +0 -0
- package/meta/template2.html +1 -0
- package/nodemon.json +16 -0
- package/package.json +48 -0
- package/src/commands/generate.js +25 -0
- package/src/helper/__test__/pathExtReader.test.js +38 -0
- package/src/helper/automenu.js +120 -0
- package/src/helper/fileRenderer.js +18 -0
- package/src/helper/filterAsync.js +5 -0
- package/src/helper/isDirectory.js +10 -0
- package/src/helper/markdownHelper.cjs +36 -0
- package/src/helper/metadataExtractor.js +30 -0
- package/src/helper/objToXml.js +20 -0
- package/src/helper/pathExtReader.js +12 -0
- package/src/helper/wikitextHelper.js +486 -0
- package/src/index-yargs.js +8 -0
- package/src/index.js +8 -0
- package/src/jobs/generate.js +266 -0
- package/src/serve.js +69 -0
- package/src/start.js +8 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import dirTree from "directory-tree";
|
|
2
|
+
import { extname, basename } from "path";
|
|
3
|
+
|
|
4
|
+
export async function getAutomenu(source) {
|
|
5
|
+
const tree = dirTree(source);
|
|
6
|
+
const menuItems = [];
|
|
7
|
+
|
|
8
|
+
/** order of menu items:
|
|
9
|
+
* - Home
|
|
10
|
+
* - Top-level folders A-Z
|
|
11
|
+
* - Top-level files A-Z
|
|
12
|
+
**/
|
|
13
|
+
|
|
14
|
+
menuItems.push({
|
|
15
|
+
path: "/",
|
|
16
|
+
name: "Home",
|
|
17
|
+
type: "file",
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const topLevelItems = tree.children.sort(childSorter);
|
|
21
|
+
const topLevelHtml = topLevelItems
|
|
22
|
+
.map((item) => renderMenuItem({ ...item, source }))
|
|
23
|
+
.join("");
|
|
24
|
+
|
|
25
|
+
return `<ul>${topLevelHtml}</ul>`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function renderMenuItem({ path, name, children, source }) {
|
|
29
|
+
const ext = extname(path);
|
|
30
|
+
const href = path.replace(source, "").replace(ext, "");
|
|
31
|
+
const label = basename(path, ext);
|
|
32
|
+
// const childMenuItems = Array.isArray(children)
|
|
33
|
+
// ? children
|
|
34
|
+
// .map((child) => renderMenuItem({ ...child, source }))
|
|
35
|
+
// .sort(menuItemSorter)
|
|
36
|
+
// : null;
|
|
37
|
+
const html = `
|
|
38
|
+
<li data-has-children="${!!children}">
|
|
39
|
+
<a href="/${href}">${label}</a>
|
|
40
|
+
${
|
|
41
|
+
children
|
|
42
|
+
? `<ul>
|
|
43
|
+
${children
|
|
44
|
+
.sort(childSorter)
|
|
45
|
+
.map((child) => renderMenuItem({ ...child, source }))
|
|
46
|
+
.join("")}
|
|
47
|
+
</ul>`
|
|
48
|
+
: ""
|
|
49
|
+
}
|
|
50
|
+
</li>`;
|
|
51
|
+
return html;
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
href,
|
|
55
|
+
label,
|
|
56
|
+
childMenuItems,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* example output:
|
|
61
|
+
* {
|
|
62
|
+
* href:'Foo/Bar',
|
|
63
|
+
* label:'Bar',
|
|
64
|
+
* childMenuItems: [thisObject]
|
|
65
|
+
* }
|
|
66
|
+
*/
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function childSorter(a, b) {
|
|
70
|
+
if (a.children && !b.children) return -1;
|
|
71
|
+
if (b.children && !a.children) return 1;
|
|
72
|
+
if (a.name > b.name) return 1;
|
|
73
|
+
if (a.name < b.name) return -1;
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function menuItemSorter(a, b) {
|
|
78
|
+
if (a.childMenuItems && !b.childMenuItems) return -1;
|
|
79
|
+
if (b.childMenuItems && !a.childMenuItems) return 1;
|
|
80
|
+
if (a.label > b.label) return 1;
|
|
81
|
+
if (a.label < b.label) return -1;
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function OLDgetAutomenu(source) {
|
|
86
|
+
const trimmedFilenames = allSourceFilenames.map((filename) => ({
|
|
87
|
+
filename: filename.replace(source, ""),
|
|
88
|
+
depth: filename.split("").filter((char) => char === "/").length,
|
|
89
|
+
}));
|
|
90
|
+
const sortedFilenames = [...trimmedFilenames].sort((a, b) => {
|
|
91
|
+
if (a.depth > b.depth) return 1;
|
|
92
|
+
if (a.depth < b.depth) return -1;
|
|
93
|
+
if (a.filename > b.filename) return 1;
|
|
94
|
+
if (a.filename < b.filename) return -1;
|
|
95
|
+
return 0;
|
|
96
|
+
});
|
|
97
|
+
const menuItems = sortedFilenames
|
|
98
|
+
.filter((filename) => filename.indexOf(".md") > -1)
|
|
99
|
+
.filter((filename) => filename.indexOf("menu.") === -1)
|
|
100
|
+
.map((filename) => {
|
|
101
|
+
const depthPrefix = filename
|
|
102
|
+
.split("")
|
|
103
|
+
.filter((char) => char === "/")
|
|
104
|
+
.map((char) => " ")
|
|
105
|
+
.join("");
|
|
106
|
+
const ext = extname(filename);
|
|
107
|
+
const articleName = basename(filename, ext);
|
|
108
|
+
const link = filename.replace(ext, "");
|
|
109
|
+
const menuItem = `${depthPrefix}+ [${articleName}](${link})`;
|
|
110
|
+
return menuItem;
|
|
111
|
+
});
|
|
112
|
+
return menuItems.join("\n");
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
+ [Home](/5e)
|
|
116
|
+
+ [Classes](/5e/Classes)
|
|
117
|
+
+ [Artificer](/5e/Classes/Artificer)
|
|
118
|
+
+ [Elementalist](/5e/Classes/Elementalist)
|
|
119
|
+
*/
|
|
120
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
|
|
2
|
+
import { markdownToHtml } from "./markdownHelper.cjs";
|
|
3
|
+
import { wikiToHtml } from "./wikitextHelper.js";
|
|
4
|
+
|
|
5
|
+
const DEFAULT_WIKITEXT_ARGS = { db: "noDB", noSection: true, noTOC: true };
|
|
6
|
+
|
|
7
|
+
export function renderFile({ fileContents, type, dirname, basename }) {
|
|
8
|
+
switch (type) {
|
|
9
|
+
case ".md":
|
|
10
|
+
return markdownToHtml(fileContents);
|
|
11
|
+
case ".txt":
|
|
12
|
+
return wikiToHtml({
|
|
13
|
+
wikitext: fileContents,
|
|
14
|
+
articleName: basename,
|
|
15
|
+
args: { ...DEFAULT_WIKITEXT_ARGS, db: dirname },
|
|
16
|
+
})?.html;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const markdown = require("markdown-it")({ html: true });
|
|
2
|
+
|
|
3
|
+
markdown.use(require("markdown-it-container"), "aside", getAside());
|
|
4
|
+
markdown.use(require("markdown-it-deflist"));
|
|
5
|
+
markdown.use(require("markdown-it-sup"));
|
|
6
|
+
markdown.use(require("markdown-it-front-matter"), handleFrontMatter);
|
|
7
|
+
|
|
8
|
+
module.exports = { markdownToHtml };
|
|
9
|
+
|
|
10
|
+
function markdownToHtml(md) {
|
|
11
|
+
return markdown.render(md);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function getAside() {
|
|
15
|
+
return {
|
|
16
|
+
validate: function (params) {
|
|
17
|
+
return true;
|
|
18
|
+
return params.trim().match(/^aside\s+(.*)$/);
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
render: function (tokens, idx) {
|
|
22
|
+
var m = tokens[idx].info.trim().match(/^aside\s+(.*)$/);
|
|
23
|
+
|
|
24
|
+
if (tokens[idx].nesting === 1) {
|
|
25
|
+
// opening tag
|
|
26
|
+
// return '<aside><summary>ASIDE' + m[1] + '</summary>\n';
|
|
27
|
+
return "<aside>\n";
|
|
28
|
+
} else {
|
|
29
|
+
// closing tag
|
|
30
|
+
return "</aside>\n";
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function handleFrontMatter(frontMatter) {}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { parse } from "yaml";
|
|
2
|
+
|
|
3
|
+
export function extractMetadata(rawBody) {
|
|
4
|
+
const frontMatter = matchFrontMatter(rawBody);
|
|
5
|
+
if (frontMatter === null) return null;
|
|
6
|
+
|
|
7
|
+
const parsedYml = parse(frontMatter);
|
|
8
|
+
return parsedYml;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function extractRawMetadata(rawBody) {
|
|
12
|
+
const frontMatter = matchAllFrontMatter(rawBody);
|
|
13
|
+
if (frontMatter === null) return null;
|
|
14
|
+
|
|
15
|
+
return frontMatter;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function matchFrontMatter(str) {
|
|
19
|
+
const match = str.match(/---(.*?)---/s);
|
|
20
|
+
if (Array.isArray(match) && match.length > 1) {
|
|
21
|
+
return match[1];
|
|
22
|
+
} else return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function matchAllFrontMatter(str) {
|
|
26
|
+
const match = str.match(/---(.*?)---\n+/s);
|
|
27
|
+
if (Array.isArray(match) && match.length > 0) {
|
|
28
|
+
return match[0];
|
|
29
|
+
} else return null;
|
|
30
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function objToXml(obj) {
|
|
2
|
+
var xml = "";
|
|
3
|
+
for (var prop in obj) {
|
|
4
|
+
xml += obj[prop] instanceof Array ? "" : "<" + prop + ">";
|
|
5
|
+
if (obj[prop] instanceof Array) {
|
|
6
|
+
for (var array in obj[prop]) {
|
|
7
|
+
xml += "<" + prop + ">";
|
|
8
|
+
xml += objToXml(new Object(obj[prop][array]));
|
|
9
|
+
xml += "</" + prop + ">";
|
|
10
|
+
}
|
|
11
|
+
} else if (typeof obj[prop] == "object") {
|
|
12
|
+
xml += objToXml(new Object(obj[prop]));
|
|
13
|
+
} else {
|
|
14
|
+
xml += obj[prop];
|
|
15
|
+
}
|
|
16
|
+
xml += obj[prop] instanceof Array ? "" : "</" + prop + ">";
|
|
17
|
+
}
|
|
18
|
+
var xml = xml.replace(/<\/?[0-9]{1,}>/g, "");
|
|
19
|
+
return xml;
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { extname } from "path";
|
|
2
|
+
|
|
3
|
+
export function hasExt(pathname) {
|
|
4
|
+
const ext = extname(pathname);
|
|
5
|
+
console.log({
|
|
6
|
+
pathname,
|
|
7
|
+
ext,
|
|
8
|
+
result: ext === "" || ext === "." ? false : true,
|
|
9
|
+
});
|
|
10
|
+
if (ext === "" || ext === ".") return false;
|
|
11
|
+
else return true;
|
|
12
|
+
}
|