From 3f9ada02ae733022152f75eda760b72468991e6c Mon Sep 17 00:00:00 2001 From: SLNOS Date: Sun, 1 Jan 2017 00:00:00 +0000 Subject: [PATCH] aspellDicts: add more dictionaries and some documentation --- .../libraries/aspell/dictionaries.nix | 152 ++++++++++++++++-- 1 file changed, 141 insertions(+), 11 deletions(-) diff --git a/pkgs/development/libraries/aspell/dictionaries.nix b/pkgs/development/libraries/aspell/dictionaries.nix index 8d97d6db2f1cb..096ac80e5a70a 100644 --- a/pkgs/development/libraries/aspell/dictionaries.nix +++ b/pkgs/development/libraries/aspell/dictionaries.nix @@ -1,32 +1,113 @@ -{stdenv, fetchurl, aspell, which}: +{lib, stdenv, fetchurl, aspell, which}: + +with lib; + +/* HOWTO: + + * Add some of these to your profile or systemPackages. + + ~~~~ + environment.systemPackages = [ + aspell + aspellDicts.en + aspellDicts.en-computers + aspellDicts.en-science + ]; + ~~~~ + + * Rebuild and switch to the new profile. + * Add something like + + ~~~~ + master en_US + extra-dicts en-computers.rws + add-extra-dicts en_US-science.rws + ~~~~ + + to `/etc/aspell.conf` or `~/.aspell.conf`. + * Check that `aspell -a` starts without errors. + * (optional) Check your config with `aspell dump config | grep -vE '^(#|$)'`. + * Enjoy. + +*/ let /* Function to compile an Aspell dictionary. Fortunately, they all build in the exact same way. */ buildDict = - {shortName, fullName, src, postInstall ? ""}: + {shortName, fullName, ...}@args: - stdenv.mkDerivation { + stdenv.mkDerivation ({ name = "aspell-dict-${shortName}"; - inherit src; - buildInputs = [aspell which]; dontAddPrefix = true; preBuild = "makeFlagsArray=(dictdir=$out/lib/aspell datadir=$out/lib/aspell)"; - inherit postInstall; - meta = { description = "Aspell dictionary for ${fullName}"; platforms = stdenv.lib.platforms.all; - }; - }; - -in { + } // (args.meta or {}); + } // removeAttrs args [ "meta" ]); + + /* Function to compile txt dict files into Aspell dictionaries. */ + buildTxtDict = + {langInputs ? [], ...}@args: + buildDict ({ + propagatedUserEnvPackages = langInputs; + + preBuild = '' + # Aspell can't handle multiple data-dirs + # Copy everything we might possibly need + ${concatMapStringsSep "\n" (p: '' + cp -a ${p}/lib/aspell/* . + '') ([ aspell ] ++ langInputs)} + export ASPELL_CONF="data-dir $(pwd)" + + aspell-create() { + target=$1 + shift + echo building $target + aspell create "$@" master ./$target.rws + } + + words-only() { + awk -F'\t' '{print $1}' | sort | uniq + } + + # drop comments + aspell-affix() { + words-only \ + | grep -v '#' \ + | aspell-create "$@" + } + + # Hack: drop comments and words with affixes + aspell-plain() { + words-only \ + | grep -v '#' \ + | grep -v '/' \ + | aspell-create "$@" + } + + aspell-install() { + install -d $out/lib/aspell + for a in "$@"; do + echo installing $a + install -t $out/lib/aspell $a.rws + done + } + ''; + + phases = [ "preBuild" "buildPhase" "installPhase" ]; + } // args); + +in rec { + + ### Languages ca = buildDict { shortName = "ca-2.1.5-1"; @@ -230,4 +311,53 @@ in { }; }; + ### Jargons + + en-computers = buildTxtDict rec { + shortName = "en-computers"; + fullName = "English Computer Jargon"; + + src = fetchurl { + url = https://mrsatterly.com/computer.dic; + sha256 = "1vzk7cdvcm9r1c6mgxpabrdcpvghdv9mjmnf6iq5wllcif5nsw2b"; + }; + + langInputs = [ en ]; + + buildPhase = "cat $src | aspell-affix en-computers --dont-validate-words --lang=en"; + installPhase = "aspell-install en-computers"; + + meta = { + homepage = https://mrsatterly.com/spelling.html; + }; + }; + + en-science = buildTxtDict rec { + shortName = "en-science"; + fullName = "English Scientific Jargon"; + + src1 = fetchurl { + url = http://jpetrie.net/wp-content/uploads/custom_scientific_US.txt; + sha256 = "1psqm094zl4prk2f8h18jv0d471hxykzd1zdnrlx7gzrzy6pz5r3"; + }; + + src2 = fetchurl { + url = http://jpetrie.net/wp-content/uploads/custom_scientific_UK.txt; + sha256 = "17ss1sdr3k70zbyx2z9xf74345slrp41gbkpih8axrmg4x92fgm1"; + }; + + langInputs = [ en ]; + + buildPhase = '' + cat $src1 | aspell-plain en_US-science --dont-validate-words --lang=en + cat $src2 | aspell-plain en_GB-science --dont-validate-words --lang=en + ''; + installPhase = "aspell-install en_US-science en_GB-science"; + + meta = { + homepage = http://www.jpetrie.net/scientific-word-list-for-spell-checkersspelling-dictionaries/; + }; + + }; + }