netscape-bookmark-parser 1.2.0 → 1.2.2

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/dist/index.d.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import { HTMLDocument } from "@b-fuze/deno-dom";
2
-
3
2
  //#region src/BookmarksTree/BookmarksTree.d.ts
4
-
5
3
  /**
6
4
  * A class representing a bookmark tree in Netscape Bookmark format
7
5
  *
@@ -18,7 +16,7 @@ import { HTMLDocument } from "@b-fuze/deno-dom";
18
16
  * tree.set("Development", folder);
19
17
  * ```
20
18
  */
21
- declare class BookmarksTree extends Map<string, string | BookmarksTree> {
19
+ export declare class BookmarksTree extends Map<string, string | BookmarksTree> {
22
20
  /**
23
21
  * Creates a new BookmarksTree instance
24
22
  */
@@ -138,7 +136,7 @@ declare class BookmarksTree extends Map<string, string | BookmarksTree> {
138
136
  * const tree = BookmarksParser.parse(bookmarkHtml);
139
137
  * ```
140
138
  */
141
- declare class BookmarksParser {
139
+ export declare class BookmarksParser {
142
140
  /**
143
141
  * Alias for the {@link parseFromHTMLString} method.
144
142
  *
@@ -236,5 +234,4 @@ declare class BookmarksParser {
236
234
  static parseFromJSON(jsonObj: Record<string, unknown>): BookmarksTree;
237
235
  }
238
236
  //#endregion
239
- export { BookmarksParser, BookmarksTree };
240
237
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,18 +1,27 @@
1
1
  import { DOMParser } from "@b-fuze/deno-dom";
2
-
3
2
  //#region src/dom.ts
4
3
  let DOMParser$1 = globalThis.DOMParser;
5
4
  const setDOMParser = (parser) => {
6
5
  DOMParser$1 = parser;
7
6
  };
8
-
9
7
  //#endregion
10
8
  //#region src/node-dom.ts
9
+ /**
10
+ * Copyright (c) 2025-2026 kurage(@umitsukidev)
11
+ *
12
+ * This software is released under the MIT License.
13
+ * https://opensource.org/licenses/MIT
14
+ */
11
15
  setDOMParser(DOMParser);
12
-
13
16
  //#endregion
14
17
  //#region src/BookmarksTree/BookmarksTree.ts
15
18
  /**
19
+ * Copyright (c) 2025-2026 kurage(@umitsukidev)
20
+ *
21
+ * This software is released under the MIT License.
22
+ * https://opensource.org/licenses/MIT
23
+ */
24
+ /**
16
25
  * A class representing a bookmark tree in Netscape Bookmark format
17
26
  *
18
27
  * This class extends Map and manages folders (BookmarksTree) and bookmarks (URL strings)
@@ -191,10 +200,15 @@ ${createBookmarkList(this)}</BODY>
191
200
  return this.HTMLString;
192
201
  }
193
202
  };
194
-
195
203
  //#endregion
196
204
  //#region src/BookmarksParser/BookmarksParser.ts
197
205
  /**
206
+ * Copyright (c) 2025-2026 kurage(@umitsukidev)
207
+ *
208
+ * This software is released under the MIT License.
209
+ * https://opensource.org/licenses/MIT
210
+ */
211
+ /**
198
212
  * A parser for Netscape Bookmark format files
199
213
  *
200
214
  * This class provides static methods to parse Netscape Bookmark format HTML strings
@@ -327,7 +341,7 @@ var BookmarksParser = class {
327
341
  return BookmarksTree.fromJSON(jsonObj);
328
342
  }
329
343
  };
330
-
331
344
  //#endregion
332
345
  export { BookmarksParser, BookmarksTree };
346
+
333
347
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["DOMParser: typeof NodeDOMParser","NodeDOMParser","json: Record<string, unknown>","DOMParser","DOMParser"],"sources":["../src/dom.ts","../src/node-dom.ts","../src/BookmarksTree/BookmarksTree.ts","../src/BookmarksParser/BookmarksParser.ts"],"sourcesContent":["/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport type { DOMParser as NodeDOMParser } from \"@b-fuze/deno-dom\";\n\nexport let DOMParser: typeof NodeDOMParser =\n\tglobalThis.DOMParser as unknown as typeof NodeDOMParser;\n\nexport const setDOMParser = (parser: typeof NodeDOMParser): void => {\n\tDOMParser = parser;\n};\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser as NodeDOMParser } from \"@b-fuze/deno-dom\";\nimport { setDOMParser } from \"./dom.ts\";\n\nsetDOMParser(NodeDOMParser);\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { Element, HTMLDocument } from \"#dom-types\";\n\n/**\n * A class representing a bookmark tree in Netscape Bookmark format\n *\n * This class extends Map and manages folders (BookmarksTree) and bookmarks (URL strings)\n * in a hierarchical structure.\n *\n * @example\n * ```typescript\n * const tree = new BookmarksTree();\n * tree.set(\"Google\", \"https://google.com\");\n *\n * const folder = new BookmarksTree();\n * folder.set(\"GitHub\", \"https://github.com\");\n * tree.set(\"Development\", folder);\n * ```\n */\nexport class BookmarksTree extends Map<string, string | BookmarksTree> {\n\t/**\n\t * Creates a new BookmarksTree instance\n\t */\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to a JSON object\n\t *\n\t * Folders are recursively converted to objects, and bookmarks are preserved as strings.\n\t *\n\t * @returns JSON object representation of the bookmark data\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const json = tree.toJSON();\n\t * // { \"Google\": \"https://google.com\" }\n\t * ```\n\t */\n\ttoJSON(): Record<string, unknown> {\n\t\tconst json: Record<string, unknown> = {};\n\n\t\tfor (const [key, value] of this.entries()) {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tjson[key] = value;\n\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\tjson[key] = value.toJSON();\n\t\t\t}\n\t\t}\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from a JSON object\n\t *\n\t * String properties are treated as bookmarks, and object properties are\n\t * recursively processed as folders.\n\t *\n\t * @param json The source JSON object to convert\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksTree.fromJSON(json);\n\t * ```\n\t */\n\tstatic fromJSON(json: Record<string, unknown>): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\n\t\tif (typeof json === \"object\" && json !== null) {\n\t\t\tfor (const [key, value] of Object.entries(json)) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\ttree.set(key, value);\n\t\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t\ttree.set(key, BookmarksTree.fromJSON(value as Record<string, unknown>));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an HTML document (Netscape Bookmark format)\n\t *\n\t * Parses Netscape Bookmark format HTML and generates a BookmarksTree that preserves\n\t * the hierarchical structure. H3 elements within DT elements are treated as folders,\n\t * and A elements are treated as bookmarks.\n\t *\n\t * @param dom The HTML document to parse\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new DOMParser();\n\t * const dom = parser.parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksTree.fromDOM(dom);\n\t * ```\n\t */\n\tstatic fromDOM(dom: HTMLDocument): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\t\tconst document = dom;\n\n\t\tconst processElement = (element: Element, currentTree: BookmarksTree) => {\n\t\t\tconst children = Array.from(element.children) as Element[];\n\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tconst child = children[i];\n\n\t\t\t\tif (child.tagName === \"DT\") {\n\t\t\t\t\tconst h3 = child.querySelector(\"h3\");\n\t\t\t\t\tconst link = child.querySelector(\"a\");\n\n\t\t\t\t\tif (h3) {\n\t\t\t\t\t\t// フォルダの場合\n\t\t\t\t\t\tconst folderName = h3.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (folderName) {\n\t\t\t\t\t\t\tconst folderTree = new BookmarksTree();\n\t\t\t\t\t\t\tcurrentTree.set(folderName, folderTree);\n\t\t\t\t\t\t\tprocessElement(child, folderTree);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (link) {\n\t\t\t\t\t\t// リンクの場合\n\t\t\t\t\t\tconst href = link.getAttribute(\"href\");\n\t\t\t\t\t\tconst title = link.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (href && title) {\n\t\t\t\t\t\t\tcurrentTree.set(title, href);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (child.tagName === \"DL\") {\n\t\t\t\t\t// ネストしたDLタグの場合も処理\n\t\t\t\t\tprocessElement(child, currentTree);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// HTMLのBODY全体から処理を開始\n\t\tconst body = document.body;\n\t\tif (body) {\n\t\t\tprocessElement(body, tree);\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to an HTML document\n\t *\n\t * Generates an HTML document in Netscape Bookmark format.\n\t *\n\t * @returns HTML document in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const dom = tree.toDOM();\n\t * ```\n\t */\n\ttoDOM(): HTMLDocument {\n\t\treturn new DOMParser().parseFromString(this.HTMLString, \"text/html\");\n\t}\n\n\t/**\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format\n\t *\n\t * Generates a complete HTML document string including DOCTYPE, metadata, and body\n\t * in Netscape Bookmark format.\n\t *\n\t * @returns HTML string in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const html = tree.HTMLString;\n\t * console.log(html); // <!DOCTYPE NETSCAPE-Bookmark-file-1>...\n\t * ```\n\t */\n\tget HTMLString(): string {\n\t\tconst escapeHtml = (text: string): string => {\n\t\t\treturn text\n\t\t\t\t.replace(/&/g, \"&amp;\")\n\t\t\t\t.replace(/</g, \"&lt;\")\n\t\t\t\t.replace(/>/g, \"&gt;\")\n\t\t\t\t.replace(/\"/g, \"&quot;\")\n\t\t\t\t.replace(/'/g, \"&#39;\");\n\t\t};\n\n\t\tconst createBookmarkList = (tree: BookmarksTree, indent: string = \"\"): string => {\n\t\t\tlet html = `${indent}<DL><p>\\n`;\n\n\t\t\tfor (const [key, value] of tree.entries()) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\t// ブックマークの場合: <DT><A HREF=\"url\">タイトル</A>\n\t\t\t\t\thtml += `${indent} <DT><A HREF=\"${escapeHtml(value)}\">${escapeHtml(key)}</A>\\n`;\n\t\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\t\t// フォルダの場合: <DT><H3>フォルダ名</H3>\n\t\t\t\t\thtml += `${indent} <DT><H3>${escapeHtml(key)}</H3>\\n`;\n\t\t\t\t\thtml += createBookmarkList(value, indent + \" \");\n\t\t\t\t\thtml += `${indent} </DL><p>\\n`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (indent === \"\") {\n\t\t\t\t// ルートレベルの場合は閉じタグを追加\n\t\t\t\thtml += `</DL>\\n`;\n\t\t\t}\n\n\t\t\treturn html;\n\t\t};\n\n\t\tconst htmlTemplate = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<HTML>\n<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n<TITLE>Bookmark</TITLE>\n<H1>Bookmark</H1>\n<BODY>\n${createBookmarkList(this)}</BODY>\n</HTML>`;\n\t\treturn htmlTemplate;\n\t}\n\n\t/**\n\t * @deprecated Use {@link HTMLString} instead.\n\t *\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format.\n\t */\n\tget HTMLText(): string {\n\t\treturn this.HTMLString;\n\t}\n}\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { HTMLDocument } from \"#dom-types\";\nimport { BookmarksTree } from \"../BookmarksTree/index.ts\";\n\n/**\n * A parser for Netscape Bookmark format files\n *\n * This class provides static methods to parse Netscape Bookmark format HTML strings\n * and convert them into BookmarksTree instances for easier manipulation.\n *\n * @example\n * ```typescript\n * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n * <HTML>\n * <BODY>\n * <DL><p>\n * <DT><A HREF=\"https://google.com\">Google</A>\n * <DT><H3>Development</H3>\n * <DL><p>\n * <DT><A HREF=\"https://github.com\">GitHub</A>\n * </DL><p>\n * </DL>\n * </BODY>\n * </HTML>`;\n *\n * const tree = BookmarksParser.parse(bookmarkHtml);\n * ```\n */\nexport class BookmarksParser {\n\t/**\n\t * Alias for the {@link parseFromHTMLString} method.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parse(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parse(htmlString: string): BookmarksTree {\n\t\treturn this.parseFromHTMLString(htmlString);\n\t}\n\n\t/**\n\t * Parses a Netscape Bookmark format HTML string and returns a BookmarksTree.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parseFromHTMLString(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parseFromHTMLString(htmlString: string): BookmarksTree {\n\t\tconst dom = new DOMParser().parseFromString(htmlString, \"text/html\");\n\t\tconst tree = BookmarksTree.fromDOM(dom);\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an existing HTMLDocument.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromDOM}.\n\t *\n\t * Use this when you already have a parsed HTMLDocument and want to convert it to a BookmarksTree.\n\t *\n\t * @param dom An HTMLDocument instance\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const dom = new DOMParser().parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksParser.parseFromDOM(dom);\n\t * ```\n\t */\n\tstatic parseFromDOM(dom: HTMLDocument): BookmarksTree {\n\t\treturn BookmarksTree.fromDOM(dom);\n\t}\n\n\t/**\n\t * Parses a JSON string and returns a BookmarksTree.\n\t *\n\t * @param jsonString JSON string representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = '{\"Google\":\"https://google.com\",\"Development\":{\"GitHub\":\"https://github.com\"}}';\n\t * const tree = BookmarksParser.parseFromJSONString(json);\n\t * ```\n\t */\n\tstatic parseFromJSONString(jsonString: string): BookmarksTree {\n\t\tconst obj = JSON.parse(jsonString);\n\t\treturn BookmarksTree.fromJSON(obj);\n\t}\n\n\t/**\n\t * Parses a JSON object and returns a BookmarksTree.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromJSON}.\n\t *\n\t * @param jsonObj JSON object representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const obj = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksParser.parseFromJSON(obj);\n\t * ```\n\t */\n\tstatic parseFromJSON(jsonObj: Record<string, unknown>): BookmarksTree {\n\t\treturn BookmarksTree.fromJSON(jsonObj);\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["DOMParser","NodeDOMParser","DOMParser","DOMParser"],"sources":["../src/dom.ts","../src/node-dom.ts","../src/BookmarksTree/BookmarksTree.ts","../src/BookmarksParser/BookmarksParser.ts"],"sourcesContent":["/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport type { DOMParser as NodeDOMParser } from \"@b-fuze/deno-dom\";\n\nexport let DOMParser: typeof NodeDOMParser =\n\tglobalThis.DOMParser as unknown as typeof NodeDOMParser;\n\nexport const setDOMParser = (parser: typeof NodeDOMParser): void => {\n\tDOMParser = parser;\n};\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser as NodeDOMParser } from \"@b-fuze/deno-dom\";\nimport { setDOMParser } from \"./dom.ts\";\n\nsetDOMParser(NodeDOMParser);\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { Element, HTMLDocument } from \"#dom-types\";\n\n/**\n * A class representing a bookmark tree in Netscape Bookmark format\n *\n * This class extends Map and manages folders (BookmarksTree) and bookmarks (URL strings)\n * in a hierarchical structure.\n *\n * @example\n * ```typescript\n * const tree = new BookmarksTree();\n * tree.set(\"Google\", \"https://google.com\");\n *\n * const folder = new BookmarksTree();\n * folder.set(\"GitHub\", \"https://github.com\");\n * tree.set(\"Development\", folder);\n * ```\n */\nexport class BookmarksTree extends Map<string, string | BookmarksTree> {\n\t/**\n\t * Creates a new BookmarksTree instance\n\t */\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to a JSON object\n\t *\n\t * Folders are recursively converted to objects, and bookmarks are preserved as strings.\n\t *\n\t * @returns JSON object representation of the bookmark data\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const json = tree.toJSON();\n\t * // { \"Google\": \"https://google.com\" }\n\t * ```\n\t */\n\ttoJSON(): Record<string, unknown> {\n\t\tconst json: Record<string, unknown> = {};\n\n\t\tfor (const [key, value] of this.entries()) {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tjson[key] = value;\n\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\tjson[key] = value.toJSON();\n\t\t\t}\n\t\t}\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from a JSON object\n\t *\n\t * String properties are treated as bookmarks, and object properties are\n\t * recursively processed as folders.\n\t *\n\t * @param json The source JSON object to convert\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksTree.fromJSON(json);\n\t * ```\n\t */\n\tstatic fromJSON(json: Record<string, unknown>): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\n\t\tif (typeof json === \"object\" && json !== null) {\n\t\t\tfor (const [key, value] of Object.entries(json)) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\ttree.set(key, value);\n\t\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t\ttree.set(key, BookmarksTree.fromJSON(value as Record<string, unknown>));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an HTML document (Netscape Bookmark format)\n\t *\n\t * Parses Netscape Bookmark format HTML and generates a BookmarksTree that preserves\n\t * the hierarchical structure. H3 elements within DT elements are treated as folders,\n\t * and A elements are treated as bookmarks.\n\t *\n\t * @param dom The HTML document to parse\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new DOMParser();\n\t * const dom = parser.parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksTree.fromDOM(dom);\n\t * ```\n\t */\n\tstatic fromDOM(dom: HTMLDocument): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\t\tconst document = dom;\n\n\t\tconst processElement = (element: Element, currentTree: BookmarksTree) => {\n\t\t\tconst children = Array.from(element.children) as Element[];\n\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tconst child = children[i];\n\n\t\t\t\tif (child.tagName === \"DT\") {\n\t\t\t\t\tconst h3 = child.querySelector(\"h3\");\n\t\t\t\t\tconst link = child.querySelector(\"a\");\n\n\t\t\t\t\tif (h3) {\n\t\t\t\t\t\t// フォルダの場合\n\t\t\t\t\t\tconst folderName = h3.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (folderName) {\n\t\t\t\t\t\t\tconst folderTree = new BookmarksTree();\n\t\t\t\t\t\t\tcurrentTree.set(folderName, folderTree);\n\t\t\t\t\t\t\tprocessElement(child, folderTree);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (link) {\n\t\t\t\t\t\t// リンクの場合\n\t\t\t\t\t\tconst href = link.getAttribute(\"href\");\n\t\t\t\t\t\tconst title = link.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (href && title) {\n\t\t\t\t\t\t\tcurrentTree.set(title, href);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (child.tagName === \"DL\") {\n\t\t\t\t\t// ネストしたDLタグの場合も処理\n\t\t\t\t\tprocessElement(child, currentTree);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// HTMLのBODY全体から処理を開始\n\t\tconst body = document.body;\n\t\tif (body) {\n\t\t\tprocessElement(body, tree);\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to an HTML document\n\t *\n\t * Generates an HTML document in Netscape Bookmark format.\n\t *\n\t * @returns HTML document in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const dom = tree.toDOM();\n\t * ```\n\t */\n\ttoDOM(): HTMLDocument {\n\t\treturn new DOMParser().parseFromString(this.HTMLString, \"text/html\");\n\t}\n\n\t/**\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format\n\t *\n\t * Generates a complete HTML document string including DOCTYPE, metadata, and body\n\t * in Netscape Bookmark format.\n\t *\n\t * @returns HTML string in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const html = tree.HTMLString;\n\t * console.log(html); // <!DOCTYPE NETSCAPE-Bookmark-file-1>...\n\t * ```\n\t */\n\tget HTMLString(): string {\n\t\tconst escapeHtml = (text: string): string => {\n\t\t\treturn text\n\t\t\t\t.replace(/&/g, \"&amp;\")\n\t\t\t\t.replace(/</g, \"&lt;\")\n\t\t\t\t.replace(/>/g, \"&gt;\")\n\t\t\t\t.replace(/\"/g, \"&quot;\")\n\t\t\t\t.replace(/'/g, \"&#39;\");\n\t\t};\n\n\t\tconst createBookmarkList = (tree: BookmarksTree, indent: string = \"\"): string => {\n\t\t\tlet html = `${indent}<DL><p>\\n`;\n\n\t\t\tfor (const [key, value] of tree.entries()) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\t// ブックマークの場合: <DT><A HREF=\"url\">タイトル</A>\n\t\t\t\t\thtml += `${indent} <DT><A HREF=\"${escapeHtml(value)}\">${escapeHtml(key)}</A>\\n`;\n\t\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\t\t// フォルダの場合: <DT><H3>フォルダ名</H3>\n\t\t\t\t\thtml += `${indent} <DT><H3>${escapeHtml(key)}</H3>\\n`;\n\t\t\t\t\thtml += createBookmarkList(value, indent + \" \");\n\t\t\t\t\thtml += `${indent} </DL><p>\\n`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (indent === \"\") {\n\t\t\t\t// ルートレベルの場合は閉じタグを追加\n\t\t\t\thtml += `</DL>\\n`;\n\t\t\t}\n\n\t\t\treturn html;\n\t\t};\n\n\t\tconst htmlTemplate = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<HTML>\n<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n<TITLE>Bookmark</TITLE>\n<H1>Bookmark</H1>\n<BODY>\n${createBookmarkList(this)}</BODY>\n</HTML>`;\n\t\treturn htmlTemplate;\n\t}\n\n\t/**\n\t * @deprecated Use {@link HTMLString} instead.\n\t *\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format.\n\t */\n\tget HTMLText(): string {\n\t\treturn this.HTMLString;\n\t}\n}\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { HTMLDocument } from \"#dom-types\";\nimport { BookmarksTree } from \"../BookmarksTree/index.ts\";\n\n/**\n * A parser for Netscape Bookmark format files\n *\n * This class provides static methods to parse Netscape Bookmark format HTML strings\n * and convert them into BookmarksTree instances for easier manipulation.\n *\n * @example\n * ```typescript\n * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n * <HTML>\n * <BODY>\n * <DL><p>\n * <DT><A HREF=\"https://google.com\">Google</A>\n * <DT><H3>Development</H3>\n * <DL><p>\n * <DT><A HREF=\"https://github.com\">GitHub</A>\n * </DL><p>\n * </DL>\n * </BODY>\n * </HTML>`;\n *\n * const tree = BookmarksParser.parse(bookmarkHtml);\n * ```\n */\nexport class BookmarksParser {\n\t/**\n\t * Alias for the {@link parseFromHTMLString} method.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parse(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parse(htmlString: string): BookmarksTree {\n\t\treturn this.parseFromHTMLString(htmlString);\n\t}\n\n\t/**\n\t * Parses a Netscape Bookmark format HTML string and returns a BookmarksTree.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parseFromHTMLString(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parseFromHTMLString(htmlString: string): BookmarksTree {\n\t\tconst dom = new DOMParser().parseFromString(htmlString, \"text/html\");\n\t\tconst tree = BookmarksTree.fromDOM(dom);\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an existing HTMLDocument.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromDOM}.\n\t *\n\t * Use this when you already have a parsed HTMLDocument and want to convert it to a BookmarksTree.\n\t *\n\t * @param dom An HTMLDocument instance\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const dom = new DOMParser().parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksParser.parseFromDOM(dom);\n\t * ```\n\t */\n\tstatic parseFromDOM(dom: HTMLDocument): BookmarksTree {\n\t\treturn BookmarksTree.fromDOM(dom);\n\t}\n\n\t/**\n\t * Parses a JSON string and returns a BookmarksTree.\n\t *\n\t * @param jsonString JSON string representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = '{\"Google\":\"https://google.com\",\"Development\":{\"GitHub\":\"https://github.com\"}}';\n\t * const tree = BookmarksParser.parseFromJSONString(json);\n\t * ```\n\t */\n\tstatic parseFromJSONString(jsonString: string): BookmarksTree {\n\t\tconst obj = JSON.parse(jsonString);\n\t\treturn BookmarksTree.fromJSON(obj);\n\t}\n\n\t/**\n\t * Parses a JSON object and returns a BookmarksTree.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromJSON}.\n\t *\n\t * @param jsonObj JSON object representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const obj = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksParser.parseFromJSON(obj);\n\t * ```\n\t */\n\tstatic parseFromJSON(jsonObj: Record<string, unknown>): BookmarksTree {\n\t\treturn BookmarksTree.fromJSON(jsonObj);\n\t}\n}\n"],"mappings":"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"}
package/dist/web.d.ts CHANGED
@@ -2,7 +2,6 @@
2
2
  type HTMLDocument = globalThis.HTMLDocument;
3
3
  //#endregion
4
4
  //#region src/BookmarksTree/BookmarksTree.d.ts
5
-
6
5
  /**
7
6
  * A class representing a bookmark tree in Netscape Bookmark format
8
7
  *
@@ -19,7 +18,7 @@ type HTMLDocument = globalThis.HTMLDocument;
19
18
  * tree.set("Development", folder);
20
19
  * ```
21
20
  */
22
- declare class BookmarksTree extends Map<string, string | BookmarksTree> {
21
+ export declare class BookmarksTree extends Map<string, string | BookmarksTree> {
23
22
  /**
24
23
  * Creates a new BookmarksTree instance
25
24
  */
@@ -139,7 +138,7 @@ declare class BookmarksTree extends Map<string, string | BookmarksTree> {
139
138
  * const tree = BookmarksParser.parse(bookmarkHtml);
140
139
  * ```
141
140
  */
142
- declare class BookmarksParser {
141
+ export declare class BookmarksParser {
143
142
  /**
144
143
  * Alias for the {@link parseFromHTMLString} method.
145
144
  *
@@ -237,5 +236,4 @@ declare class BookmarksParser {
237
236
  static parseFromJSON(jsonObj: Record<string, unknown>): BookmarksTree;
238
237
  }
239
238
  //#endregion
240
- export { BookmarksParser, BookmarksTree };
241
239
  //# sourceMappingURL=web.d.ts.map
package/dist/web.js CHANGED
@@ -6,10 +6,15 @@
6
6
  * https://opensource.org/licenses/MIT
7
7
  */
8
8
  const DOMParser = globalThis.DOMParser;
9
-
10
9
  //#endregion
11
10
  //#region src/BookmarksTree/BookmarksTree.ts
12
11
  /**
12
+ * Copyright (c) 2025-2026 kurage(@umitsukidev)
13
+ *
14
+ * This software is released under the MIT License.
15
+ * https://opensource.org/licenses/MIT
16
+ */
17
+ /**
13
18
  * A class representing a bookmark tree in Netscape Bookmark format
14
19
  *
15
20
  * This class extends Map and manages folders (BookmarksTree) and bookmarks (URL strings)
@@ -188,10 +193,15 @@ ${createBookmarkList(this)}</BODY>
188
193
  return this.HTMLString;
189
194
  }
190
195
  };
191
-
192
196
  //#endregion
193
197
  //#region src/BookmarksParser/BookmarksParser.ts
194
198
  /**
199
+ * Copyright (c) 2025-2026 kurage(@umitsukidev)
200
+ *
201
+ * This software is released under the MIT License.
202
+ * https://opensource.org/licenses/MIT
203
+ */
204
+ /**
195
205
  * A parser for Netscape Bookmark format files
196
206
  *
197
207
  * This class provides static methods to parse Netscape Bookmark format HTML strings
@@ -324,7 +334,7 @@ var BookmarksParser = class {
324
334
  return BookmarksTree.fromJSON(jsonObj);
325
335
  }
326
336
  };
327
-
328
337
  //#endregion
329
338
  export { BookmarksParser, BookmarksTree };
339
+
330
340
  //# sourceMappingURL=web.js.map
package/dist/web.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","names":["json: Record<string, unknown>"],"sources":["../src/web-dom.ts","../src/BookmarksTree/BookmarksTree.ts","../src/BookmarksParser/BookmarksParser.ts"],"sourcesContent":["/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nexport const DOMParser = globalThis.DOMParser;\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { Element, HTMLDocument } from \"#dom-types\";\n\n/**\n * A class representing a bookmark tree in Netscape Bookmark format\n *\n * This class extends Map and manages folders (BookmarksTree) and bookmarks (URL strings)\n * in a hierarchical structure.\n *\n * @example\n * ```typescript\n * const tree = new BookmarksTree();\n * tree.set(\"Google\", \"https://google.com\");\n *\n * const folder = new BookmarksTree();\n * folder.set(\"GitHub\", \"https://github.com\");\n * tree.set(\"Development\", folder);\n * ```\n */\nexport class BookmarksTree extends Map<string, string | BookmarksTree> {\n\t/**\n\t * Creates a new BookmarksTree instance\n\t */\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to a JSON object\n\t *\n\t * Folders are recursively converted to objects, and bookmarks are preserved as strings.\n\t *\n\t * @returns JSON object representation of the bookmark data\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const json = tree.toJSON();\n\t * // { \"Google\": \"https://google.com\" }\n\t * ```\n\t */\n\ttoJSON(): Record<string, unknown> {\n\t\tconst json: Record<string, unknown> = {};\n\n\t\tfor (const [key, value] of this.entries()) {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tjson[key] = value;\n\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\tjson[key] = value.toJSON();\n\t\t\t}\n\t\t}\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from a JSON object\n\t *\n\t * String properties are treated as bookmarks, and object properties are\n\t * recursively processed as folders.\n\t *\n\t * @param json The source JSON object to convert\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksTree.fromJSON(json);\n\t * ```\n\t */\n\tstatic fromJSON(json: Record<string, unknown>): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\n\t\tif (typeof json === \"object\" && json !== null) {\n\t\t\tfor (const [key, value] of Object.entries(json)) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\ttree.set(key, value);\n\t\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t\ttree.set(key, BookmarksTree.fromJSON(value as Record<string, unknown>));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an HTML document (Netscape Bookmark format)\n\t *\n\t * Parses Netscape Bookmark format HTML and generates a BookmarksTree that preserves\n\t * the hierarchical structure. H3 elements within DT elements are treated as folders,\n\t * and A elements are treated as bookmarks.\n\t *\n\t * @param dom The HTML document to parse\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new DOMParser();\n\t * const dom = parser.parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksTree.fromDOM(dom);\n\t * ```\n\t */\n\tstatic fromDOM(dom: HTMLDocument): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\t\tconst document = dom;\n\n\t\tconst processElement = (element: Element, currentTree: BookmarksTree) => {\n\t\t\tconst children = Array.from(element.children) as Element[];\n\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tconst child = children[i];\n\n\t\t\t\tif (child.tagName === \"DT\") {\n\t\t\t\t\tconst h3 = child.querySelector(\"h3\");\n\t\t\t\t\tconst link = child.querySelector(\"a\");\n\n\t\t\t\t\tif (h3) {\n\t\t\t\t\t\t// フォルダの場合\n\t\t\t\t\t\tconst folderName = h3.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (folderName) {\n\t\t\t\t\t\t\tconst folderTree = new BookmarksTree();\n\t\t\t\t\t\t\tcurrentTree.set(folderName, folderTree);\n\t\t\t\t\t\t\tprocessElement(child, folderTree);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (link) {\n\t\t\t\t\t\t// リンクの場合\n\t\t\t\t\t\tconst href = link.getAttribute(\"href\");\n\t\t\t\t\t\tconst title = link.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (href && title) {\n\t\t\t\t\t\t\tcurrentTree.set(title, href);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (child.tagName === \"DL\") {\n\t\t\t\t\t// ネストしたDLタグの場合も処理\n\t\t\t\t\tprocessElement(child, currentTree);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// HTMLのBODY全体から処理を開始\n\t\tconst body = document.body;\n\t\tif (body) {\n\t\t\tprocessElement(body, tree);\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to an HTML document\n\t *\n\t * Generates an HTML document in Netscape Bookmark format.\n\t *\n\t * @returns HTML document in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const dom = tree.toDOM();\n\t * ```\n\t */\n\ttoDOM(): HTMLDocument {\n\t\treturn new DOMParser().parseFromString(this.HTMLString, \"text/html\");\n\t}\n\n\t/**\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format\n\t *\n\t * Generates a complete HTML document string including DOCTYPE, metadata, and body\n\t * in Netscape Bookmark format.\n\t *\n\t * @returns HTML string in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const html = tree.HTMLString;\n\t * console.log(html); // <!DOCTYPE NETSCAPE-Bookmark-file-1>...\n\t * ```\n\t */\n\tget HTMLString(): string {\n\t\tconst escapeHtml = (text: string): string => {\n\t\t\treturn text\n\t\t\t\t.replace(/&/g, \"&amp;\")\n\t\t\t\t.replace(/</g, \"&lt;\")\n\t\t\t\t.replace(/>/g, \"&gt;\")\n\t\t\t\t.replace(/\"/g, \"&quot;\")\n\t\t\t\t.replace(/'/g, \"&#39;\");\n\t\t};\n\n\t\tconst createBookmarkList = (tree: BookmarksTree, indent: string = \"\"): string => {\n\t\t\tlet html = `${indent}<DL><p>\\n`;\n\n\t\t\tfor (const [key, value] of tree.entries()) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\t// ブックマークの場合: <DT><A HREF=\"url\">タイトル</A>\n\t\t\t\t\thtml += `${indent} <DT><A HREF=\"${escapeHtml(value)}\">${escapeHtml(key)}</A>\\n`;\n\t\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\t\t// フォルダの場合: <DT><H3>フォルダ名</H3>\n\t\t\t\t\thtml += `${indent} <DT><H3>${escapeHtml(key)}</H3>\\n`;\n\t\t\t\t\thtml += createBookmarkList(value, indent + \" \");\n\t\t\t\t\thtml += `${indent} </DL><p>\\n`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (indent === \"\") {\n\t\t\t\t// ルートレベルの場合は閉じタグを追加\n\t\t\t\thtml += `</DL>\\n`;\n\t\t\t}\n\n\t\t\treturn html;\n\t\t};\n\n\t\tconst htmlTemplate = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<HTML>\n<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n<TITLE>Bookmark</TITLE>\n<H1>Bookmark</H1>\n<BODY>\n${createBookmarkList(this)}</BODY>\n</HTML>`;\n\t\treturn htmlTemplate;\n\t}\n\n\t/**\n\t * @deprecated Use {@link HTMLString} instead.\n\t *\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format.\n\t */\n\tget HTMLText(): string {\n\t\treturn this.HTMLString;\n\t}\n}\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { HTMLDocument } from \"#dom-types\";\nimport { BookmarksTree } from \"../BookmarksTree/index.ts\";\n\n/**\n * A parser for Netscape Bookmark format files\n *\n * This class provides static methods to parse Netscape Bookmark format HTML strings\n * and convert them into BookmarksTree instances for easier manipulation.\n *\n * @example\n * ```typescript\n * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n * <HTML>\n * <BODY>\n * <DL><p>\n * <DT><A HREF=\"https://google.com\">Google</A>\n * <DT><H3>Development</H3>\n * <DL><p>\n * <DT><A HREF=\"https://github.com\">GitHub</A>\n * </DL><p>\n * </DL>\n * </BODY>\n * </HTML>`;\n *\n * const tree = BookmarksParser.parse(bookmarkHtml);\n * ```\n */\nexport class BookmarksParser {\n\t/**\n\t * Alias for the {@link parseFromHTMLString} method.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parse(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parse(htmlString: string): BookmarksTree {\n\t\treturn this.parseFromHTMLString(htmlString);\n\t}\n\n\t/**\n\t * Parses a Netscape Bookmark format HTML string and returns a BookmarksTree.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parseFromHTMLString(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parseFromHTMLString(htmlString: string): BookmarksTree {\n\t\tconst dom = new DOMParser().parseFromString(htmlString, \"text/html\");\n\t\tconst tree = BookmarksTree.fromDOM(dom);\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an existing HTMLDocument.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromDOM}.\n\t *\n\t * Use this when you already have a parsed HTMLDocument and want to convert it to a BookmarksTree.\n\t *\n\t * @param dom An HTMLDocument instance\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const dom = new DOMParser().parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksParser.parseFromDOM(dom);\n\t * ```\n\t */\n\tstatic parseFromDOM(dom: HTMLDocument): BookmarksTree {\n\t\treturn BookmarksTree.fromDOM(dom);\n\t}\n\n\t/**\n\t * Parses a JSON string and returns a BookmarksTree.\n\t *\n\t * @param jsonString JSON string representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = '{\"Google\":\"https://google.com\",\"Development\":{\"GitHub\":\"https://github.com\"}}';\n\t * const tree = BookmarksParser.parseFromJSONString(json);\n\t * ```\n\t */\n\tstatic parseFromJSONString(jsonString: string): BookmarksTree {\n\t\tconst obj = JSON.parse(jsonString);\n\t\treturn BookmarksTree.fromJSON(obj);\n\t}\n\n\t/**\n\t * Parses a JSON object and returns a BookmarksTree.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromJSON}.\n\t *\n\t * @param jsonObj JSON object representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const obj = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksParser.parseFromJSON(obj);\n\t * ```\n\t */\n\tstatic parseFromJSON(jsonObj: Record<string, unknown>): BookmarksTree {\n\t\treturn BookmarksTree.fromJSON(jsonObj);\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"web.js","names":[],"sources":["../src/web-dom.ts","../src/BookmarksTree/BookmarksTree.ts","../src/BookmarksParser/BookmarksParser.ts"],"sourcesContent":["/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nexport const DOMParser = globalThis.DOMParser;\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { Element, HTMLDocument } from \"#dom-types\";\n\n/**\n * A class representing a bookmark tree in Netscape Bookmark format\n *\n * This class extends Map and manages folders (BookmarksTree) and bookmarks (URL strings)\n * in a hierarchical structure.\n *\n * @example\n * ```typescript\n * const tree = new BookmarksTree();\n * tree.set(\"Google\", \"https://google.com\");\n *\n * const folder = new BookmarksTree();\n * folder.set(\"GitHub\", \"https://github.com\");\n * tree.set(\"Development\", folder);\n * ```\n */\nexport class BookmarksTree extends Map<string, string | BookmarksTree> {\n\t/**\n\t * Creates a new BookmarksTree instance\n\t */\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to a JSON object\n\t *\n\t * Folders are recursively converted to objects, and bookmarks are preserved as strings.\n\t *\n\t * @returns JSON object representation of the bookmark data\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const json = tree.toJSON();\n\t * // { \"Google\": \"https://google.com\" }\n\t * ```\n\t */\n\ttoJSON(): Record<string, unknown> {\n\t\tconst json: Record<string, unknown> = {};\n\n\t\tfor (const [key, value] of this.entries()) {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tjson[key] = value;\n\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\tjson[key] = value.toJSON();\n\t\t\t}\n\t\t}\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from a JSON object\n\t *\n\t * String properties are treated as bookmarks, and object properties are\n\t * recursively processed as folders.\n\t *\n\t * @param json The source JSON object to convert\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksTree.fromJSON(json);\n\t * ```\n\t */\n\tstatic fromJSON(json: Record<string, unknown>): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\n\t\tif (typeof json === \"object\" && json !== null) {\n\t\t\tfor (const [key, value] of Object.entries(json)) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\ttree.set(key, value);\n\t\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\t\ttree.set(key, BookmarksTree.fromJSON(value as Record<string, unknown>));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an HTML document (Netscape Bookmark format)\n\t *\n\t * Parses Netscape Bookmark format HTML and generates a BookmarksTree that preserves\n\t * the hierarchical structure. H3 elements within DT elements are treated as folders,\n\t * and A elements are treated as bookmarks.\n\t *\n\t * @param dom The HTML document to parse\n\t * @returns A new BookmarksTree instance\n\t *\n\t * @example\n\t * ```typescript\n\t * const parser = new DOMParser();\n\t * const dom = parser.parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksTree.fromDOM(dom);\n\t * ```\n\t */\n\tstatic fromDOM(dom: HTMLDocument): BookmarksTree {\n\t\tconst tree = new BookmarksTree();\n\t\tconst document = dom;\n\n\t\tconst processElement = (element: Element, currentTree: BookmarksTree) => {\n\t\t\tconst children = Array.from(element.children) as Element[];\n\n\t\t\tfor (let i = 0; i < children.length; i++) {\n\t\t\t\tconst child = children[i];\n\n\t\t\t\tif (child.tagName === \"DT\") {\n\t\t\t\t\tconst h3 = child.querySelector(\"h3\");\n\t\t\t\t\tconst link = child.querySelector(\"a\");\n\n\t\t\t\t\tif (h3) {\n\t\t\t\t\t\t// フォルダの場合\n\t\t\t\t\t\tconst folderName = h3.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (folderName) {\n\t\t\t\t\t\t\tconst folderTree = new BookmarksTree();\n\t\t\t\t\t\t\tcurrentTree.set(folderName, folderTree);\n\t\t\t\t\t\t\tprocessElement(child, folderTree);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (link) {\n\t\t\t\t\t\t// リンクの場合\n\t\t\t\t\t\tconst href = link.getAttribute(\"href\");\n\t\t\t\t\t\tconst title = link.textContent?.trim() || \"\";\n\t\t\t\t\t\tif (href && title) {\n\t\t\t\t\t\t\tcurrentTree.set(title, href);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (child.tagName === \"DL\") {\n\t\t\t\t\t// ネストしたDLタグの場合も処理\n\t\t\t\t\tprocessElement(child, currentTree);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// HTMLのBODY全体から処理を開始\n\t\tconst body = document.body;\n\t\tif (body) {\n\t\t\tprocessElement(body, tree);\n\t\t}\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Converts the BookmarksTree to an HTML document\n\t *\n\t * Generates an HTML document in Netscape Bookmark format.\n\t *\n\t * @returns HTML document in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const dom = tree.toDOM();\n\t * ```\n\t */\n\ttoDOM(): HTMLDocument {\n\t\treturn new DOMParser().parseFromString(this.HTMLString, \"text/html\");\n\t}\n\n\t/**\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format\n\t *\n\t * Generates a complete HTML document string including DOCTYPE, metadata, and body\n\t * in Netscape Bookmark format.\n\t *\n\t * @returns HTML string in Netscape Bookmark format\n\t *\n\t * @example\n\t * ```typescript\n\t * const tree = new BookmarksTree();\n\t * tree.set(\"Google\", \"https://google.com\");\n\t * const html = tree.HTMLString;\n\t * console.log(html); // <!DOCTYPE NETSCAPE-Bookmark-file-1>...\n\t * ```\n\t */\n\tget HTMLString(): string {\n\t\tconst escapeHtml = (text: string): string => {\n\t\t\treturn text\n\t\t\t\t.replace(/&/g, \"&amp;\")\n\t\t\t\t.replace(/</g, \"&lt;\")\n\t\t\t\t.replace(/>/g, \"&gt;\")\n\t\t\t\t.replace(/\"/g, \"&quot;\")\n\t\t\t\t.replace(/'/g, \"&#39;\");\n\t\t};\n\n\t\tconst createBookmarkList = (tree: BookmarksTree, indent: string = \"\"): string => {\n\t\t\tlet html = `${indent}<DL><p>\\n`;\n\n\t\t\tfor (const [key, value] of tree.entries()) {\n\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\t// ブックマークの場合: <DT><A HREF=\"url\">タイトル</A>\n\t\t\t\t\thtml += `${indent} <DT><A HREF=\"${escapeHtml(value)}\">${escapeHtml(key)}</A>\\n`;\n\t\t\t\t} else if (value instanceof BookmarksTree) {\n\t\t\t\t\t// フォルダの場合: <DT><H3>フォルダ名</H3>\n\t\t\t\t\thtml += `${indent} <DT><H3>${escapeHtml(key)}</H3>\\n`;\n\t\t\t\t\thtml += createBookmarkList(value, indent + \" \");\n\t\t\t\t\thtml += `${indent} </DL><p>\\n`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (indent === \"\") {\n\t\t\t\t// ルートレベルの場合は閉じタグを追加\n\t\t\t\thtml += `</DL>\\n`;\n\t\t\t}\n\n\t\t\treturn html;\n\t\t};\n\n\t\tconst htmlTemplate = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n<HTML>\n<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\n<TITLE>Bookmark</TITLE>\n<H1>Bookmark</H1>\n<BODY>\n${createBookmarkList(this)}</BODY>\n</HTML>`;\n\t\treturn htmlTemplate;\n\t}\n\n\t/**\n\t * @deprecated Use {@link HTMLString} instead.\n\t *\n\t * Gets the BookmarksTree as an HTML string in Netscape Bookmark format.\n\t */\n\tget HTMLText(): string {\n\t\treturn this.HTMLString;\n\t}\n}\n","/**\n * Copyright (c) 2025-2026 kurage(@umitsukidev)\n *\n * This software is released under the MIT License.\n * https://opensource.org/licenses/MIT\n */\n\nimport { DOMParser } from \"../dom.ts\";\nimport type { HTMLDocument } from \"#dom-types\";\nimport { BookmarksTree } from \"../BookmarksTree/index.ts\";\n\n/**\n * A parser for Netscape Bookmark format files\n *\n * This class provides static methods to parse Netscape Bookmark format HTML strings\n * and convert them into BookmarksTree instances for easier manipulation.\n *\n * @example\n * ```typescript\n * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n * <HTML>\n * <BODY>\n * <DL><p>\n * <DT><A HREF=\"https://google.com\">Google</A>\n * <DT><H3>Development</H3>\n * <DL><p>\n * <DT><A HREF=\"https://github.com\">GitHub</A>\n * </DL><p>\n * </DL>\n * </BODY>\n * </HTML>`;\n *\n * const tree = BookmarksParser.parse(bookmarkHtml);\n * ```\n */\nexport class BookmarksParser {\n\t/**\n\t * Alias for the {@link parseFromHTMLString} method.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parse(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parse(htmlString: string): BookmarksTree {\n\t\treturn this.parseFromHTMLString(htmlString);\n\t}\n\n\t/**\n\t * Parses a Netscape Bookmark format HTML string and returns a BookmarksTree.\n\t *\n\t * @param htmlString HTML string in Netscape Bookmark format\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const bookmarkHtml = `<!DOCTYPE NETSCAPE-Bookmark-file-1>\n\t * <HTML>\n\t * <BODY>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://google.com\">Google</A>\n\t * <DT><H3>Development</H3>\n\t * <DL><p>\n\t * <DT><A HREF=\"https://github.com\">GitHub</A>\n\t * </DL><p>\n\t * </DL>\n\t * </BODY>\n\t * </HTML>`;\n\t *\n\t * const tree = BookmarksParser.parseFromHTMLString(bookmarkHtml);\n\t * ```\n\t */\n\tstatic parseFromHTMLString(htmlString: string): BookmarksTree {\n\t\tconst dom = new DOMParser().parseFromString(htmlString, \"text/html\");\n\t\tconst tree = BookmarksTree.fromDOM(dom);\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Creates a BookmarksTree from an existing HTMLDocument.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromDOM}.\n\t *\n\t * Use this when you already have a parsed HTMLDocument and want to convert it to a BookmarksTree.\n\t *\n\t * @param dom An HTMLDocument instance\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const dom = new DOMParser().parseFromString(bookmarkHtml, \"text/html\");\n\t * const tree = BookmarksParser.parseFromDOM(dom);\n\t * ```\n\t */\n\tstatic parseFromDOM(dom: HTMLDocument): BookmarksTree {\n\t\treturn BookmarksTree.fromDOM(dom);\n\t}\n\n\t/**\n\t * Parses a JSON string and returns a BookmarksTree.\n\t *\n\t * @param jsonString JSON string representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const json = '{\"Google\":\"https://google.com\",\"Development\":{\"GitHub\":\"https://github.com\"}}';\n\t * const tree = BookmarksParser.parseFromJSONString(json);\n\t * ```\n\t */\n\tstatic parseFromJSONString(jsonString: string): BookmarksTree {\n\t\tconst obj = JSON.parse(jsonString);\n\t\treturn BookmarksTree.fromJSON(obj);\n\t}\n\n\t/**\n\t * Parses a JSON object and returns a BookmarksTree.\n\t *\n\t * This is an alias for {@link BookmarksTree.fromJSON}.\n\t *\n\t * @param jsonObj JSON object representing the bookmark structure\n\t * @returns The parsed BookmarksTree\n\t *\n\t * @example\n\t * ```typescript\n\t * const obj = { \"Google\": \"https://google.com\", \"Development\": { \"GitHub\": \"https://github.com\" } };\n\t * const tree = BookmarksParser.parseFromJSON(obj);\n\t * ```\n\t */\n\tstatic parseFromJSON(jsonObj: Record<string, unknown>): BookmarksTree {\n\t\treturn BookmarksTree.fromJSON(jsonObj);\n\t}\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "netscape-bookmark-parser",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Parse Netscape bookmark HTML files and manipulate them as structured data.",
5
5
  "keywords": [
6
6
  "bookmark",
@@ -41,14 +41,14 @@
41
41
  "devDependencies": {
42
42
  "@changesets/cli": "^3.0.3",
43
43
  "@changesets/config": "^4.0.1",
44
- "@types/node": "^24.0.0",
44
+ "@types/node": "^26.6.2",
45
45
  "lefthook": "^2.1.14",
46
46
  "oxfmt": "^0.68.0",
47
47
  "oxlint": "^1.83.0",
48
48
  "oxlint-tsgolint": "^7.0.2002",
49
- "tsdown": "^0.15.0",
50
- "typescript": "^5.9.0",
51
- "vitest": "^3.2.4"
49
+ "tsdown": "^0.23.0",
50
+ "typescript": "^6.0.3",
51
+ "vitest": "^5.0.1"
52
52
  },
53
53
  "devEngines": {
54
54
  "packageManager": {