diff --git a/pkgs/data/fonts/iosevka/comfy-private-build-plans.toml b/pkgs/data/fonts/iosevka/comfy-private-build-plans.toml new file mode 100644 index 00000000000..d5b0221a64a --- /dev/null +++ b/pkgs/data/fonts/iosevka/comfy-private-build-plans.toml @@ -0,0 +1,487 @@ +# The file below is copy/pasted from +# https://github.com/protesilaos/iosevka-comfy/blob/0.1.0/private-build-plans.toml. It +# seems like ofborg will prevent me from using fetchurl to download +# this file automatically. +[buildPlans.iosevka-comfy] # is your plan name +family = "Iosevka Comfy" # Font menu family name +spacing = "normal" # Optional; Values: `normal`, `quasi-proportional`, `quasi-proportional-extension-only`, `term`, `fontconfig-mono`, or `fixed` +serifs = "sans" # Optional; Values: `sans` or `slab` + +################################################################################################### +# Configure variants + +# # Optional; Whether to inherit a `ss##` variant +# [buildPlans.iosevka-comfy.variants] +# inherits = "ss01" + +# Optional; Configure single character's variant +[buildPlans.iosevka-comfy.variants.design] +cv01 = 1 # A cap straight +cv02 = 1 # B cap straight +cv03 = 1 # C cap serifless +cv04 = 6 # D cap curly with top and bottom serif (without serifs TODO reads like TOOO at small point sizes) +cv05 = 1 # E cap serifless +cv06 = 1 # F cap serifless +cv07 = 4 # G cap toothed +cv08 = 1 # H cap serifless +cv09 = 1 # I cap long serifs +cv10 = 2 # J cap serified +cv11 = 2 # K cap curly +cv12 = 1 # L cap serifless +cv13 = 3 # M cap short middle leg slanted sides +cv14 = 1 # N cap symmetric +cv15 = 1 # P cap straight +cv16 = 4 # Q cap crossing tail +cv17 = 1 # R cap straight +cv18 = 1 # S cap serifless +cv19 = 1 # T cap serifless +cv20 = 3 # U cap serifless +cv21 = 1 # V cap straight +cv22 = 1 # W straight +cv23 = 1 # X cap straight +cv24 = 1 # Y cap straight +cv25 = 1 # Z cap straight +cv26 = 10 # a single storey earless tailed bottom +cv27 = 1 # b toothed +cv28 = 1 # c serifless +cv29 = 1 # d toothed +cv33 = 1 # h straight +cv34 = 10 # i serified flat tailed +cv35 = 6 # j flat hook serified +cv37 = 10 # l serified flat tailed +cv42 = 9 # r compact +cv43 = 1 # s serifless +cv44 = 2 # t flat hook +cv45 = 4 # u tailed +cv49 = 6 # y cursive flat terminal hook +cv53 = 1 # Λ, Δ lambda and delta cap straight +cv54 = 2 # α alpha straight tailed +VXAA = 1 # δ delta rounded top +cv55 = 1 # Γ gamma cap straight +cv56 = 6 # ι iota serified flat tailed +cv57 = 2 # λ lambda top tailed +VXAC = 1 # μ me tailless +VXAB = 2 # ξ xe flat top +cv71 = 13 # 0 oval dashed forward slash +cv74 = 2 # 3 arched +cv76 = 2 # 5 open contour +cv78 = 1 # 7 straight +cv79 = 3 # 8 two asymmetric circles +cv81 = 2 # ~ tilde low +cv82 = 2 # * asterisk five-pointed low +cv83 = 1 # _ underscore right below baseline +cv85 = 1 # ^ uptick high +cv86 = 1 # ( parentheses normal slope +cv87 = 2 # { braces curly +cv88 = 1 # # column straight +cv90 = 4 # @ three-fold, tall height +cv91 = 2 # $ dollar strike through +cv92 = 2 # ¢ cent strike through +cv93 = 1 # % percent dots +cv94 = 1 # | bar natural slope +cv95 = 2 # ≥ equal-or-{higher,lower} slanted +cv96 = 1 # ' single quote straight +cv97 = 1 # ` grave/backtick straight +cv98 = 1 # ? smooth +cv99 = 2 # .:; square punctuation marks +VXDD = 2 # ijäöü square diacretics + +# Optional; Configure single character's variant for Upright and Oblique; Overrides [design] +[buildPlans.iosevka-comfy.variants.upright] +cv30 = 1 # e straight +cv31 = 16 # f serifless bottom flat top crossbar at x height +cv32 = 9 # g single storey flat hook earless cornered top +cv36 = 1 # k straight +cv38 = 6 # m earless double arch short middle leg +cv39 = 3 # n earless straight +cv40 = 2 # p earless +cv41 = 2 # q earless +cv46 = 1 # v straight +cv47 = 1 # w straight +cv48 = 1 # x straight +cv50 = 1 # z straight +cv72 = 3 # 1 serified with base +cv73 = 1 # 2 straight +cv75 = 3 # 4 semi-open contour +cv77 = 3 # 6 straight +cv80 = 3 # 9 straight +cv89 = 2 # & et open top (ampersand) + +# Optional; Configure single character's variant for Italic only; Overrides [design] +[buildPlans.iosevka-comfy.variants.italic] +cv30 = 2 # e curly +cv31 = 14 # f extended flat top bottom hook +cv32 = 7 # g single storey flat hook +cv36 = 2 # k curly +cv38 = 2 # m straight middle shortleg +cv39 = 1 # n straight +cv40 = 1 # p straight +cv41 = 1 # q straight +cv46 = 2 # v curly +cv47 = 2 # w curly short middle top +cv48 = 2 # x curly +cv50 = 4 # z curly +cv72 = 2 # 1 serified no base +cv73 = 2 # 2 curly +cv75 = 1 # 4 closed contour crossing +cv77 = 1 # 6 closed contour +cv80 = 1 # 9 closed contour +cv89 = 4 # & et open top toothed (ampersand) + +# End variant section +################################################################################################### + +################################################################################################### +# Override default building weights +# When buildPlans..weights is absent, all weights would built and mapped to +# default values. +# IMPORTANT : Currently "menu" and "css" property only support numbers between 0 and 1000. +# and "shape" properly only supports number between 100 and 900 (inclusive). +# If you decide to use custom weights you have to define all the weights you +# plan to use otherwise they will not be built. +[buildPlans.iosevka-comfy.weights.light] +shape = 300 +menu = 300 +css = 300 + +[buildPlans.iosevka-comfy.weights.semilight] +shape = 350 +menu = 350 +css = 350 + +[buildPlans.iosevka-comfy.weights.regular] +shape = 400 +menu = 400 +css = 400 + +[buildPlans.iosevka-comfy.weights.bold] +shape = 700 +menu = 700 +css = 700 + +[buildPlans.iosevka-comfy.weights.extrabold] +shape = 800 +menu = 800 +css = 800 + +# End weight section +################################################################################################### + +################################################################################################### +# Override default building slope sets +# When this section is absent, all slopes would be built. + +[buildPlans.iosevka-comfy.slopes.upright] +angle = 0 # Angle in degrees. Valid range [0, 15] +shape = "upright" # Slope grade used for shape selection. `upright` | `oblique` | `italic` +menu = "upright" # Slope grade used for naming. `upright` | `oblique` | `italic` +css = "normal" # Slope grade used for webfont CSS. `normal` | `oblique` | `italic` + +[buildPlans.iosevka-comfy.slopes.italic] +angle = 9.4 +shape = "italic" +menu = "italic" +css = "italic" + +# End slope section +################################################################################################### + +################################################################################################### +# Override default building widths +# When buildPlans..widths is absent, all widths would built and mapped to +# default values. +# IMPORTANT : Currently "shape" property only supports numbers between 434 and 664 (inclusive), +# while "menu" only supports integers between 1 and 9 (inclusive). +# The "shape" parameter specifies the unit width, measured in 1/1000 em. The glyphs' +# width are equal to, or a simple multiple of the unit width. +# If you decide to use custom widths you have to define all the widths you plan to use, +# otherwise they will not be built. + +# [buildPlans.iosevka-comfy.widths.condensed] +# shape = 485 +# menu = 3 +# css = "condensed" + +[buildPlans.iosevka-comfy.widths.normal] +shape = 525 # Unit Width, measured in 1/1000 em. +menu = 5 # Width grade for the font's names. +css = "normal" # "font-stretch' property of webfont CSS. + +# [buildPlans.iosevka-comfy.widths.expanded] +# shape = 600 +# menu = 7 +# css = "expanded" + +# End width section +################################################################################################### + +################################################################################################### +# Metric overrides +# Certain metrics like line height (leading) could be overridden in your build plan file. +# Edit the values to change the metrics. Remove this section when overriding is not needed. + +[buildPlans.iosevka-comfy.metric-override] +leading = 1100 + +# End metric override section +################################################################################################### + + +# Iosevka Comfy variants +# ====================== +# Same glyph overrides and metrics, except for the spacing. + + +# Fixed spacing (no ligatures) +# ---------------------------- +[buildPlans.iosevka-comfy-fixed] +family = "Iosevka Comfy Fixed" +spacing = "fixed" +serifs = "sans" + +# It seems we can inherit variants, but not weights, slopes, widths, +# metric-override... +[buildPlans.iosevka-comfy-fixed.variants] +inherits = "buildPlans.iosevka-comfy" + +[buildPlans.iosevka-comfy-fixed.weights.light] +shape = 300 +menu = 300 +css = 300 + +[buildPlans.iosevka-comfy-fixed.weights.semilight] +shape = 350 +menu = 350 +css = 350 + +[buildPlans.iosevka-comfy-fixed.weights.regular] +shape = 400 +menu = 400 +css = 400 + +[buildPlans.iosevka-comfy-fixed.weights.bold] +shape = 700 +menu = 700 +css = 700 + +[buildPlans.iosevka-comfy-fixed.weights.extrabold] +shape = 800 +menu = 800 +css = 800 + +[buildPlans.iosevka-comfy-fixed.slopes.upright] +angle = 0 +shape = "upright" +menu = "upright" +css = "normal" + +[buildPlans.iosevka-comfy-fixed.slopes.italic] +angle = 9.4 +shape = "italic" +menu = "italic" +css = "italic" + +[buildPlans.iosevka-comfy-fixed.widths.normal] +shape = 525 +menu = 5 +css = "normal" + +[buildPlans.iosevka-comfy-fixed.metric-override] +leading = 1100 + + + +# Duo spacing (quasi-proportional) +# -------------------------------- +[buildPlans.iosevka-comfy-duo] +family = "Iosevka Comfy Duo" +spacing = "quasi-proportional" +serifs = "sans" + +# It seems we can inherit variants, but not weights, slopes, widths, +# metric-override... +[buildPlans.iosevka-comfy-duo.variants] +inherits = "buildPlans.iosevka-comfy" + +# The short middle leg in 'm' that we need in the narrow monospaced +# variants is necessary for legibility, especially at small point sizes. +# Otherwise it is a gimmick, so we remove it in the "wider" builds. +[buildPlans.iosevka-comfy-duo.variants.upright] +cv38 = 5 # m earless normal middle leg + +[buildPlans.iosevka-comfy-duo.variants.italic] +cv38 = 1 # m straight normal middle leg + +[buildPlans.iosevka-comfy-duo.weights.light] +shape = 300 +menu = 300 +css = 300 + +[buildPlans.iosevka-comfy-duo.weights.semilight] +shape = 350 +menu = 350 +css = 350 + +[buildPlans.iosevka-comfy-duo.weights.regular] +shape = 400 +menu = 400 +css = 400 + +[buildPlans.iosevka-comfy-duo.weights.bold] +shape = 700 +menu = 700 +css = 700 + +[buildPlans.iosevka-comfy-duo.weights.extrabold] +shape = 800 +menu = 800 +css = 800 + +[buildPlans.iosevka-comfy-duo.slopes.upright] +angle = 0 +shape = "upright" +menu = "upright" +css = "normal" + +[buildPlans.iosevka-comfy-duo.slopes.italic] +angle = 9.4 +shape = "italic" +menu = "italic" +css = "italic" + +[buildPlans.iosevka-comfy-duo.widths.normal] +shape = 525 +menu = 5 +css = "normal" + +[buildPlans.iosevka-comfy-duo.metric-override] +leading = 1100 + + + +# Like iosevka-comfy but expanded +# ------------------------------- +[buildPlans.iosevka-comfy-wide] +family = "Iosevka Comfy Wide" +spacing = "normal" +serifs = "sans" + +# It seems we can inherit variants, but not weights, slopes, widths, +# metric-override... +[buildPlans.iosevka-comfy-wide.variants] +inherits = "buildPlans.iosevka-comfy" + +# The short middle leg in 'm' that we need in the narrow monospaced +# variants is necessary for legibility, especially at small point sizes. +# Otherwise it is a gimmick, so we remove it in the "wider" builds. +[buildPlans.iosevka-comfy-wide.variants.upright] +cv38 = 5 # m earless normal middle leg + +[buildPlans.iosevka-comfy-wide.variants.italic] +cv38 = 1 # m straight normal middle leg + +[buildPlans.iosevka-comfy-wide.weights.light] +shape = 300 +menu = 300 +css = 300 + +[buildPlans.iosevka-comfy-wide.weights.semilight] +shape = 350 +menu = 350 +css = 350 + +[buildPlans.iosevka-comfy-wide.weights.regular] +shape = 400 +menu = 400 +css = 400 + +[buildPlans.iosevka-comfy-wide.weights.bold] +shape = 700 +menu = 700 +css = 700 + +[buildPlans.iosevka-comfy-wide.weights.extrabold] +shape = 800 +menu = 800 +css = 800 + +[buildPlans.iosevka-comfy-wide.slopes.upright] +angle = 0 +shape = "upright" +menu = "upright" +css = "normal" + +[buildPlans.iosevka-comfy-wide.slopes.italic] +angle = 9.4 +shape = "italic" +menu = "italic" +css = "italic" + +# For the default width, check buildPlans.iosevka-comfy.widths.normal +[buildPlans.iosevka-comfy-wide.widths.normal] +shape = 625 +menu = 7 +css = "normal" + +[buildPlans.iosevka-comfy-wide.metric-override] +leading = 1100 + + + +# Like iosevka-comfy-wide but fixed monospace (no ligatures) +# ---------------------------------------------------------- +[buildPlans.iosevka-comfy-wide-fixed] +family = "Iosevka Comfy Wide Fixed" +spacing = "fixed" +serifs = "sans" + +# It seems we can inherit variants, but not weights, slopes, widths, +# metric-override... +[buildPlans.iosevka-comfy-wide-fixed.variants] +inherits = "buildPlans.iosevka-comfy-wide" + +[buildPlans.iosevka-comfy-wide-fixed.weights.light] +shape = 300 +menu = 300 +css = 300 + +[buildPlans.iosevka-comfy-wide-fixed.weights.semilight] +shape = 350 +menu = 350 +css = 350 + +[buildPlans.iosevka-comfy-wide-fixed.weights.regular] +shape = 400 +menu = 400 +css = 400 + +[buildPlans.iosevka-comfy-wide-fixed.weights.bold] +shape = 700 +menu = 700 +css = 700 + +[buildPlans.iosevka-comfy-wide-fixed.weights.extrabold] +shape = 800 +menu = 800 +css = 800 + +[buildPlans.iosevka-comfy-wide-fixed.slopes.upright] +angle = 0 +shape = "upright" +menu = "upright" +css = "normal" + +[buildPlans.iosevka-comfy-wide-fixed.slopes.italic] +angle = 9.4 +shape = "italic" +menu = "italic" +css = "italic" + +# For the default width, check buildPlans.iosevka-comfy.widths.normal +[buildPlans.iosevka-comfy-wide-fixed.widths.normal] +shape = 625 +menu = 7 +css = "normal" + +[buildPlans.iosevka-comfy-wide-fixed.metric-override] +leading = 1100 diff --git a/pkgs/data/fonts/iosevka/comfy.nix b/pkgs/data/fonts/iosevka/comfy.nix new file mode 100644 index 00000000000..9cc2ecfb636 --- /dev/null +++ b/pkgs/data/fonts/iosevka/comfy.nix @@ -0,0 +1,24 @@ +{stdenv, lib, nodejs, nodePackages, remarshal, ttfautohint-nox, fetchurl}: + +let + sets = [ "comfy" "comfy-duo" "comfy-wide" "comfy-wide-fixed"]; + privateBuildPlan = builtins.readFile ./comfy-private-build-plans.toml; + overrideAttrs = (attrs: { + version = "0.1.0"; + meta = with lib; { + homepage = "https://github.com/protesilaos/iosevka-comfy"; + description = '' + Custom build of Iosevka with a rounded style and open shapes, + adjusted metrics, and overrides for almost all individual glyphs + in both roman (upright) and italic (slanted) variants. + ''; + license = licenses.ofl; + platforms = attrs.meta.platforms; + maintainers = [ maintainers.DamienCassou ]; + }; + }); + makeIosevkaFont = set: (import ./default.nix { + inherit stdenv lib nodejs nodePackages remarshal ttfautohint-nox set privateBuildPlan; + }).overrideAttrs overrideAttrs; +in +builtins.listToAttrs (builtins.map (set: {name=set; value=makeIosevkaFont set;}) sets) diff --git a/pkgs/data/fonts/iosevka/default.nix b/pkgs/data/fonts/iosevka/default.nix index c145aad8d7d..3fd04906ff4 100644 --- a/pkgs/data/fonts/iosevka/default.nix +++ b/pkgs/data/fonts/iosevka/default.nix @@ -101,7 +101,7 @@ stdenv.mkDerivation rec { buildPhase = '' export HOME=$TMPDIR runHook preBuild - npm run build --no-update-notifier -- --jCmd=$NIX_BUILD_CORES ttf::$pname >/dev/null + npm run build --no-update-notifier -- --jCmd=$NIX_BUILD_CORES ttf::$pname runHook postBuild ''; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index ec10fb1b9ab..c79af200a9c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -24698,6 +24698,7 @@ with pkgs; iosevka = callPackage ../data/fonts/iosevka {}; iosevka-bin = callPackage ../data/fonts/iosevka/bin.nix {}; + iosevka-comfy = recurseIntoAttrs (callPackages ../data/fonts/iosevka/comfy.nix {}); ipafont = callPackage ../data/fonts/ipafont {}; ipaexfont = callPackage ../data/fonts/ipaexfont {};