{ config, lib, pkgs, ... }: let bookmarkList = (import ./general.nix) ++ (import ./tools.nix) ++ (import ./social.nix) ++ (import ./infosec.nix) ++ (import ./other.nix) ++ (import ./jack.nix); c = config.lib.stylix.colors; stripProtocol = url: lib.removePrefix "https://" (lib.removePrefix "http://" url); stripDomain = url: builtins.head ( lib.splitString "/" (stripProtocol url) ); mkCard = item: let domain = stripDomain item.url; initial = builtins.substring 0 1 item.name; in ''
${item.name} ${stripProtocol item.url}
''; mkFolderContent = items: let step = acc: item: if item ? url then acc // {pending = acc.pending ++ [item];} else { chunks = acc.chunks ++ lib.optional (acc.pending != []) { isCards = true; items = acc.pending; } ++ [ { isCards = false; folder = item; } ]; pending = []; }; result = lib.foldl' step { chunks = []; pending = []; } items; chunks = result.chunks ++ lib.optional (result.pending != []) { isCards = true; items = result.pending; }; in lib.concatMapStrings (chunk: if chunk.isCards then ''
${lib.concatMapStrings mkCard chunk.items}
'' else mkFolder chunk.folder) chunks; mkFolder = folder: let iconHtml = if folder ? icon then '''' else ""; in ''
${iconHtml}${folder.name}
${mkFolderContent folder.bookmarks}
''; grouped = let step = acc: item: if item ? url then acc // {pending = acc.pending ++ [item];} else { groups = acc.groups ++ lib.optional (acc.pending != []) { isRoot = true; items = acc.pending; } ++ [ { isRoot = false; inherit item; } ]; pending = []; }; result = lib.foldl' step { groups = []; pending = []; } bookmarkList; in result.groups ++ lib.optional (result.pending != []) { isRoot = true; items = result.pending; }; mkSection = group: if group.isRoot then ''
${lib.concatMapStrings mkCard group.items}
'' else mkFolder group.item; collectBookmarks = prefix: items: lib.concatMapStrings ( item: if item ? url then "${item.url} ${prefix}${item.name}\n" else collectBookmarks "${prefix}${item.name}/" item.bookmarks ) items; publicBookmarks = pkgs.writeText "qutebrowser-public-bookmarks" (collectBookmarks "" bookmarkList); in { config = { xdg.dataFile."qutebrowser/bookmarks.html".text = '' Bookmarks

Bookmarks

No results

${lib.concatMapStrings mkSection grouped}
''; home.activation.qutebrowserBookmarks = lib.hm.dag.entryAfter ["writeBoundary"] '' mkdir -p ${config.home.homeDirectory}/.config/qutebrowser/bookmarks cat ${publicBookmarks} > ${config.home.homeDirectory}/.config/qutebrowser/bookmarks/urls ''; }; }