mirror of
https://github.com/i-tu/Hasklig.git
synced 2024-09-17 13:37:21 +03:00
Add contextual alternate generation from Fira Code
This commit is contained in:
parent
d0341bfddb
commit
6dd60e6c22
150
gen_calt.clj
Normal file
150
gen_calt.clj
Normal file
@ -0,0 +1,150 @@
|
||||
(comment "
|
||||
Modified 2016 under the terms of SIL for use in Hasklig.
|
||||
Ian Tuomi
|
||||
|
||||
Copyright (c) 2014, Nikita Prokopov http://tonsky.me
|
||||
with Reserved Font Name Fira Code.
|
||||
|
||||
Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
|
||||
with Reserved Font Name Fira Sans.
|
||||
|
||||
Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
|
||||
with Reserved Font Name Fira Mono.
|
||||
|
||||
Copyright (c) 2014, Telefonica S.A.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
")
|
||||
|
||||
|
||||
#^:shebang '[
|
||||
exec java -cp "$HOME/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar" clojure.main "$0" "$@"]
|
||||
|
||||
|
||||
(require '[clojure.string :as str])
|
||||
|
||||
(def ligas
|
||||
[ ["asterisk" "asterisk" "asterisk"]
|
||||
;["bar" "bar" "bar"]
|
||||
["equal" "equal" "equal"]
|
||||
["equal" "equal" "greater"]
|
||||
["equal" "less" "less"]
|
||||
["greater" "greater" "equal"]
|
||||
["greater" "greater" "greater"]
|
||||
["greater" "greater" "hyphen"]
|
||||
["hyphen" "less" "less"]
|
||||
["less" "asterisk" "greater"]
|
||||
["less" "bar" "greater"]
|
||||
["less" "dollar" "greater"]
|
||||
["less" "plus" "greater"]
|
||||
["less" "less" "less"]
|
||||
["period" "period" "period"]
|
||||
["plus" "plus" "plus"]
|
||||
["asterisk" "greater"]
|
||||
["backslash" "backslash"]
|
||||
["bar" "bar"]
|
||||
["bar" "greater"]
|
||||
["colon" "colon"]
|
||||
["equal" "equal"]
|
||||
["equal" "greater"]
|
||||
["exclam" "exclam"]
|
||||
["greater" "greater"]
|
||||
["greater" "hyphen"]
|
||||
["hyphen" "greater"]
|
||||
["hyphen" "less"]
|
||||
["less" "asterisk"]
|
||||
["less" "greater"]
|
||||
["less" "bar"]
|
||||
["less" "hyphen"]
|
||||
["less" "less"]
|
||||
["period" "period"]
|
||||
["plus" "plus"]
|
||||
["slash" "equal"]])
|
||||
|
||||
(defn liga->rules
|
||||
"[f f i] => { [CR CR i] f_f_i
|
||||
[CR f i] CR
|
||||
[ f f i] CR }"
|
||||
[liga CR]
|
||||
(case (count liga)
|
||||
2 (let [[a b] liga]
|
||||
{ [CR b] (str a "_" b)
|
||||
[ a b] CR})
|
||||
3 (let [[a b c] liga]
|
||||
{ [CR CR c] (str a "_" b "_" c)
|
||||
[CR b c] CR
|
||||
[ a b c] CR})
|
||||
4 (let [[a b c d] liga]
|
||||
{ [CR CR CR d] (str a "_" b "_" c "_" d)
|
||||
[CR CR c d] CR
|
||||
[CR b c d] CR
|
||||
[ a b c d] CR})))
|
||||
|
||||
|
||||
(defn any? [p & colls]
|
||||
(if colls
|
||||
(let [[coll & cs] colls]
|
||||
(some #(apply any? (partial p %) cs) coll))
|
||||
(p)))
|
||||
|
||||
|
||||
(defn conflicts? [r1 r2]
|
||||
(when (.startsWith (first r2) "CR.") ;; we accept that higher-len ligatures can override lower-length
|
||||
;; but once replacement has started (first glyph in rule is CR.*)
|
||||
;; there should be no possibility for conflits
|
||||
(let [l1 (count r1)
|
||||
l2 (count r2)
|
||||
prefix1 (subvec r1 0 l2)]
|
||||
(= r2 prefix1))))
|
||||
|
||||
|
||||
(def all-rules
|
||||
(reduce
|
||||
(fn [generated liga]
|
||||
(merge generated
|
||||
;; looking for smallest i that does not conflict
|
||||
;; with any of previous rules
|
||||
(some (fn [i]
|
||||
(let [CR (str "CR." (String/format "%02d" (to-array [i])))
|
||||
rs (liga->rules liga CR)]
|
||||
(when-not (any? conflicts? (keys generated) (keys rs))
|
||||
rs)))
|
||||
(range))))
|
||||
{}
|
||||
(->> ligas (sort-by count) reverse)))
|
||||
|
||||
|
||||
(defn priority-fn [[from to]]
|
||||
[;; first compare how many CRs are there (more is better)
|
||||
(- (count (filter #(re-matches #"CR\.\d+" %) from)))
|
||||
;; then overal length (more is better)
|
||||
(- (count from))
|
||||
;; then alphabetical sort with coercing each vector to the same length
|
||||
(into from (repeat (- 4 (count from)) "z"))])
|
||||
|
||||
|
||||
(def table (->> all-rules
|
||||
(sort-by priority-fn)))
|
||||
|
||||
|
||||
(defn rule->str [[from to]]
|
||||
(loop [res "sub"
|
||||
seen-non-empty? false
|
||||
tokens from]
|
||||
(if-let [token (first tokens)]
|
||||
(let [class? (.startsWith token "@")
|
||||
CR? (.startsWith token "CR.")
|
||||
escaped-token (cond
|
||||
class? token
|
||||
CR? (str "\\" token)
|
||||
seen-non-empty? (str "\\" token)
|
||||
:else (str "\\" token "'"))]
|
||||
(recur (str res " " escaped-token) (not CR?) (next tokens)))
|
||||
(str res " by \\" to ";"))))
|
||||
|
||||
|
||||
(println "feature calt {")
|
||||
(println " " (->> table (map rule->str) (str/join "\n ")))
|
||||
(println "} calt;\n")
|
132
ligatures.fea
132
ligatures.fea
@ -1,47 +1,89 @@
|
||||
feature calt {
|
||||
sub \CR.00 \CR.00 \asterisk' by \asterisk_asterisk_asterisk;
|
||||
sub \CR.00 \CR.00 \equal' by \greater_greater_equal;
|
||||
sub \CR.00 \CR.00 \greater' by \less_plus_greater;
|
||||
sub \CR.00 \CR.00 \hyphen' by \greater_greater_hyphen;
|
||||
sub \CR.00 \CR.00 \less' by \less_less_less;
|
||||
sub \CR.00 \CR.00 \period' by \period_period_period;
|
||||
sub \CR.00 \CR.00 \plus' by \plus_plus_plus;
|
||||
sub \CR.01 \CR.01 \equal' by \equal_equal_equal;
|
||||
sub \CR.01 \CR.01 \greater' by \less_dollar_greater;
|
||||
sub \CR.01 \CR.01 \less' by \hyphen_less_less;
|
||||
sub \CR.02 \CR.02 \greater' by \less_bar_greater;
|
||||
sub \CR.02 \CR.02 \less' by \equal_less_less;
|
||||
sub \CR.03 \CR.03 \greater' by \less_asterisk_greater;
|
||||
sub \CR.04 \CR.04 \greater' by \greater_greater_greater;
|
||||
sub \CR.05 \CR.05 \greater' by \equal_equal_greater;
|
||||
sub \CR.00 \asterisk' \asterisk by \CR.00;
|
||||
sub \CR.00 \greater' \equal by \CR.00;
|
||||
sub \CR.00 \greater' \hyphen by \CR.00;
|
||||
sub \CR.00 \less' \less by \CR.00;
|
||||
sub \CR.00 \period' \period by \CR.00;
|
||||
sub \CR.00 \plus' \greater by \CR.00;
|
||||
sub \CR.00 \plus' \plus by \CR.00;
|
||||
sub \CR.01 \dollar' \greater by \CR.01;
|
||||
sub \CR.01 \equal' \equal by \CR.01;
|
||||
sub \CR.01 \less' \less by \CR.01;
|
||||
sub \CR.02 \bar' \greater by \CR.02;
|
||||
sub \CR.02 \less' \less by \CR.02;
|
||||
sub \CR.03 \asterisk' \greater by \CR.03;
|
||||
sub \CR.04 \greater' \greater by \CR.04;
|
||||
sub \CR.05 \equal' \greater by \CR.05;
|
||||
sub \CR.00 \backslash' by \backslash_backslash;
|
||||
sub \CR.00 \bar' by \less_bar;
|
||||
sub \CR.00 \colon' by \colon_colon;
|
||||
sub \CR.00 \equal' by \slash_equal;
|
||||
sub \CR.00 \exclam' by \exclam_exclam;
|
||||
sub \CR.00 \hyphen' by \less_hyphen;
|
||||
sub \CR.01 \asterisk' by \less_asterisk;
|
||||
sub \CR.01 \bar' by \bar_bar;
|
||||
sub \CR.01 \greater' by \less_greater;
|
||||
sub \CR.01 \hyphen' by \greater_hyphen;
|
||||
sub \CR.01 \period' by \period_period;
|
||||
sub \CR.01 \plus' by \plus_plus;
|
||||
sub \CR.02 \equal' by \equal_equal;
|
||||
sub \CR.02 \greater' by \hyphen_greater;
|
||||
sub \CR.03 \greater' by \greater_greater;
|
||||
sub \CR.03 \less' by \less_less;
|
||||
sub \CR.04 \less' by \hyphen_less;
|
||||
sub \CR.05 \greater' by \equal_greater;
|
||||
sub \CR.06 \greater' by \bar_greater;
|
||||
sub \CR.07 \greater' by \asterisk_greater;
|
||||
sub \asterisk' \asterisk \asterisk by \CR.00;
|
||||
sub \equal' \equal \equal by \CR.01;
|
||||
sub \equal' \equal \greater by \CR.05;
|
||||
sub \equal' \less \less by \CR.02;
|
||||
sub \greater' \greater \equal by \CR.00;
|
||||
sub \greater' \greater \greater by \CR.04;
|
||||
sub \greater' \greater \hyphen by \CR.00;
|
||||
sub \hyphen' \less \less by \CR.01;
|
||||
sub \less' \asterisk \greater by \CR.03;
|
||||
sub \less' \bar \greater by \CR.02;
|
||||
sub \less' \dollar \greater by \CR.01;
|
||||
sub \less' \less \less by \CR.00;
|
||||
sub \less' \plus \greater by \CR.00;
|
||||
sub \period' \period \period by \CR.00;
|
||||
sub \plus' \plus \plus by \CR.00;
|
||||
sub \asterisk' \greater by \CR.07;
|
||||
sub \backslash' \backslash by \CR.00;
|
||||
sub \bar' \bar by \CR.01;
|
||||
sub \bar' \greater by \CR.06;
|
||||
sub \colon' \colon by \CR.00;
|
||||
sub \equal' \equal by \CR.02;
|
||||
sub \equal' \greater by \CR.05;
|
||||
sub \exclam' \exclam by \CR.00;
|
||||
sub \greater' \greater by \CR.03;
|
||||
sub \greater' \hyphen by \CR.01;
|
||||
sub \hyphen' \greater by \CR.02;
|
||||
sub \hyphen' \less by \CR.04;
|
||||
sub \less' \asterisk by \CR.01;
|
||||
sub \less' \bar by \CR.00;
|
||||
sub \less' \greater by \CR.01;
|
||||
sub \less' \hyphen by \CR.00;
|
||||
sub \less' \less by \CR.03;
|
||||
sub \period' \period by \CR.01;
|
||||
sub \plus' \plus by \CR.01;
|
||||
sub \slash' \equal by \CR.00;
|
||||
} calt;
|
||||
|
||||
#------------------------------
|
||||
feature liga {
|
||||
# 3-character ligs first to avoid substitution clash
|
||||
sub asterisk asterisk asterisk by asterisk_asterisk_asterisk;# ***
|
||||
# sub bar bar bar by bar_bar_bar; # |||
|
||||
sub equal equal equal by equal_equal_equal; # ===
|
||||
sub equal equal greater by equal_equal_greater; # ==>
|
||||
sub equal less less by equal_less_less; # =<<
|
||||
sub greater greater equal by greater_greater_equal; # >>=
|
||||
sub greater greater greater by greater_greater_greater; # >>>
|
||||
sub greater greater hyphen by greater_greater_hyphen; # >>-
|
||||
sub hyphen less less by hyphen_less_less; # -<<
|
||||
sub less asterisk greater by less_asterisk_greater; # <*>
|
||||
sub less bar greater by less_bar_greater; # <|>
|
||||
sub less dollar greater by less_dollar_greater; # <$>
|
||||
sub less plus greater by less_plus_greater; # <+>
|
||||
sub less less less by less_less_less; # <<<
|
||||
sub period period period by period_period_period; # ...
|
||||
sub plus plus plus by plus_plus_plus; # +++
|
||||
|
||||
# 2-character ligs
|
||||
# sub ampersand ampersand by ampersand_ampersand; # &&
|
||||
sub asterisk greater by asterisk_greater; # *>
|
||||
sub backslash backslash by backslash_backslash; # \\
|
||||
sub bar bar by bar_bar; # ||
|
||||
sub bar greater by bar_greater; # |>
|
||||
sub colon colon by colon_colon; # ::
|
||||
sub equal equal by equal_equal; # ==
|
||||
sub equal greater by equal_greater; # =>
|
||||
sub exclam exclam by exclam_exclam; # !!
|
||||
# sub greater equal by greater_equal; # >=
|
||||
sub greater greater by greater_greater; # >>
|
||||
sub greater hyphen by greater_hyphen; # >-
|
||||
sub hyphen greater by hyphen_greater; # ->
|
||||
sub hyphen less by hyphen_less; # -<
|
||||
sub less asterisk by less_asterisk; # <*
|
||||
# sub less dollar by less_dollar; # <$
|
||||
# sub less equal by less_equal; # <=
|
||||
sub less greater by less_greater; # <>
|
||||
sub less bar by less_bar; # <|
|
||||
sub less hyphen by less_hyphen; # <-
|
||||
sub less less by less_less; # <<
|
||||
sub period period by period_period; # ..
|
||||
sub plus plus by plus_plus; # ++
|
||||
sub slash equal by slash_equal; # /=
|
||||
} liga;
|
||||
|
Loading…
Reference in New Issue
Block a user