summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--locale/zh-CN/meta.lni103
-rw-r--r--meta/template/basic.lua64
-rw-r--r--meta/template/package.lua6
-rw-r--r--script-beta/library.lua61
-rw-r--r--script-beta/utility.lua42
5 files changed, 233 insertions, 43 deletions
diff --git a/locale/zh-CN/meta.lni b/locale/zh-CN/meta.lni
new file mode 100644
index 00000000..e8b746eb
--- /dev/null
+++ b/locale/zh-CN/meta.lni
@@ -0,0 +1,103 @@
+-- basic
+arg = 独立版Lua的启动参数。
+assert = 如果其参数 `v` 的值为假(`nil` 或 `false`), 它就调用 $error; 否则,返回所有的参数。 在错误情况时, `message` 指那个错误对象; 如果不提供这个参数,参数默认为 `"assertion failed!"` 。
+"cgopt.collect" = 做一次完整的垃圾收集循环。 这是默认选项。
+"cgopt.stop " = 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。
+"cgopt.restart" = 重启垃圾收集器的自动运行。
+"cgopt.count " = 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 `1024` 就能得到 Lua 使用的准确字节数(除非溢出)。
+"cgopt.step" = 单步运行垃圾收集器。 步长“大小”由 `arg` 控制。 传入 `0` 时,收集器步进(不可分割的)一步。 传入非 `0` 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 `true` 。
+"cgopt.setpause" = 将 `arg` 设为收集器的 *间歇率* (参见 §2.5)。 返回 *间歇率* 的前一个值。
+"cgopt.setstepmul" = 将 `arg` 设为收集器的 *步进倍率* (参见 §2.5)。 返回 *步进倍率* 的前一个值。
+"cgopt.incremental" = 改变收集器模式为增量模式。
+"cgopt.generational"= 改变收集器模式为分代模式。
+"cgopt.isrunning" = 返回表示收集器是否在工作的布尔值 (即未被停止)。
+collectgarbage = 这个函数是垃圾收集器的通用接口。 通过参数 opt 它提供了一组不同的功能。
+dofile = 打开该名字的文件,并执行文件中的 Lua 代码块。 不带参数调用时, `dofile` 执行标准输入的内容(`stdin`)。 返回该代码块的所有返回值。 对于有错误的情况,`dofile` 将错误反馈给调用者 (即,`dofile` 没有运行在保护模式下)。
+error = [[
+中止上一次保护函数调用, 将错误对象 `message` 返回。 函数 `error` 永远不会返回。
+
+当 `message` 是一个字符串时,通常 `error` 会把一些有关出错位置的信息附加在消息的前头。 level 参数指明了怎样获得出错位置。 对于 level `1` (默认值),出错位置指 `error` 函数调用的位置。 Level `2` 将出错位置指向调用 `error` 的函数的函数;以此类推。 传入 level `0` 可以避免在消息前添加出错位置信息。
+]]
+_G = 一个全局变量(非函数), 内部储存有全局环境(参见 §2.2)。 Lua 自己不使用这个变量; 改变这个变量的值不会对任何环境造成影响,反之亦然。
+getfenv = 返回给定函数的环境。`f` 可以是一个Lua函数,也可是一个表示调用栈层级的数字。
+getmetatable = 如果 `object` 不包含元表,返回 `nil` 。 否则,如果在该对象的元表中有 `"__metatable"` 域时返回其关联值, 没有时返回该对象的元表。
+ipairs = [[
+返回三个值(迭代函数、表 `t` 以及 `0` ), 如此,以下代码
+```lua
+ for i,v in ipairs(t) do body end
+```
+将迭代键值对 `(1,t[1]) ,(2,t[2]), ...` ,直到第一个空值。
+]]
+"loadmode.b" = 只能是二进制代码块。
+"loadmode.t" = 只能是文本代码块。
+"loadmode.bt" = 可以是二进制也可以是文本。
+load = [[
+加载一个代码块。
+
+如果 `chunk` 是一个字符串,代码块指这个字符串。 如果 `chunk` 是一个函数, `load` 不断地调用它获取代码块的片断。 每次对 `chunk` 的调用都必须返回一个字符串紧紧连接在上次调用的返回串之后。 当返回空串、`nil`、或是不返回值时,都表示代码块结束。
+
+如果没有语法错误, 则以函数形式返回编译好的代码块; 否则,返回 `nil` 加上错误消息。
+
+如果结果函数有上值, `env` 被设为第一个上值。 若不提供此参数,将全局环境替代它。 所有其它上值初始化为 `nil` 。 (当你加载主代码块时候,结果函数一定有且仅有一个上值 `_ENV` (参见 §2.2)。 然而,如果你加载一个用函数(参见 $string.dump, 结果函数可以有任意数量的上值) 创建出来的二进制代码块时,所有的上值都是新创建出来的。 也就是说它们不会和别的任何函数共享。
+
+`chunkname` 在错误消息和调试消息中(参见 §4.9),用于代码块的名字。 如果不提供此参数,它默认为字符串`chunk` 。 `chunk` 不是字符串时,则为 `"=(load)"` 。
+
+字符串 `mode` 用于控制代码块是文本还是二进制(即预编译代码块)。 它可以是字符串 `"b"` (只能是二进制代码块), `"t"` (只能是文本代码块), 或 `"bt"` (可以是二进制也可以是文本)。 默认值为 `"bt"`。
+
+Lua 不会对二进制代码块做健壮性检查。 恶意构造一个二进制块有可能把解释器弄崩溃。
+]]
+loadfile = 和 $load 类似, 不过是从文件 `filename` 或标准输入(如果文件名未提供)中获取代码块。
+loadstring = 使用给定字符串加载代码块。
+module = 创建一个模块。
+next = [[
+运行程序来遍历表中的所有域。 第一个参数是要遍历的表,第二个参数是表中的某个键。 `next` 返回该键的下一个键及其关联的值。 如果用 `nil` 作为第二个参数调用 `next` 将返回初始键及其关联值。 当以最后一个键去调用,或是以 `nil` 调用一张空表时, `next` 返回 `nil`。 如果不提供第二个参数,将认为它就是 `nil`。 特别指出,你可以用 `next(t)` 来判断一张表是否是空的。
+
+索引在遍历过程中的次序无定义, 即使是数字索引也是这样。 (如果想按数字次序遍历表,可以使用数字形式的 `for` 。)
+
+当在遍历过程中你给表中并不存在的域赋值, `next` 的行为是未定义的。 然而你可以去修改那些已存在的域。 特别指出,你可以清除一些已存在的域。
+]]
+paris = [[
+如果 `t` 有元方法 `__pairs`, 以 `t` 为参数调用它,并返回其返回的前三个值。
+
+否则,返回三个值:`next` 函数, 表 `t`,以及 `nil`。 因此以下代码
+```lua
+ for k,v in pairs(t) do body end
+```
+能迭代表 `t` 中的所有键值对。
+
+参见函数 $next 中关于迭代过程中修改表的风险。
+]]
+pcall = 传入参数,以 *保护模式* 调用函数 `f` 。 这意味着 `f` 中的任何错误不会抛出; 取而代之的是,`pcall` 会将错误捕获到,并返回一个状态码。 第一个返回值是状态码(一个布尔量), 当没有错误时,其为真。 此时,`pcall` 同样会在状态码后返回所有调用的结果。 在有错误时,`pcall` 返回 `false` 加错误消息。
+print = 接收任意数量的参数,并将它们的值打印到 `stdout`。 它用 `tostring` 函数将每个参数都转换为字符串。 `print` 不用于做格式化输出。仅作为看一下某个值的快捷方式。 多用于调试。 完整的对输出的控制,请使用 $string.format 以及 $io.write。
+rawequal = 在不触发任何元方法的情况下 检查 `v1` 是否和 `v2` 相等。 返回一个布尔量。
+rawget = 在不触发任何元方法的情况下 获取 `table[index]` 的值。 `table` 必须是一张表; `index` 可以是任何值。
+rawlen = 在不触发任何元方法的情况下 返回对象 `v` 的长度。 `v` 可以是表或字符串。 它返回一个整数。
+rawset = [[
+在不触发任何元方法的情况下 将 `table[index]` 设为 `value。` `table` 必须是一张表, `index` 可以是 `nil` 与 `NaN` 之外的任何值。 `value` 可以是任何 Lua 值。
+这个函数返回 `table`。
+]]
+select = 如果 `index` 是个数字, 那么返回参数中第 `index` 个之后的部分; 负的数字会从后向前索引(`-1` 指最后一个参数)。 否则,`index` 必须是字符串 `"#"`, 此时 `select` 返回参数的个数。
+setfenv = ''
+setmetatable = [[
+给指定表设置元表。 (你不能在 Lua 中改变其它类型值的元表,那些只能在 C 里做。) 如果 `metatable` 是 `nil`, 将指定表的元表移除。 如果原来那张元表有 `"__metatable"` 域,抛出一个错误。
+
+这个函数返回 `table`。
+]]
+tonumber = [[
+如果调用的时候没有 `base`, `tonumber` 尝试把参数转换为一个数字。 如果参数已经是一个数字,或是一个可以转换为数字的字符串, `tonumber` 就返回这个数字; 否则返回 `nil`。
+
+字符串的转换结果可能是整数也可能是浮点数, 这取决于 Lua 的转换文法(参见 §3.1)。 (字符串可以有前置和后置的空格,可以带符号。)
+
+当传入 `base` 调用它时, `e` 必须是一个以该进制表示的整数字符串。 进制可以是 `2` 到 `36` (包含 `2` 和 `36`)之间的任何整数。 大于 10 进制时,字母 `'A'` (大小写均可)表示 `10` , `'B'` 表示 `11`,依次到 `'Z'` 表示 `35` 。 如果字符串 `e` 不是该进制下的合法数字, 函数返回 `nil`。
+]]
+tostring = [[
+可以接收任何类型,它将其转换为人可阅读的字符串形式。 浮点数总被转换为浮点数的表现形式(小数点形式或是指数形式)。 (如果想完全控制数字如何被转换,可以使用 $string.format。)
+如果 `v` 有 `"__tostring"` 域的元表, `tostring` 会以 `v` 为参数调用它。 并用它的结果作为返回值。
+]]
+type = [[
+将参数的类型编码为一个字符串返回。 函数可能的返回值有 `"nil"` (一个字符串,而不是 `nil` 值), `"number"`, `"string"`, `"boolean"`, `"table"`, `"function"`, `"thread"`, `"userdata"`。
+]]
+_VERSION = 一个包含有当前解释器版本号的全局变量(并非函数)。 当前这个变量的值为 `"Lua 5.3"`。
+warn = ''
+xpcall = 这个函数和 `pcall` 类似。 不过它可以额外设置一个消息处理器 `msgh`。
+unpack = ''
diff --git a/meta/template/basic.lua b/meta/template/basic.lua
index b8b052fe..7819fb44 100644
--- a/meta/template/basic.lua
+++ b/meta/template/basic.lua
@@ -1,39 +1,46 @@
---@meta
+---#DES 'arg'
---@type table
arg = {}
+---#DES 'assert'
---@generic T
---@param v T
---@param message any
---@return T
function assert(v, message) end
----@alias cgopt54
----|>'"collect"'
----| '"stop"'
----| '"restart"'
----| '"count"'
----| '"step"'
----| '"incremental"'
----| '"generational"'
----| '"isrunning"'
-
----@param opt cgopt54?
+---@alias cgopt
+---|>'"collect"' # ---#DES 'cgopt.collect'
+---| '"stop"' # ---#DES 'cgopt.stop'
+---| '"restart"' # ---#DES 'cgopt.restart'
+---| '"count"' # ---#DES 'cgopt.count'
+---| '"step"' # ---#DES 'cgopt.step'
+---| '"incremental"' # ---#DES 'cgopt.incremental'
+---| '"generational"' # ---#DES 'cgopt.generational'
+---| '"isrunning"' # ---#DES 'cgopt.isrunning'
+
+---#DES 'collectgarbage'
+---@param opt cgopt?
---@return any
function collectgarbage(opt, ...) end
+---#DES 'dofile'
---@param filename string?
---@return any
function dofile(filename) end
+---#DES 'error'
---@param message any
---@param level integer?
function error(message, level) end
+---#DES '_G'
---@class _G
_G = {}
+---#DES 'getfenv'
---#if VERSION >= 5.2 then
---@deprecated
---#end
@@ -41,10 +48,12 @@ _G = {}
---@return table
function getfenv(f) end
+---#DES 'getmetatable'
---@param object any
---@return table metatable
function getmetatable(object) end
+---#DES 'ipairs'
---@param t table
---@return fun(t: table, i: integer?):integer, any iterator
---@return table t
@@ -52,10 +61,11 @@ function getmetatable(object) end
function ipairs(t) end
---@alias loadmode
----| '"b"''
----| '"t"'
----|>'"bt"'
+---| '"b"' # ---#DES 'loadmode.b'
+---| '"t"' # ---#DES 'loadmode.t'
+---|>'"bt"' # ---#DES 'loadmode.bt'
+---#DES 'load'
---@param chunk string|function
---@param chunkname string?
---@param mode loadmode?
@@ -64,6 +74,7 @@ function ipairs(t) end
---@return string error_message
function load(chunk, chunkname, mode, env) end
+---#DES 'loadfile'
---@param filename string?
---@param mode loadmode?
---@param env table?
@@ -71,6 +82,7 @@ function load(chunk, chunkname, mode, env) end
---@return string error_message
function loadfile(filename, mode, env) end
+---#DES 'loadstring'
---#if VERSION >= 5.2 then
---@deprecated
---#end
@@ -80,18 +92,21 @@ function loadfile(filename, mode, env) end
---@return string error_message
function loadstring(text, chunkname) end
+---#DES 'module'
---#if VERSION >= 5.2 then
---@deprecated
---#end
---@param name string
function module(name, ...) end
+---#DES 'next'
---@param table table
---@param index any?
---@return any key
---@return any value
function next(table, index) end
+---#DES 'paris'
---@param t table
---@return function next
---@return table
@@ -100,6 +115,7 @@ function pairs(t)
return next
end
+---#DES 'pcall'
---@param f function
---@param arg1 any?
---@return boolean success
@@ -107,32 +123,39 @@ end
---@return ...
function pcall(f, arg1, ...) end
+---#DES 'print'
function print(...) end
+---#DES 'rawequal'
---@param v1 any
---@param v2 any
---@return boolean
function rawequal(v1, v2) end
+---#DES 'rawget'
---@param table table
---@param index any
---@return any
function rawget(table, index) end
+---#DES 'rawlen'
---@param v table|string
---@return integer len
function rawlen(v) end
+---#DES 'rawset'
---@param table table
---@param index any
---@param value any
---@return table
function rawset(table, index, value) end
+---#DES 'select'
---@param index integer|'"#"'
---@return any
function select(index, ...) end
+---#DES 'setfenv'
---#if VERSION >= 5.2 then
---@deprecated
---#end
@@ -141,16 +164,19 @@ function select(index, ...) end
---@return function
function setfenv(f, table) end
+---#DES 'setmetatable'
---@param table table
---@param metatable table
---@return table
function setmetatable(table, metatable) end
+---#DES 'tonumber'
---@param e string|number
---@param base integer?
---@return number?
function tonumber(e, base) end
+---#DES 'tostring'
---@param v any
---@return string
function tostring(v) end
@@ -165,10 +191,12 @@ function tostring(v) end
---| '"thread"'
---| '"userdata"'
+---#DES 'type'
---@param v any
---@return type type
function type(v) end
+---#DES '_VERSION'
---#if VERSION == 5.1 then
_VERSION = 'Lua 5.1'
---#elseif VERSION == 5.2 then
@@ -179,9 +207,11 @@ _VERSION = 'Lua 5.3'
_VERSION = 'Lua 5.4'
---#end
+---#DES 'warn'
---@param message string
function warn(message, ...) end
+---#DES 'xpcall'
---@param f function
---@param msgh function
---@param arg1 any?
@@ -190,11 +220,7 @@ function warn(message, ...) end
---@return ...
function xpcall(f, msgh, arg1, ...) end
----@param modname string
----@return any
----@return any loaderdata
-function require(modname) end
-
+---#DES 'unpack'
---#if VERSION >= 5.2 then
---@deprecated
---#end
diff --git a/meta/template/package.lua b/meta/template/package.lua
index db9ec830..b87b6410 100644
--- a/meta/template/package.lua
+++ b/meta/template/package.lua
@@ -1,5 +1,11 @@
---@meta
+---#DES 'require'
+---@param modname string
+---@return any
+---@return any loaderdata
+function require(modname) end
+
---@class package*
---@field conifg string
---@field cpath string
diff --git a/script-beta/library.lua b/script-beta/library.lua
index c9cfe32d..af578b01 100644
--- a/script-beta/library.lua
+++ b/script-beta/library.lua
@@ -278,14 +278,10 @@ local function markLibrary(library)
end
end
-local function compileSingleMetaDoc(script)
+local function compileSingleMetaDoc(script, metaLang)
local middleBuf = {}
- middleBuf[#middleBuf+1] = [[
-local COMPILE_BUF = {}
-function PUSH(text)
- COMPILE_BUF[#COMPILE_BUF+1] = text
-end
-]]
+ local compileBuf = {}
+
local last = 1
for start, lua, finish in script:gmatch '()%-%-%-%#([^\n\r]*)()' do
middleBuf[#middleBuf+1] = ('PUSH [===[%s]===]'):format(script:sub(last, start - 1))
@@ -293,9 +289,32 @@ end
last = finish
end
middleBuf[#middleBuf+1] = ('PUSH [===[%s]===]'):format(script:sub(last))
- middleBuf[#middleBuf+1] = 'return table.concat(COMPILE_BUF)'
local middleScript = table.concat(middleBuf, '\n')
- local env = setmetatable({}, { __index = _ENV })
+
+ local env = setmetatable({
+ PUSH = function (text)
+ compileBuf[#compileBuf+1] = text
+ end,
+ DES = function (name)
+ local des = metaLang[name]
+ if not des then
+ des = ('Miss locale <%s>'):format(name)
+ end
+ if name:find('.', 1, true) then
+ compileBuf[#compileBuf+1] = des
+ compileBuf[#compileBuf+1] = '\n'
+ else
+ compileBuf[#compileBuf+1] = '---\n'
+ for line in util.eachLine(des) do
+ compileBuf[#compileBuf+1] = '---'
+ compileBuf[#compileBuf+1] = line
+ compileBuf[#compileBuf+1] = '\n'
+ end
+ compileBuf[#compileBuf+1] = '---\n'
+ end
+ end,
+ }, { __index = _ENV })
+
if config.config.runtime.version == 'LuaJIT' then
env.VERSION = 5.1
env.JIT = true
@@ -303,8 +322,21 @@ end
env.VERSION = tonumber(config.config.runtime.version:sub(-3))
env.JIT = false
end
+
util.saveFile((ROOT / 'log' / 'middleScript.lua'):string(), middleScript)
- return assert(load(middleScript, middleScript, 't', env))()
+
+ assert(load(middleScript, middleScript, 't', env))()
+ return table.concat(compileBuf)
+end
+
+local function loadMetaLocale(langID, result)
+ result = result or {}
+ local path = (ROOT / 'locale' / langID / 'meta.lni'):string()
+ local lniContent = util.loadFile(path)
+ if lniContent then
+ xpcall(lni, log.error, lniContent, path, {result})
+ end
+ return result
end
local function compileMetaDoc()
@@ -317,13 +349,20 @@ local function compileMetaDoc()
if fs.exists(metapath) then
--return
end
+
+ local metaLang = loadMetaLocale('en-US')
+ if langID ~= 'en-US' then
+ loadMetaLocale(langID, metaLang)
+ end
+ --log.debug('metaLang:', util.dump(metaLang))
+
m.metaPath = metapath:string()
m.metaPaths = {}
fs.create_directory(metapath)
local templateDir = ROOT / 'meta' / 'template'
for fullpath in templateDir:list_directory() do
local filename = fullpath:filename()
- local metaDoc = compileSingleMetaDoc(util.loadFile(fullpath:string()))
+ local metaDoc = compileSingleMetaDoc(util.loadFile(fullpath:string()), metaLang)
local filepath = metapath / filename
util.saveFile(filepath:string(), metaDoc)
m.metaPaths[#m.metaPaths+1] = filepath:string()
diff --git a/script-beta/utility.lua b/script-beta/utility.lua
index ed2ce35e..a1ea1804 100644
--- a/script-beta/utility.lua
+++ b/script-beta/utility.lua
@@ -17,10 +17,18 @@ local mathRandom = math.random
local ioOpen = io.open
local utf8Len = utf8.len
local mathHuge = math.huge
+local inf = 1 / 0
+local nan = 0 / 0
_ENV = nil
local function formatNumber(n)
+ if n == inf
+ or n == -inf
+ or n == nan
+ or n ~= n then -- IEEE 标准中,NAN 不等于自己。但是某些实现中没有遵守这个规则
+ return ('%q'):format(n)
+ end
local str = ('%.10f'):format(n)
str = str:gsub('%.?0*$', '')
return str
@@ -524,20 +532,28 @@ function m.tableMultiRemove(t, index)
end
end
-function m.hash2array(h, a)
- a = a or {}
- for k in pairs(h) do
- a[#a+1] = k
- end
- return a
-end
-
-function m.array2hash(a, h)
- h = h or {}
- for _, v in ipairs(a) do
- h[v] = true
+function m.eachLine(text)
+ local offset = 1
+ local lineCount = 0
+ return function ()
+ if offset > #text then
+ return nil
+ end
+ lineCount = lineCount + 1
+ local nl = text:find('[\r\n]', offset)
+ if not nl then
+ local lastLine = text:sub(offset)
+ offset = #text + 1
+ return lastLine
+ end
+ local line = text:sub(offset, nl - 1)
+ if text:sub(nl, nl + 1) == '\r\n' then
+ offset = nl + 2
+ else
+ offset = nl + 1
+ end
+ return line
end
- return h
end
return m