{ description = "Various fonts I've found online"; inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:nixos/nixpkgs"; artemist = { url = "git+https://git.mildlyfunctional.gay/artemist/packages.git"; inputs.utils.follows = "flake-utils"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, flake-utils, artemist }: with nixpkgs.lib; { overlays.default = (final: prev: let localFonts = [ { # Popular font, used on NYC Subway name = "Akzidenz-Grotesk Pro"; dir = ./Akzidenz-Grotesk-Pro; license = licenses.unfree; author = "Berthold Type Foundry"; } { # Font used on DSB departure boards name = "AtB"; dir = ./AtB; license = licenses.unfree; author = "Kontrapunkt"; } { # Brussels-specific font name = "Brusseline"; dir = ./Brusseline; license = licenses.unfree; author = "Eric de Berranger"; } { # Free handwriting font name = "Caveat"; files = [ ./Caveat.ttf ]; license = licenses.ofl; author = "Pablo Impallari and Alexi Vanyashin"; } { # Twitter custom font, based on GT America name = "Chirp"; dir = ./Chirp; license = licenses.unfree; author = "Grilli Type Foundry"; } { # Deutsche Bahn website font name = "DB Screen"; dir = ./DB-Screen; license = licenses.unfree; author = "URW Type Foundry"; } { # Font with a large number of invented scripts name = "Fairfax HD"; dir = ./Fairfax-HD; license = licenses.ofl; author = "Kreative Software"; } { # Popular font, used on Amtrak name = "Frutiger"; dir = ./Frutiger; license = licenses.unfree; author = "Adrian Frutiger"; } { # Discord custom font name = "gg sans"; dir = ./ggsans; license = licenses.unfree; author = "Colophon Foundry"; } { # Several related fonts used for London Underground: # * Johnston 100: Extension of original Johnston # * New Johnston: Modification of original Johnston # * P22 Underground: Version sold to public name = "Johnston"; dir = ./Johnston; license = licenses.unfree; author = "Edward Johnston et al"; } { # Mysterious all-uppercase hand-style font for MIVB/STIB name = "MIVB STIB"; dir = ./MIVB; license = licenses.unfree; author = "unknown"; } { # Also called "NR Brunel, used on UK railways in 2010s name = "New Brunel"; dir = ./New-Brunel; license = licenses.unfree; author = "David Quay"; } { # Modern expansion of machine-readable font name = "OCR-B"; files = [ ./OCR-B-Regular.otf ]; license = licenses.cc-by-40; author = "Matthew Anderson"; } { # Custom font used for RATP services in Parism name = "Parisine"; dir = ./Parisine; license = licenses.unfree; author = "Jean-François Porchez"; } { # Font used on DSB website, similar to signage name = "Via"; dir = ./Via; license = licenses.unfree; author = "Kontrapunkt"; } ]; buildLocalFont = { name, files ? [ ], dir ? null, license, author }: let types = { ttf = "truetype"; otf = "opentype"; }; pathEndsWith = suffix: path: let str = toString path; sufLen = stringLength suffix; sLen = stringLength str; in sufLen <= sLen && suffix == substring (sLen - sufLen) sufLen str; copyType = extension: pathName: let filteredFiles = filter (pathEndsWith ("." + extension)) files; filename = file: lists.last (strings.splitString "/" (toString file)); in (optionalString (filteredFiles != [ ]) '' mkdir -p $out/share/fonts/${pathName} '') + concatStringsSep "\n" (map (file: "cp -v ${file} $out/share/fonts/${pathName}/${filename file}") filteredFiles); copyTypeDir = extension: pathName: '' if [ -n "$(shopt -s nullglob; echo ${dir}/*.${extension})" ]; then mkdir -p $out/share/fonts/${pathName} cp -v -t $out/share/fonts/${pathName} ${dir}/*.${extension} fi ''; in final.stdenvNoCC.mkDerivation { inherit name; dontUnpack = true; installPhase = mapAttrsToList copyType types ++ optional (dir != null) (mapAttrsToList copyTypeDir types); passthru.font = true; meta = { inherit license; platforms = platforms.all; maintainers = [ maintainers.artemist ]; description = "${name} font by ${author}"; }; }; in { extraFonts = listToAttrs (map (font: { name = replaceStrings [ " " ] [ "-" ] (toLower font.name); value = buildLocalFont font; }) localFonts); appleFonts = final.callPackage ./apple { ipsw = if final ? ipsw then final.ipsw else artemist.packages.${final.stdenv.system}.ipsw; }; }); } // flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [ self.overlays.default artemist.overlays.default ]; config.allowUnfree = true; }; in { packages = builtins.listToAttrs (map (name: { inherit name; value = pkgs.${name} // { type = "derivation"; name = "dummy-attrset"; }; }) [ "extraFonts" "appleFonts" ]); formatter = pkgs.nixfmt; }); }