netscape-bookmark-parser 1.1.0 → 1.1.1
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 +87 -1
- package/README.md +71 -16
- package/esm/src/BookmarksTree/BookmarksTree.d.ts.map +1 -1
- package/esm/src/BookmarksTree/BookmarksTree.js +10 -2
- package/esm/src/web/BookmarksTree/BookmarksTree.d.ts.map +1 -1
- package/esm/src/web/BookmarksTree/BookmarksTree.js +10 -2
- package/package.json +1 -1
package/README-ja.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
> **注意:**
|
|
11
11
|
> この README は AI 生成されたドキュメントです。詳細はほぼ正確ですが、不正確な説明が含まれる可能性があります。
|
|
12
12
|
|
|
13
|
-
ブラウザのブックマークファイル(HTML 形式)を解析し、構造化データとして操作するための TypeScript/JavaScript ライブラリです。Deno
|
|
13
|
+
ブラウザのブックマークファイル(HTML 形式)を解析し、構造化データとして操作するための TypeScript/JavaScript ライブラリです。Deno と Node.js の両方のランタイムに対応しています。
|
|
14
14
|
|
|
15
15
|
## 機能
|
|
16
16
|
|
|
@@ -38,13 +38,81 @@ import {
|
|
|
38
38
|
} from "jsr:@grakeice/netscape-bookmark-parser";
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
+
> **注意:** JSR 版は Node.js/Deno ランタイム版のみを含んでいます。ブラウザサポートが必要な場合は、npm パッケージをご使用ください。
|
|
42
|
+
|
|
41
43
|
### ブラウザ
|
|
42
44
|
|
|
45
|
+
#### オプション 1: ビルドツールの使用(推奨)
|
|
46
|
+
|
|
47
|
+
**Webpack、Vite、Rollup、Parcel など:**
|
|
48
|
+
|
|
43
49
|
```typescript
|
|
44
50
|
// ブラウザ環境では、Web最適化版を使用
|
|
45
51
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
52
|
+
|
|
53
|
+
// 例: アップロードされたブックマークファイルの解析
|
|
54
|
+
function handleFileUpload(event: Event) {
|
|
55
|
+
const file = (event.target as HTMLInputElement).files?.[0];
|
|
56
|
+
if (file) {
|
|
57
|
+
const reader = new FileReader();
|
|
58
|
+
reader.onload = (e) => {
|
|
59
|
+
const htmlContent = e.target?.result as string;
|
|
60
|
+
const bookmarksTree = BookmarksParser.parse(htmlContent);
|
|
61
|
+
console.log(bookmarksTree.toJSON());
|
|
62
|
+
};
|
|
63
|
+
reader.readAsText(file);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### オプション 2: 直接 ES モジュールインポート
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<script type="module">
|
|
72
|
+
import {
|
|
73
|
+
BookmarksParser,
|
|
74
|
+
BookmarksTree,
|
|
75
|
+
} from "./node_modules/netscape-bookmark-parser/esm/mod_web.js";
|
|
76
|
+
|
|
77
|
+
// ブックマーク処理コードをここに...
|
|
78
|
+
</script>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### オプション 3: Import Maps を使用した CDN
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<script type="importmap">
|
|
85
|
+
{
|
|
86
|
+
"imports": {
|
|
87
|
+
"netscape-bookmark-parser/web": "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.0/esm/mod_web.js"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
</script>
|
|
91
|
+
<script type="module">
|
|
92
|
+
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
93
|
+
|
|
94
|
+
// ローカルインポートと同じように動作
|
|
95
|
+
const tree = BookmarksParser.parse(htmlContent);
|
|
96
|
+
</script>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### オプション 4: CDN を直接インポート
|
|
100
|
+
|
|
101
|
+
```html
|
|
102
|
+
<script type="module">
|
|
103
|
+
import {
|
|
104
|
+
BookmarksParser,
|
|
105
|
+
BookmarksTree,
|
|
106
|
+
} from "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.0/esm/mod_web.js";
|
|
107
|
+
|
|
108
|
+
// import maps なしでの直接 CDN インポート
|
|
109
|
+
</script>
|
|
46
110
|
```
|
|
47
111
|
|
|
112
|
+
> **ブラウザサポート:** ブラウザ互換性は npm パッケージを通してのみ利用可能です。JSR パッケージは、プラットフォーム固有の依存関係のため、Web 最適化版を含んでいません。
|
|
113
|
+
|
|
114
|
+
> **注意:** Web 最適化版は、ネイティブブラウザ API(DOMParser など)を使用し、Node.js ポリフィルを含まないため、ブラウザ環境でより軽量で高速に動作します。
|
|
115
|
+
|
|
48
116
|
## 使用方法
|
|
49
117
|
|
|
50
118
|
### 基本的な例
|
|
@@ -148,6 +216,17 @@ console.log(devFolder.get("GitHub")); // "https://github.com"
|
|
|
148
216
|
|
|
149
217
|
## API リファレンス
|
|
150
218
|
|
|
219
|
+
### Web 最適化版
|
|
220
|
+
|
|
221
|
+
> **重要:** ブラウザサポートは npm インストールを通してのみ利用可能です。JSR 版にはブラウザ互換ビルドが含まれていません。
|
|
222
|
+
|
|
223
|
+
ライブラリは、Node.js 依存関係を排除し、ネイティブブラウザ API を使用するブラウザ最適化版を提供しています:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
// ブラウザ最適化版をインポート(npm のみ)
|
|
227
|
+
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
228
|
+
```
|
|
229
|
+
|
|
151
230
|
### BookmarksParser クラス
|
|
152
231
|
|
|
153
232
|
[`BookmarksParser`](src/BookmarksParser/BookmarksParser.ts)クラスは、HTML ブックマークファイルを解析するための静的メソッドを提供します。
|
|
@@ -571,3 +650,10 @@ MIT License - 詳細は[LICENSE](LICENSE)ファイルを参照してください
|
|
|
571
650
|
- 🌐 **国際化サポート**: Unicode と多言語ブックマークハンドリング
|
|
572
651
|
- ⚡ **パフォーマンス最適化**: 大規模ブックマークコレクションの効率的解析
|
|
573
652
|
- 🛡️ **エラーハンドリング**: 不正な HTML と無効な URL の適切な処理
|
|
653
|
+
|
|
654
|
+
### v0.0.1-pre4
|
|
655
|
+
|
|
656
|
+
- 初期のプレリリース版
|
|
657
|
+
- コア機能の概念実証
|
|
658
|
+
- 基本的な解析実装
|
|
659
|
+
- 初期テスト設定
|
package/README.md
CHANGED
|
@@ -40,13 +40,81 @@ import {
|
|
|
40
40
|
} from "jsr:@grakeice/netscape-bookmark-parser";
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
> **Note:** The JSR version only includes the Node.js/Deno runtime version. For browser support, please use the npm package.
|
|
44
|
+
|
|
43
45
|
### Browser
|
|
44
46
|
|
|
47
|
+
#### Option 1: Using Build Tools (Recommended)
|
|
48
|
+
|
|
49
|
+
**Webpack, Vite, Rollup, Parcel, etc.:**
|
|
50
|
+
|
|
45
51
|
```typescript
|
|
46
52
|
// For browser environments, use the web-optimized version
|
|
47
53
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
54
|
+
|
|
55
|
+
// Example: Parse uploaded bookmark file
|
|
56
|
+
function handleFileUpload(event: Event) {
|
|
57
|
+
const file = (event.target as HTMLInputElement).files?.[0];
|
|
58
|
+
if (file) {
|
|
59
|
+
const reader = new FileReader();
|
|
60
|
+
reader.onload = (e) => {
|
|
61
|
+
const htmlContent = e.target?.result as string;
|
|
62
|
+
const bookmarksTree = BookmarksParser.parse(htmlContent);
|
|
63
|
+
console.log(bookmarksTree.toJSON());
|
|
64
|
+
};
|
|
65
|
+
reader.readAsText(file);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
48
68
|
```
|
|
49
69
|
|
|
70
|
+
#### Option 2: Direct ES Module Import
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<script type="module">
|
|
74
|
+
import {
|
|
75
|
+
BookmarksParser,
|
|
76
|
+
BookmarksTree,
|
|
77
|
+
} from "./node_modules/netscape-bookmark-parser/esm/mod_web.js";
|
|
78
|
+
|
|
79
|
+
// Your bookmark processing code here...
|
|
80
|
+
</script>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### Option 3: CDN with Import Maps
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<script type="importmap">
|
|
87
|
+
{
|
|
88
|
+
"imports": {
|
|
89
|
+
"netscape-bookmark-parser/web": "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.0/esm/mod_web.js"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
</script>
|
|
93
|
+
<script type="module">
|
|
94
|
+
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
95
|
+
|
|
96
|
+
// Works the same as local imports
|
|
97
|
+
const tree = BookmarksParser.parse(htmlContent);
|
|
98
|
+
</script>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Option 4: Direct CDN Import
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<script type="module">
|
|
105
|
+
import {
|
|
106
|
+
BookmarksParser,
|
|
107
|
+
BookmarksTree,
|
|
108
|
+
} from "https://cdn.jsdelivr.net/npm/netscape-bookmark-parser@1.1.0/esm/mod_web.js";
|
|
109
|
+
|
|
110
|
+
// Direct CDN import without import maps
|
|
111
|
+
</script>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
> **Browser Support:** Browser compatibility is only available through the npm package. The JSR package does not include the web-optimized version due to platform-specific dependencies.
|
|
115
|
+
|
|
116
|
+
> **Note:** The web-optimized version uses native browser APIs (DOMParser, etc.) and does not include Node.js polyfills, making it lighter and faster in browser environments.
|
|
117
|
+
|
|
50
118
|
## Usage
|
|
51
119
|
|
|
52
120
|
### Basic Example
|
|
@@ -152,26 +220,13 @@ console.log(devFolder.get("GitHub")); // "https://github.com"
|
|
|
152
220
|
|
|
153
221
|
### Web-Optimized Version
|
|
154
222
|
|
|
223
|
+
> **Important:** Browser support is only available via npm installation. JSR version does not include browser-compatible builds.
|
|
224
|
+
|
|
155
225
|
The library provides a browser-optimized version that eliminates Node.js dependencies and uses native browser APIs:
|
|
156
226
|
|
|
157
227
|
```typescript
|
|
158
|
-
// Import browser-optimized version
|
|
228
|
+
// Import browser-optimized version (npm only)
|
|
159
229
|
import { BookmarksParser, BookmarksTree } from "netscape-bookmark-parser/web";
|
|
160
|
-
|
|
161
|
-
// Works with browser File API
|
|
162
|
-
document
|
|
163
|
-
.getElementById("fileInput")
|
|
164
|
-
.addEventListener("change", async (event) => {
|
|
165
|
-
const file = event.target.files[0];
|
|
166
|
-
const htmlContent = await file.text();
|
|
167
|
-
|
|
168
|
-
const bookmarksTree = BookmarksParser.parse(htmlContent);
|
|
169
|
-
console.log(bookmarksTree.toJSON());
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
// Use native DOMParser for fromDOM method
|
|
173
|
-
const dom = new DOMParser().parseFromString(htmlContent, "text/html");
|
|
174
|
-
const tree = BookmarksTree.fromDOM(dom);
|
|
175
230
|
```
|
|
176
231
|
|
|
177
232
|
### BookmarksParser Class
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarksTree.d.ts","sourceRoot":"","sources":["../../../src/src/BookmarksTree/BookmarksTree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,aAAc,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;;IAKrE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAcjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAmB7D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa;IA8ChD,KAAK,IAAI,YAAY;IAIrB,IAAI,QAAQ,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"BookmarksTree.d.ts","sourceRoot":"","sources":["../../../src/src/BookmarksTree/BookmarksTree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,aAAc,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;;IAKrE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAcjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAmB7D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa;IA8ChD,KAAK,IAAI,YAAY;IAIrB,IAAI,QAAQ,IAAI,MAAM,CA+CrB;CACD"}
|
|
@@ -80,16 +80,24 @@ export class BookmarksTree extends Map {
|
|
|
80
80
|
return new DOMParser().parseFromString(this.HTMLText, "text/html");
|
|
81
81
|
}
|
|
82
82
|
get HTMLText() {
|
|
83
|
+
const escapeHtml = (text) => {
|
|
84
|
+
return text
|
|
85
|
+
.replace(/&/g, "&")
|
|
86
|
+
.replace(/</g, "<")
|
|
87
|
+
.replace(/>/g, ">")
|
|
88
|
+
.replace(/"/g, """)
|
|
89
|
+
.replace(/'/g, "'");
|
|
90
|
+
};
|
|
83
91
|
const createBookmarkList = (tree, indent = "") => {
|
|
84
92
|
let html = `${indent}<DL><p>\n`;
|
|
85
93
|
for (const [key, value] of tree.entries()) {
|
|
86
94
|
if (typeof value === "string") {
|
|
87
95
|
// ブックマークの場合: <DT><A HREF="url">タイトル</A>
|
|
88
|
-
html += `${indent} <DT><A HREF="${value}">${key}</A>\n`;
|
|
96
|
+
html += `${indent} <DT><A HREF="${escapeHtml(value)}">${escapeHtml(key)}</A>\n`;
|
|
89
97
|
}
|
|
90
98
|
else if (value instanceof BookmarksTree) {
|
|
91
99
|
// フォルダの場合: <DT><H3>フォルダ名</H3>
|
|
92
|
-
html += `${indent} <DT><H3>${key}</H3>\n`;
|
|
100
|
+
html += `${indent} <DT><H3>${escapeHtml(key)}</H3>\n`;
|
|
93
101
|
html += createBookmarkList(value, indent + " ");
|
|
94
102
|
html += `${indent} </DL><p>\n`;
|
|
95
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarksTree.d.ts","sourceRoot":"","sources":["../../../../src/src/web/BookmarksTree/BookmarksTree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,aAAc,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;;IAKrE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAcjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAmB7D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa;IA8ChD,KAAK,IAAI,YAAY;IAIrB,IAAI,QAAQ,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"BookmarksTree.d.ts","sourceRoot":"","sources":["../../../../src/src/web/BookmarksTree/BookmarksTree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAExE,qBAAa,aAAc,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;;IAKrE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAcjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa;IAmB7D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa;IA8ChD,KAAK,IAAI,YAAY;IAIrB,IAAI,QAAQ,IAAI,MAAM,CA+CrB;CACD"}
|
|
@@ -80,16 +80,24 @@ export class BookmarksTree extends Map {
|
|
|
80
80
|
return new DOMParser().parseFromString(this.HTMLText, "text/html");
|
|
81
81
|
}
|
|
82
82
|
get HTMLText() {
|
|
83
|
+
const escapeHtml = (text) => {
|
|
84
|
+
return text
|
|
85
|
+
.replace(/&/g, "&")
|
|
86
|
+
.replace(/</g, "<")
|
|
87
|
+
.replace(/>/g, ">")
|
|
88
|
+
.replace(/"/g, """)
|
|
89
|
+
.replace(/'/g, "'");
|
|
90
|
+
};
|
|
83
91
|
const createBookmarkList = (tree, indent = "") => {
|
|
84
92
|
let html = `${indent}<DL><p>\n`;
|
|
85
93
|
for (const [key, value] of tree.entries()) {
|
|
86
94
|
if (typeof value === "string") {
|
|
87
95
|
// ブックマークの場合: <DT><A HREF="url">タイトル</A>
|
|
88
|
-
html += `${indent} <DT><A HREF="${value}">${key}</A>\n`;
|
|
96
|
+
html += `${indent} <DT><A HREF="${escapeHtml(value)}">${escapeHtml(key)}</A>\n`;
|
|
89
97
|
}
|
|
90
98
|
else if (value instanceof BookmarksTree) {
|
|
91
99
|
// フォルダの場合: <DT><H3>フォルダ名</H3>
|
|
92
|
-
html += `${indent} <DT><H3>${key}</H3>\n`;
|
|
100
|
+
html += `${indent} <DT><H3>${escapeHtml(key)}</H3>\n`;
|
|
93
101
|
html += createBookmarkList(value, indent + " ");
|
|
94
102
|
html += `${indent} </DL><p>\n`;
|
|
95
103
|
}
|