Created
February 2, 2024 23:21
-
-
Save skarfie123/a69352a46bcf80d7ad48e0dc37f794e1 to your computer and use it in GitHub Desktop.
Convert Workona export to bookmarks.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import typer | |
from pydantic import BaseModel, ConfigDict, Field | |
class NoExtrasModel(BaseModel): | |
model_config = ConfigDict(extra="forbid") | |
class User(NoExtrasModel): | |
name: str | |
id: str | |
lastActive: int | |
email: str | |
domain: str | |
lastName: str | |
avatar: str | |
firstName: str | |
updatedAt: int | |
createdAt: int | |
class Tab(NoExtrasModel): | |
title: str | |
url: str | |
class Resource(Tab): | |
description: str | None = None | |
class ResourceSection(NoExtrasModel): | |
title: str | |
resources: list[Resource] | |
class Note(NoExtrasModel): | |
title: str | |
description: str | None | |
attachments: list | |
class NoteSection(NoExtrasModel): | |
title: str | |
notes: list[Note] | |
class Task(BaseModel): | |
pass | |
class TaskSection(NoExtrasModel): | |
title: str | |
tasks: list[Task] | |
class BaseWorkspace(NoExtrasModel): | |
title: str | |
tabs: list[Tab] | |
resources: list[ResourceSection] | |
notes: list[NoteSection] | |
tasks: list[TaskSection] | |
class Workspace(BaseWorkspace): | |
color: str | |
class WorkspaceGroup(NoExtrasModel): | |
title: str | |
workspaces: list[Workspace] | |
class ArchivedWorkspace(BaseWorkspace): | |
pass | |
class MyTasks(NoExtrasModel): | |
today: list[Task] = Field(..., alias="Today") | |
soon: list[Task] = Field(..., alias="Soon") | |
class Workona(NoExtrasModel): | |
user: User = Field(..., alias="User") | |
workspaces: list[WorkspaceGroup] = Field(..., alias="Workspaces") | |
archived_workspaces: list[ArchivedWorkspace] = Field( | |
..., alias="Archived Workspaces" | |
) | |
my_tasks: MyTasks = Field(..., alias="My Tasks") | |
def workona_to_bookmarks(workona: Workona) -> str: | |
""" | |
Convert parsed workona data into bookmarks file. | |
Bookmarks file uses NETSCAPE-Bookmark-file-1 format. | |
""" | |
bookmarks = """<!DOCTYPE NETSCAPE-Bookmark-file-1> | |
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> | |
<TITLE>Bookmarks</TITLE> | |
<H1>Bookmarks</H1> | |
<DL><p> | |
<DT><H3>Workona</H3> | |
<DL><p>""" | |
for workspace_group in workona.workspaces: | |
bookmarks += f""" | |
<DT><H3>{workspace_group.title}</H3> | |
<DL><p>""" | |
for workspace in workspace_group.workspaces: | |
if not workspace.tabs: | |
continue | |
bookmarks += f""" | |
<DT><H3>{workspace.title}</H3> | |
<DL><p>""" | |
for tab in workspace.tabs: | |
bookmarks += f""" | |
<DT><A HREF="{tab.url}">{tab.title}</A>""" | |
for resource_section in workspace.resources: | |
if not resource_section.resources: | |
continue | |
bookmarks += f""" | |
<DT><H3>{resource_section.title}</H3> | |
<DL><p>""" | |
for resource in resource_section.resources: | |
bookmarks += f""" | |
<DT><A HREF="{resource.url}">{resource.title}</A>""" | |
bookmarks += """ | |
</DL><p>""" | |
bookmarks += """ | |
</DL><p>""" | |
bookmarks += """ | |
</DL><p>""" | |
bookmarks += """ | |
</DL><p> | |
</DL><p>""" | |
return bookmarks | |
def main(export_file: str): | |
with open(export_file, "r", encoding="utf-8") as f: | |
data = f.read() | |
workona = Workona.model_validate_json(data, strict=True) | |
bookmarks = workona_to_bookmarks(workona) | |
with open("workona.html", "w", encoding="utf-8") as f: | |
f.write(bookmarks) | |
if __name__ == "__main__": | |
typer.run(main) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment