diff options
author | Minteck <contact@minteck.org> | 2022-03-27 21:38:06 +0200 |
---|---|---|
committer | Minteck <contact@minteck.org> | 2022-03-27 21:38:06 +0200 |
commit | fb988285a3fdc5b9e6c6656d4c79855bed80e106 (patch) | |
tree | 8008887b2a9039f2f2868138cb54fee053eadebd | |
parent | bbda65e16248afe21338f6bdf008ec88fa308c75 (diff) | |
download | cobalt-fb988285a3fdc5b9e6c6656d4c79855bed80e106.tar.gz cobalt-fb988285a3fdc5b9e6c6656d4c79855bed80e106.tar.bz2 cobalt-fb988285a3fdc5b9e6c6656d4c79855bed80e106.zip |
Commit
-rw-r--r-- | .DS_Store | bin | 0 -> 8196 bytes | |||
-rw-r--r-- | .gitignore | 8 | ||||
-rw-r--r-- | .idea/.gitignore | 10 | ||||
-rw-r--r-- | .idea/DocCMS.iml | 22 | ||||
-rw-r--r-- | .idea/deployment.xml | 26 | ||||
-rw-r--r-- | .idea/jsLibraryMappings.xml | 10 | ||||
-rw-r--r-- | .idea/modules.xml | 14 | ||||
-rw-r--r-- | .idea/vcs.xml | 10 | ||||
-rw-r--r-- | config.default.yml | 146 | ||||
-rw-r--r-- | index.js | 494 | ||||
-rw-r--r-- | modules/publishtag.js | 58 | ||||
-rw-r--r-- | modules/removesm.js | 66 | ||||
-rw-r--r-- | modules/removesubsm.js | 66 | ||||
-rw-r--r-- | modules/uniqueid.js | 90 | ||||
-rw-r--r-- | node_modules/.bin/ejs.cmd | 34 | ||||
-rw-r--r-- | node_modules/.bin/jake.cmd | 34 | ||||
-rw-r--r-- | node_modules/.bin/markdown-it.cmd | 34 | ||||
-rw-r--r-- | node_modules/color-name/.npmignore | 212 | ||||
-rw-r--r-- | node_modules/color-name/LICENSE | 14 | ||||
-rw-r--r-- | node_modules/color-name/README.md | 22 | ||||
-rw-r--r-- | node_modules/color-name/index.js | 304 | ||||
-rw-r--r-- | node_modules/color-name/test.js | 14 | ||||
-rw-r--r-- | templates/footer.ejs | 16 | ||||
-rw-r--r-- | templates/header.ejs | 24 |
24 files changed, 864 insertions, 864 deletions
diff --git a/.DS_Store b/.DS_Store Binary files differnew file mode 100644 index 0000000..ca275c7 --- /dev/null +++ b/.DS_Store @@ -1,5 +1,5 @@ -cache -data -data.old -output +cache
+data
+data.old
+output
config.yml
\ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore index b58b603..ea7ed09 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,5 +1,5 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ +# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/DocCMS.iml b/.idea/DocCMS.iml index 0c8867d..ff88395 100644 --- a/.idea/DocCMS.iml +++ b/.idea/DocCMS.iml @@ -1,12 +1,12 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module type="WEB_MODULE" version="4"> - <component name="NewModuleRootManager"> - <content url="file://$MODULE_DIR$"> - <excludeFolder url="file://$MODULE_DIR$/temp" /> - <excludeFolder url="file://$MODULE_DIR$/.tmp" /> - <excludeFolder url="file://$MODULE_DIR$/tmp" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
</module>
\ No newline at end of file diff --git a/.idea/deployment.xml b/.idea/deployment.xml index 1436779..d17d44e 100644 --- a/.idea/deployment.xml +++ b/.idea/deployment.xml @@ -1,14 +1,14 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false"> - <serverData> - <paths name="Familine"> - <serverdata> - <mappings> - <mapping local="$PROJECT_DIR$" web="/" /> - </mappings> - </serverdata> - </paths> - </serverData> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
+ <serverData>
+ <paths name="Familine">
+ <serverdata>
+ <mappings>
+ <mapping local="$PROJECT_DIR$" web="/" />
+ </mappings>
+ </serverdata>
+ </paths>
+ </serverData>
+ </component>
</project>
\ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml index d23208f..63326a8 100644 --- a/.idea/jsLibraryMappings.xml +++ b/.idea/jsLibraryMappings.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="JavaScriptLibraryMappings"> - <includedPredefinedLibrary name="Node.js Core" /> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="JavaScriptLibraryMappings">
+ <includedPredefinedLibrary name="Node.js Core" />
+ </component>
</project>
\ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 3498600..14094a0 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/.idea/DocCMS.iml" filepath="$PROJECT_DIR$/.idea/DocCMS.iml" /> - </modules> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/DocCMS.iml" filepath="$PROJECT_DIR$/.idea/DocCMS.iml" />
+ </modules>
+ </component>
</project>
\ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..9661ac7 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$" vcs="Git" /> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
+ </component>
</project>
\ No newline at end of file diff --git a/config.default.yml b/config.default.yml index 7c34f43..c5d793a 100644 --- a/config.default.yml +++ b/config.default.yml @@ -1,74 +1,74 @@ -# ------------------------------------ -# -# ______ __ ____ -# / ____/___ / /_ ____ _/ / /_ -# / / / __ \/ __ \/ __ `/ / __/ -# / /___/ /_/ / /_/ / /_/ / / /_ -# \____/\____/_.___/\__,_/_/\__/ -# -# ------------------------------------ - -# A powerful, static and extensible CMS - -# Do you want a more user-friendly CMS? -# You might want to check out Neutron: -# https://gitlab.minteck.org/minteck/neutron - -# This is the Cobalt configuration file. -# Make sure this file is named 'config.yml' and not -# 'config.default.yml', as you don't need to edit -# the default configuration file. - -# How pages ID are constructed? -# ----------------------------- -# This will affect the generated HTML archive. -# All of these methods are cryptographically secure -# -# WARNING: the 'sha256' method might not work due to -# your filesystem's filename length limit. Use with -# caution -# -# Allowed values: -# - sha256: SHA-256 sum-based page IDs -# - snowflake: filename-based page IDs (default) -# - md5: MD5 sum-based page IDs -pages_id_generator: snowflake - -# Conditional publishing -# ---------------------- -# (thanks to antoine62 for the feature request) -# -# If enabled, Cobalt will detect if the 'publish' -# parameter in your Markdown's file frontmatter -# equals true. If (and only if) this condition is -# met, the file will be added. -# -# This doesn't affect folder index. -conditional_publishing: false - -# Classes for various HTML elements -# --------------------------------- -# If you import some custom CSS (such as Bootstrap), -# you might want to add custom DOM classes to generated -# HTML. -# -# Only the DOM elements mentioned below are supported by -# Cobalt. Use custom CSS to style the others. -classes: - main: [] - footer: [] - article: [] - header: [] - body: [] - html: [] - -# Additional JS/CSS imports -# ------------------------- -# Add URLs to JS or CSS files that will be imported into -# the generated HTML document. -# -# The JS file is imported on <head>, so you need to use -# document.addEventListener('load', ...) -imports: - css: [] +# ------------------------------------
+#
+# ______ __ ____
+# / ____/___ / /_ ____ _/ / /_
+# / / / __ \/ __ \/ __ `/ / __/
+# / /___/ /_/ / /_/ / /_/ / / /_
+# \____/\____/_.___/\__,_/_/\__/
+#
+# ------------------------------------
+
+# A powerful, static and extensible CMS
+
+# Do you want a more user-friendly CMS?
+# You might want to check out Neutron:
+# https://gitlab.minteck.org/minteck/neutron
+
+# This is the Cobalt configuration file.
+# Make sure this file is named 'config.yml' and not
+# 'config.default.yml', as you don't need to edit
+# the default configuration file.
+
+# How pages ID are constructed?
+# -----------------------------
+# This will affect the generated HTML archive.
+# All of these methods are cryptographically secure
+#
+# WARNING: the 'sha256' method might not work due to
+# your filesystem's filename length limit. Use with
+# caution
+#
+# Allowed values:
+# - sha256: SHA-256 sum-based page IDs
+# - snowflake: filename-based page IDs (default)
+# - md5: MD5 sum-based page IDs
+pages_id_generator: snowflake
+
+# Conditional publishing
+# ----------------------
+# (thanks to antoine62 for the feature request)
+#
+# If enabled, Cobalt will detect if the 'publish'
+# parameter in your Markdown's file frontmatter
+# equals true. If (and only if) this condition is
+# met, the file will be added.
+#
+# This doesn't affect folder index.
+conditional_publishing: false
+
+# Classes for various HTML elements
+# ---------------------------------
+# If you import some custom CSS (such as Bootstrap),
+# you might want to add custom DOM classes to generated
+# HTML.
+#
+# Only the DOM elements mentioned below are supported by
+# Cobalt. Use custom CSS to style the others.
+classes:
+ main: []
+ footer: []
+ article: []
+ header: []
+ body: []
+ html: []
+
+# Additional JS/CSS imports
+# -------------------------
+# Add URLs to JS or CSS files that will be imported into
+# the generated HTML document.
+#
+# The JS file is imported on <head>, so you need to use
+# document.addEventListener('load', ...)
+imports:
+ css: []
js: []
\ No newline at end of file @@ -1,248 +1,248 @@ -/* - * MIT License - * - * Copyright (c) 2022- Minteck - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -global.version = "1.3"; - -const YAML = require('yaml'); -const ejs = require('ejs'); - -const fs = require('fs'); -const path = require('path'); -const md = require('markdown-it')("commonmark", { - html: true, - linkify: true, - typographer: true -}); - -const uniqueid = require('./modules/uniqueid'); -const containsPublishTag = require('./modules/publishtag'); -const removeFromSitemap = require('./modules/removesm'); - -if (!fs.existsSync("./config.yml")) fs.copyFileSync("./config.default.yml", "./config.yml"); -if (!fs.existsSync("./data")) fs.mkdirSync("./data"); - -if (fs.readdirSync("./data").length < 1) { - console.log("Your data folder is empty, add at least one Markdown file and start the rendering process again."); - process.exit(1); -} - -global.config = YAML.parse(fs.readFileSync("./config.yml").toString()); -global.config._version = global.version; - -global.files = []; -global.directories = []; -global.sitemap = ""; - -global.afiles = []; -global.adirectories = []; -global.asitemap = ""; -global.sitemaps = {}; - -function analyze(dir, levels) { - let dfiles = fs.readdirSync(dir); - - for (let file of dfiles) { - if (fs.lstatSync(dir + "/" + file).isDirectory()) { - id = uniqueid(dir + "/" + file) - directories.push({ - source: dir + "/" + file, - dest: "./output/" + id, - name: file, - id - }) - sitemap = sitemap + "\n" + " ".repeat(levels - 1) + "* [" + file + "](./" + id + "/index.html)"; - analyze(dir + "/" + file, levels + 1); - } else if (file.endsWith(".md")) { - if (!config.conditional_publishing || containsPublishTag(dir + "/" + file)) { - if (path.basename(file) === "index.md") { - if (dir === "./data") { - id = uniqueid(dir + "/" + file) - files.push({ - source: dir + "/" + file, - dest: "./output/index.html", - name: file, - id, - parent: { - path: "./index.html", - name: "index" - } - }) - } else { - id = uniqueid(dir + "/" + file) - files.push({ - source: dir + "/" + file, - dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", - name: file, - id, - parent: { - path: "./index.html", - name: "index" - } - }) - } - } else { - id = uniqueid(dir + "/" + file) - files.push({ - source: dir + "/" + file, - dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html", - name: file, - id, - parent: { - path: "./" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", - name: path.basename(path.dirname(dir + "/" + file)) - } - }) - sitemap = sitemap + "\n" + " ".repeat(levels - 1) + "* [" + file.substring(0, file.length - 3) + "](./" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html)"; - } - } - } - } -} - -function aanalyze(dir, levels) { - let dfiles = fs.readdirSync(dir); - - for (let file of dfiles) { - if (fs.lstatSync(dir + "/" + file).isDirectory()) { - id = uniqueid(dir + "/" + file) - adirectories.push({ - source: dir + "/" + file, - dest: "./output/" + id, - name: file, - id - }) - asitemap = asitemap + "\n" + " ".repeat(levels - 1) + "* [" + file + "](../" + id + "/index.html)"; - aanalyze(dir + "/" + file, levels + 1); - } else if (file.endsWith(".md")) { - if (!config.conditional_publishing || containsPublishTag(dir + "/" + file)) { - if (path.basename(file) === "index.md") { - id = uniqueid(dir + "/" + file) - afiles.push({ - source: dir + "/" + file, - dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", - name: file, - id, - parent: { - path: "./index.html", - name: "index" - } - }) - } else { - id = uniqueid(dir + "/" + file) - afiles.push({ - source: dir + "/" + file, - dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html", - name: file, - id, - parent: { - path: "./" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html", - name: path.basename(path.dirname(dir + "/" + file)) - } - }) - asitemap = asitemap + "\n" + " ".repeat(levels - 1) + "* [" + file.substring(0, file.length - 3) + "](../" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html)"; - } - } - } - } -} - -console.log("Preparing output directory..."); - -if (fs.existsSync("./output")) fs.rmSync("./output", { recursive: true }); -fs.mkdirSync("./output"); - -if (fs.existsSync("./cache")) fs.rmSync("./cache", { recursive: true }); -fs.mkdirSync("./cache"); - -console.log("Analyzing..."); -analyze("./data", 1); - -fs.writeFileSync("./cache/map.json", JSON.stringify({ - files, - directories -}, false, 4)); - -fs.writeFileSync("./cache/navigation.md", sitemap); - -console.log("Creating required directories..."); -for (let dir of directories) { - fs.mkdirSync(dir.dest); -} - -console.log("Loading templates..."); -header = fs.readFileSync("./templates/header.ejs").toString(); -footer = fs.readFileSync("./templates/footer.ejs").toString(); - -console.log("Generating sitemaps for every directory..."); -for (let dir of directories) { - global.afiles = []; - global.adirectories = []; - global.asitemap = ""; - aanalyze(dir.source, 1); - fs.writeFileSync("./cache/navigation-" + uniqueid(dir.source) + ".md", asitemap); - fs.writeFileSync("./cache/map-" + uniqueid(dir.source) + ".json", JSON.stringify({ - afiles, - adirectories - }, false, 4)); - sitemaps[uniqueid(dir.source)] = asitemap; -} - -console.log("Rendering pages..."); -for (let page of files) { - content = md.render(fs.readFileSync(page.source).toString().replace(/---\n((.|\n)*)\n---/gm, "").trim()); - if (!fs.existsSync(path.dirname(page.dest))) fs.mkdirSync(path.dirname(page.dest)); - fs.writeFileSync(page.dest, ejs.render(header, {config, name: page.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"." + page.parent.path + "\">« " + page.parent.name + "</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + content + "</article>" + ejs.render(footer, {config, name: page.name})); -} - -console.log("Generating home page..."); -if (fs.existsSync("./data/index.md")) { - content = md.render(fs.readFileSync("./data/index.md").toString().replace(/---\n((.|\n)*)\n---/gm, "").trim()) + "<hr>"; -} else { - content = ""; -} -fs.writeFileSync("./output/index.html", ejs.render(header, {config, name: "Home"}) + "<header class=\"" + config.classes.header.join(" ") + "\">Home<hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + content + md.render(sitemap) + "</article>" + ejs.render(footer, {config, name: "Home"})); - -console.log("Generating missing index files..."); -for (let dir of directories) { - if (!fs.existsSync(dir.dest + "/index.html")) { - if (sitemaps[dir.id].trim() !== "") { - fs.writeFileSync(dir.dest + "/index.html", ejs.render(header, {config, name: dir.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"../index.html\">« index</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + md.render(sitemaps[dir.id]) + "</article>" + ejs.render(footer, {config, name: dir.name})); - } else { - removeFromSitemap(dir.id); - console.log("Generating home page..."); - if (fs.existsSync("./data/index.md")) { - content = md.render(fs.readFileSync("./data/index.md").toString().replace(/---\n((.|\n)*)\n---/gm, "").trim()) + "<hr>"; - } else { - content = ""; - } - fs.writeFileSync("./output/index.html", ejs.render(header, {config, name: "Home"}) + "<header class=\"" + config.classes.header.join(" ") + "\">Home<hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + content + md.render(sitemap) + "</article>" + ejs.render(footer, {config, name: "Home"})); - fs.writeFileSync(dir.dest + "/index.html", ejs.render(header, {config, name: dir.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"../index.html\">« index</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\"><p><i>This folder is empty</i></p></article>" + ejs.render(footer, {config, name: dir.name})); - } - } else { - if (sitemaps[dir.id].trim() !== "") { - fs.writeFileSync(dir.dest + "/index.html", ejs.render(header, {config, name: dir.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"../index.html\">« index</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + md.render(fs.readFileSync(dir.source + "/index.md").toString().replace(/---\n((.|\n)*)\n---/gm, "").trim()) + "<hr>" + md.render(sitemaps[dir.id]) + "</article>" + ejs.render(footer, {config, name: dir.name})); - } - } +/*
+ * MIT License
+ *
+ * Copyright (c) 2022- Minteck
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+global.version = "1.3";
+
+const YAML = require('yaml');
+const ejs = require('ejs');
+
+const fs = require('fs');
+const path = require('path');
+const md = require('markdown-it')("commonmark", {
+ html: true,
+ linkify: true,
+ typographer: true
+});
+
+const uniqueid = require('./modules/uniqueid');
+const containsPublishTag = require('./modules/publishtag');
+const removeFromSitemap = require('./modules/removesm');
+
+if (!fs.existsSync("./config.yml")) fs.copyFileSync("./config.default.yml", "./config.yml");
+if (!fs.existsSync("./data")) fs.mkdirSync("./data");
+
+if (fs.readdirSync("./data").length < 1) {
+ console.log("Your data folder is empty, add at least one Markdown file and start the rendering process again.");
+ process.exit(1);
+}
+
+global.config = YAML.parse(fs.readFileSync("./config.yml").toString());
+global.config._version = global.version;
+
+global.files = [];
+global.directories = [];
+global.sitemap = "";
+
+global.afiles = [];
+global.adirectories = [];
+global.asitemap = "";
+global.sitemaps = {};
+
+function analyze(dir, levels) {
+ let dfiles = fs.readdirSync(dir);
+
+ for (let file of dfiles) {
+ if (fs.lstatSync(dir + "/" + file).isDirectory()) {
+ id = uniqueid(dir + "/" + file)
+ directories.push({
+ source: dir + "/" + file,
+ dest: "./output/" + id,
+ name: file,
+ id
+ })
+ sitemap = sitemap + "\n" + " ".repeat(levels - 1) + "* [" + file + "](./" + id + "/index.html)";
+ analyze(dir + "/" + file, levels + 1);
+ } else if (file.endsWith(".md")) {
+ if (!config.conditional_publishing || containsPublishTag(dir + "/" + file)) {
+ if (path.basename(file) === "index.md") {
+ if (dir === "./data") {
+ id = uniqueid(dir + "/" + file)
+ files.push({
+ source: dir + "/" + file,
+ dest: "./output/index.html",
+ name: file,
+ id,
+ parent: {
+ path: "./index.html",
+ name: "index"
+ }
+ })
+ } else {
+ id = uniqueid(dir + "/" + file)
+ files.push({
+ source: dir + "/" + file,
+ dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html",
+ name: file,
+ id,
+ parent: {
+ path: "./index.html",
+ name: "index"
+ }
+ })
+ }
+ } else {
+ id = uniqueid(dir + "/" + file)
+ files.push({
+ source: dir + "/" + file,
+ dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html",
+ name: file,
+ id,
+ parent: {
+ path: "./" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html",
+ name: path.basename(path.dirname(dir + "/" + file))
+ }
+ })
+ sitemap = sitemap + "\n" + " ".repeat(levels - 1) + "* [" + file.substring(0, file.length - 3) + "](./" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html)";
+ }
+ }
+ }
+ }
+}
+
+function aanalyze(dir, levels) {
+ let dfiles = fs.readdirSync(dir);
+
+ for (let file of dfiles) {
+ if (fs.lstatSync(dir + "/" + file).isDirectory()) {
+ id = uniqueid(dir + "/" + file)
+ adirectories.push({
+ source: dir + "/" + file,
+ dest: "./output/" + id,
+ name: file,
+ id
+ })
+ asitemap = asitemap + "\n" + " ".repeat(levels - 1) + "* [" + file + "](../" + id + "/index.html)";
+ aanalyze(dir + "/" + file, levels + 1);
+ } else if (file.endsWith(".md")) {
+ if (!config.conditional_publishing || containsPublishTag(dir + "/" + file)) {
+ if (path.basename(file) === "index.md") {
+ id = uniqueid(dir + "/" + file)
+ afiles.push({
+ source: dir + "/" + file,
+ dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html",
+ name: file,
+ id,
+ parent: {
+ path: "./index.html",
+ name: "index"
+ }
+ })
+ } else {
+ id = uniqueid(dir + "/" + file)
+ afiles.push({
+ source: dir + "/" + file,
+ dest: "./output/" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html",
+ name: file,
+ id,
+ parent: {
+ path: "./" + uniqueid(path.dirname(dir + "/" + file)) + "/index.html",
+ name: path.basename(path.dirname(dir + "/" + file))
+ }
+ })
+ asitemap = asitemap + "\n" + " ".repeat(levels - 1) + "* [" + file.substring(0, file.length - 3) + "](../" + uniqueid(path.dirname(dir + "/" + file)) + "/" + id + ".html)";
+ }
+ }
+ }
+ }
+}
+
+console.log("Preparing output directory...");
+
+if (fs.existsSync("./output")) fs.rmSync("./output", { recursive: true });
+fs.mkdirSync("./output");
+
+if (fs.existsSync("./cache")) fs.rmSync("./cache", { recursive: true });
+fs.mkdirSync("./cache");
+
+console.log("Analyzing...");
+analyze("./data", 1);
+
+fs.writeFileSync("./cache/map.json", JSON.stringify({
+ files,
+ directories
+}, false, 4));
+
+fs.writeFileSync("./cache/navigation.md", sitemap);
+
+console.log("Creating required directories...");
+for (let dir of directories) {
+ fs.mkdirSync(dir.dest);
+}
+
+console.log("Loading templates...");
+header = fs.readFileSync("./templates/header.ejs").toString();
+footer = fs.readFileSync("./templates/footer.ejs").toString();
+
+console.log("Generating sitemaps for every directory...");
+for (let dir of directories) {
+ global.afiles = [];
+ global.adirectories = [];
+ global.asitemap = "";
+ aanalyze(dir.source, 1);
+ fs.writeFileSync("./cache/navigation-" + uniqueid(dir.source) + ".md", asitemap);
+ fs.writeFileSync("./cache/map-" + uniqueid(dir.source) + ".json", JSON.stringify({
+ afiles,
+ adirectories
+ }, false, 4));
+ sitemaps[uniqueid(dir.source)] = asitemap;
+}
+
+console.log("Rendering pages...");
+for (let page of files) {
+ content = md.render(fs.readFileSync(page.source).toString().replace(/---\n((.|\n)*)\n---/gm, "").trim());
+ if (!fs.existsSync(path.dirname(page.dest))) fs.mkdirSync(path.dirname(page.dest));
+ fs.writeFileSync(page.dest, ejs.render(header, {config, name: page.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"." + page.parent.path + "\">« " + page.parent.name + "</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + content + "</article>" + ejs.render(footer, {config, name: page.name}));
+}
+
+console.log("Generating home page...");
+if (fs.existsSync("./data/index.md")) {
+ content = md.render(fs.readFileSync("./data/index.md").toString().replace(/---\n((.|\n)*)\n---/gm, "").trim()) + "<hr>";
+} else {
+ content = "";
+}
+fs.writeFileSync("./output/index.html", ejs.render(header, {config, name: "Home"}) + "<header class=\"" + config.classes.header.join(" ") + "\">Home<hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + content + md.render(sitemap) + "</article>" + ejs.render(footer, {config, name: "Home"}));
+
+console.log("Generating missing index files...");
+for (let dir of directories) {
+ if (!fs.existsSync(dir.dest + "/index.html")) {
+ if (sitemaps[dir.id].trim() !== "") {
+ fs.writeFileSync(dir.dest + "/index.html", ejs.render(header, {config, name: dir.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"../index.html\">« index</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + md.render(sitemaps[dir.id]) + "</article>" + ejs.render(footer, {config, name: dir.name}));
+ } else {
+ removeFromSitemap(dir.id);
+ console.log("Generating home page...");
+ if (fs.existsSync("./data/index.md")) {
+ content = md.render(fs.readFileSync("./data/index.md").toString().replace(/---\n((.|\n)*)\n---/gm, "").trim()) + "<hr>";
+ } else {
+ content = "";
+ }
+ fs.writeFileSync("./output/index.html", ejs.render(header, {config, name: "Home"}) + "<header class=\"" + config.classes.header.join(" ") + "\">Home<hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + content + md.render(sitemap) + "</article>" + ejs.render(footer, {config, name: "Home"}));
+ fs.writeFileSync(dir.dest + "/index.html", ejs.render(header, {config, name: dir.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"../index.html\">« index</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\"><p><i>This folder is empty</i></p></article>" + ejs.render(footer, {config, name: dir.name}));
+ }
+ } else {
+ if (sitemaps[dir.id].trim() !== "") {
+ fs.writeFileSync(dir.dest + "/index.html", ejs.render(header, {config, name: dir.name}) + "<header class=\"" + config.classes.header.join(" ") + "\"><a href=\"../index.html\">« index</a><hr></header><article class=\"" + config.classes.article.join(" ") + "\">" + md.render(fs.readFileSync(dir.source + "/index.md").toString().replace(/---\n((.|\n)*)\n---/gm, "").trim()) + "<hr>" + md.render(sitemaps[dir.id]) + "</article>" + ejs.render(footer, {config, name: dir.name}));
+ }
+ }
}
\ No newline at end of file diff --git a/modules/publishtag.js b/modules/publishtag.js index 314ac2b..7d6ef3c 100644 --- a/modules/publishtag.js +++ b/modules/publishtag.js @@ -1,30 +1,30 @@ -/* - * MIT License - * - * Copyright (c) 2022- Minteck - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -const fs = require('fs'); - -module.exports = (file) => { - return fs.readFileSync(file).toString().match(/---\n((.|\n)*)publish( *):( *)true\n(.*)---/gm) +/*
+ * MIT License
+ *
+ * Copyright (c) 2022- Minteck
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+const fs = require('fs');
+
+module.exports = (file) => {
+ return fs.readFileSync(file).toString().match(/---\n((.|\n)*)publish( *):( *)true\n(.*)---/gm)
}
\ No newline at end of file diff --git a/modules/removesm.js b/modules/removesm.js index 769a346..ecbe025 100644 --- a/modules/removesm.js +++ b/modules/removesm.js @@ -1,34 +1,34 @@ -/* - * MIT License - * - * Copyright (c) 2022- Minteck - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -module.exports = (id) => { - lines = sitemap.split("\n"); - for (let index in lines) { - if (lines[index].includes(id)) { - delete lines[index]; - } - } - global.sitemap = lines.filter(i => i).join("\n"); +/*
+ * MIT License
+ *
+ * Copyright (c) 2022- Minteck
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+module.exports = (id) => {
+ lines = sitemap.split("\n");
+ for (let index in lines) {
+ if (lines[index].includes(id)) {
+ delete lines[index];
+ }
+ }
+ global.sitemap = lines.filter(i => i).join("\n");
}
\ No newline at end of file diff --git a/modules/removesubsm.js b/modules/removesubsm.js index d5b1724..3cc126b 100644 --- a/modules/removesubsm.js +++ b/modules/removesubsm.js @@ -1,34 +1,34 @@ -/* - * MIT License - * - * Copyright (c) 2022- Minteck - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -module.exports = (rid, sid) => { - lines = sitemaps[sid].split("\n"); - for (let index in lines) { - if (lines[index].includes(id)) { - delete lines[index]; - } - } - global.sitemaps[sid] = lines.filter(i => i).join("\n"); +/*
+ * MIT License
+ *
+ * Copyright (c) 2022- Minteck
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+module.exports = (rid, sid) => {
+ lines = sitemaps[sid].split("\n");
+ for (let index in lines) {
+ if (lines[index].includes(id)) {
+ delete lines[index];
+ }
+ }
+ global.sitemaps[sid] = lines.filter(i => i).join("\n");
}
\ No newline at end of file diff --git a/modules/uniqueid.js b/modules/uniqueid.js index e1b7581..b6794e2 100644 --- a/modules/uniqueid.js +++ b/modules/uniqueid.js @@ -1,46 +1,46 @@ -/* - * MIT License - * - * Copyright (c) 2022- Minteck - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -const crypto = require('crypto'); - -module.exports = function DocCMSUniqueID(file) { - if (typeof file !== "undefined") { - salt = file; - } else { - salt = crypto.randomBytes(64).toString("hex"); - } - - switch (config.pages_id_generator) { - case "snowflake": - default: - return parseInt(crypto.createHash("sha512").update(salt, "utf-8").digest("hex").substring(0, 16), 16).toString().substring(0, 18); - - case "md5": - return crypto.createHash("md5").update(salt, "utf-8").digest("hex"); - - case "sha256": - return crypto.createHash("sha256").update(salt, "utf-8").digest("hex"); - } +/*
+ * MIT License
+ *
+ * Copyright (c) 2022- Minteck
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+const crypto = require('crypto');
+
+module.exports = function DocCMSUniqueID(file) {
+ if (typeof file !== "undefined") {
+ salt = file;
+ } else {
+ salt = crypto.randomBytes(64).toString("hex");
+ }
+
+ switch (config.pages_id_generator) {
+ case "snowflake":
+ default:
+ return parseInt(crypto.createHash("sha512").update(salt, "utf-8").digest("hex").substring(0, 16), 16).toString().substring(0, 18);
+
+ case "md5":
+ return crypto.createHash("md5").update(salt, "utf-8").digest("hex");
+
+ case "sha256":
+ return crypto.createHash("sha256").update(salt, "utf-8").digest("hex");
+ }
}
\ No newline at end of file diff --git a/node_modules/.bin/ejs.cmd b/node_modules/.bin/ejs.cmd index 7cc2b56..32cac31 100644 --- a/node_modules/.bin/ejs.cmd +++ b/node_modules/.bin/ejs.cmd @@ -1,17 +1,17 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\ejs\bin\cli.js" %* +@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\ejs\bin\cli.js" %*
diff --git a/node_modules/.bin/jake.cmd b/node_modules/.bin/jake.cmd index 1ccccef..45b0465 100644 --- a/node_modules/.bin/jake.cmd +++ b/node_modules/.bin/jake.cmd @@ -1,17 +1,17 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\jake\bin\cli.js" %* +@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\jake\bin\cli.js" %*
diff --git a/node_modules/.bin/markdown-it.cmd b/node_modules/.bin/markdown-it.cmd index 480092d..f075e0d 100644 --- a/node_modules/.bin/markdown-it.cmd +++ b/node_modules/.bin/markdown-it.cmd @@ -1,17 +1,17 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\markdown-it\bin\markdown-it.js" %* +@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+ SET "_prog=%dp0%\node.exe"
+) ELSE (
+ SET "_prog=node"
+ SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\markdown-it\bin\markdown-it.js" %*
diff --git a/node_modules/color-name/.npmignore b/node_modules/color-name/.npmignore index 3854c07..f9f2816 100644 --- a/node_modules/color-name/.npmignore +++ b/node_modules/color-name/.npmignore @@ -1,107 +1,107 @@ -//this will affect all the git repos -git config --global core.excludesfile ~/.gitignore - - -//update files since .ignore won't if already tracked -git rm --cached <file> - -# Compiled source # -################### -*.com -*.class -*.dll -*.exe -*.o -*.so - -# Packages # -############ -# it's better to unpack these files and commit the raw source -# git has its own built in compression methods -*.7z -*.dmg -*.gz -*.iso -*.jar -*.rar -*.tar -*.zip - -# Logs and databases # -###################### -*.log -*.sql -*.sqlite - -# OS generated files # -###################### -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -# Icon? -ehthumbs.db -Thumbs.db -.cache -.project -.settings -.tmproj -*.esproj -nbproject - -# Numerous always-ignore extensions # -##################################### -*.diff -*.err -*.orig -*.rej -*.swn -*.swo -*.swp -*.vi -*~ -*.sass-cache -*.grunt -*.tmp - -# Dreamweaver added files # -########################### -_notes -dwsync.xml - -# Komodo # -########################### -*.komodoproject -.komodotools - -# Node # -##################### -node_modules - -# Bower # -##################### -bower_components - -# Folders to ignore # -##################### -.hg -.svn -.CVS -intermediate -publish -.idea -.graphics -_test -_archive -uploads -tmp - -# Vim files to ignore # -####################### -.VimballRecord -.netrwhist - -bundle.* - +//this will affect all the git repos
+git config --global core.excludesfile ~/.gitignore
+
+
+//update files since .ignore won't if already tracked
+git rm --cached <file>
+
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.exe
+*.o
+*.so
+
+# Packages #
+############
+# it's better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+# Icon?
+ehthumbs.db
+Thumbs.db
+.cache
+.project
+.settings
+.tmproj
+*.esproj
+nbproject
+
+# Numerous always-ignore extensions #
+#####################################
+*.diff
+*.err
+*.orig
+*.rej
+*.swn
+*.swo
+*.swp
+*.vi
+*~
+*.sass-cache
+*.grunt
+*.tmp
+
+# Dreamweaver added files #
+###########################
+_notes
+dwsync.xml
+
+# Komodo #
+###########################
+*.komodoproject
+.komodotools
+
+# Node #
+#####################
+node_modules
+
+# Bower #
+#####################
+bower_components
+
+# Folders to ignore #
+#####################
+.hg
+.svn
+.CVS
+intermediate
+publish
+.idea
+.graphics
+_test
+_archive
+uploads
+tmp
+
+# Vim files to ignore #
+#######################
+.VimballRecord
+.netrwhist
+
+bundle.*
+
_demo
\ No newline at end of file diff --git a/node_modules/color-name/LICENSE b/node_modules/color-name/LICENSE index 4d9802a..c6b1001 100644 --- a/node_modules/color-name/LICENSE +++ b/node_modules/color-name/LICENSE @@ -1,8 +1,8 @@ -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +The MIT License (MIT)
+Copyright (c) 2015 Dmitry Ivanov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file diff --git a/node_modules/color-name/README.md b/node_modules/color-name/README.md index 3611a6b..932b979 100644 --- a/node_modules/color-name/README.md +++ b/node_modules/color-name/README.md @@ -1,11 +1,11 @@ -A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors. - -[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/) - - -```js -var colors = require('color-name'); -colors.red //[255,0,0] -``` - -<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a> +A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.
+
+[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)
+
+
+```js
+var colors = require('color-name');
+colors.red //[255,0,0]
+```
+
+<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>
diff --git a/node_modules/color-name/index.js b/node_modules/color-name/index.js index e42aa68..b7c198a 100644 --- a/node_modules/color-name/index.js +++ b/node_modules/color-name/index.js @@ -1,152 +1,152 @@ -'use strict' - -module.exports = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; +'use strict'
+
+module.exports = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
+};
diff --git a/node_modules/color-name/test.js b/node_modules/color-name/test.js index 7a08746..6e6bf30 100644 --- a/node_modules/color-name/test.js +++ b/node_modules/color-name/test.js @@ -1,7 +1,7 @@ -'use strict' - -var names = require('./'); -var assert = require('assert'); - -assert.deepEqual(names.red, [255,0,0]); -assert.deepEqual(names.aliceblue, [240,248,255]); +'use strict'
+
+var names = require('./');
+var assert = require('assert');
+
+assert.deepEqual(names.red, [255,0,0]);
+assert.deepEqual(names.aliceblue, [240,248,255]);
diff --git a/templates/footer.ejs b/templates/footer.ejs index f9ac4de..db2d403 100644 --- a/templates/footer.ejs +++ b/templates/footer.ejs @@ -1,9 +1,9 @@ - </main> - <footer class="<%- config.classes.footer.join(" ") %>"> - <hr> - <p style="text-align:center;"> - <i>generated by <a href="https://gitlab.minteck.org/minteck/cobalt">Cobalt</a> v<%- config._version %></i> - </p> - </footer> -</body> + </main>
+ <footer class="<%- config.classes.footer.join(" ") %>">
+ <hr>
+ <p style="text-align:center;">
+ <i>generated by <a href="https://gitlab.minteck.org/minteck/cobalt">Cobalt</a> v<%- config._version %></i>
+ </p>
+ </footer>
+</body>
</html>
\ No newline at end of file diff --git a/templates/header.ejs b/templates/header.ejs index 5aaaf44..c435efa 100644 --- a/templates/header.ejs +++ b/templates/header.ejs @@ -1,13 +1,13 @@ -<!DOCTYPE html> -<html lang="en" class="<%- config.classes.html.join(" ") %>"> -<head> - <meta charset="UTF-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title><%- name %> | <%- config.site_name %></title> - <link rel="stylesheet" href="<%- config.imports.css.join('"><link rel="stylesheet" href="') %>"> - <script src="<%- config.imports.js.join('"></script><script src="') %>"></script> -</head> -<body class="<%- config.classes.body.join(" ") %>"> - <!-- TODO: put your navigation, header, etc... here --> +<!DOCTYPE html>
+<html lang="en" class="<%- config.classes.html.join(" ") %>">
+<head>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title><%- name %> | <%- config.site_name %></title>
+ <link rel="stylesheet" href="<%- config.imports.css.join('"><link rel="stylesheet" href="') %>">
+ <script src="<%- config.imports.js.join('"></script><script src="') %>"></script>
+</head>
+<body class="<%- config.classes.body.join(" ") %>">
+ <!-- TODO: put your navigation, header, etc... here -->
<main class="<%- config.classes.main.join(" ") %>">
\ No newline at end of file |