import { sync } from "../scrapbox-watchlist-sync/script.ts"; sync({ project: "takker-dist" }); import "../Open_Gyazo_page_menu/script.js"; import { setup as setupSearch } from "../takker99%2Fscrapbox-incremental-fulltext-search/mod.tsx"; setupSearch().then((ops) => { scrapbox.PageMenu.addItem({ title: "Fulltext Search", onClick: () => { ops.toggle(); }, }); }); import { scrapBindings } from "./bindings.ts"; export { scrapBindings }; import "./scrapBubble.ts"; import { setup as setupJupyter } from "../@takker%2FScrapJupyter/mod.ts"; import { findLatestCache, saveApiCache } from "../scrapbox-userscript-std/dom.ts"; // v0.21.5 const WASM_URL = "https://scrapbox.io/files/666ac977264f7d001ce9d125.wasm"; const WORKER_URL = "/api/code/takker-dist/esbuild-wasm-no-blob/worker.js"; (async () => { const req = new Request(WASM_URL); let res = await findLatestCache(req); if (!res) { res = await fetch(req); await saveApiCache(req, res); } await setupJupyter( await WebAssembly.compileStreaming(res), WORKER_URL, ); })(); import { setup as setupSelectSuggestion } from "../選択範囲に似ているリンクを入力補完するUserScript/mod.tsx"; import { addTextInputEventListener } from "../scrapbox-userscript-std/dom.ts"; import { Scrapbox } from "../scrapbox-jp%2Ftypes/userscript.ts"; declare const scrapbox: Scrapbox; (async () => { const projects = [ scrapbox.Project.name, "takker", "takker-memex", "takker-books", "takker-private", "villagepump", "hub", "arpla", "unnamedcamp", "unnamed-project", "nishio", "enchi", "rashitamemo", "motoso", "shokai", "masui", "rakusai", "yuiseki", "akiroom", "c4j", "miyamonz", "mrsekut-p", "masuilab", "kidaaam-92022284", "nwtgck", "juneboku", "marshmallow-rm", "sushitecture", "sno2wman", "inteltank", "issac-37765679", "blu3mo", "yosider", "Mijinko", "Mijinko-other", "scrapbox-drinkup", "nota-techconf", "customize", "scrapboxlab", "scrasobox", "programming-notes", "tus-alpine", "tus-alpine-private", "guiland", ]; const ops = await setupSelectSuggestion({ projects, mark: { ...Object.fromEntries( [ ["takker", "takker"], ["takker-memex", "takker"], ["takker-books", "takker-books"], ["takker-private", "takker-private"], ["nishio", "nishio"], ["rashitamemo", "rashita"], ["enchi", "雑談_2022-04-12~"], ["rakusai", "rakusai"], ["masui", "概要"], ["shokai", "shokai"], ["yuiseki", "yuiseki"], ["akiroom", "はじめに"], ["inteltank", "sawachin"], ["motoso", "もとそのもと"], ["villagepump", "井戸端"], ["hub", "scrapbox.io%2Fhub_について"], ["masuilab", "増井研に入ったらまずやること"], ["marshmallow-rm", "読書猿マシュマロ全質問回答"], ["miyamonz", "miyamonz"], ["mrsekut-p", "mrsekut"], ["kidaaam-92022284", "kidooom"], ["c4j", "Code_for_Japan"], ["suto3", "suto3"], ["blu3mo", "blu3mo"], ["nwtgck", "nwtgck"], ["juneboku", "juneboku"], ["jigsaw", "jgs"], ["sno2wman", "SnO2WMaN"], ["sushitecture", "hashrock"], ["unnamedcamp", "知を営む"], ["unnamed-project", "unnamed-project"], ["issac-37765679", "cFQ2f7LRuLYP"], ["blu3mo", "blu3mo"], ["yosider", "yosider"], ["Mijinko", "Mijinko_SD"], ["Mijinko-other", "Mijinko_SD"], ["customize", "みんなのカスタマイズ"], ["scrapboxlab", "入会手続き"], ["scrasobox", "Scrapboxとあそぶ"], ["programming-notes", "参加する"], ["guiland", "概要と参加方法"], ].map(([p, t]) => [p, `https://scrapbox.io/api/pages/${p}/${t}/icon`]) ), "NDLSH-SB": "📚", "scrapbox-drinkup": "https://scrapbox.io/assets/img/page-icon/scrapbox_beaver.png", "nota-techconf": "https://i.gyazo.com/727f42bbd9e2534d99d70e6ea90705b3.jpg", "plurality-japanese": "⿻", }, enableSelfProjectOnStart: true, }); const pvsp = (e: Event): void => { e.preventDefault(); e.stopPropagation(); }; const hasPopup = (): boolean => document.querySelector(".line .popup-menu") !== null; scrapBindings.bind({ "": (e) => { if(hasPopup()) return; if(!ops.selectNext?.({ cyclic: true })) return; pvsp(e); }, "": (e) => { if(hasPopup()) return; if(!ops.selectPrev?.({ cyclic: true })) return; pvsp(e); }, "": (e) => { if(hasPopup()) return; if(!ops.confirm?.()) return; pvsp(e); }, "": (e) => { if(hasPopup()) return; if(!ops.cancel?.()) return; pvsp(e); }, }); })(); import { setup as setUpRun, previewSVG, previewGLSL, previewPlantUML, previewTikZ } from "../ScrapRun/mod.ts"; setUpRun({ previewers: [ { when: /(?:^|\.)svg$/, preview: previewSVG }, { when: /(?:^|\.)glsl$/, preview: previewGLSL }, { when: /(?:^|\.)(?:plantuml|puml|pu)$/, preview: previewPlantUML }, { when: /(?:^|\.)tikz\(tex\)$/, preview: previewTikZ( "https://scrapbox.io/api/code/takker-dist/scrapbox-tikz/mod.js", "https://scrapbox.io/files/65d1645c19cd8e002433c3df", ) }, ]}); import { setup as setupSlider } from "https://raw.githubusercontent.com/takker99/scrapbox-history-slider/0.2.1/App.tsx"; (async () => { const { toggle } = await setupSlider([]); scrapbox.PageMenu.addItem({ title: "履歴スライダー", image: "https://1.bp.blogspot.com/-UZtkSEX0wh4/U5l5_dNcEsI/AAAAAAAAhWs/UzJGVzyiX8Y/s800/kaichu_dokei.png", onClick: toggle, }); })(); import { isMobile } from "../mobile版scrapboxの判定/script.js"; import "../popup/script.ts"; import { main } from "../takker99%2Ftakker-scheduler/auto-review.ts"; main( "takker", ["takker", "振り返り(takker-workflow@0.0.1)のtemplate", "txt"], ["takker", "1週間の振り返り(takker-workflow@0.0.1)のtemplate", "txt"] ); import { addButton } from "../Porterっぽい編集バーを生やすUserScript@1.0.0/mod.ts"; import { porterCopy, porterCut, porterPaste, toggleCaret } from "../Porterっぽい編集バーを生やすUserScript@1.0.0/commands.ts"; import { downBlocks, downLines, indentBlocks, indentLines, insertText, outdentBlocks, outdentLines, upBlocks, upLines, redo, undo, } from "../scrapbox-userscript-std/dom.ts"; if (isMobile()) { addButton({ display: { type: "caret-left" }, onClick: ({ cursor, selection }) => { cursor.focus(); selection.getSelectedText() === "" ? outdentBlocks() : outdentLines(); }, }); addButton({ display: { type: "caret-right" }, onClick: ({ cursor, selection }) => { cursor.focus(); selection.getSelectedText() === "" ? indentBlocks() : indentLines(); }, }); addButton({ display: { type: "caret-up" }, onClick: ({ cursor, selection }) => { cursor.focus(); selection.getSelectedText() === "" ? upBlocks() : upLines(); }, }); addButton({ display: { type: "caret-down" }, onClick: ({ cursor, selection }) => { cursor.focus(); selection.getSelectedText() === "" ? downBlocks() : downLines() }, }); addButton({ display: { type: "copy" }, onClick: async ({ cursor, selection }) => await porterCopy(cursor, selection), }); addButton({ display: { type: "cut" }, onClick: async ({ cursor, selection }) => await porterCut(cursor, selection), }); addButton({ display: { type: "clipboard" }, onClick: async ({ cursor }) => await porterPaste(cursor), }); addButton({ display: { type: "undo" }, onClick: () => undo(), }); addButton({ display: { type: "redo" }, onClick: () => redo(), }); addButton({ display: ({ cursor }) => cursor.getVisible() && cursor.hasFocus // @ts-ignore private扱いだけど、これしかアクセス方法がないため使わせていただく && cursor.visiblePopupMenu ? { type: ["i-cursor", "slash"] } : { type: "i-cursor" }, onClick: ({ cursor }) => toggleCaret(cursor), }); } import "../scrapbox-editor-begin-edit/script.ts"; import "../mobileからtimestampを行頭に挿入するUserScript/script.js"; import "../Kakeruを開くPage_Menu/script.js"; import { transport, createTask, } from "../takker99%2Ftakker-scheduler/deps.ts"; if (isMobile() && scrapbox.Project.name !== "takker-memex") { const id = "task"; scrapbox.PageMenu.addMenu({ title: id, image: 'https://img.icons8.com/ios/180/FFFFFF/todo-list--v2.png', }); scrapbox.PageMenu(id).addItem({ title: 'Book starting', image: 'https://img.icons8.com/ios/180/FFFFFF/plus-1day.png', onClick: createTask, }); scrapbox.PageMenu(id).addItem({ title: 'Transport', onClick: () => transport({ from: { project: scrapbox.Project.name, title: scrapbox.Page.title!, }, to: "takker-memex", }), }); } import { makeNewPage } from "../custom-new-page/mod.ts"; import { newPageHook, splittedLinkHook, taskLineHook, } from "../for-custom-new-page/mod.ts"; if (isMobile()) { const id = "New Page"; const hooks = [taskLineHook, newPageHook, splittedLinkHook]; scrapbox.PageMenu.addMenu({ title: id, image: "https://img.icons8.com/ios/180/FFFFFF/cut-paper.png", }); scrapbox.PageMenu(id).addItem({ title: "New Page", onClick: () => { const project = window.prompt("Create a new page at", scrapbox.Project.name); if (!project) return; makeNewPage({ project, mode: "noopen", hooks })?.(); }, }); scrapbox.PageMenu(id).addItem({ title: "New Page and Open", onClick: () => { const project = window.prompt("Create a new page at", scrapbox.Project.name); if (!project) return; makeNewPage({ project, mode: "self", hooks })?.(); }, }); } import "../ページを転送するUserScript/pageMenu.ts"; import { addToInboxFromPrompt } from "../Inboxに素早く入れるUserScript/mod.ts"; scrapbox.PageMenu.addMenu({ title: "Add to inbox", image: "https://img.icons8.com/ios/180/FFFFFF/inbox.png", onClick: () => addToInboxFromPrompt( "takker-memex", "メモ帳", ), }); import "../scrapbox-icon-button/script.js"; import "../Markdown形式でページのURLをコピーするPageMenu/script.js"; import { setup as setupActions } from "../takker99%2Ftakker-scheduler/viewer.tsx"; import { setup as setupScheduler, setupWedget } from "../takker99%2Ftakker-scheduler/weekly-scheduler.tsx"; (async () => { const id = "next-action"; const selector = `head style[data-userscript-name="${id}"]`; document.querySelector(selector)?.remove?.(); const style = document.createElement("style"); style.dataset.userscriptName = id; style.textContent = ` button:is(#${id}, #scheduler).tool-btn::before { position: absolute; font: 900 20px/46px "Font Awesome 5 Free"; } button#${id}.tool-btn::before { content: "\\f0ae"; } button#scheduler.tool-btn::before { content: "\\f073"; font-weight: 400; } button:is(#${id}, #scheduler).tool-btn img { opacity: 0; }`; document.head.append(style); const projects = ["takker-memex", "takker"]; const { open } = await setupActions(projects); scrapbox.PageMenu.addMenu({ title: id, image: "/assets/img/favicon/apple-touch-icon.png", onClick: open, }); const scheduler = await setupScheduler(projects); scrapbox.PageMenu.addMenu({ title: "scheduler", image: "/assets/img/favicon/apple-touch-icon.png", onClick: scheduler.open, }); { const key = "takker-scheduler/wedget"; let settings = JSON.parse(localStorage.getItem(key) ?? "{}"); const project = scrapbox.Project.name; settings[project] ??= false; const wedget = await setupWedget(projects, settings[project]); const toggle = () => { settings[project] = !wedget.isOpen; if (wedget.isOpen) { wedget.close(); } else { wedget.open(); } localStorage.setItem(key, JSON.stringify(settings)); }; if (!isMobile()) { scrapbox.PageMenu.addItem({ title: "toggle wedget", onClick: toggle, }); } else { addButton({ display: { type: "calendar" }, onClick: toggle, }); } } })(); export { addButton, insertText, };