- Welcome to Touhou Wiki!
- Registering is temporarily disabled. Check in our Discord server to request an account and for assistance of any kind.
Module:Common: Difference between revisions
DennouNeko (talk | contribs) (library of common functions) |
DennouNeko (talk | contribs) m (string.explode + dropping "frame" param from exists) |
||
Line 1: | Line 1: | ||
--[[ | --[[ | ||
Library for shared | Library for all the functions that are going to be shared by other scripts. | ||
To use all the functions NOT defined as local, add the following: | To use all the functions NOT defined as local, add at the beginning of script the following: | ||
require("Module:Common") | require("Module:Common") | ||
]] | ]] | ||
-- create global object common (for non-global, exported functions) | |||
common = {} | |||
-- checks if string is set and if it's non-empty | -- checks if string is set and if it's non-empty | ||
Line 13: | Line 16: | ||
function trim(s) | function trim(s) | ||
return s:gsub("^%s*(.-)%s*$", "%1") | return s:gsub("^%s*(.-)%s*$", "%1") | ||
end | |||
-- adds a method to string that splits it into a table, using sep as a delimiter | |||
function string.explode(str, sep) | |||
local pos = 1 | |||
local t = {} | |||
if not isset(sep) or not isset(#str) then return t end | |||
for s, e in function() return string.find(str, sep, pos) end do | |||
t[#t+1] = trim(string.sub(str, pos, s-1)) | |||
pos = e+1 | |||
end | |||
t[#t+1] = trim(string.sub(str, pos)) | |||
return t | |||
end | end | ||
-- checks if a given page exists, requires a frame object | -- checks if a given page exists, requires a frame object | ||
function exists( | function exists(page) | ||
if not isset(page) then return false end | if not isset(page) then return false end | ||
return | return mw.getCurrentFrame():preprocess('{{#ifexist:' .. page .. '|1|0}}') == '1' | ||
end | end |
Revision as of 23:15, 27 September 2012
Add the following code before using any of the functions from the "Common" library.
local common = require("Module:Common")
General notes for all modules:
- Don't remove functions without discussing it first. A lot of scripts may break if you do so.
- Before adding any new functions, test it first if there are no syntax errors, so the new fragment of code won't break scripts that are using this library.
- When modifying existing functions, make sure that the new version is compatible with old one. Any modification may only extend functionality, but can't reduce or change behavior of current version.
- Creation of global functions and variables is no longer possible. Everything that's going to be exported has to be returned at the end of module.
- Once again, test it before doing any modifications.
The names are being sorted in alphabetical order.
cv(a, b, c)
Useful in cases, when we have to choose one of 2 values to pass to same variable or table element.
If a evaluates to true then function will return b, otherwise it'll return c.
Part of code like
local tbl = {}
if condition then
tbl[#tbl+1] = 'TRUE'
else
tbl[#tbl+1] = 'FALSE'
end
can be simplified to
local tbl = {}
tbl[#tbl+1] = common.cv(condition, 'TRUE', 'FALSE')
exists(name)
Checks if given Touhou Wiki page exists. It uses the expensive preprocessor function {{#ifexist:Page name}}. Limit of expensive function calls for Touhou Wiki is currently 100. If that number is exceeded then for next calls exists will return false, whether page exists or not.
common.exists("Touhou Wiki")
will return true, unless the main page is going to be moved or deleted.
common.exists("Module:Common")
will return true or you'll get a nice, red "Script error" (unless you've implemented own exists).
getPage(name)
Tries to get contents of a given page. No expensive functions are being used.
This function will most probably fail for most of special pages, so it's generally usable for article pages.
If a given page doesn't exist or contents can't be retrieved, it'll return nil.
For example, following code will return the partially preprocessed text for main page:
local main = common.getPage("Touhou Wiki")
Page's content is partially preprocessed, so watch out for strip markers, especially in section headers. These are unique strings that start and end with 'DEL' character (127, 0x7f) and look like ⌦UNIQ3fc7e69e5822d9c0-nowiki-00000001-QINU⌫ (where ⌦ and ⌫ are starting and ending 'DEL' characters).
When retrieving page contents, section header == Documentation == is actually returned as text similar to ==⌦UNIQ3fc7e69e5822d9c0-h-6--QINU⌫ Documentation ==.
Usually it's not visible, because it's stripped from text displayed to users, but it's something to keep in mind when processing page contents in Lua (for example when searching for specific header).
Following code was used to expose the strip markers:
string.gsub(content, "%\127(UNIQ.-QINU)%\127", "⌦%1⌫")
isInTable(tbl, val)
Checks if given element exists in table and returns it's index. Returns nil if the element can't be found.
isset(val)
It will return false if passed argument is a nil value (undefined variable) or an empty string, and true in any other case.
partialTableCompare(tbl1, tbl2, s1, s2, n)
Compares n elements of two numbered tables, tbl1 and tbl2, starting with element s1 in table tbl1 and s2 in table tbl2 and returns true when appropriate elements in this range are equal, false if there's at least one difference.
In case that n=0 it'll return true, because it didn't find any differences.
stripTags(text)
Removes any valid HTML code from given string. It works only for proper pairs of opening and closing tags (like <div> </div>) or for closed tags (like <br/>).
sliceTable(values, i1, i2)
"Given a Lua table, extract a sub-array or slice. This function works like string.sub: if the end of the range is not specified, then everything up to the end is assumed; this argument can also be a negative number, where -1 is the end, -2 second-last, etc."
Source: http://snippets.luacode.org/snippets/Table_Slice_116
trunkTable(tbl)
The given table is sorted (using table.sort) and repeating elements are being removed. It directly modifies the passed table and no value is returned.
--[[
Library for all the functions that are going to be shared by other scripts.
To use all the functions NOT defined as local, add at the beginning of script the following:
require("Module:Common")
]]
-- create global object common (for non-global, exported functions)
common = {}
-- checks if string is set and if it's non-empty
function isset(target)
return target ~= nil and target ~= ""
end
-- removes preceding and trailing whitespaces from string
function trim(s)
return s:gsub("^%s*(.-)%s*$", "%1")
end
-- adds a method to string that splits it into a table, using sep as a delimiter
function string.explode(str, sep)
local pos = 1
local t = {}
if not isset(sep) or not isset(#str) then return t end
for s, e in function() return string.find(str, sep, pos) end do
t[#t+1] = trim(string.sub(str, pos, s-1))
pos = e+1
end
t[#t+1] = trim(string.sub(str, pos))
return t
end
-- checks if a given page exists, requires a frame object
function exists(page)
if not isset(page) then return false end
return mw.getCurrentFrame():preprocess('{{#ifexist:' .. page .. '|1|0}}') == '1'
end