{ 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}
''; # Render a list of items (cards and/or sub-folders) inside a folder 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}
''; # Group consecutive root items so they share the same .cards grid 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; # Recursively collect all leaf bookmarks with their full folder path 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); inherit (config.qutebrowser) privateBookmarksPath; in { options.qutebrowser.privateBookmarksPath = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; description = "Path to a file containing extra (private) bookmarks to append."; }; config = { xdg.dataFile."qutebrowser/bookmarks.html".text = '' Bookmarks

Bookmarks

No results

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