<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Autils</id>
	<title>Module:utils - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Autils"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:utils&amp;action=history"/>
	<updated>2026-04-09T14:04:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:utils&amp;diff=220127&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;--[=[   Module:utils v0.3.1   Date: 2015-08-14    This module contains some common useful functions.   Fill free to add another universal functions here. ]=]--  local export =...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:utils&amp;diff=220127&amp;oldid=prev"/>
		<updated>2021-02-15T14:31:36Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--[=[   Module:utils v0.3.1   Date: 2015-08-14    This module contains some common useful functions.   Fill free to add another universal functions here. ]=]--  local export =...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[&lt;br /&gt;
  Module:utils v0.3.1&lt;br /&gt;
  Date: 2015-08-14&lt;br /&gt;
&lt;br /&gt;
  This module contains some common useful functions.&lt;br /&gt;
  Fill free to add another universal functions here.&lt;br /&gt;
]=]--&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
-- Function to clone table (sometimes it works better then mw.clone)&lt;br /&gt;
function export.clone(original)&lt;br /&gt;
    local copy = {}&lt;br /&gt;
    for key, value in pairs(original) do&lt;br /&gt;
        copy[key] = value&lt;br /&gt;
    end&lt;br /&gt;
    return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to get current PAGENAME and related&lt;br /&gt;
function export.get_base()&lt;br /&gt;
	local PAGENAME = mw.title.getCurrentTitle().text&lt;br /&gt;
	local SUBPAGENAME = mw.title.getCurrentTitle().subpageText&lt;br /&gt;
	local NAMESPACE = mw.title.getCurrentTitle().nsText&lt;br /&gt;
	&lt;br /&gt;
	if NAMESPACE == &amp;#039;User&amp;#039; or NAMESPACE == &amp;#039;Участник&amp;#039; then&lt;br /&gt;
		return SUBPAGENAME&lt;br /&gt;
	end&lt;br /&gt;
	return PAGENAME&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to iterate table with sorted keys (sorting function can be different)&lt;br /&gt;
function export.spairs(t, order)&lt;br /&gt;
    -- collect the keys&lt;br /&gt;
    local keys = {}&lt;br /&gt;
    for k in pairs(t) do keys[#keys+1] = k end&lt;br /&gt;
    -- sort&lt;br /&gt;
    if order then&lt;br /&gt;
        table.sort(keys, function(a,b) return order(t, a, b) end)&lt;br /&gt;
    else&lt;br /&gt;
        table.sort(keys)&lt;br /&gt;
    end&lt;br /&gt;
    -- return the iterator function&lt;br /&gt;
    local i = 0&lt;br /&gt;
    return function()&lt;br /&gt;
        i = i + 1&lt;br /&gt;
        if keys[i] then&lt;br /&gt;
            return keys[i], t[keys[i]]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Functions to measure working time of scripts (start)&lt;br /&gt;
function export.start()&lt;br /&gt;
	export.started = os.clock()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Functions to measure working time of scripts (stop)&lt;br /&gt;
function export.stop(desc)&lt;br /&gt;
	export.stoped = os.clock()&lt;br /&gt;
	export.delta = export.stoped - export.started&lt;br /&gt;
	if desc == nil then&lt;br /&gt;
		desc = &amp;#039;time delta&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	mw.log(&amp;#039;™ &amp;#039; .. desc .. &amp;#039; = &amp;#039; .. export.delta)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to find common part (length) of two strings&lt;br /&gt;
-- (common part from the beginning of strings)&lt;br /&gt;
function export.find_common(str_1, str_2)&lt;br /&gt;
	if not str_1 or not str_2 then&lt;br /&gt;
		return 1&lt;br /&gt;
	end&lt;br /&gt;
	for pos = 1, #str_1 do&lt;br /&gt;
	    local char_1 = str_1:sub(pos, pos)&lt;br /&gt;
	    local char_2 = str_2:sub(pos, pos)&lt;br /&gt;
	    if char_1 ~= char_2 then&lt;br /&gt;
	    	return pos&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
	return 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function that allows easily add values into dict of dicts of lists&lt;br /&gt;
-- Example of this structure:&lt;br /&gt;
--   dict = {&lt;br /&gt;
--     key1 = {&lt;br /&gt;
--       sub_key1 = {value1, value2, value3},&lt;br /&gt;
--       sub_key2 = {value4, value5},&lt;br /&gt;
--     },&lt;br /&gt;
--     key2 = {&lt;br /&gt;
--       sub_key3 = {value6},&lt;br /&gt;
--       sub_key4 = {value7, value8},&lt;br /&gt;
--     },&lt;br /&gt;
--   }&lt;br /&gt;
function export.put_value(dict, key, sub_key, value)&lt;br /&gt;
	if not dict[key] then&lt;br /&gt;
		dict[key] = {}&lt;br /&gt;
	end&lt;br /&gt;
	if not dict[key][sub_key] then&lt;br /&gt;
		dict[key][sub_key] = {}&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(dict[key][sub_key], value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Compare two items, recursively comparing lists.&lt;br /&gt;
-- FIXME, doesn&amp;#039;t work for tables that aren&amp;#039;t lists.&lt;br /&gt;
function export.equals(x, y)&lt;br /&gt;
    if type(x) == &amp;quot;table&amp;quot; and type(y) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        if #x ~= #y then&lt;br /&gt;
            return false&lt;br /&gt;
        end &lt;br /&gt;
        for key, value in ipairs(x) do&lt;br /&gt;
            if not export.equals(value, y[key]) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return x == y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- true if list contains item&lt;br /&gt;
function export.contains(tab, item)&lt;br /&gt;
    for _, value in pairs(tab) do&lt;br /&gt;
        if export.equals(value, item) then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- append to list if element not already present&lt;br /&gt;
function export.insert_if_not(tab, item, pos)&lt;br /&gt;
    if not export.contains(tab, item) then&lt;br /&gt;
    	if pos then&lt;br /&gt;
        	table.insert(tab, pos, item)&lt;br /&gt;
        else&lt;br /&gt;
        	table.insert(tab, item)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- convert list to set&lt;br /&gt;
function export.list_to_set(list)&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, item in ipairs(list) do&lt;br /&gt;
		set[item] = true&lt;br /&gt;
	end&lt;br /&gt;
	return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Inhibit Regular Expression magic characters ^$()%.[]*+-?)&lt;br /&gt;
function export.escape(value)&lt;br /&gt;
    -- Prefix every non-alphanumeric character (%W) with a % escape character, &lt;br /&gt;
    -- where %% is the % escape, and %1 is original character&lt;br /&gt;
    return mw.ustring.gsub(value, &amp;quot;(%W)&amp;quot;,&amp;quot;%%%1&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>