From b7a74e6f3931ce56444d0fe1776bc0c2aecbf22c Mon Sep 17 00:00:00 2001 From: Ne_Eo Date: Tue, 3 Sep 2024 17:19:03 +0200 Subject: [PATCH] Website generator --- .gitignore | 4 +- export/index.html | 1 - package-lock.json | 422 ++++++++++++++++++ package.json | 2 + ...fferences between the other FNF engines.md | 2 +- src/index.js | 115 +++-- src/list.json | 35 ++ src/list.txt | 28 -- src/style.css | 18 + src/templates/page.html | 21 + webserver.sh | 1 + 11 files changed, 585 insertions(+), 64 deletions(-) delete mode 100644 export/index.html create mode 100644 src/list.json delete mode 100644 src/list.txt create mode 100644 src/style.css create mode 100644 src/templates/page.html create mode 100755 webserver.sh diff --git a/.gitignore b/.gitignore index ae319b50..9b144d2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -export -node_modules \ No newline at end of file +export/* +node_modules/* \ No newline at end of file diff --git a/export/index.html b/export/index.html deleted file mode 100644 index 85479d56..00000000 --- a/export/index.html +++ /dev/null @@ -1 +0,0 @@ - Hello World

Differences between the other FNF engines.md
Home.md
How to navigate the engine.md
Modding The Engine\Cutscenes or Dialogues.md
Modding The Engine\index.md
Modding The Engine\Creating characters\Character Editor Features.md
Modding The Engine\Creating characters\index.md
Modding The Engine\Creating songs\Chart Editor Features.md
Modding The Engine\Creating songs\index.md
Modding The Engine\Creating stages\index.md
Modding The Engine\Hardcoding\index.md
Modding The Engine\Scripting\3D rendering.md
Modding The Engine\Scripting\All of the script calls.md
Modding The Engine\Scripting\Custom Classes.md
Modding The Engine\Scripting\Custom options.md
Modding The Engine\Scripting\Global Scripts.md
Modding The Engine\Scripting\index.md
Modding The Engine\Scripting\NDLL Scripting.md
Modding The Engine\Scripting\Scripted Assets Libraries.md
Modding The Engine\Scripting\Shaders.md
Modding The Engine\Scripting\State or Substate Scripts.md
Modding The Engine\Scripting\Useful script snippets for modders.md
Modding The Engine\Scripting\Using hxvlc for videos.md
Modding The Engine\Scripting\PlayState Scripts\Character or Stage Scripts.md
Modding The Engine\Scripting\PlayState Scripts\Cutscenes or Dialogue Scripts.md
Modding The Engine\Scripting\PlayState Scripts\Events or Notetype Scripts.md
Modding The Engine\Scripting\PlayState Scripts\Gameplay Scripts.md
Modding The Engine\Scripting\PlayState Scripts\index.md
Modding The Engine\Scripting\PlayState Scripts\Pause or Game Over Scripts.md
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c5eccf99..a57e4f72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,22 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "jsdom": "^25.0.0", + "mustache": "^4.2.0", "remarkable": "^2.0.1" } }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -21,6 +34,11 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/autolinker": { "version": "3.16.2", "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", @@ -30,6 +48,254 @@ "tslib": "^2.3.0" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cssstyle": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/jsdom": { + "version": "25.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.0.tgz", + "integrity": "sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nwsapi": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/remarkable": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", @@ -46,17 +312,173 @@ "node": ">= 6.0.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" } } } diff --git a/package.json b/package.json index 65fa5aee..dd6bbc04 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "license": "ISC", "description": "", "dependencies": { + "jsdom": "^25.0.0", + "mustache": "^4.2.0", "remarkable": "^2.0.1" } } diff --git a/src/docs/Differences between the other FNF engines.md b/src/docs/Differences between the other FNF engines.md index 77444943..cd43bfc6 100644 --- a/src/docs/Differences between the other FNF engines.md +++ b/src/docs/Differences between the other FNF engines.md @@ -1,6 +1,6 @@ # Differences between the other FNF engines. -#### First of all, **this engine does not have built-in LUA scripting,** like Psych Engine. +#### First of all, **this engine does not have built-in LUA scripting,** unlike Psych Engine. Codename engine is based on **Base Game's week 6 code** (AKA. version 0.2.7.1), and shows heavy modifications from the original source (for example, optimized PlayState ~1400 lines, rewritten systems etc.). It is not a fork of any other engines and hasn't taken code from other engines either. diff --git a/src/index.js b/src/index.js index d2512a7a..598f046a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,39 +1,90 @@ var fs = require('fs'); const { Remarkable } = require('remarkable'); var path = require("path"); -var renderer = new Remarkable(); +var Mustache = require('mustache'); +var jsdom = require("jsdom"); -var fileName = './export/index.html'; if (!fs.existsSync("./export")) { - fs.mkdirSync("./export"); + fs.mkdirSync("./export"); } -var stream = fs.createWriteStream(fileName); - -stream.once('open', function(fd) { - var html = buildHtml(); - - stream.end(html); -}); -function buildHtml(req) { - var header = ''; - var body = 'Hello World'; - - var filenames = fs.readdirSync("./src/docs", {recursive: true}); - body += "

"; - for (i of filenames) { - console.log(i); - if (path.parse(i).ext == "" && !fs.existsSync("./export/" + i)) fs.mkdirSync("./export/" + i); - if (i.endsWith(".md")) { - body += i + "
"; - var data = fs.readFileSync("./src/docs/" + i, 'utf8'); - //console.log(data); - fs.writeFileSync("./export/" + i.replace(".md", ".html"), renderer.render(data), 'utf8'); - } - } - - // concatenate header string - // concatenate body string - - return '' - + '' + header + ' ' + body + ''; +if (!fs.existsSync("./export/docs")) { + fs.mkdirSync("./export/docs"); +} + +function generateSidebar(list, basePath = '') { + let html = ''; + + list.forEach(item => { + if (item.length == 1) { + item = item[0]; + const filePath = basePath ? `/${basePath}/${item}.html` : `/${item}.html`; + html += `
  • ${item}
  • \n`; + } else if (item.length == 2) { + const [title, children] = item; + const subPath = basePath ? `${basePath}/${title}` : title; + + html += `
  • ${title}\n\n
  • \n`; + } + }); + + return html; +} + +var sidebarRaw = fs.readFileSync("./src/list.json", "utf8"); +var sidebar = generateSidebar(JSON.parse(sidebarRaw)); + +fs.copyFileSync("./src/style.css", "./export/docs/style.css"); + +buildHtml(); +function buildHtml() { + var templatePage = fs.readFileSync("./src/templates/page.html", 'utf8'); + var filenames = fs.readdirSync("./src/docs", {recursive: true}); + var renderer = new Remarkable({ + html: true, + }); + + for (i of filenames) { + var parsedName = path.parse(i); + var ext = parsedName.ext; + console.log(i); + if (ext == "" && !fs.existsSync("./export/docs/" + i)) + fs.mkdirSync("./export/docs/" + i); + if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif") { + fs.copyFile("./src/docs/" + i, "./export/docs/" + i, () => {}); + } + if (ext == ".md") { + var filename = parsedName.name; + var vars = { + title: filename.replace(".md", ""), + content: renderer.render(fs.readFileSync("./src/docs/" + i, 'utf8')), + sidebar: sidebar + }; + + var html = Mustache.render(templatePage, vars, null, { + escape: function(text) { + return text; + } + }); + + var dom = new jsdom.JSDOM(html); + var links = dom.window.document.querySelectorAll("[href]"); + + for(const link of links) { + //path.normalize(path.parse(i).dir + "/" + link.href); + link.href = link.href.replace(/.md$/, ".html").replace("./docs/", "./"); + if(link.href.startsWith("/")) { + link.href = path.normalize("/docs/" + link.href.substring(1)); + } + } + + //console.log(data); + fs.writeFileSync( + "./export/docs/" + i.replace(".md", ".html"), + dom.serialize(), + 'utf8' + ); + } + } }; diff --git a/src/list.json b/src/list.json new file mode 100644 index 00000000..d572c6b1 --- /dev/null +++ b/src/list.json @@ -0,0 +1,35 @@ +[ + ["Home"], + ["How to navigate the engine"], + ["Differences between the other FNF engines"], + ["Modding The Engine", [ + ["Creating songs", [ + ["Chart Editor Features"] + ]], + ["Creating characters", [ + ["Character Editor Features"] + ]], + ["Creating stages"], + ["Cutscenes or Dialogues"], + ["Scripting", [ + ["PlayState Scripts", [ + "Gameplay Scripts", + "Events or Notetype Scripts", + "Cutscenes or Dialogue Scripts", + "Character or Stage Scripts", + "Pause or Game Over Scripts" + ]], + ["State Scripts"], + ["Global Scripts"], + ["Shaders"], + ["Using hxvlc for videos"], + ["Custom options"], + ["Custom Classes"], + ["3D rendering"], + ["Useful script snippets for modders"], + ["Scripted Assets Libraries"], + ["NDLL Scripting"] + ]], + ["Hardcoding"] + ]] +] \ No newline at end of file diff --git a/src/list.txt b/src/list.txt deleted file mode 100644 index 92e5eb73..00000000 --- a/src/list.txt +++ /dev/null @@ -1,28 +0,0 @@ -Home -How to navigate the engine -Differences between the other FNF engines -Modding The Engine - Creating songs - Chart Editor Features - Creating characters - Character Editor Features - Creating stages - Cutscenes or Dialogues - Scripting - PlayState Scripts - Gameplay Scripts - Events or Notetype Scripts - Cutscenes or Dialogue Scripts - Character or Stage Scripts - Pause or Game Over Scripts - State Scripts - Global Scripts - Shaders - Using hxvlc for videos - Custom options - Custom Classes - 3D rendering - Useful script snippets for modders - Scripted Assets Libraries - NDLL Scripting - Hardcoding \ No newline at end of file diff --git a/src/style.css b/src/style.css new file mode 100644 index 00000000..b9a0b957 --- /dev/null +++ b/src/style.css @@ -0,0 +1,18 @@ +.container { + display: flex; + flex-direction: row; + width: 100%; +} + +.sidebar { + white-space: nowrap; + margin-right: 5px; +} + +.content { + margin-left: 5px; +} + +ul { + margin-top: 0; +} \ No newline at end of file diff --git a/src/templates/page.html b/src/templates/page.html new file mode 100644 index 00000000..c84c4cc4 --- /dev/null +++ b/src/templates/page.html @@ -0,0 +1,21 @@ + + + + + + {{ title }} - Codename Engine Docs + + + +
    + + +
    +

    {{ title }}

    + {{ content }} +
    +
    + + \ No newline at end of file diff --git a/webserver.sh b/webserver.sh new file mode 100755 index 00000000..8ece5d9c --- /dev/null +++ b/webserver.sh @@ -0,0 +1 @@ +python3 -m http.server 4030 --directory export \ No newline at end of file