# Source: https://git.helsinki.tools/helsinki-systems/wp4nix/-/blob/master/default.nix # Licensed under: MIT # Slightly modified { lib, newScope, plugins, themes, languages }: let packages = self: let generatedJson = { inherit plugins themes languages; }; in { # Create a generic WordPress package. Most arguments are just passed # to `mkDerivation`. The version is automatically filtered for weird characters. mkWordpressDerivation = self.callPackage ({ stdenvNoCC, lib, filterWPString, gettext, wp-cli }: { type, pname, version, ... }@args: assert lib.any (x: x == type) [ "plugin" "theme" "language" ]; stdenvNoCC.mkDerivation ({ pname = "wordpress-${type}-${pname}"; version = filterWPString version; dontConfigure = true; dontBuild = true; installPhase = '' runHook preInstall cp -R ./. $out runHook postInstall ''; passthru = { wpName = pname; } // (args.passthru or {}); } // lib.optionalAttrs (type == "language") { nativeBuildInputs = [ gettext wp-cli ]; dontBuild = false; buildPhase = '' runHook preBuild find -name '*.po' -print0 | while IFS= read -d "" -r po; do msgfmt -o $(basename "$po" .po).mo "$po" done wp i18n make-json . rm *.po runHook postBuild ''; } // removeAttrs args [ "type" "pname" "version" "passthru" ])) {}; # Create a derivation from the official wordpress.org packages. # This takes the type, the pname and the data generated from the go tool. mkOfficialWordpressDerivation = self.callPackage ({ mkWordpressDerivation, fetchWordpress }: { type, pname, data }: mkWordpressDerivation { inherit type pname; version = data.version; src = fetchWordpress type data; }) {}; # Filter out all characters that might occur in a version string but that that are not allowed # in store paths. filterWPString = builtins.replaceStrings [ " " "," "/" "&" ";" ''"'' "'" "$" ":" "(" ")" "[" "]" "{" "}" "|" "*" "\t" ] [ "_" "." "." "" "" "" "" "" "" "" "" "" "" "" "" "-" "" "" ]; # Fetch a package from the official wordpress.org SVN. # The data supplied is the data straight from the go tool. fetchWordpress = self.callPackage ({ fetchsvn }: type: data: fetchsvn { inherit (data) rev sha256; url = if type == "plugin" || type == "theme" then "https://" + type + "s.svn.wordpress.org/" + data.path else if type == "language" then "https://i18n.svn.wordpress.org/core/" + data.version + "/" + data.path else if type == "pluginLanguage" then "https://i18n.svn.wordpress.org/plugins/" + data.path else if type == "themeLanguage" then "https://i18n.svn.wordpress.org/themes/" + data.path else throw "fetchWordpress: invalid package type ${type}"; }) {}; } // lib.mapAttrs (type: pkgs: lib.makeExtensible (_: lib.mapAttrs (pname: data: self.mkOfficialWordpressDerivation { type = lib.removeSuffix "s" type; inherit pname data; }) pkgs)) generatedJson; # This creates an extensible scope. in (lib.makeExtensible (_: (lib.makeScope newScope packages))).extend (selfWP: superWP: {})