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