diff options
| author | Mohamed Bassem <me@mbassem.com> | 2024-11-03 19:08:00 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2024-11-03 19:09:56 +0000 |
| commit | 7042f26b3d0af33ef86451b68b74683da78f1552 (patch) | |
| tree | aaf90adb5467a1c7b72c0e6cc7b9a35f3b5c9ff2 /apps/web | |
| parent | 306567b95478d5847eaea052a86e8797a3e03f3f (diff) | |
| download | karakeep-7042f26b3d0af33ef86451b68b74683da78f1552.tar.zst | |
fix: Adopt pocket's new export format. Fixes #570
Diffstat (limited to 'apps/web')
| -rw-r--r-- | apps/web/components/settings/ImportExport.tsx | 2 | ||||
| -rw-r--r-- | apps/web/lib/importBookmarkParser.ts | 39 | ||||
| -rw-r--r-- | apps/web/package.json | 2 |
3 files changed, 21 insertions, 22 deletions
diff --git a/apps/web/components/settings/ImportExport.tsx b/apps/web/components/settings/ImportExport.tsx index 1145a42d..b6fa6e03 100644 --- a/apps/web/components/settings/ImportExport.tsx +++ b/apps/web/components/settings/ImportExport.tsx @@ -213,7 +213,7 @@ export function ImportExportRow() { <FilePickerButton loading={false} - accept=".html" + accept=".csv" multiple={false} className="flex items-center gap-2" onFileSelect={(file) => diff --git a/apps/web/lib/importBookmarkParser.ts b/apps/web/lib/importBookmarkParser.ts index 45be3004..3262b170 100644 --- a/apps/web/lib/importBookmarkParser.ts +++ b/apps/web/lib/importBookmarkParser.ts @@ -1,5 +1,6 @@ // Copied from https://gist.github.com/devster31/4e8c6548fd16ffb75c02e6f24e27f9b9 import * as cheerio from "cheerio"; +import { parse } from "csv-parse/sync"; import { BookmarkTypes } from "@hoarder/shared/types/bookmarks"; @@ -54,28 +55,24 @@ export async function parsePocketBookmarkFile( ): Promise<ParsedBookmark[]> { const textContent = await file.text(); - const $ = cheerio.load(textContent); + const records = parse(textContent, { + columns: true, + skip_empty_lines: true, + }) as { + title: string; + url: string; + time_added: string; + tags: string; + }[]; - 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 */ - } - const url = $a.attr("href"); - return { - title: $a.text(), - content: url ? { type: BookmarkTypes.LINK as const, url } : undefined, - tags, - addDate: typeof addDate === "undefined" ? undefined : parseInt(addDate), - }; - }) - .get(); + return records.map((record) => { + return { + title: record.title, + content: { type: BookmarkTypes.LINK as const, url: record.url }, + tags: record.tags.length > 0 ? record.tags.split("|") : [], + addDate: parseInt(record.time_added), + }; + }); } export async function parseHoarderBookmarkFile( diff --git a/apps/web/package.json b/apps/web/package.json index cbc01a50..849f434a 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -47,6 +47,7 @@ "cheerio": "^1.0.0", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", + "csv-parse": "^5.5.6", "dayjs": "^1.11.10", "drizzle-orm": "^0.33.0", "fastest-levenshtein": "^1.0.16", @@ -80,6 +81,7 @@ "@hoarder/prettier-config": "workspace:^0.1.0", "@hoarder/tailwind-config": "workspace:^0.1.0", "@hoarder/tsconfig": "workspace:^0.1.0", + "@types/csv-parse": "^1.2.5", "@types/emoji-mart": "^3.0.14", "@types/react": "^18.2.55", "@types/react-dom": "^18.2.19", |
