2
0
mirror of https://github.com/koreader/koreader synced 2024-10-31 21:20:20 +00:00
koreader/frontend/apps/reader/modules/readerhyphenation.lua

117 lines
3.6 KiB
Lua

local InputContainer = require("ui/widget/container/inputcontainer")
local UIManager = require("ui/uimanager")
local JSON = require("json")
local InfoMessage = require("ui/widget/infomessage")
local T = require("ffi/util").template
local _ = require("gettext")
local util = require("util")
local ReaderHyphenation = InputContainer:new{
hyph_menu_title = _("Hyphenation"),
hyph_table = nil,
}
function ReaderHyphenation:init()
self.lang_table = {}
self.hyph_table = {}
self.hyph_alg = cre.getSelectedHyphDict()
local lang_data_file = assert(io.open("./data/hyph/languages.json"), "r")
local ok, lang_data = pcall(JSON.decode, lang_data_file:read("*all"))
if ok and lang_data then
for k,v in ipairs(lang_data) do
table.insert(self.hyph_table, {
text = v.name,
callback = function()
self.hyph_alg = v.filename
UIManager:show(InfoMessage:new{
text = T(_("Changed hyphenation to %1."), v.name),
})
self.ui.document:setHyphDictionary(v.filename)
self.ui.toc:onUpdateToc()
end,
checked_func = function()
return v.filename == self.hyph_alg
end
})
self.lang_table[v.language] = v.filename
if v.aliases then
for i,alias in ipairs(v.aliases) do
self.lang_table[alias] = v.filename
end
end
end
end
self.ui.menu:registerToMainMenu(self)
end
function ReaderHyphenation:parseLanguageTag(lang_tag)
-- Parse an RFC 5646 language tag, like "en-US" or "en".
-- https://tools.ietf.org/html/rfc5646
-- We are only interested in the language and region parts.
local language = nil
local region = nil
for part in util.gsplit(lang_tag, "-", false) do
if not language then
language = string.lower(part)
elseif string.len(part) == 2 and not string.match(part, "[^%a]") then
region = string.upper(part)
end
end
return language, region
end
function ReaderHyphenation:getDictForLanguage(lang_tag)
-- EPUB language is an RFC 5646 language tag.
-- http://www.idpf.org/epub/301/spec/epub-publications.html#sec-opf-dclanguage
--
-- FB2 language is a two-letter language code
-- (which is also a valid RFC 5646 language tag).
-- http://fictionbook.org/index.php/%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82_lang (in Russian)
local language, region = self:parseLanguageTag(lang_tag)
if not language then
return
end
local dict
if region then
dict = self.lang_table[language .. '-' .. region]
end
if not dict then
dict = self.lang_table[language]
end
return dict
end
function ReaderHyphenation:onPreRenderDocument(config)
-- This is called after the document has been loaded
-- so we can use the document language.
local hyph_alg = config:readSetting("hyph_alg")
if not hyph_alg then
hyph_alg = self:getDictForLanguage(self.ui.document:getProps().language)
end
if hyph_alg then
self.ui.document:setHyphDictionary(hyph_alg)
end
self.hyph_alg = cre.getSelectedHyphDict()
end
function ReaderHyphenation:onSaveSettings()
self.ui.doc_settings:saveSetting("hyph_alg", self.hyph_alg)
end
function ReaderHyphenation:addToMainMenu(tab_item_table)
-- insert table to main reader menu
table.insert(tab_item_table.typeset, {
text = self.hyph_menu_title,
sub_item_table = self.hyph_table,
})
end
return ReaderHyphenation