<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/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://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AUKB"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:UKB&amp;action=history"/>
	<updated>2026-04-11T15:14:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:UKB&amp;diff=147394&amp;oldid=prev</id>
		<title>imported&gt;Danmichaelo: fix article</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:UKB&amp;diff=147394&amp;oldid=prev"/>
		<updated>2019-11-20T21:49:51Z</updated>

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