代码之家  ›  专栏  ›  技术社区  ›  Max Kielland

在lua中存储lua脚本

  •  1
  • Max Kielland  · 技术社区  · 6 年前

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

    这里的问题是项目文件的格式也是一个由C++编写的LUA文件(它不是编写项目文件的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对。

    1 回复  |  直到 6 年前
        1
  •  3
  •   lhf    6 年前

    你可以使用很多 = 如长字符串引用所需 [====[ . 找到最长的 = 在字符串中添加一个 = .

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