制作Mediawiki模板的最佳方法是根据参数显示不同的内容?

时间:2017-06-18 08:06:05

标签: lua mediawiki mediawiki-templates

我将有数百个字符传记,包括一些文字,标记和图像。

我想要一个模板,你可以写一个例如{{Biography | Steven}}它从所有bios的页面中获取该传记,其中每个bios链接到一个参数。

此外,该选项仅显示生物的一部分,例如{{简历|史蒂芬|人格}}

我知道我可以为每个传记制作一个模板,但是我会有数百个编辑必须找到的模板,而且我不知道这是不是很好的表现(它的确如此?)。

然后我仍然不知道如何设置模板以有条件地显示生物的部分。

我也想知道我是否应该有一些数据存储扩展,但我不知道这可能比翻译的页面上的文本更快。

我是否需要使用ParserFunctions或我的偏好Lua的条件代码,并使用its many possible versions of a switch statement

我认为这个模板是一个很好的功能,因为人们可以在一个页面上编辑任何生物,或者每个字符分类编辑一个页面,然后任何人都可以将其转录而不是写出相同的内容,但会犯错误,浪费时间等等

此模板将使用极高的使用率,因此它对于编辑器而言表现良好且易于使用非常重要。

我不是要求有人为我写这个,只是建议如何去做。

1 个答案:

答案 0 :(得分:1)

为此,您需要使您的数据granular足以选择单个传记字段。在MediaWiki中有几种方法可以做到这一点。

解析器功能

您可以使用#switch语句创建一个可以完成工作的模板,而无需添加任何扩展。例如,您可以在Template:Biography/data

处拥有数据模块
{{#switch: {{{character|}}}
| Steven = {{#switch: {{{trait|}}}
  | Personality = Outgoing
  | Age = 25
  }}
| Dennis = {{#switch: {{{trait|}}}
  | Personality = Shy
  | Age = 34
  }}
}}

然后你可以从Template:Biography这样调用它:

{{#if: {{{2|}}}
 | {{Biography/data|character={{{1|}}}|trait={{{2|}}}}}
 |
* Name: {{{1|}}}
* Age: {{Biography/data|character={{{1|}}}|trait=Age}}
* Personality: {{Biography/data|character={{{1|}}}|trait=Personality}}
 }}

您可以通过多种不同方式组织此#switch语句。例如,您可以将每个字符的数据存储在Template:Biography的不同子模板中,例如Template:Biography/data/StevenTemplate:Biography/data/Dennis等。

模板:传记:

{{#if: {{{2|}}}
 | {{Biography/data|{{{1|}}}|{{{2|}}}}}
 |
* Name: {{{1|}}}
* Age: {{Biography/data|{{{1|}}}|Age}}
* Personality: {{Biography/data|{{{1|}}}|Personality}}
 }}

模板:传记/数据

{{Biography/data/{{{1|}}}|trait={{{2|}}}}}

模板:传记/数据/史蒂芬:

{{#switch: {{{trait|}}}
| Personality = Outgoing
| Age = 25
}}

这将比我们的第一次尝试更好,因为MediaWiki中的长转换语句非常慢。但是,您仍然需要两个级别的子模板才能使其工作,如果您没有指定特征,则必须多次调用子模板。所以它仍然会很慢。

Scribunto

您可以通过Scribunto扩展程序在Lua中编写模板来加快速度。您可以编写这样的数据模块(让我们称之为Module:Biography/data):

return {
    ['Steven'] = {
        Personality = 'Outgoing',
        Age = 25,
    },
    ['Dennis'] = {
        Personality = 'Shy',
        Age = 34,
    },
}

然后,您可以使用mw.loadData加载数据,这将在每个页面加载整个表格,而不是每次使用{{Biography}}模板。例如:

local data = mw.loadData('Module:Biography/data')
local p = {}

local BIO_TEMPLATE = [[
* Name: %s
* Age: %d
* Personality: %s]]

-- Trim whitespace from args, and treat blank args as nil
local function preprocessArg(s)
    if not s then
        return nil
    end
    s = s:match('^%s*(.-)%s*$') -- trim whitespace
    if s == '' then
        return nil
    else
        return s
    end
end

function p.main(frame)
    local args = frame.args
    local character = preprocessArg(args[1])
    local trait = preprocessArg(args[2])

    -- Check for blank character arguments
    if not character then
        return ''
    end

    -- Get the data for the specified character
    local characterData = data[character]
    if not characterData then
        return ''
    end

    if trait then
        -- User specified a trait, so return it
        return characterData[trait] or ''
    else
        -- Return the biography template with all the traits in it
        return string.format(
            BIO_TEMPLATE,
            character,
            characterData.Age,
            characterData.Personality
        )
    end
end

return p

您也可以按字符或特征分割数据页面,方法与使用#switch完全相同。

使用Lua的缺点是你的编辑需要学习Lua语法和wikitext语法来向数据模块添加条目。 Lua语法通常比wikitext更难掌握,因此这可能会让人们无法做出贡献。

扩展

wiki文本数据是非结构化的问题是一个长期存在的问题,因此多年来已经有很多尝试来修复它。在确定纯解析器函数或纯Scribunto之前,您最好调查一些尝试解决此问题的扩展。 (请记住,您可以通过模板访问这些扩展,通常也可以通过Scribunto访问。)

例如,labeled section transclusion扩展名允许您为角色编写普通传记,分隔不同的部分,然后将这些部分单独转移到其他页面上。

还有更多以数据为中心的扩展可以帮助您制作更精细的模板,而不会陷入交换机功能或数据模块中:

这些将数据字段分别存储在数据库中(通常与MediaWiki安装相同),因此性能特征取决于生成页面所需的数据库访问次数,以及如何设置缓存。

如果我是你,我会首先查看可用的扩展程序,看看是否有适合您情况的任何内容,然后使用模板或Scribunto进行微调。