diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index 9af80b4fac1f..e91cc0e4174d 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -9963,6 +9963,12 @@
githubId = 782440;
name = "Luna Nova";
};
+ lurkki = {
+ email = "jussi.kuokkanen@protonmail.com";
+ github = "Lurkki14";
+ githubId = 44469719;
+ name = "Jussi Kuokkanen";
+ };
lux = {
email = "lux@lux.name";
github = "luxzeitlos";
diff --git a/pkgs/development/libraries/hfst-ospell/default.nix b/pkgs/development/libraries/hfst-ospell/default.nix
new file mode 100644
index 000000000000..ad07025cc35d
--- /dev/null
+++ b/pkgs/development/libraries/hfst-ospell/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, autoreconfHook
+, fetchFromGitHub
+, icu
+, libarchive
+, pkg-config
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+ pname = "hfst-ospell";
+ version = "0.5.3";
+
+ src = fetchFromGitHub {
+ owner = "hfst";
+ repo = "hfst-ospell";
+ rev = "refs/tags/v${finalAttrs.version}";
+ hash = "sha256-16H1nbAIe+G71+TnlLG0WnH9LktZwmc0d0O+oYduH1k=";
+ };
+
+ buildInputs = [
+ icu
+ libarchive
+ ];
+
+ nativeBuildInputs = [
+ autoreconfHook
+ pkg-config
+ ];
+
+ # libxmlxx is listed as a dependency but Darwin build fails with it,
+ # might also be better in general since libxmlxx in Nixpkgs is 8 years old
+ # https://github.com/hfst/hfst-ospell/issues/48#issuecomment-546535653
+ configureFlags = [
+ "--without-libxmlpp"
+ "--without-tinyxml2"
+ ];
+
+ meta = with lib; {
+ homepage = "https://github.com/hfst/hfst-ospell/";
+ description = "HFST spell checker library and command line tool ";
+ license = licenses.asl20;
+ maintainers = with maintainers; [ lurkki ];
+ platforms = platforms.unix;
+ };
+})
diff --git a/pkgs/development/libraries/hfst/default.nix b/pkgs/development/libraries/hfst/default.nix
new file mode 100644
index 000000000000..41707bbd4986
--- /dev/null
+++ b/pkgs/development/libraries/hfst/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, autoreconfHook
+, bison
+, flex
+, foma
+, fetchFromGitHub
+, gettext
+, icu
+, stdenv
+, swig
+, pkg-config
+, zlib
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+ pname = "hfst";
+ version = "3.16.0";
+
+ src = fetchFromGitHub {
+ owner = "hfst";
+ repo = "hfst";
+ rev = "refs/tags/v${finalAttrs.version}";
+ hash = "sha256-2ST0s08Pcp+hTn7rUTgPE1QkH6PPWtiuFezXV3QW0kU=";
+ };
+
+ nativeBuildInputs = [
+ autoreconfHook
+ bison
+ flex
+ pkg-config
+ swig
+ ];
+
+ buildInputs = [
+ foma
+ gettext
+ icu
+ zlib
+ ];
+
+ configureFlags = [
+ "--enable-all-tools"
+ "--with-foma-upstream=true"
+ ];
+
+ meta = with lib; {
+ description = "FST language processing library";
+ homepage = "https://github.com/hfst/hfst";
+ license = licenses.gpl3Plus;
+ maintainers = with maintainers; [ lurkki ];
+ platforms = platforms.unix;
+ };
+})
diff --git a/pkgs/development/libraries/libvoikko/default.nix b/pkgs/development/libraries/libvoikko/default.nix
new file mode 100644
index 000000000000..3f5f4ef5c858
--- /dev/null
+++ b/pkgs/development/libraries/libvoikko/default.nix
@@ -0,0 +1,40 @@
+{ stdenv
+, lib
+, autoreconfHook
+, hfst-ospell
+, fetchFromGitHub
+, pkg-config
+, python3
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+ pname = "libvoikko";
+ version = "4.3.2";
+
+ src = fetchFromGitHub {
+ owner = "voikko";
+ repo = "corevoikko";
+ rev = "refs/tags/rel-libvoikko-${finalAttrs.version}";
+ hash = "sha256-0MIQ54dCxyAfdgYWmmTVF+Yfa15K2sjJyP1JNxwHP2M=";
+ };
+
+ sourceRoot = "${finalAttrs.src.name}/libvoikko";
+
+ nativeBuildInputs = [
+ autoreconfHook
+ pkg-config
+ python3
+ ];
+
+ buildInputs = [
+ hfst-ospell
+ ];
+
+ meta = with lib; {
+ homepage = "https://voikko.puimula.org/";
+ description = "Finnish language processing library";
+ license = licenses.lgpl21Plus;
+ maintainers = with maintainers; [ lurkki ];
+ platforms = platforms.unix;
+ };
+})
diff --git a/pkgs/development/libraries/omorfi/default.nix b/pkgs/development/libraries/omorfi/default.nix
new file mode 100644
index 000000000000..d6d0f1741d17
--- /dev/null
+++ b/pkgs/development/libraries/omorfi/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, autoreconfHook
+, cg3
+, fetchFromGitHub
+, hfst
+, hfst-ospell
+, icu
+, libvoikko
+, makeWrapper
+, pkg-config
+, python3
+, zip
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+ pname = "omorfi";
+ version = "0.9.9";
+
+ src = fetchFromGitHub {
+ owner = "flammie";
+ repo = "omorfi";
+ rev = "refs/tags/v${finalAttrs.version}";
+ hash = "sha256-UoqdwNWCNOPX6u1YBlnXUcB/fmcvcy/HXbYciVrMBOY=";
+ };
+
+ # Fix for omorfi-hyphenate.sh file not found error
+ postInstall = ''
+ ln -s $out/share/omorfi/{omorfi.hyphenate-rules.hfst,omorfi.hyphenate.hfst}
+ '';
+
+ nativeBuildInputs = [
+ autoreconfHook
+ cg3
+ makeWrapper
+ pkg-config
+ python3
+ zip
+ python3.pkgs.wrapPython
+ ];
+
+ buildInputs = [
+ python3.pkgs.hfst
+ hfst-ospell
+ libvoikko
+ ];
+
+ # Supplied pkg-config file doesn't properly expose these
+ propagatedBuildInputs = [
+ hfst
+ icu
+ ];
+
+ # Wrap shell scripts so they find the Python scripts
+ # omorfi.bash inexplicably fails when wrapped
+ preFixup = ''
+ wrapPythonProgramsIn "$out/bin" "$out ${python3.pkgs.hfst}"
+ for i in "$out/bin"/*.{sh,bash}; do
+ if [ $(basename "$i") != "omorfi.bash" ]; then
+ wrapProgram "$i" --prefix "PATH" : "$out/bin/"
+ fi
+ done
+ '';
+
+ # Enable all features
+ configureFlags = [
+ "--enable-labeled-segments"
+ "--enable-lemmatiser"
+ "--enable-segmenter"
+ "--enable-hyphenator"
+ ];
+
+ meta = with lib; {
+ description = "Analysis for Finnish text";
+ homepage = "https://github.com/flammie/omorfi";
+ license = licenses.gpl3;
+ maintainers = with maintainers; [ lurkki ];
+ # Darwin build fails due to hfst not being found
+ broken = stdenv.isDarwin;
+ };
+})
diff --git a/pkgs/development/python-modules/hfst/default.nix b/pkgs/development/python-modules/hfst/default.nix
new file mode 100644
index 000000000000..b865c4c84d63
--- /dev/null
+++ b/pkgs/development/python-modules/hfst/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, pkgs
+, stdenv
+, buildPythonPackage
+, foma
+, icu
+, swig
+}:
+
+buildPythonPackage rec {
+ pname = "hfst";
+ inherit (pkgs.hfst) version src;
+
+ sourceRoot = "${src.name}/python";
+
+ postPatch = ''
+ # omorfi-python looks for 'hfst' Python package
+ sed -i 's/libhfst_swig/hfst/' setup.py;
+ '';
+
+ nativeBuildInputs = [
+ swig
+ ];
+
+ buildInputs = [
+ icu
+ pkgs.hfst
+ ];
+
+ setupPyBuildFlags = [
+ "--inplace"
+ ];
+
+ # Find foma in Darwin tests
+ preCheck = lib.optionalString stdenv.isDarwin ''
+ export DYLD_LIBRARY_PATH="${foma}/lib"
+ '';
+
+ meta = with lib; {
+ description = "Python bindings for HFST";
+ homepage = "https://github.com/hfst/hfst";
+ license = licenses.gpl3;
+ maintainers = with maintainers; [ lurkki ];
+ };
+}
diff --git a/pkgs/development/python-modules/omorfi/default.nix b/pkgs/development/python-modules/omorfi/default.nix
new file mode 100644
index 000000000000..6bbe964de734
--- /dev/null
+++ b/pkgs/development/python-modules/omorfi/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, pkgs
+, lib
+, stdenv
+, hfst
+}:
+
+buildPythonPackage rec {
+ pname = "omorfi";
+ inherit (pkgs.omorfi) src version;
+
+ sourceRoot = "${src.name}/src/python";
+
+ propagatedBuildInputs = [
+ hfst
+ ];
+
+ # Fixes some improper import paths
+ patches = [ ./importfix.patch ];
+
+ # Apply patch relative to source/src
+ patchFlags = [ "-p3" ];
+
+ meta = with lib; {
+ description = "Python interface for Omorfi";
+ homepage = "https://github.com/flammie/omorfi";
+ license = licenses.gpl3;
+ maintainers = with maintainers; [ lurkki ];
+ # Ofborg build error (hfst not found?)
+ broken = stdenv.isDarwin;
+ };
+}
diff --git a/pkgs/development/python-modules/omorfi/importfix.patch b/pkgs/development/python-modules/omorfi/importfix.patch
new file mode 100644
index 000000000000..67a54363c7b1
--- /dev/null
+++ b/pkgs/development/python-modules/omorfi/importfix.patch
@@ -0,0 +1,76 @@
+diff --git a/src/python/omorfi/entryguessing/gradation.py b/src/python/omorfi/entryguessing/gradation.py
+index 7d3ed8cb..825d7ead 100755
+--- a/src/python/omorfi/entryguessing/gradation.py
++++ b/src/python/omorfi/entryguessing/gradation.py
+@@ -17,8 +17,8 @@
+ # You should have received a copy of the GNU General Public License
+ # along with this program. If not, see .
+
+-from .omorfi.error_logging import fail_guess_because
+-from .omorfi.string_mangling import replace_rightmost, replace_rightmosts
++from omorfi.error_logging import fail_guess_because
++from omorfi.string_manglers import replace_rightmost, replace_rightmosts
+
+
+ def gradation_make_morphophonemes(wordmap):
+diff --git a/src/python/omorfi/entryguessing/guess_new_class.py b/src/python/omorfi/entryguessing/guess_new_class.py
+index 1884716b..3a781bfc 100755
+--- a/src/python/omorfi/entryguessing/guess_new_class.py
++++ b/src/python/omorfi/entryguessing/guess_new_class.py
+@@ -17,8 +17,8 @@
+ # You should have received a copy of the GNU General Public License
+ # along with this program. If not, see .
+
+-from .error_logging import fail_guess_because
+-from .string_manglers import three_syllable
++from omorfi.error_logging import fail_guess_because
++from omorfi.string_manglers import three_syllable
+
+
+ def guess_new_class(wordmap):
+diff --git a/src/python/omorfi/entryguessing/plurale_tantum.py b/src/python/omorfi/entryguessing/plurale_tantum.py
+index a8af81fb..95fc4b7b 100755
+--- a/src/python/omorfi/entryguessing/plurale_tantum.py
++++ b/src/python/omorfi/entryguessing/plurale_tantum.py
+@@ -17,8 +17,8 @@
+ # You should have received a copy of the GNU General Public License
+ # along with this program. If not, see .
+
+-from .error_logging import fail_guess_because
+-from .omorfi.string_manglers import replace_rightmost, replace_rightmosts
++from omorfi.error_logging import fail_guess_because
++from omorfi.string_manglers import replace_rightmost, replace_rightmosts
+
+
+ def plurale_tantum_get_singular_stem(wordmap):
+diff --git a/src/python/omorfi/formats/experimental_xml_formatter.py b/src/python/omorfi/formats/experimental_xml_formatter.py
+index abccbff5..11b0f518 100755
+--- a/src/python/omorfi/formats/experimental_xml_formatter.py
++++ b/src/python/omorfi/formats/experimental_xml_formatter.py
+@@ -19,9 +19,9 @@
+
+ from xml.sax.saxutils import escape as xml_escape
+
+-from ftb3_formatter import Ftb3Formatter
++from .ftb3_formatter import Ftb3Formatter
+
+-from .settings import version_id_easter_egg
++from omorfi.settings import version_id_easter_egg
+
+
+ def make_xmlid(s):
+diff --git a/src/python/omorfi/formats/lexc_formatter.py b/src/python/omorfi/formats/lexc_formatter.py
+index 4ec616b7..b146129f 100755
+--- a/src/python/omorfi/formats/lexc_formatter.py
++++ b/src/python/omorfi/formats/lexc_formatter.py
+@@ -19,8 +19,8 @@
+
+ # functions for formatting the database data to lexc
+
+-from .settings import deriv_boundary, morph_boundary, newword_boundary, optional_hyphen, stub_boundary, word_boundary
+-from .string_manglers import lexc_escape
++from omorfi.settings import deriv_boundary, morph_boundary, newword_boundary, optional_hyphen, stub_boundary, word_boundary
++from omorfi.string_manglers import lexc_escape
+
+
+ def format_copyright_lexc():
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 050b7eb6235c..10a2ff4df8b8 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -41577,6 +41577,14 @@ with pkgs;
charasay = callPackage ../tools/misc/charasay { };
+ libvoikko = callPackage ../development/libraries/libvoikko { };
+
+ hfst = callPackage ../development/libraries/hfst { };
+
+ omorfi = callPackage ../development/libraries/omorfi { };
+
+ hfst-ospell = callPackage ../development/libraries/hfst-ospell { };
+
waylyrics = callPackage ../applications/audio/waylyrics { };
gitrs = callPackage ../tools/misc/gitrs { };
diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix
index 7344b930e6c4..e643cf5861c9 100644
--- a/pkgs/top-level/python-packages.nix
+++ b/pkgs/top-level/python-packages.nix
@@ -4718,6 +4718,8 @@ self: super: with self; {
hexdump = callPackage ../development/python-modules/hexdump { };
+ hfst = callPackage ../development/python-modules/hfst { };
+
hg-commitsigs = callPackage ../development/python-modules/hg-commitsigs { };
hg-evolve = callPackage ../development/python-modules/hg-evolve { };
@@ -7282,6 +7284,8 @@ self: super: with self; {
omnilogic = callPackage ../development/python-modules/omnilogic { };
+ omorfi = callPackage ../development/python-modules/omorfi { };
+
omrdatasettools = callPackage ../development/python-modules/omrdatasettools { };
ondilo = callPackage ../development/python-modules/ondilo { };