Modul:Category handler
Izgled
Modul sadrži implementaciju predloška {{Category handler}}.
Ova će dokumentacija pojasniti kako koristiti modul u drugim modulima. Za korištenje u predlošcima, molim pogledajte dokumentaciju istoimenog predloška.
Korištenje iz drugih Lua modula
Kad ne koristiti ovaj modul
Ako modul treba kategorizirati samo jednu vrstu sadržaja (npr. samo datoteke, ili samo predloške), nije poželjno koristiti ovaj modul. Takvu kategorizaciju moguće je napraviti sljedećim kodom:
local title = mw.title.getCurrentTitle() -- dohvati naslov stranice
if title.nsText == 'Datoteka' then -- ako je imenski prostor naslova jednak
-- uradi nešto
end
Ako trebate zasebno kategorizirati različite vrste sadržaja, poželjno je koristiti ovaj modul.
Imenski prostori
Modul radi s imenima imenskih prostora na ovoj Wikipediji.
- glavni - glavni imenski prostor
- razgovor - sve razgovorne stranice (razgovor sa suradnikom, razgovor o predlošku, ...)
- datoteka, wikipedija, suradnik - imena ostalih imenskih prostora. Pogledajte tablicu niže za puni popis
- other - svi ostali imenski prostori koji nisu poimence navedeni
Popis imenskih prostora
- (bez prostora razgovor i other)
Imenski prostor | Aliasi |
---|---|
main
|
glavni , glavno
|
suradnik
|
user , sur , u , suradnica
|
wikipedija
|
project , wikipedia , wp
|
datoteka
|
file , dt , slika , image
|
mediawiki
|
me
|
predložak
|
template
|
pomoć
|
help , pm , h
|
kategorija
|
category , kt , ct
|
portal
|
|
dodatak
|
|
nacrt
|
draft
|
timedtext
|
|
modul
|
module , md , mod
|
Primjeri korištenja
Modul prima dva ili više parametara.
Općeniti primjer
Niže je primjer korištenja:
p = {}
local categoryHandler = require('Module:Category handler').main
function p.main( frame )
local rezultat = 'Ovaj je modul namijenjen za GIP i razgovore.'
local kategorija = categoryHandler{
glavni = '[[Kategorija:Neka kategorija1]]', -- Kategorizacija u GIP-u
razgovor = '[[Kategorija:Neka kategorija2]]', -- Kategorizacija u razgovorima
other = '[[Kategorija:Neka kategorija3]]', -- Kategorizacija u ostalim imenskim prostorima
nocat = frame.args.nocat -- kako bi "nocat=true/false" radilo
}
kategorija = kategorija or '' -- izbjegava grešku ako kategorija nije zadana
return rezultat .. kategorija
end
return p
Pojašnjenje koda:
- Uzmimo da je primjer iznad dio modula Foo. Modul Foo možemo dodati u predložak ili pojedinačne stranice pisanjem
{{#invoke:foo|main}}
.
Zbog gornjeg koda predložak ili stranice s tim modulom svrstavat će se u kategoriju Kategorija:Neka kategorija1 ako su u GIP-u, u kategoriju Kategorija:Neka kategorija2 ako su na kakvoj razgovornoj stranici ili u kategoriju Kategorija:Neka kategorija3 ako se nalaze negdje drugdje.
- U pojedinačni poziv predloška ili modula možemo staviti
|nocat=true
da se gornji vid kategorizacije ne provodi zasebno za svaki predložak ili modul.
Ista kategorija za više imenskih prostora
Ako trebamo više različitih imenskih prostora svrstati u istu kategoriju, činimo to ovako:
p = {}
local categoryHandler = require('Module:Category handler').main
function p.main( frame )
local rezultat = 'Ovaj je modul namijenjen za GIP i razgovore.'
local kategorija = categoryHandler{
glavni = '[[Kategorija:Neka kategorija1]]', -- Kategorizacija u GIP-u
[1] = '[[Kategorija:Neka kategorija2]]', -- prvi neimenovani parametar dodjeljujemo kategoriji
pomoć = 1, -- imenski prostor pomoći...
suradnik = 1, -- i imenski prostor suradnika smještaju se u kategoriju navedenu pod [1]
razgovor = '', -- bez kategorije na razgovornim stranicama
nocat = frame.args.nocat -- kako bi "nocat=true/false" radilo
}
kategorija = kategorija or '' -- izbjegava grešku ako kategorija nije zadana
return rezultat .. kategorija
end
return p
--------------------------------------------------------------------------------
-- --
-- CATEGORY HANDLER --
-- --
-- This module implements the {{category handler}} template in Lua, --
-- with a few improvements: all namespaces and all namespace aliases --
-- are supported, and namespace names are detected automatically for --
-- the local wiki. This module requires [[Module:Namespace detect]] --
-- and [[Module:Yesno]] to be available on the local wiki. It can be --
-- configured for different wikis by altering the values in --
-- [[Module:Category handler/config]], and pages can be blacklisted --
-- from categorisation by using [[Module:Category handler/blacklist]]. --
-- --
--------------------------------------------------------------------------------
-- Load required modules
local yesno = require('Module:Yesno')
-- Lazily load things we don't always need
local mShared, mappings
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function trimWhitespace(s, removeBlanks)
if type(s) ~= 'string' then
return s
end
s = s:match('^%s*(.-)%s*$')
if removeBlanks then
if s ~= '' then
return s
else
return nil
end
else
return s
end
end
--------------------------------------------------------------------------------
-- CategoryHandler class
--------------------------------------------------------------------------------
local CategoryHandler = {}
CategoryHandler.__index = CategoryHandler
function CategoryHandler.new(data, args)
local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)
-- Set the title object
do
local pagename = obj:parameter('demopage')
local success, titleObj
if pagename then
success, titleObj = pcall(mw.title.new, pagename)
end
if success and titleObj then
obj.title = titleObj
if titleObj == mw.title.getCurrentTitle() then
obj._usesCurrentTitle = true
end
else
obj.title = mw.title.getCurrentTitle()
obj._usesCurrentTitle = true
end
end
-- Set suppression parameter values
for _, key in ipairs{'nocat', 'categories'} do
local value = obj:parameter(key)
value = trimWhitespace(value, true)
obj['_' .. key] = yesno(value)
end
do
local subpage = obj:parameter('subpage')
local category2 = obj:parameter('category2')
if type(subpage) == 'string' then
subpage = mw.ustring.lower(subpage)
end
if type(category2) == 'string' then
subpage = mw.ustring.lower(category2)
end
obj._subpage = trimWhitespace(subpage, true)
obj._category2 = trimWhitespace(category2) -- don't remove blank values
end
return obj
end
function CategoryHandler:parameter(key)
local parameterNames = self._data.parameters[key]
local pntype = type(parameterNames)
if pntype == 'string' or pntype == 'number' then
return self._args[parameterNames]
elseif pntype == 'table' then
for _, name in ipairs(parameterNames) do
local value = self._args[name]
if value ~= nil then
return value
end
end
return nil
else
error(string.format(
'invalid config key "%s"',
tostring(key)
), 2)
end
end
function CategoryHandler:isSuppressedByArguments()
return
-- See if a category suppression argument has been set.
self._nocat == true
or self._categories == false
or (
self._category2
and self._category2 ~= self._data.category2Yes
and self._category2 ~= self._data.category2Negative
)
-- Check whether we are on a subpage, and see if categories are
-- suppressed based on our subpage status.
or self._subpage == self._data.subpageNo and self.title.isSubpage
or self._subpage == self._data.subpageOnly and not self.title.isSubpage
end
function CategoryHandler:shouldSkipBlacklistCheck()
-- Check whether the category suppression arguments indicate we
-- should skip the blacklist check.
return self._nocat == false
or self._categories == true
or self._category2 == self._data.category2Yes
end
function CategoryHandler:matchesBlacklist()
if self._usesCurrentTitle then
return self._data.currentTitleMatchesBlacklist
else
mShared = mShared or require('Module:Category handler/shared')
return mShared.matchesBlacklist(
self.title.prefixedText,
mw.loadData('Module:Category handler/blacklist')
)
end
end
function CategoryHandler:isSuppressed()
-- Find if categories are suppressed by either the arguments or by
-- matching the blacklist.
return self:isSuppressedByArguments()
or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()
end
function CategoryHandler:getNamespaceParameters()
if self._usesCurrentTitle then
return self._data.currentTitleNamespaceParameters
else
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
return mShared.getNamespaceParameters(
self.title,
mappings
)
end
end
function CategoryHandler:namespaceParametersExist()
-- Find whether any namespace parameters have been specified.
-- We use the order "all" --> namespace params --> "other" as this is what
-- the old template did.
if self:parameter('all') then
return true
end
if not mappings then
mShared = mShared or require('Module:Category handler/shared')
mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData
end
for ns, params in pairs(mappings) do
for i, param in ipairs(params) do
if self._args[param] then
return true
end
end
end
if self:parameter('other') then
return true
end
return false
end
function CategoryHandler:getCategories()
local params = self:getNamespaceParameters()
local nsCategory
for i, param in ipairs(params) do
local value = self._args[param]
if value ~= nil then
nsCategory = value
break
end
end
if nsCategory ~= nil or self:namespaceParametersExist() then
-- Namespace parameters exist - advanced usage.
if nsCategory == nil then
nsCategory = self:parameter('other')
end
local ret = {self:parameter('all')}
local numParam = tonumber(nsCategory)
if numParam and numParam >= 1 and math.floor(numParam) == numParam then
-- nsCategory is an integer
ret[#ret + 1] = self._args[numParam]
else
ret[#ret + 1] = nsCategory
end
if #ret < 1 then
return nil
else
return table.concat(ret)
end
elseif self._data.defaultNamespaces[self.title.namespace] then
-- Namespace parameters don't exist, simple usage.
return self._args[1]
end
return nil
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- Used for testing purposes.
return {
CategoryHandler = CategoryHandler
}
end
function p._main(args, data)
data = data or mw.loadData('Module:Category handler/data')
local handler = CategoryHandler.new(data, args)
if handler:isSuppressed() then
return nil
end
return handler:getCategories()
end
function p.main(frame, data)
data = data or mw.loadData('Module:Category handler/data')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = data.wrappers,
valueFunc = function (k, v)
v = trimWhitespace(v)
if type(k) == 'number' then
if v ~= '' then
return v
else
return nil
end
else
return v
end
end
})
return p._main(args, data)
end
return p