diff --git a/.gitignore b/.gitignore index 27b68ce..e9bfacb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ tmp.* .env .hugo_build.lock +/static/lib/SpaccDotWeb.Alt.min.js +/static/lib/toastui-editor-all.min.js +/static/lib/toastui-editor.min.css diff --git a/Scripts/Dependencies.Build.sh b/Scripts/Dependencies.Build.sh new file mode 100755 index 0000000..74996f6 --- /dev/null +++ b/Scripts/Dependencies.Build.sh @@ -0,0 +1,67 @@ +#!/bin/sh +. "$(dirname "$(realpath "$0")")/Lib/Globals.sh" +cd "${swd}/.." + +alias asroot="" +if [ "$(whoami)" != root ] && [ "$(uname -o)" != Android ] +then alias asroot=sudo +fi + +hugoexternal=true +if [ -n "$(which apt)" ] +then + asroot apt update + asroot apt install -y python3 nodejs findutils git wget tar gzip p7zip-full #zip + if [ "$(uname -o)" != Android ] + then asroot apt install -y npm + else + asroot apt install -y hugo + hugoexternal=false + fi +elif [ -n "$(which apk)" ] +then + asroot apk update + asroot apk add hugo python3 py3-pip nodejs npm findutils git wget tar gzip 7zip #zip + hugoexternal=false +fi + +if [ "${hugoexternal}" = true ] +then + exehome="$([ -n "${XDG_DATA_HOME}" ] \ + && echo "${XDG_DATA_HOME}" \ + || echo "${HOME}/.local" \ + )/bin" + exedepot="${exehome}/hugo.tmp" + exearchive="${exedepot}/hugo_extended.tar.gz" + + sysarch="$(uname -m)" + if [ "${sysarch}" = x86_64 ] + then sysarch=amd64 + elif [ "${sysarch}" = aarch64 ] + then sysarch=arm64 + fi + + mkdir -p "${exedepot}" + wget -O "${exearchive}" "https://github.com/gohugoio/hugo/releases/download/v${HugoVersion}/hugo_extended_${HugoVersion}_linux-${sysarch}.tar.gz" + tar xvf "${exearchive}" --directory "${exedepot}" + mv "${exedepot}/hugo" "${exehome}/hugo" + chmod +x "${exehome}/hugo" + rm -rf "${exedepot}" + + if [ -z "$(which hugo)" ] + then + BinaryPath='PATH="${PATH}:'"${BinaryHome}"'"' + eval "${BinaryPath}" + echo >> ~/.profile + echo "${BinaryPath}" >> ~/.profile + fi +fi + +cd ./Scripts +PIP_BREAK_SYSTEM_PACKAGES=1 "${Python3}" -m pip install -U -r ./requirements.txt +#npm install + +cd ./Lib +wget -O ./translate-shell.bash https://git.io/trans + +cd "${owd}" diff --git a/Scripts/Dependencies.Runtime.sh b/Scripts/Dependencies.Runtime.sh new file mode 100755 index 0000000..f62ea05 --- /dev/null +++ b/Scripts/Dependencies.Runtime.sh @@ -0,0 +1,10 @@ +#!/bin/sh +. "$(dirname "$(realpath "$0")")/Lib/Globals.sh" +cd "${swd}/.." + +cd ./static/lib +wget --continue "https://spaccinc.gitlab.io/SpaccDotWeb/SpaccDotWeb.Alt.min.js" +wget --continue "https://uicdn.toast.com/editor/latest/toastui-editor-all.min.js" +wget --continue "https://uicdn.toast.com/editor/latest/toastui-editor.min.css" + +cd "${owd}" diff --git a/Scripts/Requirements.sh b/Scripts/Requirements.sh index 74996f6..4147827 100755 --- a/Scripts/Requirements.sh +++ b/Scripts/Requirements.sh @@ -2,66 +2,7 @@ . "$(dirname "$(realpath "$0")")/Lib/Globals.sh" cd "${swd}/.." -alias asroot="" -if [ "$(whoami)" != root ] && [ "$(uname -o)" != Android ] -then alias asroot=sudo -fi - -hugoexternal=true -if [ -n "$(which apt)" ] -then - asroot apt update - asroot apt install -y python3 nodejs findutils git wget tar gzip p7zip-full #zip - if [ "$(uname -o)" != Android ] - then asroot apt install -y npm - else - asroot apt install -y hugo - hugoexternal=false - fi -elif [ -n "$(which apk)" ] -then - asroot apk update - asroot apk add hugo python3 py3-pip nodejs npm findutils git wget tar gzip 7zip #zip - hugoexternal=false -fi - -if [ "${hugoexternal}" = true ] -then - exehome="$([ -n "${XDG_DATA_HOME}" ] \ - && echo "${XDG_DATA_HOME}" \ - || echo "${HOME}/.local" \ - )/bin" - exedepot="${exehome}/hugo.tmp" - exearchive="${exedepot}/hugo_extended.tar.gz" - - sysarch="$(uname -m)" - if [ "${sysarch}" = x86_64 ] - then sysarch=amd64 - elif [ "${sysarch}" = aarch64 ] - then sysarch=arm64 - fi - - mkdir -p "${exedepot}" - wget -O "${exearchive}" "https://github.com/gohugoio/hugo/releases/download/v${HugoVersion}/hugo_extended_${HugoVersion}_linux-${sysarch}.tar.gz" - tar xvf "${exearchive}" --directory "${exedepot}" - mv "${exedepot}/hugo" "${exehome}/hugo" - chmod +x "${exehome}/hugo" - rm -rf "${exedepot}" - - if [ -z "$(which hugo)" ] - then - BinaryPath='PATH="${PATH}:'"${BinaryHome}"'"' - eval "${BinaryPath}" - echo >> ~/.profile - echo "${BinaryPath}" >> ~/.profile - fi -fi - -cd ./Scripts -PIP_BREAK_SYSTEM_PACKAGES=1 "${Python3}" -m pip install -U -r ./requirements.txt -#npm install - -cd ./Lib -wget -O ./translate-shell.bash https://git.io/trans +sh "${swd}/Dependencies.Build.sh" +sh "${swd}/Dependencies.Runtime.sh" cd "${owd}" diff --git a/content/it/admin.md b/content/it/admin.md new file mode 100644 index 0000000..947d569 --- /dev/null +++ b/content/it/admin.md @@ -0,0 +1,10 @@ ++++ +Hidden = true ++++ +
+ diff --git a/layouts/index.searchindex.js b/layouts/index.searchindex.js index 90efa34..34f53b7 100644 --- a/layouts/index.searchindex.js +++ b/layouts/index.searchindex.js @@ -1,21 +1,23 @@ {{- $index := slice -}} {{- $pages := .Site.Pages -}} {{- range $pages -}} - {{- $section := .Site.GetPage "section" .Section -}} - {{- $page := (dict - "title" (.Title | emojify | safeJS) - "section" ($section.Title | emojify | safeJS) - "summary" (.Summary | safeJS) - "content" (.Plain | safeJS) - "permalink" .RelPermalink - "externalUrl" .Params.externalUrl - "type" .Type - ) -}} - {{- if .Date -}} - {{- $page = (merge $page (dict - "date" (.Date | time.Format (.Site.Language.Params.dateFormat | default ":date_long")) - )) -}} + {{- if not .Params.Hidden -}} + {{- $section := .Site.GetPage "section" .Section -}} + {{- $page := (dict + "title" (.Title | emojify | safeJS) + "section" ($section.Title | emojify | safeJS) + "summary" (.Summary | safeJS) + "content" (.Plain | safeJS) + "permalink" .RelPermalink + "externalUrl" .Params.externalUrl + "type" .Type + ) -}} + {{- if .Date -}} + {{- $page = (merge $page (dict + "date" (.Date | time.Format (.Site.Language.Params.dateFormat | default ":date_long")) + )) -}} + {{- end -}} + {{- $index = $index | append $page -}} {{- end -}} - {{- $index = $index | append $page -}} {{- end -}} window.SiteSearchIndex={{- $index | jsonify -}} diff --git a/layouts/partials/search-applet.html b/layouts/partials/search-applet.html index 1a352d8..a1ec374 100644 --- a/layouts/partials/search-applet.html +++ b/layouts/partials/search-applet.html @@ -2,7 +2,7 @@ id="search-wrapper" class="fixed flex top-0 w-100 vh-100 inset-0 flex-col pa4 bg-neutral-500/50 p-4 dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh]" data-url="{{ "" | absLangURL }}" - style="word-break:break-word; visibility:hidden; z-index:500; background-color:rgb(253, 244, 255, 0.9); backdrop-filter:blur(8px);" + style="word-break:break-word; display:none; visibility:hidden; z-index:500; background-color:rgb(253, 244, 255, 0.9); backdrop-filter:blur(8px);" >${editorData.currentFilePath}
)`;
+
+editorData.close = () => {
+ const editorEl = document.querySelector(`#${editorId}`);
+ editorEl.hidden = true;
+ editorEl.style.display = 'none';
+ document.body.style.overflow = null;
+};
+
+editorData.setup = async (/*filePath*/) => {
+ if (editorHandler) {
+ return;
+ }
+
+ document.head.appendChild(Object.assign(document.createElement('style'), { innerHTML: `
+ #${editorId} {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 100%;
+ z-index: 9;
+ background-color: rgba(255, 255, 255, 0.5);
+ }
+
+ #${editorId} .toastui-editor-defaultUI {
+ width: 95%;
+ height: 95%;
+ top: 2.5%;
+ bottom: 2.5%;
+ left: 2.5%;
+ right: 2.5%;
+ background-color: ghostwhite;
+ }
+
+ #${editorId} .toastui-editor-main-container,
+ #${editorId} .ProseMirror {
+ height: 100%;
+ font-size: 16px;
+ }
+
+ /* quick fix for showing all buttons on mobile */
+ #${editorId} .toastui-editor-dropdown-toolbar {
+ display: table;
+ }
+ #${editorId} .toastui-editor-toolbar-divider {
+ display: none;
+ }
+ ` }));
+
+ document.head.appendChild(Object.assign(document.createElement('link'), {
+ rel: "stylesheet", href: "/lib/toastui-editor.min.css",
+ }));
+
+ document.body.appendChild(Object.assign(document.createElement('div'), {
+ id: editorId, hidden: true, style: "display: none;",
+ }));
+
+ await SpaccDotWeb.requireScript('/lib/toastui-editor-all.min.js');
+
+ editorHandler = new toastui.Editor({
+ el: document.querySelector(`#${editorId}`),
+ height: '100%',
+ previewStyle: 'tab',
+ hideModeSwitch: true,
+ usageStatistics: false,
+ initialValue: (await readPageFile(editorData.currentFilePath)),
+ });
+
+ editorHandler.addCommand('markdown', 'closeEditor', editorData.close);
+
+ editorHandler.addCommand('markdown', 'resetFile', (() => { // TODO re-pull page source from git
+ if (confirm(`${resetFileMessage}?`)) {
+ gitReadFile(editorData.currentFilePath);
+ }
+ }));
+
+ editorHandler.addCommand('markdown', 'gitPush', (() => {
+ if (confirm(`${gitPushMessage}?`)) {
+ gitPushFile(editorData.currentFilePath);
+ }
+ }));
+
+ editorHandler.insertToolbarItem({ groupIndex: 6 }, {
+ tooltip: gitPushMessage,
+ command: 'gitPush',
+ text: '@',
+ className: 'toastui-editor-toolbar-icons',
+ style: { backgroundImage: 'none' },
+ });
+
+ /* editorHandler.insertToolbarItem({ groupIndex: 6 }, { // TODO
+ tooltip: resetFileMessage,
+ command: 'resetFile',
+ text: '#',
+ className: 'toastui-editor-toolbar-icons',
+ style: { backgroundImage: 'none' },
+ }); */
+
+ editorHandler.insertToolbarItem({ groupIndex: 6 }, {
+ tooltip: "Close the Editor",
+ command: 'closeEditor',
+ text: 'X',
+ className: 'toastui-editor-toolbar-icons',
+ style: { backgroundImage: 'none' },
+ });
+
+ editorData.setupButtons();
+
+ editorData.setup = Void;
+};
+
+editorData.setupButtons = () => {
+ const buttonsEl = document.querySelector('#--editor-buttons');
+ displayCurrentFile();
+ buttonsEl.querySelector('[name="this"]').onclick = editorData.open;
+ buttonsEl.querySelector('[name="custom"]').onclick = (async () => {
+ const filePath = prompt(`Path of custom File?`);
+ if (filePath) {
+ await editorData.setup(/*filePath*/);
+ const fileContent = await readPageFile(editorData.currentFilePath = filePath);
+ displayCurrentFile();
+ editorHandler.setMarkdown(fileContent);
+ await editorData.open();
+ }
+ });
+ buttonsEl.style.display = null;
+ delete editorData.setupButtons;
+};
+
+editorData.open = async () => {
+ await editorData.setup(/*filePath*/);
+ const editorEl = document.querySelector(`#${editorId}`);
+ editorEl.style.display = 'block';
+ editorEl.hidden = false;
+ document.body.style.overflow = 'hidden';
+};
+
+window.sitoctt.markdownEditor = editorData;
+
+if (false) { // TODO show edit page button and presetup editor if localStorage contains token
+ window.addEventListener('load', editorData.setup);
+}
+
+})();
diff --git a/static/octt-runtime.js b/static/octt-runtime.js
index afa25b9..c50fc82 100644
--- a/static/octt-runtime.js
+++ b/static/octt-runtime.js
@@ -8,6 +8,10 @@ vaNp2PerVDzUvdLlZKazGYIHXb5xduSnRp4HRHU9TMzSyuP5fr9XohcCAwEAAQ==`,
var signatureScheme = 'RSASSA-PKCS1-v1_5';
var encryptionType = {name: signatureScheme, hash: {name: "SHA-256"}};
+function ensureRequirements () {
+ return SpaccDotWeb.requireScript('./forge.min.js', { useCurrentPath: true });
+}
+
async function makeSignedScript (scriptText, keyIndex, pemPrivateKey) {
return ('1,'
+ keyIndex + ','
@@ -111,11 +115,15 @@ function verificationKeyFromPublicKeyPEM (pemPublicKey) {
["verify"]);
}
-window.OcttRuntime = { makeSignedScript, verifyAndRunScript };
+window.OcttRuntime = { ensureRequirements, verifyAndRunScript, makeSignedScript };
-var scriptCipher = (new URLSearchParams(location.search)).get('octtRuntime');
-if (scriptCipher) {
- verifyAndRunScript(scriptCipher);
-}
+window.addEventListener('load', (function(){
+ var scriptCipher = (new URLSearchParams(location.search)).get('octtRuntime');
+ if (scriptCipher) {
+ ensureRequirements().then(function(){
+ verifyAndRunScript(scriptCipher);
+ });
+ }
+}));
})();
diff --git a/static/site-search.js b/static/site-search.js
index 6bcc053..f429a07 100644
--- a/static/site-search.js
+++ b/static/site-search.js
@@ -1,5 +1,4 @@
(function(){
-// TODO make links work on file:/// (must be relative)
// TODO fix ajax navigation to different-language page, doesn't currently load the index for the selected language
// TODO better perf
// TODO thumbnails?
@@ -93,8 +92,9 @@ function displaySearch() {
buildIndex();
}
if (!searchVisible) {
- document.body.style.overflow = "hidden";
- wrapper.style.visibility = "visible";
+ document.body.style.overflow = 'hidden';
+ wrapper.style.visibility = 'visible';
+ wrapper.style.display = '';
input.focus();
searchVisible = true;
}
@@ -103,8 +103,9 @@ function displaySearch() {
function hideSearch() {
if (searchVisible) {
- document.body.style.overflow = "visible";
- wrapper.style.visibility = "hidden";
+ document.body.style.overflow = 'visible';
+ wrapper.style.visibility = 'hidden';
+ wrapper.style.display = 'none';
input.value = "";
document.querySelector('.SiteSearchForm > input').value = "";
output.innerHTML = "";
@@ -136,7 +137,7 @@ function executeQuery(term) {
if (results.length > 0) {
results.forEach(function (value, key) {
- var title = value.item.externalUrl? value.item.title + ''+value.item.externalUrl+'' : value.item.title;
+ var title = value.item.externalUrl ? value.item.title + ''+value.item.externalUrl+'' : value.item.title;
var linkconfig;
if (value.item.externalUrl) {
linkconfig = 'target="_blank" rel="noopener" href="'+value.item.externalUrl+'"';
diff --git a/themes/ananke/layouts/_default/baseof.html b/themes/ananke/layouts/_default/baseof.html
index e3d3c55..ababf18 100644
--- a/themes/ananke/layouts/_default/baseof.html
+++ b/themes/ananke/layouts/_default/baseof.html
@@ -1,5 +1,5 @@
-
+
diff --git a/themes/ananke/layouts/partials/site-footer.html b/themes/ananke/layouts/partials/site-footer.html
index e5a3798..ab4e0c7 100644
--- a/themes/ananke/layouts/partials/site-footer.html
+++ b/themes/ananke/layouts/partials/site-footer.html
@@ -1,5 +1,8 @@