<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AUKB</id>
	<title>Module:UKB - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AUKB"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:UKB&amp;action=history"/>
	<updated>2026-06-15T20:53:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:UKB&amp;diff=479832&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:UKB&amp;diff=479832&amp;oldid=prev"/>
		<updated>2021-07-16T07:43:36Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;uk = {}&lt;br /&gt;
&lt;br /&gt;
local messages = {&lt;br /&gt;
    ['and'] = 'and',&lt;br /&gt;
    ['or'] = 'or',&lt;br /&gt;
    ['page_at_site'] = '%(page)s at %(site)s',&lt;br /&gt;
    ['argument_missing'] = 'Argument missing: %s',&lt;br /&gt;
    ['anon_argument_missing'] = 'No %s specified',&lt;br /&gt;
    ['invalid_criterion'] = '&amp;quot;%s&amp;quot; is not a valid criterion',&lt;br /&gt;
    ['invalid_rule'] = '&amp;quot;%s&amp;quot; is not a valid points rule',&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    -- Criteria&lt;br /&gt;
&lt;br /&gt;
    ['templates'] = 'templates',&lt;br /&gt;
    ['templates_criterion_singular'] = 'having the template %s',&lt;br /&gt;
    ['templates_criterion_plural'] = 'having at least one of the templates %s',&lt;br /&gt;
&lt;br /&gt;
    ['categories'] = 'categories',&lt;br /&gt;
    ['categories_criterion_singular'] = 'in the category %s',&lt;br /&gt;
    ['categories_criterion_plural'] = 'in at least one of the categories %s',&lt;br /&gt;
    ['categories_criterion_ignore'] = ', but not in %s',&lt;br /&gt;
&lt;br /&gt;
    ['backlinks'] = 'backlinks',&lt;br /&gt;
    ['backlinks_criterion_singular'] = 'linked to from %s',&lt;br /&gt;
    ['backlinks_criterion_plural'] = 'linked to from %s',&lt;br /&gt;
&lt;br /&gt;
    ['forwardlinks'] = 'forwardlinks',&lt;br /&gt;
    ['forwardlinks_criterion_singular'] = 'that links to %s',&lt;br /&gt;
    ['forwardlinks_criterion_plural'] = 'that links to %s',&lt;br /&gt;
&lt;br /&gt;
    ['pages'] = 'pages',&lt;br /&gt;
    ['pages_criterion_singular'] = '%s',&lt;br /&gt;
    ['pages_criterion_plural'] = '%s',&lt;br /&gt;
&lt;br /&gt;
    ['sparql_criterion'] = 'have a Wikidata item matching [%(queryLink)s this SPARQL query]',&lt;br /&gt;
    ['sparql_criterion_with_explanation'] = '%(description)s ([%(queryLink)s Wikidata query])',&lt;br /&gt;
&lt;br /&gt;
    ['bytes_criterion'] = 'expanded with at least %s bytes',&lt;br /&gt;
&lt;br /&gt;
    ['namespaces_criterion_singular'] = 'is a/an %s',&lt;br /&gt;
    ['namespaces_criterion_plural'] = 'is a/an %s',&lt;br /&gt;
    ['article'] = 'article',&lt;br /&gt;
&lt;br /&gt;
    ['new_criterion'] = 'created during the contest',&lt;br /&gt;
    ['new_criterion_with_redirects'] = 'created during the contest (including redirects)',&lt;br /&gt;
&lt;br /&gt;
    ['existing_criterion'] = 'created before the contest started (existing pages)',&lt;br /&gt;
&lt;br /&gt;
    -- Rules&lt;br /&gt;
&lt;br /&gt;
    ['base_rule_max'] = '%(baserule)s, but max %(maxpoints)s points per page',&lt;br /&gt;
&lt;br /&gt;
    ['newpage_rule'] = '%(points)s points awarded for creating a new page (not redirect)',&lt;br /&gt;
    ['newredirect_rule'] = '%(points)s points awarded for creating a new redirect',&lt;br /&gt;
    ['page_rule'] = '%(points)s points awarded for every qualified page',&lt;br /&gt;
    ['edit_rule'] = '%(points)s points awarded for every edit',&lt;br /&gt;
    ['byte_rule'] = '%(points)s points awarded for every byte added',&lt;br /&gt;
    ['listbyte_rule'] = '%(points)s points awarded for every byte added to a a list article',&lt;br /&gt;
    ['word_rule'] = '%(points)s points awarded for every word added to the article body (excluding templates, tables etc.)',&lt;br /&gt;
&lt;br /&gt;
    ['image_rule'] = '%(points)s points awarded for every media file added',&lt;br /&gt;
    ['image_rule_limited'] = '%(points)s points awarded for every media file added to pages that had no more than %(initialimagelimit)s from before',&lt;br /&gt;
    ['image_rule_own'] = '(%(ownimage)s for self-uploaded)',&lt;br /&gt;
&lt;br /&gt;
    ['reference_rule'] = '%(points)s points awarded for every source added and %(refpoints)s points for every reference to an existing source',&lt;br /&gt;
    ['templateremoval_rule'] = '%(points)s points awarded for removal of %(templates)s',&lt;br /&gt;
    ['categoryremoval_rule'] = '%(points)s points awarded for removal of %(categories)s',&lt;br /&gt;
    ['exlink_rule'] = '%(points)s points awarded for every [[WP:EL|external link]] added',&lt;br /&gt;
&lt;br /&gt;
    ['wikidata_rule_first'] = '%(points)s points awarded for addition of %(thing)s to items not already having such a statement',&lt;br /&gt;
    ['wikidata_rule_all'] = '%(points)s points awarded for every %(thing)s added',&lt;br /&gt;
    ['wikidata_rule_require_reference'] = '(only referenced)',&lt;br /&gt;
    ['properties'] = 'properties',&lt;br /&gt;
    ['labels'] = 'labels',&lt;br /&gt;
    ['aliases'] = 'aliases',&lt;br /&gt;
    ['descriptions'] = 'descriptions',&lt;br /&gt;
    ['label'] = 'Wikidata label',&lt;br /&gt;
    ['alias'] = 'Wikidata alias',&lt;br /&gt;
    ['description'] = 'Wikidata description',&lt;br /&gt;
&lt;br /&gt;
    ['bytebonus_rule'] = '%(points)s bonus points when more than %(bytes)d byte were added to a page',&lt;br /&gt;
    ['wordbonus_rule'] = '%(points)s bonus points when %(action)s more than %(words)d words were added to a page',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local config = {&lt;br /&gt;
    ['decimal_separator'] = '.',&lt;br /&gt;
    ['template_link_template'] = 'Tl',&lt;br /&gt;
    ['error_message_template'] = 'Error',&lt;br /&gt;
    -- Map localized argument values for the criterion template&lt;br /&gt;
    ['criteria'] = {&lt;br /&gt;
        ['new'] = 'new',&lt;br /&gt;
        ['existing'] = 'existing',&lt;br /&gt;
        ['stub'] = 'stub',&lt;br /&gt;
        ['bytes'] = 'bytes',&lt;br /&gt;
        ['namespaces'] = 'namespaces',&lt;br /&gt;
        ['categories'] = 'categories',&lt;br /&gt;
        ['templates'] = 'templates',&lt;br /&gt;
        ['backlinks'] = 'backlinks',&lt;br /&gt;
        ['forwardlinks'] = 'forwardlinks',&lt;br /&gt;
        ['pages'] = 'pages',&lt;br /&gt;
        ['sparql'] = 'sparql',&lt;br /&gt;
    },&lt;br /&gt;
    -- Localized argument values for the rule template&lt;br /&gt;
    ['rules'] = {&lt;br /&gt;
        ['new'] = 'newpage',&lt;br /&gt;
        ['redirect'] = 'newredirect',&lt;br /&gt;
        ['qualified'] = 'page',&lt;br /&gt;
        ['edit'] = 'edit',&lt;br /&gt;
        -- ['stub'] = '(deprecated)',&lt;br /&gt;
        ['byte'] = 'byte',&lt;br /&gt;
        ['listbyte'] = 'listbyte',&lt;br /&gt;
        ['word'] = 'word',&lt;br /&gt;
        ['image'] = 'image',&lt;br /&gt;
        ['ref'] = 'reference',&lt;br /&gt;
        ['bytebonus'] = 'bytebonus',&lt;br /&gt;
        ['wordbonus'] = 'wordbonus',&lt;br /&gt;
        ['templateremoval'] = 'templateremoval',&lt;br /&gt;
        ['categoryremoval'] = 'categoryremoval',&lt;br /&gt;
        ['exlink'] = 'exlink',&lt;br /&gt;
        ['wikidata'] = 'wikidata'&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local category_prefix = {&lt;br /&gt;
    ['se'] = 'se:Kategoriija',&lt;br /&gt;
    ['nn'] = 'nn:Kategori',&lt;br /&gt;
    ['no'] = 'no:Kategori',&lt;br /&gt;
    ['commons'] = 'commons:Category',&lt;br /&gt;
    ['default'] = 'Category'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[ Helper methods ] ------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[ Named Parameters with Formatting Codes&lt;br /&gt;
     Source: &amp;lt;http://lua-users.org/wiki/StringInterpolation&amp;gt;, author:RiciLake ]]&lt;br /&gt;
local function sprintf(s, tab)&lt;br /&gt;
    return (s:gsub('%%%((%a%w*)%)([-0-9%.]*[cdeEfgGiouxXsq])',&lt;br /&gt;
            function(k, fmt) return tab[k] and (&amp;quot;%&amp;quot;..fmt):format(tab[k]) or&lt;br /&gt;
                '%('..k..')'..fmt end))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_error(template, arg)&lt;br /&gt;
    return string.format(&lt;br /&gt;
        '{{%s|%s}}',&lt;br /&gt;
        config['error_message_template'],&lt;br /&gt;
        string.format(messages[template], arg)&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_args(frame)&lt;br /&gt;
    local args = {}&lt;br /&gt;
    local kwargs = {}&lt;br /&gt;
    for k, v in pairs(frame.args) do&lt;br /&gt;
        v = mw.text.trim(frame:preprocess(v))&lt;br /&gt;
        if v ~= '' then&lt;br /&gt;
            if type(k) == 'number' then&lt;br /&gt;
                args[k] = v&lt;br /&gt;
            else&lt;br /&gt;
                kwargs[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return args, kwargs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function shift_args(in_args)&lt;br /&gt;
    local args = {}&lt;br /&gt;
    for i, v in ipairs(in_args) do&lt;br /&gt;
        if i &amp;gt; 1 then&lt;br /&gt;
            args[i - 1] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return in_args[1], args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function format_plural(items, item_type)&lt;br /&gt;
    if #items == 0 then&lt;br /&gt;
        return make_error('anon_argument_missing', messages[item_type])&lt;br /&gt;
    end&lt;br /&gt;
    if #items == 1 then&lt;br /&gt;
        return items[1]&lt;br /&gt;
    end&lt;br /&gt;
    return mw.text.listToText(items, ', ', ' ' .. messages['or'] .. ' ')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_plural_criterion(items, item_type)&lt;br /&gt;
    local value = format_plural(items, item_type)&lt;br /&gt;
    if #items == 0 then&lt;br /&gt;
        return value&lt;br /&gt;
    end&lt;br /&gt;
    if #items == 1 then&lt;br /&gt;
        return string.format(messages[item_type .. '_criterion_singular'], value)&lt;br /&gt;
    end&lt;br /&gt;
    return string.format(messages[item_type .. '_criterion_plural'], value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_template_list(args)&lt;br /&gt;
    local templates = {}&lt;br /&gt;
    for i, v in ipairs(args) do&lt;br /&gt;
        local lang, link = string.match(v, '^([a-z]+):(.+)$')&lt;br /&gt;
        if lang then&lt;br /&gt;
            table.insert(templates, string.format('{{%s|%s|%s}}', config['template_link_template'], link, lang))&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(templates, string.format('{{%s|%s}}', config['template_link_template'], v))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return templates&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_category_link(v)&lt;br /&gt;
    local lang = 'default'&lt;br /&gt;
    local name = v&lt;br /&gt;
    local m, n = string.match(v, '^([a-z]+):(.+)$')&lt;br /&gt;
    if m then&lt;br /&gt;
        lang = m&lt;br /&gt;
        name = n&lt;br /&gt;
    end&lt;br /&gt;
    return string.format('[[:%s:%s|%s]]', category_prefix[lang], name, name)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_category_list(args)&lt;br /&gt;
    local category_links = {}&lt;br /&gt;
    for i, v in ipairs(args) do&lt;br /&gt;
        v = mw.text.trim(v)&lt;br /&gt;
        if v ~= '' then&lt;br /&gt;
            table.insert(category_links, make_category_link(v))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return category_links&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function pagelist(args)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    for i, v in ipairs(args) do&lt;br /&gt;
        v = mw.text.trim(v)&lt;br /&gt;
        if v ~= '' then&lt;br /&gt;
            local lang, page = string.match(v, '^([a-z]+):(.+)$')&lt;br /&gt;
            if lang then&lt;br /&gt;
                table.insert(r, string.format('[[:%s:%s|%s]]', lang, page, page))&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(r, string.format('[[:%s]]', v))&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function nslist(args)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    local namespaceName = messages['article']&lt;br /&gt;
    for i, namespaceId in ipairs(args) do&lt;br /&gt;
        namespaceId = mw.text.trim(namespaceId)&lt;br /&gt;
        if namespaceId ~= '' then&lt;br /&gt;
            if namespaceId ~= &amp;quot;0&amp;quot; then&lt;br /&gt;
                namespaceName = '{{lc:{{ns:' .. namespaceId .. '}}}}'&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(r, namespaceName)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[ Criterion format methods ]-------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local criterion = {}&lt;br /&gt;
&lt;br /&gt;
function criterion.backlinks(args, kwargs, frame)&lt;br /&gt;
    return format_plural_criterion(pagelist(args), 'backlinks')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.bytes(args, kwargs, frame)&lt;br /&gt;
   return string.format(messages['bytes_criterion'], args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.categories(args, kwargs, frame)&lt;br /&gt;
    local msg = format_plural_criterion(make_category_list(args), 'categories')&lt;br /&gt;
&lt;br /&gt;
    if args.ignore ~= nil then&lt;br /&gt;
        r = mw.text.split(args.ignore, ',')&lt;br /&gt;
        for i, v in ipairs(r) do&lt;br /&gt;
            v = mw.text.trim(v)&lt;br /&gt;
            r[i] = make_category_link(v)&lt;br /&gt;
        end&lt;br /&gt;
        msg = msg .. string.format(messages['category_criterion_ignore'], mw.text.listToText(r, ', ', ' ' .. messages['or'] .. ' '))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return msg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.existing(args, kwargs, frame)&lt;br /&gt;
    return messages['existing_criterion']&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.forwardlinks(args, kwargs, frame)&lt;br /&gt;
    return format_plural_criterion(pagelist(args), 'forwardlinks')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.namespaces(args, kwargs, frame)&lt;br /&gt;
    local site = kwargs.site&lt;br /&gt;
    local msg = format_plural_criterion(nslist(args, site), 'namespaces')&lt;br /&gt;
    if site ~= nil then&lt;br /&gt;
        return sprintf(messages['page_at_site'], {&lt;br /&gt;
            ['page'] = msg,&lt;br /&gt;
            ['site'] = string.format('[https://%s %s]', site, site),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
    return msg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.new(args, kwargs, frame)&lt;br /&gt;
    local msg = messages['new_criterion']&lt;br /&gt;
    if kwargs.redirects ~= nil then&lt;br /&gt;
        msg = messages['new_criterion_with_redirects']&lt;br /&gt;
    end&lt;br /&gt;
    return msg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.pages(args, kwargs, frame)&lt;br /&gt;
    return format_plural_criterion(pagelist(args), 'pages')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.sparql(args, kwargs, frame)&lt;br /&gt;
    local query = 'SELECT ?item WHERE {\n  ' .. kwargs.query .. '\n}'&lt;br /&gt;
    local url = 'http://query.wikidata.org/#' .. frame:callParserFunction('urlencode', { query, 'PATH' })&lt;br /&gt;
    local vizUrl = 'https://tools.wmflabs.org/hay/vizquery/#' .. frame:callParserFunction('urlencode', { query, 'PATH' })&lt;br /&gt;
&lt;br /&gt;
    if kwargs.description ~= nil then&lt;br /&gt;
        return sprintf(messages['sparql_criterion_with_explanation'], {&lt;br /&gt;
            description = kwargs.description,&lt;br /&gt;
            queryLink = url,&lt;br /&gt;
            vizQueryLink = vizUrl&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return sprintf(messages['sparql_criterion'], {&lt;br /&gt;
        queryLink=url,&lt;br /&gt;
        vizQueryLink=vizUrl&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.stub(args, kwargs, frame)&lt;br /&gt;
    -- deprecated&lt;br /&gt;
    return messages['stub_criterion']&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.templates(args, kwargs, frame)&lt;br /&gt;
    return format_plural_criterion(make_template_list(args), 'templates')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function criterion.format(frame)&lt;br /&gt;
    local args, kwargs = parse_args(frame)&lt;br /&gt;
    local criterion_arg, args = shift_args(args)&lt;br /&gt;
&lt;br /&gt;
    -- Try to find the corresponding formatter or bail out if not found&lt;br /&gt;
    if criterion_arg == nil then&lt;br /&gt;
        return frame:preprocess(make_error('argument_missing', 'criterion'))&lt;br /&gt;
    end&lt;br /&gt;
    local formatter = config.criteria[criterion_arg]&lt;br /&gt;
    if formatter == nil or criterion[formatter] == nil then&lt;br /&gt;
        return frame:preprocess(make_error('invalid_criterion', criterion_arg))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Use manual description if given&lt;br /&gt;
    if kwargs.description ~= nil and formatter ~= 'sparql' then&lt;br /&gt;
        return kwargs.description&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Generate auto-generated description&lt;br /&gt;
    return frame:preprocess(criterion[formatter](args, kwargs, frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[ Rule format methods ]-------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local rule = {}&lt;br /&gt;
&lt;br /&gt;
function rule.image(points, args, kwargs)&lt;br /&gt;
    local out&lt;br /&gt;
    local tplargs = {&lt;br /&gt;
        ['points'] = points,&lt;br /&gt;
    }&lt;br /&gt;
    if kwargs.initialimagelimit ~= nil then&lt;br /&gt;
        out = messages['image_rule_limited']&lt;br /&gt;
        tplargs['initialimagelimit'] = kwargs.initialimagelimit&lt;br /&gt;
    else&lt;br /&gt;
        out = messages['image_rule']&lt;br /&gt;
    end&lt;br /&gt;
    if kwargs.ownimage ~= nil then&lt;br /&gt;
        out = out .. ' ' .. messages['image_rule_own']&lt;br /&gt;
        tplargs['ownimage'] = kwargs.ownimage&lt;br /&gt;
    end&lt;br /&gt;
    return sprintf(out, tplargs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rule.wikidata(points, args, kwargs)&lt;br /&gt;
    local out&lt;br /&gt;
    local params&lt;br /&gt;
    local arg_types = { messages['properties'], messages['labels'], messages['aliases'], messages['descriptions'] }&lt;br /&gt;
    local results = {}&lt;br /&gt;
    if kwargs.properties == nil and kwargs.labels == nil and kwargs.aliases == nil and kwargs.descriptions == nil then&lt;br /&gt;
        return make_error(&lt;br /&gt;
            'argument_missing',&lt;br /&gt;
            mw.text.listToText( arg_types, ', ', ' ' .. messages['or'] .. ' ' )&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    if kwargs.properties ~= nil then&lt;br /&gt;
        params = mw.text.split(kwargs.properties, ',')&lt;br /&gt;
        for k, v in pairs(params) do&lt;br /&gt;
            params[k] = string.format('[[:d:Property:%s|%s]]', v, v)&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(results, mw.text.listToText( params, ', ', ' ' .. messages['or'] .. ' ' ))&lt;br /&gt;
    end&lt;br /&gt;
    if kwargs.labels ~= nil then&lt;br /&gt;
        params = mw.text.split(kwargs.labels, ',')&lt;br /&gt;
        table.insert(results, messages['label'] .. ' (' .. mw.text.listToText( params, ', ', ' ' .. messages['or'] .. ' ' ) .. ')')&lt;br /&gt;
    end&lt;br /&gt;
    if kwargs.aliases ~= nil then&lt;br /&gt;
        params = mw.text.split(kwargs.aliases, ',')&lt;br /&gt;
        table.insert(results, messages['alias'] .. ' (' .. mw.text.listToText( params, ', ', ' ' .. messages['or'] .. ' ' ) .. ')')&lt;br /&gt;
    end&lt;br /&gt;
    if kwargs.descriptions ~= nil then&lt;br /&gt;
        params = mw.text.split(kwargs.descriptions, ',')&lt;br /&gt;
        table.insert(results, messages['description'] .. ' (' .. mw.text.listToText( params, ', ', ' ' .. messages['or'] .. ' ' ) .. ')')&lt;br /&gt;
    end&lt;br /&gt;
    results = table.concat( results, ' ' .. messages['and'] .. ' ' )&lt;br /&gt;
    if kwargs.all ~= nil then&lt;br /&gt;
        out = messages['wikidata_rule_all']&lt;br /&gt;
    else&lt;br /&gt;
        out = messages['wikidata_rule_first']&lt;br /&gt;
    end&lt;br /&gt;
    if kwargs.require_reference ~= nil then&lt;br /&gt;
        out = out .. ' ' .. messages['wikidata_rule_require_reference']&lt;br /&gt;
    end&lt;br /&gt;
    return sprintf(out, {&lt;br /&gt;
        ['points'] = points,&lt;br /&gt;
        ['thing'] = results,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rule.reference(points, args, kwargs)&lt;br /&gt;
    return sprintf(messages['reference_rule'], {&lt;br /&gt;
        ['points'] = points,&lt;br /&gt;
        ['refpoints'] = args[1],&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rule.templateremoval(points, args, kwargs)&lt;br /&gt;
    local templates = format_plural(make_template_list(args), 'templates')&lt;br /&gt;
    return sprintf(messages['templateremoval_rule'], {&lt;br /&gt;
        ['points'] = points,&lt;br /&gt;
        ['templates'] = templates,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rule.categoryremoval(points, args, kwargs)&lt;br /&gt;
    local categories = format_plural(make_category_list(args), 'categories')&lt;br /&gt;
    return sprintf(messages['categoryremoval_rule'], {&lt;br /&gt;
        ['points'] = points,&lt;br /&gt;
        ['categories'] = categories,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rule.bytebonus(points, args, kwargs)&lt;br /&gt;
    return sprintf(messages['bytebonus_rule'], {&lt;br /&gt;
        ['points'] = points,&lt;br /&gt;
        ['bytes'] = args[1],&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rule.wordbonus(points, args, kwargs)&lt;br /&gt;
    return sprintf(messages['wordbonus_rule'], {&lt;br /&gt;
        ['points'] = points,&lt;br /&gt;
        ['words'] = args[1],&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rule.format(frame)&lt;br /&gt;
    -- Make tables of anonymous and named arguments&lt;br /&gt;
    local args, kwargs = parse_args(frame)&lt;br /&gt;
    rule_arg, args = shift_args(args)&lt;br /&gt;
    points, args = shift_args(args)&lt;br /&gt;
&lt;br /&gt;
    -- Try to find the corresponding formatter or bail out if not found&lt;br /&gt;
    if rule_arg == nil then&lt;br /&gt;
        return frame:preprocess(make_error('argument_missing', 'rule'))&lt;br /&gt;
    end&lt;br /&gt;
    local formatter = config.rules[rule_arg]&lt;br /&gt;
    if formatter == nil then&lt;br /&gt;
        return frame:preprocess(make_error('invalid_rule', rule_arg))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- All rules requires argument 1: number of points awarded&lt;br /&gt;
    if points == nil then&lt;br /&gt;
        return frame:preprocess(make_error('argument_missing', '1 (number of points)'))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    points = points:gsub( '%.', config['decimal_separator'])&lt;br /&gt;
&lt;br /&gt;
    -- If there's a rule formatter function, use it.&lt;br /&gt;
    -- Otherwise, use the string from the messages table.&lt;br /&gt;
    local out&lt;br /&gt;
    if rule[formatter] ~= nil then&lt;br /&gt;
        out = rule[formatter](points, args, kwargs)&lt;br /&gt;
    else&lt;br /&gt;
        out = sprintf(messages[formatter .. '_rule'], {&lt;br /&gt;
            ['points'] = points,&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kwargs.max ~= nil then&lt;br /&gt;
        out = sprintf(messages['base_rule_max'], {&lt;br /&gt;
            ['baserule'] = out,&lt;br /&gt;
            ['maxpoints'] = kwargs.max:gsub( '%.', config['decimal_separator']),&lt;br /&gt;
        })&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return frame:preprocess(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
return {&lt;br /&gt;
    ['criterion'] = criterion.format,&lt;br /&gt;
    ['rule'] = rule.format,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>