Vendor dependencies for 0.3.0 release

This commit is contained in:
2025-09-27 10:29:08 -05:00
parent 0c8d39d483
commit 82ab7f317b
26803 changed files with 16134934 additions and 0 deletions

File diff suppressed because one or more lines are too long

798
vendor/fontconfig-parser/Cargo.lock generated vendored Normal file
View File

@@ -0,0 +1,798 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "anes"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
[[package]]
name = "anstyle"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
[[package]]
name = "anyhow"
version = "1.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "autocfg"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bumpalo"
version = "3.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
[[package]]
name = "cast"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "ciborium"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
dependencies = [
"ciborium-io",
"ciborium-ll",
"serde",
]
[[package]]
name = "ciborium-io"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
[[package]]
name = "ciborium-ll"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
dependencies = [
"ciborium-io",
"half",
]
[[package]]
name = "clap"
version = "4.5.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
version = "4.5.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120"
dependencies = [
"anstyle",
"clap_lex",
]
[[package]]
name = "clap_lex"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
[[package]]
name = "colored"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [
"lazy_static",
"windows-sys 0.59.0",
]
[[package]]
name = "criterion"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
dependencies = [
"anes",
"cast",
"ciborium",
"clap",
"criterion-plot",
"is-terminal",
"itertools",
"num-traits",
"once_cell",
"oorandom",
"plotters",
"rayon",
"regex",
"serde",
"serde_derive",
"serde_json",
"tinytemplate",
"walkdir",
]
[[package]]
name = "criterion-plot"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
dependencies = [
"cast",
"itertools",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929"
[[package]]
name = "diff"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
[[package]]
name = "either"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "errno"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
dependencies = [
"libc",
"windows-sys 0.59.0",
]
[[package]]
name = "fontconfig-parser"
version = "0.5.8"
dependencies = [
"criterion",
"glob",
"k9",
"log",
"roxmltree",
"serde",
"serde_json",
]
[[package]]
name = "glob"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "half"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
dependencies = [
"cfg-if",
"crunchy",
]
[[package]]
name = "hermit-abi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
[[package]]
name = "hermit-abi"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08"
[[package]]
name = "io-lifetimes"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
"hermit-abi 0.3.9",
"libc",
"windows-sys 0.48.0",
]
[[package]]
name = "is-terminal"
version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [
"hermit-abi 0.5.1",
"libc",
"windows-sys 0.59.0",
]
[[package]]
name = "itertools"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "js-sys"
version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]]
name = "k9"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "088bcebb5b68b1b14b64d7f05b0f802719250b97fdc0338ec42529ea777ed614"
dependencies = [
"anyhow",
"colored",
"diff",
"lazy_static",
"libc",
"proc-macro2",
"regex",
"syn",
"terminal_size",
]
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.172"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
[[package]]
name = "linux-raw-sys"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "log"
version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "oorandom"
version = "11.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
[[package]]
name = "plotters"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
dependencies = [
"num-traits",
"plotters-backend",
"plotters-svg",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "plotters-backend"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
[[package]]
name = "plotters-svg"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
dependencies = [
"plotters-backend",
]
[[package]]
name = "proc-macro2"
version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rayon"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "roxmltree"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
[[package]]
name = "rustix"
version = "0.37.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
"windows-sys 0.48.0",
]
[[package]]
name = "rustversion"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
[[package]]
name = "ryu"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
dependencies = [
"winapi-util",
]
[[package]]
name = "serde"
version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
]
[[package]]
name = "syn"
version = "2.0.101"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "terminal_size"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237"
dependencies = [
"rustix",
"windows-sys 0.48.0",
]
[[package]]
name = "tinytemplate"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
dependencies = [
"serde",
"serde_json",
]
[[package]]
name = "unicode-ident"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "walkdir"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
"winapi-util",
]
[[package]]
name = "wasm-bindgen"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
dependencies = [
"unicode-ident",
]
[[package]]
name = "web-sys"
version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "winapi-util"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-targets"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
"windows_aarch64_gnullvm 0.48.5",
"windows_aarch64_msvc 0.48.5",
"windows_i686_gnu 0.48.5",
"windows_i686_msvc 0.48.5",
"windows_x86_64_gnu 0.48.5",
"windows_x86_64_gnullvm 0.48.5",
"windows_x86_64_msvc 0.48.5",
]
[[package]]
name = "windows-targets"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
"windows_i686_gnullvm",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"

91
vendor/fontconfig-parser/Cargo.toml vendored Normal file
View File

@@ -0,0 +1,91 @@
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
#
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
# to registry (e.g., crates.io) dependencies.
#
# If you are reading this file be aware that the original Cargo.toml
# will likely look very different (and much more reasonable).
# See Cargo.toml.orig for the original contents.
[package]
edition = "2018"
name = "fontconfig-parser"
version = "0.5.8"
build = false
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "fontconfig file parser in pure Rust"
homepage = "https://github.com/Riey/fontconfig-parser"
documentation = "https://docs.rs/fontconfig-parser"
readme = "README.md"
keywords = ["fontconfig"]
categories = ["parser-implementations"]
license = "MIT"
repository = "https://github.com/Riey/fontconfig-parser"
[features]
serialize = ["serde"]
[lib]
name = "fontconfig_parser"
path = "src/lib.rs"
[[example]]
name = "dump"
path = "examples/dump.rs"
[[example]]
name = "list_all_fonts"
path = "examples/list_all_fonts.rs"
[[example]]
name = "parse_dump_json"
path = "examples/parse_dump_json.rs"
[[test]]
name = "merge"
path = "tests/merge.rs"
[[test]]
name = "parse"
path = "tests/parse.rs"
[[bench]]
name = "parse_test_conf"
path = "benches/parse_test_conf.rs"
harness = false
[dependencies.log]
version = "0.4"
optional = true
[dependencies.roxmltree]
version = "0.20.0"
[dependencies.serde]
version = "1"
features = ["derive"]
optional = true
[dev-dependencies.criterion]
version = "0.5"
[dev-dependencies.glob]
version = "0.3"
[dev-dependencies.k9]
version = "0.12"
[dev-dependencies.serde_json]
version = "1"
[profile.bench]
lto = "thin"
[profile.release]
lto = "thin"

21
vendor/fontconfig-parser/LICENSE vendored Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Riey
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

17
vendor/fontconfig-parser/README.md vendored Normal file
View File

@@ -0,0 +1,17 @@
# fontconfig-parser
This crate provide parsing fontconfig file but not yet complete all features
see <https://www.freedesktop.org/software/fontconfig/fontconfig-user.html> for more detail infomation of fontconfig file
## Example
```rust
use fontconfig_parser::FontConfig;
let mut config = FontConfig::default();
config.merge_config("/etc/fonts/fonts.conf").unwrap();
```
License: MIT

View File

@@ -0,0 +1,22 @@
use criterion::{criterion_group, criterion_main, Criterion};
fn parse_bench(c: &mut Criterion) {
c.bench_function("parse_full", |b| {
b.iter(|| {
let s = std::fs::read_to_string("test-conf/fonts.conf").unwrap();
fontconfig_parser::parse_config_parts(&s).unwrap();
});
});
}
fn merge_bench(c: &mut Criterion) {
c.bench_function("merge_full", |b| {
b.iter(|| {
let mut c = fontconfig_parser::FontConfig::default();
c.merge_config("test-conf/fonts.conf").unwrap();
});
});
}
criterion_group!(benches, parse_bench, merge_bench);
criterion_main!(benches);

View File

@@ -0,0 +1,14 @@
use fontconfig_parser::FontConfig;
fn main() {
let args = std::env::args().collect::<Vec<_>>();
if args.len() < 2 {
eprintln!("Usage: cargo run --example dump -- <conf file path>");
return;
}
let mut config = FontConfig::default();
config.merge_config(&args[1]).unwrap();
println!("{:#?}", config);
}

View File

@@ -0,0 +1,39 @@
use fontconfig_parser::{FontConfig, Result};
use std::path::PathBuf;
fn visit_dir(dir: PathBuf, fonts: &mut Vec<PathBuf>) -> Result<()> {
let dir = std::fs::read_dir(dir)?;
for entry in dir {
if let Ok(entry) = entry {
if let Ok(ty) = entry.file_type() {
if ty.is_dir() {
visit_dir(entry.path(), fonts).ok();
} else if ty.is_file() || ty.is_symlink() {
fonts.push(entry.path());
}
}
}
}
Ok(())
}
fn main() -> Result<()> {
let mut config = FontConfig::default();
config.merge_config("/etc/fonts/fonts.conf").unwrap();
println!("dirs: {:#?}", config.dirs);
let mut fonts = Vec::new();
for dir in config.dirs {
visit_dir(dir.path, &mut fonts).ok();
}
println!("Find all {} fonts!", fonts.len());
println!("fonts: {:#?}", fonts);
Ok(())
}

View File

@@ -0,0 +1,16 @@
#[cfg(feature = "serde")]
fn main() {
let args = std::env::args().collect::<Vec<_>>();
if args.len() < 2 {
eprintln!("Usage: cargo run --example parse_dump_json -- <conf file path>");
return;
}
let parts =
fontconfig_parser::parse_config_parts(&std::fs::read_to_string(&args[1]).unwrap()).unwrap();
serde_json::to_writer(std::io::stdout(), &parts).unwrap();
}
#[cfg(not(feature = "serde"))]
fn main() {}

5
vendor/fontconfig-parser/gen.sh vendored Normal file
View File

@@ -0,0 +1,5 @@
target/debug/examples/parse_dump_yaml test-conf/fonts.conf > test-conf/fonts.yaml
for f in test-conf/conf.d/*.conf; do
target/debug/examples/parse_dump_yaml $f > "${f%.conf}.yaml"
done

63
vendor/fontconfig-parser/src/error.rs vendored Normal file
View File

@@ -0,0 +1,63 @@
use std::fmt;
use std::num::ParseFloatError;
use std::num::ParseIntError;
use std::str::ParseBoolError;
#[derive(Debug)]
pub enum Error {
Xml(roxmltree::Error),
NoFontconfig,
InvalidFormat(String),
IoError(std::io::Error),
ParseEnumError(&'static str, String),
ParseIntError(ParseIntError),
ParseFloatError(ParseFloatError),
ParseBoolError(ParseBoolError),
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Self::IoError(e)
}
}
impl From<roxmltree::Error> for Error {
fn from(e: roxmltree::Error) -> Self {
Self::Xml(e)
}
}
impl From<ParseIntError> for Error {
fn from(e: ParseIntError) -> Self {
Self::ParseIntError(e)
}
}
impl From<ParseFloatError> for Error {
fn from(e: ParseFloatError) -> Self {
Self::ParseFloatError(e)
}
}
impl From<ParseBoolError> for Error {
fn from(e: ParseBoolError) -> Self {
Self::ParseBoolError(e)
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Xml(e) => e.fmt(f),
Error::NoFontconfig => write!(f, "Can't find fontconfig element"),
Error::InvalidFormat(msg) => write!(f, "Config format is invalid: {}", msg),
Error::IoError(e) => write!(f, "IO error: {}", e),
Error::ParseEnumError(ty, s) => write!(f, "Unknown variant for {}: {}", ty, s),
Error::ParseIntError(e) => e.fmt(f),
Error::ParseFloatError(e) => e.fmt(f),
Error::ParseBoolError(e) => e.fmt(f),
}
}
}
impl std::error::Error for Error {}

42
vendor/fontconfig-parser/src/lib.rs vendored Normal file
View File

@@ -0,0 +1,42 @@
//! This crate provide parsing fontconfig file but not yet complete all features
//!
//! see <https://www.freedesktop.org/software/fontconfig/fontconfig-user.html> for more detail infomation of fontconfig file
//!
//! # Example
//!
//! ```no_run
//! use fontconfig_parser::FontConfig;
//!
//! let mut config = FontConfig::default();
//!
//! config.merge_config("/etc/fonts/fonts.conf").unwrap();
//! ```
#[macro_use]
mod util;
mod error;
mod parser;
mod types;
pub type Result<T> = core::result::Result<T, Error>;
pub use crate::error::Error;
pub use crate::types::*;
/// Parse as raw config parts use this when you want custom handling config file
///
/// Otherwise, you may want [`FontConfig::merge_config`]
pub fn parse_config_parts(s: &str) -> Result<Vec<ConfigPart>> {
crate::parser::parse_config(&roxmltree::Document::parse_with_options(
s,
roxmltree::ParsingOptions {
allow_dtd: true,
..Default::default()
},
)?)?
.collect()
}
#[cfg(test)]
mod tests {}

391
vendor/fontconfig-parser/src/parser.rs vendored Normal file
View File

@@ -0,0 +1,391 @@
#![allow(clippy::useless_format)]
use crate::*;
use roxmltree::Node;
pub fn parse_config<'a>(
xml_doc: &'a roxmltree::Document,
) -> Result<impl Iterator<Item = Result<ConfigPart>> + 'a> {
let fontconfig = xml_doc.root_element();
if fontconfig.tag_name().name() != "fontconfig" {
return Err(Error::NoFontconfig);
}
Ok(fontconfig
.children()
.filter_map(|c| parse_config_part(c).transpose()))
}
fn parse_config_part(child: Node) -> Result<Option<ConfigPart>> {
let part = match child.tag_name().name() {
"description" => ConfigPart::Description(try_text!(child).into()),
"alias" => {
let mut alias = Alias::default();
for child in child.children() {
let families =
child
.children()
.filter_map(|family| match family.tag_name().name() {
"family" => family.text().map(Into::into),
_ => None,
});
match child.tag_name().name() {
"family" => {
alias.alias = try_text!(child).into();
}
"prefer" => {
alias.prefer.extend(families);
}
"accept" => {
alias.accept.extend(families);
}
"default" => {
alias.default.extend(families);
}
_ => {}
}
}
ConfigPart::Alias(alias)
}
"dir" => {
let mut dir = Dir::default();
parse_attrs!(child, {
"prefix" => dir.prefix,
}, {
"salt" => dir.salt,
});
dir.path = try_text!(child).into();
ConfigPart::Dir(dir)
}
"reset-dirs" => ConfigPart::ResetDirs,
"remap-dir" => {
let mut dir = RemapDir::default();
parse_attrs!(child, {
"prefix" => dir.prefix,
}, {
"salt" => dir.salt,
"as-path" => dir.as_path,
});
dir.path = try_text!(child).into();
ConfigPart::RemapDir(dir)
}
"cachedir" => {
let mut dir = CacheDir::default();
parse_attrs!(child, {
"prefix" => dir.prefix,
});
dir.path = try_text!(child).into();
ConfigPart::CacheDir(dir)
}
"include" => {
let mut dir = Include::default();
let mut ignore_missing = "";
parse_attrs!(child, {
"prefix" => dir.prefix,
}, {
"ignore_missing" => ignore_missing,
});
dir.ignore_missing = matches!(ignore_missing, "yes");
dir.path = try_text!(child).into();
ConfigPart::Include(dir)
}
"config" => {
let mut config = Config::default();
for child in child.children() {
match child.tag_name().name() {
"rescan" => {
if let Some(int) = child.first_element_child() {
if int.tag_name().name() == "int" {
config.rescans.push(try_text!(int).parse()?);
}
}
}
"blank" => {
if let Some(child) = child.first_element_child() {
config.blanks.push(parse_int_or_range(child)?);
}
}
_ => {}
}
}
ConfigPart::Config(config)
}
"selectfont" => {
let mut s = SelectFont::default();
for child in child.children() {
let matches = child.children().filter_map(|c| match c.tag_name().name() {
"pattern" => {
let patelts = c.children().filter_map(|patelt| {
if patelt.tag_name().name() == "patelt" {
let mut kind = PropertyKind::default();
parse_attrs_opt!(patelt, {
"name" => kind,
});
parse_expr(patelt.first_element_child()?)
.ok()
.map(|expr| kind.make_property(expr))
} else {
None
}
});
Some(FontMatch::Pattern(patelts.collect()))
}
"glob" => c.text().map(Into::into).map(FontMatch::Glob),
_ => None,
});
match child.tag_name().name() {
"acceptfont" => {
s.accepts.extend(matches);
}
"rejectfont" => {
s.rejects.extend(matches);
}
_ => {}
}
}
ConfigPart::SelectFont(s)
}
"match" => {
let mut m = Match::default();
parse_attrs!(child, {
"target" => m.target,
});
for child in child.children() {
match child.tag_name().name() {
"test" => {
let mut t = Test::default();
let mut kind = PropertyKind::default();
parse_attrs!(child, {
"name" => kind,
"qual" => t.qual,
"target" => t.target,
"compare" => t.compare,
});
t.value = kind.make_property(parse_expr(
child
.first_element_child()
.ok_or_else(|| Error::InvalidFormat(format!("Empty test value")))?,
)?);
m.tests.push(t);
}
"edit" => {
let mut e = Edit::default();
let mut kind = PropertyKind::default();
parse_attrs!(child, {
"name" => kind,
"mode" => e.mode,
"binding" => e.binding,
});
e.value = kind.make_property(parse_expr(
child
.first_element_child()
.ok_or_else(|| Error::InvalidFormat(format!("Empty edit value")))?,
)?);
m.edits.push(e);
}
_ => {}
}
}
ConfigPart::Match(m)
}
_ => {
return Ok(None);
}
};
Ok(Some(part))
}
fn parse_int_or_range(node: Node) -> Result<IntOrRange> {
let mut texts = get_texts(&node);
match node.tag_name().name() {
"int" => Ok(IntOrRange::Int(try_text!(node).parse()?)),
"range" => Ok(IntOrRange::Range(
try_next!(texts, "Expect int").parse()?,
try_next!(texts, "Expect int").parse()?,
)),
_ => Err(Error::InvalidFormat(format!("Expect IntOrRange"))),
}
}
fn parse_expr(node: Node) -> Result<Expression> {
let mut exprs = get_exprs(&node);
let mut texts = get_texts(&node);
macro_rules! next {
($iter:expr) => {
try_next!($iter, "Expect expression")
};
}
match node.tag_name().name() {
"string" => Ok(Value::String(try_text!(node).into()).into()),
"langset" => Ok(Value::LangSet(try_text!(node).into()).into()),
"double" => Ok(Value::Double(try_text!(node).parse()?).into()),
"int" => Ok(Value::Int(try_text!(node).parse()?).into()),
"bool" => Ok(Value::Bool(try_text!(node).parse()?).into()),
"const" => Ok(Value::Constant(try_text!(node).parse()?).into()),
"matrix" => Ok(Expression::Matrix(Box::new([
next!(exprs)?,
next!(exprs)?,
next!(exprs)?,
next!(exprs)?,
]))),
"charset" => {
let charset = node
.children()
.filter_map(|c| parse_int_or_range(c).ok())
.collect();
Ok(Value::CharSet(charset).into())
}
"range" => Ok(Value::Range(next!(texts).parse()?, next!(texts).parse()?).into()),
"name" => {
let mut target = PropertyTarget::default();
parse_attrs!(node, {
"target" => target,
});
let kind = try_text!(node).parse()?;
Ok(Value::Property(target, kind).into())
}
name => {
if let Ok(list_op) = name.parse() {
Ok(Expression::List(
list_op,
exprs.collect::<Result<Vec<_>>>()?,
))
} else if let Ok(unary_op) = name.parse() {
Ok(Expression::Unary(unary_op, Box::new(next!(exprs)?)))
} else if let Ok(binary_op) = name.parse() {
Ok(Expression::Binary(
binary_op,
Box::new([next!(exprs)?, next!(exprs)?]),
))
} else if let Ok(ternary_op) = name.parse() {
Ok(Expression::Ternary(
ternary_op,
Box::new([next!(exprs)?, next!(exprs)?, next!(exprs)?]),
))
} else {
Err(Error::InvalidFormat(format!(
"Unknown expression: {:?}",
node.tag_name(),
)))
}
}
}
}
fn get_exprs<'a>(node: &'a Node) -> impl Iterator<Item = Result<Expression>> + 'a {
node.children().filter_map(|n| {
if n.is_element() {
Some(parse_expr(n))
} else {
None
}
})
}
fn get_texts<'a>(node: &'a Node) -> impl Iterator<Item = &'a str> {
node.children()
.filter_map(|n| if n.is_element() { n.text() } else { None })
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! make_parse_failed_test {
($name:ident, $test_fn:ident, $text:expr,) => {
#[test]
#[should_panic]
fn $name() {
let doc = roxmltree::Document::parse($text).expect("Parsing xml");
let node = doc.root_element();
$test_fn(node).expect("Run parse");
}
};
}
macro_rules! make_parse_test {
($name:ident, $test_fn:ident, $text:expr, $value:expr,) => {
#[test]
fn $name() {
let doc = roxmltree::Document::parse($text).expect("Parsing xml");
let node = doc.root_element();
let ret = $test_fn(node).expect("Run parse");
let expected = $value;
k9::assert_equal!(expected, ret);
}
};
}
make_parse_test!(
test_parse_charset,
parse_expr,
"<charset><range><int>0</int><int>123</int></range></charset>",
Expression::from(vec![IntOrRange::Range(0, 123)]),
);
make_parse_test!(
test_parse_int,
parse_expr,
"<int>123</int>",
Expression::from(123),
);
make_parse_failed_test!(test_parse_invalid_int, parse_expr, "<int>123f</int>",);
make_parse_test!(
test_parse_range,
parse_expr,
"<range><int>0</int><int>10</int></range>",
Expression::from(Value::Range(0, 10)),
);
make_parse_failed_test!(
test_parse_invalid_range,
parse_expr,
"<range>0<int>10</int></range>",
);
make_parse_test!(
test_langset,
parse_expr,
"<langset>ko-KR</langset>",
Expression::from(Value::LangSet("ko-KR".into())),
);
}

22
vendor/fontconfig-parser/src/types.rs vendored Normal file
View File

@@ -0,0 +1,22 @@
mod alias;
mod config;
mod constant;
mod dir;
mod document;
mod match_;
mod property;
mod selectfont;
mod value;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(untagged))]
pub enum IntOrRange {
Int(Int),
Range(Int, Int),
}
pub use self::{
alias::*, config::*, constant::*, dir::*, document::*, match_::*, property::*, selectfont::*,
value::*,
};

View File

@@ -0,0 +1,14 @@
/// Alias elements provide a shorthand notation for the set of common match operations needed to substitute one font family for another. They contain a <family> element followed by optional <prefer>, <accept> and <default> elements. Fonts matching the <family> element are edited to prepend the list of <prefer>ed families before the matching <family>, append the <accept>able families after the matching <family> and append the <default> families to the end of the family list.
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Alias {
/// alias name
pub alias: String,
/// `<prefer>`
pub prefer: Vec<String>,
/// `<accept>`
pub accept: Vec<String>,
/// `<default>`
pub default: Vec<String>,
}

View File

@@ -0,0 +1,8 @@
use crate::{Int, IntOrRange};
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Config {
pub blanks: Vec<IntOrRange>,
pub rescans: Vec<Int>,
}

View File

@@ -0,0 +1,134 @@
use crate::PropertyKind;
macro_rules! define_constant {
(
$(
$variant:ident = $(($ty:ident, $value:expr),)+
)+
) => {
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Constant {
$(
$variant,
)+
}
impl Constant {
pub fn get_value(self, kind: PropertyKind) -> Option<u32> {
match (self, kind) {
$(
$(
(Constant::$variant, PropertyKind::$ty) => Some($value),
)+
)+
_ => None,
}
}
}
};
}
define_constant! {
Thin = (Weight, 0),
Extralight = (Weight, 40),
Ultralight = (Weight, 40),
Light = (Weight, 50),
Demilight = (Weight, 55),
Semilight = (Weight, 55),
Book = (Weight, 75),
Regular = (Weight, 80),
Normal = (Weight, 80), (Width, 100),
Medium = (Weight, 100),
Demibold = (Weight, 180),
Semibold = (Weight, 180),
Bold = (Weight, 200),
Extrabold = (Weight, 205),
Black = (Weight, 210),
Heavy = (Weight, 210),
Roman = (Slant, 0),
Italic = (Slant, 100),
Oblique = (Slant, 110),
Ultracondensed = (Width, 50),
Extracondensed = (Width, 63),
Condensed = (Width, 75),
Semicondensed = (Width, 87),
// Merged into above Normal
// Normal = (Width, 100),
Semiexpanded = (Width, 113),
Expanded = (Width, 125),
Extraexpanded = (Width, 150),
Ultraexpanded = (Width, 200),
Proportional = (Spacing, 0),
Dual = (Spacing, 90),
Mono = (Spacing, 100),
Charcell = (Spacing, 110),
Unknown = (Rgba, 0),
Rgb = (Rgba, 1),
Bgr = (Rgba, 2),
Vrgb = (Rgba, 3),
Vbgr = (Rgba, 4),
None = (Rgba, 5),
Lcdnone = (Lcdfilter, 0),
Lcddefault = (Lcdfilter, 1),
Lcdlight = (Lcdfilter, 2),
Lcdlegacy = (Lcdfilter, 3),
Hintnone = (HintStyle, 0),
Hintslight = (HintStyle, 1),
Hintmedium = (HintStyle, 2),
Hintfull = (HintStyle, 3),
}
parse_enum! {
Constant,
(Thin, "thin"),
(Extralight, "extralight"),
(Ultralight, "ultralight"),
(Light, "light"),
(Demilight, "demilight"),
(Semilight, "semilight"),
(Book, "book"),
(Regular, "regular"),
(Normal, "normal"),
(Medium, "medium"),
(Demibold, "demibold"),
(Semibold, "semibold"),
(Bold, "bold"),
(Extrabold, "extrabold"),
(Black, "black"),
(Heavy, "heavy"),
(Roman, "roman"),
(Italic, "italic"),
(Oblique, "oblique"),
(Ultracondensed, "ultracondensed"),
(Extracondensed, "extracondensed"),
(Condensed, "condensed"),
(Semicondensed, "semicondensed"),
(Semiexpanded, "semiexpanded"),
(Expanded, "expanded"),
(Extraexpanded, "extraexpanded"),
(Ultraexpanded, "ultraexpanded"),
(Proportional, "proportional"),
(Dual, "dual"),
(Mono, "mono"),
(Charcell, "charcell"),
(Unknown, "unknown"),
(Rgb, "rgb"),
(Bgr, "bgr"),
(Vrgb, "vrgb"),
(Vbgr, "vbgr"),
(None, "none"),
(Lcdnone, "lcdnone"),
(Lcddefault, "lcddefault"),
(Lcdlight, "lcdlight"),
(Lcdlegacy, "lcdlegacy"),
(Hintnone, "hintnone"),
(Hintslight, "hintslight"),
(Hintmedium, "hintmedium"),
(Hintfull, "hintfull"),
}
#[test]
fn convert_test() {
assert_eq!(Constant::Roman.get_value(PropertyKind::Slant).unwrap(), 0,);
}

View File

@@ -0,0 +1,168 @@
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Dir {
pub prefix: DirPrefix,
pub salt: String,
pub path: String,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CacheDir {
pub prefix: DirPrefix,
pub path: String,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Include {
pub prefix: DirPrefix,
pub ignore_missing: bool,
pub path: String,
}
/// This element contains a directory name where will be mapped as the path 'as-path' in cached information. This is useful if the directory name is an alias (via a bind mount or symlink) to another directory in the system for which cached font information is likely to exist.
/// 'salt' property affects to determine cache filename as same as [`Dir`] element.
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RemapDir {
pub prefix: DirPrefix,
pub as_path: String,
pub salt: String,
pub path: String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DirPrefix {
Default,
Cwd,
Xdg,
Relative,
}
pub enum PrefixBehavior {
Config,
Cwd,
Xdg,
Relative,
}
parse_enum! {
DirPrefix,
(Default, "default"),
(Cwd, "cwd"),
(Xdg, "xdg"),
(Relative, "relative"),
}
impl Default for DirPrefix {
fn default() -> Self {
DirPrefix::Default
}
}
/// Get the location to user home directory.
///
/// This implementation follows `FcConfigHome` function of freedesktop.org's
/// Fontconfig library.
#[allow(unused_mut, clippy::let_and_return)]
fn config_home() -> Result<String, std::env::VarError> {
let mut home = std::env::var("HOME");
#[cfg(target_os = "windows")]
{
home = home.or_else(|_| std::env::var("USERPROFILE"));
}
home
}
/// Given a relative path to a config file, this function returns
/// the complete file name to load.
///
/// This is a simplified version of `FcConfigGetFilename` from the Fontconfig
/// library.
fn config_get_file_name(p: &std::path::PathBuf) -> std::path::PathBuf {
if cfg!(target_os = "windows") {
// TODO: get config file path properly for Windows
return p.clone();
} else {
std::path::Path::new("/etc/fonts").join(p)
}
}
fn expand_tilde(path: &String) -> std::path::PathBuf {
let parsed_path = std::path::Path::new(path);
if let Ok(stripped_path) = parsed_path.strip_prefix("~") {
let home = config_home().unwrap_or("/".to_string());
std::path::Path::new(&home).join(stripped_path)
} else {
parsed_path.into()
}
}
macro_rules! define_calculate_path {
($ty:ident, $xdg_env:expr, $xdg_fallback:expr, $default_prefix_behavior:expr) => {
impl $ty {
/// Environment variable name which used `xdg` prefix
pub const XDG_ENV: &'static str = $xdg_env;
/// Fallback path when `XDG_ENV` is not exists
pub const XDG_FALLBACK_PATH: &'static str = $xdg_fallback;
const DEFAULT_PREFIX_BEHAVIOR: PrefixBehavior = $default_prefix_behavior;
fn get_prefix_behavior(prefix: DirPrefix) -> PrefixBehavior {
match prefix {
DirPrefix::Default => Self::DEFAULT_PREFIX_BEHAVIOR,
DirPrefix::Cwd => PrefixBehavior::Cwd,
DirPrefix::Xdg => PrefixBehavior::Xdg,
DirPrefix::Relative => PrefixBehavior::Relative,
}
}
/// Calculate actual path
pub fn calculate_path<P: AsRef<std::path::Path> + ?Sized>(
&self,
config_file_path: &P,
) -> std::path::PathBuf {
let expanded_path = expand_tilde(&self.path);
if expanded_path.is_absolute() {
return expanded_path;
}
let prefix = Self::get_prefix_behavior(self.prefix);
match prefix {
PrefixBehavior::Config => config_get_file_name(&expanded_path),
PrefixBehavior::Cwd => std::path::Path::new(".").join(expanded_path),
PrefixBehavior::Relative => match config_file_path.as_ref().parent() {
Some(parent) => parent.join(expanded_path),
None => std::path::Path::new(".").join(expanded_path),
},
PrefixBehavior::Xdg => {
let xdg_path =
std::env::var($xdg_env).unwrap_or_else(|_| $xdg_fallback.into());
expand_tilde(&xdg_path).join(expanded_path)
}
}
}
}
};
}
define_calculate_path!(Dir, "XDG_DATA_HOME", "~/.local/share", PrefixBehavior::Cwd);
define_calculate_path!(CacheDir, "XDG_CACHE_HOME", "~/.cache", PrefixBehavior::Cwd);
define_calculate_path!(
Include,
"XDG_CONFIG_HOME",
"~/.config",
PrefixBehavior::Config
);
define_calculate_path!(
RemapDir,
"XDG_CONFIG_HOME",
"~/.config",
PrefixBehavior::Cwd
);

View File

@@ -0,0 +1,183 @@
use crate::parser::parse_config;
use crate::*;
use std::collections::HashSet;
use std::fs;
use std::path::{Path, PathBuf};
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ConfigPart {
Description(String),
SelectFont(SelectFont),
Dir(Dir),
CacheDir(CacheDir),
Include(Include),
Match(Match),
Config(Config),
Alias(Alias),
RemapDir(RemapDir),
ResetDirs,
}
#[derive(Clone, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FontConfig {
pub select_fonts: Vec<SelectFont>,
pub dirs: Vec<DirData>,
pub cache_dirs: Vec<PathBuf>,
pub remap_dirs: Vec<RemapDirData>,
pub matches: Vec<Match>,
pub config: Config,
pub aliases: Vec<Alias>,
pub config_files: HashSet<PathBuf>,
}
impl FontConfig {
pub fn merge_config<P: AsRef<Path> + ?Sized>(&mut self, config_path: &P) -> Result<()> {
match std::fs::canonicalize(&config_path) {
Ok(p) => {
if !self.config_files.insert(std::path::PathBuf::from(p)) {
return Ok(());
}
}
Err(err) => return Err(Error::IoError(err)),
}
let config = fs::read_to_string(config_path.as_ref())?;
let xml_doc = roxmltree::Document::parse_with_options(
&config,
roxmltree::ParsingOptions {
allow_dtd: true,
..Default::default()
},
)?;
for part in parse_config(&xml_doc)? {
match part? {
ConfigPart::Alias(alias) => self.aliases.push(alias),
ConfigPart::Config(mut c) => {
self.config.rescans.append(&mut c.rescans);
self.config.blanks.append(&mut c.blanks);
}
ConfigPart::Description(_) => {}
ConfigPart::Dir(dir) => self.dirs.push(DirData {
path: dir.calculate_path(config_path),
salt: dir.salt,
}),
ConfigPart::CacheDir(dir) => self.cache_dirs.push(dir.calculate_path(config_path)),
ConfigPart::Match(m) => self.matches.push(m),
ConfigPart::ResetDirs => self.dirs.clear(),
ConfigPart::SelectFont(s) => self.select_fonts.push(s),
ConfigPart::RemapDir(remap) => self.remap_dirs.push(RemapDirData {
path: remap.calculate_path(config_path),
salt: remap.salt,
as_path: remap.as_path,
}),
ConfigPart::Include(dir) => {
let include_path = dir.calculate_path(config_path);
match self.include(&include_path) {
Ok(_) => {}
#[allow(unused_variables)]
Err(err) => {
if !dir.ignore_missing {
#[cfg(feature = "log")]
log::warn!("Failed to include {}: {}", include_path.display(), err);
}
}
}
}
}
}
Ok(())
}
fn include(&mut self, include_path: &Path) -> Result<()> {
let meta = fs::metadata(include_path)?;
let ty = meta.file_type();
// fs::metadata follow symlink so ty is never symlink
if ty.is_file() {
self.merge_config(include_path)?;
} else if ty.is_dir() {
let dir = std::fs::read_dir(include_path)?;
let mut config_paths: Vec<_> = dir
.filter_map(|entry| {
let entry = entry.ok()?;
let ty = entry.file_type().ok()?;
if ty.is_file() || ty.is_symlink() {
Some(entry.path())
} else {
None
}
})
.collect();
// Configs MUST be sorted in lexicographic order,
// otherwise `ConfigPart::ResetDirs` can occur out of intended order.
// See https://www.freedesktop.org/software/fontconfig/fontconfig-user.html#:~:text=sorted%20in%20lexicographic%20order
config_paths.sort();
for config_path in config_paths {
match self.merge_config(&config_path) {
Ok(_) => {}
#[allow(unused_variables)]
Err(err) => {
#[cfg(feature = "log")]
log::warn!("Failed to merge {}: {}", config_path.display(), err);
}
}
}
}
Ok(())
}
}
macro_rules! define_config_part_from {
($($f:ident,)+) => {
$(
impl From<$f> for ConfigPart {
fn from(v: $f) -> Self {
ConfigPart::$f(v)
}
}
)+
};
}
define_config_part_from! {
SelectFont,
Dir,
CacheDir,
Include,
Match,
Config,
Alias,
RemapDir,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
/// Final dir data
pub struct DirData {
/// dir path
pub path: PathBuf,
/// 'salt' property affects to determine cache filename. this is useful for example when having different fonts sets on same path at container and share fonts from host on different font path.
pub salt: String,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
/// Final remap-dirs data
pub struct RemapDirData {
/// dir path will be mapped as the path [`as-path`](Self::as_path) in cached information. This is useful if the directory name is an alias (via a bind mount or symlink) to another directory in the system for which cached font information is likely to exist.
pub path: PathBuf,
/// 'salt' property affects to determine cache filename. this is useful for example when having different fonts sets on same path at container and share fonts from host on different font path.
pub salt: String,
// remapped path
pub as_path: String,
}

View File

@@ -0,0 +1,34 @@
mod edit;
mod test;
pub use self::edit::*;
pub use self::test::*;
#[derive(Clone, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Match {
pub target: MatchTarget,
pub tests: Vec<Test>,
pub edits: Vec<Edit>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MatchTarget {
Pattern,
Font,
Scan,
}
parse_enum! {
MatchTarget,
(Pattern, "pattern"),
(Font, "font"),
(Scan, "scan"),
}
impl Default for MatchTarget {
fn default() -> Self {
MatchTarget::Pattern
}
}

View File

@@ -0,0 +1,61 @@
use crate::Property;
#[derive(Clone, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Edit {
pub mode: EditMode,
pub binding: EditBinding,
pub value: Property,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum EditBinding {
Strong,
Weak,
Same,
}
parse_enum! {
EditBinding,
(Strong, "strong"),
(Weak, "weak"),
(Same, "same"),
}
impl Default for EditBinding {
fn default() -> Self {
EditBinding::Weak
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum EditMode {
Assign,
AssignReplace,
Prepend,
PrependFirst,
Append,
AppendLast,
Delete,
DeleteAll,
}
parse_enum! {
EditMode,
(Assign, "assign"),
(AssignReplace, "assign_replace"),
(Prepend, "prepend"),
(PrependFirst, "prepend_first"),
(Append, "append"),
(AppendLast, "append_last"),
(Delete, "delete"),
(DeleteAll, "delete_all"),
}
impl Default for EditMode {
fn default() -> Self {
EditMode::Assign
}
}

View File

@@ -0,0 +1,90 @@
use crate::Property;
/// This element contains a single value which is compared with the target ('pattern', 'font', 'scan' or 'default') property "property" (substitute any of the property names seen above).
/// 'compare' can be one of "eq", "not_eq", "less", "less_eq", "more", "more_eq", "contains" or "not_contains".
/// 'qual' may either be the default, "any", in which case the match succeeds if any value associated with the property matches the test value,
/// or "all", in which case all of the values associated with the property must match the test value. 'ignore-blanks' takes a boolean value.
/// if 'ignore-blanks' is set "true", any blanks in the string will be ignored on its comparison. this takes effects only when compare="eq" or compare="not_eq".
/// When used in a <match target="font"> element, the target= attribute in the <test> element selects between matching the original pattern or the font.
/// "default" selects whichever target the outer <match> element has selected.
#[derive(Clone, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Test {
pub qual: TestQual,
pub target: TestTarget,
pub compare: TestCompare,
pub value: Property,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TestTarget {
Default,
Pattern,
Font,
Scan,
}
parse_enum! {
TestTarget,
(Default, "default"),
(Pattern, "pattern"),
(Font, "font"),
(Scan, "scan"),
}
impl Default for TestTarget {
fn default() -> Self {
TestTarget::Default
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TestCompare {
Eq,
NotEq,
Less,
LessEq,
More,
MoreEq,
Contains,
NotContains,
}
parse_enum! {
TestCompare,
(Eq, "eq"),
(NotEq, "not_eq"),
(Less, "less"),
(LessEq, "less_eq"),
(More, "more"),
(MoreEq, "more_eq"),
(Contains, "contains"),
(NotContains, "not_contains"),
}
impl Default for TestCompare {
fn default() -> Self {
TestCompare::Eq
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TestQual {
Any,
All,
}
parse_enum! {
TestQual,
(Any, "any"),
(All, "all"),
}
impl Default for TestQual {
fn default() -> Self {
TestQual::Any
}
}

View File

@@ -0,0 +1,176 @@
use crate::{Expression, Value};
macro_rules! define_property {
(
$(
$(#[$attr:meta])*
$variant:ident($value_ty:ident, $name:expr),
)+
) => {
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Property {
$(
$(#[$attr])*
$variant(Expression),
)+
Dynamic(String, Expression),
}
impl Property {
pub fn kind(&self) -> PropertyKind {
match self {
$(
Property::$variant(_) => PropertyKind::$variant,
)+
Property::Dynamic(s, _) => PropertyKind::Dynamic(s.clone()),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PropertyKind {
$(
$(#[$attr])*
$variant,
)+
Dynamic(String),
}
parse_enum! {
PropertyKind,
$(
($variant, $name),
)+
|s| Ok(PropertyKind::Dynamic(s.into())),
}
impl PropertyKind {
pub fn make_property(self, expr: Expression) -> Property {
match self {
$(
PropertyKind::$variant => Property::$variant(expr),
)+
PropertyKind::Dynamic(name) => Property::Dynamic(name.clone(), expr),
}
}
}
};
}
define_property! {
/// Font family names
Family(String, "family"),
/// Languages corresponding to each family
FamilyLang(String, "familylang"),
/// Font style. Overrides weight and slant
Style(String, "style"),
/// Languages corresponding to each style
StyleLang(String, "stylelang"),
/// Font full names (often includes style)
FullName(String, "fullname"),
/// Languages corresponding to each fullname
FullNameLang(String, "fullnamelang"),
/// Italic, oblique or roman
Slant(Int, "slant"),
/// Light, medium, demibold, bold or black
Weight(Int, "weight"),
/// Point size
Size(Double, "size"),
/// Condensed, normal or expanded
Width(Int, "width"),
/// Stretches glyphs horizontally before hinting
Aspect(Double, "aspect"),
/// Pixel size
PixelSize(Double, "pixelsize"),
/// Proportional, dual-width, monospace or charcell
Spacing(Int, "spacing"),
/// Font foundry name
Foundry(String, "foundry"),
/// Whether glyphs can be antialiased
Antialias(Bool, "antialias"),
/// Whether the rasterizer should use hinting
Hinting(Bool, "hinting"),
/// Automatic hinting style
HintStyle(Int, "hintstyle"),
/// Automatic hinting style
VerticalLayout(Bool, "verticallayout"),
/// Use autohinter instead of normal hinter
AutoHint(Bool, "autohint"),
/// Use font global advance data (deprecated)
GlobalAdvance(Bool, "globaladvance"),
/// The filename holding the font
File(String, "file"),
/// The index of the font within the file
Index(Int, "index"),
// TODO:
// /// Use the specified FreeType face object
// Ftface(FT_Face),
/// Which rasterizer is in use (deprecated)
Rasterizer(String, "rasterizer"),
/// Whether the glyphs are outlines
Outline(Bool, "outline"),
/// Whether glyphs can be scaled
Scalable(Bool, "scalable"),
/// Whether any glyphs have color
Color(Bool, "color"),
/// Scale factor for point->pixel conversions (deprecated)
Scale(Double, "scale"),
/// Target dots per inch
Dpi(Double, "dpi"),
/// unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry
Rgba(Int, "rgba"),
/// Type of LCD filter
Lcdfilter(Int, "lcdfilter"),
/// Eliminate leading from line spacing
Minspace(Bool, "minspace"),
/// Unicode chars encoded by the font
Charset(CharSet, "charset"),
/// List of RFC-3066-style languages this font supports
Lang(String, "lang"),
/// Version number of the font
Fontversion(Int, "fontversion"),
/// List of layout capabilities in the font
Capability(String, "capability"),
/// String name of the font format
Fontformat(String, "fontformat"),
/// Rasterizer should synthetically embolden the font
Embolden(Bool, "embolden"),
/// Use the embedded bitmap instead of the outline
Embeddedbitmap(Bool, "embeddedbitmap"),
/// Whether the style is a decorative variant
Decorative(Bool, "decorative"),
/// List of the feature tags in OpenType to be enabled
Fontfeatures(String, "fontfeatures"),
/// Language name to be used for the default value of familylang, stylelang, and fullnamelang
Namelang(String, "namelang"),
/// String Name of the running program
Prgname(String, "prgname"),
/// Font family name in PostScript
Postscriptname(String, "postscriptname"),
/// Whether the font has hinting
Fonthashint(Bool, "fonthashint"),
/// Order number of the font
Order(Int, "order"),
// custom
Matrix(Matrix, "matrix"),
PixelSizeFixupFactor(Double, "pixelsizefixupfactor"),
ScalingNotNeeded(Bool, "scalingnotneeded"),
}
impl Default for Property {
fn default() -> Self {
Property::Family(Expression::Simple(Value::String(String::default())))
}
}
impl Default for PropertyKind {
fn default() -> Self {
PropertyKind::Family
}
}

View File

@@ -0,0 +1,15 @@
use crate::Property;
#[derive(Clone, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SelectFont {
pub rejects: Vec<FontMatch>,
pub accepts: Vec<FontMatch>,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FontMatch {
Glob(String),
Pattern(Vec<Property>),
}

View File

@@ -0,0 +1,188 @@
use crate::{Constant, IntOrRange, PropertyKind};
pub type Bool = bool;
pub type Int = u32;
pub type Double = f64;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ListOp {
Times,
Divide,
Or,
And,
Plus,
Minus,
}
parse_enum! {
ListOp,
(Times, "times"),
(Divide, "divide"),
(Or, "or"),
(And, "and"),
(Plus, "plus"),
(Minus, "minus"),
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum UnaryOp {
Not,
// these operator not exists in document page but exists in dtd
Cecil,
Floor,
Round,
Trunc,
}
parse_enum! {
UnaryOp,
(Not, "not"),
(Cecil, "cecil"),
(Floor, "floor"),
(Round, "round"),
(Trunc, "trunc"),
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BinaryOp {
Eq,
NotEq,
Less,
LessEq,
More,
MoreEq,
Contains,
NotContains,
}
parse_enum! {
BinaryOp,
(Eq, "eq"),
(NotEq, "not_eq"),
(Less, "less"),
(LessEq, "less_eq"),
(More, "more"),
(MoreEq, "more_eq"),
(Contains, "contains"),
(NotContains, "not_contains"),
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TernaryOp {
If,
}
parse_enum! {
TernaryOp,
(If, "if"),
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expression {
Simple(Value),
Unary(UnaryOp, Box<Self>),
Binary(BinaryOp, Box<[Self; 2]>),
Ternary(TernaryOp, Box<[Self; 3]>),
List(ListOp, Vec<Self>),
Matrix(Box<[Self; 4]>),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PropertyTarget {
Default,
Font,
Pattern,
}
parse_enum! {
PropertyTarget,
(Default, "default"),
(Font, "font"),
(Pattern, "pattern"),
}
impl Default for PropertyTarget {
fn default() -> Self {
PropertyTarget::Default
}
}
pub type CharSet = Vec<IntOrRange>;
/// Runtime typed fontconfig value
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Value {
/// `<int>0</int>`
Int(Int),
/// `<double>1.5</double>`
Double(Double),
/// `<string>str</string>`
String(String),
/// `<const>hintslight</const>`
Constant(Constant),
/// `<bool>false</bool>`
Bool(Bool),
/// This element holds the two [`Value::Int`] elements of a range representation.
Range(Int, Int),
/// This element holds at least one [`Value::String`] element of a RFC-3066-style languages or more.
LangSet(String),
/// This element holds at least one [`Value::Int`] element of an Unicode code point or more.
CharSet(CharSet),
/// `<name target="font">pixelsize</name>`
Property(PropertyTarget, PropertyKind),
}
macro_rules! from_value {
($($name:ident,)+) => {
$(
impl From<$name> for Value {
fn from(v: $name) -> Value {
Value::$name(v)
}
}
)+
};
}
from_value! {
Int,
Bool,
Double,
Constant,
CharSet,
}
impl<'a> From<&'a str> for Value {
fn from(s: &'a str) -> Self {
Value::String(s.into())
}
}
impl From<String> for Value {
fn from(s: String) -> Self {
Value::String(s)
}
}
impl From<(PropertyTarget, PropertyKind)> for Value {
fn from((target, kind): (PropertyTarget, PropertyKind)) -> Self {
Value::Property(target, kind)
}
}
impl<V> From<V> for Expression
where
Value: From<V>,
{
fn from(v: V) -> Self {
Expression::Simple(Value::from(v))
}
}

92
vendor/fontconfig-parser/src/util.rs vendored Normal file
View File

@@ -0,0 +1,92 @@
macro_rules! try_next {
($iter:expr, $($tt:tt)*) => {
match $iter.next() {
Some(e) => e,
None => return Err(crate::Error::InvalidFormat(format!($($tt)*))),
}
}
}
macro_rules! try_text {
($node:expr) => {
match $node.text() {
Some(t) => t,
None => return Err(crate::Error::InvalidFormat("Can't get text".into())),
}
};
}
macro_rules! parse_attrs_opt {
($node:expr, { $($key:expr => $lvalue:expr,)+ } $(, { $($str_key:expr => $str_lvalue:expr,)+ } )?) => {
for attr in $node.attributes() {
match attr.name() {
$(
$key => $lvalue = attr.value().parse().ok()?,
)+
$(
$(
$str_key => $str_lvalue = attr.value().into(),
)+
)?
_ => {}
}
}
};
}
macro_rules! parse_attrs {
($node:expr, { $($key:expr => $lvalue:expr,)+ } $(, { $($str_key:expr => $str_lvalue:expr,)+ } )?) => {
for attr in $node.attributes() {
match attr.name() {
$(
$key => $lvalue = attr.value().parse()?,
)+
$(
$(
$str_key => $str_lvalue = attr.value().into(),
)+
)?
_ => {}
}
}
};
}
macro_rules! parse_enum {
(
$ty:ty,
$(
($variant:ident, $text:expr),
)+
|$arg:ident| $fallback:expr,
) => {
impl core::str::FromStr for $ty {
type Err = crate::Error;
fn from_str($arg: &str) -> crate::Result<$ty> {
match $arg {
$(
$text => Ok(<$ty>::$variant),
)+
_ => {
$fallback
}
}
}
}
};
(
$ty:ty,
$(
($variant:ident, $text:expr),
)+
) => {
parse_enum! {
$ty,
$(
($variant, $text),
)+
|s| Err(crate::Error::ParseEnumError(core::any::type_name::<$ty>(), s.into())),
}
};
}

View File

@@ -0,0 +1,11 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
<!-- This should get reset. -->
<dir>/before/reset</dir>
<reset-dirs />
<!-- This should survive. -->
<dir>/after/reset</dir>
</fontconfig>

View File

@@ -0,0 +1,17 @@
[
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/before/reset"
}
},
"ResetDirs",
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/after/reset"
}
}
]

View File

@@ -0,0 +1,8 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
<!-- This should not get reset by `00-5_reset-dirs.conf` as `00-6` runs after. -->
<dir>/after/after/reset</dir>
</fontconfig>

View File

@@ -0,0 +1,9 @@
[
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/after/after/reset"
}
}
]

View File

@@ -0,0 +1,19 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
<!-- Font directories -->
<dir>/nix/store/i1yhgnfvaihqzs079lcx4zjnrdzcvaak-noto-fonts-2020-01-23</dir>
<dir>/nix/store/4glxr7vyi0a68c6vgz2gn5c2ljkl7x37-noto-fonts-cjk-2.001</dir>
<dir>/nix/store/cwbgs1zpk0pb8jjldgdqmvmdgl3zd5vb-noto-fonts-emoji-2.028</dir>
<dir>/nix/store/imnk1n6llkh089xgzqyqpr6yw9qz9b3z-d2codingfont-1.3.2</dir>
<dir>/nix/store/41qphrp1ksc1fqm01i7khs30n1zjl56r-fira-code-5.2</dir>
<dir>/nix/store/391caw6m9k1fv4fzhgjabkqni7hf1hvj-fira-code-symbols-20160811</dir>
<dir>/nix/store/ah9gyp7rxak9ig2q829myn6172jn302f-hack-font-3.003</dir>
<dir>/nix/store/314zk48rhqbprza0i2nxch27x0h0jaim-sarasa-gothic-0.32.9</dir>
<dir>/nix/store/fn89l2wvilp6p0jj2dgk7iv8p9hcyqbw-nerdfonts-2.1.0</dir>
<dir>/nix/store/wnv4za94mh0li42qz0da1za483jmz5kh-mplus-063a</dir>
<!-- Pre-generated font caches -->
<cachedir>/nix/store/3yd10s1cq2xjqq3f1nlgjmvcwpbh74sf-fc-cache</cachedir>
</fontconfig>

View File

@@ -0,0 +1,78 @@
[
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/i1yhgnfvaihqzs079lcx4zjnrdzcvaak-noto-fonts-2020-01-23"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/4glxr7vyi0a68c6vgz2gn5c2ljkl7x37-noto-fonts-cjk-2.001"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/cwbgs1zpk0pb8jjldgdqmvmdgl3zd5vb-noto-fonts-emoji-2.028"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/imnk1n6llkh089xgzqyqpr6yw9qz9b3z-d2codingfont-1.3.2"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/41qphrp1ksc1fqm01i7khs30n1zjl56r-fira-code-5.2"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/391caw6m9k1fv4fzhgjabkqni7hf1hvj-fira-code-symbols-20160811"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/ah9gyp7rxak9ig2q829myn6172jn302f-hack-font-3.003"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/314zk48rhqbprza0i2nxch27x0h0jaim-sarasa-gothic-0.32.9"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/fn89l2wvilp6p0jj2dgk7iv8p9hcyqbw-nerdfonts-2.1.0"
}
},
{
"Dir": {
"prefix": "Default",
"salt": "",
"path": "/nix/store/wnv4za94mh0li42qz0da1za483jmz5kh-mplus-063a"
}
},
{
"CacheDir": {
"prefix": "Default",
"path": "/nix/store/3yd10s1cq2xjqq3f1nlgjmvcwpbh74sf-fc-cache"
}
}
]

View File

@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set hintslight to hintstyle</description>
<match target="pattern">
<!--
This sort of configuration is available on the major desktop environments
and we don't have to break it with "assign" unconditionally. however, we
want to set something for others. So we use "append" here to get this working
in both cases so that most clients would takes a look at the first place only.
-->
<edit name="hintstyle" mode="append"><const>hintslight</const></edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,24 @@
[
{
"Description": "Set hintslight to hintstyle"
},
{
"Match": {
"target": "Pattern",
"tests": [],
"edits": [
{
"mode": "Append",
"binding": "Weak",
"value": {
"HintStyle": {
"Simple": {
"Constant": "Hintslight"
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,27 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
<!-- Default rendering settings -->
<match target="pattern">
<edit mode="append" name="hinting">
<bool>true</bool>
</edit>
<edit mode="append" name="autohint">
<bool>false</bool>
</edit>
<edit mode="append" name="hintstyle">
<const>hintslight</const>
</edit>
<edit mode="append" name="antialias">
<bool>true</bool>
</edit>
<edit mode="append" name="rgba">
<const>rgb</const>
</edit>
<edit mode="append" name="lcdfilter">
<const>lcddefault</const>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,76 @@
[
{
"Match": {
"target": "Pattern",
"tests": [],
"edits": [
{
"mode": "Append",
"binding": "Weak",
"value": {
"Hinting": {
"Simple": {
"Bool": true
}
}
}
},
{
"mode": "Append",
"binding": "Weak",
"value": {
"AutoHint": {
"Simple": {
"Bool": false
}
}
}
},
{
"mode": "Append",
"binding": "Weak",
"value": {
"HintStyle": {
"Simple": {
"Constant": "Hintslight"
}
}
}
},
{
"mode": "Append",
"binding": "Weak",
"value": {
"Antialias": {
"Simple": {
"Bool": true
}
}
}
},
{
"mode": "Append",
"binding": "Weak",
"value": {
"Rgba": {
"Simple": {
"Constant": "Rgb"
}
}
}
},
{
"mode": "Append",
"binding": "Weak",
"value": {
"Lcdfilter": {
"Simple": {
"Constant": "Lcddefault"
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,83 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Bitmap scaling</description>
<!--
If font is bitmap, calculate scale factor.
Note that color bitmap fonts have scalable=true, while
non-color ones have scalable=false. Both groups have outline=false.
-->
<match target="font">
<test name="outline" compare="eq">
<bool>false</bool>
</test>
<edit name="pixelsizefixupfactor" mode="assign">
<divide>
<name target="pattern">pixelsize</name>
<name target="font" >pixelsize</name>
</divide>
</edit>
</match>
<!--
For non-scalable bitmap fonts (ie. non-color), skip
minor scaling if hinting is enabled.
-->
<match target="font">
<test name="outline" compare="eq">
<bool>false</bool>
</test>
<test name="scalable" compare="eq">
<bool>false</bool>
</test>
<test name="hinting" compare="eq">
<bool>true</bool>
</test>
<edit name="scalingnotneeded" mode="assign">
<and>
<less>
<name>pixelsizefixupfactor</name>
<double>1.2</double>
</less>
<more>
<name>pixelsizefixupfactor</name>
<double>0.8</double>
</more>
</and>
</edit>
</match>
<match target="font">
<test name="scalingnotneeded" compare="eq">
<bool>true</bool>
</test>
<edit name="pixelsizefixupfactor" mode="assign">
<double>1.0</double>
</edit>
</match>
<!--
If we *are* going to scale, go ahead and do it.
-->
<match target="font">
<test name="outline" compare="eq">
<bool>false</bool>
</test>
<test name="pixelsizefixupfactor" compare="not_eq">
<double>1.0</double>
</test>
<edit name="matrix" mode="assign">
<times>
<name>matrix</name>
<matrix>
<name>pixelsizefixupfactor</name> <double>0</double>
<double>0</double> <name>pixelsizefixupfactor</name>
</matrix>
</times>
</edit>
<edit name="size" mode="assign">
<divide>
<name>size</name>
<name>pixelsizefixupfactor</name>
</divide>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,298 @@
[
{
"Description": "Bitmap scaling"
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Outline": {
"Simple": {
"Bool": false
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"PixelSizeFixupFactor": {
"List": [
"Divide",
[
{
"Simple": {
"Property": [
"Pattern",
"PixelSize"
]
}
},
{
"Simple": {
"Property": [
"Font",
"PixelSize"
]
}
}
]
]
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Outline": {
"Simple": {
"Bool": false
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Scalable": {
"Simple": {
"Bool": false
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Hinting": {
"Simple": {
"Bool": true
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"ScalingNotNeeded": {
"List": [
"And",
[
{
"Binary": [
"Less",
[
{
"Simple": {
"Property": [
"Default",
"PixelSizeFixupFactor"
]
}
},
{
"Simple": {
"Double": 1.2
}
}
]
]
},
{
"Binary": [
"More",
[
{
"Simple": {
"Property": [
"Default",
"PixelSizeFixupFactor"
]
}
},
{
"Simple": {
"Double": 0.8
}
}
]
]
}
]
]
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"ScalingNotNeeded": {
"Simple": {
"Bool": true
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"PixelSizeFixupFactor": {
"Simple": {
"Double": 1.0
}
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Outline": {
"Simple": {
"Bool": false
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "NotEq",
"value": {
"PixelSizeFixupFactor": {
"Simple": {
"Double": 1.0
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Matrix": {
"List": [
"Times",
[
{
"Simple": {
"Property": [
"Default",
"Matrix"
]
}
},
{
"Matrix": [
{
"Simple": {
"Property": [
"Default",
"PixelSizeFixupFactor"
]
}
},
{
"Simple": {
"Double": 0.0
}
},
{
"Simple": {
"Double": 0.0
}
},
{
"Simple": {
"Property": [
"Default",
"PixelSizeFixupFactor"
]
}
}
]
}
]
]
}
}
},
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Size": {
"List": [
"Divide",
[
{
"Simple": {
"Property": [
"Default",
"Size"
]
}
},
{
"Simple": {
"Property": [
"Default",
"PixelSizeFixupFactor"
]
}
}
]
]
}
}
}
]
}
}
]

View File

@@ -0,0 +1,49 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Disable hinting for Bitstream Vera fonts when the size is less than 8ppem</description>
<!--
The Bitstream Vera fonts have GASP entries suggesting that hinting be
disabled below 8 ppem, but FreeType ignores those, preferring to use
the data found in the instructed hints. The initial Vera release
didn't include the right instructions in the 'prep' table. Fix this
by disabling hinting manually at smaller sizes (< 8ppem)
-->
<match target="font">
<test name="family" compare="eq" ignore-blanks="true">
<string>Bitstream Vera Sans</string>
</test>
<test name="pixelsize" compare="less">
<double>7.5</double>
</test>
<edit name="hinting">
<bool>false</bool>
</edit>
</match>
<match target="font">
<test name="family" compare="eq" ignore-blanks="true">
<string>Bitstream Vera Serif</string>
</test>
<test name="pixelsize" compare="less">
<double>7.5</double>
</test>
<edit name="hinting">
<bool>false</bool>
</edit>
</match>
<match target="font">
<test name="family" compare="eq" ignore-blanks="true">
<string>Bitstream Vera Sans Mono</string>
</test>
<test name="pixelsize" compare="less">
<double>7.5</double>
</test>
<edit name="hinting">
<bool>false</bool>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,137 @@
[
{
"Description": "Disable hinting for Bitstream Vera fonts when the size is less than 8ppem"
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Bitstream Vera Sans"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Less",
"value": {
"PixelSize": {
"Simple": {
"Double": 7.5
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Hinting": {
"Simple": {
"Bool": false
}
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Bitstream Vera Serif"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Less",
"value": {
"PixelSize": {
"Simple": {
"Double": 7.5
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Hinting": {
"Simple": {
"Bool": false
}
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Bitstream Vera Sans Mono"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Less",
"value": {
"PixelSize": {
"Simple": {
"Double": 7.5
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Hinting": {
"Simple": {
"Bool": false
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,637 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set substitutions for similar/metric-compatible families</description>
<!--
Alias similar/metric-compatible families from various sources:
PostScript fonts: URW fonts: GUST fonts: Windows fonts:
====================== ================== ================= ==================
Helvetica Nimbus Sans TeX Gyre Heros
Helvetica Narrow Nimbus Sans Narrow TeX Gyre Heros Cn
Times Nimbus Roman TeX Gyre Termes
Courier Nimbus Mono PS TeX Gyre Cursor
ITC Avant Garde Gothic URW Gothic TeX Gyre Adventor
ITC Bookman URW Bookman TeX Gyre Bonum Bookman Old Style
ITC Zapf Chancery Z003 TeX Gyre Chorus
Palatino P052 TeX Gyre Pagella Palatino Linotype
New Century Schoolbook C059 TeX Gyre Schola Century Schoolbook
Microsoft fonts: Liberation fonts: Google CrOS core fonts: StarOffice fonts: AMT fonts:
================ ====================== ======================= ================= ==============
Arial Liberation Sans Arimo Albany Albany AMT
Arial Narrow Liberation Sans Narrow
Times New Roman Liberation Serif Tinos Thorndale Thorndale AMT
Courier New Liberation Mono Cousine Cumberland Cumberland AMT
Cambria Caladea
Calibri Carlito
Symbol SymbolNeu
Microsoft fonts: Other fonts:
================ ============
Georgia Gelasio
We want for each of them to fallback to any of these available,
but in an order preferring similar designs first. We do this in three steps:
1) Alias each specific to its generic family.
e.g. Liberation Sans to Arial
2) Weak alias each generic to the other generic of its family.
e.g. Arial to Helvetica
3) Alias each generic to its specifics.
e.g. Arial to Liberation Sans, Arimo, Albany, and Albany AMT
NOTE: The (URW)++ fonts mappings of generics to specifics were removed, because
upstream now includes them in their release of (URW)++ Core Font Set here:
https://github.com/ArtifexSoftware/urw-base35-fonts/tree/master/fontconfig
-->
<!-- Map specifics to generics -->
<!-- PostScript -->
<alias binding="same">
<family>Nimbus Sans L</family>
<default>
<family>Helvetica</family>
</default>
</alias>
<alias binding="same">
<family>Nimbus Sans</family>
<default>
<family>Helvetica</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Heros</family>
<default>
<family>Helvetica</family>
</default>
</alias>
<alias binding="same">
<family>Nimbus Sans Narrow</family>
<default>
<family>Helvetica Narrow</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Heros Cn</family>
<default>
<family>Helvetica Narrow</family>
</default>
</alias>
<alias binding="same">
<family>Nimbus Roman No9 L</family>
<default>
<family>Times</family>
</default>
</alias>
<alias binding="same">
<family>Nimbus Roman</family>
<default>
<family>Times</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Termes</family>
<default>
<family>Times</family>
</default>
</alias>
<alias binding="same">
<family>Nimbus Mono L</family>
<default>
<family>Courier</family>
</default>
</alias>
<alias binding="same">
<family>Nimbus Mono</family>
<default>
<family>Courier</family>
</default>
</alias>
<alias binding="same">
<family>Nimbus Mono PS</family>
<default>
<family>Courier</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Cursor</family>
<default>
<family>Courier</family>
</default>
</alias>
<alias binding="same">
<family>Avant Garde</family>
<default>
<family>ITC Avant Garde Gothic</family>
</default>
</alias>
<alias binding="same">
<family>URW Gothic L</family>
<default>
<family>ITC Avant Garde Gothic</family>
</default>
</alias>
<alias binding="same">
<family>URW Gothic</family>
<default>
<family>ITC Avant Garde Gothic</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Adventor</family>
<default>
<family>ITC Avant Garde Gothic</family>
</default>
</alias>
<alias binding="same">
<family>Bookman</family>
<default>
<family>ITC Bookman</family>
</default>
</alias>
<alias binding="same">
<family>URW Bookman L</family>
<default>
<family>ITC Bookman</family>
</default>
</alias>
<alias binding="same">
<family>Bookman URW</family>
<default>
<family>ITC Bookman</family>
</default>
</alias>
<alias binding="same">
<family>URW Bookman</family>
<default>
<family>ITC Bookman</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Bonum</family>
<default>
<family>ITC Bookman</family>
</default>
</alias>
<alias binding="same">
<family>Bookman Old Style</family>
<default>
<family>ITC Bookman</family>
</default>
</alias>
<alias binding="same">
<family>Zapf Chancery</family>
<default>
<family>ITC Zapf Chancery</family>
</default>
</alias>
<alias binding="same">
<family>URW Chancery L</family>
<default>
<family>ITC Zapf Chancery</family>
</default>
</alias>
<alias binding="same">
<family>Chancery URW</family>
<default>
<family>ITC Zapf Chancery</family>
</default>
</alias>
<alias binding="same">
<family>Z003</family>
<default>
<family>ITC Zapf Chancery</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Chorus</family>
<default>
<family>ITC Zapf Chancery</family>
</default>
</alias>
<alias binding="same">
<family>URW Palladio L</family>
<default>
<family>Palatino</family>
</default>
</alias>
<alias binding="same">
<family>Palladio URW</family>
<default>
<family>Palatino</family>
</default>
</alias>
<alias binding="same">
<family>P052</family>
<default>
<family>Palatino</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Pagella</family>
<default>
<family>Palatino</family>
</default>
</alias>
<alias binding="same">
<family>Palatino Linotype</family>
<default>
<family>Palatino</family>
</default>
</alias>
<alias binding="same">
<family>Century Schoolbook L</family>
<default>
<family>New Century Schoolbook</family>
</default>
</alias>
<alias binding="same">
<family>Century SchoolBook URW</family>
<default>
<family>New Century Schoolbook</family>
</default>
</alias>
<alias binding="same">
<family>C059</family>
<default>
<family>New Century Schoolbook</family>
</default>
</alias>
<alias binding="same">
<family>TeX Gyre Schola</family>
<default>
<family>New Century Schoolbook</family>
</default>
</alias>
<alias binding="same">
<family>Century Schoolbook</family>
<default>
<family>New Century Schoolbook</family>
</default>
</alias>
<!-- Microsoft -->
<alias binding="same">
<family>Arimo</family>
<default>
<family>Arial</family>
</default>
</alias>
<alias binding="same">
<family>Liberation Sans</family>
<default>
<family>Arial</family>
</default>
</alias>
<alias binding="same">
<family>Liberation Sans Narrow</family>
<default>
<family>Arial Narrow</family>
</default>
</alias>
<alias binding="same">
<family>Albany</family>
<default>
<family>Arial</family>
</default>
</alias>
<alias binding="same">
<family>Albany AMT</family>
<default>
<family>Arial</family>
</default>
</alias>
<alias binding="same">
<family>Tinos</family>
<default>
<family>Times New Roman</family>
</default>
</alias>
<alias binding="same">
<family>Liberation Serif</family>
<default>
<family>Times New Roman</family>
</default>
</alias>
<alias binding="same">
<family>Thorndale</family>
<default>
<family>Times New Roman</family>
</default>
</alias>
<alias binding="same">
<family>Thorndale AMT</family>
<default>
<family>Times New Roman</family>
</default>
</alias>
<alias binding="same">
<family>Cousine</family>
<default>
<family>Courier New</family>
</default>
</alias>
<alias binding="same">
<family>Liberation Mono</family>
<default>
<family>Courier New</family>
</default>
</alias>
<alias binding="same">
<family>Cumberland</family>
<default>
<family>Courier New</family>
</default>
</alias>
<alias binding="same">
<family>Cumberland AMT</family>
<default>
<family>Courier New</family>
</default>
</alias>
<alias binding="same">
<family>Gelasio</family>
<default>
<family>Georgia</family>
</default>
</alias>
<alias binding="same">
<family>Caladea</family>
<default>
<family>Cambria</family>
</default>
</alias>
<alias binding="same">
<family>Carlito</family>
<default>
<family>Calibri</family>
</default>
</alias>
<alias binding="same">
<family>SymbolNeu</family>
<default>
<family>Symbol</family>
</default>
</alias>
<!-- Accept the other group as fallback -->
<!-- PostScript -->
<alias>
<family>Helvetica</family>
<default>
<family>Arial</family>
</default>
</alias>
<alias>
<family>Helvetica Narrow</family>
<default>
<family>Arial Narrow</family>
</default>
</alias>
<alias>
<family>Times</family>
<default>
<family>Times New Roman</family>
</default>
</alias>
<alias>
<family>Courier</family>
<default>
<family>Courier New</family>
</default>
</alias>
<!-- Microsoft -->
<alias>
<family>Arial</family>
<default>
<family>Helvetica</family>
</default>
</alias>
<alias>
<family>Arial Narrow</family>
<default>
<family>Helvetica Narrow</family>
</default>
</alias>
<alias>
<family>Times New Roman</family>
<default>
<family>Times</family>
</default>
</alias>
<alias>
<family>Courier New</family>
<default>
<family>Courier</family>
</default>
</alias>
<!-- Map generics to specifics -->
<!-- PostScript -->
<alias binding="same">
<family>Helvetica</family>
<accept>
<family>TeX Gyre Heros</family>
</accept>
</alias>
<alias binding="same">
<family>Helvetica Narrow</family>
<accept>
<family>TeX Gyre Heros Cn</family>
</accept>
</alias>
<alias binding="same">
<family>Times</family>
<accept>
<family>TeX Gyre Termes</family>
</accept>
</alias>
<alias binding="same">
<family>Courier</family>
<accept>
<family>TeX Gyre Cursor</family>
</accept>
</alias>
<alias binding="same">
<family>Courier Std</family>
<accept>
<family>Courier</family>
</accept>
</alias>
<alias binding="same">
<family>ITC Avant Garde Gothic</family>
<accept>
<family>TeX Gyre Adventor</family>
</accept>
</alias>
<alias binding="same">
<family>ITC Bookman</family>
<accept>
<family>Bookman Old Style</family>
<family>TeX Gyre Bonum</family>
</accept>
</alias>
<alias binding="same">
<family>ITC Zapf Chancery</family>
<accept>
<family>TeX Gyre Chorus</family>
</accept>
</alias>
<alias binding="same">
<family>Palatino</family>
<accept>
<family>Palatino Linotype</family>
<family>TeX Gyre Pagella</family>
</accept>
</alias>
<alias binding="same">
<family>New Century Schoolbook</family>
<accept>
<family>Century Schoolbook</family>
<family>TeX Gyre Schola</family>
</accept>
</alias>
<!-- Microsoft -->
<alias binding="same">
<family>Arial</family>
<accept>
<family>Arimo</family>
<family>Liberation Sans</family>
<family>Albany</family>
<family>Albany AMT</family>
</accept>
</alias>
<alias binding="same">
<family>Arial Narrow</family>
<accept>
<family>Liberation Sans Narrow</family>
</accept>
</alias>
<alias binding="same">
<family>Times New Roman</family>
<accept>
<family>Tinos</family>
<family>Liberation Serif</family>
<family>Thorndale</family>
<family>Thorndale AMT</family>
</accept>
</alias>
<alias binding="same">
<family>Courier New</family>
<accept>
<family>Cousine</family>
<family>Liberation Mono</family>
<family>Cumberland</family>
<family>Cumberland AMT</family>
</accept>
</alias>
<alias binding="same">
<family>Georgia</family>
<accept>
<family>Gelasio</family>
</accept>
</alias>
<alias binding="same">
<family>Cambria</family>
<accept>
<family>Caladea</family>
</accept>
</alias>
<alias binding="same">
<family>Calibri</family>
<accept>
<family>Carlito</family>
</accept>
</alias>
<alias binding="same">
<family>Symbol</family>
<accept>
<family>SymbolNeu</family>
</accept>
</alias>
</fontconfig>

View File

@@ -0,0 +1,817 @@
[
{
"Description": "Set substitutions for similar/metric-compatible families"
},
{
"Alias": {
"alias": "Nimbus Sans L",
"prefer": [],
"accept": [],
"default": [
"Helvetica"
]
}
},
{
"Alias": {
"alias": "Nimbus Sans",
"prefer": [],
"accept": [],
"default": [
"Helvetica"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Heros",
"prefer": [],
"accept": [],
"default": [
"Helvetica"
]
}
},
{
"Alias": {
"alias": "Nimbus Sans Narrow",
"prefer": [],
"accept": [],
"default": [
"Helvetica Narrow"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Heros Cn",
"prefer": [],
"accept": [],
"default": [
"Helvetica Narrow"
]
}
},
{
"Alias": {
"alias": "Nimbus Roman No9 L",
"prefer": [],
"accept": [],
"default": [
"Times"
]
}
},
{
"Alias": {
"alias": "Nimbus Roman",
"prefer": [],
"accept": [],
"default": [
"Times"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Termes",
"prefer": [],
"accept": [],
"default": [
"Times"
]
}
},
{
"Alias": {
"alias": "Nimbus Mono L",
"prefer": [],
"accept": [],
"default": [
"Courier"
]
}
},
{
"Alias": {
"alias": "Nimbus Mono",
"prefer": [],
"accept": [],
"default": [
"Courier"
]
}
},
{
"Alias": {
"alias": "Nimbus Mono PS",
"prefer": [],
"accept": [],
"default": [
"Courier"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Cursor",
"prefer": [],
"accept": [],
"default": [
"Courier"
]
}
},
{
"Alias": {
"alias": "Avant Garde",
"prefer": [],
"accept": [],
"default": [
"ITC Avant Garde Gothic"
]
}
},
{
"Alias": {
"alias": "URW Gothic L",
"prefer": [],
"accept": [],
"default": [
"ITC Avant Garde Gothic"
]
}
},
{
"Alias": {
"alias": "URW Gothic",
"prefer": [],
"accept": [],
"default": [
"ITC Avant Garde Gothic"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Adventor",
"prefer": [],
"accept": [],
"default": [
"ITC Avant Garde Gothic"
]
}
},
{
"Alias": {
"alias": "Bookman",
"prefer": [],
"accept": [],
"default": [
"ITC Bookman"
]
}
},
{
"Alias": {
"alias": "URW Bookman L",
"prefer": [],
"accept": [],
"default": [
"ITC Bookman"
]
}
},
{
"Alias": {
"alias": "Bookman URW",
"prefer": [],
"accept": [],
"default": [
"ITC Bookman"
]
}
},
{
"Alias": {
"alias": "URW Bookman",
"prefer": [],
"accept": [],
"default": [
"ITC Bookman"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Bonum",
"prefer": [],
"accept": [],
"default": [
"ITC Bookman"
]
}
},
{
"Alias": {
"alias": "Bookman Old Style",
"prefer": [],
"accept": [],
"default": [
"ITC Bookman"
]
}
},
{
"Alias": {
"alias": "Zapf Chancery",
"prefer": [],
"accept": [],
"default": [
"ITC Zapf Chancery"
]
}
},
{
"Alias": {
"alias": "URW Chancery L",
"prefer": [],
"accept": [],
"default": [
"ITC Zapf Chancery"
]
}
},
{
"Alias": {
"alias": "Chancery URW",
"prefer": [],
"accept": [],
"default": [
"ITC Zapf Chancery"
]
}
},
{
"Alias": {
"alias": "Z003",
"prefer": [],
"accept": [],
"default": [
"ITC Zapf Chancery"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Chorus",
"prefer": [],
"accept": [],
"default": [
"ITC Zapf Chancery"
]
}
},
{
"Alias": {
"alias": "URW Palladio L",
"prefer": [],
"accept": [],
"default": [
"Palatino"
]
}
},
{
"Alias": {
"alias": "Palladio URW",
"prefer": [],
"accept": [],
"default": [
"Palatino"
]
}
},
{
"Alias": {
"alias": "P052",
"prefer": [],
"accept": [],
"default": [
"Palatino"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Pagella",
"prefer": [],
"accept": [],
"default": [
"Palatino"
]
}
},
{
"Alias": {
"alias": "Palatino Linotype",
"prefer": [],
"accept": [],
"default": [
"Palatino"
]
}
},
{
"Alias": {
"alias": "Century Schoolbook L",
"prefer": [],
"accept": [],
"default": [
"New Century Schoolbook"
]
}
},
{
"Alias": {
"alias": "Century SchoolBook URW",
"prefer": [],
"accept": [],
"default": [
"New Century Schoolbook"
]
}
},
{
"Alias": {
"alias": "C059",
"prefer": [],
"accept": [],
"default": [
"New Century Schoolbook"
]
}
},
{
"Alias": {
"alias": "TeX Gyre Schola",
"prefer": [],
"accept": [],
"default": [
"New Century Schoolbook"
]
}
},
{
"Alias": {
"alias": "Century Schoolbook",
"prefer": [],
"accept": [],
"default": [
"New Century Schoolbook"
]
}
},
{
"Alias": {
"alias": "Arimo",
"prefer": [],
"accept": [],
"default": [
"Arial"
]
}
},
{
"Alias": {
"alias": "Liberation Sans",
"prefer": [],
"accept": [],
"default": [
"Arial"
]
}
},
{
"Alias": {
"alias": "Liberation Sans Narrow",
"prefer": [],
"accept": [],
"default": [
"Arial Narrow"
]
}
},
{
"Alias": {
"alias": "Albany",
"prefer": [],
"accept": [],
"default": [
"Arial"
]
}
},
{
"Alias": {
"alias": "Albany AMT",
"prefer": [],
"accept": [],
"default": [
"Arial"
]
}
},
{
"Alias": {
"alias": "Tinos",
"prefer": [],
"accept": [],
"default": [
"Times New Roman"
]
}
},
{
"Alias": {
"alias": "Liberation Serif",
"prefer": [],
"accept": [],
"default": [
"Times New Roman"
]
}
},
{
"Alias": {
"alias": "Thorndale",
"prefer": [],
"accept": [],
"default": [
"Times New Roman"
]
}
},
{
"Alias": {
"alias": "Thorndale AMT",
"prefer": [],
"accept": [],
"default": [
"Times New Roman"
]
}
},
{
"Alias": {
"alias": "Cousine",
"prefer": [],
"accept": [],
"default": [
"Courier New"
]
}
},
{
"Alias": {
"alias": "Liberation Mono",
"prefer": [],
"accept": [],
"default": [
"Courier New"
]
}
},
{
"Alias": {
"alias": "Cumberland",
"prefer": [],
"accept": [],
"default": [
"Courier New"
]
}
},
{
"Alias": {
"alias": "Cumberland AMT",
"prefer": [],
"accept": [],
"default": [
"Courier New"
]
}
},
{
"Alias": {
"alias": "Gelasio",
"prefer": [],
"accept": [],
"default": [
"Georgia"
]
}
},
{
"Alias": {
"alias": "Caladea",
"prefer": [],
"accept": [],
"default": [
"Cambria"
]
}
},
{
"Alias": {
"alias": "Carlito",
"prefer": [],
"accept": [],
"default": [
"Calibri"
]
}
},
{
"Alias": {
"alias": "SymbolNeu",
"prefer": [],
"accept": [],
"default": [
"Symbol"
]
}
},
{
"Alias": {
"alias": "Helvetica",
"prefer": [],
"accept": [],
"default": [
"Arial"
]
}
},
{
"Alias": {
"alias": "Helvetica Narrow",
"prefer": [],
"accept": [],
"default": [
"Arial Narrow"
]
}
},
{
"Alias": {
"alias": "Times",
"prefer": [],
"accept": [],
"default": [
"Times New Roman"
]
}
},
{
"Alias": {
"alias": "Courier",
"prefer": [],
"accept": [],
"default": [
"Courier New"
]
}
},
{
"Alias": {
"alias": "Arial",
"prefer": [],
"accept": [],
"default": [
"Helvetica"
]
}
},
{
"Alias": {
"alias": "Arial Narrow",
"prefer": [],
"accept": [],
"default": [
"Helvetica Narrow"
]
}
},
{
"Alias": {
"alias": "Times New Roman",
"prefer": [],
"accept": [],
"default": [
"Times"
]
}
},
{
"Alias": {
"alias": "Courier New",
"prefer": [],
"accept": [],
"default": [
"Courier"
]
}
},
{
"Alias": {
"alias": "Helvetica",
"prefer": [],
"accept": [
"TeX Gyre Heros"
],
"default": []
}
},
{
"Alias": {
"alias": "Helvetica Narrow",
"prefer": [],
"accept": [
"TeX Gyre Heros Cn"
],
"default": []
}
},
{
"Alias": {
"alias": "Times",
"prefer": [],
"accept": [
"TeX Gyre Termes"
],
"default": []
}
},
{
"Alias": {
"alias": "Courier",
"prefer": [],
"accept": [
"TeX Gyre Cursor"
],
"default": []
}
},
{
"Alias": {
"alias": "Courier Std",
"prefer": [],
"accept": [
"Courier"
],
"default": []
}
},
{
"Alias": {
"alias": "ITC Avant Garde Gothic",
"prefer": [],
"accept": [
"TeX Gyre Adventor"
],
"default": []
}
},
{
"Alias": {
"alias": "ITC Bookman",
"prefer": [],
"accept": [
"Bookman Old Style",
"TeX Gyre Bonum"
],
"default": []
}
},
{
"Alias": {
"alias": "ITC Zapf Chancery",
"prefer": [],
"accept": [
"TeX Gyre Chorus"
],
"default": []
}
},
{
"Alias": {
"alias": "Palatino",
"prefer": [],
"accept": [
"Palatino Linotype",
"TeX Gyre Pagella"
],
"default": []
}
},
{
"Alias": {
"alias": "New Century Schoolbook",
"prefer": [],
"accept": [
"Century Schoolbook",
"TeX Gyre Schola"
],
"default": []
}
},
{
"Alias": {
"alias": "Arial",
"prefer": [],
"accept": [
"Arimo",
"Liberation Sans",
"Albany",
"Albany AMT"
],
"default": []
}
},
{
"Alias": {
"alias": "Arial Narrow",
"prefer": [],
"accept": [
"Liberation Sans Narrow"
],
"default": []
}
},
{
"Alias": {
"alias": "Times New Roman",
"prefer": [],
"accept": [
"Tinos",
"Liberation Serif",
"Thorndale",
"Thorndale AMT"
],
"default": []
}
},
{
"Alias": {
"alias": "Courier New",
"prefer": [],
"accept": [
"Cousine",
"Liberation Mono",
"Cumberland",
"Cumberland AMT"
],
"default": []
}
},
{
"Alias": {
"alias": "Georgia",
"prefer": [],
"accept": [
"Gelasio"
],
"default": []
}
},
{
"Alias": {
"alias": "Cambria",
"prefer": [],
"accept": [
"Caladea"
],
"default": []
}
},
{
"Alias": {
"alias": "Calibri",
"prefer": [],
"accept": [
"Carlito"
],
"default": []
}
},
{
"Alias": {
"alias": "Symbol",
"prefer": [],
"accept": [
"SymbolNeu"
],
"default": []
}
}
]

View File

@@ -0,0 +1,332 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set substitutions for non-Latin fonts</description>
<!--
Mark common families with their generics so we'll get
something reasonable
-->
<!--
Serif faces
-->
<alias>
<family>Nazli</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Lotoos</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Mitra</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Ferdosi</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Badr</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Zar</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Titr</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Jadid</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Kochi Mincho</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>AR PL SungtiL GB</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>AR PL Mingti2L Big5</family>
<default><family>serif</family></default>
</alias>
<alias>
<family> 明朝</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>NanumMyeongjo</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>UnBatang</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Baekmuk Batang</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>MgOpen Canonica</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Sazanami Mincho</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>AR PL ZenKai Uni</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>ZYSong18030</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>FreeSerif</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>SimSun</family>
<default><family>serif</family></default>
</alias>
<!--
Sans-serif faces
-->
<alias>
<family>Arshia</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Elham</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Farnaz</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Nasim</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Sina</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Roya</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Koodak</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Terafik</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Kochi Gothic</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>AR PL KaitiM GB</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>AR PL KaitiM Big5</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family> ゴシック</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>NanumGothic</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>UnDotum</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Baekmuk Dotum</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>MgOpen Modata</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Sazanami Gothic</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>AR PL ShanHeiSun Uni</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>ZYSong18030</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>FreeSans</family>
<default><family>sans-serif</family></default>
</alias>
<!--
Monospace faces
-->
<alias>
<family>NSimSun</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>ZYSong18030</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>NanumGothicCoding</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>FreeMono</family>
<default><family>monospace</family></default>
</alias>
<!--
Fantasy faces
-->
<alias>
<family>Homa</family>
<default><family>fantasy</family></default>
</alias>
<alias>
<family>Kamran</family>
<default><family>fantasy</family></default>
</alias>
<alias>
<family>Fantezi</family>
<default><family>fantasy</family></default>
</alias>
<alias>
<family>Tabassom</family>
<default><family>fantasy</family></default>
</alias>
<!--
Cursive faces
-->
<alias>
<family>IranNastaliq</family>
<default><family>cursive</family></default>
</alias>
<alias>
<family>Nafees Nastaleeq</family>
<default><family>cursive</family></default>
</alias>
<!--
system-ui
-->
<alias>
<family>Noto Sans Arabic UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Bengali UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Devanagari UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Gujarati UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Gurmukhi UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Kannada UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Khmer UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Lao UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Malayalam UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Myanmar UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Oriya UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Sinhala UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Tamil UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Telugu UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans Thai UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Leelawadee UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Nirmala UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Yu Gothic UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Meiryo UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>MS UI Gothic</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Khmer UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Lao UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Microsoft JhengHei UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Microsoft YaHei UI</family>
<default><family>system-ui</family></default>
</alias>
</fontconfig>

View File

@@ -0,0 +1,755 @@
[
{
"Description": "Set substitutions for non-Latin fonts"
},
{
"Alias": {
"alias": "Nazli",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Lotoos",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Mitra",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Ferdosi",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Badr",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Zar",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Titr",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Jadid",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Kochi Mincho",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "AR PL SungtiL GB",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "AR PL Mingti2L Big5",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": " 明朝",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "NanumMyeongjo",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "UnBatang",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Baekmuk Batang",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "MgOpen Canonica",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Sazanami Mincho",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "AR PL ZenKai Uni",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "ZYSong18030",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "FreeSerif",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "SimSun",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Arshia",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Elham",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Farnaz",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Nasim",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Sina",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Roya",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Koodak",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Terafik",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Kochi Gothic",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "AR PL KaitiM GB",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "AR PL KaitiM Big5",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": " ゴシック",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "NanumGothic",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "UnDotum",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Baekmuk Dotum",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "MgOpen Modata",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Sazanami Gothic",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "AR PL ShanHeiSun Uni",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "ZYSong18030",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "FreeSans",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "NSimSun",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "ZYSong18030",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "NanumGothicCoding",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "FreeMono",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Homa",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "Kamran",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "Fantezi",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "Tabassom",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "IranNastaliq",
"prefer": [],
"accept": [],
"default": [
"cursive"
]
}
},
{
"Alias": {
"alias": "Nafees Nastaleeq",
"prefer": [],
"accept": [],
"default": [
"cursive"
]
}
},
{
"Alias": {
"alias": "Noto Sans Arabic UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Bengali UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Devanagari UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Gujarati UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Gurmukhi UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Kannada UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Khmer UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Lao UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Malayalam UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Myanmar UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Oriya UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Sinhala UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Tamil UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Telugu UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans Thai UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Leelawadee UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Nirmala UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Yu Gothic UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Meiryo UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "MS UI Gothic",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Khmer UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Lao UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Microsoft JhengHei UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Microsoft YaHei UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
}
]

View File

@@ -0,0 +1,136 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set substitutions for emoji/math fonts</description>
<!-- Keep in sync with 60-generic.conf -->
<!-- Emoji -->
<!-- System emoji -->
<alias binding="same">
<family>Noto Color Emoji</family> <!-- Google -->
<default><family>emoji</family></default>
</alias>
<alias binding="same">
<family>Apple Color Emoji</family> <!-- Apple -->
<default><family>emoji</family></default>
</alias>
<alias binding="same">
<family>Segoe UI Emoji</family> <!-- Microsoft -->
<default><family>emoji</family></default>
</alias>
<alias binding="same">
<family>Twitter Color Emoji</family> <!-- Twitter -->
<default><family>emoji</family></default>
</alias>
<alias binding="same">
<family>EmojiOne Mozilla</family> <!-- Mozilla -->
<default><family>emoji</family></default>
</alias>
<!-- Third-party emoji -->
<alias binding="same">
<family>Emoji Two</family>
<default><family>emoji</family></default>
</alias>
<alias binding="same">
<family>JoyPixels</family>
<default><family>emoji</family></default>
</alias>
<alias binding="same">
<family>Emoji One</family>
<default><family>emoji</family></default>
</alias>
<!-- B&W -->
<alias binding="same">
<family>Noto Emoji</family> <!-- Google -->
<default><family>emoji</family></default>
</alias>
<alias binding="same">
<family>Android Emoji</family> <!-- Google -->
<default><family>emoji</family></default>
</alias>
<!-- Add language for emoji, to match other emoji fonts. -->
<match>
<test name="family">
<string>emoji</string>
</test>
<edit name="lang" mode="prepend">
<string>und-zsye</string>
</edit>
</match>
<match>
<test name="lang">
<string>und-zsye</string>
</test>
<test qual="all" name="family" compare="not_eq">
<string>emoji</string>
</test>
<!-- Add generic family. -->
<edit name="family" mode="append" binding="strong">
<string>emoji</string>
</edit>
</match>
<!-- Math -->
<!-- https://en.wikipedia.org/wiki/Category:Mathematical_OpenType_typefaces -->
<alias binding="same">
<family>XITS Math</family> <!-- Khaled Hosny -->
<default><family>math</family></default>
</alias>
<alias binding="same">
<family>STIX Two Math</family> <!-- AMS -->
<default><family>math</family></default>
</alias>
<alias binding="same">
<family>Cambria Math</family> <!-- Microsoft -->
<default><family>math</family></default>
</alias>
<alias binding="same">
<family>Latin Modern Math</family> <!-- TeX -->
<default><family>math</family></default>
</alias>
<alias binding="same">
<family>Minion Math</family> <!-- Adobe -->
<default><family>math</family></default>
</alias>
<alias binding="same">
<family>Lucida Math</family> <!-- Adobe -->
<default><family>math</family></default>
</alias>
<alias binding="same">
<family>Asana Math</family>
<default><family>math</family></default>
</alias>
<!-- Add language for math, to match other math fonts. -->
<match>
<test name="family">
<string>math</string>
</test>
<edit name="lang" mode="prepend">
<string>und-zmth</string>
</edit>
</match>
<match>
<test name="lang">
<string>und-zmth</string>
</test>
<test qual="all" name="family" compare="not_eq">
<string>math</string>
</test>
<!-- Add generic family -->
<edit name="family" mode="append" binding="strong">
<string>math</string>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,327 @@
[
{
"Description": "Set substitutions for emoji/math fonts"
},
{
"Alias": {
"alias": "Noto Color Emoji",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "Apple Color Emoji",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "Segoe UI Emoji",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "Twitter Color Emoji",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "EmojiOne Mozilla",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "Emoji Two",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "JoyPixels",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "Emoji One",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "Noto Emoji",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Alias": {
"alias": "Android Emoji",
"prefer": [],
"accept": [],
"default": [
"emoji"
]
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "emoji"
}
}
}
}
],
"edits": [
{
"mode": "Prepend",
"binding": "Weak",
"value": {
"Lang": {
"Simple": {
"String": "und-zsye"
}
}
}
}
]
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Lang": {
"Simple": {
"String": "und-zsye"
}
}
}
},
{
"qual": "All",
"target": "Default",
"compare": "NotEq",
"value": {
"Family": {
"Simple": {
"String": "emoji"
}
}
}
}
],
"edits": [
{
"mode": "Append",
"binding": "Strong",
"value": {
"Family": {
"Simple": {
"String": "emoji"
}
}
}
}
]
}
},
{
"Alias": {
"alias": "XITS Math",
"prefer": [],
"accept": [],
"default": [
"math"
]
}
},
{
"Alias": {
"alias": "STIX Two Math",
"prefer": [],
"accept": [],
"default": [
"math"
]
}
},
{
"Alias": {
"alias": "Cambria Math",
"prefer": [],
"accept": [],
"default": [
"math"
]
}
},
{
"Alias": {
"alias": "Latin Modern Math",
"prefer": [],
"accept": [],
"default": [
"math"
]
}
},
{
"Alias": {
"alias": "Minion Math",
"prefer": [],
"accept": [],
"default": [
"math"
]
}
},
{
"Alias": {
"alias": "Lucida Math",
"prefer": [],
"accept": [],
"default": [
"math"
]
}
},
{
"Alias": {
"alias": "Asana Math",
"prefer": [],
"accept": [],
"default": [
"math"
]
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "math"
}
}
}
}
],
"edits": [
{
"mode": "Prepend",
"binding": "Weak",
"value": {
"Lang": {
"Simple": {
"String": "und-zmth"
}
}
}
}
]
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Lang": {
"Simple": {
"String": "und-zmth"
}
}
}
},
{
"qual": "All",
"target": "Default",
"compare": "NotEq",
"value": {
"Family": {
"Simple": {
"String": "math"
}
}
}
}
],
"edits": [
{
"mode": "Append",
"binding": "Strong",
"value": {
"Family": {
"Simple": {
"String": "math"
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,301 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set substitutions for Latin fonts</description>
<!--
Mark common families with their generics so we'll get
something reasonable
-->
<!--
Serif faces
-->
<alias>
<family>Bitstream Vera Serif</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Cambria</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Constantia</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>DejaVu Serif</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Elephant</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Garamond</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Georgia</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Liberation Serif</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Luxi Serif</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>MS Serif</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Nimbus Roman No9 L</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Nimbus Roman</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Palatino Linotype</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Thorndale AMT</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Thorndale</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Times New Roman</family>
<default><family>serif</family></default>
</alias>
<alias>
<family>Times</family>
<default><family>serif</family></default>
</alias>
<!--
Sans-serif faces
-->
<alias>
<family>Albany AMT</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Albany</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Arial Unicode MS</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Arial</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Bitstream Vera Sans</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Britannic</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Calibri</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Candara</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Century Gothic</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Corbel</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>DejaVu Sans</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Helvetica</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Haettenschweiler</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Liberation Sans</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>MS Sans Serif</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Nimbus Sans L</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Nimbus Sans</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Luxi Sans</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Tahoma</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Trebuchet MS</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Twentieth Century</family>
<default><family>sans-serif</family></default>
</alias>
<alias>
<family>Verdana</family>
<default><family>sans-serif</family></default>
</alias>
<!--
Monospace faces
-->
<alias>
<family>Andale Mono</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Bitstream Vera Sans Mono</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Consolas</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Courier New</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Courier</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Courier Std</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Cumberland AMT</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Cumberland</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>DejaVu Sans Mono</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Fixedsys</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Inconsolata</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Liberation Mono</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Luxi Mono</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Nimbus Mono L</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Nimbus Mono</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Nimbus Mono PS</family>
<default><family>monospace</family></default>
</alias>
<alias>
<family>Terminal</family>
<default><family>monospace</family></default>
</alias>
<!--
Fantasy faces
-->
<alias>
<family>Bauhaus Std</family>
<default><family>fantasy</family></default>
</alias>
<alias>
<family>Cooper Std</family>
<default><family>fantasy</family></default>
</alias>
<alias>
<family>Copperplate Gothic Std</family>
<default><family>fantasy</family></default>
</alias>
<alias>
<family>Impact</family>
<default><family>fantasy</family></default>
</alias>
<!--
Cursive faces
-->
<alias>
<family>Comic Sans MS</family>
<default><family>cursive</family></default>
</alias>
<alias>
<family>ITC Zapf Chancery Std</family>
<default><family>cursive</family></default>
</alias>
<alias>
<family>Zapfino</family>
<default><family>cursive</family></default>
</alias>
<!--
system-ui
-->
<alias>
<family>Cantarell</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Noto Sans UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Segoe UI</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Segoe UI Historic</family>
<default><family>system-ui</family></default>
</alias>
<alias>
<family>Segoe UI Symbol</family>
<default><family>system-ui</family></default>
</alias>
</fontconfig>

View File

@@ -0,0 +1,685 @@
[
{
"Description": "Set substitutions for Latin fonts"
},
{
"Alias": {
"alias": "Bitstream Vera Serif",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Cambria",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Constantia",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "DejaVu Serif",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Elephant",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Garamond",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Georgia",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Liberation Serif",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Luxi Serif",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "MS Serif",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Nimbus Roman No9 L",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Nimbus Roman",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Palatino Linotype",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Thorndale AMT",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Thorndale",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Times New Roman",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Times",
"prefer": [],
"accept": [],
"default": [
"serif"
]
}
},
{
"Alias": {
"alias": "Albany AMT",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Albany",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Arial Unicode MS",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Arial",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Bitstream Vera Sans",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Britannic",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Calibri",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Candara",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Century Gothic",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Corbel",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "DejaVu Sans",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Helvetica",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Haettenschweiler",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Liberation Sans",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "MS Sans Serif",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Nimbus Sans L",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Nimbus Sans",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Luxi Sans",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Tahoma",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Trebuchet MS",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Twentieth Century",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Verdana",
"prefer": [],
"accept": [],
"default": [
"sans-serif"
]
}
},
{
"Alias": {
"alias": "Andale Mono",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Bitstream Vera Sans Mono",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Consolas",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Courier New",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Courier",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Courier Std",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Cumberland AMT",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Cumberland",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "DejaVu Sans Mono",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Fixedsys",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Inconsolata",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Liberation Mono",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Luxi Mono",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Nimbus Mono L",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Nimbus Mono",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Nimbus Mono PS",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Terminal",
"prefer": [],
"accept": [],
"default": [
"monospace"
]
}
},
{
"Alias": {
"alias": "Bauhaus Std",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "Cooper Std",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "Copperplate Gothic Std",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "Impact",
"prefer": [],
"accept": [],
"default": [
"fantasy"
]
}
},
{
"Alias": {
"alias": "Comic Sans MS",
"prefer": [],
"accept": [],
"default": [
"cursive"
]
}
},
{
"Alias": {
"alias": "ITC Zapf Chancery Std",
"prefer": [],
"accept": [],
"default": [
"cursive"
]
}
},
{
"Alias": {
"alias": "Zapfino",
"prefer": [],
"accept": [],
"default": [
"cursive"
]
}
},
{
"Alias": {
"alias": "Cantarell",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Noto Sans UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Segoe UI",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Segoe UI Historic",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
},
{
"Alias": {
"alias": "Segoe UI Symbol",
"prefer": [],
"accept": [],
"default": [
"system-ui"
]
}
}
]

View File

@@ -0,0 +1,22 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Add sans-serif to the family when no generic name</description>
<!--
If the font still has no generic name, add sans-serif
-->
<match target="pattern">
<test qual="all" name="family" compare="not_eq">
<string>sans-serif</string>
</test>
<test qual="all" name="family" compare="not_eq">
<string>serif</string>
</test>
<test qual="all" name="family" compare="not_eq">
<string>monospace</string>
</test>
<edit name="family" mode="append_last">
<string>sans-serif</string>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,61 @@
[
{
"Description": "Add sans-serif to the family when no generic name"
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "All",
"target": "Default",
"compare": "NotEq",
"value": {
"Family": {
"Simple": {
"String": "sans-serif"
}
}
}
},
{
"qual": "All",
"target": "Default",
"compare": "NotEq",
"value": {
"Family": {
"Simple": {
"String": "serif"
}
}
}
},
{
"qual": "All",
"target": "Default",
"compare": "NotEq",
"value": {
"Family": {
"Simple": {
"String": "monospace"
}
}
}
}
],
"edits": [
{
"mode": "AppendLast",
"binding": "Weak",
"value": {
"Family": {
"Simple": {
"String": "sans-serif"
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Load per-user customization files</description>
<!--
Load per-user customization files where stored on XDG Base Directory
specification compliant places. it should be usually:
$HOME/.config/fontconfig/conf.d
$HOME/.config/fontconfig/fonts.conf
-->
</fontconfig>

View File

@@ -0,0 +1,5 @@
[
{
"Description": "Load per-user customization files"
}
]

View File

@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Load local customization file</description>
<!-- Load local system customization file -->
<include ignore_missing="yes">local.conf</include>
</fontconfig>

View File

@@ -0,0 +1,12 @@
[
{
"Description": "Load local customization file"
},
{
"Include": {
"prefix": "Default",
"ignore_missing": true,
"path": "local.conf"
}
}
]

View File

@@ -0,0 +1,42 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
<!-- Default fonts -->
<alias binding="same">
<family>sans-serif</family>
<prefer>
<family>DejaVu Sans</family>
</prefer>
</alias>
<alias binding="same">
<family>serif</family>
<prefer>
<family>DejaVu Serif</family>
</prefer>
</alias>
<alias binding="same">
<family>monospace</family>
<prefer>
<family>DejaVu Sans Mono</family>
</prefer>
</alias>
<alias binding="same">
<family>emoji</family>
<prefer>
<family>Noto Color Emoji</family>
</prefer>
</alias>
</fontconfig>

View File

@@ -0,0 +1,42 @@
[
{
"Alias": {
"alias": "sans-serif",
"prefer": [
"DejaVu Sans"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "serif",
"prefer": [
"DejaVu Serif"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "monospace",
"prefer": [
"DejaVu Sans Mono"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "emoji",
"prefer": [
"Noto Color Emoji"
],
"accept": [],
"default": []
}
}
]

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<!-- Reject Type 1 fonts -->
<selectfont>
<rejectfont>
<pattern>
<patelt name="fontformat"><string>Type 1</string></patelt>
</pattern>
</rejectfont>
</selectfont>
</fontconfig>

View File

@@ -0,0 +1,20 @@
[
{
"SelectFont": {
"rejects": [
{
"Pattern": [
{
"Fontformat": {
"Simple": {
"String": "Type 1"
}
}
}
]
}
],
"accepts": []
}
}
]

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<!-- Use embedded bitmaps in fonts like Calibri? -->
<match target="font">
<edit name="embeddedbitmap" mode="assign">
<bool>false</bool>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,21 @@
[
{
"Match": {
"target": "Font",
"tests": [],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Embeddedbitmap": {
"Simple": {
"Bool": false
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,64 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set preferable fonts for emoji/math fonts</description>
<!-- Keep in sync with 45-generic.conf -->
<!-- Emoji -->
<!-- Prefer to match color emoji font. -->
<match>
<test name="lang">
<string>und-zsye</string>
</test>
<test qual="all" name="color" compare="not_eq">
<bool>true</bool>
</test>
<test qual="all" name="color" compare="not_eq">
<bool>false</bool>
</test>
<edit name="color" mode="append">
<bool>true</bool>
</edit>
</match>
<!-- TODO
! Match on "color" and alias B&W ones first if no color is requested.
! That's "hard" because <alias> doesn't work in match and needs to be
! expanded to its non-sugar form.
!-->
<alias binding="same">
<family>emoji</family>
<prefer>
<!-- System fonts -->
<family>Noto Color Emoji</family> <!-- Google -->
<family>Apple Color Emoji</family> <!-- Apple -->
<family>Segoe UI Emoji</family> <!-- Microsoft -->
<family>Twitter Color Emoji</family> <!-- Twitter -->
<family>EmojiOne Mozilla</family> <!-- Mozilla -->
<!-- Third-Party fonts -->
<family>Emoji Two</family>
<family>JoyPixels</family>
<family>Emoji One</family>
<!-- Non-color -->
<family>Noto Emoji</family> <!-- Google -->
<family>Android Emoji</family> <!-- Google -->
</prefer>
</alias>
<!-- Math -->
<alias binding="same">
<!-- https://en.wikipedia.org/wiki/Category:Mathematical_OpenType_typefaces -->
<family>math</family>
<prefer>
<family>XITS Math</family> <!-- Khaled Hosny -->
<family>STIX Two Math</family> <!-- AMS -->
<family>Cambria Math</family> <!-- Microsoft -->
<family>Latin Modern Math</family> <!-- TeX -->
<family>Minion Math</family> <!-- Adobe -->
<family>Lucida Math</family> <!-- Adobe -->
<family>Asana Math</family>
</prefer>
</alias>
</fontconfig>

View File

@@ -0,0 +1,96 @@
[
{
"Description": "Set preferable fonts for emoji/math fonts"
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Lang": {
"Simple": {
"String": "und-zsye"
}
}
}
},
{
"qual": "All",
"target": "Default",
"compare": "NotEq",
"value": {
"Color": {
"Simple": {
"Bool": true
}
}
}
},
{
"qual": "All",
"target": "Default",
"compare": "NotEq",
"value": {
"Color": {
"Simple": {
"Bool": false
}
}
}
}
],
"edits": [
{
"mode": "Append",
"binding": "Weak",
"value": {
"Color": {
"Simple": {
"Bool": true
}
}
}
}
]
}
},
{
"Alias": {
"alias": "emoji",
"prefer": [
"Noto Color Emoji",
"Apple Color Emoji",
"Segoe UI Emoji",
"Twitter Color Emoji",
"EmojiOne Mozilla",
"Emoji Two",
"JoyPixels",
"Emoji One",
"Noto Emoji",
"Android Emoji"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "math",
"prefer": [
"XITS Math",
"STIX Two Math",
"Cambria Math",
"Latin Modern Math",
"Minion Math",
"Lucida Math",
"Asana Math"
],
"accept": [],
"default": []
}
}
]

View File

@@ -0,0 +1,85 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set preferable fonts for Latin</description>
<alias>
<family>serif</family>
<prefer>
<family>DejaVu Serif</family>
<family>Times New Roman</family>
<family>Thorndale AMT</family>
<family>Luxi Serif</family>
<family>Nimbus Roman No9 L</family>
<family>Nimbus Roman</family>
<family>Times</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>DejaVu Sans</family>
<family>Verdana</family>
<family>Arial</family>
<family>Albany AMT</family>
<family>Luxi Sans</family>
<family>Nimbus Sans L</family>
<family>Nimbus Sans</family>
<family>Helvetica</family>
<family>Lucida Sans Unicode</family>
<family>BPG Glaho International</family> <!-- lat,cyr,arab,geor -->
<family>Tahoma</family> <!-- lat,cyr,greek,heb,arab,thai -->
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>DejaVu Sans Mono</family>
<family>Inconsolata</family>
<family>Andale Mono</family>
<family>Courier New</family>
<family>Cumberland AMT</family>
<family>Luxi Mono</family>
<family>Nimbus Mono L</family>
<family>Nimbus Mono</family>
<family>Nimbus Mono PS</family>
<family>Courier</family>
</prefer>
</alias>
<!--
Fantasy faces
-->
<alias>
<family>fantasy</family>
<prefer>
<family>Impact</family>
<family>Copperplate Gothic Std</family>
<family>Cooper Std</family>
<family>Bauhaus Std</family>
</prefer>
</alias>
<!--
Cursive faces
-->
<alias>
<family>cursive</family>
<prefer>
<family>ITC Zapf Chancery Std</family>
<family>Zapfino</family>
<family>Comic Sans MS</family>
</prefer>
</alias>
<!--
system-ui
-->
<alias>
<family>system-ui</family>
<prefer>
<family>Cantarell</family>
<family>Noto Sans UI</family>
<family>Segoe UI</family>
<family>Segoe UI Historic</family>
<family>Segoe UI Symbol</family>
</prefer>
</alias>
</fontconfig>

View File

@@ -0,0 +1,99 @@
[
{
"Description": "Set preferable fonts for Latin"
},
{
"Alias": {
"alias": "serif",
"prefer": [
"DejaVu Serif",
"Times New Roman",
"Thorndale AMT",
"Luxi Serif",
"Nimbus Roman No9 L",
"Nimbus Roman",
"Times"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "sans-serif",
"prefer": [
"DejaVu Sans",
"Verdana",
"Arial",
"Albany AMT",
"Luxi Sans",
"Nimbus Sans L",
"Nimbus Sans",
"Helvetica",
"Lucida Sans Unicode",
"BPG Glaho International",
"Tahoma"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "monospace",
"prefer": [
"DejaVu Sans Mono",
"Inconsolata",
"Andale Mono",
"Courier New",
"Cumberland AMT",
"Luxi Mono",
"Nimbus Mono L",
"Nimbus Mono",
"Nimbus Mono PS",
"Courier"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "fantasy",
"prefer": [
"Impact",
"Copperplate Gothic Std",
"Cooper Std",
"Bauhaus Std"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "cursive",
"prefer": [
"ITC Zapf Chancery Std",
"Zapfino",
"Comic Sans MS"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "system-ui",
"prefer": [
"Cantarell",
"Noto Sans UI",
"Segoe UI",
"Segoe UI Historic",
"Segoe UI Symbol"
],
"accept": [],
"default": []
}
}
]

View File

@@ -0,0 +1,418 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<!--
fonts-persian.conf
To configure Persian fonts from The FarsiWeb Project.
Copyright (C) 2005 Sharif FarsiWeb, Inc. <license@farsiweb.info>
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of Sharif FarsiWeb, Inc. not be used in
advertising or publicity pertaining to distribution of the software without
specific, written prior permission. Sharif FarsiWeb, Inc. makes no
representations about the suitability of this software for any purpose. It
is provided "as is" without express or implied warranty.
SHARIF FARSIWEB, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
ChangeLog:
2005-04-03 Behdad Esfahbod: Initial revision.
2005-10-09 Behdad Esfahbod: Turned off back-slant and Tahoma sections.
2005-11-30 Behdad Esfahbod: Set Titr susbtitution size to 24 points.
2008 Behdad Esfahbod: Cleanup. Add fantasy and cursive.
-->
<fontconfig>
<!-- Deprecated fonts are discouraged -->
<!-- Nesf[2] is officially deprecated and has problematic tables -->
<alias binding="same">
<family>Nesf</family>
<accept><family>Nesf2</family></accept>
</alias>
<alias binding="same">
<family>Nesf2</family>
<accept><family>Persian_sansserif_default</family></accept>
</alias>
<!-- Name changes and spelling variant aliases -->
<alias binding="same">
<family>Nazanin</family>
<accept><family>Nazli</family></accept>
</alias>
<alias binding="same">
<family>Lotus</family>
<accept><family>Lotoos</family></accept>
</alias>
<alias binding="same">
<family>Yaqut</family>
<accept><family>Yaghoot</family></accept>
</alias>
<alias binding="same">
<family>Yaghut</family>
<accept><family>Yaghoot</family></accept>
</alias>
<alias binding="same">
<family>Traffic</family>
<accept><family>Terafik</family></accept>
</alias>
<alias binding="same">
<family>Ferdowsi</family>
<accept><family>Ferdosi</family></accept>
</alias>
<alias binding="same">
<family>Fantezy</family>
<accept><family>Fantezi</family></accept>
</alias>
<!-- Classify fonts. -->
<!-- Persian_title class -->
<alias binding="same">
<family>Jadid</family>
<accept><family>Persian_title</family></accept>
</alias>
<alias binding="same">
<family>Titr</family>
<accept><family>Persian_title</family></accept>
</alias>
<!-- Persian_fantasy class -->
<alias binding="same">
<family>Kamran</family>
<accept>
<family>Persian_fantasy</family>
<family>Homa</family>
</accept>
</alias>
<alias binding="same">
<family>Homa</family>
<accept>
<family>Persian_fantasy</family>
<family>Kamran</family>
</accept>
</alias>
<alias binding="same">
<family>Fantezi</family>
<accept><family>Persian_fantasy</family></accept>
</alias>
<alias binding="same">
<family>Tabassom</family>
<accept><family>Persian_fantasy</family></accept>
</alias>
<!-- Persian_square class -->
<alias binding="same">
<family>Arshia</family>
<accept><family>Persian_square</family></accept>
</alias>
<alias binding="same">
<family>Nasim</family>
<accept><family>Persian_square</family></accept>
</alias>
<alias binding="same">
<family>Elham</family>
<accept>
<family>Persian_square</family>
<family>Farnaz</family>
</accept>
</alias>
<alias binding="same">
<family>Farnaz</family>
<accept>
<family>Persian_square</family>
<family>Elham</family>
</accept>
</alias>
<alias binding="same">
<family>Sina</family>
<accept><family>Persian_square</family></accept>
</alias>
<!-- Font ordering per class -->
<!-- Persian_title class -->
<alias binding="same">
<family>Persian_title</family>
<accept>
<family>Titr</family>
<family>Jadid</family>
<family>Persian_serif</family>
</accept>
</alias>
<!-- Persian_fantasy class -->
<alias binding="same">
<family>Persian_fantasy</family>
<accept>
<family>Homa</family>
<family>Kamran</family>
<family>Fantezi</family>
<family>Tabassom</family>
<family>Persian_square</family>
</accept>
</alias>
<!-- Persian_square class -->
<alias binding="same">
<family>Persian_square</family>
<accept>
<family>Arshia</family>
<family>Elham</family>
<family>Farnaz</family>
<family>Nasim</family>
<family>Sina</family>
<family>Persian_serif</family>
</accept>
</alias>
<!-- Register the fonts that we actually do have -->
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Elham</string>
</test>
<edit name="foundry">
<string>farsiweb</string>
</edit>
</match>
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Homa</string>
</test>
<edit name="foundry">
<string>farsiweb</string>
</edit>
</match>
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Koodak</string>
</test>
<edit name="foundry">
<string>farsiweb</string>
</edit>
</match>
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Nazli</string>
</test>
<edit name="foundry">
<string>farsiweb</string>
</edit>
</match>
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Roya</string>
</test>
<edit name="foundry">
<string>farsiweb</string>
</edit>
</match>
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Terafik</string>
</test>
<edit name="foundry">
<string>farsiweb</string>
</edit>
</match>
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Titr</string>
</test>
<edit name="foundry">
<string>farsiweb</string>
</edit>
</match>
<!-- Our fonts should oblique to the other side (TURNED-OFF) -->
<match target="font">
<test name="foundry">
<!--string>farsiweb</string-->
<string>TURNED-OFF</string>
</test>
<test name="foundry">
<string>farsiweb</string>
</test>
<!-- check to see if the font is roman -->
<test name="slant">
<const>roman</const>
</test>
<!-- check to see if the pattern requested non-roman -->
<test target="pattern" name="slant" compare="not_eq">
<const>roman</const>
</test>
<!-- multiply the matrix to slant the font -->
<edit name="matrix" mode="assign">
<times>
<name>matrix</name>
<matrix><double>1</double><double>-0.2</double>
<double>0</double><double>1</double>
</matrix>
</times>
</edit>
<!-- pretend the font is oblique now -->
<edit name="slant" mode="assign">
<const>oblique</const>
</edit>
</match>
<!--
We can't hint our fonts well, so turn off hinting.
Moreover, the bitmaps we have designed (well, they
have designed), suck, so disable them too.
-->
<match target="font">
<test name="foundry">
<string>farsiweb</string>
</test>
<edit name="autohint">
<bool>false</bool>
</edit>
<edit name="hinting">
<bool>false</bool>
</edit>
<edit name="embeddedbitmap">
<bool>false</bool>
</edit>
</match>
<!-- Alias our fonts to common families -->
<!-- Persian serif fonts -->
<alias>
<family>serif</family>
<accept>
<family>Nazli</family>
<family>Lotoos</family>
<family>Mitra</family>
<family>Ferdosi</family>
<family>Badr</family>
<family>Zar</family>
</accept>
</alias>
<!-- Persian sans-serif fonts -->
<alias>
<family>sans-serif</family>
<accept>
<family>Roya</family>
<family>Koodak</family>
<family>Terafik</family>
</accept>
</alias>
<!-- Persian monospace fonts -->
<alias>
<family>monospace</family>
<accept>
<!-- Not really monospace -->
<family>Terafik</family>
</accept>
</alias>
<!-- Persian fantasy fonts -->
<alias>
<family>fantasy</family>
<accept>
<family>Homa</family>
<family>Kamran</family>
<family>Fantezi</family>
<family>Tabassom</family>
</accept>
</alias>
<!-- Persian (and Urdu) Nastaliq/cursive fonts -->
<alias>
<family>cursive</family>
<accept>
<family>IranNastaliq</family>
<family>Nafees Nastaleeq</family>
</accept>
</alias>
<!-- Use Titr in titles -->
<!-- Both serif... -->
<match>
<test name="family">
<string>serif</string>
</test>
<test name="weight" compare="more_eq">
<int>200</int>
</test>
<test name="size" compare="more_eq">
<double>24</double>
</test>
<edit name="family" mode="prepend">
<string>Titr</string>
</edit>
</match>
<!-- and sans-serif. -->
<match>
<test name="family">
<string>sans-serif</string>
</test>
<test name="weight" compare="more_eq">
<int>200</int>
</test>
<test name="size" compare="more_eq">
<double>24</double>
</test>
<edit name="family" mode="prepend">
<string>Titr</string>
</edit>
</match>
<!-- and more. -->
<match>
<test name="family">
<string>Persian_sansserif_default</string>
</test>
<test name="weight" compare="more_eq">
<int>200</int>
</test>
<test name="size" compare="more_eq">
<double>24</double>
</test>
<edit name="family" mode="prepend" binding="same">
<string>Titr</string>
</edit>
</match>
<!-- Default substituted for deprecated sans-serif fonts -->
<match>
<test name="family">
<string>Persian_sansserif_default</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>Roya</string>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,899 @@
[
{
"Alias": {
"alias": "Nesf",
"prefer": [],
"accept": [
"Nesf2"
],
"default": []
}
},
{
"Alias": {
"alias": "Nesf2",
"prefer": [],
"accept": [
"Persian_sansserif_default"
],
"default": []
}
},
{
"Alias": {
"alias": "Nazanin",
"prefer": [],
"accept": [
"Nazli"
],
"default": []
}
},
{
"Alias": {
"alias": "Lotus",
"prefer": [],
"accept": [
"Lotoos"
],
"default": []
}
},
{
"Alias": {
"alias": "Yaqut",
"prefer": [],
"accept": [
"Yaghoot"
],
"default": []
}
},
{
"Alias": {
"alias": "Yaghut",
"prefer": [],
"accept": [
"Yaghoot"
],
"default": []
}
},
{
"Alias": {
"alias": "Traffic",
"prefer": [],
"accept": [
"Terafik"
],
"default": []
}
},
{
"Alias": {
"alias": "Ferdowsi",
"prefer": [],
"accept": [
"Ferdosi"
],
"default": []
}
},
{
"Alias": {
"alias": "Fantezy",
"prefer": [],
"accept": [
"Fantezi"
],
"default": []
}
},
{
"Alias": {
"alias": "Jadid",
"prefer": [],
"accept": [
"Persian_title"
],
"default": []
}
},
{
"Alias": {
"alias": "Titr",
"prefer": [],
"accept": [
"Persian_title"
],
"default": []
}
},
{
"Alias": {
"alias": "Kamran",
"prefer": [],
"accept": [
"Persian_fantasy",
"Homa"
],
"default": []
}
},
{
"Alias": {
"alias": "Homa",
"prefer": [],
"accept": [
"Persian_fantasy",
"Kamran"
],
"default": []
}
},
{
"Alias": {
"alias": "Fantezi",
"prefer": [],
"accept": [
"Persian_fantasy"
],
"default": []
}
},
{
"Alias": {
"alias": "Tabassom",
"prefer": [],
"accept": [
"Persian_fantasy"
],
"default": []
}
},
{
"Alias": {
"alias": "Arshia",
"prefer": [],
"accept": [
"Persian_square"
],
"default": []
}
},
{
"Alias": {
"alias": "Nasim",
"prefer": [],
"accept": [
"Persian_square"
],
"default": []
}
},
{
"Alias": {
"alias": "Elham",
"prefer": [],
"accept": [
"Persian_square",
"Farnaz"
],
"default": []
}
},
{
"Alias": {
"alias": "Farnaz",
"prefer": [],
"accept": [
"Persian_square",
"Elham"
],
"default": []
}
},
{
"Alias": {
"alias": "Sina",
"prefer": [],
"accept": [
"Persian_square"
],
"default": []
}
},
{
"Alias": {
"alias": "Persian_title",
"prefer": [],
"accept": [
"Titr",
"Jadid",
"Persian_serif"
],
"default": []
}
},
{
"Alias": {
"alias": "Persian_fantasy",
"prefer": [],
"accept": [
"Homa",
"Kamran",
"Fantezi",
"Tabassom",
"Persian_square"
],
"default": []
}
},
{
"Alias": {
"alias": "Persian_square",
"prefer": [],
"accept": [
"Arshia",
"Elham",
"Farnaz",
"Nasim",
"Sina",
"Persian_serif"
],
"default": []
}
},
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Elham"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
]
}
},
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Homa"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
]
}
},
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Koodak"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
]
}
},
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Nazli"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
]
}
},
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Roya"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
]
}
},
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Terafik"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
]
}
},
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Titr"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Foundry": {
"Simple": {
"String": "TURNED-OFF"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Slant": {
"Simple": {
"Constant": "Roman"
}
}
}
},
{
"qual": "Any",
"target": "Pattern",
"compare": "NotEq",
"value": {
"Slant": {
"Simple": {
"Constant": "Roman"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Matrix": {
"List": [
"Times",
[
{
"Simple": {
"Property": [
"Default",
"Matrix"
]
}
},
{
"Matrix": [
{
"Simple": {
"Double": 1.0
}
},
{
"Simple": {
"Double": -0.2
}
},
{
"Simple": {
"Double": 0.0
}
},
{
"Simple": {
"Double": 1.0
}
}
]
}
]
]
}
}
},
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Slant": {
"Simple": {
"Constant": "Oblique"
}
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Foundry": {
"Simple": {
"String": "farsiweb"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"AutoHint": {
"Simple": {
"Bool": false
}
}
}
},
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Hinting": {
"Simple": {
"Bool": false
}
}
}
},
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Embeddedbitmap": {
"Simple": {
"Bool": false
}
}
}
}
]
}
},
{
"Alias": {
"alias": "serif",
"prefer": [],
"accept": [
"Nazli",
"Lotoos",
"Mitra",
"Ferdosi",
"Badr",
"Zar"
],
"default": []
}
},
{
"Alias": {
"alias": "sans-serif",
"prefer": [],
"accept": [
"Roya",
"Koodak",
"Terafik"
],
"default": []
}
},
{
"Alias": {
"alias": "monospace",
"prefer": [],
"accept": [
"Terafik"
],
"default": []
}
},
{
"Alias": {
"alias": "fantasy",
"prefer": [],
"accept": [
"Homa",
"Kamran",
"Fantezi",
"Tabassom"
],
"default": []
}
},
{
"Alias": {
"alias": "cursive",
"prefer": [],
"accept": [
"IranNastaliq",
"Nafees Nastaleeq"
],
"default": []
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "serif"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "MoreEq",
"value": {
"Weight": {
"Simple": {
"Int": 200
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "MoreEq",
"value": {
"Size": {
"Simple": {
"Double": 24.0
}
}
}
}
],
"edits": [
{
"mode": "Prepend",
"binding": "Weak",
"value": {
"Family": {
"Simple": {
"String": "Titr"
}
}
}
}
]
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "sans-serif"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "MoreEq",
"value": {
"Weight": {
"Simple": {
"Int": 200
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "MoreEq",
"value": {
"Size": {
"Simple": {
"Double": 24.0
}
}
}
}
],
"edits": [
{
"mode": "Prepend",
"binding": "Weak",
"value": {
"Family": {
"Simple": {
"String": "Titr"
}
}
}
}
]
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Persian_sansserif_default"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "MoreEq",
"value": {
"Weight": {
"Simple": {
"Int": 200
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "MoreEq",
"value": {
"Size": {
"Simple": {
"Double": 24.0
}
}
}
}
],
"edits": [
{
"mode": "Prepend",
"binding": "Same",
"value": {
"Family": {
"Simple": {
"String": "Titr"
}
}
}
}
]
}
},
{
"Match": {
"target": "Pattern",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Persian_sansserif_default"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Same",
"value": {
"Family": {
"Simple": {
"String": "Roya"
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,228 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set preferable fonts for non-Latin</description>
<alias>
<family>serif</family>
<prefer>
<family>Artsounk</family> <!-- armenian -->
<family>BPG UTF8 M</family> <!-- georgian -->
<family>Kinnari</family> <!-- thai -->
<family>Norasi</family> <!-- thai -->
<family>Frank Ruehl</family> <!-- hebrew -->
<family>Dror</family> <!-- hebrew -->
<family>JG LaoTimes</family> <!-- lao -->
<family>Saysettha Unicode</family> <!-- lao -->
<family>Pigiarniq</family> <!-- canadian syllabics -->
<family>B Davat</family> <!-- arabic (fa) -->
<family>B Compset</family> <!-- arabic (fa) -->
<family>Kacst-Qr</family> <!-- arabic (ar) -->
<family>Urdu Nastaliq Unicode</family> <!-- arabic (ur) -->
<family>Raghindi</family> <!-- devanagari -->
<family>Mukti Narrow</family> <!-- bengali -->
<family>malayalam</family> <!-- malayalam -->
<family>Sampige</family> <!-- kannada -->
<family>padmaa</family> <!-- gujarati -->
<family>Hapax Berbère</family> <!-- tifinagh -->
<family>MS Mincho</family> <!-- han (ja) -->
<family>SimSun</family> <!-- han (zh-cn,zh-tw) -->
<family>PMingLiu</family> <!-- han (zh-tw) -->
<family>WenQuanYi Zen Hei</family> <!-- han (zh-cn,zh-tw) -->
<family>WenQuanYi Bitmap Song</family> <!-- han (zh-cn,zh-tw) -->
<family>AR PL ShanHeiSun Uni</family> <!-- han (ja,zh-cn,zh-tw) -->
<family>AR PL New Sung</family> <!-- han (zh-cn,zh-tw) -->
<family>ZYSong18030</family> <!-- han (zh-cn,zh-tw) -->
<family>HanyiSong</family> <!-- han (zh-cn,zh-tw) -->
<family>MgOpen Canonica</family>
<family>Sazanami Mincho</family>
<family>IPAMonaMincho</family>
<family>IPAMincho</family>
<family>Kochi Mincho</family>
<family>AR PL SungtiL GB</family>
<family>AR PL Mingti2L Big5</family>
<family>AR PL Zenkai Uni</family>
<family> 明朝</family>
<family>ZYSong18030</family>
<family>NanumMyeongjo</family> <!-- hangul (ko) -->
<family>UnBatang</family> <!-- hangul (ko) -->
<family>Baekmuk Batang</family> <!-- hangul (ko) -->
<family>KacstQura</family>
<family>Frank Ruehl CLM</family>
<family>Lohit Bengali</family>
<family>Lohit Gujarati</family>
<family>Lohit Hindi</family>
<family>Lohit Marathi</family>
<family>Lohit Maithili</family>
<family>Lohit Kashmiri</family>
<family>Lohit Konkani</family>
<family>Lohit Nepali</family>
<family>Lohit Sindhi</family>
<family>Lohit Punjabi</family>
<family>Lohit Tamil</family>
<family>Rachana</family>
<family>Lohit Malayalam</family>
<family>Lohit Kannada</family>
<family>Lohit Telugu</family>
<family>Lohit Oriya</family>
<family>LKLUG</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Nachlieli</family> <!-- hebrew -->
<family>Lucida Sans Unicode</family>
<family>Yudit Unicode</family>
<family>Kerkis</family> <!-- greek -->
<family>ArmNet Helvetica</family> <!-- armenian -->
<family>Artsounk</family> <!-- armenian -->
<family>BPG UTF8 M</family> <!-- georgian -->
<family>Waree</family> <!-- thai -->
<family>Loma</family> <!-- thai -->
<family>Garuda</family> <!-- thai -->
<family>Umpush</family> <!-- thai -->
<family>Saysettha Unicode</family> <!-- lao? -->
<family>JG Lao Old Arial</family> <!-- lao -->
<family>GF Zemen Unicode</family> <!-- ethiopic -->
<family>Pigiarniq</family> <!-- canadian syllabics -->
<family>B Davat</family> <!-- arabic (fa) -->
<family>B Compset</family> <!-- arabic (fa) -->
<family>Kacst-Qr</family> <!-- arabic (ar) -->
<family>Urdu Nastaliq Unicode</family> <!-- arabic (ur) -->
<family>Raghindi</family> <!-- devanagari -->
<family>Mukti Narrow</family> <!-- bengali -->
<family>malayalam</family> <!-- malayalam -->
<family>Sampige</family> <!-- kannada -->
<family>padmaa</family> <!-- gujarati -->
<family>Hapax Berbère</family> <!-- tifinagh -->
<family>MS Gothic</family> <!-- han (ja) -->
<family>UmePlus P Gothic</family> <!-- han (ja) -->
<family>Microsoft YaHei</family> <!-- han (zh-cn,zh-tw) -->
<family>Microsoft JhengHei</family> <!-- han (zh-tw) -->
<family>WenQuanYi Zen Hei</family> <!-- han (zh-cn,zh-tw) -->
<family>WenQuanYi Bitmap Song</family> <!-- han (zh-cn,zh-tw) -->
<family>AR PL ShanHeiSun Uni</family> <!--han (ja,zh-cn,zh-tw) -->
<family>AR PL New Sung</family> <!-- han (zh-cn,zh-tw) -->
<family>MgOpen Modata</family>
<family>VL Gothic</family>
<family>IPAMonaGothic</family>
<family>IPAGothic</family>
<family>Sazanami Gothic</family>
<family>Kochi Gothic</family>
<family>AR PL KaitiM GB</family>
<family>AR PL KaitiM Big5</family>
<family>AR PL ShanHeiSun Uni</family>
<family>AR PL SungtiL GB</family>
<family>AR PL Mingti2L Big5</family>
<family> ゴシック</family>
<family>ZYSong18030</family> <!-- han (zh-cn,zh-tw) -->
<family>TSCu_Paranar</family> <!-- tamil -->
<family>NanumGothic</family> <!-- hangul (ko) -->
<family>UnDotum</family> <!-- hangul (ko) -->
<family>Baekmuk Dotum</family> <!-- hangul (ko) -->
<family>Baekmuk Gulim</family> <!-- hangul (ko) -->
<family>KacstQura</family>
<family>Lohit Bengali</family>
<family>Lohit Gujarati</family>
<family>Lohit Hindi</family>
<family>Lohit Marathi</family>
<family>Lohit Maithili</family>
<family>Lohit Kashmiri</family>
<family>Lohit Konkani</family>
<family>Lohit Nepali</family>
<family>Lohit Sindhi</family>
<family>Lohit Punjabi</family>
<family>Lohit Tamil</family>
<family>Meera</family>
<family>Lohit Malayalam</family>
<family>Lohit Kannada</family>
<family>Lohit Telugu</family>
<family>Lohit Oriya</family>
<family>LKLUG</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Miriam Mono</family> <!-- hebrew -->
<family>VL Gothic</family>
<family>IPAMonaGothic</family>
<family>IPAGothic</family>
<family>Sazanami Gothic</family>
<family>Kochi Gothic</family>
<family>AR PL KaitiM GB</family>
<family>MS Gothic</family> <!-- han (ja) -->
<family>UmePlus Gothic</family> <!-- han (ja) -->
<family>NSimSun</family> <!-- han (zh-cn,zh-tw) -->
<family>MingLiu</family> <!-- han (zh-tw) -->
<family>AR PL ShanHeiSun Uni</family> <!-- han (ja,zh-cn,zh-tw) -->
<family>AR PL New Sung Mono</family> <!-- han (zh-cn,zh-tw) -->
<family>HanyiSong</family> <!-- han (zh-cn) -->
<family>AR PL SungtiL GB</family>
<family>AR PL Mingti2L Big5</family>
<family>ZYSong18030</family> <!-- han (zh-cn,zh-tw) -->
<family>NanumGothicCoding</family> <!-- hangul (ko) -->
<family>NanumGothic</family> <!-- hangul (ko) -->
<family>UnDotum</family> <!-- hangul (ko) -->
<family>Baekmuk Dotum</family> <!-- hangul (ko) -->
<family>Baekmuk Gulim</family> <!-- hangul (ko) -->
<family>TlwgTypo</family> <!-- thai -->
<family>TlwgTypist</family> <!-- thai -->
<family>TlwgTypewriter</family> <!-- thai -->
<family>TlwgMono</family> <!-- thai -->
<family>Hasida</family> <!-- hebrew -->
<family>GF Zemen Unicode</family> <!-- ethiopic -->
<family>Hapax Berbère</family> <!-- tifinagh -->
<family>Lohit Bengali</family>
<family>Lohit Gujarati</family>
<family>Lohit Hindi</family>
<family>Lohit Marathi</family>
<family>Lohit Maithili</family>
<family>Lohit Kashmiri</family>
<family>Lohit Konkani</family>
<family>Lohit Nepali</family>
<family>Lohit Sindhi</family>
<family>Lohit Punjabi</family>
<family>Lohit Tamil</family>
<family>Meera</family>
<family>Lohit Malayalam</family>
<family>Lohit Kannada</family>
<family>Lohit Telugu</family>
<family>Lohit Oriya</family>
<family>LKLUG</family>
</prefer>
</alias>
<!--
system-ui
-->
<alias>
<family>system-ui</family>
<prefer>
<family>Noto Sans Arabic UI</family><!-- ar -->
<family>Noto Sans Bengali UI</family><!-- bn -->
<family>Noto Sans Devanagari UI</family><!-- hi, mai, mr -->
<family>Noto Sans Gujarati UI</family><!-- gu -->
<family>Noto Sans Gurmukhi UI</family><!-- pa -->
<family>Noto Sans Kannada UI</family><!-- kn -->
<family>Noto Sans Khmer UI</family><!-- km -->
<family>Noto Sans Lao UI</family><!-- lo -->
<family>Noto Sans Malayalam UI</family><!-- ml -->
<family>Noto Sans Myanmar UI</family><!-- my -->
<family>Noto Sans Oriya UI</family><!-- or -->
<family>Noto Sans Sinhala UI</family><!-- si -->
<family>Noto Sans Tamil UI</family><!-- ta -->
<family>Noto Sans Telugu UI</family><!-- te -->
<family>Noto Sans Thai UI</family><!-- th -->
<family>Leelawadee UI</family><!-- bug, th, jv, km, lo -->
<family>Nirmala UI</family><!-- Indic -->
<family>Yu Gothic UI</family><!-- han (ja) -->
<family>Meiryo UI</family><!-- han (ja) -->
<family>MS UI Gothic</family><!-- han (ja) -->
<family>Khmer UI</family><!-- km -->
<family>Lao UI</family><!-- lo -->
<family>Microsoft YaHei UI</family><!-- han (zh-cn) -->
<family>Microsoft JhengHei UI</family><!-- han (zh-tw) -->
</prefer>
</alias>
</fontconfig>

View File

@@ -0,0 +1,240 @@
[
{
"Description": "Set preferable fonts for non-Latin"
},
{
"Alias": {
"alias": "serif",
"prefer": [
"Artsounk",
"BPG UTF8 M",
"Kinnari",
"Norasi",
"Frank Ruehl",
"Dror",
"JG LaoTimes",
"Saysettha Unicode",
"Pigiarniq",
"B Davat",
"B Compset",
"Kacst-Qr",
"Urdu Nastaliq Unicode",
"Raghindi",
"Mukti Narrow",
"malayalam",
"Sampige",
"padmaa",
"Hapax Berbère",
"MS Mincho",
"SimSun",
"PMingLiu",
"WenQuanYi Zen Hei",
"WenQuanYi Bitmap Song",
"AR PL ShanHeiSun Uni",
"AR PL New Sung",
"ZYSong18030",
"HanyiSong",
"MgOpen Canonica",
"Sazanami Mincho",
"IPAMonaMincho",
"IPAMincho",
"Kochi Mincho",
"AR PL SungtiL GB",
"AR PL Mingti2L Big5",
"AR PL Zenkai Uni",
" 明朝",
"ZYSong18030",
"NanumMyeongjo",
"UnBatang",
"Baekmuk Batang",
"KacstQura",
"Frank Ruehl CLM",
"Lohit Bengali",
"Lohit Gujarati",
"Lohit Hindi",
"Lohit Marathi",
"Lohit Maithili",
"Lohit Kashmiri",
"Lohit Konkani",
"Lohit Nepali",
"Lohit Sindhi",
"Lohit Punjabi",
"Lohit Tamil",
"Rachana",
"Lohit Malayalam",
"Lohit Kannada",
"Lohit Telugu",
"Lohit Oriya",
"LKLUG"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "sans-serif",
"prefer": [
"Nachlieli",
"Lucida Sans Unicode",
"Yudit Unicode",
"Kerkis",
"ArmNet Helvetica",
"Artsounk",
"BPG UTF8 M",
"Waree",
"Loma",
"Garuda",
"Umpush",
"Saysettha Unicode",
"JG Lao Old Arial",
"GF Zemen Unicode",
"Pigiarniq",
"B Davat",
"B Compset",
"Kacst-Qr",
"Urdu Nastaliq Unicode",
"Raghindi",
"Mukti Narrow",
"malayalam",
"Sampige",
"padmaa",
"Hapax Berbère",
"MS Gothic",
"UmePlus P Gothic",
"Microsoft YaHei",
"Microsoft JhengHei",
"WenQuanYi Zen Hei",
"WenQuanYi Bitmap Song",
"AR PL ShanHeiSun Uni",
"AR PL New Sung",
"MgOpen Modata",
"VL Gothic",
"IPAMonaGothic",
"IPAGothic",
"Sazanami Gothic",
"Kochi Gothic",
"AR PL KaitiM GB",
"AR PL KaitiM Big5",
"AR PL ShanHeiSun Uni",
"AR PL SungtiL GB",
"AR PL Mingti2L Big5",
" ゴシック",
"ZYSong18030",
"TSCu_Paranar",
"NanumGothic",
"UnDotum",
"Baekmuk Dotum",
"Baekmuk Gulim",
"KacstQura",
"Lohit Bengali",
"Lohit Gujarati",
"Lohit Hindi",
"Lohit Marathi",
"Lohit Maithili",
"Lohit Kashmiri",
"Lohit Konkani",
"Lohit Nepali",
"Lohit Sindhi",
"Lohit Punjabi",
"Lohit Tamil",
"Meera",
"Lohit Malayalam",
"Lohit Kannada",
"Lohit Telugu",
"Lohit Oriya",
"LKLUG"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "monospace",
"prefer": [
"Miriam Mono",
"VL Gothic",
"IPAMonaGothic",
"IPAGothic",
"Sazanami Gothic",
"Kochi Gothic",
"AR PL KaitiM GB",
"MS Gothic",
"UmePlus Gothic",
"NSimSun",
"MingLiu",
"AR PL ShanHeiSun Uni",
"AR PL New Sung Mono",
"HanyiSong",
"AR PL SungtiL GB",
"AR PL Mingti2L Big5",
"ZYSong18030",
"NanumGothicCoding",
"NanumGothic",
"UnDotum",
"Baekmuk Dotum",
"Baekmuk Gulim",
"TlwgTypo",
"TlwgTypist",
"TlwgTypewriter",
"TlwgMono",
"Hasida",
"GF Zemen Unicode",
"Hapax Berbère",
"Lohit Bengali",
"Lohit Gujarati",
"Lohit Hindi",
"Lohit Marathi",
"Lohit Maithili",
"Lohit Kashmiri",
"Lohit Konkani",
"Lohit Nepali",
"Lohit Sindhi",
"Lohit Punjabi",
"Lohit Tamil",
"Meera",
"Lohit Malayalam",
"Lohit Kannada",
"Lohit Telugu",
"Lohit Oriya",
"LKLUG"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "system-ui",
"prefer": [
"Noto Sans Arabic UI",
"Noto Sans Bengali UI",
"Noto Sans Devanagari UI",
"Noto Sans Gujarati UI",
"Noto Sans Gurmukhi UI",
"Noto Sans Kannada UI",
"Noto Sans Khmer UI",
"Noto Sans Lao UI",
"Noto Sans Malayalam UI",
"Noto Sans Myanmar UI",
"Noto Sans Oriya UI",
"Noto Sans Sinhala UI",
"Noto Sans Tamil UI",
"Noto Sans Telugu UI",
"Noto Sans Thai UI",
"Leelawadee UI",
"Nirmala UI",
"Yu Gothic UI",
"Meiryo UI",
"MS UI Gothic",
"Khmer UI",
"Lao UI",
"Microsoft YaHei UI",
"Microsoft JhengHei UI"
],
"accept": [],
"default": []
}
}
]

View File

@@ -0,0 +1,28 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>FreeSerif</family>
<family>Code2000</family>
<family>Code2001</family> <!-- plane1 and beyond -->
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>FreeSans</family>
<family>Arial Unicode MS</family>
<family>Arial Unicode</family>
<family>Code2000</family> <!-- almost everything; serif actually -->
<family>Code2001</family> <!-- plane1 and beyond -->
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>FreeMono</family>
</prefer>
</alias>
</fontconfig>

View File

@@ -0,0 +1,38 @@
[
{
"Alias": {
"alias": "serif",
"prefer": [
"FreeSerif",
"Code2000",
"Code2001"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "sans-serif",
"prefer": [
"FreeSans",
"Arial Unicode MS",
"Arial Unicode",
"Code2000",
"Code2001"
],
"accept": [],
"default": []
}
},
{
"Alias": {
"alias": "monospace",
"prefer": [
"FreeMono"
],
"accept": [],
"default": []
}
}
]

View File

@@ -0,0 +1,19 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<!-- Fix-ups for Delicious family -->
<!-- Delicious 'heavy' variant says its Medium weight -->
<match target="scan">
<test name="family" compare="eq" ignore-blanks="true">
<string>Delicious</string>
</test>
<test name="style">
<string>Heavy</string>
</test>
<edit name="weight">
<const>heavy</const>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,46 @@
[
{
"Match": {
"target": "Scan",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Family": {
"Simple": {
"String": "Delicious"
}
}
}
},
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Style": {
"Simple": {
"String": "Heavy"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Weight": {
"Simple": {
"Constant": "Heavy"
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,64 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<!--
Artificial oblique for fonts without an italic or oblique version
-->
<match target="font">
<!-- check to see if the font is roman -->
<test name="slant">
<const>roman</const>
</test>
<!-- check to see if the pattern requested non-roman -->
<test target="pattern" name="slant" compare="not_eq">
<const>roman</const>
</test>
<!-- multiply the matrix to slant the font -->
<edit name="matrix" mode="assign">
<times>
<name>matrix</name>
<matrix><double>1</double><double>0.2</double>
<double>0</double><double>1</double>
</matrix>
</times>
</edit>
<!-- pretend the font is oblique now -->
<edit name="slant" mode="assign">
<const>oblique</const>
</edit>
<!-- and disable embedded bitmaps for artificial oblique -->
<edit name="embeddedbitmap" mode="assign">
<bool>false</bool>
</edit>
</match>
<!--
Synthetic emboldening for fonts that do not have bold face available
-->
<match target="font">
<!-- check to see if the weight in the font is less than medium which possibly need emboldening -->
<test name="weight" compare="less_eq">
<const>medium</const>
</test>
<!-- check to see if the pattern requests bold -->
<test target="pattern" name="weight" compare="more_eq">
<const>bold</const>
</test>
<!--
set the embolden flag
needed for applications using cairo, e.g. gucharmap, gedit, ...
-->
<edit name="embolden" mode="assign">
<bool>true</bool>
</edit>
<!--
set weight to bold
needed for applications using Xft directly, e.g. Firefox, ...
-->
<edit name="weight" mode="assign">
<const>bold</const>
</edit>
</match>
</fontconfig>

View File

@@ -0,0 +1,157 @@
[
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "Eq",
"value": {
"Slant": {
"Simple": {
"Constant": "Roman"
}
}
}
},
{
"qual": "Any",
"target": "Pattern",
"compare": "NotEq",
"value": {
"Slant": {
"Simple": {
"Constant": "Roman"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Matrix": {
"List": [
"Times",
[
{
"Simple": {
"Property": [
"Default",
"Matrix"
]
}
},
{
"Matrix": [
{
"Simple": {
"Double": 1.0
}
},
{
"Simple": {
"Double": 0.2
}
},
{
"Simple": {
"Double": 0.0
}
},
{
"Simple": {
"Double": 1.0
}
}
]
}
]
]
}
}
},
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Slant": {
"Simple": {
"Constant": "Oblique"
}
}
}
},
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Embeddedbitmap": {
"Simple": {
"Bool": false
}
}
}
}
]
}
},
{
"Match": {
"target": "Font",
"tests": [
{
"qual": "Any",
"target": "Default",
"compare": "LessEq",
"value": {
"Weight": {
"Simple": {
"Constant": "Medium"
}
}
}
},
{
"qual": "Any",
"target": "Pattern",
"compare": "MoreEq",
"value": {
"Weight": {
"Simple": {
"Constant": "Bold"
}
}
}
}
],
"edits": [
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Embolden": {
"Simple": {
"Bool": true
}
}
}
},
{
"mode": "Assign",
"binding": "Weak",
"value": {
"Weight": {
"Simple": {
"Constant": "Bold"
}
}
}
}
]
}
}
]

View File

@@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<!-- /etc/fonts/fonts.conf file to configure system font access -->
<fontconfig>
<description>Default configuration file</description>
<!--
DO NOT EDIT THIS FILE.
IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED.
LOCAL CHANGES BELONG IN 'local.conf'.
The intent of this standard configuration file is to be adequate for
most environments. If you have a reasonably normal environment and
have found problems with this configuration, they are probably
things that others will also want fixed. Please submit any
problems to the fontconfig bugzilla system located at fontconfig.org
Note that the normal 'make install' procedure for fontconfig is to
replace any existing fonts.conf file with the new version. Place
any local customizations in local.conf which this file references.
Keith Packard
-->
<!-- Font directory list -->
<!-- the following element will be removed in the future -->
<!--
Accept deprecated 'mono' alias, replacing it with 'monospace'
-->
<match target="pattern">
<test qual="any" name="family">
<string>mono</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>monospace</string>
</edit>
</match>
<!--
Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans serif</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>sans-serif</string>
</edit>
</match>
<!--
Accept deprecated 'sans' alias, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>sans-serif</string>
</edit>
</match>
<!--
Accept alternate 'system ui' spelling, replacing it with 'system-ui'
-->
<match target="pattern">
<test qual="any" name="family">
<string>system ui</string>
</test>
<edit name="family" mode="assign" binding="same">
<string>system-ui</string>
</edit>
</match>
<!--
Load local system customization file
-->
<!-- Font cache directory list -->
<!-- the following element will be removed in the future -->
<config>
<!--
Rescan configuration every 30 seconds when FcFontSetList is called
-->
<rescan>
<int>30</int>
</rescan>
<blank>
<int>0</int>
</blank>
</config>
<cachedir prefix="xdg">fontconfig</cachedir><cachedir>/var/cache/fontconfig</cachedir><include prefix="relative" ignore_missing="yes">conf.d</include><dir prefix="xdg">fonts</dir><dir>/nix/store/n3imjg12pw7z9qm8r1wq4sq1x8d2nx0y-dejavu-fonts-minimal-2.37</dir>
<dir>~/.nix-profile/lib/X11/fonts</dir><dir>~/.nix-profile/share/fonts</dir><dir>/usr/share/fonts</dir><dir>/usr/local/share/fonts</dir><dir>/nix/var/nix/profiles/default/lib/X11/fonts</dir><dir>/nix/var/nix/profiles/default/share/fonts</dir></fontconfig>

View File

@@ -0,0 +1 @@
[{"Description":"Default configuration file"},{"Match":{"target":"Pattern","tests":[{"qual":"Any","target":"Default","compare":"Eq","value":{"Family":{"Simple":{"String":"mono"}}}}],"edits":[{"mode":"Assign","binding":"Same","value":{"Family":{"Simple":{"String":"monospace"}}}}]}},{"Match":{"target":"Pattern","tests":[{"qual":"Any","target":"Default","compare":"Eq","value":{"Family":{"Simple":{"String":"sans serif"}}}}],"edits":[{"mode":"Assign","binding":"Same","value":{"Family":{"Simple":{"String":"sans-serif"}}}}]}},{"Match":{"target":"Pattern","tests":[{"qual":"Any","target":"Default","compare":"Eq","value":{"Family":{"Simple":{"String":"sans"}}}}],"edits":[{"mode":"Assign","binding":"Same","value":{"Family":{"Simple":{"String":"sans-serif"}}}}]}},{"Match":{"target":"Pattern","tests":[{"qual":"Any","target":"Default","compare":"Eq","value":{"Family":{"Simple":{"String":"system ui"}}}}],"edits":[{"mode":"Assign","binding":"Same","value":{"Family":{"Simple":{"String":"system-ui"}}}}]}},{"Config":{"blanks":[0],"rescans":[30]}},{"CacheDir":{"prefix":"Xdg","path":"fontconfig"}},{"CacheDir":{"prefix":"Default","path":"/var/cache/fontconfig"}},{"Include":{"prefix":"Relative","ignore_missing":true,"path":"conf.d"}},{"Dir":{"prefix":"Xdg","salt":"","path":"fonts"}},{"Dir":{"prefix":"Default","salt":"","path":"/nix/store/n3imjg12pw7z9qm8r1wq4sq1x8d2nx0y-dejavu-fonts-minimal-2.37"}},{"Dir":{"prefix":"Default","salt":"","path":"~/.nix-profile/lib/X11/fonts"}},{"Dir":{"prefix":"Default","salt":"","path":"~/.nix-profile/share/fonts"}},{"Dir":{"prefix":"Default","salt":"","path":"/usr/share/fonts"}},{"Dir":{"prefix":"Default","salt":"","path":"/usr/local/share/fonts"}},{"Dir":{"prefix":"Default","salt":"","path":"/nix/var/nix/profiles/default/lib/X11/fonts"}},{"Dir":{"prefix":"Default","salt":"","path":"/nix/var/nix/profiles/default/share/fonts"}}]

View File

@@ -0,0 +1,11 @@
#!/bin/bash
# Usage: ./test-conf/generate_json.sh
cargo build --all-features --release --example parse_dump_json
for f in ./test-conf/**/*.conf; do
echo "Processing $f file..."
./target/release/examples/parse_dump_json $f | jq > $f.json
done

37
vendor/fontconfig-parser/tests/merge.rs vendored Normal file
View File

@@ -0,0 +1,37 @@
use fontconfig_parser::*;
#[test]
fn merge_full() {
let mut c = FontConfig::default();
c.merge_config("./test-conf/fonts.conf").unwrap();
// 00-5_reset-dirs.conf
assert!(!c.dirs.contains(&DirData {
path: "/before/reset".into(),
salt: "".into(),
}));
assert!(c.dirs.contains(&DirData {
path: "/after/reset".into(),
salt: "".into(),
}));
// 00-6_reset-dirs-lex-order.conf
assert!(c.dirs.contains(&DirData {
path: "/after/after/reset".into(),
salt: "".into(),
}));
// 00-nixos-cache.conf
assert!(c.dirs.contains(&DirData {
path: "/nix/store/i1yhgnfvaihqzs079lcx4zjnrdzcvaak-noto-fonts-2020-01-23".into(),
salt: "".into(),
}));
// 69-unifont.yaml
assert!(c.aliases.contains(&Alias {
alias: "serif".into(),
prefer: vec!["FreeSerif".into(), "Code2000".into(), "Code2001".into(),],
accept: vec![],
default: vec![],
}));
}

37
vendor/fontconfig-parser/tests/parse.rs vendored Normal file
View File

@@ -0,0 +1,37 @@
#![cfg(feature = "serialize")]
use std::path::PathBuf;
use fontconfig_parser::*;
fn test_single_conf(path: PathBuf) -> Result<()> {
eprintln!("Test {}", path.display());
let json_path = path.parent().unwrap().join(format!(
"{}.json",
path.file_name().unwrap().to_str().unwrap()
));
let parts = parse_config_parts(std::fs::read_to_string(path)?.as_str())?;
let expected_str = std::fs::read_to_string(json_path)?;
let expected: serde_json::Value = serde_json::from_str(&expected_str).unwrap();
let actual_str = serde_json::to_string(&parts).unwrap();
let actual: serde_json::Value = serde_json::from_str(&actual_str).unwrap();
k9::assert_equal!(expected, actual);
Ok(())
}
#[test]
fn test_conf() -> Result<()> {
test_single_conf("./test-conf/fonts.conf".into())?;
for conf in glob::glob("./test-conf/conf.d/*.conf").unwrap() {
test_single_conf(conf.unwrap())?;
}
Ok(())
}