/* * Copyright (C) 2026 Mateusz GruszczyƄski @linuxiarz.pl * Source-Available Code / Dual-Licensed. * * Free for non-commercial and evaluation use under terms of BSL/GPLv3. * Commercial or production use requires a valid paid license. * See LICENSE file in repository root for details. */ const VIEWS = new Set(["edit", "split", "preview"]); const MODES = new Set(["markdown", "text"]); const APP_URL_BASE = globalThis.location?.origin || "https://rustpad.invalid"; function appUrl(path) { try { const url = new URL(path, APP_URL_BASE); return url.origin === APP_URL_BASE ? url : null; } catch { return null; } } function relativeUrl(url) { return `${url.pathname}${url.search}${url.hash}`; } export function withShareToken(path, shareToken) { const url = appUrl(path); if (!url) return "/"; const token = typeof shareToken === "string" ? shareToken.trim() : ""; if (token) url.searchParams.set("share", token); else url.searchParams.delete("share"); return relativeUrl(url); } export function editorResourceUrl(path, { shareToken = "", view = "split", mode = "markdown" } = {}) { const url = appUrl(path); if (!url) return "/"; if (VIEWS.has(view)) url.searchParams.set("view", view); if (MODES.has(mode)) url.searchParams.set("mode", mode); const token = typeof shareToken === "string" ? shareToken.trim() : ""; if (token) url.searchParams.set("share", token); else url.searchParams.delete("share"); return relativeUrl(url); } export function readEditorState() { const params = new URLSearchParams(window.location.search); return { view: VIEWS.has(params.get("view")) ? params.get("view") : "split", mode: MODES.has(params.get("mode")) ? params.get("mode") : "markdown", }; } export function writeEditorState(state, { replace = false } = {}) { const url = new URL(window.location.href); url.searchParams.set("view", state.view); url.searchParams.set("mode", state.mode); const method = replace ? "replaceState" : "pushState"; window.history[method]({ ...state }, "", `${url.pathname}${url.search}${url.hash}`); window.dispatchEvent(new CustomEvent("rustpad:urlchange", { detail: { url: url.href } })); return url.href; } export function currentShareUrl(state) { const url = new URL(window.location.href); url.searchParams.set("view", state.view); url.searchParams.set("mode", state.mode); return url.href; }