{ lib, stdenv, substituteAll, fetchurl, fetchpatch, findXMLCatalogs, writeScriptBin, ruby, bash }:

let

  common = { pname, sha256, suffix ? "" }: let
    legacySuffix = if suffix == "-nons" then "" else "-ns";
    self = stdenv.mkDerivation rec {
      inherit pname;
      version = "1.79.2";

      src = fetchurl {
        url = "https://github.com/docbook/xslt10-stylesheets/releases/download/release%2F${version}/docbook-xsl${suffix}-${version}.tar.bz2";
        inherit sha256;
      };

      patches = [
        # Prevent a potential stack overflow
        # https://github.com/docbook/xslt10-stylesheets/pull/37
        (fetchpatch {
          url = https://src.fedoraproject.org/rpms/docbook-style-xsl/raw/e3ae7a97ed1d185594dd35954e1a02196afb205a/f/docbook-style-xsl-non-recursive-string-subst.patch;
          sha256 = "0lrjjg5kpwwmbhkxzz6i5zmimb6lsvrrdhzc2qgjmb3r6jnsmii3";
          stripLen = "1";
        })

        # Fix reproducibility by respecting generate.consistent.ids in indexes
        # https://github.com/docbook/xslt10-stylesheets/pull/88
        # https://sourceforge.net/p/docbook/bugs/1385/
        (fetchpatch {
          url = "https://github.com/docbook/xslt10-stylesheets/commit/07631601e6602bc49b8eac3aab9d2b35968d3e7a.patch";
          sha256 = "0igfhcr6hzcydqsnjsd181h5yl3drjnrwdmxcybr236m8255vkq3";
          stripLen = "1";
        })

        # Add legacy sourceforge.net URIs to the catalog
        (substituteAll {
          src = ./catalog-legacy-uris.patch;
          inherit legacySuffix suffix version;
        })
      ];

      propagatedBuildInputs = [ findXMLCatalogs ];

      dontBuild = true;

      installPhase = ''
        dst=$out/share/xml/${pname}
        mkdir -p $dst
        rm -rf RELEASE* README* INSTALL TODO NEWS* BUGS install.sh tools Makefile tests extensions webhelp
        mv * $dst/

        # Backwards compatibility. Will remove eventually.
        mkdir -p $out/xml/xsl
        ln -s $dst $out/xml/xsl/docbook

        # More backwards compatibility
        ln -s $dst $out/share/xml/docbook-xsl${legacySuffix}
      '';

      passthru.dbtoepub = writeScriptBin "dbtoepub"
        ''
          #!${bash}/bin/bash
          exec -a dbtoepub ${ruby}/bin/ruby ${self}/share/xml/${pname}/epub/bin/dbtoepub "$@"
        '';

      meta = {
        homepage = http://wiki.docbook.org/topic/DocBookXslStylesheets;
        description = "XSL stylesheets for transforming DocBook documents into HTML and various other formats";
        maintainers = [ lib.maintainers.eelco ];
        platforms = lib.platforms.all;
      };
    };
  in self;

in {

  docbook-xsl-nons = common {
    pname = "docbook-xsl-nons";
    suffix = "-nons";
    sha256 = "00i1hdyxim8jymv2dz68ix3wbs5w6isxm8ijb03qk3vs1g59x2zf";
  };

  docbook-xsl-ns = common {
    pname = "docbook-xsl-ns";
    sha256 = "0wd33z41kdsybyx3ay21w6bdlmgpd9kyn3mr5y520lsf8km28r9i";
  };
}
