<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AUnicode_data%2Fscripts%2Fmake</id>
	<title>Module:Unicode data/scripts/make - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AUnicode_data%2Fscripts%2Fmake"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Unicode_data/scripts/make&amp;action=history"/>
	<updated>2026-06-06T22:50:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Unicode_data/scripts/make&amp;diff=479903&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Unicode_data/scripts/make&amp;diff=479903&amp;oldid=prev"/>
		<updated>2021-07-16T07:47:06Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local Array = require 'Module:Array'&lt;br /&gt;
&lt;br /&gt;
local function pattern_escape(str)&lt;br /&gt;
	return (str:gsub('%p', '%%%1'))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.make_script_name_to_code(page_name)&lt;br /&gt;
	local property_value_aliases = assert(assert(mw.title.new(page_name)):getContent())&lt;br /&gt;
&lt;br /&gt;
	local script_aliases = property_value_aliases:match(&lt;br /&gt;
		pattern_escape '# Script (sc)'&lt;br /&gt;
		.. '%s+(.-)%s+'&lt;br /&gt;
		.. pattern_escape '# Script_Extensions (scx)')&lt;br /&gt;
&lt;br /&gt;
	local script_name_to_code = {}&lt;br /&gt;
	&lt;br /&gt;
	for code, name in script_aliases:gmatch 'sc%s+;%s+(%a+)%s+;%s+([%a_]+)' do&lt;br /&gt;
		script_name_to_code[name] = code&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return script_name_to_code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.make_script_data(scripts_txt, property_value_aliases_txt)&lt;br /&gt;
	local script_data = assert(assert(mw.title.new(scripts_txt)):getContent())&lt;br /&gt;
	&lt;br /&gt;
	local script_name_to_code = p.make_script_name_to_code(property_value_aliases_txt)&lt;br /&gt;
	setmetatable(script_name_to_code, { __index = function (self, k)&lt;br /&gt;
		error(('No code for &amp;quot;%s&amp;quot;'):format(k))&lt;br /&gt;
	end })&lt;br /&gt;
	&lt;br /&gt;
	local script_ranges = Array()&lt;br /&gt;
	&lt;br /&gt;
	local prev_codepoint, prev_script_name, prev_script_range&lt;br /&gt;
	for codepoint1, codepoint2, script_name in script_data:gmatch '%f[^\n%z](%x+)%.?%.?(%x*)%s+;%s*([%w_]+)' do&lt;br /&gt;
		codepoint1, codepoint2 = tonumber(codepoint1, 16), tonumber(codepoint2, 16)&lt;br /&gt;
		local script_range&lt;br /&gt;
		if prev_script_range and script_name == prev_script_name and codepoint1 - prev_codepoint == 1 then&lt;br /&gt;
			prev_script_range[2] = codepoint2 or codepoint1&lt;br /&gt;
		else&lt;br /&gt;
			script_range = { codepoint1, codepoint2 or codepoint1, script_name_to_code[script_name] }&lt;br /&gt;
			script_ranges:insert(script_range)&lt;br /&gt;
		end&lt;br /&gt;
		prev_codepoint, prev_script_name, prev_script_range =&lt;br /&gt;
			codepoint2 or codepoint1, script_name, script_range or prev_script_range&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local singles = {}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	&lt;br /&gt;
	while script_ranges[i] do&lt;br /&gt;
		local low, high, script_code = unpack(script_ranges[i])&lt;br /&gt;
		if low == high then&lt;br /&gt;
			singles[low] = script_code&lt;br /&gt;
			script_ranges:remove(i)&lt;br /&gt;
		else&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	script_ranges:sort(&lt;br /&gt;
		function (range1, range2)&lt;br /&gt;
			return range1[1] &amp;lt; range2[1]&lt;br /&gt;
		end)&lt;br /&gt;
	&lt;br /&gt;
	local template = [[&lt;br /&gt;
local data = {&lt;br /&gt;
	singles = {&lt;br /&gt;
...&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	ranges = {&lt;br /&gt;
...&lt;br /&gt;
	},&lt;br /&gt;
	-- Scripts.txt gives full names; here we consider them aliases to save space.&lt;br /&gt;
	aliases = {&lt;br /&gt;
...&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
]]&lt;br /&gt;
	&lt;br /&gt;
	local printed_ranges = Array()&lt;br /&gt;
	for _, range in ipairs(script_ranges) do&lt;br /&gt;
		local low, high, script_code = unpack(range)&lt;br /&gt;
		printed_ranges:insert(('\t\t{ 0x%05X, 0x%05X, &amp;quot;%s&amp;quot; },'):format(low, high, script_code))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local printed_singles = Array()&lt;br /&gt;
	for codepoint, script_code in require 'Module:TableTools'.sortedPairs(singles) do&lt;br /&gt;
		printed_singles:insert(('\t\t[0x%05X] = &amp;quot;%s&amp;quot;,'):format(codepoint, script_code))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local printed_script_name_to_code = Array()&lt;br /&gt;
	for name, code in require 'Module:TableTools'.sortedPairs(script_name_to_code,&lt;br /&gt;
			function(name1, name2)&lt;br /&gt;
				return script_name_to_code[name1] &amp;lt; script_name_to_code[name2]&lt;br /&gt;
			end) do&lt;br /&gt;
		printed_script_name_to_code:insert(('\t\t%s = &amp;quot;%s&amp;quot;,'):format(code, name:gsub('_', ' ')))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = template&lt;br /&gt;
		:gsub('%.%.%.', printed_singles:concat('\n'), 1)&lt;br /&gt;
		:gsub('%.%.%.', printed_ranges:concat('\n'), 1)&lt;br /&gt;
		:gsub('%.%.%.', printed_script_name_to_code:concat('\n'), 1)&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.highlight(lua_code)&lt;br /&gt;
	return mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &amp;quot;syntaxhighlight&amp;quot;,&lt;br /&gt;
		content = lua_code,&lt;br /&gt;
		args = { lang = &amp;quot;lua&amp;quot; }&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local dir = 'User:Erutuon/Unicode'&lt;br /&gt;
	local scripts_txt = dir .. '/Scripts.txt'&lt;br /&gt;
	local property_value_aliases_txt = dir ..'/PropertyValueAliases.txt'&lt;br /&gt;
	&lt;br /&gt;
	return p.highlight(p.make_script_data(scripts_txt, property_value_aliases_txt))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>