netscape-bookmark-parser 1.1.3 → 1.1.4
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/README-ja.md +194 -357
- package/README.md +108 -268
- package/esm/src/BookmarksParser/BookmarksParser.d.ts +74 -10
- package/esm/src/BookmarksParser/BookmarksParser.d.ts.map +1 -1
- package/esm/src/BookmarksParser/BookmarksParser.js +83 -11
- package/esm/src/BookmarksTree/BookmarksTree.d.ts +7 -1
- package/esm/src/BookmarksTree/BookmarksTree.d.ts.map +1 -1
- package/esm/src/BookmarksTree/BookmarksTree.js +11 -3
- package/esm/src/web/BookmarksParser/BookmarksParser.d.ts +74 -10
- package/esm/src/web/BookmarksParser/BookmarksParser.d.ts.map +1 -1
- package/esm/src/web/BookmarksParser/BookmarksParser.js +83 -11
- package/esm/src/web/BookmarksTree/BookmarksTree.d.ts +7 -1
- package/esm/src/web/BookmarksTree/BookmarksTree.d.ts.map +1 -1
- package/esm/src/web/BookmarksTree/BookmarksTree.js +11 -3
- package/package.json +1 -1
package/README-ja.md
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
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
|
+
> 英語版ドキュメント: [`./README.md`](./README.md)
|
|
7
8
|
|
|
8
|
-
##
|
|
9
|
+
## 特徴
|
|
9
10
|
|
|
10
|
-
- **HTML ブックマークファイルの解析**: Chrome、Firefox、Safari
|
|
11
|
-
-
|
|
12
|
-
- **双方向変換**: HTML
|
|
13
|
-
- **JSON
|
|
14
|
-
- **Deno & Node.js
|
|
15
|
-
-
|
|
11
|
+
- **HTML ブックマークファイルの解析**: Chrome、Firefox、Safari など各種ブラウザからエクスポートされた HTML ブックマークファイルを解析
|
|
12
|
+
- **階層構造の完全保持**: フォルダやブックマークの階層構造を忠実に再現
|
|
13
|
+
- **双方向変換**: HTML⇔ データ構造の相互変換に対応
|
|
14
|
+
- **JSON シリアライズ**: ブックマークツリーを JSON として保存・復元可能
|
|
15
|
+
- **Deno & Node.js 両対応**: どちらのランタイムでも動作
|
|
16
|
+
- **型安全**: TypeScript による型定義を完備
|
|
16
17
|
|
|
17
18
|
## インストール
|
|
18
19
|
|
|
@@ -35,16 +36,16 @@ import {
|
|
|
35
36
|
} from "jsr:@grakeice/netscape-bookmark-parser";
|
|
36
37
|
```
|
|
37
38
|
|
|
38
|
-
> **注意:** JSR 版は Node.js/Deno
|
|
39
|
+
> **注意:** JSR 版は Node.js/Deno ランタイムのみ対応です。ブラウザで利用する場合は npm パッケージをご利用ください。
|
|
39
40
|
|
|
40
41
|
### ブラウザ
|
|
41
42
|
|
|
42
|
-
#### オプション 1:
|
|
43
|
+
#### オプション 1: ビルドツール利用(推奨)
|
|
43
44
|
|
|
44
|
-
**Webpack
|
|
45
|
+
**Webpack, Vite, Rollup, Parcel 等:**
|
|
45
46
|
|
|
46
47
|
```typescript
|
|
47
|
-
//
|
|
48
|
+
// ブラウザ環境ではweb最適化版を利用
|
|
48
49
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
49
50
|
|
|
50
51
|
// 例: アップロードされたブックマークファイルの解析
|
|
@@ -62,63 +63,59 @@ function handleFileUpload(event: Event) {
|
|
|
62
63
|
}
|
|
63
64
|
```
|
|
64
65
|
|
|
65
|
-
#### オプション 2: Import Maps
|
|
66
|
+
#### オプション 2: CDN + Import Maps
|
|
66
67
|
|
|
67
68
|
```html
|
|
68
69
|
<script type="importmap">
|
|
69
70
|
{
|
|
70
71
|
"imports": {
|
|
71
|
-
"netscape-bookmark-parser/web": "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.
|
|
72
|
+
"netscape-bookmark-parser/web": "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.4/esm/mod_web.js"
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
</script>
|
|
75
76
|
<script type="module">
|
|
76
77
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
77
|
-
|
|
78
|
-
// ローカルインポートと同じように動作
|
|
79
78
|
const tree = BookmarksParser.parse(htmlContent);
|
|
80
79
|
</script>
|
|
81
80
|
```
|
|
82
81
|
|
|
83
|
-
#### オプション 3: CDN
|
|
82
|
+
#### オプション 3: CDN 直接インポート
|
|
84
83
|
|
|
85
84
|
```html
|
|
86
85
|
<script type="module">
|
|
87
86
|
import {
|
|
88
87
|
BookmarksParser,
|
|
89
88
|
BookmarksTree,
|
|
90
|
-
} from "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.
|
|
91
|
-
|
|
92
|
-
// import maps なしでの直接 CDN インポート
|
|
89
|
+
} from "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.4/esm/mod_web.js";
|
|
93
90
|
</script>
|
|
94
91
|
```
|
|
95
92
|
|
|
96
|
-
> **ブラウザサポート:**
|
|
93
|
+
> **ブラウザサポート:** ブラウザ互換は npm パッケージ経由のみ。JSR パッケージには web 最適化版は含まれません。
|
|
97
94
|
|
|
98
|
-
> **注意:**
|
|
95
|
+
> **注意:** web 最適化版は DOMParser 等のネイティブ API を利用し、Node.js 用ポリフィルを含まないため、ブラウザで軽量かつ高速です。
|
|
99
96
|
|
|
100
|
-
##
|
|
97
|
+
## 使い方
|
|
101
98
|
|
|
102
|
-
###
|
|
99
|
+
### 基本例
|
|
103
100
|
|
|
104
101
|
```typescript
|
|
105
102
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser";
|
|
106
103
|
|
|
107
|
-
// HTML
|
|
104
|
+
// HTMLブックマークファイルを読み込む
|
|
108
105
|
const htmlContent = `<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
109
106
|
<HTML>
|
|
110
107
|
<BODY>
|
|
111
108
|
<DL><p>
|
|
112
|
-
<DT><H3
|
|
109
|
+
<DT><H3>Folder 1</H3>
|
|
113
110
|
<DL><p>
|
|
114
|
-
<DT><A HREF="https://example.com"
|
|
111
|
+
<DT><A HREF="https://example.com">Example</A>
|
|
115
112
|
</DL><p>
|
|
116
113
|
<DT><A HREF="https://google.com">Google</A>
|
|
117
114
|
</DL><p>
|
|
118
115
|
</BODY>
|
|
119
116
|
</HTML>`;
|
|
120
117
|
|
|
121
|
-
//
|
|
118
|
+
// 解析してBookmarksTreeに変換
|
|
122
119
|
const bookmarksTree = BookmarksParser.parse(htmlContent);
|
|
123
120
|
|
|
124
121
|
// JSONとして出力
|
|
@@ -135,7 +132,6 @@ console.log(bookmarksTree.HTMLText);
|
|
|
135
132
|
// 新しいブックマークツリーを作成
|
|
136
133
|
const tree = new BookmarksTree();
|
|
137
134
|
|
|
138
|
-
// ブックマークを追加
|
|
139
135
|
tree.set("Google", "https://google.com");
|
|
140
136
|
tree.set("GitHub", "https://github.com");
|
|
141
137
|
|
|
@@ -148,8 +144,8 @@ const toolsFolder = new BookmarksTree();
|
|
|
148
144
|
toolsFolder.set("GitHub", "https://github.com");
|
|
149
145
|
toolsFolder.set("VS Code", "https://code.visualstudio.com");
|
|
150
146
|
|
|
151
|
-
devFolder.set("
|
|
152
|
-
tree.set("
|
|
147
|
+
devFolder.set("Tools", toolsFolder);
|
|
148
|
+
tree.set("Development", devFolder);
|
|
153
149
|
|
|
154
150
|
// JSONに変換
|
|
155
151
|
const json = tree.toJSON();
|
|
@@ -158,9 +154,9 @@ const json = tree.toJSON();
|
|
|
158
154
|
const restoredTree = BookmarksTree.fromJSON(json);
|
|
159
155
|
|
|
160
156
|
// ツリー構造を確認
|
|
161
|
-
console.log(tree.size); //
|
|
162
|
-
console.log(tree.has("
|
|
163
|
-
console.log(tree.get("
|
|
157
|
+
console.log(tree.size); // トップレベルのアイテム数
|
|
158
|
+
console.log(tree.has("Development")); // true
|
|
159
|
+
console.log(tree.get("Development") instanceof BookmarksTree); // true
|
|
164
160
|
```
|
|
165
161
|
|
|
166
162
|
### 複雑な構造の処理
|
|
@@ -171,16 +167,16 @@ const complexHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
|
171
167
|
<HTML>
|
|
172
168
|
<BODY>
|
|
173
169
|
<DL><p>
|
|
174
|
-
<DT><H3
|
|
170
|
+
<DT><H3>Work</H3>
|
|
175
171
|
<DL><p>
|
|
176
|
-
<DT><H3
|
|
172
|
+
<DT><H3>Development</H3>
|
|
177
173
|
<DL><p>
|
|
178
174
|
<DT><A HREF="https://github.com">GitHub</A>
|
|
179
175
|
<DT><A HREF="https://stackoverflow.com">Stack Overflow</A>
|
|
180
176
|
</DL><p>
|
|
181
177
|
<DT><A HREF="https://docs.google.com">Google Docs</A>
|
|
182
178
|
</DL><p>
|
|
183
|
-
<DT><H3
|
|
179
|
+
<DT><H3>Personal</H3>
|
|
184
180
|
<DL><p>
|
|
185
181
|
<DT><A HREF="https://youtube.com">YouTube</A>
|
|
186
182
|
<DT><A HREF="https://twitter.com">Twitter</A>
|
|
@@ -192,9 +188,9 @@ const complexHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
|
192
188
|
|
|
193
189
|
const tree = BookmarksParser.parse(complexHtml);
|
|
194
190
|
|
|
195
|
-
//
|
|
196
|
-
const workFolder = tree.get("
|
|
197
|
-
const devFolder = workFolder.get("
|
|
191
|
+
// ツリー構造をたどる
|
|
192
|
+
const workFolder = tree.get("Work") as BookmarksTree;
|
|
193
|
+
const devFolder = workFolder.get("Development") as BookmarksTree;
|
|
198
194
|
console.log(devFolder.get("GitHub")); // "https://github.com"
|
|
199
195
|
```
|
|
200
196
|
|
|
@@ -202,126 +198,151 @@ console.log(devFolder.get("GitHub")); // "https://github.com"
|
|
|
202
198
|
|
|
203
199
|
### Web 最適化版
|
|
204
200
|
|
|
205
|
-
> **重要:** ブラウザサポートは npm
|
|
201
|
+
> **重要:** ブラウザサポートは npm インストールのみ。JSR 版にはブラウザ互換ビルドは含まれません。
|
|
206
202
|
|
|
207
|
-
|
|
203
|
+
このライブラリは Node.js 依存を排除し、ネイティブブラウザ API を利用する web 最適化版を提供します:
|
|
208
204
|
|
|
209
205
|
```typescript
|
|
210
|
-
//
|
|
206
|
+
// npmのみで利用可能なweb最適化版
|
|
211
207
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
212
208
|
```
|
|
213
209
|
|
|
214
210
|
### BookmarksParser クラス
|
|
215
211
|
|
|
216
|
-
|
|
212
|
+
`BookmarksParser`は Netscape Bookmark 形式の HTML や JSON を解析し、`BookmarksTree`インスタンスに変換する静的メソッドを提供します。
|
|
217
213
|
|
|
218
|
-
####
|
|
214
|
+
#### 静的メソッド
|
|
219
215
|
|
|
220
|
-
|
|
216
|
+
- [`static parse(htmlString: string): BookmarksTree`](#static-parsehtmlstring-string-bookmarkstree)
|
|
221
217
|
|
|
222
|
-
-
|
|
223
|
-
-
|
|
218
|
+
- Netscape Bookmark 形式の HTML 文字列を解析し、`BookmarksTree`を返します。
|
|
219
|
+
- [`parseFromHTMLString`](#static-parsefromhtmlstringhtmlstring-string-bookmarkstree)のエイリアス。
|
|
224
220
|
|
|
225
|
-
**例:**
|
|
221
|
+
**例:**
|
|
226
222
|
|
|
227
|
-
```typescript
|
|
228
|
-
const
|
|
229
|
-
const tree = BookmarksParser.parse(
|
|
230
|
-
|
|
223
|
+
```typescript
|
|
224
|
+
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>`;
|
|
225
|
+
const tree = BookmarksParser.parse(html);
|
|
226
|
+
console.log(tree.toJSON());
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
- [`static parseFromHTMLString(htmlString: string): BookmarksTree`](#static-parsefromhtmlstringhtmlstring-string-bookmarkstree)
|
|
230
|
+
|
|
231
|
+
- HTML 文字列を解析し、`BookmarksTree`を返します。
|
|
232
|
+
|
|
233
|
+
**例:**
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
const html = `<!DOCTYPE NETSCAPE-Bookmark-file-1>...`;
|
|
237
|
+
const tree = BookmarksParser.parseFromHTMLString(html);
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
- [`static parseFromDOM(dom: HTMLDocument): BookmarksTree`](#static-parsefromdomdom-htmldocument-bookmarkstree)
|
|
241
|
+
|
|
242
|
+
- 既存の`HTMLDocument`から`BookmarksTree`を生成します。
|
|
243
|
+
|
|
244
|
+
**例:**
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
const dom = new DOMParser().parseFromString(html, "text/html");
|
|
248
|
+
const tree = BookmarksParser.parseFromDOM(dom);
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
- [`static parseFromJSON(jsonString: string): BookmarksTree`](#static-parsefromjsonjsonstring-string-bookmarkstree)
|
|
252
|
+
|
|
253
|
+
- JSON 文字列を解析し、`BookmarksTree`を返します。
|
|
254
|
+
|
|
255
|
+
**例:**
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
const json = '{"Google": "https://google.com"}';
|
|
259
|
+
const tree = BookmarksParser.parseFromJSON(json);
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
231
263
|
|
|
232
264
|
### BookmarksTree クラス
|
|
233
265
|
|
|
234
|
-
|
|
266
|
+
`BookmarksTree`は`Map`を継承し、フォルダ(`BookmarksTree`)やブックマーク(URL 文字列)を階層構造で管理します。
|
|
235
267
|
|
|
236
268
|
#### コンストラクタ
|
|
237
269
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
270
|
+
- [`new BookmarksTree()`](#constructor)
|
|
271
|
+
|
|
272
|
+
**例:**
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
const tree = new BookmarksTree();
|
|
276
|
+
tree.set("Google", "https://google.com");
|
|
277
|
+
```
|
|
241
278
|
|
|
242
279
|
#### インスタンスメソッド
|
|
243
280
|
|
|
244
|
-
|
|
281
|
+
- [`toJSON(): Record<string, unknown>`](#tojson-recordstring-unknown)
|
|
245
282
|
|
|
246
|
-
ツリーを JSON
|
|
283
|
+
- ツリーを JSON オブジェクトに変換します。
|
|
247
284
|
|
|
248
|
-
|
|
249
|
-
const json = tree.toJSON();
|
|
250
|
-
console.log(JSON.stringify(json, null, 2));
|
|
251
|
-
```
|
|
285
|
+
**例:**
|
|
252
286
|
|
|
253
|
-
|
|
287
|
+
```typescript
|
|
288
|
+
const json = tree.toJSON();
|
|
289
|
+
console.log(json);
|
|
290
|
+
```
|
|
254
291
|
|
|
255
|
-
|
|
292
|
+
- [`toDOM(): HTMLDocument`](#todom-htmldocument)
|
|
256
293
|
|
|
257
|
-
|
|
258
|
-
const htmlDocument = tree.toDOM();
|
|
259
|
-
```
|
|
294
|
+
- ツリーを Netscape Bookmark 形式の HTML ドキュメントに変換します。
|
|
260
295
|
|
|
261
|
-
|
|
296
|
+
**例:**
|
|
262
297
|
|
|
263
|
-
|
|
298
|
+
```typescript
|
|
299
|
+
const dom = tree.toDOM();
|
|
300
|
+
```
|
|
264
301
|
|
|
265
|
-
|
|
266
|
-
const htmlString = tree.HTMLText;
|
|
267
|
-
console.log(htmlString); // 完全なHTMLブックマークファイル
|
|
268
|
-
```
|
|
302
|
+
- [`get HTMLString(): string`](#get-htmlstring-string)
|
|
269
303
|
|
|
270
|
-
|
|
304
|
+
- Netscape Bookmark 形式の完全な HTML 文字列を取得します。
|
|
271
305
|
|
|
272
|
-
|
|
306
|
+
**例:**
|
|
273
307
|
|
|
274
|
-
|
|
308
|
+
```typescript
|
|
309
|
+
const html = tree.HTMLString;
|
|
310
|
+
console.log(html);
|
|
311
|
+
```
|
|
275
312
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const tree = BookmarksTree.fromJSON(json);
|
|
279
|
-
```
|
|
313
|
+
- [`get HTMLText(): string`](#get-htmltext-string)
|
|
314
|
+
- `HTMLString`のエイリアス(非推奨)。
|
|
280
315
|
|
|
281
|
-
|
|
316
|
+
#### 静的メソッド
|
|
282
317
|
|
|
283
|
-
|
|
318
|
+
- [`static fromJSON(json: Record<string, unknown>): BookmarksTree`](#static-fromjsonjson-recordstring-unknown-bookmarkstree)
|
|
284
319
|
|
|
285
|
-
|
|
286
|
-
const dom = new DOMParser().parseFromString(htmlContent, "text/html");
|
|
287
|
-
const tree = BookmarksTree.fromDOM(dom);
|
|
288
|
-
```
|
|
320
|
+
- JSON オブジェクトからツリーを生成します。
|
|
289
321
|
|
|
290
|
-
|
|
322
|
+
**例:**
|
|
291
323
|
|
|
292
|
-
|
|
324
|
+
```typescript
|
|
325
|
+
const json = { Google: "https://google.com" };
|
|
326
|
+
const tree = BookmarksTree.fromJSON(json);
|
|
327
|
+
```
|
|
293
328
|
|
|
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
|
-
```
|
|
329
|
+
- [`static fromDOM(dom: HTMLDocument): BookmarksTree`](#static-fromdomdom-htmldocument-bookmarkstree)
|
|
330
|
+
|
|
331
|
+
- HTML ドキュメントからツリーを生成します。
|
|
332
|
+
|
|
333
|
+
**例:**
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
const dom = new DOMParser().parseFromString(html, "text/html");
|
|
337
|
+
const tree = BookmarksTree.fromDOM(dom);
|
|
338
|
+
```
|
|
318
339
|
|
|
319
|
-
##
|
|
340
|
+
## プロジェクト構成
|
|
320
341
|
|
|
321
342
|
```
|
|
322
343
|
src/
|
|
323
344
|
├── BookmarksTree/
|
|
324
|
-
│ ├── BookmarksTree.ts #
|
|
345
|
+
│ ├── BookmarksTree.ts # メインのブックマークツリークラス
|
|
325
346
|
│ ├── BookmarksTree.test.ts # 包括的テスト
|
|
326
347
|
│ └── index.ts # エクスポート定義
|
|
327
348
|
└── BookmarksParser/
|
|
@@ -344,136 +365,29 @@ npm/ # Node.jsビルド成果物
|
|
|
344
365
|
### 入力形式
|
|
345
366
|
|
|
346
367
|
- **Netscape Bookmark File Format**: 標準 HTML ブックマークファイル形式
|
|
347
|
-
- **Chrome エクスポート形式**: Chrome
|
|
348
|
-
- **Firefox エクスポート形式**: Firefox
|
|
349
|
-
- **Safari エクスポート形式**: Safari
|
|
350
|
-
- **Edge エクスポート形式**: Microsoft Edge からエクスポートされた HTML
|
|
351
|
-
- **汎用 HTML**: Netscape
|
|
368
|
+
- **Chrome エクスポート形式**: Chrome からエクスポートされた HTML
|
|
369
|
+
- **Firefox エクスポート形式**: Firefox からエクスポートされた HTML
|
|
370
|
+
- **Safari エクスポート形式**: Safari からエクスポートされた HTML
|
|
371
|
+
- **Edge エクスポート形式**: Microsoft Edge からエクスポートされた HTML
|
|
372
|
+
- **汎用 HTML**: Netscape ブックマーク構造に準拠した任意の HTML
|
|
352
373
|
|
|
353
374
|
### 出力形式
|
|
354
375
|
|
|
355
|
-
- **JSON**:
|
|
356
|
-
- **HTML**:
|
|
376
|
+
- **JSON**: プログラムから扱いやすい構造化 JSON データ
|
|
377
|
+
- **HTML**: 全ブラウザ互換の Netscape Bookmark File Format
|
|
357
378
|
- **DOM**: ブラウザ互換の HTMLDocument オブジェクト
|
|
358
379
|
|
|
359
380
|
### 特別な機能
|
|
360
381
|
|
|
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
|
-
```
|
|
382
|
+
- **Unicode 対応**: 国際文字や絵文字も完全サポート
|
|
383
|
+
- **URL バリデーション**: http, https, ftp, file, 相対パス等多様な URL 形式に対応
|
|
384
|
+
- **HTML エンティティ処理**: HTML エンティティの適切なエスケープ/アンエスケープ
|
|
385
|
+
- **空フォルダサポート**: 空のフォルダも構造として保持
|
|
386
|
+
- **重複処理**: 同名ブックマークは後勝ち
|
|
408
387
|
|
|
409
388
|
## 依存関係
|
|
410
389
|
|
|
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 の両方にパブリッシュ
|
|
390
|
+
- [`@b-fuze/deno-dom`](https://jsr.io/@b-fuze/deno-dom): Deno/Node.js 両対応の DOM パーサ・操作
|
|
477
391
|
|
|
478
392
|
## ブラウザ互換性
|
|
479
393
|
|
|
@@ -486,9 +400,9 @@ deno coverage coverage_dir
|
|
|
486
400
|
- **Opera**: 全バージョン
|
|
487
401
|
- **Internet Explorer**: 6+(レガシーサポート)
|
|
488
402
|
|
|
489
|
-
###
|
|
403
|
+
### エクスポートファイル例
|
|
490
404
|
|
|
491
|
-
|
|
405
|
+
ライブラリは以下のようなブックマークファイルを解析できます:
|
|
492
406
|
|
|
493
407
|
```html
|
|
494
408
|
<!-- Chrome/Edge形式 -->
|
|
@@ -498,9 +412,9 @@ deno coverage coverage_dir
|
|
|
498
412
|
<TITLE>Bookmarks</TITLE>
|
|
499
413
|
<H1>Bookmarks</H1>
|
|
500
414
|
<DL><p>
|
|
501
|
-
<DT><H3 ADD_DATE="1640995200"
|
|
415
|
+
<DT><H3 ADD_DATE="1640995200">Bookmarks bar</H3>
|
|
502
416
|
<DL><p>
|
|
503
|
-
<DT><A HREF="https://example.com" ADD_DATE="1640995200"
|
|
417
|
+
<DT><A HREF="https://example.com" ADD_DATE="1640995200">Example</A>
|
|
504
418
|
</DL><p>
|
|
505
419
|
</DL>
|
|
506
420
|
|
|
@@ -508,102 +422,18 @@ deno coverage coverage_dir
|
|
|
508
422
|
<!DOCTYPE NETSCAPE-Bookmark-file-1>
|
|
509
423
|
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
|
|
510
424
|
<TITLE>Bookmarks</TITLE>
|
|
511
|
-
<H1
|
|
425
|
+
<H1>Bookmarks Menu</H1>
|
|
512
426
|
<DL><p>
|
|
513
|
-
<DT><H3
|
|
427
|
+
<DT><H3>Bookmarks Toolbar</H3>
|
|
514
428
|
<DL><p>
|
|
515
|
-
<DT><A HREF="https://example.com"
|
|
429
|
+
<DT><A HREF="https://example.com">Example Site</A>
|
|
516
430
|
</DL><p>
|
|
517
431
|
</DL>
|
|
518
432
|
```
|
|
519
433
|
|
|
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
434
|
## ライセンス
|
|
581
435
|
|
|
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
|
-
- 再現手順
|
|
436
|
+
MIT License - 詳細は[LICENSE](LICENSE)を参照してください。
|
|
607
437
|
|
|
608
438
|
## 作者
|
|
609
439
|
|
|
@@ -613,49 +443,56 @@ MIT License - 詳細は[LICENSE](LICENSE)ファイルを参照してください
|
|
|
613
443
|
|
|
614
444
|
## 変更履歴
|
|
615
445
|
|
|
616
|
-
### v1.1.
|
|
446
|
+
### v1.1.4(最新)
|
|
447
|
+
|
|
448
|
+
- 🛠️ **パーサ改良**(多様なブックマーク HTML 形式への互換性向上・安定性向上)
|
|
449
|
+
- 🧹 **コードリファクタリング・追加テスト**
|
|
450
|
+
- 🐞 **マイナーバグ修正**
|
|
451
|
+
- 📚 **ドキュメント更新**: API リファレンス刷新・説明統一・使用例追加・各種セクション復活
|
|
452
|
+
|
|
453
|
+
### v1.1.3
|
|
617
454
|
|
|
618
|
-
- 📝 **JSDoc コメント追加**:
|
|
619
|
-
- 📚 **ドキュメント更新**:
|
|
455
|
+
- 📝 **JSDoc コメント追加**: 主要クラス・メソッドに JSDoc 形式のコメントを追加し型情報と API 自動ドキュメント生成を強化
|
|
456
|
+
- 📚 **ドキュメント更新**: Node.js/npm インストール手順に TypeScript インポート例を追加
|
|
620
457
|
|
|
621
458
|
### v1.1.2
|
|
622
459
|
|
|
623
|
-
- 📝 **ドキュメント強化**:
|
|
624
|
-
- 🔧 **バージョン一貫性**:
|
|
625
|
-
- 📚
|
|
460
|
+
- 📝 **ドキュメント強化**: 最新バージョン参照と改善例を含む README ドキュメント更新
|
|
461
|
+
- 🔧 **バージョン一貫性**: 全ドキュメント・コード例でバージョン番号を統一
|
|
462
|
+
- 📚 **内容更新**: インストール手順・使用例・API ドキュメントの明確化
|
|
626
463
|
|
|
627
464
|
### v1.1.1
|
|
628
465
|
|
|
629
|
-
- 🛡️ **セキュリティ強化**: [`BookmarksTree.prototype.HTMLText`](src/BookmarksTree/BookmarksTree.ts)
|
|
630
|
-
- 🔧 **コード一貫性**: Node.js
|
|
631
|
-
- 📝 **ドキュメント更新**: セキュリティ考慮事項を含む API
|
|
632
|
-
- 🐛 **バグ修正**:
|
|
466
|
+
- 🛡️ **セキュリティ強化**: [`BookmarksTree.prototype.HTMLText`](src/BookmarksTree/BookmarksTree.ts)がブックマークタイトル・URL の HTML エンティティを適切にエスケープ
|
|
467
|
+
- 🔧 **コード一貫性**: Node.js/ブラウザ版間で HTML エスケープ動作を統一
|
|
468
|
+
- 📝 **ドキュメント更新**: セキュリティ考慮事項を含む API ドキュメント強化
|
|
469
|
+
- 🐛 **バグ修正**: 安定性向上・エッジケース対応
|
|
633
470
|
|
|
634
471
|
### v1.1.0
|
|
635
472
|
|
|
636
|
-
- 🌐 **ブラウザサポート**:
|
|
637
|
-
- 📦 **デュアルエントリーポイント**: Node.js/Deno 用(`./mod.ts`)とブラウザ用(`./mod_web.ts
|
|
638
|
-
- ⚡ **ネイティブ DOM API**:
|
|
639
|
-
- 🔧 **ビルド最適化**:
|
|
640
|
-
- 📚 **ドキュメント更新**:
|
|
473
|
+
- 🌐 **ブラウザサポート**: ブラウザ用 web 最適化版を追加
|
|
474
|
+
- 📦 **デュアルエントリーポイント**: Node.js/Deno 用(`./mod.ts`)とブラウザ用(`./mod_web.ts`)を分離
|
|
475
|
+
- ⚡ **ネイティブ DOM API**: ブラウザ版は DOMParser 等のネイティブ API で高速化
|
|
476
|
+
- 🔧 **ビルド最適化**: ポリフィル除去等によるビルド強化
|
|
477
|
+
- 📚 **ドキュメント更新**: ブラウザ利用例・API リファレンス追加
|
|
641
478
|
|
|
642
479
|
### v1.0.1
|
|
643
480
|
|
|
644
|
-
- ✨ **コア機能**:
|
|
645
|
-
- 🏗️ **BookmarksTree クラス**: Map
|
|
646
|
-
- 🔄 **双方向変換**: JSON
|
|
647
|
-
- 🧪 **包括的テスト**:
|
|
648
|
-
- 📦
|
|
649
|
-
- 🔧 **TypeScript サポート**:
|
|
650
|
-
- 🤖 **CI/CD パイプライン**: GitHub Actions
|
|
651
|
-
- 📚 **ドキュメント**:
|
|
652
|
-
- 🌐
|
|
653
|
-
- ⚡ **パフォーマンス最適化**:
|
|
654
|
-
- 🛡️ **エラーハンドリング**:
|
|
481
|
+
- ✨ **コア機能**: HTML ブックマークファイルの完全解析
|
|
482
|
+
- 🏗️ **BookmarksTree クラス**: Map インターフェースによる階層構造管理
|
|
483
|
+
- 🔄 **双方向変換**: JSON↔HTML↔DOM 変換サポート
|
|
484
|
+
- 🧪 **包括的テスト**: エッジケース対応含む完全テストカバレッジ
|
|
485
|
+
- 📦 **マルチランタイム対応**: Deno/Node.js 両対応
|
|
486
|
+
- 🔧 **TypeScript サポート**: 型定義・IntelliSense 完備
|
|
487
|
+
- 🤖 **CI/CD パイプライン**: GitHub Actions による自動テスト・公開
|
|
488
|
+
- 📚 **ドキュメント**: 例・API リファレンス含む README
|
|
489
|
+
- 🌐 **国際化対応**: Unicode・多言語ブックマーク対応
|
|
490
|
+
- ⚡ **パフォーマンス最適化**: 大規模ブックマークも効率的に解析
|
|
491
|
+
- 🛡️ **エラーハンドリング**: 不正 HTML・無効 URL も安全に処理
|
|
655
492
|
|
|
656
493
|
### v0.0.1-pre4
|
|
657
494
|
|
|
658
|
-
-
|
|
659
|
-
-
|
|
495
|
+
- 初期プレリリース
|
|
496
|
+
- コア機能の PoC
|
|
660
497
|
- 基本的な解析実装
|
|
661
|
-
-
|
|
498
|
+
- 初期テストセットアップ
|