Difference between revisions of "Module:Category handler"
From BESA® Wiki
(allow invocations specifying the page parameter to use the mw.loadData optimisations, and don't call mw.title.new every time) |
(start a replacement for Template:Category handler) |
||
(17 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | + | local basepageSubpage = require('Module:Basepage subpage').main | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | -- | + | -- Configuration data. |
− | local | + | local cfg = {} |
− | + | cfg.nocat = 'nocat' | |
− | + | cfg.categories = 'categories' | |
+ | cfg.subpage = 'subpage' | ||
+ | cfg.page = 'page' | ||
+ | cfg.category2 = 'category2' | ||
+ | cfg.all = 'all' | ||
+ | cfg.main = 'main' | ||
+ | cfg.other = 'other' | ||
+ | -- Module start. | ||
local p = {} | local p = {} | ||
+ | local args = {} | ||
− | ---------- | + | -- Get the page object. This will return the page object for the page |
− | -- | + | -- specified, or nil if there are errors in the title or if the |
− | -- | + | -- expensive function count has been exceeded. |
− | + | local function getPageObject() | |
− | local | + | -- Get the title object for args.page if it is specified. Otherwise |
− | + | -- get the title object for the current page. | |
− | + | if args[cfg.page] then | |
− | + | -- Get the page object, passing the function through pcall | |
− | + | -- in case we are over the expensive function count limit. | |
− | + | local noError, pageObject = pcall(mw.title.new, args[cfg.page]) | |
− | + | if not noError then | |
− | + | return nil | |
− | + | else | |
− | + | return pageObject | |
− | + | end | |
− | + | else | |
− | + | return mw.title.getCurrentTitle() | |
− | + | end | |
end | end | ||
− | -- | + | -- Find whether we need to return a category or not. |
− | + | local function needsCategory( pageObject ) | |
− | + | if not pageObject then return end | |
− | + | if args[cfg.nocat] == 'true' | |
− | local | + | or ( args[cfg.category2] and args[cfg.category2] ~= 'yes' ) |
− | + | or ( args[cfg.subpage] == 'no' and pageObject.isSubpage ) | |
− | + | or ( args[cfg.subpage] == 'only' and not pageObject.isSubpage ) then | |
− | function | + | return false |
− | + | else | |
− | + | return true | |
− | + | end | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | + | -- Find whether we need to check the blacklist or not. | |
− | + | local function needsBlacklistCheck() | |
− | + | if args[cfg.nocat] == 'false' | |
− | + | or args[cfg.categories] == 'yes' | |
− | + | or args[cfg.category2] == 'yes' then | |
− | + | return false | |
− | + | else | |
− | + | return true | |
− | + | end | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | function | + | local function _main() |
− | + | local pageObject = getPageObject() | |
− | + | if not needsCategory( pageObject ) then return end | |
− | + | ||
− | + | return needsBlacklistCheck() | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | + | -- Process the arguments. | |
− | + | function p.main(frame) | |
− | + | -- If called via #invoke, use the args passed into the invoking | |
− | + | -- template, or the args passed to #invoke if any exist. Otherwise | |
− | + | -- assume args are being passed directly in. | |
− | + | local origArgs | |
− | + | if frame == mw.getCurrentFrame() then | |
− | + | origArgs = frame:getParent().args | |
− | function | + | for k, v in pairs( frame.args ) do |
− | + | origArgs = frame.args | |
− | + | break | |
− | + | end | |
− | + | else | |
− | + | origArgs = frame | |
− | + | end | |
− | + | ||
− | + | -- The following don't need blank values preserved: | |
− | + | -- nocat | |
− | + | -- categories | |
− | + | -- subpage | |
− | + | -- page | |
− | + | -- positional parameters (1-10) | |
− | + | ||
− | + | -- The following *do* need blank values preserved | |
− | + | -- category2 | |
− | + | -- all | |
− | + | -- other | |
− | + | -- main | |
− | + | -- all the namespace parameters | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | ----------------- | + | |
− | -- | + | |
− | -- | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | -- Trim whitespace and remove blank arguments for the following args: | |
− | + | -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". | |
− | + | for k, v in pairs(origArgs) do | |
− | + | v = mw.text.trim(v) -- Trim whitespace. | |
− | + | if type(k) == 'number' | |
− | + | or k == cfg.nocat | |
− | + | or k == cfg.categories | |
− | + | or k == cfg.subpage | |
− | + | or k == cfg.page then | |
− | + | if v ~= '' then | |
− | + | args[k] = v | |
− | + | end | |
− | + | else | |
− | + | args[k] = v | |
− | + | end | |
− | + | end | |
− | + | ||
− | + | -- Lower-case "nocat", "categories", "category2", and "subpage". | |
+ | local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } | ||
+ | for _, v in ipairs( lowercase ) do | ||
+ | if args[v] then | ||
+ | args[v] = mw.ustring.lower( args[v] ) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | return _main() | ||
end | end | ||
return p | return p |
Revision as of 10:13, 25 June 2013
Documentation for this module may be created at Module:Category handler/doc
Script error: Lua error: Internal error: The interpreter exited with status 126.
local basepageSubpage = require('Module:Basepage subpage').main -- Configuration data. local cfg = {} cfg.nocat = 'nocat' cfg.categories = 'categories' cfg.subpage = 'subpage' cfg.page = 'page' cfg.category2 = 'category2' cfg.all = 'all' cfg.main = 'main' cfg.other = 'other' -- Module start. local p = {} local args = {} -- Get the page object. This will return the page object for the page -- specified, or nil if there are errors in the title or if the -- expensive function count has been exceeded. local function getPageObject() -- Get the title object for args.page if it is specified. Otherwise -- get the title object for the current page. if args[cfg.page] then -- Get the page object, passing the function through pcall -- in case we are over the expensive function count limit. local noError, pageObject = pcall(mw.title.new, args[cfg.page]) if not noError then return nil else return pageObject end else return mw.title.getCurrentTitle() end end -- Find whether we need to return a category or not. local function needsCategory( pageObject ) if not pageObject then return end if args[cfg.nocat] == 'true' or ( args[cfg.category2] and args[cfg.category2] ~= 'yes' ) or ( args[cfg.subpage] == 'no' and pageObject.isSubpage ) or ( args[cfg.subpage] == 'only' and not pageObject.isSubpage ) then return false else return true end end -- Find whether we need to check the blacklist or not. local function needsBlacklistCheck() if args[cfg.nocat] == 'false' or args[cfg.categories] == 'yes' or args[cfg.category2] == 'yes' then return false else return true end end local function _main() local pageObject = getPageObject() if not needsCategory( pageObject ) then return end return needsBlacklistCheck() end -- Process the arguments. function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- template, or the args passed to #invoke if any exist. Otherwise -- assume args are being passed directly in. local origArgs if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args for k, v in pairs( frame.args ) do origArgs = frame.args break end else origArgs = frame end -- The following don't need blank values preserved: -- nocat -- categories -- subpage -- page -- positional parameters (1-10) -- The following *do* need blank values preserved -- category2 -- all -- other -- main -- all the namespace parameters -- Trim whitespace and remove blank arguments for the following args: -- 1, 2, 3 etc., "nocat", "categories", "subpage", and "page". for k, v in pairs(origArgs) do v = mw.text.trim(v) -- Trim whitespace. if type(k) == 'number' or k == cfg.nocat or k == cfg.categories or k == cfg.subpage or k == cfg.page then if v ~= '' then args[k] = v end else args[k] = v end end -- Lower-case "nocat", "categories", "category2", and "subpage". local lowercase = { cfg.nocat, cfg.categories, cfg.category2, cfg.subpage } for _, v in ipairs( lowercase ) do if args[v] then args[v] = mw.ustring.lower( args[v] ) end end return _main() end return p