mirror of
https://github.com/koreader/koreader
synced 2024-11-13 19:11:25 +00:00
106 lines
3.5 KiB
Lua
106 lines
3.5 KiB
Lua
|
local CanvasContext = require("document/canvascontext")
|
||
|
|
||
|
local FontList = {
|
||
|
fontdir = "./fonts",
|
||
|
}
|
||
|
|
||
|
--[[
|
||
|
These non-LGC Kindle system fonts fail CRe's moronic header check.
|
||
|
--]]
|
||
|
local kindle_fonts_blacklist = {
|
||
|
["DiwanMuna-Bold.ttf"] = true,
|
||
|
["DiwanMuna-Regular.ttf"] = true,
|
||
|
["HYGothicBold.ttf"] = true,
|
||
|
["HYGothicMedium.ttf"] = true,
|
||
|
["HYMyeongJoBold.ttf"] = true,
|
||
|
["HYMyeongJoMedium.ttf"] = true,
|
||
|
["KindleBlackboxBoldItalic.ttf"] = true,
|
||
|
["KindleBlackboxBold.ttf"] = true,
|
||
|
["KindleBlackboxItalic.ttf"] = true,
|
||
|
["KindleBlackboxRegular.ttf"] = true,
|
||
|
["Kindle_MonospacedSymbol.ttf"] = true,
|
||
|
["Kindle_Symbol.ttf"] = true,
|
||
|
["MTChineseSurrogates.ttf"] = true,
|
||
|
["MYingHeiTBold.ttf"] = true,
|
||
|
["MYingHeiTMedium.ttf"] = true,
|
||
|
["NotoNaskhArabicUI-Bold.ttf"] = true,
|
||
|
["NotoNaskhArabicUI-Regular.ttf"] = true,
|
||
|
["NotoNaskh-Bold.ttf"] = true,
|
||
|
["NotoNaskh-Regular.ttf"] = true,
|
||
|
["NotoSansBengali-Regular.ttf"] = true,
|
||
|
["NotoSansDevanagari-Regular.ttf"] = true,
|
||
|
["NotoSansGujarati-Regular.ttf"] = true,
|
||
|
["NotoSansKannada-Regular.ttf"] = true,
|
||
|
["NotoSansMalayalam-Regular.ttf"] = true,
|
||
|
["NotoSansTamil-Regular.ttf"] = true,
|
||
|
["NotoSansTelugu-Regular.ttf"] = true,
|
||
|
["SakkalKitab-Bold.ttf"] = true,
|
||
|
["SakkalKitab-Regular.ttf"] = true,
|
||
|
["SongTBold.ttf"] = true,
|
||
|
["SongTMedium.ttf"] = true,
|
||
|
["STHeitiBold.ttf"] = true,
|
||
|
["STHeitiMedium.ttf"] = true,
|
||
|
["STSongBold.ttf"] = true,
|
||
|
["STSongMedium.ttf"] = true,
|
||
|
["TBGothicBold_213.ttf"] = true,
|
||
|
["TBGothicMed_213.ttf"] = true,
|
||
|
["TBMinchoBold_213.ttf"] = true,
|
||
|
["TBMinchoMedium_213.ttf"] = true,
|
||
|
["STKaiMedium.ttf"] = true,
|
||
|
["Caecilia_LT_67_Cond_Medium.ttf"] = true,
|
||
|
["Caecilia_LT_68_Cond_Medium_Italic.ttf"] = true,
|
||
|
["Caecilia_LT_77_Cond_Bold.ttf"] = true,
|
||
|
["Caecilia_LT_78_Cond_Bold_Italic.ttf"] = true,
|
||
|
["Helvetica_LT_65_Medium.ttf"] = true,
|
||
|
["Helvetica_LT_66_Medium_Italic.ttf"] = true,
|
||
|
["Helvetica_LT_75_Bold.ttf"] = true,
|
||
|
["Helvetica_LT_76_Bold_Italic.ttf"] = true,
|
||
|
}
|
||
|
|
||
|
local function isInFontsBlacklist(f)
|
||
|
-- write test for this
|
||
|
return CanvasContext.isKindle() and kindle_fonts_blacklist[f]
|
||
|
end
|
||
|
|
||
|
local function getExternalFontDir()
|
||
|
if CanvasContext.isAndroid() then
|
||
|
return ANDROID_FONT_DIR
|
||
|
else
|
||
|
return os.getenv("EXT_FONT_DIR")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function _readList(target, dir)
|
||
|
-- lfs.dir non-exsitent directory will give error, weird!
|
||
|
local ok, iter, dir_obj = pcall(lfs.dir, dir)
|
||
|
if not ok then return end
|
||
|
for f in iter, dir_obj do
|
||
|
if lfs.attributes(dir.."/"..f, "mode") == "directory" and f ~= "." and f ~= ".." then
|
||
|
_readList(target, dir.."/"..f)
|
||
|
else
|
||
|
if string.sub(f, 1, 1) ~= "." then
|
||
|
local file_type = string.lower(string.match(f, ".+%.([^.]+)") or "")
|
||
|
if file_type == "ttf" or file_type == "ttc"
|
||
|
or file_type == "cff" or file_type == "otf" then
|
||
|
if not isInFontsBlacklist(f) then
|
||
|
table.insert(target, dir.."/"..f)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function FontList:getFontList()
|
||
|
local fontlist = {}
|
||
|
_readList(fontlist, self.fontdir)
|
||
|
-- multiple paths should be joined with semicolon
|
||
|
for dir in string.gmatch(getExternalFontDir() or "", "([^;]+)") do
|
||
|
_readList(fontlist, dir)
|
||
|
end
|
||
|
table.sort(fontlist)
|
||
|
return fontlist
|
||
|
end
|
||
|
|
||
|
return FontList
|