local p = {}
local function read_page(title)
return mw.title.new(title):getContent()
end
function p.make_singles_and_ranges(derived_general_category_page, property_value_aliases_page)
local text = read_page(derived_general_category_page)
local singles, ranges = {}, {}
for code_point1, code_point2, general_category in text:gmatch "%f[^\n%z](%x+)%.?%.?(%x*)%s*;%s*(%u%l)" do
if general_category ~= "Cn" then
code_point1 = tonumber(code_point1, 16)
-- XXXX..XXXX ; gc
if code_point2 ~= "" then
code_point2 = tonumber(code_point2, 16)
table.insert(ranges, { code_point1, code_point2, general_category })
-- XXXX ; gc
else
singles[code_point1] = general_category
end
end
end
local property_value_aliases = read_page(property_value_aliases_page)
local general_category_aliases = property_value_aliases:match "# General_Category[^\n]+%s*(.-)%s*%f[^\n]#"
local long_names = {}
for abbr, long_name in general_category_aliases:gmatch "gc%s*;%s*(%S+)%s*;%s*([%a_]+)" do
long_names[abbr] = long_name
end
return singles, ranges, long_names
end
function p.print_data(data)
local output = require "Module:array"()
local function writef(...)
output:insert(string.format(...))
end
writef [[
return {
singles = {
]]
-- Check that maximum "singles" codepoint is less than 0x100000?
for codepoint, category in require "Module:TableTools".sortedPairs(data.singles) do
writef('\t\t[0x%05X] = "%s",\n', codepoint, category)
end
writef [[
},
ranges = {
]]
local function compare_ranges(range1, range2)
return range1[1] < range2[1]
end
table.sort(data.ranges, compare_ranges)
for _, range in ipairs(data.ranges) do
writef('\t\t{ 0x%06X, 0x%06X, "%s" },\n', unpack(range))
end
writef [[
},
long_names = {
]]
for abbr, long_name in require "Module:TableTools".sortedPairs(data.long_names) do
writef('\t\t%-2s = "%s",\n', abbr, long_name)
end
writef [[
},
}]]
return output:concat()
end
function p.main(frame)
local data = {}
data.singles, data.ranges, data.long_names = p.make_singles_and_ranges(
"User:Erutuon/Unicode/DerivedGeneralCategory.txt",
"User:Erutuon/Unicode/PropertyValueAliases.txt")
return frame:extensionTag{
name = "syntaxhighlight",
content = p.print_data(data),
args = { lang = "lua" }
}
end
return p