将 Lua 脚本存储在 Lua 中

Storing Lua script in Lua

我有一个用 C++ 编写的应用程序,可以显示、编辑和 运行 Lua 脚本。此应用程序存储所有内容,包括项目文件中的完整 Lua 脚本。

这里的问题是项目文件的格式也是一个 Lua 文件,由 C++ 编写(它不是 Lua 引擎编写项目文件)。

示例 Lua 编辑器中的脚本:

-- Message
local message =
[["First" line
Second line
Last line]]

现在,我想将上面的脚本保存在 lua 文件中。 示例项目文件:

-- Project file
projectName = "test"
options = {}
options.autoRun = false

-- Lua source
luaScript =
[=[
-- Message
local message =
[["First" line
Second line
Last line]]
]=]

我当然可以将 Lua 脚本包含在 [=[ ... ]=] 中(如示例中所示),但如果脚本也包含相同的序列,它将无法工作。由于该脚本是用户编写的任意脚本,我不能就认为某个序列没有被使用过。

有没有办法在 XML 中包含 "raw" 数据,例如 CData? 我会尽量避免对脚本进行编码,因为我希望它在项目文件中可读。

最简单的方法是可以转义 [ 和 ] 字符,但显然不能。

我可以将脚本分解成单独的字符串,转义并连接它们:

-- Project file
projectName = "test"
options = {}
options.autoRun = false

-- Lua source
luaScript = "-- Message\n"..
            "local message =\n"..
            "[[\"First\" line\n"..
            "Second line\n"..
            "Last line]]\n"..

但是这个解决方案并不容易直接在项目文件中阅读和编辑。

如果这不可能,那么最好确认它,我可能会使用编码方案而不是计划 B。

解决方案
在探索了一些选项和想法之后,我根据 lhf 的建议采用了解决方案。我已经为 Lua 编写器 类 编写了一些 C++,所以当我编写一个字符串时,我检查它是否是一个多行字符串。如果是我就在前面插入[====================================================================[ -- MULLTILINE BEGIN\r\n,然后在字符串后面加上\r\n]====================================================================] -- MULLTILINE END,不需要对字符串进行转义。如果它是单行字符串,我不添加任何内容,只转义它。

添加 CR/LF 对和注释的原因是为了方便用户直接在项目文件中编辑脚本。

script =
[====================================================================[ -- MULLTILINE BEGIN
-- Lua script engine 5.3.4
function onData(data,ch)
  print("A 'String' within a \"string\" within a [===[string]===]")
end

-- Multiline within Multiline
a = [=[
Spicy jalapeno bacon ipsum dolor amet ground round eu chicken,
venison turkey corned beef dolore exercitation pastrami nostrud
prosciutto in drumstick deserunt meatloaf. Pastrami jowl beef
ribs minim eu pariatur est et lorem kielbasa shoulder. Dolore
officia cupidatat, biltong tempor ut ham kielbasa magna bacon
salami. Turducken tri-tip tail reprehenderit tenderloin aliquip.
]=]

print(a)
]====================================================================] -- MULLTILINE END

当回读字符串时,我只是在第一行寻找 -- MULTILINE BEGIN\r\n。如果它在那里,我只需删除包括 CR/LF 对和最后一个 CR/LF 对的行。由于 -- MULLTILINE END 是多行之外的注释,它不会成为字符串的一部分,不需要删除,只需要在结束序列之前添加 CR/LF 对。

您可以根据需要在长字符串引号 [====[ 中使用任意多个 =。只需要在一个字符串中找到 = 中最长的 运行 并添加一个 =.

您也可以在string.format中使用%q,它将引用所有需要引用的字符。