Extension:Scribunto/zh

Scribunto (Latin: "they shall write/let them write (in the future)") 扩展可以在MediaWiki软件中嵌入脚本.

目前唯一被-{zh-hans:支持; zh-hant:支援;}-的脚本语言是Lua. Scribunto Lua脚本在一个名为-{zh:Module; zh-hans:模块; zh-hant:模組;}-的命名空间里.

许可协议
该扩展包含使用GNU通用公共许可证v2.0或更高版本（GPL-2.0+）的代码以及使用MIT许可证（MIT）的代码.

PCRE版本兼容性
推荐使用PCRE 8.33+. 你可以通过以下方法看到PHP所使用的PCRE的版本：查看phpinfo页面，或在命令行使用以下命令.


 * Scribunto不兼容8.10版本以下的PCRE
 * PCRE 8.31 在 JIT 模式方面存在缺陷，研究发现与HHVM一起使用时会破坏各种模式.
 * PCRE 8.32 有一个BUG，这将导致它拒绝某些 非字符代码点，这将导致 mw.html 模块出现错误.

CentOS 6 和 RHEL 6 卡在 PCRE 7 上，需要升级.

在使用旧版本的服务器上更新到 8.33 可能比较复杂. 更多细节在Updating to PCRE 8.33 or Higher.

PHP pcntl (LTS)
MediaWiki 1.25 至 1.28 的 Scribunto 版本需要 PHP 的 pcntl扩展，如果您想使用“LuaStandalone”（即在单独的子进程中运行），该扩展名仅在 Unix/Linux 平台上可用. 在针对MediaWiki 1.29发布的Scribunto中这个依赖被移除.

你可以访问phpinfo网页以检查pcntl的支持是否已经启用，或者在命令行输入以下命令：

PHP mbsting 扩展
PHP需要启用 mbstring 扩展.

您可以通过查看phpinfo网页或使用以下命令从命令行检查是否启用了mbstring支持：

捆绑的二进制文件
Scribunto与Linux（x86和x86-64）、Mac OS X Lion和Windows（32位和64位）的Lua二进制发行版捆绑在一起.

Scribunto应该在以下情况下为您提供开箱即用的服务：


 * 1) 您的web服务器在上述平台之一上运行.
 * 2) PHP的 函数不受限制.
 * 3) 你的网络浏览器已被配置为允许MediaWiki树中的二进制文件的执行.
 * 可能需要设置执行权限，例如，在Linux使用：
 * If you are using SELinux in "Enforcing" mode on your server, you might need to set a proper context for the binaries. Example for RHEL/CentOS 7:

额外的二进制
如果您的Web服务器的操作系统不在上面的列表中，则可能需要额外的Lua二进制发行版，可以从http://luabinaries.sourceforge.net/或从你的Linux发行中获得.

只支持Lua 5.1.x的二进制文件.

在你的web浏览器中安装了适当的二进制文件后，使用如下代码配置文件的地址：

注意你不应该添加上面的行，除非你确认Scribunto的内置二进制对你来说不起作用.

LuaJIT，尽管理论上兼容，但并不受支持.

不再支持是因为幽灵漏洞和比特腐烂的问题（T184156）.

集成扩展
为能使用有语法高亮和自动缩进的代码编辑器，提供更舒适的用户界面，请安装下列扩展：

然后在所有插件注册后，在你的 中，添加：

Lua 沙盒
我们开发了一个用C语言编写的PHP扩展，称为LuaSandbox. 可以用作独立二进制文件的替代，并且性能更佳. 详细信息和安装指引，参见.

如果你最初安装扩展以使用Lua独立二进制文件，请务必使用以下配置设置更新 ：

-{zh-hans:配置; zh-hant:組態;}-
有以下几个用于配置的变量：
 * $wgScribuntoDefaultEngine
 * 选择默认引擎. 有效值为 中的键，默认为 或.


 * $wgScribuntoUseGeSHi
 * 安装了后，将此设为true以在显示模块页面时使用它. （MediaWiki 1.30或更早. ）


 * $wgScribuntoUseCodeEditor
 * 安装了后，将此设为 以在编辑模块页面时使用它. （MediaWiki 1.30或更早. ）


 * $wgScribuntoEngineConf
 * 引擎配置的关联数组. 键时 的有效值，值是配置数据的关联数组.  每个配置数组都必须包含一个 键，命名要使用的 子类.

LuaStandalone
中使用以下键用于. 通常你会将其设为类似于以下内容


 * luaPath
 * 指定到Lua解释器的路径.


 * errorFile
 * 指定文件的路径，可由Web服务器用户写入，其中将记录来自独立解释器的错误和调试输出.
 * 默认情况下不记录独立解释器产生的错误输出. 配置输出：


 * memoryLimit
 * 为Linux上的独立解释器指定内存限制，以字节为单位（使用ulimit强制执行）.


 * cpuLimit
 * 为Linux上的独立解释器指定CPU时间限制，以秒为单位（使用ulimit强制执行）.


 * allowEnvFuncs
 * 设为true以允许在模块内使用setfenv和getfenv.

LuaSandbox
中使用以下键用于. 通常你会将其设为类似于以下内容


 * memoryLimit
 * 指定内存限制，以字节为单位.


 * cpuLimit
 * 指定CPU时间限制，以秒为单位.


 * profilerPeriod
 * 在Lua分析器的部分中指定轮询之间的时间.


 * allowEnvFuncs
 * 设为true以允许在模块内使用setfenv和getfenv.

用法
脚本在称为模块的命名空间中. 每个模块都有一系列函数，可以在像这样的维基文本语法中调用：

学习Lua
Lua是一种简单的编程语言，用于让初学者可以使用. Lua的快速速成课程，可以尝试Learn Lua in 15 Minutes.

The best comprehensive introduction to Lua is the book Programming in Lua. The first edition (for Lua 5.0) is available online and is mostly relevant to Lua 5.1, the version used by Scribunto:


 * Programming in Lua (scroll down past the book ads to find the text)

The reference manual is also useful:

Lua环境
In Lua, the set of all global variables and functions is called an environment.

Each  call runs in a separate environment. Variables defined in one  will not be available from another. This restriction was necessary to maintain flexibility in the wikitext parser implementation.

调试控制台



 *  See also: 

When editing a Lua module a so-called "debug console" can be found underneath the edit form. In this debug console Lua code can be executed without having to save or even create the Lua module in question.

故障排除


Note that red messages are clickable and will provide more detailed information.

When using the LuaStandalone engine (this is the default), errors along the lines of "" may be generated if the standalone Lua interpreter cannot be executed or runs into various runtime errors. To obtain more information, assign a file path to. The interpreter's error output will be logged to the specified file, which should prove more helpful in tracking down the issue. The information in the debug log includes debugging information, which is why there is so much of it. You should be able to ignore any line beginning with "TX" or "RX".

If you're setting up Scribunto and are using IIS/Windows, this appears to be solved by commenting out a particular line.

When using the LuaStandalone engine (this is the default), status 2 suggests memory allocation errors, probably caused by settings that allocate inadequate memory space for PHP or Lua, or both. Assigning a file path to  and examining that output can be valuable in diagnosing memory allocation errors.

Increase PHP allocation in your PHP configuration; add the line. This allocation of 200MB is often sufficient (as of MediaWiki 1.24) but can be increased as required. Set Scribunto's memory allocation in  as a line: Finally, depending on the server configuration, some installations may be helped by adding another  line

Note that all 3 memory limits are given in different units.

Lua error: Internal error: 2. on ARM architecture
If you're using an ARM architecture processor like on a RaspberryPi you'll face the error  due to wrong delivered binary format of the Lua interpreter.

Check your Lua interpreter in: /path/to/webdir/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_32_generic

Check the interpreter by using: file lua The result should look like : lua: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0 The installed default Lua interpreter shows: lua: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.9, look at the "Intel 80386" part what definitely is not correct.

Check in  what version of Lua is installed on your system. If you have lua5.1 installed, you can either copy the interpreter to your  directory or set in your LocalSettings.php:

At present don't set  to /usr/bin/lua5.3, it'll lead to the "Internal error 1".

When using the LuaStandalone engine (this is the default), status 24 suggests CPU time limit errors, although those should be generating a "The time allocated for running scripts has expired" message instead. It would be useful to file a task in and participate in determining why the XCPU signal isn't being caught.

When using the LuaStandalone engine (this is the default), errors along the lines of "" may be generated if the standalone Lua interpreter cannot be executed. This generally arises from either of two causes:

Set permissions as described under #Installation. This often occurs with shared hosted servers. Remedies include adjusting  to point to a Lua 5.1 binary installed in an executable location, or adjusting or convincing the shared host to adjust the setting preventing execution.
 * The lua executable file's permissions do not include Execute.
 * The server does not allow execution of files from the place where the executable is installed, e.g. the filesystem is mounted with the  flag.

Error condition such as: Fatal exception of type MWException
Check the MediaWiki, PHP, or webserver logs for more details on the exception, or temporarily set to.

version 'GLIBC_2.11' not found
If the above gives you errors such as "version 'GLIBC_2.11' not found", it means the version of the standard C library on your system is too old for the binaries provided with Scribunto. You should upgrade your C library, or use a version of Lua 5.1 compiled for the C library you do have installed. To upgrade your C library, your best option is usually to follow your distribution's instructions for upgrading packages (or for upgrading to a new release of the distribution, if applicable).

If you copy the lua binaries from Scribunto master (or from 77905), that should suffice, if you can't or don't want to upgrade your C library. The distributed binaries were recently recompiled against an older version of glibc, so the minimum is now 2.3 rather than 2.11.

Lua errors in Scribunto files
Errors here include:
 *  attempt to index field 'text' (a nil value) 
 *  Lua error in mw.html.lua at line 253: Invalid class given: 

If you are getting errors such these when attempting to use modules imported from WMF wikis, most likely your version of Scribunto is out of date.

Upgrade if possible; for advanced users, you might also try to identify the needed newer commits and cherry-pick them into your local installation.

preg_replace_callback: Compilation failed: unknown property name after \P or \p at offset 7

 * this usually indicates an incompatible version of PCRE; you'll need to update to >= 8.10
 * @todo: link to instructions on how to upgrade

Lua error
If you copy templates from Wikipedia and then get big red "Lua error: x" messages where the Scribunto invocation (e.g. the template that uses ) should be, that probably means that you didn't import everything you needed. Make sure that you tick the "Include templates" box at w:Special:Export when you export.

When importing pages from another wiki, it is also possible for templates or modules in the imported data to overwrite existing templates or modules with the same title, which may break existing pages, templates, and modules that depend on the overwritten versions.

Blank screen
Make sure your extension version is applicable to your MediaWiki version.

Design documents

 * Linux.conf.au 2014 - Scribunto presentation.webm's presentation at linux.conf.au 2014 discussing the motivations, implementation challenges and results of deploying Scribunto and Lua. ]]

其他页面

 * - Wikimedia activity page describing deployment plan to Wikimedia sites.
 * - The reference about the Lua language, as well as its standard libraries and common Scribunto modules supported on Wikimedia sites.
 * - A list of known changes in Lua 5.2 that may cause code written in 5.1 to function unexpectedly.
 * - Code for example extensions extending the Scribunto library.
 * - A list of known changes in Lua 5.2 that may cause code written in 5.1 to function unexpectedly.
 * - Code for example extensions extending the Scribunto library.
 * - Code for example extensions extending the Scribunto library.

参见

 * General
 * - functionality for the Scribunto extension.
 * Commons:Lua - there may be specific notes for using Lua modules on Wikimedia Commons, including additional Lua extensions installed (e.g. for local support of internationalization and for parsing or playing medias). Some general purpose modules may be reused in other wikis in various languages (except specific tunings for policies, namespaces or project/maintenance pages with dedicated names). If possible, modules that could be widely reused across wikis should be tested and internationalized on Wikimedia Commons.
 * w:Help:Lua - there may be specific notes for using Lua modules on Wikipedia, including additional Lua extensions installed (including for integrating Wikidata and Wikimedia Commons contents, generating complex infoboxes and navigation boxes, or to facilitate the general administration/maintenance of the wiki contents under applicable policies). Some other localized Wikipedia editions (or other projects such Wiktionnary, Wikisource or Wikinews) may also have their own needs and Lua modules.
 * d:Help:Lua - there may be specific notes for using Lua modules on Wikidata, including additional Lua extensions installed (e.g. for local support of internationalization and for database queries)
 * Extensions
 * - Provides basic infobox functionality for the Scribunto extension.
 * - provides native support for the Scribunto extension for usage with
 * - provides a Scribunto Lua interface for the Variables extension
 * - provides (part of Wikidata project)