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 |