Line 132:
Line 132:
end
end
−
function Utils.imax(arr)
+
function Utils.imax(arr, def)
local maxValue
local maxValue
local maxIndex
local maxIndex
Line 141:
Line 141:
end
end
end
end
−
return maxValue
+
return maxValue or def
end
end
−
function Utils.imin(arr)
+
function Utils.imin(arr, def)
local minValue
local minValue
local minIndex
local minIndex
Line 153:
Line 153:
end
end
end
end
−
return minValue
+
return minValue or def
end
end
Line 490:
Line 490:
return result
return result
+
end
+
+
Utils.romanizable = {'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk', 'zh-sg', 'zh-mo', 'zh-my', 'ja', 'ko', 'vi'}
+
+
Utils.normalization_table = {[' '] = ' ', ['~'] = '~', ['!'] = '!', ['?'] = '?'}
+
+
-- checks if string is set and if it's non-empty
+
function Utils.isset(target)
+
return target ~= nil and target ~= ""
+
end
+
+
--[[ simulates the (a ? b : c) notation of C/C++ and PHP languages.
+
Similar to {{#if:{{{a|}}}|{{{b|}}}|{{{c|}}}}} from parser functions. ]]
+
function Utils.cv(a, b, c)
+
if a then return b else return c end
+
end
+
+
--slices a table to return another table containing values within a certain range
+
--source: http://snippets.luacode.org/snippets/Table_Slice_116
+
function Utils.sliceTable (values,i1,i2)
+
local res = {}
+
local n = #values
+
-- default values for range
+
i1 = i1 or 1
+
i2 = i2 or n
+
if i2 < 0 then
+
i2 = n + i2 + 1
+
elseif i2 > n then
+
i2 = n
+
end
+
if i1 < 1 or i1 > n then
+
return {}
+
end
+
local k = 1
+
for i = i1,i2 do
+
res[k] = values[i]
+
k = k + 1
+
end
+
return res
+
end
+
+
-- checks if a given page exists
+
function Utils.exists(page)
+
if not Utils.isset(page) then return false end
+
return mw.getCurrentFrame():preprocess('{{#ifexist:' .. page .. '|1|0}}') == '1'
+
end
+
+
--[[ Tries to get contents of a page with given name.
+
If the function fails it returns nil (page doesn't exist or can't be loaded)
+
On success it returns the contents of page (it can be be partially preprocessed, so watch out for parser markers). ]]
+
function Utils.getPage(name)
+
if not Utils.isset(name) then return nil end
+
+
local frame = mw.getCurrentFrame()
+
+
-- do a safe call to catch possible errors, like "template doesn't exist"
+
local stat,page = pcall(frame.expandTemplate, frame, {title = ':' .. name})
+
+
if not stat then
+
-- TODO: 'page' contains the error message. Do some debugging?
+
return nil
+
end
+
+
return page
+
end
+
+
function Utils.stripTags(text)
+
if Utils.isset(text) then
+
local tmp
+
repeat
+
tmp = text
+
-- a pair of tags, like <td style="">...</td>
+
text = string.gsub(text, '<%s*(%w+).->(.-)<%s*/%s*%1%s*>', '%2')
+
-- closed tag, like <br/>
+
text = string.gsub(text, '<%s*%w+%s*/%s*>', '')
+
until tmp == text
+
end
+
return text
+
end
+
+
--[[ Sort table and remove repeating elements.
+
Since tbl is passed as reference, any changes in it will affect the passed table. ]]
+
function Utils.trunkTable(tbl)
+
table.sort(tbl)
+
local last
+
local redo
+
repeat
+
redo = false
+
last = nil
+
for k,v in pairs(tbl) do
+
if v ~= last then
+
last = v
+
else
+
table.remove(tbl, k)
+
redo = true
+
break
+
end
+
end
+
until not redo
+
end
+
+
--[[ Checks if a given value is among the elements of a table and returns its index.
+
Returns nil if it can't find it. ]]
+
function Utils.isInTable(tbl, val)
+
for k,v in pairs(tbl) do
+
if v == val then return k end
+
end
+
return nil
+
end
+
+
--[[ Compare 'n' elements in two tables, starting from 's1' in first table and 's2' in second table. ]]
+
function Utils.partialTableCompare(t1, t2, s1, s2, n)
+
if n < 1 then return true end -- basically there's nothing to compare, so no differences were found
+
+
for i = 0,(n-1) do
+
-- Note that nil values are also valid.
+
if t1[s1+i] ~= t2[s2+i] then return false end
+
end
+
+
return true
end
end
return Utils
return Utils