Help:Lua:修订间差异

帮助页面
添加的内容 删除的内容
(编辑摘要已移除)
无编辑摘要
第1行: 第1行:
<languages/>
{{Shortcut|Lua manual|LUAREF}}
{{NoteTA|G1=MediaWiki}}
{{NoteTA|G1=MediaWiki}}
{{操作指南|H:LUA|H:LUAREF}}
此手册记载{{ll|Lua}}的文档,用于MediaWiki的{{ll|Extension:Scribunto|Scribunto}}扩展。
部分内容(英文原文)取自[https://www.lua.org/manual/5.1/index.html Lua 5.1参考手册](翻译时参考了[https://www.runoob.com/manual/lua53doc/ Lua参考手册的中文翻译]),其许可协议为[[#License|MIT许可证]]。

{{mbox
{{mbox
| type = notice
| type = notice
| text = 此页面记载的是最新版本的Scribunto扩展的文档。某些功能可能尚未部署。
| text = 此页面记载的是最新版本的Scribunto扩展的文档。某些功能可能尚未部署。
}}
}}

此手册记载[[Lua]]的文档,用于MediaWiki的Scribunto扩展。

部分内容(英文原文)取自[https://www.lua.org/manual/5.1/index.html Lua 5.1参考手册](翻译时参考了[https://www.runoob.com/manual/lua53doc/ Lua参考手册的中文翻译]),其许可协议为[[#License|MIT许可证]]。

{{TOCright}}
{{TOCright}}


第14行: 第15行:


=== 入门 ===
=== 入门 ===
在已启用Scribunto的MediaWiki wiki上,以“Module:”前缀为标题[[Special:MyLanguage/Help:Starting a new page|创建一个页面]],例如“[[Module:Bananas]]”。
在已启用Scribunto的MediaWiki wiki上,以“Module:”前缀为标题创建一个页面,例如“[[Module:Bananas]]”。
进入该新页面,复制下列文本:
进入该新页面,复制下列文本:


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


在解析页面的这一点上,模板都是已经被展开的,解析器函数和扩展标签都已经被处理,而且预存的转换(例如签名的扩展以及[[Special:MyLanguage/Help:Pipe trick|pipe trick]])都已经完成。因此,模块不能在输出文本中使用这些特性。例如,如果一个模块返回<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>”。


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


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


这也可以使用以下[[:meta:Special:MyLanguage/:Help:System message|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>。 如果在模块命名空间,这里的页面通常会视为维基文本而不是Lua代码,也不会被<code><nowiki>{{#invoke:}}</nowiki></code>使用。 模块的页面通常是“Module:$1/doc”这样的模块/doc子页面。注意解析器函数等其他可扩展代码在这个消息中不被使用。 请注意,此消息中解析器函数和其他大括号扩展可能无法使用。
第1,563行: 第1,564行:
<code>mw.isSubsting()</code>
<code>mw.isSubsting()</code>


如果当前的<code>#invoke</code>被[[Special:MyLanguage/Manual:Substitution|替换引用]]时返回true,否则false。参见上方讨论的[[#Returning text|返回文本]]。
如果当前的<code>#invoke</code>被替换引用时返回true,否则false。参见上方讨论的[[#Returning text|返回文本]]。


==== mw.loadData ====
==== mw.loadData ====
第1,631行: 第1,632行:
: ''注意使用了[[#named arguments|命名参数]]。''
: ''注意使用了[[#named arguments|命名参数]]。''


调用[[Special:MyLanguage/Help:Magic words#Parser functions|解析器函数]],返回适当的字符串。这相比于<code>frame:preprocess</code>更优,但如果有可能,最好优先使用原生的Lua函数或Scribunto库函数。
调用解析器函数,返回适当的字符串。这相比于<code>frame:preprocess</code>更优,但如果有可能,最好优先使用原生的Lua函数或Scribunto库函数。


以下调用与以下维基文本基本相同:
以下调用与以下维基文本基本相同:
第1,723行: 第1,724行:
<code style="white-space:nowrap">frame:preprocess{ text = string }</code>
<code style="white-space:nowrap">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>都会被替换为“[[Special:MyLanguage/strip marker|strip marker]]”——一类特殊的字符串,由删除符(ASCII 127)开头,在从<code>#invoke</code>返回后被替换成HTML。
在当前框架环境下展开维基文本,比如,模板、解析器函数以及像<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>]]而非尝试建造维基文本以使用这个方法。这样更快且更不容易出错,尤其是参数包含管道符或其他维基标记时。
第1,862行: 第1,863行:
=== 语言库 ===
=== 语言库 ===


语言代码在[[Special:MyLanguage/Language code|语言代码]]中由描述。很多MediaWiki的语言代码类似于[[:zh:IETF语言标签|IETF语言标签]],但不是所有MediaWiki语言代码都是有效的IETF标签,反之亦然。
语言代码在语言代码中由描述。很多MediaWiki的语言代码类似于[[:zh:IETF语言标签|IETF语言标签]],但不是所有MediaWiki语言代码都是有效的IETF标签,反之亦然。


{{anchor|mw.language-object}}
{{anchor|mw.language-object}}
第1,883行: 第1,884行:
默认返回的名称是语言自称;传递<code>inLanguage</code>值会返回那个语言下的所有名称。
默认返回的名称是语言自称;传递<code>inLanguage</code>值会返回那个语言下的所有名称。


默认只会返回MediaWiki已知的语言名称,给<code>include</code>传递<code>'all'</code>会返回所有可用的语言(例如,从{{ll|Extension:CLDR}}中),传递<code>'mwfile'</code>会仅包括拥有在MediaWiki核心或启用的扩展包括的自定义消息的语言。如要清楚地选择默认,返回<code>'mw'</code>。
默认只会返回MediaWiki已知的语言名称,给<code>include</code>传递<code>'all'</code>会返回所有可用的语言(例如,从[[Extension:CLDR]]中),传递<code>'mwfile'</code>会仅包括拥有在MediaWiki核心或启用的扩展包括的自定义消息的语言。如要清楚地选择默认,返回<code>'mw'</code>。


==== mw.language.getContentLanguage ====
==== mw.language.getContentLanguage ====
第2,001行: 第2,002行:
<code style="white-space:nowrap">[[#mw.language-object|lang]]:formatDate( format, timestamp, local )</code>
<code style="white-space:nowrap">[[#mw.language-object|lang]]:formatDate( format, timestamp, local )</code>


根据给定的格式字符串格式化一个日期。如果省略了<code>timestamp</code>,默认为当前时间。<code>local</code>的值必须是boolean或nil,如果是true,时间会格式化为[[Special:MyLanguage/Manual:$wgLocaltimezone|wiki的当地时间]]而非UTC。
根据给定的格式字符串格式化一个日期。如果省略了<code>timestamp</code>,默认为当前时间。<code>local</code>的值必须是boolean或nil,如果是true,时间会格式化为wiki的当地时间而非UTC。


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


第2,043行: 第2,044行:
从<code>forms</code>(必须是[[#sequence|序列]]表)或<code>...</code>基于数字<code>n</code>选择合适的语法形式。例如,在英语你必须使用<code style="white-space:nowrap">n .. ' ' .. lang:plural( n, 'sock', 'socks' )</code>或<code style="white-space:nowrap">n .. ' ' .. lang:plural( n, { 'sock', 'socks' } )</code>来生成语法正确的文本:只有1 sock或200 socks。
从<code>forms</code>(必须是[[#sequence|序列]]表)或<code>...</code>基于数字<code>n</code>选择合适的语法形式。例如,在英语你必须使用<code style="white-space:nowrap">n .. ' ' .. lang:plural( n, 'sock', 'socks' )</code>或<code style="white-space:nowrap">n .. ' ' .. lang:plural( n, { 'sock', 'socks' } )</code>来生成语法正确的文本:只有1 sock或200 socks。


序列的必填值取决于语言,详见[[Special:MyLanguage/Help:Magic words#Localization|魔术字的本地化]]和[[translatewiki:Special:MyLanguage/FAQ#PLURAL|translatewiki针对PLURAL的常见问题]]。
序列的必填值取决于语言,详见[[mw:Help:Magic words#Localization|魔术字的本地化]]和[[translatewiki:Special:MyLanguage/FAQ#PLURAL|translatewiki针对PLURAL的常见问题]]。


==== mw.language:convertGrammar ====
==== mw.language:convertGrammar ====
第2,051行: 第2,052行:
<code style="white-space:nowrap">[[#mw.language-object|lang]]:grammar( case, word )</code>
<code style="white-space:nowrap">[[#mw.language-object|lang]]:grammar( case, word )</code>


: ''注意两个别称之间的不同参数顺序。<code>convertGrammar</code>匹配MediaWiki的Language对象的相同名称的方法的顺序,而<code>grammar</code>匹配相同名称的解析器函数的顺序,可参考[[Special:MyLanguage/Help:Magic words#Localisation|帮助:魔术字#本地化]]。''
: ''注意两个别称之间的不同参数顺序。<code>convertGrammar</code>匹配MediaWiki的Language对象的相同名称的方法的顺序,而<code>grammar</code>匹配相同名称的解析器函数的顺序,可参考帮助:魔术字#本地化。''


这会选择给定的变形码<code>case</code>的合适的<code>word</code>变形形式。
这会选择给定的变形码<code>case</code>的合适的<code>word</code>变形形式。


<code>word</code>和<code>case</code>的可能的值是依赖于语言的,参见[[Special:MyLanguage/Help:Magic words#Localisation]]和[[translatewiki:Special:MyLanguage/Grammar|translatewiki:语法]]以了解详情。
<code>word</code>和<code>case</code>的可能的值是依赖于语言的,参见translatewiki:语法以了解详情。


==== mw.language:gender ====
==== mw.language:gender ====
第2,276行: 第2,277行:
<code style="white-space:nowrap">mw.site.stats.pagesInCategory( category, which )</code>
<code style="white-space:nowrap">mw.site.stats.pagesInCategory( category, which )</code>


: {{red|这个函数是[[Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit|高开销函数]]}}
: {{red|这个函数是高开销函数}}


获得关于分类的统计数据。如果<code>which</code>拥有指定值"<code>*</code>",则结果为有如下内容的表:
获得关于分类的统计数据。如果<code>which</code>拥有指定值"<code>*</code>",则结果为有如下内容的表:
第2,302行: 第2,303行:
<code style="white-space:nowrap">mw.site.interwikiMap( filter )</code>
<code style="white-space:nowrap">mw.site.interwikiMap( filter )</code>


返回包含可用的[[Special:MyLanguage/Manual:Interwiki|跨wiki]]前缀的数据的表。如果<code>filter</code>是字符串"local",则只会返回关于本地跨wiki前缀的数据。如果<code>filter</code>是字符串"!local",则只会返回非本地跨wiki前缀的数据。如果没有指定filter,则所有的前缀的数据都会返回。这个"local"前缀是同一个项目的。比如在英文维基百科,其他语言的维基百科都会考虑为本地的(local),而维基词典不会。
返回包含可用的跨wiki前缀的数据的表。如果<code>filter</code>是字符串"local",则只会返回关于本地跨wiki前缀的数据。如果<code>filter</code>是字符串"!local",则只会返回非本地跨wiki前缀的数据。如果没有指定filter,则所有的前缀的数据都会返回。这个"local"前缀是同一个项目的。比如在英文维基百科,其他语言的维基百科都会考虑为本地的(local),而维基词典不会。


这个函数返回的表的键是跨wiki前缀,值是带有以下属性的子表:
这个函数返回的表的键是跨wiki前缀,值是带有以下属性的子表:
第2,311行: 第2,312行:
* '''isLocal'''——这个URL是否是当前wiki的站点的。
* '''isLocal'''——这个URL是否是当前wiki的站点的。
* '''isCurrentWiki'''——这个URL是否是为当前wiki的。
* '''isCurrentWiki'''——这个URL是否是为当前wiki的。
* '''isTranscludable'''——使用这个跨wiki前缀的页面能否[[Transclusion|嵌入包含]]。这个要求[[Special:MyLanguage/Manual:$wgEnableScaryTranscluding|scary transclusion]],而这在维基媒体的wiki是禁用的。
* '''isTranscludable'''——使用这个跨wiki前缀的页面能否[[Transclusion|嵌入包含]]。这个要求scary transclusion,而这在维基媒体的wiki是禁用的。
* '''isExtraLanguageLink'''——跨wiki是否列举在了{{wg|ExtraInterlanguageLinkPrefixes}}。
* '''isExtraLanguageLink'''——跨wiki是否列举在了{{wg|ExtraInterlanguageLinkPrefixes}}。
* '''displayText'''——对于列举在$wgExtraInterlanguageLinkPrefixes中的链接,跨语言链接显示的文本。未指定时为nil。
* '''displayText'''——对于列举在$wgExtraInterlanguageLinkPrefixes中的链接,跨语言链接显示的文本。未指定时为nil。
第2,522行: 第2,523行:
<code style="white-space:nowrap">mw.title.new( id )</code>
<code style="white-space:nowrap">mw.title.new( id )</code>


: {{red|用ID调用时该函数是[[Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit|高开销]]函数}}
: {{red|用ID调用时该函数是高开销函数}}


创建新的标题对象。
创建新的标题对象。
第2,576行: 第2,577行:
* '''subjectPageTitle''':等同于<code style="white-space:nowrap">mw.title.makeTitle( mw.site.namespaces[title.namespace].subject.id, title.text )</code>。
* '''subjectPageTitle''':等同于<code style="white-space:nowrap">mw.title.makeTitle( mw.site.namespaces[title.namespace].subject.id, title.text )</code>。
* '''redirectTarget''':返回重定向页面的目标页面的标题对象,但如果不是重定向页面,则返回<code>false</code>。
* '''redirectTarget''':返回重定向页面的目标页面的标题对象,但如果不是重定向页面,则返回<code>false</code>。
* '''protectionLevels''':页面的保护等级。其值为一个表,键对应每个操作(如<code>"edit"</code>、<code>"move"</code>),值为数组,第一项是包含对应保护等级的字符串,如果页面未被保护,则表的值或者数组的项就会为<code>nil</code>。{{red|此函数[[Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit|高开销]]}}。
* '''protectionLevels''':页面的保护等级。其值为一个表,键对应每个操作(如<code>"edit"</code>、<code>"move"</code>),值为数组,第一项是包含对应保护等级的字符串,如果页面未被保护,则表的值或者数组的项就会为<code>nil</code>。{{red|此函数高开销}}。
* '''cascadingProtection''':该页面应用的级联保护,为一个表,键为<code>"restrictions"</code>(自身为一个表,键类似于<code>protectionLevels</code>拥有的那些)和<code>"sources"</code>(列举保护级联来源的标题的数组)。如果没有保护级联到此页面,则<code>"restrictions"</code>和<code>"sources"</code>可能是空的。{{red|此函数[[Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit|开销较高]]}}。
* '''cascadingProtection''':该页面应用的级联保护,为一个表,键为<code>"restrictions"</code>(自身为一个表,键类似于<code>protectionLevels</code>拥有的那些)和<code>"sources"</code>(列举保护级联来源的标题的数组)。如果没有保护级联到此页面,则<code>"restrictions"</code>和<code>"sources"</code>可能是空的。{{red|此函数开销较高}}。
* '''subPageTitle( text )''':等同于<code style="white-space:nowrap">mw.title.makeTitle( title.namespace, title.text .. '/' .. <var>text</var> )</code>。
* '''subPageTitle( text )''':等同于<code style="white-space:nowrap">mw.title.makeTitle( title.namespace, title.text .. '/' .. <var>text</var> )</code>。
* '''partialUrl()''':返回编码的<code>title.text</code>,就像在URL中会有的那样。
* '''partialUrl()''':返回编码的<code>title.text</code>,就像在URL中会有的那样。
第2,592行: 第2,593行:
===== 文件元数据 =====
===== 文件元数据 =====


代表File或Media命名空间下的页面的标题对象会拥有称为<code>file</code>属性。{{red|这是[[Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit|高开销]]的。}}这是一个表,其结构如下:
代表File或Media命名空间下的页面的标题对象会拥有称为<code>file</code>属性。{{red|这是高开销的。}}这是一个表,其结构如下:


* '''exists''':文件是否存在。会记录一次图像使用。标题对象的<code>fileExists</code>属性的存在是为了考虑向后兼容,可以看做该属性的别称。如果这是<code>false</code>,所有其他属性都会是<code>nil</code>。
* '''exists''':文件是否存在。会记录一次图像使用。标题对象的<code>fileExists</code>属性的存在是为了考虑向后兼容,可以看做该属性的别称。如果这是<code>false</code>,所有其他属性都会是<code>nil</code>。
第2,604行: 第2,605行:
===== 高开销属性 =====
===== 高开销属性 =====


属性<code>id</code>、<code>isRedirect</code>、<code>exists</code>和<code>contentModel</code>需要从数据库获取标题数据。因此,第一次获取除了当前页面之外的任何页面的这些属性中的一个时,[[Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit|高开销函数数量]]会增加。之后获取那个页面的这些属性中的任何一个都不会再次增加高开销函数数量。
属性<code>id</code>、<code>isRedirect</code>、<code>exists</code>和<code>contentModel</code>需要从数据库获取标题数据。因此,第一次获取除了当前页面之外的任何页面的这些属性中的一个时,高开销函数数量会增加。之后获取那个页面的这些属性中的任何一个都不会再次增加高开销函数数量。


其他标记为高开销的属性总是会在第一次获取除当前页面之外的页面时增加高开销函数数量。
其他标记为高开销的属性总是会在第一次获取除当前页面之外的页面时增加高开销函数数量。
第3,018行: 第3,019行:


[[#Writing Scribunto libraries|Writing Scribunto libraries]]提供了如何开发这些库以为MediaWiki扩展提供Lua接口的信息。
[[#Writing Scribunto libraries|Writing Scribunto libraries]]提供了如何开发这些库以为MediaWiki扩展提供Lua接口的信息。

以下库是计划中的,在Gerrit中等待复核。

* ''(目前还没有)''


=== mw.wikibase ===
=== mw.wikibase ===
{{ll|Extension:Wikibase Client|nsp=0}}提供了对可本地化的结构数据的访问,尤其是[[d:Special:MyLanguage/Wikidata:Main Page|维基数据]]。
[[Extension:Wikibase Client|nsp=0]]提供了对可本地化的结构数据的访问,尤其是[[d:Special:MyLanguage/Wikidata:Main Page|维基数据]]。
参见[https://doc.wikimedia.org/Wikibase/master/php/md_docs_topics_lua.html md_docs_topics_lua.html]和{{ll|Extension:Wikibase Client/Lua}}
参见[https://doc.wikimedia.org/Wikibase/master/php/md_docs_topics_lua.html md_docs_topics_lua.html]和[[Extension:Wikibase Client/Lua]]


=== mw.wikibase.lexeme ===
=== mw.wikibase.lexeme ===
[[Special:MyLanguage/Extension:WikibaseLexeme|WikibaseLexeme]]提供了对Wikibase Lexeme实体的访问,由[[d:Special:MyLanguage/Wikidata:Lexicographical data|Wikidata:Lexicographical data]]支持。
WikibaseLexeme提供了对Wikibase Lexeme实体的访问,由[[d:Special:MyLanguage/Wikidata:Lexicographical data|Wikidata:Lexicographical data]]支持。


=== mw.wikibase.mediainfo ===
=== mw.wikibase.mediainfo ===
[[Special:MyLanguage/Extension:WikibaseMediaInfo|WikibaseMediaInfo]]提供了对Wikibase MediaInfo实体的访问。
WikibaseMediaInfo提供了对Wikibase MediaInfo实体的访问。
参见{{ll|Extension:WikibaseMediaInfo/Lua}}
参见[[Extension:WikibaseMediaInfo/Lua]]
这是由[[c:Special:MyLanguage/Commons:Structured data|Structured Data on Commons]]支持的,参见[[c:Special:MyLanguage/Commons:Structured data/Lua|Commons:Structured data/Lua]]。
这是由[[c:Special:MyLanguage/Commons:Structured data|Structured Data on Commons]]支持的,参见[[c:Special:MyLanguage/Commons:Structured data/Lua|Commons:Structured data/Lua]]。


第3,045行: 第3,042行:


=== mw.ext.cargo ===
=== mw.ext.cargo ===
[[Special:MyLanguage/Extension:Cargo|Cargo]]提供了从Lua中查询数据的方法,参见[[Extension:Cargo/Other features#Lua support]]。
Cargo提供了从Lua中查询数据的方法,参见[[Extension:Cargo/Other features#Lua support]]。


=== mw.ext.cattools ===
=== mw.ext.cattools ===
第3,172行: 第3,169行:
Scribunto扩展包括一个用于测试用例的基类<code>Scribunto_LuaEngineTestBase</code>,该类将针对LuaSandbox和LuaStandalone引擎运行测试。
Scribunto扩展包括一个用于测试用例的基类<code>Scribunto_LuaEngineTestBase</code>,该类将针对LuaSandbox和LuaStandalone引擎运行测试。
库的测试用例应该扩展这个类,并且不应该覆盖<code>static function suite()</code>。
库的测试用例应该扩展这个类,并且不应该覆盖<code>static function suite()</code>。
在Scribunto扩展中,测试用例应该在<code>tests/engines/LuaCommon/''Name''LibraryTest.php</code>并添加到{{phpi|ScribuntoHooks::unitTestsList()}}中的数组中(在<code>common/Hooks.php</code>中),扩展应该在自己的<code>{{ll|Manual:Hooks/UnitTestsList|UnitTestsList}}</code>钩子函数中添加测试用例,可能取决于是否设置了<code>$wgAutoloadClasses['Scribunto_LuaEngineTestBase']</code>。
在Scribunto扩展中,测试用例应该在<code>tests/engines/LuaCommon/''Name''LibraryTest.php</code>并添加到{{phpi|ScribuntoHooks::unitTestsList()}}中的数组中(在<code>common/Hooks.php</code>中),扩展应该在自己的<code>[[Manual:Hooks/UnitTestsList|UnitTestsList]]</code>钩子函数中添加测试用例,可能取决于是否设置了<code>$wgAutoloadClasses['Scribunto_LuaEngineTestBase']</code>。


大多数时候,制作测试用例需要做的包括:
大多数时候,制作测试用例需要做的包括:
第3,218行: 第3,215行:
有(至少)两种方式来运行PHPUnit测试:
有(至少)两种方式来运行PHPUnit测试:


# 针对核心运行phpunit,允许tests/phpunit/suites/ExtensionsTestSuite.php使用{{ll|Manual:Hooks/UnitTestsList|UnitTestsList}}钩子找到扩展的测试。 如果您的扩展的测试类名称都包含一个唯一的组件(例如扩展的名称),则可以使用<code>--filter</code>选项以仅运行您的扩展的测试。
# 针对核心运行phpunit,允许tests/phpunit/suites/ExtensionsTestSuite.php使用[[Manual:Hooks/UnitTestsList|UnitTestsList]]钩子找到扩展的测试。 如果您的扩展的测试类名称都包含一个唯一的组件(例如扩展的名称),则可以使用<code>--filter</code>选项以仅运行您的扩展的测试。
# 对扩展目录运行phpunit,这将获取以“Test.php”结尾的任何文件。
# 对扩展目录运行phpunit,这将获取以“Test.php”结尾的任何文件。


如果在LocalSettings.php中加载了Scribunto,则其中任何一个都可以正常运作。如果未加载Scribunto,那么方法#1很容易生效,因为可以轻松编写UnitTestsList钩子以避免在未设置{{phpi|$wgAutoloadClasses[ 'Scribunto_LuaEngineTestBase' ]}}时返回Scribunto测试。
如果在LocalSettings.php中加载了Scribunto,则其中任何一个都可以正常运作。如果未加载Scribunto,那么方法#1很容易生效,因为可以轻松编写UnitTestsList钩子以避免在未设置{{phpi|$wgAutoloadClasses[ 'Scribunto_LuaEngineTestBase' ]}}时返回Scribunto测试。


但是[[Jenkins]]使用方法#2。为了让Jenkins正确运行测试,您需要将Scribunto添加到扩展的依赖项。有关如何完成此操作的示例,请参见{{gerrit|56570}}
但是[[Jenkins]]使用方法#2。为了让Jenkins正确运行测试,您需要将Scribunto添加到扩展的依赖项。


如果由于某种原因,您需要能够在不加载Scribunto的情况下使用方法#2运行测试,一种解决方法是将此检查添加到单元测试文件的顶部:
如果由于某种原因,您需要能够在不加载Scribunto的情况下使用方法#2运行测试,一种解决方法是将此检查添加到单元测试文件的顶部:
第3,238行: 第3,235行:


==参见==
==参见==
* [[Lua]]

*[[w:Lua (programming language)]]


{{anchor|License}}
{{anchor|License}}
== 许可协议 ==
== 许可协议 ==
本手册取自[[mw:Extension:Scribunto/Lua_reference_manual/zh|MediaWiki网站]],以[[cc-by-sa:3.0|CC BY-SA 3.0]]授权。
以下内容为译文,请以英文原文为准。


本手册(的英文原文)取自[https://www.lua.org/manual/5.1/index.html Lua 5.1 参考手册],在[https://www.lua.org/license.html MIT许可证]下可用。
本手册(的英文原文)取自[https://www.lua.org/manual/5.1/index.html Lua 5.1 参考手册],在[https://www.lua.org/license.html MIT许可证]下可用。


{{MIT License|© 1994–2012 Lua.org,PUC-Rio}}
{{mbox
| type = notice
| image = none
| text =
Copyright © 1994–2012 Lua.org,PUC-Rio

软件著作权持有人据此条款,授权许可任何获得该软件的副本和与其有关的文档文件(“该软件的副本和与其有关的文档文件”以下称为“该软件”)的人,无偿地、不受任何限制(包括使用、复制、修改、合并、出版、分发、再许可和/或销售软件副本的权利)地处理该软件,且可以将该软件提供给他人并对其以同样方式授权许可,但需符合下列条件:

上述著作权声明和本许可声明应包含在所有该软件的副本或带有该软件大部分内容的实体之内。

本软件按“原样”提供,无任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对因本软件或本软件的使用或其他交易而引起的、与之相关的任何索赔、损害赔偿或其他责任负责,无论是合同诉讼、侵权诉讼还是其他诉讼。<!-- 此段为机翻 -->
}}
本衍生手册也可以根据同一许可证的条款进行复制。


[[Category:Lua{{#translation:}}]]
[[Category:Lua]]