diff options
| author | Chris Wells <chris@mathematicaster.org> | 2024-01-24 14:56:56 -0600 |
|---|---|---|
| committer | Chris Wells <chris@mathematicaster.org> | 2024-01-24 14:56:56 -0600 |
| commit | d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6 (patch) | |
| tree | 7ead1c89bf2490114129d51560280e29b174aaa6 /modules/redux | |
| download | kobo-manager-d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6.tar kobo-manager-d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6.tar.gz kobo-manager-d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6.tar.bz2 kobo-manager-d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6.tar.lz kobo-manager-d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6.tar.xz kobo-manager-d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6.tar.zst kobo-manager-d6949fe35c1b4c7a9e93d1430e5c1b1d5dd4d9c6.zip | |
Getting a whole kobo distribution together!
Diffstat (limited to 'modules/redux')
| -rw-r--r-- | modules/redux/builder.nix | 11 | ||||
| -rw-r--r-- | modules/redux/file.nix | 44 | ||||
| -rw-r--r-- | modules/redux/kfmon.nix | 30 | ||||
| -rw-r--r-- | modules/redux/koreader.nix | 42 | ||||
| -rw-r--r-- | modules/redux/nickle.nix | 41 | ||||
| -rw-r--r-- | modules/redux/plato.nix | 179 |
6 files changed, 347 insertions, 0 deletions
diff --git a/modules/redux/builder.nix b/modules/redux/builder.nix new file mode 100644 index 0000000..5f74a1e --- /dev/null +++ b/modules/redux/builder.nix @@ -0,0 +1,11 @@ +{ pkgs, lib, ... }: +with builtins // lib; +{ + copyFile = { source, directory, executable, target, ... }: '' + cp -${if directory then "r" else ""}v "${source}" "${target}" + + ${optionalString (isBool executable) '' + chmod ${if executable then "+" else "-"}x "${target}" + ''} + ''; +} diff --git a/modules/redux/file.nix b/modules/redux/file.nix new file mode 100644 index 0000000..e05318d --- /dev/null +++ b/modules/redux/file.nix @@ -0,0 +1,44 @@ +{ config, pkgs, lib, ... }: +with builtins // lib; +let + cfg = config.file; +in { + options.file = mkOption { + default = {}; + type = with types; lazyAttrsOf (submodule ({ name, config, ... }: { + options = { + enable = mkEnableOption name // { default = true; }; + target = mkOption { + type = types.str; + default = name; + }; + executable = mkOption { + type = with types; nullOr bool; + default = null; + }; + directory = mkOption { + type = types.bool; + default = false; + description = "Enable this if the source file is a directory"; + }; + source = mkOption { + type = types.path; + }; + text = mkOption { + type = with types; nullOr lines; + default = null; + }; + }; + + config = mkMerge [ + (mkIf (config.text != null) { + directory = false; + source = pkgs.writeText name config.text; + }) + (mkIf (config.text == "") { + enable = false; + }) + ]; + })); + }; +} diff --git a/modules/redux/kfmon.nix b/modules/redux/kfmon.nix new file mode 100644 index 0000000..772a10b --- /dev/null +++ b/modules/redux/kfmon.nix @@ -0,0 +1,30 @@ +{ config, pkgs, lib, options, ... }: +with builtins // lib; +let + cfg = config.kfmon; +in { + options.kfmon = { + enable = mkEnableOption "KFMon"; + + path = mkOption { + type = types.str; + default = ".adds/kfmon"; + description = "Relative path to kfmon within src"; + }; + + file = mkOption { + type = options.file.type; + default = {}; + description = "Files relative to ${cfg.path}"; + }; + }; + + config = mkIf cfg.enable { + file = mapAttrs' (n: v: { + name = "kfmon-${n}"; + value = v // { + target = "${cfg.path}/${v.target}"; + }; + }) cfg.file + }; +} diff --git a/modules/redux/koreader.nix b/modules/redux/koreader.nix new file mode 100644 index 0000000..1c885a8 --- /dev/null +++ b/modules/redux/koreader.nix @@ -0,0 +1,42 @@ +{ config, pkgs, lib, options, ... }: +with builtins // lib; +let + cfg = config.koreader; +in { + options.koreader = { + enable = mkEnableOption "KOReader"; + + path = mkOption { + type = types.str; + default = ".adds/koreader"; + description = "Relative path to KOReader within src"; + }; + + nickleEntry = mkEnableOption "Launch KOReader directly via NickleMenu"; + + file = mkOption { + type = options.file.type; + default = {}; + description = "Files relative to ${cfg.path}"; + }; + }; + + config = mkIf cfg.enable { + file = mapAttrs' (n: v: { + name = "koreader-${n}"; + value = v // { + target = "${cfg.path}/${v.target}"; + }; + }) cfg.file + + nickle.menuItems = mkIf cfg.nickleEntry { + "koreader" = [ + "main" + "KOReader" + "cmd_spawn" + "quiet" + "exec /mnt/onboard/${cfg.path}/koreader.sh" + ]; + }; + }; +} diff --git a/modules/redux/nickle.nix b/modules/redux/nickle.nix new file mode 100644 index 0000000..b08a6ec --- /dev/null +++ b/modules/redux/nickle.nix @@ -0,0 +1,41 @@ +{ config, pkgs, lib, options, ... }: +with builtins // lib; +let + cfg = config.nickle; +in { + options.nickle = { + enable = mkEnableOption "NickleMenu"; + + path = mkOption { + type = types.str; + default = ".adds/nm"; + description = "Relative path to NickleMenu within src"; + }; + + file = mkOption { + type = options.file.type; + default = {}; + description = "Files relative to ${cfg.path}"; + }; + + menuItems = mkOption { + type = with types; attrsOf (listOf str); + default = {}; + }; + }; + + config = mkIf cfg.enable { + nickle = { + file = mapAttrs (_: v: { + text = concatStringsSep " : " ([ "menu_item" ] ++ v) + }) cfg.menuItems + }; + + file = mapAttrs' (n: v: { + name = "nm-${n}"; + value = v // { + target = "${cfg.path}/${v.target}"; + }; + }) cfg.file + }; +} diff --git a/modules/redux/plato.nix b/modules/redux/plato.nix new file mode 100644 index 0000000..6735133 --- /dev/null +++ b/modules/redux/plato.nix @@ -0,0 +1,179 @@ +{ config, pkgs, lib, options, ... }: +with builtins // lib; +let + cfg = config.plato; + toml = pkgs.formats.toml {}; +in { + imports = [ + ./nickle.nix + ]; + + options.plato = { + enable = mkEnableOpiton "Plato"; + + path = mkOption { + type = types.srt; + default = ".adds/plato"; + description = "Relative path to Plato within src"; + }; + + file = mkOption { + type = options.file.type; + default = {}; + description = "Files relative to ${cfg.path}"; + }; + + nickleEntry = mkEnableOption "Launch Plato directly from NickleMenu"; + + config = mkOption { + type = types.lines; + default = ""; + description = "Plato config.sh"; + }; + + hyphenation = mkEnableOption "hyphenation" // { default = true; }; + + convertDictionaries = mkEnableOption "convert StarDict" // { default = true; }; + + setFramebufferDepth = mkEnableOption "set framebuffer's depth" // { default = true; }; + + settings = mkOption { + type = toml.type; + default = {}; + description = "Plato Settings.toml"; + }; + + css = mkOption { + default = {}; + type = with types; attrsOf lines; + description = '' + css style sheets. + Only use this for epub-user dictionary-user html-user + ''; + }; + + scripts = mkOption { + default = {}; + type = with types; attrsOf lines; + description = '' + Only use this for wifi-post-up wifi-post-down wifi-pre-up wifi-pre-down. + ''; + # apply = mapAttrs (_: text: '' + # #!/bin/sh + + # ${text} + # '') + }; + + dictionaries = mkOption { + type = with types; listOf package; + default = []; + }; + + allDictionaries = mkOption { + type = types.package; + readOnly = true; + internal = true; + default = pkgs.runCommand "PlatoDictionaries" {} ('' + mkdir -p $out + '' + concatMapStringsSep "\n" (pkg: '' + find ${pkg}/share/dictd/ -type f -regex '.*\.\(dict\(\.dz\)?\|index\)' -exec cp -v {} $out/ \; + '') cfg.dictionaries + ); + + }; + + fonts = mkOption { + type = with types; listOf package; + default = []; + }; + + allFonts = mkOption { + type = types.package; + readOnly = true; + internal = true; + default = pkgs.runCommand "PlatoFonts" {} ('' + mkdir -p $out + '' + concatMapStringsSep "\n" (pkg: '' + find ${pkg}/share/fonts/truetype/ -type f -regex '.*\.\(ttf\|otf\)' -exec cp -v {} $out/ \; + '') cfg.fonts + ); + + }; + }; + + config = mkIf cfg.enable { + plato = { + config = concatStringsSep "\n\n" ( + optional (!cfg.convertDictionaries) '' + unset PLATO_CONVERT_DICTIONARIES + '' + ++ + optional (!cfg.setFramebufferDepth) '' + unset PLATO_SET_FRAMEBUFFER_DEPTH + '' + ++ + optional (!cfg.hyphenation) '' + [ -d hyphenation-patterns ] && rm -rf hyphenation-patterns + '' + ); + file = mkMerge [ + (mkIf (cfg.settings != {}) { + "Settings.toml".source = toml.generate "Settings.toml" cfg.settings; + }) + + (mkIf (cfg.config != "") { + "config.sh".text = cfg.config; + }) + + (mapAttrs' (n: text: + let + n1 = if hasPrefix "css/" n then n else "css/${n}"; + name = if hasSuffix ".css" n1 then n1 else "{n1}.css"; + in { + inherit name; + value = { inherit text; } + }) cfg.css) + + (mapAttrs' (n: t: + let + n1 = if hasPrefix "scripts/" n then n else "scripts/${n}"; + name = if hasSuffix ".sh" n1 then n1 else "${n1}.sh"; + text = if hasPrefix "#!/" t then t else "#!/bin/sh\n\n${t}"; + in { + inherit name; + value = { inherit text; }; + }) cfg.scripts) + + { + dictionaries = { + directory = true; + source = cfg.allDictionaries; + }; + fonts = { + directory = true; + source = cfg.allFonts; + }; + } + ]; + }; + + file = mapAttrs' (n: v: { + name = "plato-${n}"; + value = v // { + target = "${cfg.path}/${v.target}"; + }; + }) cfg.file; + + nickle.menuItems = mkIf cfg.nickleEntry { + "plato" = [ + "main" + "Plato" + "cmd_spawn" + "quiet" + "exec /mnt/onboard/${cfg.path}/plato.sh" + ]; + } + + }; +} |
