You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

138 lines
8.4 KiB

window.Editor = {
appearance: () => {
var parent_window = (window.self == window.top),
standalone = (window.matchMedia("(display-mode: standalone)").matches || navigator.standalone || !window.menubar.visible),
apple_home_screen = (/(macOS|Mac|iPhone|iPad|iPod)/i.test(("userAgentData" in navigator) ? navigator.userAgentData.platform : navigator.platform) && "standalone" in navigator && navigator.standalone),
hidden_chrome = (window.outerWidth == window.innerWidth && window.outerHeight == window.innerHeight),
window_controls_overlay = ((("windowControlsOverlay" in navigator) ? navigator.windowControlsOverlay.visible : false) && standalone),
refresh_window_controls_overlay = () => {
var visibility = window_controls_overlay, styling = document.documentElement.classList.contains("window-controls-overlay");
if (visibility != styling) (visibility) ? document.documentElement.classList.add("window-controls-overlay") : document.documentElement.classList.remove("window-controls-overlay");
},
fullscreen = (window.matchMedia("(display-mode: fullscreen)").matches || (!window.screenY && !window.screenTop && hidden_chrome) || (!window.screenY && !window.screenTop && standalone)),
safe_area_insets = {
left: getSafeAreaInset("left"),
right: getSafeAreaInset("right"),
top: getSafeAreaInset("top"),
bottom: getSafeAreaInset("bottom"),
},
titlebar_area_insets = {
top: getTitlebarAreaInset("top"),
width_left: getTitlebarAreaInset("width-left"),
width_right: getTitlebarAreaInset("width-right"),
height: getTitlebarAreaInset("height"),
},
device_pixel_ratio = window.devicePixelRatio.toFixed(2),
refresh_device_pixel_ratio = () => {
var ratio = Editor.appearance().device_pixel_ratio, styling = getRootStyleProperty("--device-pixel-ratio");
if (ratio != styling) document.documentElement.style.setProperty("--device-pixel-ratio", ratio);
};
function getSafeAreaInset(section) {
return parseInt(getRootStyleProperty(`--safe-area-inset-${section}`), 10);
}
function getTitlebarAreaInset(section) {
var value = getRootStyleProperty(`--titlebar-area-inset-${section}`);
if (value.includes("calc")) value = Function(`"use strict"; return (${value.replace(/calc/g, "").replace(/100vw/g, `${window.innerWidth}px`).replace(/px/g, "")})`)();
return parseInt(value, 10);
}
function getRootStyleProperty(template) {
return window.getComputedStyle(document.documentElement).getPropertyValue(template);
}
return { parent_window, standalone, apple_home_screen, hidden_chrome, window_controls_overlay, refresh_window_controls_overlay, fullscreen, safe_area_insets, titlebar_area_insets, device_pixel_ratio, refresh_device_pixel_ratio };
},
environment: () => ({
file_protocol: (window.location.protocol == "file:"),
touch_device: ("ontouchstart" in window),
apple_device: (/(macOS|Mac|iPhone|iPad|iPod)/i.test(("userAgentData" in navigator) ? navigator.userAgentData.platform : navigator.platform)),
macOS_device: (/(macOS|Mac)/i.test(("userAgentData" in navigator) ? navigator.userAgentData.platform : navigator.platform) && navigator.standalone == undefined),
mozilla_browser: (CSS.supports("-moz-appearance: none"))
}),
support: () => ({
local_storage: (window.location.protocol != "blob:") ? window.localStorage : null,
file_system: ("showOpenFilePicker" in window),
file_handling: ("launchQueue" in window && "LaunchParams" in window),
window_controls_overlay: ("windowControlsOverlay" in navigator),
editing_commands: (!Editor.environment().mozilla_browser),
web_sharing: ("share" in navigator)
}),
query: (identifier = Editor.active_editor) => {
var tab = workspace_tabs.querySelector(`.tab[data-editor-identifier="${identifier}"]`),
container = workspace_editors.querySelector(`.editor[data-editor-identifier="${identifier}"]`),
textarea = (container) ? container.editor : null,
getName = section => {
if ((document.querySelectorAll(`[data-editor-identifier="${identifier}"]:not([data-editor-change])`).length == 0) && (identifier != Editor.active_editor)) return null;
var name = workspace_tabs.querySelector(`.tab[data-editor-identifier="${identifier}"] [data-editor-name]`).innerText;
if (!section || (!name.includes(".") && section == "base")) return name;
if (section == "base") {
name = name.split(".");
name.pop();
return name.join(".");
}
if (section == "extension") {
if (!name.includes(".")) return "";
return name.split(".").pop();
}
}
return { tab, container, textarea, getName };
},
view: () => document.body.getAttribute("data-view"),
view_change: () => (document.body.hasAttribute("data-view-change")),
orientation: () => document.body.getAttribute("data-orientation"),
orientation_change: () => (document.body.hasAttribute("data-orientation-change")),
scaling_change: () => (document.body.hasAttribute("data-scaling-change")),
unsaved_work: () => (!Editor.appearance().parent_window || (workspace_tabs.querySelectorAll(".tab:not([data-editor-change])[data-editor-unsaved]").length == 0)),
preapproved_extensions: ["txt", "html", "css", "js", "php", "json", "webmanifest", "bbmodel", "xml", "yaml", "yml", "dist", "config", "ini", "md", "markdown", "mcmeta", "lang", "properties", "uidx", "material", "h", "fragment", "vertex", "fxh", "hlsl", "ihlsl", "svg"],
active_editor: null,
preview_editor: "active-editor",
file_handles: {},
child_windows: [],
settings: {
entries: JSON.parse(window.localStorage.getItem("settings")) || {},
set: (key, value) => {
if (!Editor.support().local_storage) return;
Editor.settings.entries[key] = value;
window.localStorage.setItem("settings", JSON.stringify(Editor.settings.entries, null, " "));
return value;
},
remove: key => {
if (!Editor.support().local_storage) return;
delete Editor.settings.entries[key];
window.localStorage.setItem("settings", JSON.stringify(Editor.settings.entries, null, " "));
return true;
},
has: key => (key in Editor.settings.entries),
get: key => {
if (!Editor.support().local_storage) return;
if (!Editor.settings.has(key)) return;
return Editor.settings.entries[key];
},
reset: ({ confirm: showPrompt = false } = {}) => {
if (!Editor.support().local_storage) return;
if (showPrompt) {
if (!confirm("确定要重置所有设置?")) return false;
}
default_orientation_setting.select("horizontal");
setSyntaxHighlighting(false);
syntax_highlighting_setting.checked = false;
automatic_refresh_setting.checked = true;
preview_base_input.reset();
Editor.settings.entries = {};
window.localStorage.removeItem("settings");
if (showPrompt) reset_settings_card.open();
return true;
}
},
active_dialog: null,
dialog_previous: null,
active_widget: null,
picker_color: null,
install_prompt: null
};
if (Editor.appearance().parent_window) document.documentElement.classList.add("startup-fade");
if (Editor.appearance().apple_home_screen) document.documentElement.classList.add("apple-home-screen");
if (Editor.environment().touch_device) document.documentElement.classList.add("touch-device");
if (Editor.environment().apple_device) document.documentElement.classList.add("apple-device");
if (Editor.environment().macOS_device) document.documentElement.classList.add("macOS-device");
if (Editor.support().web_sharing) document.documentElement.classList.add("web-sharing");
Editor.appearance().refresh_window_controls_overlay();
Editor.appearance().refresh_device_pixel_ratio();