Difference between revisions of "Module:Unicode data/age/make"
< Module:Unicode data | age
Jump to navigation
Jump to search
blackwiki>Erutuon (check age value before merging) |
blackwiki>Erutuon (add aliases, though probably not that useful) |
||
| Line 28: | Line 28: | ||
}, | }, | ||
ranges = { | ranges = { | ||
| + | ... | ||
| + | }, | ||
| + | aliases = { | ||
... | ... | ||
}, | }, | ||
| Line 55: | Line 58: | ||
printed_singles:insert(('\t\t[0x%06X] = %s%q,') | printed_singles:insert(('\t\t[0x%06X] = %s%q,') | ||
:format(codepoint, make_padding(age), age)) | :format(codepoint, make_padding(age), age)) | ||
| + | end | ||
| + | |||
| + | local printed_aliases = Array() | ||
| + | local property_value_aliases = mw.title.new "User:Erutuon/Unicode/PropertyValueAliases.txt":getContent() | ||
| + | local age_aliases = property_value_aliases:match "# Age[^\n]+%s*(.-)%s*%f[^\n]#" | ||
| + | for age, alias in age_aliases:gmatch "age%s*;%s*(%S+)%s*;%s*(%S+)" do | ||
| + | printed_aliases:insert(('\t\t[%s"%s"] = "%s",') | ||
| + | :format(make_padding(age), age, alias)) | ||
end | end | ||
| Line 60: | Line 71: | ||
:gsub('%.%.%.', printed_singles:concat('\n'), 1) | :gsub('%.%.%.', printed_singles:concat('\n'), 1) | ||
:gsub('%.%.%.', printed_ranges:concat('\n'), 1) | :gsub('%.%.%.', printed_ranges:concat('\n'), 1) | ||
| + | :gsub('%.%.%.', printed_aliases:concat('\n'), 1) | ||
return mw.getCurrentFrame():extensionTag{ | return mw.getCurrentFrame():extensionTag{ | ||
Revision as of 22:46, 18 September 2019
Lua error at line 5: assertion failed!.
local p = {}
function p.main(frame)
local page = frame.args[1] or "User:Erutuon/Unicode/DerivedAge.txt"
local text = assert(mw.title.new(page):getContent())
local singles, ranges = {}, {}
for code_point1, code_point2, age in text:gmatch("%f[^\n%z](%x+)%.?%.?(%x*)%s*;%s*([%d.]+)") do
code_point1, code_point2 = tonumber(code_point1, 16), tonumber(code_point2, 16)
local last_range = ranges[#ranges]
if last_range and last_range[2] == code_point1 - 1 and last_range[3] == age then
last_range[2] = code_point2 or code_point1
elseif singles[code_point1 - 1] == age then
singles[code_point1 - 1] = nil
table.insert(ranges, { code_point1 - 1, code_point2 or code_point1, age })
else
if not code_point2 then
singles[code_point1] = age
else
table.insert(ranges, { code_point1, code_point2, age })
end
end
end
local template = [[
return {
singles = {
...
},
ranges = {
...
},
aliases = {
...
},
}
]]
table.sort(
ranges,
function(range1, range2)
return range1[1] < range2[1]
end)
local function make_padding(age)
return (" "):rep(#'"12.1"' - (#age + 2))
end
local Array = require "Module:array"
local printed_ranges = Array()
for _, range in ipairs(ranges) do
local low, high, age = unpack(range)
printed_ranges:insert(('\t\t{ 0x%06X, 0x%06X, %s%q },')
:format(low, high, make_padding(age), age))
end
local printed_singles = Array()
for codepoint, age in require 'Module:TableTools'.sortedPairs(singles) do
printed_singles:insert(('\t\t[0x%06X] = %s%q,')
:format(codepoint, make_padding(age), age))
end
local printed_aliases = Array()
local property_value_aliases = mw.title.new "User:Erutuon/Unicode/PropertyValueAliases.txt":getContent()
local age_aliases = property_value_aliases:match "# Age[^\n]+%s*(.-)%s*%f[^\n]#"
for age, alias in age_aliases:gmatch "age%s*;%s*(%S+)%s*;%s*(%S+)" do
printed_aliases:insert(('\t\t[%s"%s"] = "%s",')
:format(make_padding(age), age, alias))
end
local data = template
:gsub('%.%.%.', printed_singles:concat('\n'), 1)
:gsub('%.%.%.', printed_ranges:concat('\n'), 1)
:gsub('%.%.%.', printed_aliases:concat('\n'), 1)
return mw.getCurrentFrame():extensionTag{
name = "syntaxhighlight",
content = data,
args = { lang = "lua" }
}
end
return p