diff --git a/browser/dom/mod.ts b/browser/dom/mod.ts index 333021b..03dc042 100644 --- a/browser/dom/mod.ts +++ b/browser/dom/mod.ts @@ -6,5 +6,5 @@ export * from "./click.ts"; export * from "./statusBar.ts"; export * from "./caret.ts"; export * from "./dom.ts"; -export * from "./openInTheSameTab.ts"; +export * from "./open.ts"; export * from "./cache.ts"; diff --git a/browser/dom/open.ts b/browser/dom/open.ts new file mode 100644 index 0000000..3657bb4 --- /dev/null +++ b/browser/dom/open.ts @@ -0,0 +1,78 @@ +/// +/// +/// + +import { encodeTitleURI } from "../../title.ts"; +import type { Scrapbox } from "../../deps/scrapbox.ts"; +declare const scrapbox: Scrapbox; + +export interface OpenOptions { + /** line id */ + id?: string; + + /** ページに追記するテキスト */ + body?: string; + + /** 新しいタブで開くかどうか + * + * @default 同じタブで開く + */ + newTab?: boolean; + + /** 同じタブでページを開く場合、ページを再読込するかどうか + * + * @default 同じprojectの場合は再読み込みせず、違うprojectの場合は再読込する + */ + reload?: boolean; +} + +/** ページを開く + * + * @param project 開くページのproject名 + * @param title 開くページのタイトル + * @param options + */ +export const open = ( + project: string, + title: string, + options?: OpenOptions, +) => { + const url = new URL(`/${project}/${encodeTitleURI(title)}`, location.href); + if (options?.body) url.search = `?body=${encodeURIComponent(options.body)}`; + if (options?.id) url.hash = `#${options.id}`; + + if ( + options?.newTab !== false && + (options?.newTab === true || project !== scrapbox.Project.name) + ) { + window.open(url); + return; + } + if ( + options?.reload !== false && + (options?.reload === true || project !== scrapbox.Project.name) + ) { + window.open(url, "_self"); + return; + } + + const a = document.createElement("a"); + a.href = url.toString(); + document.body.append(a); + a.click(); + a.remove(); +}; + +/** 同じタブでページを開く + * + * このとき、ページは再読み込みされない + * + * @param project 開くページのproject名 + * @param title 開くページのタイトル + * @param [body] ページに追記するテキスト + */ +export const openInTheSameTab = ( + project: string, + title: string, + body?: string, +) => open(project, title, { newTab: false, reload: false, body }); diff --git a/browser/dom/openInTheSameTab.ts b/browser/dom/openInTheSameTab.ts deleted file mode 100644 index aafc163..0000000 --- a/browser/dom/openInTheSameTab.ts +++ /dev/null @@ -1,26 +0,0 @@ -/// -/// -/// -import { encodeTitleURI } from "../../title.ts"; - -/** 同じタブでページを開く - * - * このとき、ページは再読み込みされない - * - * @param project 開くページのproject名 - * @param title 開くページのタイトル - * @param [body] ページに追記するテキスト - */ -export function openInTheSameTab( - project: string, - title: string, - body?: string, -) { - const a = document.createElement("a"); - a.href = `/${project}/${encodeTitleURI(title)}${ - typeof body !== "string" ? "" : `?body=${encodeURIComponent(body)}` - }`; - document.body.append(a); - a.click(); - a.remove(); -}