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
|
--
-- polyglossia.lua
-- part of polyglossia v2.0 -- 2024/02/17
--
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 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
token.set_char('l@nohyphenation', nohyphid)
-- 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.load_tibt_eol = load_tibt_eol
polyglossia.newloader = newloader
polyglossia.newloader_loaded_languages = newloader_loaded_languages
|