ssme-thesis/polyglossia.lua

162 lines
5.4 KiB
Lua

require('luatex-hyphen')
local luatexhyphen = luatexhyphen
local byte = unicode.utf8.byte
local polyglossia_module = {
name = "polyglossia",
version = 1.3,
date = "2013/05/11",
description = "Polyglossia",
author = "Elie Roux",
copyright = "Elie Roux",
license = "CC0"
}
local error, warning, info, log =
luatexbase.provides_module(polyglossia_module)
polyglossia = polyglossia or {}
local polyglossia = polyglossia
local current_language
local last_language
local default_language
polyglossia.newloader_loaded_languages = { }
polyglossia.newloader_max_langid = 0
local newloader_available_languages = dofile(kpse.find_file('language.dat.lua'))
-- Suggestion by Dohyun Kim on #129
local t = { }
for k, v in pairs(newloader_available_languages) do
t[k] = v
for _, vv in pairs(v.synonyms) do
t[vv] = v
end
end
newloader_available_languages = t
local function loadlang(lang, id)
if luatexhyphen.lookupname(lang) then
luatexhyphen.loadlanguage(lang, id)
end
end
local function select_language(lang, id)
loadlang(lang, id)
current_language = lang
last_language = lang
end
local function set_default_language(lang, id)
polyglossia.default_language = lang
end
local function falsefun()
return false
end
local function disable_hyphenation()
luatexbase.add_to_callback("hyphenate", falsefun, "polyglossia.disable_hyphenation")
end
local function enable_hyphenation()
luatexbase.remove_from_callback("hyphenate", "polyglossia.disable_hyphenation")
end
local check_char
if luaotfload and luaotfload.aux and luaotfload.aux.font_has_glyph then
local font_has_glyph = luaotfload.aux.font_has_glyph
function check_char(chr)
local codepoint = tonumber(chr)
if not codepoint then codepoint = byte(chr) end
if font_has_glyph(font.current(), codepoint) then
tex.sprint('1')
else
tex.sprint('0')
end
end
else
local ids = fonts.identifiers or fonts.ids or fonts.hashes.identifiers
function check_char(chr) -- always in current font
local otfdata = ids[font.current()].characters
local codepoint = tonumber(chr)
if not codepoint then codepoint = byte(chr) end
if otfdata and otfdata[codepoint] then
tex.print('1')
else
tex.print('0')
end
end
end
local function load_frpt()
require('polyglossia-frpt')
end
local function load_tibt_eol()
require('polyglossia-tibt')
end
-- New hyphenation pattern loader: use language.dat.lua directly and the language identifiers
local function newloader(langentry)
loaded_language = polyglossia.newloader_loaded_languages[langentry]
if loaded_language then
texio.write_nl('term and log', 'Language ' .. langentry .. ' already loaded; id is ' .. lang.id(loaded_language))
-- texio.write_nl('term and log', 'Language ' .. langentry .. ' already loaded with patterns ' .. tostring(loaded_language) .. '; id is ' .. lang.id(loaded_language))
-- texio.write_nl('term and log', 'Language ' .. langentry .. ' already loaded with patterns ' .. loaded_language['patterns'] .. '; id is ' .. lang.id(loaded_language))
return lang.id(loaded_language)
else
langdata = newloader_available_languages[langentry]
if langdata and langdata['special'] == 'language0' then return 0 end
if langdata then
print("Language data for " .. langentry)
for k, v in pairs(langdata) do
print(k, tostring(v))
end
polyglossia.newloader_max_langid = polyglossia.newloader_max_langid + 1
-- langobject = lang.new(newloader_max_langid)
lang.new(); lang.new(); lang.new()
langobject = lang.new()
texio.write_nl('term and log', langdata.patterns)
if langdata.patterns and langdata.patterns ~= '' then
pattfilepath = kpse.find_file(langdata.patterns)
if pattfilepath then
pattfile = io.open(pattfilepath)
lang.patterns(langobject, pattfile:read('*all'))
pattfile:close()
end
end
if langdata.hyphenation and langdata.hyphenation ~= '' then
hyphfilepath = kpse.find_file(langdata.hyphenation)
if hyphfilepath then
hyphfile = io.open(hyphfilepath)
lang.hyphenation(langobject, hyphfile:read('*all'))
hyphfile:close()
end
end
polyglossia.newloader_loaded_languages[langentry] = langobject
texio.write_nl('term and log', 'Language ' .. langentry .. ' was not yet loaded; created with id ' .. lang.id(langobject))
return lang.id(langobject)
else
texio.write_nl('term and log', 'Language ' .. langentry .. ' not found in language.dat.lua')
return 255
end
end
end
polyglossia.loadlang = loadlang
polyglossia.select_language = select_language
polyglossia.set_default_language = set_default_language
polyglossia.current_language = current_language -- doesn't seem to be working well :-(
polyglossia.default_language = default_language
polyglossia.check_char = check_char
polyglossia.load_frpt = load_frpt
polyglossia.load_tibt_eol = load_tibt_eol
polyglossia.disable_hyphenation = disable_hyphenation
polyglossia.enable_hyphenation = enable_hyphenation
polyglossia.newloader = newloader