aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/lib/importBookmarkParser.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/lib/importBookmarkParser.ts')
-rw-r--r--apps/web/lib/importBookmarkParser.ts68
1 files changed, 68 insertions, 0 deletions
diff --git a/apps/web/lib/importBookmarkParser.ts b/apps/web/lib/importBookmarkParser.ts
new file mode 100644
index 00000000..e1b21a79
--- /dev/null
+++ b/apps/web/lib/importBookmarkParser.ts
@@ -0,0 +1,68 @@
+// Copied from https://gist.github.com/devster31/4e8c6548fd16ffb75c02e6f24e27f9b9
+import * as cheerio from "cheerio";
+
+export interface ParsedBookmark {
+ title: string;
+ url?: string;
+ tags: string[];
+ addDate?: number;
+}
+
+export async function parseNetscapeBookmarkFile(
+ file: File,
+): Promise<ParsedBookmark[]> {
+ const textContent = await file.text();
+
+ if (!textContent.startsWith("<!DOCTYPE NETSCAPE-Bookmark-file-1>")) {
+ throw Error("The uploaded html file does not seem to be a bookmark file");
+ }
+
+ const $ = cheerio.load(textContent);
+
+ return $("a")
+ .map(function (_index, a) {
+ const $a = $(a);
+ const addDate = $a.attr("add_date");
+ let tags: string[] = [];
+ try {
+ tags = $a.attr("tags")?.split(",") ?? [];
+ } catch (e) {
+ /* empty */
+ }
+ return {
+ title: $a.text(),
+ url: $a.attr("href"),
+ tags: tags,
+ addDate: typeof addDate === "undefined" ? undefined : parseInt(addDate),
+ };
+ })
+ .get();
+}
+
+export async function parsePocketBookmarkFile(
+ file: File,
+): Promise<ParsedBookmark[]> {
+ const textContent = await file.text();
+
+ const $ = cheerio.load(textContent);
+
+ return $("a")
+ .map(function (_index, a) {
+ const $a = $(a);
+ const addDate = $a.attr("time_added");
+ let tags: string[] = [];
+ const tagsStr = $a.attr("tags");
+ try {
+ tags = tagsStr && tagsStr.length > 0 ? tagsStr.split(",") : [];
+ } catch (e) {
+ /* empty */
+ }
+ return {
+ title: $a.text(),
+ url: $a.attr("href"),
+ tags: tags,
+ addDate: typeof addDate === "undefined" ? undefined : parseInt(addDate),
+ };
+ })
+ .get();
+}