netscape-bookmark-parser 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README-ja.md +233 -386
- package/README.md +152 -302
- package/dist/index.d.ts +240 -0
- package/dist/index.js +333 -0
- package/dist/index.js.map +1 -0
- package/dist/web.d.ts +241 -0
- package/dist/web.js +330 -0
- package/dist/web.js.map +1 -0
- package/package.json +58 -15
- package/esm/_dnt.polyfills.d.ts +0 -101
- package/esm/_dnt.polyfills.d.ts.map +0 -1
- package/esm/_dnt.polyfills.js +0 -127
- package/esm/_dnt.shims.d.ts +0 -6
- package/esm/_dnt.shims.d.ts.map +0 -1
- package/esm/_dnt.shims.js +0 -61
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/build/deno-wasm/deno-wasm.d.ts +0 -14
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/build/deno-wasm/deno-wasm.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/build/deno-wasm/deno-wasm.js +0 -151
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/deno-dom-wasm.d.ts +0 -23
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/deno-dom-wasm.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/deno-dom-wasm.js +0 -26
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/api.d.ts +0 -24
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/api.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/api.js +0 -48
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/constructor-lock.d.ts +0 -5
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/constructor-lock.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/constructor-lock.js +0 -4
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/deserialize.d.ts +0 -4
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/deserialize.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/deserialize.js +0 -61
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/document-fragment.d.ts +0 -19
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/document-fragment.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/document-fragment.js +0 -110
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/document.d.ts +0 -68
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/document.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/document.js +0 -322
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/dom-parser.d.ts +0 -6
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/dom-parser.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/dom-parser.js +0 -46
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/element.d.ts +0 -127
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/element.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/element.js +0 -1068
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/elements/html-template-element.d.ts +0 -29
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/elements/html-template-element.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/elements/html-template-element.js +0 -94
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/html-collection.d.ts +0 -21
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/html-collection.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/html-collection.js +0 -80
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/node-list.d.ts +0 -23
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/node-list.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/node-list.js +0 -159
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/node.d.ts +0 -127
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/node.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/node.js +0 -629
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/custom-api.d.ts +0 -6
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/custom-api.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/custom-api.js +0 -5
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/nwsapi-types.d.ts +0 -12
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/nwsapi-types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/nwsapi-types.js +0 -2
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/nwsapi.d.ts +0 -90
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/nwsapi.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/nwsapi.js +0 -1611
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/selectors.d.ts +0 -16
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/selectors.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/selectors.js +0 -28
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/sizzle-types.d.ts +0 -8
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/sizzle-types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/sizzle-types.js +0 -2
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/sizzle.d.ts +0 -7
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/sizzle.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/selectors/sizzle.js +0 -2061
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/string-cache.d.ts +0 -3
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/string-cache.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/string-cache.js +0 -10
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/utils-types.d.ts +0 -13
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/utils-types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/utils-types.js +0 -8
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/utils.d.ts +0 -31
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/utils.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/dom/utils.js +0 -239
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/parser.d.ts +0 -5
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/parser.d.ts.map +0 -1
- package/esm/deps/jsr.io/@b-fuze/deno-dom/0.1.49/src/parser.js +0 -20
- package/esm/mod.d.ts +0 -10
- package/esm/mod.d.ts.map +0 -1
- package/esm/mod.js +0 -9
- package/esm/mod_web.d.ts +0 -9
- package/esm/mod_web.d.ts.map +0 -1
- package/esm/mod_web.js +0 -8
- package/esm/package.json +0 -3
- package/esm/src/BookmarksParser/BookmarksParser.d.ts +0 -66
- package/esm/src/BookmarksParser/BookmarksParser.d.ts.map +0 -1
- package/esm/src/BookmarksParser/BookmarksParser.js +0 -70
- package/esm/src/BookmarksParser/index.d.ts +0 -8
- package/esm/src/BookmarksParser/index.d.ts.map +0 -1
- package/esm/src/BookmarksParser/index.js +0 -7
- package/esm/src/BookmarksTree/BookmarksTree.d.ts +0 -112
- package/esm/src/BookmarksTree/BookmarksTree.d.ts.map +0 -1
- package/esm/src/BookmarksTree/BookmarksTree.js +0 -217
- package/esm/src/BookmarksTree/index.d.ts +0 -8
- package/esm/src/BookmarksTree/index.d.ts.map +0 -1
- package/esm/src/BookmarksTree/index.js +0 -7
- package/esm/src/deps.d.ts +0 -9
- package/esm/src/deps.d.ts.map +0 -1
- package/esm/src/deps.js +0 -7
- package/esm/src/web/BookmarksParser/BookmarksParser.d.ts +0 -66
- package/esm/src/web/BookmarksParser/BookmarksParser.d.ts.map +0 -1
- package/esm/src/web/BookmarksParser/BookmarksParser.js +0 -70
- package/esm/src/web/BookmarksParser/index.d.ts +0 -8
- package/esm/src/web/BookmarksParser/index.d.ts.map +0 -1
- package/esm/src/web/BookmarksParser/index.js +0 -7
- package/esm/src/web/BookmarksTree/BookmarksTree.d.ts +0 -112
- package/esm/src/web/BookmarksTree/BookmarksTree.d.ts.map +0 -1
- package/esm/src/web/BookmarksTree/BookmarksTree.js +0 -217
- package/esm/src/web/BookmarksTree/index.d.ts +0 -8
- package/esm/src/web/BookmarksTree/index.d.ts.map +0 -1
- package/esm/src/web/BookmarksTree/index.js +0 -7
- package/esm/src/web/deps.d.ts +0 -10
- package/esm/src/web/deps.d.ts.map +0 -1
- package/esm/src/web/deps.js +0 -9
package/README-ja.md
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
# Netscape Bookmark Parser
|
|
2
2
|
|
|
3
|
-
ブラウザのブックマークファイル(HTML
|
|
3
|
+
ブラウザのブックマークファイル(HTML 形式)を解析し、構造化データとして操作できる TypeScript/JavaScript ライブラリです。Deno と Node.js の両方のランタイムに対応しています。
|
|
4
4
|
|
|
5
5
|
> **注意:**
|
|
6
|
-
> この README は AI
|
|
6
|
+
> この README は AI による自動生成です。内容はほぼ正確ですが、不正確な説明が含まれる場合があります。
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
英語版ドキュメント: [`./README.md`](./README.md)
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
10
|
+
## 特徴
|
|
11
|
+
|
|
12
|
+
- **HTML ブックマークファイルの解析**: Chrome、Firefox、Safari など各種ブラウザからエクスポートされた HTML ブックマークファイルを解析
|
|
13
|
+
- **階層構造の完全保持**: フォルダやブックマークの階層構造を忠実に再現
|
|
14
|
+
- **双方向変換**: HTML⇔ データ構造の相互変換に対応
|
|
15
|
+
- **JSON シリアライズ**: ブックマークツリーを JSON として保存・復元可能
|
|
16
|
+
- **Deno & Node.js 両対応**: どちらのランタイムでも動作
|
|
17
|
+
- **型安全**: TypeScript による型定義を完備
|
|
16
18
|
|
|
17
19
|
## インストール
|
|
18
20
|
|
|
@@ -29,96 +31,89 @@ import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser";
|
|
|
29
31
|
### Deno
|
|
30
32
|
|
|
31
33
|
```typescript
|
|
32
|
-
import {
|
|
33
|
-
BookmarksParser,
|
|
34
|
-
BookmarksTree,
|
|
35
|
-
} from "jsr:@grakeice/netscape-bookmark-parser";
|
|
34
|
+
import { BookmarksParser, BookmarksTree } from "jsr:@grakeice/netscape-bookmark-parser";
|
|
36
35
|
```
|
|
37
36
|
|
|
38
|
-
> **注意:** JSR 版は Node.js/Deno
|
|
37
|
+
> **注意:** JSR 版は Node.js/Deno 用のエントリです。ブラウザでは npm の依存関係ゼロの `./web` エントリをご利用ください。
|
|
39
38
|
|
|
40
39
|
### ブラウザ
|
|
41
40
|
|
|
42
|
-
#### オプション 1:
|
|
41
|
+
#### オプション 1: ビルドツール利用(推奨)
|
|
43
42
|
|
|
44
|
-
**Webpack
|
|
43
|
+
**Webpack, Vite, Rollup, Parcel 等:**
|
|
45
44
|
|
|
46
45
|
```typescript
|
|
47
|
-
//
|
|
46
|
+
// ブラウザ環境ではweb最適化版を利用
|
|
48
47
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
49
48
|
|
|
50
49
|
// 例: アップロードされたブックマークファイルの解析
|
|
51
50
|
function handleFileUpload(event: Event) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
const file = (event.target as HTMLInputElement).files?.[0];
|
|
52
|
+
if (file) {
|
|
53
|
+
const reader = new FileReader();
|
|
54
|
+
reader.onload = (e) => {
|
|
55
|
+
const htmlContent = e.target?.result as string;
|
|
56
|
+
const bookmarksTree = BookmarksParser.parse(htmlContent);
|
|
57
|
+
console.log(bookmarksTree.toJSON());
|
|
58
|
+
};
|
|
59
|
+
reader.readAsText(file);
|
|
60
|
+
}
|
|
62
61
|
}
|
|
63
62
|
```
|
|
64
63
|
|
|
65
|
-
#### オプション 2: Import Maps
|
|
64
|
+
#### オプション 2: CDN + Import Maps
|
|
66
65
|
|
|
67
66
|
```html
|
|
68
67
|
<script type="importmap">
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
68
|
+
{
|
|
69
|
+
"imports": {
|
|
70
|
+
"netscape-bookmark-parser/web": "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.4/dist/web.js"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
74
73
|
</script>
|
|
75
74
|
<script type="module">
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
// ローカルインポートと同じように動作
|
|
79
|
-
const tree = BookmarksParser.parse(htmlContent);
|
|
75
|
+
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
76
|
+
const tree = BookmarksParser.parse(htmlContent);
|
|
80
77
|
</script>
|
|
81
78
|
```
|
|
82
79
|
|
|
83
|
-
#### オプション 3: CDN
|
|
80
|
+
#### オプション 3: CDN 直接インポート
|
|
84
81
|
|
|
85
82
|
```html
|
|
86
83
|
<script type="module">
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
// import maps なしでの直接 CDN インポート
|
|
84
|
+
import {
|
|
85
|
+
BookmarksParser,
|
|
86
|
+
BookmarksTree,
|
|
87
|
+
} from "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.4/dist/web.js";
|
|
93
88
|
</script>
|
|
94
89
|
```
|
|
95
90
|
|
|
96
|
-
> **ブラウザサポート:**
|
|
91
|
+
> **ブラウザサポート:** web 最適化版は npm の `./web` エントリから利用できます。ネイティブブラウザ API を使用し、DOM ライブラリへの依存はありません。
|
|
97
92
|
|
|
98
|
-
> **注意:**
|
|
93
|
+
> **注意:** web 最適化版は DOMParser 等のネイティブ API を利用し、Node.js 用ポリフィルを含まないため、ブラウザで軽量かつ高速です。
|
|
99
94
|
|
|
100
|
-
##
|
|
95
|
+
## 使い方
|
|
101
96
|
|
|
102
|
-
###
|
|
97
|
+
### 基本例
|
|
103
98
|
|
|
104
99
|
```typescript
|
|
105
100
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser";
|
|
106
101
|
|
|
107
|
-
// HTML
|
|
102
|
+
// HTMLブックマークファイルを読み込む
|
|
108
103
|
const htmlContent = `<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
109
104
|
<HTML>
|
|
110
105
|
<BODY>
|
|
111
106
|
<DL><p>
|
|
112
|
-
<DT><H3
|
|
107
|
+
<DT><H3>Folder 1</H3>
|
|
113
108
|
<DL><p>
|
|
114
|
-
<DT><A HREF="https://example.com"
|
|
109
|
+
<DT><A HREF="https://example.com">Example</A>
|
|
115
110
|
</DL><p>
|
|
116
111
|
<DT><A HREF="https://google.com">Google</A>
|
|
117
112
|
</DL><p>
|
|
118
113
|
</BODY>
|
|
119
114
|
</HTML>`;
|
|
120
115
|
|
|
121
|
-
//
|
|
116
|
+
// 解析してBookmarksTreeに変換
|
|
122
117
|
const bookmarksTree = BookmarksParser.parse(htmlContent);
|
|
123
118
|
|
|
124
119
|
// JSONとして出力
|
|
@@ -135,7 +130,6 @@ console.log(bookmarksTree.HTMLText);
|
|
|
135
130
|
// 新しいブックマークツリーを作成
|
|
136
131
|
const tree = new BookmarksTree();
|
|
137
132
|
|
|
138
|
-
// ブックマークを追加
|
|
139
133
|
tree.set("Google", "https://google.com");
|
|
140
134
|
tree.set("GitHub", "https://github.com");
|
|
141
135
|
|
|
@@ -148,8 +142,8 @@ const toolsFolder = new BookmarksTree();
|
|
|
148
142
|
toolsFolder.set("GitHub", "https://github.com");
|
|
149
143
|
toolsFolder.set("VS Code", "https://code.visualstudio.com");
|
|
150
144
|
|
|
151
|
-
devFolder.set("
|
|
152
|
-
tree.set("
|
|
145
|
+
devFolder.set("Tools", toolsFolder);
|
|
146
|
+
tree.set("Development", devFolder);
|
|
153
147
|
|
|
154
148
|
// JSONに変換
|
|
155
149
|
const json = tree.toJSON();
|
|
@@ -158,9 +152,9 @@ const json = tree.toJSON();
|
|
|
158
152
|
const restoredTree = BookmarksTree.fromJSON(json);
|
|
159
153
|
|
|
160
154
|
// ツリー構造を確認
|
|
161
|
-
console.log(tree.size); //
|
|
162
|
-
console.log(tree.has("
|
|
163
|
-
console.log(tree.get("
|
|
155
|
+
console.log(tree.size); // トップレベルのアイテム数
|
|
156
|
+
console.log(tree.has("Development")); // true
|
|
157
|
+
console.log(tree.get("Development") instanceof BookmarksTree); // true
|
|
164
158
|
```
|
|
165
159
|
|
|
166
160
|
### 複雑な構造の処理
|
|
@@ -171,16 +165,16 @@ const complexHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
|
171
165
|
<HTML>
|
|
172
166
|
<BODY>
|
|
173
167
|
<DL><p>
|
|
174
|
-
<DT><H3
|
|
168
|
+
<DT><H3>Work</H3>
|
|
175
169
|
<DL><p>
|
|
176
|
-
<DT><H3
|
|
170
|
+
<DT><H3>Development</H3>
|
|
177
171
|
<DL><p>
|
|
178
172
|
<DT><A HREF="https://github.com">GitHub</A>
|
|
179
173
|
<DT><A HREF="https://stackoverflow.com">Stack Overflow</A>
|
|
180
174
|
</DL><p>
|
|
181
175
|
<DT><A HREF="https://docs.google.com">Google Docs</A>
|
|
182
176
|
</DL><p>
|
|
183
|
-
<DT><H3
|
|
177
|
+
<DT><H3>Personal</H3>
|
|
184
178
|
<DL><p>
|
|
185
179
|
<DT><A HREF="https://youtube.com">YouTube</A>
|
|
186
180
|
<DT><A HREF="https://twitter.com">Twitter</A>
|
|
@@ -192,9 +186,9 @@ const complexHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
|
192
186
|
|
|
193
187
|
const tree = BookmarksParser.parse(complexHtml);
|
|
194
188
|
|
|
195
|
-
//
|
|
196
|
-
const workFolder = tree.get("
|
|
197
|
-
const devFolder = workFolder.get("
|
|
189
|
+
// ツリー構造をたどる
|
|
190
|
+
const workFolder = tree.get("Work") as BookmarksTree;
|
|
191
|
+
const devFolder = workFolder.get("Development") as BookmarksTree;
|
|
198
192
|
console.log(devFolder.get("GitHub")); // "https://github.com"
|
|
199
193
|
```
|
|
200
194
|
|
|
@@ -202,126 +196,151 @@ console.log(devFolder.get("GitHub")); // "https://github.com"
|
|
|
202
196
|
|
|
203
197
|
### Web 最適化版
|
|
204
198
|
|
|
205
|
-
> **重要:** ブラウザサポートは npm
|
|
199
|
+
> **重要:** ブラウザサポートは npm の `./web` エントリから利用できます。
|
|
206
200
|
|
|
207
|
-
|
|
201
|
+
このライブラリは Node.js 依存を排除し、ネイティブブラウザ API を利用する web 最適化版を提供します:
|
|
208
202
|
|
|
209
203
|
```typescript
|
|
210
|
-
//
|
|
204
|
+
// web最適化版
|
|
211
205
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
212
206
|
```
|
|
213
207
|
|
|
214
208
|
### BookmarksParser クラス
|
|
215
209
|
|
|
216
|
-
|
|
210
|
+
`BookmarksParser`は Netscape Bookmark 形式の HTML や JSON を解析し、`BookmarksTree`インスタンスに変換する静的メソッドを提供します。
|
|
211
|
+
|
|
212
|
+
#### 静的メソッド
|
|
217
213
|
|
|
218
|
-
|
|
214
|
+
- [`static parse(htmlString: string): BookmarksTree`](#static-parsehtmlstring-string-bookmarkstree)
|
|
219
215
|
|
|
220
|
-
HTML
|
|
216
|
+
- Netscape Bookmark 形式の HTML 文字列を解析し、`BookmarksTree`を返します。
|
|
217
|
+
- [`parseFromHTMLString`](#static-parsefromhtmlstringhtmlstring-string-bookmarkstree)のエイリアス。
|
|
221
218
|
|
|
222
|
-
|
|
223
|
-
- **戻り値**: 解析されたブックマークツリー
|
|
219
|
+
**例:**
|
|
224
220
|
|
|
225
|
-
|
|
221
|
+
```typescript
|
|
222
|
+
const html = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<HTML><BODY><DL><p>\n <DT><A HREF=\"https://example.com\">Example</A>\n</DL><p></BODY></HTML>`;
|
|
223
|
+
const tree = BookmarksParser.parse(html);
|
|
224
|
+
console.log(tree.toJSON());
|
|
225
|
+
```
|
|
226
226
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
227
|
+
- [`static parseFromHTMLString(htmlString: string): BookmarksTree`](#static-parsefromhtmlstringhtmlstring-string-bookmarkstree)
|
|
228
|
+
|
|
229
|
+
- HTML 文字列を解析し、`BookmarksTree`を返します。
|
|
230
|
+
|
|
231
|
+
**例:**
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
const html = `<!DOCTYPE NETSCAPE-Bookmark-file-1>...`;
|
|
235
|
+
const tree = BookmarksParser.parseFromHTMLString(html);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
- [`static parseFromDOM(dom: HTMLDocument): BookmarksTree`](#static-parsefromdomdom-htmldocument-bookmarkstree)
|
|
239
|
+
|
|
240
|
+
- 既存の`HTMLDocument`から`BookmarksTree`を生成します。
|
|
241
|
+
|
|
242
|
+
**例:**
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
const dom = new DOMParser().parseFromString(html, "text/html");
|
|
246
|
+
const tree = BookmarksParser.parseFromDOM(dom);
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
- [`static parseFromJSON(jsonString: string): BookmarksTree`](#static-parsefromjsonjsonstring-string-bookmarkstree)
|
|
250
|
+
|
|
251
|
+
- JSON 文字列を解析し、`BookmarksTree`を返します。
|
|
252
|
+
|
|
253
|
+
**例:**
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
const json = '{"Google": "https://google.com"}';
|
|
257
|
+
const tree = BookmarksParser.parseFromJSON(json);
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
231
261
|
|
|
232
262
|
### BookmarksTree クラス
|
|
233
263
|
|
|
234
|
-
|
|
264
|
+
`BookmarksTree`は`Map`を継承し、フォルダ(`BookmarksTree`)やブックマーク(URL 文字列)を階層構造で管理します。
|
|
235
265
|
|
|
236
266
|
#### コンストラクタ
|
|
237
267
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
268
|
+
- [`new BookmarksTree()`](#constructor)
|
|
269
|
+
|
|
270
|
+
**例:**
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
const tree = new BookmarksTree();
|
|
274
|
+
tree.set("Google", "https://google.com");
|
|
275
|
+
```
|
|
241
276
|
|
|
242
277
|
#### インスタンスメソッド
|
|
243
278
|
|
|
244
|
-
|
|
279
|
+
- [`toJSON(): Record<string, unknown>`](#tojson-recordstring-unknown)
|
|
245
280
|
|
|
246
|
-
ツリーを JSON
|
|
281
|
+
- ツリーを JSON オブジェクトに変換します。
|
|
247
282
|
|
|
248
|
-
|
|
249
|
-
const json = tree.toJSON();
|
|
250
|
-
console.log(JSON.stringify(json, null, 2));
|
|
251
|
-
```
|
|
283
|
+
**例:**
|
|
252
284
|
|
|
253
|
-
|
|
285
|
+
```typescript
|
|
286
|
+
const json = tree.toJSON();
|
|
287
|
+
console.log(json);
|
|
288
|
+
```
|
|
254
289
|
|
|
255
|
-
|
|
290
|
+
- [`toDOM(): HTMLDocument`](#todom-htmldocument)
|
|
256
291
|
|
|
257
|
-
|
|
258
|
-
const htmlDocument = tree.toDOM();
|
|
259
|
-
```
|
|
292
|
+
- ツリーを Netscape Bookmark 形式の HTML ドキュメントに変換します。
|
|
260
293
|
|
|
261
|
-
|
|
294
|
+
**例:**
|
|
262
295
|
|
|
263
|
-
|
|
296
|
+
```typescript
|
|
297
|
+
const dom = tree.toDOM();
|
|
298
|
+
```
|
|
264
299
|
|
|
265
|
-
|
|
266
|
-
const htmlString = tree.HTMLText;
|
|
267
|
-
console.log(htmlString); // 完全なHTMLブックマークファイル
|
|
268
|
-
```
|
|
300
|
+
- [`get HTMLString(): string`](#get-htmlstring-string)
|
|
269
301
|
|
|
270
|
-
|
|
302
|
+
- Netscape Bookmark 形式の完全な HTML 文字列を取得します。
|
|
271
303
|
|
|
272
|
-
|
|
304
|
+
**例:**
|
|
273
305
|
|
|
274
|
-
|
|
306
|
+
```typescript
|
|
307
|
+
const html = tree.HTMLString;
|
|
308
|
+
console.log(html);
|
|
309
|
+
```
|
|
275
310
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const tree = BookmarksTree.fromJSON(json);
|
|
279
|
-
```
|
|
311
|
+
- [`get HTMLText(): string`](#get-htmltext-string)
|
|
312
|
+
- `HTMLString`のエイリアス(非推奨)。
|
|
280
313
|
|
|
281
|
-
|
|
314
|
+
#### 静的メソッド
|
|
282
315
|
|
|
283
|
-
|
|
316
|
+
- [`static fromJSON(json: Record<string, unknown>): BookmarksTree`](#static-fromjsonjson-recordstring-unknown-bookmarkstree)
|
|
284
317
|
|
|
285
|
-
|
|
286
|
-
const dom = new DOMParser().parseFromString(htmlContent, "text/html");
|
|
287
|
-
const tree = BookmarksTree.fromDOM(dom);
|
|
288
|
-
```
|
|
318
|
+
- JSON オブジェクトからツリーを生成します。
|
|
289
319
|
|
|
290
|
-
|
|
320
|
+
**例:**
|
|
291
321
|
|
|
292
|
-
|
|
322
|
+
```typescript
|
|
323
|
+
const json = { Google: "https://google.com" };
|
|
324
|
+
const tree = BookmarksTree.fromJSON(json);
|
|
325
|
+
```
|
|
293
326
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
tree.has("bookmark"); // true
|
|
305
|
-
|
|
306
|
-
// アイテムを削除
|
|
307
|
-
tree.delete("bookmark");
|
|
308
|
-
|
|
309
|
-
// 繰り返し処理
|
|
310
|
-
for (const [name, value] of tree) {
|
|
311
|
-
if (typeof value === "string") {
|
|
312
|
-
console.log(`ブックマーク: ${name} -> ${value}`);
|
|
313
|
-
} else {
|
|
314
|
-
console.log(`フォルダ: ${name} (${value.size} アイテム)`);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
```
|
|
327
|
+
- [`static fromDOM(dom: HTMLDocument): BookmarksTree`](#static-fromdomdom-htmldocument-bookmarkstree)
|
|
328
|
+
|
|
329
|
+
- HTML ドキュメントからツリーを生成します。
|
|
330
|
+
|
|
331
|
+
**例:**
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
const dom = new DOMParser().parseFromString(html, "text/html");
|
|
335
|
+
const tree = BookmarksTree.fromDOM(dom);
|
|
336
|
+
```
|
|
318
337
|
|
|
319
|
-
##
|
|
338
|
+
## プロジェクト構成
|
|
320
339
|
|
|
321
340
|
```
|
|
322
341
|
src/
|
|
323
342
|
├── BookmarksTree/
|
|
324
|
-
│ ├── BookmarksTree.ts #
|
|
343
|
+
│ ├── BookmarksTree.ts # メインのブックマークツリークラス
|
|
325
344
|
│ ├── BookmarksTree.test.ts # 包括的テスト
|
|
326
345
|
│ └── index.ts # エクスポート定義
|
|
327
346
|
└── BookmarksParser/
|
|
@@ -329,151 +348,56 @@ src/
|
|
|
329
348
|
├── BookmarksParser.test.ts # パーサーテスト
|
|
330
349
|
└── index.ts # エクスポート定義
|
|
331
350
|
scripts/
|
|
332
|
-
└──
|
|
351
|
+
└── sync-jsr-version.mjs # package.jsonとJSRバージョンの同期
|
|
333
352
|
.github/
|
|
334
353
|
└── workflows/
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
└── README.md
|
|
354
|
+
├── changesets.yml # ChangesetsによるバージョンPR
|
|
355
|
+
├── ci.yml # テスト・型検査・ビルド
|
|
356
|
+
└── release.yml # NPM/JSR公開とGitHub Release
|
|
357
|
+
dist/ # 生成されるパッケージファイル(コミット対象外)
|
|
340
358
|
```
|
|
341
359
|
|
|
360
|
+
## 開発とリリース
|
|
361
|
+
|
|
362
|
+
pnpmで依存関係をインストールし、ローカル検証を実行します。
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
pnpm install
|
|
366
|
+
pnpm test
|
|
367
|
+
pnpm typecheck
|
|
368
|
+
pnpm build
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
ユーザー向け変更には `pnpm changeset` でリリースノートを追加します。`main` へのpushでChangesetsがバージョンPRを作成し、マージ時に `package.json` の変更と `jsr.json` のバージョン同期が行われます。その後の `main` へのpushでNPM/JSRへ公開し、対応する `v<version>` GitタグとGitHub Releaseを作成します。
|
|
372
|
+
|
|
342
373
|
## サポート形式
|
|
343
374
|
|
|
344
375
|
### 入力形式
|
|
345
376
|
|
|
346
377
|
- **Netscape Bookmark File Format**: 標準 HTML ブックマークファイル形式
|
|
347
|
-
- **Chrome エクスポート形式**: Chrome
|
|
348
|
-
- **Firefox エクスポート形式**: Firefox
|
|
349
|
-
- **Safari エクスポート形式**: Safari
|
|
350
|
-
- **Edge エクスポート形式**: Microsoft Edge からエクスポートされた HTML
|
|
351
|
-
- **汎用 HTML**: Netscape
|
|
378
|
+
- **Chrome エクスポート形式**: Chrome からエクスポートされた HTML
|
|
379
|
+
- **Firefox エクスポート形式**: Firefox からエクスポートされた HTML
|
|
380
|
+
- **Safari エクスポート形式**: Safari からエクスポートされた HTML
|
|
381
|
+
- **Edge エクスポート形式**: Microsoft Edge からエクスポートされた HTML
|
|
382
|
+
- **汎用 HTML**: Netscape ブックマーク構造に準拠した任意の HTML
|
|
352
383
|
|
|
353
384
|
### 出力形式
|
|
354
385
|
|
|
355
|
-
- **JSON**:
|
|
356
|
-
- **HTML**:
|
|
386
|
+
- **JSON**: プログラムから扱いやすい構造化 JSON データ
|
|
387
|
+
- **HTML**: 全ブラウザ互換の Netscape Bookmark File Format
|
|
357
388
|
- **DOM**: ブラウザ互換の HTMLDocument オブジェクト
|
|
358
389
|
|
|
359
390
|
### 特別な機能
|
|
360
391
|
|
|
361
|
-
- **Unicode 対応**:
|
|
362
|
-
- **URL
|
|
363
|
-
- **HTML エンティティ処理**: HTML
|
|
364
|
-
- **空フォルダサポート**:
|
|
365
|
-
- **重複処理**:
|
|
366
|
-
|
|
367
|
-
## 出力例
|
|
368
|
-
|
|
369
|
-
### JSON 形式
|
|
370
|
-
|
|
371
|
-
```json
|
|
372
|
-
{
|
|
373
|
-
"開発": {
|
|
374
|
-
"MDN": "https://developer.mozilla.org",
|
|
375
|
-
"ツール": {
|
|
376
|
-
"GitHub": "https://github.com",
|
|
377
|
-
"Stack Overflow": "https://stackoverflow.com"
|
|
378
|
-
}
|
|
379
|
-
},
|
|
380
|
-
"Google": "https://google.com"
|
|
381
|
-
}
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
### HTML 形式
|
|
385
|
-
|
|
386
|
-
```html
|
|
387
|
-
<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
388
|
-
<HTML>
|
|
389
|
-
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
|
|
390
|
-
<TITLE>Bookmark</TITLE>
|
|
391
|
-
<H1>Bookmark</H1>
|
|
392
|
-
<BODY>
|
|
393
|
-
<DL><p>
|
|
394
|
-
<DT><H3>開発</H3>
|
|
395
|
-
<DL><p>
|
|
396
|
-
<DT><A HREF="https://developer.mozilla.org">MDN</A>
|
|
397
|
-
<DT><H3>ツール</H3>
|
|
398
|
-
<DL><p>
|
|
399
|
-
<DT><A HREF="https://github.com">GitHub</A>
|
|
400
|
-
<DT><A HREF="https://stackoverflow.com">Stack Overflow</A>
|
|
401
|
-
</DL><p>
|
|
402
|
-
</DL><p>
|
|
403
|
-
<DT><A HREF="https://google.com">Google</A>
|
|
404
|
-
</DL>
|
|
405
|
-
</BODY>
|
|
406
|
-
</HTML>
|
|
407
|
-
```
|
|
392
|
+
- **Unicode 対応**: 国際文字や絵文字も完全サポート
|
|
393
|
+
- **URL バリデーション**: http, https, ftp, file, 相対パス等多様な URL 形式に対応
|
|
394
|
+
- **HTML エンティティ処理**: HTML エンティティの適切なエスケープ/アンエスケープ
|
|
395
|
+
- **空フォルダサポート**: 空のフォルダも構造として保持
|
|
396
|
+
- **重複処理**: 同名ブックマークは後勝ち
|
|
408
397
|
|
|
409
398
|
## 依存関係
|
|
410
399
|
|
|
411
|
-
- [`@b-fuze/deno-dom`](https://jsr.io/@b-fuze/deno-dom): Deno
|
|
412
|
-
|
|
413
|
-
## 開発
|
|
414
|
-
|
|
415
|
-
### 前提条件
|
|
416
|
-
|
|
417
|
-
- [Deno](https://deno.land/) 1.x 以降
|
|
418
|
-
|
|
419
|
-
### セットアップ
|
|
420
|
-
|
|
421
|
-
```bash
|
|
422
|
-
git clone https://github.com/grakeice/netscape-bookmark-parser.git
|
|
423
|
-
cd netscape-bookmark-parser
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
### 開発コマンド
|
|
427
|
-
|
|
428
|
-
```bash
|
|
429
|
-
# ファイル監視付きの開発サーバーを実行
|
|
430
|
-
deno task dev
|
|
431
|
-
|
|
432
|
-
# 全テストを実行
|
|
433
|
-
deno test
|
|
434
|
-
|
|
435
|
-
# カバレッジ付きテストを実行
|
|
436
|
-
deno test --coverage
|
|
437
|
-
|
|
438
|
-
# コードをフォーマット
|
|
439
|
-
deno fmt
|
|
440
|
-
|
|
441
|
-
# コードをリント
|
|
442
|
-
deno lint
|
|
443
|
-
|
|
444
|
-
# Node.js用にビルド
|
|
445
|
-
deno task build:npm
|
|
446
|
-
|
|
447
|
-
# 特定のバージョンでビルド
|
|
448
|
-
deno task build:npm 1.0.0
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
### テストの実行
|
|
452
|
-
|
|
453
|
-
プロジェクトには全機能の包括的なテストスイートが含まれています:
|
|
454
|
-
|
|
455
|
-
```bash
|
|
456
|
-
# 全テストを実行
|
|
457
|
-
deno test
|
|
458
|
-
|
|
459
|
-
# 特定のテストファイルを実行
|
|
460
|
-
deno test src/BookmarksTree/BookmarksTree.test.ts
|
|
461
|
-
|
|
462
|
-
# 詳細出力でテストを実行
|
|
463
|
-
deno test --verbose
|
|
464
|
-
|
|
465
|
-
# テストを実行してカバレッジレポートを生成
|
|
466
|
-
deno test --coverage=coverage_dir
|
|
467
|
-
deno coverage coverage_dir
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
### パブリッシュ
|
|
471
|
-
|
|
472
|
-
プロジェクトは GitHub Actions による自動パブリッシュを使用しています:
|
|
473
|
-
|
|
474
|
-
1. バージョンタグを作成: `git tag v1.0.0`
|
|
475
|
-
2. タグをプッシュ: `git push origin v1.0.0`
|
|
476
|
-
3. GitHub Actions が自動的にビルドして NPM と JSR の両方にパブリッシュ
|
|
400
|
+
- [`@b-fuze/deno-dom`](https://jsr.io/@b-fuze/deno-dom): Deno/Node.js 両対応の DOM パーサ・操作
|
|
477
401
|
|
|
478
402
|
## ブラウザ互換性
|
|
479
403
|
|
|
@@ -486,9 +410,9 @@ deno coverage coverage_dir
|
|
|
486
410
|
- **Opera**: 全バージョン
|
|
487
411
|
- **Internet Explorer**: 6+(レガシーサポート)
|
|
488
412
|
|
|
489
|
-
###
|
|
413
|
+
### エクスポートファイル例
|
|
490
414
|
|
|
491
|
-
|
|
415
|
+
ライブラリは以下のようなブックマークファイルを解析できます:
|
|
492
416
|
|
|
493
417
|
```html
|
|
494
418
|
<!-- Chrome/Edge形式 -->
|
|
@@ -498,9 +422,9 @@ deno coverage coverage_dir
|
|
|
498
422
|
<TITLE>Bookmarks</TITLE>
|
|
499
423
|
<H1>Bookmarks</H1>
|
|
500
424
|
<DL><p>
|
|
501
|
-
<DT><H3 ADD_DATE="1640995200"
|
|
425
|
+
<DT><H3 ADD_DATE="1640995200">Bookmarks bar</H3>
|
|
502
426
|
<DL><p>
|
|
503
|
-
<DT><A HREF="https://example.com" ADD_DATE="1640995200"
|
|
427
|
+
<DT><A HREF="https://example.com" ADD_DATE="1640995200">Example</A>
|
|
504
428
|
</DL><p>
|
|
505
429
|
</DL>
|
|
506
430
|
|
|
@@ -508,102 +432,18 @@ deno coverage coverage_dir
|
|
|
508
432
|
<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
509
433
|
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
|
|
510
434
|
<TITLE>Bookmarks</TITLE>
|
|
511
|
-
<H1
|
|
435
|
+
<H1>Bookmarks Menu</H1>
|
|
512
436
|
<DL><p>
|
|
513
|
-
<DT><H3
|
|
437
|
+
<DT><H3>Bookmarks Toolbar</H3>
|
|
514
438
|
<DL><p>
|
|
515
|
-
<DT><A HREF="https://example.com"
|
|
439
|
+
<DT><A HREF="https://example.com">Example Site</A>
|
|
516
440
|
</DL><p>
|
|
517
441
|
</DL>
|
|
518
442
|
```
|
|
519
443
|
|
|
520
|
-
## エラーハンドリング
|
|
521
|
-
|
|
522
|
-
ライブラリは様々なエラー条件を適切に処理します:
|
|
523
|
-
|
|
524
|
-
```typescript
|
|
525
|
-
// 無効なHTML
|
|
526
|
-
const invalidHtml =
|
|
527
|
-
"<html><body>ブックマークファイルではありません</body></html>";
|
|
528
|
-
const tree = BookmarksParser.parse(invalidHtml);
|
|
529
|
-
console.log(tree.size); // 0 - 空のツリー
|
|
530
|
-
|
|
531
|
-
// 空のコンテンツ
|
|
532
|
-
const emptyTree = BookmarksParser.parse("");
|
|
533
|
-
console.log(emptyTree.size); // 0
|
|
534
|
-
|
|
535
|
-
// 不正なURLはスキップされる
|
|
536
|
-
const htmlWithBadUrls = `<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
537
|
-
<HTML><BODY><DL><p>
|
|
538
|
-
<DT><A HREF="">空のURL</A>
|
|
539
|
-
<DT><A>HREF属性なし</A>
|
|
540
|
-
<DT><A HREF="https://valid.com">有効なリンク</A>
|
|
541
|
-
</DL><p></BODY></HTML>`;
|
|
542
|
-
|
|
543
|
-
const parsedTree = BookmarksParser.parse(htmlWithBadUrls);
|
|
544
|
-
console.log(parsedTree.size); // 1 - 有効なリンクのみ含まれる
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
## パフォーマンス
|
|
548
|
-
|
|
549
|
-
ライブラリはパフォーマンスに最適化されています:
|
|
550
|
-
|
|
551
|
-
- **メモリ効率**: O(1)検索のためのネイティブ Map 構造を使用
|
|
552
|
-
- **ストリーミング対応**: 大きなブックマークファイル(1000+ブックマーク)を処理可能
|
|
553
|
-
- **高速解析**: 効率的なツリー走査を伴う DOM ベース解析
|
|
554
|
-
- **JSON 変換**: 最適化されたシリアライゼーション/デシリアライゼーション
|
|
555
|
-
|
|
556
|
-
## TypeScript サポート
|
|
557
|
-
|
|
558
|
-
完全な TypeScript 定義が含まれています:
|
|
559
|
-
|
|
560
|
-
```typescript
|
|
561
|
-
interface BookmarkValue extends Map<string, string | BookmarksTree> {
|
|
562
|
-
toJSON(): Record<string, unknown>;
|
|
563
|
-
toDOM(): HTMLDocument;
|
|
564
|
-
readonly HTMLText: string;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
class BookmarksParser {
|
|
568
|
-
static parse(htmlContent: string): BookmarksTree;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
class BookmarksTree extends Map<string, string | BookmarksTree> {
|
|
572
|
-
toJSON(): Record<string, unknown>;
|
|
573
|
-
static fromJSON(json: Record<string, unknown>): BookmarksTree;
|
|
574
|
-
static fromDOM(dom: HTMLDocument): BookmarksTree;
|
|
575
|
-
toDOM(): HTMLDocument;
|
|
576
|
-
get HTMLText(): string;
|
|
577
|
-
}
|
|
578
|
-
```
|
|
579
|
-
|
|
580
444
|
## ライセンス
|
|
581
445
|
|
|
582
|
-
MIT License - 詳細は[LICENSE](LICENSE)
|
|
583
|
-
|
|
584
|
-
## コントリビューション
|
|
585
|
-
|
|
586
|
-
プルリクエストとイシューレポートを歓迎します!
|
|
587
|
-
|
|
588
|
-
### コントリビューション方法
|
|
589
|
-
|
|
590
|
-
1. このリポジトリをフォーク
|
|
591
|
-
2. 機能ブランチを作成(`git checkout -b feature/amazing-feature`)
|
|
592
|
-
3. テストと共に変更を実装
|
|
593
|
-
4. 全テストが通ることを確認(`deno test`)
|
|
594
|
-
5. コードをフォーマット(`deno fmt`)
|
|
595
|
-
6. 変更をコミット(`git commit -m 'Add some amazing feature'`)
|
|
596
|
-
7. ブランチにプッシュ(`git push origin feature/amazing-feature`)
|
|
597
|
-
8. プルリクエストを作成
|
|
598
|
-
|
|
599
|
-
### イシューの報告
|
|
600
|
-
|
|
601
|
-
イシューを報告する際は、以下を含めてください:
|
|
602
|
-
|
|
603
|
-
- ブラウザ/環境情報
|
|
604
|
-
- サンプルブックマーク HTML(該当する場合)
|
|
605
|
-
- 期待される動作と実際の動作
|
|
606
|
-
- 再現手順
|
|
446
|
+
MIT License - 詳細は[LICENSE](LICENSE)を参照してください。
|
|
607
447
|
|
|
608
448
|
## 作者
|
|
609
449
|
|
|
@@ -613,49 +453,56 @@ MIT License - 詳細は[LICENSE](LICENSE)ファイルを参照してください
|
|
|
613
453
|
|
|
614
454
|
## 変更履歴
|
|
615
455
|
|
|
616
|
-
### v1.1.
|
|
456
|
+
### v1.1.4(最新)
|
|
457
|
+
|
|
458
|
+
- 🛠️ **パーサ改良**(多様なブックマーク HTML 形式への互換性向上・安定性向上)
|
|
459
|
+
- 🧹 **コードリファクタリング・追加テスト**
|
|
460
|
+
- 🐞 **マイナーバグ修正**
|
|
461
|
+
- 📚 **ドキュメント更新**: API リファレンス刷新・説明統一・使用例追加・各種セクション復活
|
|
462
|
+
|
|
463
|
+
### v1.1.3
|
|
617
464
|
|
|
618
|
-
- 📝 **JSDoc コメント追加**:
|
|
619
|
-
- 📚 **ドキュメント更新**:
|
|
465
|
+
- 📝 **JSDoc コメント追加**: 主要クラス・メソッドに JSDoc 形式のコメントを追加し型情報と API 自動ドキュメント生成を強化
|
|
466
|
+
- 📚 **ドキュメント更新**: Node.js/npm インストール手順に TypeScript インポート例を追加
|
|
620
467
|
|
|
621
468
|
### v1.1.2
|
|
622
469
|
|
|
623
|
-
- 📝 **ドキュメント強化**:
|
|
624
|
-
- 🔧 **バージョン一貫性**:
|
|
625
|
-
- 📚
|
|
470
|
+
- 📝 **ドキュメント強化**: 最新バージョン参照と改善例を含む README ドキュメント更新
|
|
471
|
+
- 🔧 **バージョン一貫性**: 全ドキュメント・コード例でバージョン番号を統一
|
|
472
|
+
- 📚 **内容更新**: インストール手順・使用例・API ドキュメントの明確化
|
|
626
473
|
|
|
627
474
|
### v1.1.1
|
|
628
475
|
|
|
629
|
-
- 🛡️ **セキュリティ強化**: [`BookmarksTree.prototype.HTMLText`](src/BookmarksTree/BookmarksTree.ts)
|
|
630
|
-
- 🔧 **コード一貫性**: Node.js
|
|
631
|
-
- 📝 **ドキュメント更新**: セキュリティ考慮事項を含む API
|
|
632
|
-
- 🐛 **バグ修正**:
|
|
476
|
+
- 🛡️ **セキュリティ強化**: [`BookmarksTree.prototype.HTMLText`](src/BookmarksTree/BookmarksTree.ts)がブックマークタイトル・URL の HTML エンティティを適切にエスケープ
|
|
477
|
+
- 🔧 **コード一貫性**: Node.js/ブラウザ版間で HTML エスケープ動作を統一
|
|
478
|
+
- 📝 **ドキュメント更新**: セキュリティ考慮事項を含む API ドキュメント強化
|
|
479
|
+
- 🐛 **バグ修正**: 安定性向上・エッジケース対応
|
|
633
480
|
|
|
634
481
|
### v1.1.0
|
|
635
482
|
|
|
636
|
-
- 🌐 **ブラウザサポート**:
|
|
637
|
-
- 📦 **デュアルエントリーポイント**: Node.js/Deno
|
|
638
|
-
- ⚡ **ネイティブ DOM API**:
|
|
639
|
-
- 🔧 **ビルド最適化**:
|
|
640
|
-
- 📚 **ドキュメント更新**:
|
|
483
|
+
- 🌐 **ブラウザサポート**: ブラウザ用 web 最適化版を追加
|
|
484
|
+
- 📦 **デュアルエントリーポイント**: Node.js/Deno 用(`src/index.ts`)とブラウザ用(`src/web.ts`)を分離
|
|
485
|
+
- ⚡ **ネイティブ DOM API**: ブラウザ版は DOMParser 等のネイティブ API で高速化
|
|
486
|
+
- 🔧 **ビルド最適化**: ポリフィル除去等によるビルド強化
|
|
487
|
+
- 📚 **ドキュメント更新**: ブラウザ利用例・API リファレンス追加
|
|
641
488
|
|
|
642
489
|
### v1.0.1
|
|
643
490
|
|
|
644
|
-
- ✨ **コア機能**:
|
|
645
|
-
- 🏗️ **BookmarksTree クラス**: Map
|
|
646
|
-
- 🔄 **双方向変換**: JSON
|
|
647
|
-
- 🧪 **包括的テスト**:
|
|
648
|
-
- 📦
|
|
649
|
-
- 🔧 **TypeScript サポート**:
|
|
650
|
-
- 🤖 **CI/CD パイプライン**: GitHub Actions
|
|
651
|
-
- 📚 **ドキュメント**:
|
|
652
|
-
- 🌐
|
|
653
|
-
- ⚡ **パフォーマンス最適化**:
|
|
654
|
-
- 🛡️ **エラーハンドリング**:
|
|
491
|
+
- ✨ **コア機能**: HTML ブックマークファイルの完全解析
|
|
492
|
+
- 🏗️ **BookmarksTree クラス**: Map インターフェースによる階層構造管理
|
|
493
|
+
- 🔄 **双方向変換**: JSON↔HTML↔DOM 変換サポート
|
|
494
|
+
- 🧪 **包括的テスト**: エッジケース対応含む完全テストカバレッジ
|
|
495
|
+
- 📦 **マルチランタイム対応**: Deno/Node.js 両対応
|
|
496
|
+
- 🔧 **TypeScript サポート**: 型定義・IntelliSense 完備
|
|
497
|
+
- 🤖 **CI/CD パイプライン**: GitHub Actions による自動テスト・公開
|
|
498
|
+
- 📚 **ドキュメント**: 例・API リファレンス含む README
|
|
499
|
+
- 🌐 **国際化対応**: Unicode・多言語ブックマーク対応
|
|
500
|
+
- ⚡ **パフォーマンス最適化**: 大規模ブックマークも効率的に解析
|
|
501
|
+
- 🛡️ **エラーハンドリング**: 不正 HTML・無効 URL も安全に処理
|
|
655
502
|
|
|
656
503
|
### v0.0.1-pre4
|
|
657
504
|
|
|
658
|
-
-
|
|
659
|
-
-
|
|
505
|
+
- 初期プレリリース
|
|
506
|
+
- コア機能の PoC
|
|
660
507
|
- 基本的な解析実装
|
|
661
|
-
-
|
|
508
|
+
- 初期テストセットアップ
|