Extracted other features and classes into separate files, fixed few ligatures conflicts with arrows

This commit is contained in:
Nikita Prokopov 2020-05-13 22:52:31 +02:00
parent 3843439a55
commit ace859529f
30 changed files with 211 additions and 30 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
bracketright braceright parenright

13
classes/Digit.fea Normal file
View File

@ -0,0 +1,13 @@
zero
zero.zero
one
two
twoTurned
threeTurned
three
four
five
six
seven
eight
nine

12
classes/DigitTosf.fea Normal file
View File

@ -0,0 +1,12 @@
zero.tosf
zero.tosf.zero
zero.zero.tosf
one.tosf
two.tosf
three.tosf
four.tosf
five.tosf
six.tosf
seven.tosf
eight.tosf
nine.tosf

1
classes/HexDigit.fea Normal file
View File

@ -0,0 +1 @@
a b c d e f A B C D E F

View File

@ -0,0 +1 @@
bracketleft braceleft parenleft

1
classes/Tall.fea Normal file
View File

@ -0,0 +1 @@
@Uppercase zero one two twoTurned threeTurned three four five six seven eight nine @OpeningBracket @ClosingBracket bar

View File

@ -65,12 +65,14 @@
["colon" "greater"]
" ignore sub colon' greater equal;\n"
;; #346 <=< <=> <=|
["less" "equal"]
" ignore sub less' equal [less greater bar];\n"
;; #548 >=<
;; #346 >=> >=< >=|
["greater" "equal"]
" ignore sub greater' equal less;\n"
["equal" "less"]
" ignore sub greater equal' less;\n"
" ignore sub greater' equal [less greater bar];\n"
;; #593 {|}
["braceleft" "bar"]
@ -95,8 +97,7 @@
;; #410 <*>>> <+>>> <$>>>
;; #346 >>>->>> >>>=>>>
["greater" "greater" "greater"]
(str " ignore sub [asterisk plus dollar hyphen equal] greater' greater greater;\n"
" ignore sub greater' greater greater [hyphen equal];\n")
" ignore sub [asterisk plus dollar] greater' greater greater;\n"
;; #410 <<*> <<+> <<$>
;; #346 <<-<< <<=<<
@ -105,10 +106,8 @@
" ignore sub less' less [asterisk plus dollar hyphen equal];\n")
;; #410 <<<*> <<<+> <<<$>
;; #346 <<<-<<< <<<=<<<
["less" "less" "less"]
(str " ignore sub [hyphen equal] less' less less;\n"
" ignore sub less' less less [asterisk plus dollar hyphen equal];\n")
" ignore sub less' less less [asterisk plus dollar];\n"
;; #968 [==> [=>
;; #346 <==> <===> |==| |===|
@ -122,7 +121,6 @@
;; #968 [-> [-->
;; #346 <--> <---> |--| |---|
["hyphen" "hyphen"]
(str " ignore sub [bracketleft less greater bar] hyphen' hyphen;\n"
" ignore sub hyphen' hyphen [bracketright less greater bar];\n")
@ -144,8 +142,6 @@
["less" "asterisk" "greater"]
["less" "plus" "greater"]
["less" "dollar" "greater"]
;; #795
["f" "l"] ["F" "l"] ["T" "l"]
})
@ -245,6 +241,15 @@
glyphs (map #(str (str/join "_" %) ".liga") ligas')
counts (coll/group-by-to count count ligas')]
(when-some [unused (not-empty (reduce dissoc ignores ligas'))]
(println " WARN Unused ignores" (str/join " " (keys unused))))
(when-some [unused (not-empty (reduce disj skip-ignores? ligas'))]
(println " WARN Unused skip-ignores?" (str/join " " unused)))
(when-some [unused (not-empty (reduce disj manual? ligas))]
(println " WARN Unused manual?" (str/join " " unused)))
(println " generated calt:"
; (str/join " " glyphs)
(str

View File

@ -0,0 +1,18 @@
(ns fira-code.classes
(:require
[clojure.java.io :as io]
[clojure.string :as str]
[fira-code.glyphs :as glyphs]
[fira-code.files :as files]))
(defn fill-class [font file]
(let [[_ name] (re-matches #"([^.]+)\.fea" (.getName file))
code (slurp file)
class {:code (str/trim code)
:name name}]
(glyphs/set-class font name class)))
(defn fill-all [font]
(reduce fill-class font (files/find "classes" #"classes/[^/]+\.fea")))

View File

@ -3,8 +3,9 @@
(defn index-of [pred xs]
(let [res (reduce (fn [i x] (if (pred x) (reduced i) (inc i))) 0 xs)]
(assert (< res (count xs)) "Nothing found")
res))
(if (>= res (count xs))
-1
res)))
(defn group-by-to [key-fn value-fn xs]

View File

@ -2,15 +2,38 @@
(:require
[clojure.java.io :as io]
[clojure.string :as str]
[fira-code.glyphs :as glyphs]))
[fira-code.glyphs :as glyphs]
[fira-code.files :as files]))
(defn append-features [font]
(let [features (->> (file-seq (io/file "features"))
(filter #(str/ends-with? (.getName %) ".fea"))
(sort-by #(.getName %))
(defn append-calt [font]
(let [features (->> (files/find "features/calt" #"features/calt/[^/]+\.fea")
(map slurp)
(map str/trim)
(str/join "\n\n"))]
(println " appending to feature calt" (glyphs/lines features) "lines")
(glyphs/update-code font :features "calt"
#(str % "\n\n" features))))
#(str % "\n\n" features))))
(defn fill-feature [font file]
(let [[_ name] (re-matches #"([^.]+)\.fea" (.getName file))
code (slurp file)
[_ notes code'] (re-matches #"(?s)#([^\n]+)\n(.*)" code)
feature (if notes
{:code (str/trim code')
:name name
:notes (str/trim notes)}
{:code (str/trim code)
:name name})]
(glyphs/set-feature font name feature)))
(defn fill-features [font]
(reduce fill-feature font (files/find "features" #"features/[^/]+\.fea")))
(defn fill-all [font]
(-> font
(append-calt)
(fill-features)))

View File

@ -0,0 +1,12 @@
(ns fira-code.files
(:refer-clojure :exclude [find])
(:require
[clojure.java.io :as io]
[clojure.string :as str]))
(defn find [path re]
(->> (file-seq (io/file path))
(next) ;; skip directory itself
(filter #(re-matches re (.getPath %)))
(sort-by #(.getPath %))))

View File

@ -154,9 +154,40 @@
(defn update-code [font key name f & args]
(let [idx (coll/index-of #(= (:name %) name) (get font key))]
(assert (>= idx 0) (str "Cant find " key "[name=\"" name "\"], got " (str/join ", " (map :name (get font key)))))
(apply update-in font [key idx :code] f args)))
(defn lines [s]
(inc (count (re-seq #"\n" s))))
(defn words [s]
(count (re-seq #"[^\s]+" s)))
(defn set-feature [font name feature]
(let [idx (coll/index-of #(= (:name %) name) (:features font))]
(if (pos? idx)
(do
(println " replacing feature" name "with" (lines (:code feature)) "lines")
(assoc-in font [:features idx] feature))
(do
(println " appending to feature" name (lines (:code feature)) "lines")
(update font :features conj feature)))))
(defn set-class [font name class]
(let [idx (coll/index-of #(= (:name %) name) (:classes font))]
(if (pos? idx)
(do
(println " replacing class" name "with" (words (:code class)) "entries")
(assoc-in font [:classes idx] class))
(do
(println " appending to class" name (words (:code class)) "entries")
(update font :classes conj class)))))
(def weights
{:Light "B67F0F2D-EC95-4CB8-966E-23AE86958A69"
:Regular "UUID0"

View File

@ -4,6 +4,7 @@
[fira-code.calt :as calt]
[fira-code.coll :as coll]
[fira-code.checks :as checks]
[fira-code.classes :as classes]
[fira-code.features :as features]
[fira-code.glyphs :as glyphs]
[fira-code.not-space :as not-space]
@ -23,7 +24,8 @@
(str/split liga #"_")) ;; [ ["dash" "greater" "greater"] ... ]
font' (-> font
(calt/replace-calt ligas)
(features/append-features)
(classes/fill-all)
(features/fill-all)
(spacers/add-spacers ligas)
(not-space/regen-not-space)
(checks/widths))]

12
features/onum.fea Normal file
View File

@ -0,0 +1,12 @@
sub zero by zero.tosf;
sub zero.zero by zero.zero.tosf;
sub one by one.tosf;
sub two by two.tosf;
sub three by three.tosf;
sub four by four.tosf;
sub five by five.tosf;
sub six by six.tosf;
sub seven by seven.tosf;
sub eight by eight.tosf;
sub nine by nine.tosf;
sub x.multiply by x.multiply.tosf;

3
features/ss01.fea Normal file
View File

@ -0,0 +1,3 @@
# Name: Sans serif lowercase r
sub r by r.ss01;

4
features/ss02.fea Normal file
View File

@ -0,0 +1,4 @@
# Name: Less Than/Greater Than with horizontal bar
sub greater_equal.liga by greater_equal.ss02;
sub less_equal.liga by less_equal.ss02;

8
features/ss03.fea Normal file
View File

@ -0,0 +1,8 @@
# Name: Traditional Ampersand
sub ampersand by ampersand.ss03;
sub ampersand_ampersand.liga by ampersand.ss03;
sub ampersand.spacer' ampersand.ss03 by ampersand.before.ss03;
sub [ampersand ampersand.ss03]' [ampersand ampersand.ss03] by ampersand.before.ss03;

7
features/ss04.fea Normal file
View File

@ -0,0 +1,7 @@
# Name: Lightweight Dollar Sign
sub dollar by dollar.ss04;
sub dollar_greater.liga by dollar_greater.liga.ss04;
sub less_dollar_greater.liga by less_dollar_greater.liga.ss04;
sub less_dollar.liga by less_dollar.liga.ss04;

5
features/ss05.fea Normal file
View File

@ -0,0 +1,5 @@
# Name: Traditional At sign
sub at by at.ss05;
sub asciitilde.spacer' asciitilde_at.liga by asciitilde;
sub asciitilde asciitilde_at.liga' by at.ss05;

7
features/ss06.fea Normal file
View File

@ -0,0 +1,7 @@
# Name: Thin backslash
sub backslash' by backslash.ss06;
lookup backslash_thin {
sub backslash.ss06 backslash.ss06' by backslash.thick.ss06;
} backslash_thin;

15
features/ss07.fea Normal file
View File

@ -0,0 +1,15 @@
# Name: Regex matching operator
lookup equal_asciitilde {
ignore sub equal equal' asciitilde;
ignore sub equal' asciitilde asciitilde;
sub equal.spacer asciitilde' by equal_asciitilde.ss07;
sub equal' asciitilde by equal.spacer;
} equal_asciitilde;
lookup exclam_asciitilde {
ignore sub exclam exclam' asciitilde;
ignore sub exclam' asciitilde asciitilde;
sub exclam.spacer asciitilde' by exclam_asciitilde.ss07;
sub exclam' asciitilde by exclam.spacer;
} exclam_asciitilde;

View File

@ -114,5 +114,5 @@ r 0 123456789 & && $ <$ <$> $> @ <= >=
||=== ||==< ||=<< ||==> ||=>> ||==| ||=|| =||=
|==<==<<==>>==>==|==||==|
.= ..= := ::= != !== ?= #= /= /==
=:= =!= = == === =/= >= <= ^=
>=< :>= <||>
=:= =!= = == === =/= >= <= ^= <=< >=>
>=< =< :>= <||> <<<-<<< <<<=<<< >>>->>> >>>=>>>