diff --git a/browser/dom/cursor.d.ts b/browser/dom/cursor.d.ts index fd35e3d..4518fd6 100644 --- a/browser/dom/cursor.d.ts +++ b/browser/dom/cursor.d.ts @@ -2,8 +2,9 @@ /// /// -import { BaseStore } from "../../deps/scrapbox.ts"; +import { BaseLine, BaseStore } from "../../deps/scrapbox.ts"; import { Position } from "./position.ts"; +import { Page } from "./page.d.ts"; export interface SetPositionOptions { /** カーソルが画面外に移動したとき、カーソルが見える位置までページをスクロールするかどうか @@ -16,13 +17,17 @@ export interface SetPositionOptions { * * コード内だと、"mouse"が指定されていた場合があった。詳細は不明 */ - source?: string; + source?: "mouse"; } /** カーソル操作クラス */ -export declare class Cursor extends BaseStore { +export declare class Cursor extends BaseStore< + { source: "mouse" | undefined } | "focusTextInput" | "scroll" | undefined +> { constructor(); + public startedWithTouch: boolean; + /** カーソルの位置を初期化し、editorからカーソルを外す */ clear(): void; @@ -44,9 +49,18 @@ export declare class Cursor extends BaseStore { /** popup menuを消す */ hidePopupMenu(): void; - /** #text-inputにカーソルをfocusし、同時にカーソルを表示する */ + /** #text-inputにカーソルをfocusし、同時にカーソルを表示する + * + * このとき、`event: "focusTextInput"`が発行される + */ focus(): void; + /** #text-inputにfocusがあたっているか返す + * + * `this.focusTextarea`と同値 + */ + get hasFocus(): boolean; + /** #text-inputからfocusを外す。カーソルの表示状態は変えない */ blur(): void; @@ -108,11 +122,11 @@ export declare class Cursor extends BaseStore { | "go-pageup", ): void; - /* `scrapbox.Page.lines`とほぼ同じ */ - get lines(): unknown[]; + /** 現在のページ本文を取得する */ + get lines(): BaseLine[]; - /* `scrapbox.Project.pages`とほぼ同じ */ - get pages(): unknown; + /** 現在のページデータを取得する */ + get page(): Page; private goUp(): void; private goPageUp(): void; @@ -143,8 +157,11 @@ export declare class Cursor extends BaseStore { private sync(): void; private syncNow(): void; private updateTemporalHorizontalPoint(): number; + /** scrollされたときに発火される + * + * このとき`event: "source"`が発行される + */ private emitScroll(): void; - emitChange(event: string): void; private data: Position; private temporalHorizontalPoint: number; diff --git a/browser/dom/extractCodeFiles.test.ts b/browser/dom/extractCodeFiles.test.ts index 436a99b..724e42b 100644 --- a/browser/dom/extractCodeFiles.test.ts +++ b/browser/dom/extractCodeFiles.test.ts @@ -1,582 +1,11 @@ import { extractCodeFiles } from "./extractCodeFiles.ts"; import { Line } from "../../deps/scrapbox.ts"; import { assertSnapshot } from "../../deps/testing.ts"; - -const sample: Line[] = [ - { - "id": "63b7aeeb5defe7001ddae116", - "text": "コードブロック記法", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982645, - "updated": 1672982645, - "title": true, - "section": { - "number": 0, - "start": true, - "end": false, - }, - }, - { - "id": "63b7b0761280f00000c9bc21", - "text": "ここでは[コードブロック]を表現する[scrapbox記法]を示す", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982645, - "updated": 1672982671, - "section": { - "number": 0, - "start": false, - "end": false, - }, - "nodes": [ - "ここでは", - { - "type": "link", - "unit": { - "page": "コードブロック", - }, - "children": "コードブロック", - }, - "を表現する", - { - "type": "link", - "unit": { - "page": "scrapbox記法", - }, - "children": "scrapbox記法", - }, - "を示す", - ], - }, - { - "id": "63b7b0791280f00000c9bc22", - "text": "", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982648, - "updated": 1672982648, - "section": { - "number": 0, - "start": false, - "end": true, - }, - "nodes": "", - }, - { - "id": "63b7b12b1280f00000c9bc3d", - "text": "サンプル", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982826, - "updated": 1672982828, - "section": { - "number": 1, - "start": true, - "end": false, - }, - "nodes": "サンプル", - }, - { - "id": "63b7b12c1280f00000c9bc3e", - "text": " from [/villagepump/記法サンプル#61dd289e7838e30000dc9cb5]", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982828, - "updated": 1672982835, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "nodes": { - "type": "indent", - "unit": { - "whole": " from [/villagepump/記法サンプル#61dd289e7838e30000dc9cb5]", - "tag": " ", - "content": "from [/villagepump/記法サンプル#61dd289e7838e30000dc9cb5]", - }, - "children": [ - "from ", - { - "type": "link", - "unit": { - "project": "villagepump", - "page": "記法サンプル", - "line": "61dd289e7838e30000dc9cb5", - }, - "children": "/villagepump/記法サンプル#61dd289e7838e30000dc9cb5", - }, - ], - }, - }, - { - "id": "63b7b1261280f00000c9bc26", - "text": "code:コードブロック.py", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982821, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "py", - "filename": "コードブロック.py", - "indent": 1, - "start": true, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc27", - "text": ' print("Hello World!")', - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "py", - "filename": "コードブロック.py", - "indent": 1, - "start": false, - "end": true, - }, - }, - { - "id": "63b7b1261280f00000c9bc28", - "text": "リンクなしコードブロック", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "nodes": "リンクなしコードブロック", - }, - { - "id": "63b7b1261280f00000c9bc29", - "text": "code:py", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "py", - "filename": "py", - "indent": 1, - "start": true, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc2a", - "text": ' print("Hello World!")', - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "py", - "filename": "py", - "indent": 1, - "start": false, - "end": true, - }, - }, - { - "id": "63b7b1261280f00000c9bc2b", - "text": "インデントつき", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "nodes": "インデントつき", - }, - { - "id": "63b7b1261280f00000c9bc2c", - "text": " code:インデント.md", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "md", - "filename": "インデント.md", - "indent": 2, - "start": true, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc2d", - "text": " - インデント", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "md", - "filename": "インデント.md", - "indent": 2, - "start": false, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc2e", - "text": " - インデント", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "md", - "filename": "インデント.md", - "indent": 2, - "start": false, - "end": true, - }, - }, - { - "id": "63b7b1261280f00000c9bc2f", - "text": "言語を強制", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "nodes": "言語を強制", - }, - { - "id": "63b7b1261280f00000c9bc30", - "text": " code:python(js)", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "js", - "filename": "python", - "indent": 2, - "start": true, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc31", - "text": ' console.log("I\'m JavaScript");', - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "js", - "filename": "python", - "indent": 2, - "start": false, - "end": true, - }, - }, - { - "id": "63b7b1261280f00000c9bc32", - "text": "文芸的プログラミング", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982825, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "nodes": "文芸的プログラミング", - }, - { - "id": "63b7b1261280f00000c9bc33", - "text": " 標準ヘッダファイルをインクルード", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "nodes": { - "type": "indent", - "unit": { - "whole": " 標準ヘッダファイルをインクルード", - "tag": " ", - "content": "標準ヘッダファイルをインクルード", - }, - "children": "標準ヘッダファイルをインクルード", - }, - }, - { - "id": "63b7b1261280f00000c9bc34", - "text": " code:main.cpp", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": true, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc35", - "text": " #include ", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": false, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc36", - "text": " ", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": false, - "end": true, - }, - }, - { - "id": "63b7b1261280f00000c9bc37", - "text": " main函数の定義", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "nodes": { - "type": "indent", - "unit": { - "whole": " main函数の定義", - "tag": " ", - "content": "main函数の定義", - }, - "children": "main函数の定義", - }, - }, - { - "id": "63b7b1261280f00000c9bc38", - "text": " code:main.cpp", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": true, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc39", - "text": " int main() {", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": false, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc3a", - "text": - ' std::cout << "Hello, C++" << "from scrapbox.io" << std::endl;', - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": false, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc3b", - "text": " }", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": false, - "end": false, - }, - }, - { - "id": "63b7b1261280f00000c9bc3c", - "text": " ", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982822, - "updated": 1672982822, - "section": { - "number": 1, - "start": false, - "end": false, - }, - "codeBlock": { - "lang": "cpp", - "filename": "main.cpp", - "indent": 3, - "start": false, - "end": true, - }, - }, - { - "id": "63b7b0911280f00000c9bc23", - "text": "", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982673, - "updated": 1672982673, - "section": { - "number": 1, - "start": false, - "end": true, - }, - "nodes": "", - }, - { - "id": "63b7b0911280f00000c9bc24", - "text": "#2023-01-06 14:24:35 ", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982673, - "updated": 1672982674, - "section": { - "number": 2, - "start": true, - "end": false, - }, - "nodes": [ - { - "type": "hashTag", - "unit": { - "page": "2023-01-06", - "tag": "#", - }, - "children": "#2023-01-06", - }, - " 14:24:35 ", - ], - }, - { - "id": "63b7b0931280f00000c9bc25", - "text": "", - "userId": "5ef2bdebb60650001e1280f0", - "created": 1672982674, - "updated": 1672982674, - "section": { - "number": 2, - "start": false, - "end": true, - }, - "nodes": "", - }, -]; +import sample from "./sample-lines1.json" assert { type: "json" }; Deno.test("extractCodeFiles", async (t) => { await assertSnapshot( t, - extractCodeFiles(sample), + extractCodeFiles(sample as Line[]), ); }); diff --git a/browser/dom/page.d.ts b/browser/dom/page.d.ts new file mode 100644 index 0000000..0f9e1b3 --- /dev/null +++ b/browser/dom/page.d.ts @@ -0,0 +1,69 @@ +/// +/// +/// + +import { BaseStore } from "../../deps/scrapbox.ts"; +import { Page as PageData } from "../../deps/scrapbox-rest.ts"; + +export interface SetPositionOptions { + /** カーソルが画面外に移動したとき、カーソルが見える位置までページをスクロールするかどうか + * + * @default true + */ + scrollInView?: boolean; + + /** カーソル移動イベントの発生箇所? + * + * コード内だと、"mouse"が指定されていた場合があった。詳細は不明 + */ + source?: "mouse"; +} + +export interface ApiUrlForFetch { + projectName: string; + title: string; + titleHint: string; + followRename: boolean; + search: string; +} + +export interface ApplySnapshotInit { + page: Pick; + prevPage?: Pick; + nextPage?: Pick; +} + +export type PageWithCache = PageData & { cachedAt: number | undefined }; + +/** Scrapboxのページデータを管理する内部クラス + * + * 一部型定義は書きかけ + */ +export declare class Page extends BaseStore< + { source: "mouse" | undefined } | "focusTextInput" | "scroll" | undefined +> { + public initialize(): void; + + private data: PageWithCache; + + public get(): PageWithCache; + + public apiUrlForFetch(init: ApiUrlForFetch): string; + public apiUrlForUpdatePageAccessed(pageId: string): string; + public fetch(): Promise; + + public set(page: PageWithCache): void; + public reset(): void; + public applySnapshot(init: ApplySnapshotInit): void; + setTitle(title: string, init?: { from: string }): void; + get fromCacheStorage(): boolean; + public setPin(pin: number): void; + public delete(): void; + public patch(t: unknown): void; + public patchChanges( + t: unknown, + init?: { from: string }, + ): Promise; + get hasSelfBackLink(): boolean; + public requestFetchApiCacheToServiceWorker(): unknown; +} diff --git a/browser/dom/sample-lines1.json b/browser/dom/sample-lines1.json new file mode 100644 index 0000000..4135dfe --- /dev/null +++ b/browser/dom/sample-lines1.json @@ -0,0 +1,454 @@ +[ + { + "id": "63b7aeeb5defe7001ddae116", + "text": "コードブロック記法", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982645, + "updated": 1672982645, + "title": true, + "section": { "number": 0, "start": true, "end": false } + }, + { + "id": "63b7b0761280f00000c9bc21", + "text": "ここでは[コードブロック]を表現する[scrapbox記法]を示す", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982645, + "updated": 1672982671, + "section": { "number": 0, "start": false, "end": false }, + "nodes": [ + "ここでは", + { + "type": "link", + "unit": { + "page": "コードブロック", + "content": "コードブロック", + "whole": "[コードブロック]" + }, + "children": "コードブロック" + }, + "を表現する", + { + "type": "link", + "unit": { + "page": "scrapbox記法", + "content": "scrapbox記法", + "whole": "[scrapbox記法]" + }, + "children": "scrapbox記法" + }, + "を示す" + ] + }, + { + "id": "63b7b0791280f00000c9bc22", + "text": "", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982648, + "updated": 1672982648, + "section": { "number": 0, "start": false, "end": true }, + "nodes": "" + }, + { + "id": "63b7b12b1280f00000c9bc3d", + "text": "サンプル", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982826, + "updated": 1672982828, + "section": { "number": 1, "start": true, "end": false }, + "nodes": "サンプル" + }, + { + "id": "63b7b12c1280f00000c9bc3e", + "text": " from [/villagepump/記法サンプル#61dd289e7838e30000dc9cb5]", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982828, + "updated": 1672982835, + "section": { "number": 1, "start": false, "end": false }, + "nodes": { + "type": "indent", + "unit": { + "whole": " from [/villagepump/記法サンプル#61dd289e7838e30000dc9cb5]", + "tag": " ", + "content": "from [/villagepump/記法サンプル#61dd289e7838e30000dc9cb5]" + }, + "children": [ + "from ", + { + "type": "link", + "unit": { + "project": "villagepump", + "page": "記法サンプル", + "line": "61dd289e7838e30000dc9cb5", + "content": "/villagepump/記法サンプル#61dd289e7838e30000dc9cb5", + "whole": "[/villagepump/記法サンプル#61dd289e7838e30000dc9cb5]" + }, + "children": "/villagepump/記法サンプル#61dd289e7838e30000dc9cb5" + } + ] + } + }, + { + "id": "63b7b1261280f00000c9bc26", + "text": "code:コードブロック.py", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982821, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "py", + "filename": "コードブロック.py", + "indent": 1, + "start": true, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc27", + "text": " print(\"Hello World!\")", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "py", + "filename": "コードブロック.py", + "indent": 1, + "start": false, + "end": true + } + }, + { + "id": "63b7b1261280f00000c9bc28", + "text": "無名コードブロック", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672983021, + "section": { "number": 1, "start": false, "end": false }, + "nodes": "無名コードブロック" + }, + { + "id": "63b7b1261280f00000c9bc29", + "text": "code:py", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "py", + "filename": "py", + "indent": 1, + "start": true, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc2a", + "text": " print(\"Hello World!\")", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "py", + "filename": "py", + "indent": 1, + "start": false, + "end": true + } + }, + { + "id": "63b7b1261280f00000c9bc2b", + "text": "インデントつき", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "nodes": "インデントつき" + }, + { + "id": "63b7b1261280f00000c9bc2c", + "text": " code:インデント.md", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "md", + "filename": "インデント.md", + "indent": 2, + "start": true, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc2d", + "text": " - インデント", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "md", + "filename": "インデント.md", + "indent": 2, + "start": false, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc2e", + "text": " - インデント", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "md", + "filename": "インデント.md", + "indent": 2, + "start": false, + "end": true + } + }, + { + "id": "63b7b1261280f00000c9bc2f", + "text": "言語を強制", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "nodes": "言語を強制" + }, + { + "id": "63b7b1261280f00000c9bc30", + "text": " code:python(js)", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "js", + "filename": "python", + "indent": 2, + "start": true, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc31", + "text": " console.log(\"I'm JavaScript\");", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "js", + "filename": "python", + "indent": 2, + "start": false, + "end": true + } + }, + { + "id": "63b7b1261280f00000c9bc32", + "text": "文芸的プログラミング", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982825, + "section": { "number": 1, "start": false, "end": false }, + "nodes": "文芸的プログラミング" + }, + { + "id": "63b7b1261280f00000c9bc33", + "text": " 標準ヘッダファイルをインクルード", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "nodes": { + "type": "indent", + "unit": { + "whole": " 標準ヘッダファイルをインクルード", + "tag": " ", + "content": "標準ヘッダファイルをインクルード" + }, + "children": "標準ヘッダファイルをインクルード" + } + }, + { + "id": "63b7b1261280f00000c9bc34", + "text": " code:main.cpp", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": true, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc35", + "text": " #include ", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": false, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc36", + "text": " ", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": false, + "end": true + } + }, + { + "id": "63b7b1261280f00000c9bc37", + "text": " main函数の定義", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "nodes": { + "type": "indent", + "unit": { + "whole": " main函数の定義", + "tag": " ", + "content": "main函数の定義" + }, + "children": "main函数の定義" + } + }, + { + "id": "63b7b1261280f00000c9bc38", + "text": " code:main.cpp", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": true, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc39", + "text": " int main() {", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": false, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc3a", + "text": " std::cout << \"Hello, C++\" << \"from scrapbox.io\" << std::endl;", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": false, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc3b", + "text": " }", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": false, + "end": false + } + }, + { + "id": "63b7b1261280f00000c9bc3c", + "text": " ", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982822, + "updated": 1672982822, + "section": { "number": 1, "start": false, "end": false }, + "codeBlock": { + "lang": "cpp", + "filename": "main.cpp", + "indent": 3, + "start": false, + "end": true + } + }, + { + "id": "63b7b0911280f00000c9bc23", + "text": "", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982673, + "updated": 1672982673, + "section": { "number": 1, "start": false, "end": true }, + "nodes": "" + }, + { + "id": "63b7b0911280f00000c9bc24", + "text": "#2023-01-06 14:24:35 ", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982673, + "updated": 1672982674, + "section": { "number": 2, "start": true, "end": false }, + "nodes": [ + { + "type": "hashTag", + "unit": { + "page": "2023-01-06", + "tag": "#", + "content": "2023-01-06", + "whole": "#2023-01-06" + }, + "children": "#2023-01-06" + }, + " 14:24:35 " + ] + }, + { + "id": "63b7b0931280f00000c9bc25", + "text": "", + "userId": "5ef2bdebb60650001e1280f0", + "created": 1672982674, + "updated": 1672982674, + "section": { "number": 2, "start": false, "end": true }, + "nodes": "" + } +] diff --git a/browser/dom/selection.d.ts b/browser/dom/selection.d.ts index 946d289..df6f530 100644 --- a/browser/dom/selection.d.ts +++ b/browser/dom/selection.d.ts @@ -2,7 +2,7 @@ /// /// -import { BaseStore } from "../../deps/scrapbox.ts"; +import { BaseLine, BaseStore } from "../../deps/scrapbox.ts"; import { Position } from "./position.ts"; export interface Range { @@ -10,13 +10,17 @@ export interface Range { end: Position; } -export declare class Selection extends BaseStore { +export declare class Selection extends BaseStore { constructor(); - /** `scrapbox.Page.lines`とほぼ同じ */ - get lines(): unknown[]; + /** 現在のページ本文を取得する */ + get lines(): BaseLine[]; - /** 現在の選択範囲を取得する */ + /** 現在の選択範囲を取得する + * + * @param init 選択範囲の先頭位置がRange.startになるよう並び替えたいときは`init.normalizeOrder`を`true`にする + * @return 現在の選択範囲 + */ getRange(init?: { normalizeOrder: boolean }): Range; /** 選択範囲を変更する */ @@ -25,9 +29,10 @@ export declare class Selection extends BaseStore { /** 選択を解除する */ clear(): void; - /** algorithmがよくわからない + /** 選択範囲の先頭位置がrange.startになるよう並び替える * - * 何らかの条件に基づいて、startとendを入れ替えているのはわかる + * @param range 並び替えたい選択範囲 + * @return 並び替えた選択範囲 */ normalizeOrder(range: Range): Range; diff --git a/deps/scrapbox.ts b/deps/scrapbox.ts index 9185839..b764a78 100644 --- a/deps/scrapbox.ts +++ b/deps/scrapbox.ts @@ -1,8 +1,9 @@ export type { + BaseLine, Line, Scrapbox, -} from "https://raw.githubusercontent.com/scrapbox-jp/types/0.3.8/userscript.ts"; +} from "https://raw.githubusercontent.com/scrapbox-jp/types/0.4.2/userscript.ts"; export type { BaseStore, -} from "https://raw.githubusercontent.com/scrapbox-jp/types/0.3.8/baseStore.ts"; +} from "https://raw.githubusercontent.com/scrapbox-jp/types/0.4.2/baseStore.ts"; export * from "https://esm.sh/@progfay/scrapbox-parser@8.1.0";