diff --git a/burrkmarks/bookmurrks.nimble b/burrkmarks/burrkmarks.nimble similarity index 89% rename from burrkmarks/bookmurrks.nimble rename to burrkmarks/burrkmarks.nimble index 0043260..818abf8 100644 --- a/burrkmarks/bookmurrks.nimble +++ b/burrkmarks/burrkmarks.nimble @@ -11,3 +11,4 @@ bin = @["burrkmarks"] # Dependencies requires "nim >= 1.6.6" +requires "parsetoml >= 0.6.0" diff --git a/burrkmarks/nim.cfg b/burrkmarks/nim.cfg new file mode 100644 index 0000000..521e21d --- /dev/null +++ b/burrkmarks/nim.cfg @@ -0,0 +1 @@ +-d:ssl diff --git a/burrkmarks/src/burrkkmarks.nim b/burrkmarks/src/burrkkmarks.nim deleted file mode 100644 index 862d40c..0000000 --- a/burrkmarks/src/burrkkmarks.nim +++ /dev/null @@ -1,5 +0,0 @@ -# This is just an example to get you started. A typical binary package -# uses this file as the main entry point of the application. - -when isMainModule: - echo("Hello, World!") diff --git a/burrkmarks/src/burrkmarks.nim b/burrkmarks/src/burrkmarks.nim new file mode 100644 index 0000000..c136f7e --- /dev/null +++ b/burrkmarks/src/burrkmarks.nim @@ -0,0 +1,111 @@ +import std/[json,os,marshal,osproc,re] +import std/[asyncdispatch, httpclient] +import ../../globurrl + +type + Bookmark = object + name: string + shortname: string + url: string + +const TITLE = "Burrkmarks" +let title_re = re("(.*?)<\\/title>", {reMultiLine}) +let title_rem_re = re("<\\/?title>") +let https_re = re("https?:\\/\\/") +let bookmarks_file = getSyncDir() & "bookmarks.json" +var bookmarks: seq[Bookmark] = @[] + +proc `$`(bookmark: Bookmark): string = + let show_name = if bookmark.shortname != "": bookmark.shortname else: bookmark.name + let x = show_name & " - [" & bookmark.url & "]" + return x + +proc getTitle(bookmark: Bookmark): Future[string] {.async.} = + var client = newAsyncHttpClient() + try: + let html = await client.getContent(bookmark.url) + let titles = html.findAll(title_re) + if len(titles) > 0: + var title = titles[0] + title = title.replace(title_rem_re,"") + return title + except: + echo getCurrentExceptionMsg() + return "" + +proc save(bookmarks: seq[Bookmark]): bool {.discardable.} = + let file = open(bookmarks_file, fm_write) + defer: file.close() + file.write($$bookmarks) + +proc get(bookmarks: seq[Bookmark], str: string): Bookmark = + for bookmark in bookmarks: + if str == $bookmark: + return bookmark + return Bookmark() + +proc checkFile(): bool = + if not fileExists(bookmarks_file): + writeFile(bookmarks_file,"") + if fileExists(bookmarks_file): + return true + return false + +proc getBookmarks(): seq[Bookmark] = + let f = open(bookmarks_file) + try: + let nodes = parseJson(f.readAll()) + for node in nodes: + var bookmark = Bookmark() + bookmark.name = node.getOrDefault("name").getStr() + bookmark.shortname = node.getOrDefault("shortname").getStr() + bookmark.url = node.getOrDefault("url").getStr() + bookmarks.add(bookmark) + except: + echo getCurrentExceptionMsg() + return bookmarks + +proc addBookmark(link: string) = + var url = link + var bookmark = Bookmark() + if not url.contains(https_re): + url = "https://" & url + bookmark.url = url + bookmark.name = waitFor bookmark.getTitle() + bookmarks.add(bookmark) + bookmarks.save() + +proc goToBookmark(bookmark: string) = + let bm = bookmarks.get(bookmark) + discard execCmd("xdg-open " & bm.url) + +proc toStrList(bookmarks: seq[Bookmark]): seq[string] = + var list: seq[string] = @[] + for bookmark in bookmarks: + list.add($bookmark) + return list + +proc showBookmarks() = + let info = newInfo(TITLE) + let args = bookmarks.toStrList() + let option = outputData(info, args) + if option == "": + echo "Empty input, closing..." + return + elif option notin args: + echo "Adding bookmark: ", option + addBookmark(option) + showBookmarks() + elif option in args: + echo "Opening bookmark: ", option + goToBookmark(option) + +proc start() = + if checkfile(): + bookmarks = getBookmarks() + showBookmarks() + else: + echo "File : ", bookmarks_file, " does not exist." + +when isMainModule: + start() diff --git a/globurrl.nim b/globurrl.nim index 811c9c0..c2d3f3c 100644 --- a/globurrl.nim +++ b/globurrl.nim @@ -35,6 +35,7 @@ type y*: int const WM_TOOLS_DIR* = getHomeDir() & ".wm_tools/" +const WM_TOOLS_SYNC_DIR = getHomeDir() & "/Nextcloud/.wm_tools_sync/" const background* = "#000000" const backgroundalt* = "#bb222222" const backgroundalt2* = "#bb333333" @@ -254,6 +255,11 @@ proc outputData*(data: Info, args: varargs[string]): string {.discardable.} = output = runMenu(data,args) return output +proc getSyncDir*(): string = + if existsOrCreateDir(WM_TOOLS_SYNC_DIR): + echo "Sync Dir already exists" + return WM_TOOLS_SYNC_DIR + return WM_TOOLS_SYNC_DIR proc checkCacheDir() = if not dirExists(WM_TOOLS_DIR):