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
|
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
|