{
lib,
symlinkJoin,
makeWrapper,
anki,
anki-utils,
writeTextDir,
ankiAddons ? [ ],
}:
/*
`ankiAddons`
: A set of Anki add-ons to be installed. Here's a an example:
~~~
pkgs.anki.withAddons [
# When the add-on is already available in nixpkgs
pkgs.ankiAddons.anki-connect
# When the add-on is not available in nixpkgs
(pkgs.anki-utils.buildAnkiAddon (finalAttrs: {
pname = "recolor";
version = "3.1";
src = pkgs.fetchFromGitHub {
owner = "AnKing-VIP";
repo = "AnkiRecolor";
rev = finalAttrs.version;
sparseCheckout = [ "src/addon" ];
hash = "sha256-28DJq2l9DP8O6OsbNQCZ0pm4S6CQ3Yz0Vfvlj+iQw8Y=";
};
sourceRoot = "source/src/addon";
}))
# When the add-on needs to be configured
pkgs.ankiAddons.passfail2.withConfig {
config = {
again_button_name = "not quite";
good_button_name = "excellent";
};
user_files = ./dir-to-be-merged-into-addon-user-files-dir;
};
]
~~~
The original `anki` executable will be wrapped so that it uses the addons from
`ankiAddons`.
This only works with Anki versions patched to support the `ANKI_ADDONS` environment
variable. `pkgs.anki` has this, but `pkgs.anki-bin` does not.
*/
let
defaultAddons = [
(anki-utils.buildAnkiAddon {
pname = "nixos";
version = "1.0";
src = writeTextDir "__init__.py" ''
import aqt
from aqt.qt import QMessageBox
import json
def addons_dialog_will_show(dialog: aqt.addons.AddonsDialog) -> None:
dialog.setEnabled(False)
QMessageBox.information(
dialog,
"NixOS Info",
("These add-ons are managed by NixOS.
"
"See "
"github.com/NixOS/nixpkgs/tree/master/pkgs/games/anki/with-addons.nix")
)
def addon_tried_to_write_config(module: str, conf: dict) -> None:
message_box = QMessageBox(
QMessageBox.Icon.Warning,
"NixOS Info",
(f"The add-on module: \"{module}\" tried to update its config.
"
"See "
"github.com/NixOS/nixpkgs/tree/master/pkgs/games/anki/with-addons.nix"
" for how to configure add-ons managed by NixOS.")
)
message_box.setDetailedText(json.dumps(conf))
message_box.exec()
aqt.gui_hooks.addons_dialog_will_show.append(addons_dialog_will_show)
aqt.mw.addonManager.writeConfig = addon_tried_to_write_config
'';
meta.maintainers = with lib.maintainers; [ junestepp ];
})
];
in
symlinkJoin {
inherit (anki) version;
pname = "${anki.pname}-with-addons";
paths = [ anki ];
nativeBuildInputs = [ makeWrapper ];
postBuild = ''
wrapProgram $out/bin/anki \
--set ANKI_ADDONS "${anki-utils.buildAnkiAddonsDir (ankiAddons ++ defaultAddons)}"
'';
meta = builtins.removeAttrs anki.meta [
"name"
"outputsToInstall"
"position"
];
}