c++ - 在Lua中存储Lua脚本

标签 c++ lua escaping raw-data

我有一个用 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 中包含“原始”数据(例如 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 的建议采用了解决方案。我已经编写了一些 C++ 到 Lua 编写器类,因此当我编写字符串时,我会检查它是否是多行字符串。如果是,我只需插入 [========================================== ============================[ -- 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,它将引用所有需要引用的字符。

关于c++ - 在Lua中存储Lua脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50789092/

相关文章:

php - 强制本地化 os.date()

c++ - 快板 5 不工作

c++ - 如何检测API Hook?

c++ - Lua userdata变量与C++通信

unicode - 应在输出中过滤的 Unicode 字符列表?

bash - 如何在 bash 中回显包含未转义美元符号的变量

shell - 将具有分号 (';' ) 的值分配给 bash 中的变量

c++ - 左值的 decltype 括号语法

c++ - 大数乘法取模

c - 将大型二进制数据从 Lua 传递到 C 的最佳方法