1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
local module_name = "polyglossia"
local polyglossia_module = {
name = module_name,
version = 1.3,
date = "2013/05/11",
description = "Polyglossia",
author = "Elie Roux",
copyright = "Elie Roux",
license = "CC0"
}
luatexbase.provides_module(polyglossia_module)
local log_info = function(message, ...)
luatexbase.module_info(module_name, message:format(...))
end
local log_warn = function(message, ...)
luatexbase.module_warning(module_name, message:format(...))
end
polyglossia = polyglossia or {}
local polyglossia = polyglossia
local function select_language(lang, id)
polyglossia.current_language = lang
end
local function set_default_language(lang, id)
polyglossia.default_language = lang
end
local byte = utf8.codepoint -- use standard module of lua 5.3
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) or byte(chr)
if font_has_glyph(font.current(), codepoint) then
tex.sprint('1')
else
tex.sprint('0')
end
end
else
function check_char(chr) -- always in current font
local fontid = font.current()
local fontdata = font.getfont(fontid) or font.fonts[fontid]
local chardata = fontdata.characters
local codepoint = tonumber(chr) or byte(chr)
if chardata and chardata[codepoint] then
tex.sprint('1')
else
tex.sprint('0')
end
end
end
local function load_tibt_eol()
require('polyglossia-tibt')
end
-- predefined l@nohyphenation or LuaTeX's maximum value for \language
local nohyphid = luatexbase.registernumber'l@nohyphenation' or 16383
-- key `nohyphenation` is for .sty file when possibly undefined l@nohyphenation
local newloader_loaded_languages = { nohyphenation = nohyphid }
local newloader_available_languages = require'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
-- LaTeX's language register is \count19
local lang_register = 19
-- New hyphenation pattern loader: use language.dat.lua directly and the language identifiers
local function newloader(langentry)
local loaded_language = newloader_loaded_languages[langentry]
if loaded_language then
local langid = lang.id(loaded_language)
log_info('Language %s already loaded; id is %i', langentry, langid)
return langid
else
local langdata = newloader_available_languages[langentry]
if langdata then
local special = langdata.special
if special then
-- language0 (USenglish) is already included in the format
if special == 'language0' then
return 0
-- disabled language should not be used for utf-8 text
elseif special:find'^disabled:' then
log_warn('Hyphenation of language %s %s', langentry, special)
return nohyphid
end
end
-- language info will be written into the .log file
local s = { "Language data for " .. langentry }
for k, v in pairs(langdata) do
if type(v) == 'table' then -- for 'synonyms'
s[#s+1] = k .. "\t" .. table.concat(v,',')
else
s[#s+1] = k .. "\t" .. tostring(v)
end
end
log_info(table.concat(s,"\n"))
--
-- LaTeX's \newlanguage increases language register (count19),
-- whereas LuaTeX's lang.new() increases its own language id.
-- So when a user has declared, say, \newlanguage\lang@xyz, then
-- these two numbers do not match each other. If we do not consider
-- this possible situation, our newloader() function will
-- unfortunately overwrite the language \lang@xyz.
--
-- Threfore here we will compare LaTeX's \newlanguage number with
-- LuaTeX's lang.new() id and select the bigger one for our new
-- language object. Also we will update LaTeX's language register
-- by this new id, so that another possible \newlanguage should not
-- overwrite our language object.
--
-- get next \newlanguage allocation number
local langcnt = tex.count[lang_register] + 1
-- get new lang object
local langobject = lang.new()
local langid = lang.id(langobject)
-- get bigger one between \newlanguage and new lang obj id
local newlangid = math.max(langcnt, langid)
-- set language register for possible \newlanguage
tex.setcount('global', lang_register, newlangid)
-- get new lang object if needeed
if langid ~= newlangid then
langobject = lang.new(newlangid)
end
-- load hyphenation patterns and exceptions
for _,v in ipairs{ 'patterns', 'hyphenation' } do
local data = langdata[v]
if data and data ~= '' then
-- cope with comma separated list, such as serbian
for _,vv in ipairs(data:explode',+') do
local filepath = kpse.find_file(vv)
if filepath then
local fh = io.open(filepath)
lang[v](langobject, fh:read'a')
fh:close()
else
log_warn('Hyphenation file %s not found', vv)
end
end
end
end
newloader_loaded_languages[langentry] = langobject
log_info('Language %s was not yet loaded; created with id %i',
langentry, newlangid)
return newlangid
else
log_warn('Language %s not found in language.dat.lua', langentry)
return nohyphid
end
end
end
polyglossia.select_language = select_language
polyglossia.set_default_language = set_default_language
polyglossia.check_char = check_char
polyglossia.load_tibt_eol = load_tibt_eol
polyglossia.newloader = newloader
polyglossia.newloader_loaded_languages = newloader_loaded_languages
-- global variables:
-- polyglossia.default_language
-- polyglossia.current_language
|