PWA support (desktop & mobile) (#8012)
* 🎨 Improve return to feature of the auth page * 🎨 PWA support * Update manifest.webmanifest * 🎨 add `service-worker.js` * Update service-worker.js * Update service-worker.js * Update service-worker.js
This commit is contained in:
parent
e1d3789ced
commit
93e4bb1adf
17 changed files with 816 additions and 30 deletions
|
@ -6,6 +6,7 @@
|
|||
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, viewport-fit=cover, user-scalable=no">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<link rel="apple-touch-icon" href="../../icon.png">
|
||||
<style id="editorFontSize" type="text/css"></style>
|
||||
<style id="editorAttr" type="text/css"></style>
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, height=device-height, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, viewport-fit=cover">
|
||||
<link rel="manifest" href="/manifest.webmanifest">
|
||||
<style id="editorFontSize" type="text/css"></style>
|
||||
</head>
|
||||
<body class="fn__flex-column">
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import {BlockPanel} from "./Panel";
|
||||
import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName} from "../protyle/util/hasClosest";
|
||||
import {fetchSyncPost} from "../util/fetch";
|
||||
import {getIdFromSiyuanUrl} from "../util/functions";
|
||||
import {hideTooltip, showTooltip} from "../dialog/tooltip";
|
||||
|
||||
let popoverTargetElement: HTMLElement;
|
||||
|
@ -199,7 +200,7 @@ export const showPopover = async () => {
|
|||
}
|
||||
} else if (popoverTargetElement.getAttribute("data-type")?.split(" ").includes("a")) {
|
||||
// 以思源协议开头的链接
|
||||
ids = [popoverTargetElement.getAttribute("data-href").substr(16, 22)];
|
||||
ids = [getIdFromSiyuanUrl(popoverTargetElement.getAttribute("data-href"))];
|
||||
} else {
|
||||
// pdf
|
||||
let targetId;
|
||||
|
|
|
@ -17,7 +17,7 @@ import {renderSnippet} from "../config/util/snippets";
|
|||
import {openFileById} from "../editor/util";
|
||||
import {focusByRange} from "../protyle/util/selection";
|
||||
import {exitSiYuan} from "../dialog/processSystem";
|
||||
import {getSearch, isWindow} from "../util/functions";
|
||||
import {getSearch, isWindow, isSiyuanUrl, getIdFromSiyuanUrl} from "../util/functions";
|
||||
import {initStatus} from "../layout/status";
|
||||
import {showMessage} from "../dialog/message";
|
||||
import {replaceLocalPath} from "../editor/rename";
|
||||
|
@ -212,10 +212,10 @@ export const initWindow = () => {
|
|||
});
|
||||
if (!isWindow()) {
|
||||
ipcRenderer.on(Constants.SIYUAN_OPENURL, (event, url) => {
|
||||
if (!/^siyuan:\/\/blocks\/\d{14}-\w{7}/.test(url)) {
|
||||
if (!isSiyuanUrl(url)) {
|
||||
return;
|
||||
}
|
||||
const id = url.substr(16, 22);
|
||||
const id = getIdFromSiyuanUrl(url);
|
||||
fetchPost("/api/block/checkBlockExist", {id}, existResponse => {
|
||||
if (existResponse.data) {
|
||||
openFileById({
|
||||
|
|
|
@ -15,6 +15,7 @@ export abstract class Constants {
|
|||
public static readonly ASSETS_ADDRESS: string = "https://assets.b3logfile.com/siyuan/";
|
||||
public static readonly PROTYLE_CDN: string = "/stage/protyle";
|
||||
public static readonly UPLOAD_ADDRESS: string = "/upload";
|
||||
public static readonly SERVICE_WORKER_PATH: string = "/service-worker.js";
|
||||
|
||||
// drop 事件
|
||||
public static readonly SIYUAN_DROP_FILE: string = "application/siyuan-file";
|
||||
|
|
|
@ -9,7 +9,7 @@ import {getCurrentWindow} from "@electron/remote";
|
|||
/// #endif
|
||||
import {hideMessage, showMessage} from "./message";
|
||||
import {Dialog} from "./index";
|
||||
import {isMobile} from "../util/functions";
|
||||
import {isMobile, redirectToCheckAuth} from "../util/functions";
|
||||
import {confirmDialog} from "./confirmDialog";
|
||||
import {escapeHtml} from "../util/escape";
|
||||
import {getWorkspaceName} from "../util/noRelyPCFunction";
|
||||
|
@ -21,7 +21,7 @@ export const lockScreen = () => {
|
|||
}
|
||||
/// #if BROWSER
|
||||
fetchPost("/api/system/logoutAuth", {}, () => {
|
||||
window.location.href = `/check-auth?url=${window.location.href}`;
|
||||
redirectToCheckAuth();
|
||||
});
|
||||
/// #else
|
||||
ipcRenderer.send(Constants.SIYUAN_SEND_WINDOWS, {cmd: "lockscreen"});
|
||||
|
|
|
@ -9,6 +9,7 @@ import {addScript, addScriptSync} from "./protyle/util/addScript";
|
|||
import {genUUID} from "./util/genID";
|
||||
import {fetchGet, fetchPost} from "./util/fetch";
|
||||
import {addBaseURL, setNoteBook} from "./util/pathName";
|
||||
import {registerServiceWorker} from "./util/serviceWorker";
|
||||
import {openFileById} from "./editor/util";
|
||||
import {
|
||||
bootSync,
|
||||
|
@ -25,11 +26,18 @@ import {resizeDrag} from "./layout/util";
|
|||
import {getAllTabs} from "./layout/getAll";
|
||||
import {getLocalStorage} from "./protyle/util/compatibility";
|
||||
import {updateEditModeElement} from "./layout/topBar";
|
||||
import {getSearch} from "./util/functions";
|
||||
import {getSearch, isSiyuanUrl, getIdFromSiyuanUrl} from "./util/functions";
|
||||
import {hideAllElements} from "./protyle/ui/hideElements";
|
||||
|
||||
class App {
|
||||
constructor() {
|
||||
/// #if BROWSER
|
||||
registerServiceWorker(`${Constants.SERVICE_WORKER_PATH}?v=${Constants.SIYUAN_VERSION}`);
|
||||
/// #endif
|
||||
/// #if MOBILE
|
||||
registerServiceWorker(`${Constants.SERVICE_WORKER_PATH}?v=${Constants.SIYUAN_VERSION}`);
|
||||
/// #endif
|
||||
|
||||
addScriptSync(`${Constants.PROTYLE_CDN}/js/lute/lute.min.js?v=${Constants.SIYUAN_VERSION}`, "protyleLuteScript");
|
||||
addScript(`${Constants.PROTYLE_CDN}/js/protyle-html.js?v=${Constants.SIYUAN_VERSION}`, "protyleWcHtmlScript");
|
||||
addBaseURL();
|
||||
|
@ -172,9 +180,9 @@ class App {
|
|||
|
||||
new App();
|
||||
window.openFileByURL = (openURL) => {
|
||||
if (openURL && /^siyuan:\/\/blocks\/\d{14}-\w{7}/.test(openURL)) {
|
||||
if (openURL && isSiyuanUrl(openURL)) {
|
||||
openFileById({
|
||||
id: openURL.substr(16, 22),
|
||||
id: getIdFromSiyuanUrl(openURL),
|
||||
action:getSearch("focus", openURL) === "1" ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]
|
||||
});
|
||||
return true;
|
||||
|
|
|
@ -27,7 +27,7 @@ import {saveScroll} from "../protyle/scroll/saveScroll";
|
|||
import {pdfResize} from "../asset/renderAssets";
|
||||
import {Backlink} from "./dock/Backlink";
|
||||
import {openFileById} from "../editor/util";
|
||||
import {getSearch, isWindow} from "../util/functions";
|
||||
import {getSearch, isWindow, isSiyuanUrl, isWebSiyuanUrl, getIdFromSiyuanUrl, getIdFromWebSiyuanUrl} from "../util/functions";
|
||||
import {showMessage} from "../dialog/message";
|
||||
import {setTabPosition} from "../window/setHeader";
|
||||
|
||||
|
@ -365,15 +365,35 @@ export const JSONToLayout = (isStart: boolean) => {
|
|||
});
|
||||
}
|
||||
|
||||
// PWA 捕获 siyuan://
|
||||
const searchParams = new URLSearchParams(window.location.search);
|
||||
const url = searchParams.get("url");
|
||||
if (isSiyuanUrl(url) || isWebSiyuanUrl(url)) {
|
||||
searchParams.delete("url");
|
||||
switch (true) {
|
||||
case isSiyuanUrl(url):
|
||||
searchParams.set("id", getIdFromSiyuanUrl(url));
|
||||
break;
|
||||
case isWebSiyuanUrl(url):
|
||||
searchParams.set("id", getIdFromWebSiyuanUrl(url));
|
||||
break;
|
||||
}
|
||||
|
||||
const focus = getSearch("focus", url);
|
||||
if (focus) {
|
||||
searchParams.set("focus", focus);
|
||||
}
|
||||
}
|
||||
|
||||
// 支持通过 URL 查询字符串参数 `id` 和 `focus` 跳转到 Web 端指定块 https://github.com/siyuan-note/siyuan/pull/7086
|
||||
const openId = getSearch("id");
|
||||
const openId = searchParams.get("id");
|
||||
if (openId) {
|
||||
// 启动时 layout 中有该文档,该文档还原会在此之后,因此需有延迟
|
||||
setTimeout(() => {
|
||||
openFileById({
|
||||
id: openId,
|
||||
action: [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT],
|
||||
zoomIn: getSearch("focus") === "1"
|
||||
zoomIn: searchParams.get("focus") === "1"
|
||||
});
|
||||
}, Constants.TIMEOUT_BLOCKLOAD);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ import {goBack} from "./util/MobileBackFoward";
|
|||
import {hideKeyboardToolbar, showKeyboardToolbar} from "./util/keyboardToolbar";
|
||||
import {getLocalStorage} from "../protyle/util/compatibility";
|
||||
import {openMobileFileById} from "./editor";
|
||||
import {getSearch} from "../util/functions";
|
||||
import {getSearch, isSiyuanUrl, getIdFromSiyuanUrl} from "../util/functions";
|
||||
import {initRightMenu} from "./menu";
|
||||
import {openChangelog} from "../boot/openChangelog";
|
||||
|
||||
|
@ -90,8 +90,8 @@ window.showKeyboardToolbar = (height) => {
|
|||
};
|
||||
window.hideKeyboardToolbar = hideKeyboardToolbar;
|
||||
window.openFileByURL = (openURL) => {
|
||||
if (openURL && /^siyuan:\/\/blocks\/\d{14}-\w{7}/.test(openURL)) {
|
||||
openMobileFileById(openURL.substr(16, 22),
|
||||
if (openURL && isSiyuanUrl(openURL)) {
|
||||
openMobileFileById(getIdFromSiyuanUrl(openURL),
|
||||
getSearch("focus", openURL) === "1" ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT]);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -46,3 +46,27 @@ export const isFileAnnotation = (text: string) => {
|
|||
export const looseJsonParse = (text: string) => {
|
||||
return Function(`"use strict";return (${text})`)();
|
||||
};
|
||||
|
||||
/* redirect to auth page */
|
||||
export const redirectToCheckAuth = (to: string = window.location.href) => {
|
||||
const url = new URL(window.location.origin);
|
||||
url.pathname = '/check-auth';
|
||||
url.searchParams.set('to', to);
|
||||
window.location.href = url.href;
|
||||
}
|
||||
|
||||
export const isSiyuanUrl = (url: string) => {
|
||||
return /^siyuan:\/\/blocks\/\d{14}-\w{7}/.test(url);
|
||||
}
|
||||
|
||||
export const isWebSiyuanUrl = (url: string) => {
|
||||
return /^web\+siyuan:\/\/blocks\/\d{14}-\w{7}/.test(url);
|
||||
}
|
||||
|
||||
export const getIdFromSiyuanUrl = (url: string) => {
|
||||
return url.substring(16, 16 + 22);
|
||||
}
|
||||
|
||||
export const getIdFromWebSiyuanUrl = (url: string) => {
|
||||
return url.substring(20, 20 + 22);
|
||||
}
|
||||
|
|
32
app/src/util/serviceWorker.ts
Normal file
32
app/src/util/serviceWorker.ts
Normal file
|
@ -0,0 +1,32 @@
|
|||
// https://github.com/siyuan-note/siyuan/pull/8012
|
||||
export const registerServiceWorker = (scriptURL: string) => {
|
||||
if (window.navigator.serviceWorker) {
|
||||
// REF https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
|
||||
window.navigator.serviceWorker
|
||||
.register(scriptURL, {
|
||||
scope: "./",
|
||||
type: "module",
|
||||
}).then(registration => {
|
||||
if (registration.installing) {
|
||||
console.debug("Service worker installing");
|
||||
} else if (registration.waiting) {
|
||||
console.debug("Service worker installed");
|
||||
} else if (registration.active) {
|
||||
console.debug("Service worker active");
|
||||
}
|
||||
registration.update();
|
||||
}).catch(e => {
|
||||
console.debug(`Registration failed with ${e}`);
|
||||
});
|
||||
|
||||
// REF https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope/message_event
|
||||
window.navigator.serviceWorker.addEventListener("message", event => {
|
||||
// event is a MessageEvent object
|
||||
console.debug("client: onmessage", event);
|
||||
});
|
||||
|
||||
window.navigator.serviceWorker.ready.then(registration => {
|
||||
registration.active.postMessage("client: post message");
|
||||
});
|
||||
}
|
||||
};
|
|
@ -1,6 +1,7 @@
|
|||
import {exportLayout, getInstanceById} from "../layout/util";
|
||||
import {Tab} from "../layout/Tab";
|
||||
import {fetchPost} from "../util/fetch";
|
||||
import {redirectToCheckAuth} from "../util/functions";
|
||||
|
||||
const closeTab = (ipcData: IWebSocketData) => {
|
||||
const tab = getInstanceById(ipcData.data);
|
||||
|
@ -16,7 +17,7 @@ export const onWindowsMsg = (ipcData: IWebSocketData) => {
|
|||
case "lockscreen":
|
||||
exportLayout(false, () => {
|
||||
fetchPost("/api/system/logoutAuth", {}, () => {
|
||||
window.location.href = `/check-auth?url=${window.location.href}`;
|
||||
redirectToCheckAuth();
|
||||
});
|
||||
}, false, false);
|
||||
break;
|
||||
|
|
|
@ -420,7 +420,7 @@
|
|||
if ({{.appearanceModeOS}} && window.matchMedia('(prefers-color-scheme: dark)').matches || {{.appearanceMode}} === 1) {
|
||||
document.body.classList.add('dark')
|
||||
}
|
||||
if (location.hostname !== 'localhost' && location.hostname !== '127.0.0.1') {
|
||||
if (window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1') {
|
||||
document.querySelector('.b3-button--white').remove()
|
||||
}
|
||||
|
||||
|
@ -437,7 +437,7 @@
|
|||
try {
|
||||
const {ipcRenderer} = require('electron')
|
||||
const {getCurrentWindow} = require('@electron/remote')
|
||||
ipcRenderer.send('siyuan-quit', location.port)
|
||||
ipcRenderer.send('siyuan-quit', window.location.port)
|
||||
} catch (e) {
|
||||
if ((window.webkit && window.webkit.messageHandlers) || window.JSAndroid) {
|
||||
window.location.href = 'siyuan://api/system/exit'
|
||||
|
@ -505,7 +505,8 @@
|
|||
return response.json()
|
||||
}).then((response) => {
|
||||
if (0 === response.code) {
|
||||
window.location.href = window.location.search.replace('?url=', '') || "/"
|
||||
const url = new URL(window.location)
|
||||
window.location.href = url.searchParams.get("to") || "/"
|
||||
return
|
||||
}
|
||||
|
||||
|
|
77
app/stage/manifest.webmanifest
Normal file
77
app/stage/manifest.webmanifest
Normal file
|
@ -0,0 +1,77 @@
|
|||
{
|
||||
"name": "SiYuan",
|
||||
"short_name": "siyuan",
|
||||
"description": "SiYuan is a local-first personal knowledge management system, support fine-grained block-level reference and Markdown WYSIWYG.",
|
||||
"lang": "en",
|
||||
"id": "/",
|
||||
"start_url": "/",
|
||||
"scope": "/",
|
||||
"display": "fullscreen",
|
||||
"display_override": [
|
||||
"window-controls-overlay",
|
||||
"fullscreen",
|
||||
"standalone",
|
||||
"minimal-ui",
|
||||
"browser"
|
||||
],
|
||||
"categories": [
|
||||
"education",
|
||||
"productivity",
|
||||
"utilities"
|
||||
],
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"type": "image/png",
|
||||
"sizes": "any",
|
||||
"purpose": "any"
|
||||
}
|
||||
],
|
||||
"shortcuts": [
|
||||
{
|
||||
"name": "SiYuan Desktop",
|
||||
"description": "Desktop web side for SiYuan",
|
||||
"url": "/stage/build/desktop/",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"type": "image/png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "SiYuan Mobile",
|
||||
"description": "Mobile web side for SiYuan",
|
||||
"url": "/stage/build/mobile/",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"type": "image/png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"related_applications": [
|
||||
{
|
||||
"platform": "windows",
|
||||
"url": "https://apps.microsoft.com/store/detail/siyuan/9P7HPMXP73K4"
|
||||
},
|
||||
{
|
||||
"platform": "play",
|
||||
"url": "https://play.google.com/store/apps/details?id=org.b3log.siyuan",
|
||||
"id": "org.b3log.siyuan"
|
||||
},
|
||||
{
|
||||
"platform": "itunes",
|
||||
"url": "https://itunes.apple.com/app/siyuan/id1583226508"
|
||||
}
|
||||
],
|
||||
"protocol_handlers": [
|
||||
{
|
||||
"protocol": "web+siyuan",
|
||||
"url": "/?url=%s"
|
||||
}
|
||||
]
|
||||
}
|
605
app/stage/service-worker.js
Normal file
605
app/stage/service-worker.js
Normal file
|
@ -0,0 +1,605 @@
|
|||
// REF https://github.com/MicrosoftEdge/Demos/blob/main/pwamp/sw.js
|
||||
|
||||
const url = new URL(location.href);
|
||||
const SIYUAN_VERSION = url.searchParams.get("v");
|
||||
const CACHE_NAME = `siyuan-${SIYUAN_VERSION}`;
|
||||
const INITIAL_CACHED_RESOURCES = [
|
||||
"/stage/auth.html",
|
||||
"/stage/icon-large.png",
|
||||
"/stage/icon.png",
|
||||
"/stage/loading-pure.svg",
|
||||
"/stage/loading.svg",
|
||||
"/stage/manifest.webmanifest",
|
||||
"/stage/service-worker.js",
|
||||
"/stage/build/app/index.html",
|
||||
"/stage/build/app/window.html",
|
||||
"/stage/build/desktop/index.html",
|
||||
"/stage/build/export/base.css",
|
||||
"/stage/build/export/protyle-method.js",
|
||||
"/stage/build/fonts/JetBrainsMono-Regular.woff",
|
||||
"/stage/build/mobile/index.html",
|
||||
"/stage/images/sync-guide.svg",
|
||||
"/stage/protyle/js/flowchart.js",
|
||||
"/stage/protyle/js/highlight.js",
|
||||
"/stage/protyle/js/html2canvas.min.js",
|
||||
"/stage/protyle/js/protyle-html.js",
|
||||
"/stage/protyle/js/abcjs/abcjs-basic-min.js",
|
||||
"/stage/protyle/js/abcjs/abcjs-basic-min.js.LICENSE",
|
||||
"/stage/protyle/js/echarts/echarts-gl.min.js",
|
||||
"/stage/protyle/js/echarts/echarts.min.js",
|
||||
"/stage/protyle/js/flowchart.js/flowchart.min.js",
|
||||
"/stage/protyle/js/graphviz/full.render.js",
|
||||
"/stage/protyle/js/graphviz/viz.js",
|
||||
"/stage/protyle/js/highlight.js/highlight.min.js",
|
||||
"/stage/protyle/js/highlight.js/third-languages.js",
|
||||
"/stage/protyle/js/highlight.js/styles/a11y-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/a11y-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/agate.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/an-old-hope.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/androidstudio.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/ant-design.css",
|
||||
"/stage/protyle/js/highlight.js/styles/arduino-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/arta.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/ascetic.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/atom-one-dark-reasonable.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/atom-one-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/atom-one-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/brown-paper.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/brown-papersq.png",
|
||||
"/stage/protyle/js/highlight.js/styles/codepen-embed.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/color-brewer.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/default.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/devibeans.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/docco.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/far.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/felipec.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/foundation.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/github-dark-dimmed.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/github-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/github.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/gml.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/googlecode.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/gradient-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/gradient-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/grayscale.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/hybrid.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/idea.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/intellij-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/ir-black.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/isbl-editor-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/isbl-editor-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/kimbie-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/kimbie-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/lightfair.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/lioshi.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/magula.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/mono-blue.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/monokai-sublime.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/monokai.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/night-owl.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/nnfx-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/nnfx-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/nord.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/obsidian.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/panda-syntax-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/panda-syntax-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/paraiso-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/paraiso-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/pojoaque.jpg",
|
||||
"/stage/protyle/js/highlight.js/styles/pojoaque.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/purebasic.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/qtcreator-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/qtcreator-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/rainbow.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/routeros.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/school-book.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/shades-of-purple.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/srcery.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/stackoverflow-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/stackoverflow-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/sunburst.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/tokyo-night-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/tokyo-night-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/tomorrow-night-blue.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/tomorrow-night-bright.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/vs.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/vs2015.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/xcode.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/xt256.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/3024.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/apathy.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/apprentice.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ashes.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-cave-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-cave.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-dune-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-dune.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-estuary-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-estuary.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-forest-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-forest.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-heath-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-heath.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-lakeside-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-lakeside.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-plateau-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-plateau.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-savanna-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-savanna.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-seaside-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-seaside.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-sulphurpool-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atelier-sulphurpool.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/atlas.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/bespin.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-bathory.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-burzum.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-dark-funeral.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-gorgoroth.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-immortal.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-khold.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-marduk.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-mayhem.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-nile.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal-venom.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/black-metal.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/brewer.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/bright.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/brogrammer.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/brush-trees-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/brush-trees.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/chalk.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/circus.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/classic-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/classic-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/codeschool.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/colors.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/cupcake.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/cupertino.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/danqing.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/darcula.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/dark-violet.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/darkmoss.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/darktooth.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/decaf.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/default-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/default-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/dirtysea.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/dracula.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/edge-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/edge-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/eighties.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/embers.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/equilibrium-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/equilibrium-gray-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/equilibrium-gray-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/equilibrium-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/espresso.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/eva-dim.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/eva.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/flat.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/framer.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/fruit-soda.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gigavolt.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/github.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/google-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/google-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/grayscale-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/grayscale-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/green-screen.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gruvbox-dark-hard.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gruvbox-dark-medium.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gruvbox-dark-pale.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gruvbox-dark-soft.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gruvbox-light-hard.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gruvbox-light-medium.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/gruvbox-light-soft.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/hardcore.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/harmonic16-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/harmonic16-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/heetch-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/heetch-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/helios.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/hopscotch.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/horizon-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/horizon-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/humanoid-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/humanoid-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ia-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ia-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/icy-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ir-black.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/isotope.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/kimber.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/london-tube.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/macintosh.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/marrakesh.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/materia.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/material-darker.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/material-lighter.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/material-palenight.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/material-vivid.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/material.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/mellow-purple.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/mexico-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/mocha.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/monokai.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/nebula.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/nord.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/nova.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ocean.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/oceanicnext.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/one-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/onedark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/outrun-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/papercolor-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/papercolor-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/paraiso.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/pasque.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/phd.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/pico.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/pop.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/porple.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/qualia.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/railscasts.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/rebecca.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ros-pine-dawn.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ros-pine-moon.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/ros-pine.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/sagelight.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/sandcastle.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/seti-ui.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/shapeshifter.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/silk-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/silk-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/snazzy.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/solar-flare-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/solar-flare.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/solarized-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/solarized-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/spacemacs.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/summercamp.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/summerfruit-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/summerfruit-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/synth-midnight-terminal-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/synth-midnight-terminal-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/tango.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/tender.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/tomorrow-night.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/tomorrow.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/twilight.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/unikitty-dark.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/unikitty-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/vulcan.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-10-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-10.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-95-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-95.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-high-contrast-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-high-contrast.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-nt-light.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/windows-nt.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/woodland.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/xcode-dusk.min.css",
|
||||
"/stage/protyle/js/highlight.js/styles/base16/zenburn.min.css",
|
||||
"/stage/protyle/js/katex/katex.min.css",
|
||||
"/stage/protyle/js/katex/katex.min.js",
|
||||
"/stage/protyle/js/katex/mhchem.min.js",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_AMS-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_AMS-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_AMS-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Caligraphic-Bold.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Caligraphic-Bold.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Caligraphic-Bold.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Caligraphic-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Caligraphic-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Caligraphic-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Fraktur-Bold.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Fraktur-Bold.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Fraktur-Bold.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Fraktur-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Fraktur-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Fraktur-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Bold.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Bold.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Bold.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-BoldItalic.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-BoldItalic.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-BoldItalic.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Italic.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Italic.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Italic.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Main-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Math-BoldItalic.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Math-BoldItalic.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Math-BoldItalic.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Math-Italic.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Math-Italic.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Math-Italic.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Bold.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Bold.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Bold.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Italic.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Italic.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Italic.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_SansSerif-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Script-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Script-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Script-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size1-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size1-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size1-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size2-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size2-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size2-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size3-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size3-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size3-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size4-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size4-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Size4-Regular.woff2",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Typewriter-Regular.ttf",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Typewriter-Regular.woff",
|
||||
"/stage/protyle/js/katex/fonts/KaTeX_Typewriter-Regular.woff2",
|
||||
"/stage/protyle/js/lute/lute.min.js",
|
||||
"/stage/protyle/js/mermaid/mermaid.min.js",
|
||||
"/stage/protyle/js/pdf/pdf.js",
|
||||
"/stage/protyle/js/pdf/pdf.worker.js",
|
||||
"/stage/protyle/js/pdf/cmaps/78-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/78-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/78-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/78-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/78-RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/78-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/78ms-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/78ms-RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/83pv-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/90ms-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/90ms-RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/90msp-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/90msp-RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/90pv-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/90pv-RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Add-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Add-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Add-RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Add-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-0.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-1.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-3.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-4.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-5.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-6.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-CNS1-UCS2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-GB1-0.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-GB1-1.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-GB1-2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-GB1-3.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-GB1-4.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-GB1-5.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-GB1-UCS2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-0.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-1.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-3.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-4.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-5.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-6.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Japan1-UCS2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Korea1-0.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Korea1-1.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Korea1-2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Adobe-Korea1-UCS2.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/B5pc-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/B5pc-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/CNS-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/CNS-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/CNS1-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/CNS1-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/CNS2-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/CNS2-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/ETen-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/ETen-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/ETenms-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/ETenms-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/ETHK-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/ETHK-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Ext-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Ext-RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Ext-RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Ext-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GB-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GB-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GB-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GB-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBK-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBK-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBK2K-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBK2K-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBKp-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBKp-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBpc-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBpc-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBT-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBT-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBT-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBT-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBTpc-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/GBTpc-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Hankaku.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Hiragana.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKdla-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKdla-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKdlb-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKdlb-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKgccs-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKgccs-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKm314-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKm314-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKm471-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKm471-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKscs-B5-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/HKscs-B5-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Katakana.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSC-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSC-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSC-Johab-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSC-Johab-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSCms-UHC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSCms-UHC-HW-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSCms-UHC-HW-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSCms-UHC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSCpc-EUC-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/KSCpc-EUC-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/NWP-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/NWP-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/RKSJ-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/RKSJ-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/Roman.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UCS2-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UCS2-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UTF16-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UTF16-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UTF32-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UTF32-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UTF8-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniCNS-UTF8-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UCS2-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UCS2-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UTF16-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UTF16-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UTF32-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UTF32-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UTF8-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniGB-UTF8-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UCS2-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UCS2-HW-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UCS2-HW-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UCS2-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UTF16-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UTF16-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UTF32-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UTF32-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UTF8-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS-UTF8-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS2004-UTF16-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS2004-UTF16-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS2004-UTF32-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS2004-UTF32-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS2004-UTF8-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJIS2004-UTF8-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJISPro-UCS2-HW-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJISPro-UCS2-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJISPro-UTF8-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJISX0213-UTF32-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJISX0213-UTF32-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJISX02132004-UTF32-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniJISX02132004-UTF32-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UCS2-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UCS2-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UTF16-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UTF16-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UTF32-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UTF32-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UTF8-H.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/UniKS-UTF8-V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/V.bcmap",
|
||||
"/stage/protyle/js/pdf/cmaps/WP-Symbol.bcmap",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitDingbats.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitFixed.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitFixedBold.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitFixedBoldItalic.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitFixedItalic.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSans.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSansBold.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSansBoldItalic.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSansItalic.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSerif.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSerifBold.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSerifBoldItalic.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSerifItalic.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/FoxitSymbol.pfb",
|
||||
"/stage/protyle/js/pdf/standard_fonts/LiberationSans-Bold.ttf",
|
||||
"/stage/protyle/js/pdf/standard_fonts/LiberationSans-BoldItalic.ttf",
|
||||
"/stage/protyle/js/pdf/standard_fonts/LiberationSans-Italic.ttf",
|
||||
"/stage/protyle/js/pdf/standard_fonts/LiberationSans-Regular.ttf",
|
||||
"/stage/protyle/js/plantuml/plantuml-encoder.min.js",
|
||||
"/stage/protyle/js/viewerjs/viewer.js",
|
||||
"/stage/protyle/js/vis/vis-network.min.js",
|
||||
];
|
||||
|
||||
self.addEventListener("message", event => {
|
||||
// event is an ExtendableMessageEvent object
|
||||
console.debug("service-worker: onmessage", event);
|
||||
event.source.postMessage("service-worker: post message");
|
||||
});
|
||||
|
||||
self.addEventListener("install", event => {
|
||||
console.debug("service-worker: oninstall", event);
|
||||
self.skipWaiting();
|
||||
event.waitUntil((async () => {
|
||||
const cache = await caches.open(CACHE_NAME);
|
||||
cache.addAll(INITIAL_CACHED_RESOURCES);
|
||||
})());
|
||||
});
|
||||
|
||||
self.addEventListener("activate", event => {
|
||||
console.debug("service-worker: onactivate", event);
|
||||
event.waitUntil((async () => {
|
||||
const names = await caches.keys();
|
||||
await Promise.all(names.map(name => {
|
||||
if (name !== CACHE_NAME) {
|
||||
return caches.delete(name);
|
||||
}
|
||||
}));
|
||||
await clients.claim();
|
||||
})());
|
||||
});
|
||||
|
||||
(async () => {
|
||||
self.addEventListener("fetch", event => {
|
||||
const url = new URL(event.request.url);
|
||||
|
||||
// Don't care about other-origin URLs.
|
||||
if (url.origin !== location.origin) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't care about anything else than GET.
|
||||
if (event.request.method !== 'GET') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't care about widget requests.
|
||||
if (!url.pathname.startsWith("/stage/")) {
|
||||
return;
|
||||
}
|
||||
|
||||
// On fetch, go to the cache first, and then network.
|
||||
event.respondWith((async () => {
|
||||
const cache = await caches.open(CACHE_NAME);
|
||||
const cachedResponse = await cache.match(url.pathname);
|
||||
|
||||
if (cachedResponse) {
|
||||
return cachedResponse;
|
||||
} else {
|
||||
const fetchResponse = await fetch(url.pathname);
|
||||
cache.put(url.pathname, fetchResponse.clone());
|
||||
return fetchResponse;
|
||||
}
|
||||
})());
|
||||
});
|
||||
})();
|
|
@ -18,6 +18,7 @@ package model
|
|||
|
||||
import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
@ -221,7 +222,12 @@ func CheckAuth(c *gin.Context) {
|
|||
return
|
||||
}
|
||||
|
||||
c.Redirect(302, "/check-auth")
|
||||
location := url.URL{}
|
||||
queryParams := url.Values{}
|
||||
queryParams.Set("to", c.Request.URL.String())
|
||||
location.RawQuery = queryParams.Encode()
|
||||
location.Path = "/check-auth"
|
||||
c.Redirect(302, location.String())
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
|
|
|
@ -181,22 +181,30 @@ func serveTemplates(ginServer *gin.Engine) {
|
|||
}
|
||||
|
||||
func serveAppearance(ginServer *gin.Engine) {
|
||||
ginServer.StaticFile("favicon.ico", filepath.Join(util.WorkingDir, "stage", "icon.png"))
|
||||
ginServer.StaticFile("manifest.json", filepath.Join(util.WorkingDir, "stage", "manifest.webmanifest"))
|
||||
ginServer.StaticFile("manifest.webmanifest", filepath.Join(util.WorkingDir, "stage", "manifest.webmanifest"))
|
||||
|
||||
siyuan := ginServer.Group("", model.CheckAuth)
|
||||
|
||||
siyuan.Handle("GET", "/", func(c *gin.Context) {
|
||||
userAgentHeader := c.GetHeader("User-Agent")
|
||||
|
||||
/* Carry query parameters when redirecting */
|
||||
location := url.URL{}
|
||||
queryParams := c.Request.URL.Query()
|
||||
queryParams.Set("r", gulu.Rand.String(7))
|
||||
location.RawQuery = queryParams.Encode()
|
||||
|
||||
if strings.Contains(userAgentHeader, "Electron") {
|
||||
c.Redirect(302, "/stage/build/app/?r="+gulu.Rand.String(7))
|
||||
return
|
||||
location.Path = "/stage/build/app/"
|
||||
} else if user_agent.New(userAgentHeader).Mobile() {
|
||||
location.Path = "/stage/build/mobile/"
|
||||
} else {
|
||||
location.Path = "/stage/build/desktop/"
|
||||
}
|
||||
|
||||
ua := user_agent.New(userAgentHeader)
|
||||
if ua.Mobile() {
|
||||
c.Redirect(302, "/stage/build/mobile/?r="+gulu.Rand.String(7))
|
||||
return
|
||||
}
|
||||
|
||||
c.Redirect(302, "/stage/build/desktop/?r="+gulu.Rand.String(7))
|
||||
c.Redirect(302, location.String())
|
||||
})
|
||||
|
||||
appearancePath := util.AppearancePath
|
||||
|
@ -260,7 +268,7 @@ func serveAppearance(ginServer *gin.Engine) {
|
|||
})
|
||||
|
||||
siyuan.Static("/stage/", filepath.Join(util.WorkingDir, "stage"))
|
||||
siyuan.StaticFile("favicon.ico", filepath.Join(util.WorkingDir, "stage", "icon.png"))
|
||||
ginServer.StaticFile("service-worker.js", filepath.Join(util.WorkingDir, "stage", "service-worker.js"))
|
||||
|
||||
siyuan.GET("/check-auth", serveCheckAuth)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue