我将有数百个字符传记,包括一些文字,标记和图像。
我想要一个模板,你可以写一个例如{{Biography | Steven}}它从所有bios的页面中获取该传记,其中每个bios链接到一个参数。
此外,该选项仅显示生物的一部分,例如{{简历|史蒂芬|人格}}
我知道我可以为每个传记制作一个模板,但是我会有数百个编辑必须找到的模板,而且我不知道这是不是很好的表现(它的确如此?)。
然后我仍然不知道如何设置模板以有条件地显示生物的部分。
我也想知道我是否应该有一些数据存储扩展,但我不知道这可能比翻译的页面上的文本更快。
我是否需要使用ParserFunctions或我的偏好Lua的条件代码,并使用its many possible versions of a switch statement。
我认为这个模板是一个很好的功能,因为人们可以在一个页面上编辑任何生物,或者每个字符分类编辑一个页面,然后任何人都可以将其转录而不是写出相同的内容,但会犯错误,浪费时间等等
此模板将使用极高的使用率,因此它对于编辑器而言表现良好且易于使用非常重要。
我不是要求有人为我写这个,只是建议如何去做。
答案 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/Steven
,Template: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扩展程序在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进行微调。