1
1
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:
Ian Tuomi 2016-01-24 23:53:02 +02:00
parent d0341bfddb
commit 6dd60e6c22
2 changed files with 237 additions and 45 deletions

150
gen_calt.clj Normal file
View 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")

View File

@ -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;