Help:Lua:修订间差异

帮助页面
添加的内容 删除的内容
无编辑摘要
(文本替换 - 替换“(維|维)基文本”为“wikitext”)
第34行: 第34行:


从模板的环境中调用Lua代码确实是一个好办法。
从模板的环境中调用Lua代码确实是一个好办法。
这意味着从调用页面的角度来说,语法不依赖与模板逻辑是否被Lua或者维基文本执行。
这意味着从调用页面的角度来说,语法不依赖与模板逻辑是否被Lua或者wikitext执行。
这也避免了把复杂语法加到wiki内容命名空间中。
这也避免了把复杂语法加到wiki内容命名空间中。


第44行: 第44行:
对于模块来说,最好将所有的函数和变量声明为局部变量。
对于模块来说,最好将所有的函数和变量声明为局部变量。


=== 访问维基文本中的参数 ===
=== 访问wikitext中的参数 ===


<code><nowiki>{{#invoke:}}</nowiki></code>调用函数时,会将[[#frame-object|框架对象(frame object)]]作为单一的参数。要访问传递到<code><nowiki>{{#invoke:}}</nowiki></code>的参数,代码通常会使用框架对象的<code>[[#frame.args|args]]</code>表,也可以访问传递到了包含<code><nowiki>{{#invoke:}}</nowiki></code>的模板的参数,方法是使用<code>[[#frame:getParent|frame:getParent()]]</code>,并访问该框架的<code>args</code>。
<code><nowiki>{{#invoke:}}</nowiki></code>调用函数时,会将[[#frame-object|框架对象(frame object)]]作为单一的参数。要访问传递到<code><nowiki>{{#invoke:}}</nowiki></code>的参数,代码通常会使用框架对象的<code>[[#frame.args|args]]</code>表,也可以访问传递到了包含<code><nowiki>{{#invoke:}}</nowiki></code>的模板的参数,方法是使用<code>[[#frame:getParent|frame:getParent()]]</code>,并访问该框架的<code>args</code>。


框架对象也用来访问对应环境的维基文本解析器,例如[[#frame:callParserFunction|调用解析器函数]]、[[#frame:expandTemplate|扩展模板]]以及[[#frame:preprocess|展开任意的维基文本字符串]]。
框架对象也用来访问对应环境的wikitext解析器,例如[[#frame:callParserFunction|调用解析器函数]]、[[#frame:expandTemplate|扩展模板]]以及[[#frame:preprocess|展开任意的wikitext字符串]]。


=== 返回文本 ===
=== 返回文本 ===


模块函数通常返回单个的字符串;无论返回什么值都会通过[[#tostring|tostring()]]转换,然后连接在一起。这个字符串就是转化成维基文本代码<code><nowiki>{{#invoke:}}</nowiki></code>的结果。
模块函数通常返回单个的字符串;无论返回什么值都会通过[[#tostring|tostring()]]转换,然后连接在一起。这个字符串就是转化成wikitext代码<code><nowiki>{{#invoke:}}</nowiki></code>的结果。


在解析页面的这一点上,模板都是已经被展开的,解析器函数和扩展标签都已经被处理,而且预存的转换(例如签名的扩展以及[[Help:链接#管道技巧|管道技巧]])都已经完成。因此,模块不能在输出文本中使用这些特性。例如,如果一个模块返回<code><nowiki>"Hello, world! {{welcome}}"</nowiki></code>,页面就会显示“Hello, world! <nowiki>{{welcome}}</nowiki>”。
在解析页面的这一点上,模板都是已经被展开的,解析器函数和扩展标签都已经被处理,而且预存的转换(例如签名的扩展以及[[Help:链接#管道技巧|管道技巧]])都已经完成。因此,模块不能在输出文本中使用这些特性。例如,如果一个模块返回<code><nowiki>"Hello, world! {{welcome}}"</nowiki></code>,页面就会显示“Hello, world! <nowiki>{{welcome}}</nowiki>”。


另一方面,替换引用是在加工的早期阶段处理的,所以只有当其他尝试的替换引用会被处理时才使用<code><nowiki>{{subst:#invoke:}}</nowiki></code>。失败的替换引用因为会保持为维基文本,所以都会在'''下一次'''编辑时被处理。这通常需要避免。
另一方面,替换引用是在加工的早期阶段处理的,所以只有当其他尝试的替换引用会被处理时才使用<code><nowiki>{{subst:#invoke:}}</nowiki></code>。失败的替换引用因为会保持为wikitext,所以都会在'''下一次'''编辑时被处理。这通常需要避免。


=== 模块文档 ===
=== 模块文档 ===


Scruibunto允许模块可以被自动关联的模块维基文本页面关联文档;默认情况下,模块的“/doc”子页面是用来作为文档,并且会在模块页面的代码顶部显示其内容。例如,“模块:Bananas”的文档页面就是“模块:Bananas/doc”。
Scruibunto允许模块可以被自动关联的模块wikitext页面关联文档;默认情况下,模块的“/doc”子页面是用来作为文档,并且会在模块页面的代码顶部显示其内容。例如,“模块:Bananas”的文档页面就是“模块:Bananas/doc”。


这也可以使用以下MediaWiki命名空间下的消息配置:
这也可以使用以下MediaWiki命名空间下的消息配置:


* <code>scribunto-doc-page-name</code> —设置用来作文档页面的名称。 模块(除了模块:prefix)的名称会通过<code>$1</code>。 如果在模块命名空间,这里的页面通常会视为维基文本而不是Lua代码,也不会被<code><nowiki>{{#invoke:}}</nowiki></code>使用。 模块的页面通常是“Module:$1/doc”这样的模块/doc子页面。注意解析器函数等其他可扩展代码在这个消息中不被使用。 请注意,此消息中解析器函数和其他大括号扩展可能无法使用。
* <code>scribunto-doc-page-name</code> —设置用来作文档页面的名称。 模块(除了模块:prefix)的名称会通过<code>$1</code>。 如果在模块命名空间,这里的页面通常会视为wikitext而不是Lua代码,也不会被<code><nowiki>{{#invoke:}}</nowiki></code>使用。 模块的页面通常是“Module:$1/doc”这样的模块/doc子页面。注意解析器函数等其他可扩展代码在这个消息中不被使用。 请注意,此消息中解析器函数和其他大括号扩展可能无法使用。
* <code>scribunto-doc-page-does-not-exist</code> — 文档页面不存在时显示的消息。 页面名称传递为<code>$1</code>。 默认为空。
* <code>scribunto-doc-page-does-not-exist</code> — 文档页面不存在时显示的消息。 页面名称传递为<code>$1</code>。 默认为空。
* <code>scribunto-doc-page-show</code> — 文档页面存在时显示的消息。 页面名称传递为<code>$1</code>。 默认是嵌入包含文档页面。
* <code>scribunto-doc-page-show</code> — 文档页面存在时显示的消息。 页面名称传递为<code>$1</code>。 默认是嵌入包含文档页面。
第1,538行: 第1,538行:
<code>mw.addWarning( text )</code>
<code>mw.addWarning( text )</code>


在预览编辑时加一个警告信息。<code>text</code>解析为维基文本
在预览编辑时加一个警告信息。<code>text</code>解析为wikitext


==== mw.allToString ====
==== mw.allToString ====
第1,608行: 第1,608行:
注意没有框架库,也没有叫做<code>frame</code>的全局变量。框架对象通常为被<code><nowiki>{{#invoke:}}</nowiki></code>调用的函数的参数,当然也可以从<code>[[#mw.getCurrentFrame|mw.getCurrentFrame()]]</code>获得。
注意没有框架库,也没有叫做<code>frame</code>的全局变量。框架对象通常为被<code><nowiki>{{#invoke:}}</nowiki></code>调用的函数的参数,当然也可以从<code>[[#mw.getCurrentFrame|mw.getCurrentFrame()]]</code>获得。
==== frame.args ====
==== frame.args ====
用来访问传递到frame的参数的表。例如,一个模块从如下的维基文本调用
用来访问传递到frame的参数的表。例如,一个模块从如下的wikitext调用


<nowiki>{{#invoke:module|function|arg1|arg2|name=arg3}}</nowiki>
<nowiki>{{#invoke:module|function|arg1|arg2|name=arg3}}</nowiki>
那么<code>frame.args[1]</code>会返回<code>"arg1"</code>,<code>frame.args[2]</code>会返回<code>"arg2"</code>,<code>frame.args['name']</code>或<code>frame.args.name</code>会返回<code>"arg3"</code>。在参数列表迭代可以使用<code>pairs( frame.args )</code>或<code>ipairs( frame.args )</code>。
那么<code>frame.args[1]</code>会返回<code>"arg1"</code>,<code>frame.args[2]</code>会返回<code>"arg2"</code>,<code>frame.args['name']</code>或<code>frame.args.name</code>会返回<code>"arg3"</code>。在参数列表迭代可以使用<code>pairs( frame.args )</code>或<code>ipairs( frame.args )</code>。
然而由于Lua实现表迭代器,迭代的顺序不确定,参数出现在维基文本中的顺序也无从得知。
然而由于Lua实现表迭代器,迭代的顺序不确定,参数出现在wikitext中的顺序也无从得知。


注意这个表中的值总是为字符串,<code>[[#tonumber|tonumber()]]</code>可以用于在需要时转化为数字。但是,键是数字,即使在调用时清楚提供:<code><nowiki>{{#invoke:module|function|1|2=2}}</nowiki></code>给予被数字键<code>1</code>和<code>2</code>索引的字符串值<code>"1"</code>和<code>"2"</code>。
注意这个表中的值总是为字符串,<code>[[#tonumber|tonumber()]]</code>可以用于在需要时转化为数字。但是,键是数字,即使在调用时清楚提供:<code><nowiki>{{#invoke:module|function|1|2=2}}</nowiki></code>给予被数字键<code>1</code>和<code>2</code>索引的字符串值<code>"1"</code>和<code>"2"</code>。
第1,633行: 第1,633行:
调用解析器函数,返回适当的字符串。这相比于<code>frame:preprocess</code>更优,但如果有可能,最好优先使用原生的Lua函数或Scribunto库函数。
调用解析器函数,返回适当的字符串。这相比于<code>frame:preprocess</code>更优,但如果有可能,最好优先使用原生的Lua函数或Scribunto库函数。


以下调用与以下维基文本基本相同:
以下调用与以下wikitext基本相同:


<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
第1,662行: 第1,662行:
frame:expandTemplate{ title = 'template', args = { 'arg1', 'arg2', name = 'arg3' } }
frame:expandTemplate{ title = 'template', args = { 'arg1', 'arg2', name = 'arg3' } }


在Lua脚本中的行为大致和<code><nowiki>{{template|arg1|arg2|name=arg3}}</nowiki></code>在维基文本中的行为一样。如果页面名没有命名空间前缀,那么函数会认为页面在模板命名空间内。
在Lua脚本中的行为大致和<code><nowiki>{{template|arg1|arg2|name=arg3}}</nowiki></code>在wikitext中的行为一样。如果页面名没有命名空间前缀,那么函数会认为页面在模板命名空间内。


注意标题与参数在传递到模版之前并未预处理:
注意标题与参数在传递到模版之前并未预处理:


<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
-- 这与维基文本{{template|{{!}}}}基本相同
-- 这与wikitext{{template|{{!}}}}基本相同
frame:expandTemplate{ title = 'template', args = { '|' } }
frame:expandTemplate{ title = 'template', args = { '|' } }


-- 这与维基文本{{template|{{((}}!{{))}}}}基本相同
-- 这与wikitext{{template|{{((}}!{{))}}}}基本相同
frame:expandTemplate{ title = 'template', args = { '{{!}}' } }
frame:expandTemplate{ title = 'template', args = { '{{!}}' } }
</syntaxhighlight>
</syntaxhighlight>
第1,723行: 第1,723行:
<code>frame:preprocess{ text = string }</code>
<code>frame:preprocess{ text = string }</code>


在当前框架环境下展开维基文本,比如,模板、解析器函数以及像<code><nowiki>{{{1}}}</nowiki></code>这样的参数都会展开。某些特殊的写成XML格式的标记,比如<code>&lt;pre&gt;</code>、<code>&lt;nowiki&gt;</code>、<code>&lt;gallery&gt;</code>和<code>&lt;ref&gt;</code>都会被替换为“strip marker”——一类特殊的字符串,由删除符(ASCII 127)开头,在从<code>#invoke</code>返回后被替换成HTML。
在当前框架环境下展开wikitext,比如,模板、解析器函数以及像<code><nowiki>{{{1}}}</nowiki></code>这样的参数都会展开。某些特殊的写成XML格式的标记,比如<code>&lt;pre&gt;</code>、<code>&lt;nowiki&gt;</code>、<code>&lt;gallery&gt;</code>和<code>&lt;ref&gt;</code>都会被替换为“strip marker”——一类特殊的字符串,由删除符(ASCII 127)开头,在从<code>#invoke</code>返回后被替换成HTML。


如果你使用单个模板,使用[[#frame:expandTemplate|<code>frame:expandTemplate</code>]]而非尝试建造维基文本以使用这个方法。这样更快且更不容易出错,尤其是参数包含管道符或其他维基标记时。
如果你使用单个模板,使用[[#frame:expandTemplate|<code>frame:expandTemplate</code>]]而非尝试建造wikitext以使用这个方法。这样更快且更不容易出错,尤其是参数包含管道符或其他维基标记时。


同理,展开单个解析器函数时应使用[[#frame:callParserFunction|<code>frame:callParserFunction</code>]]。
同理,展开单个解析器函数时应使用[[#frame:callParserFunction|<code>frame:callParserFunction</code>]]。
第1,736行: 第1,736行:
获得特定参数的对象,或者没有提供参数时返回nil。
获得特定参数的对象,或者没有提供参数时返回nil。


返回的对象有一个方法,<code>object:expand()</code>,可以返回对应参数的展开后的维基文本
返回的对象有一个方法,<code>object:expand()</code>,可以返回对应参数的展开后的wikitext


==== frame:newParserValue ====
==== frame:newParserValue ====
第1,807行: 第1,807行:
<code>[[#mw.html-object|html]]:wikitext( ... )</code>
<code>[[#mw.html-object|html]]:wikitext( ... )</code>


给mw.html对象加上不定数量的维基文本字符串。
给mw.html对象加上不定数量的wikitext字符串。


注意遇到第一个''nil''项就会停。
注意遇到第一个''nil''项就会停。
第2,004行: 第2,004行:


<code>timestamp</code>的格式字符串和支持的值与[[Extension:ParserFunctions]]的#time解析器函数完全相同。
<code>timestamp</code>的格式字符串和支持的值与[[Extension:ParserFunctions]]的#time解析器函数完全相同。
注意虽然反斜杠可能需要在Lua字符串字面量中写两次,由于Lua也使用反斜杠转义,而维基文本不需要:
注意虽然反斜杠可能需要在Lua字符串字面量中写两次,由于Lua也使用反斜杠转义,而wikitext不需要:


<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
第2,134行: 第2,134行:
<code>mw.message.rawParam( value )</code>
<code>mw.message.rawParam( value )</code>


包装(wrap)该值使之不会被<code>[[#mw.message:parse|msg:parse()]]</code>解析为维基文本
包装(wrap)该值使之不会被<code>[[#mw.message:parse|msg:parse()]]</code>解析为wikitext


==== mw.message.numParam ====
==== mw.message.numParam ====
第2,194行: 第2,194行:
<code>[[#mw.message-object|msg]]:plain()</code>
<code>[[#mw.message-object|msg]]:plain()</code>


替换参数按原样返回消息维基文本。模板调用和解析器函数都是完整的。
替换参数按原样返回消息wikitext。模板调用和解析器函数都是完整的。


==== mw.message:exists ====
==== mw.message:exists ====
第2,408行: 第2,408行:
<code>mw.text.nowiki( s )</code>
<code>mw.text.nowiki( s )</code>


使用[[HTML实体]]替换字符串中的多种字符,以避免被解析为维基文本。包括:
使用[[HTML实体]]替换字符串中的多种字符,以避免被解析为wikitext。包括:


* 以下字符:<code>"</code>、<code>&</code>、<code>'</code>、<code><</code>、<code>=</code>、<code>></code>、<code>[</code>、<code>]</code>、<code>{</code>、<code>|</code>、<code>}</code>
* 以下字符:<code>"</code>、<code>&</code>、<code>'</code>、<code><</code>、<code>=</code>、<code>></code>、<code>[</code>、<code>]</code>、<code>{</code>、<code>|</code>、<code>}</code>