Хранение сценария Lua в Lua - PullRequest
0 голосов
/ 11 июня 2018

У меня есть приложение, написанное на 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 в [= [...] =] (как в примере), но если скрипт также содержит ту же последовательность, он не будетРабота.Поскольку сценарий является произвольным сценарием, написанным пользователем, я не могу просто предположить, что определенная последовательность не использовалась.

Есть ли способ включить «необработанные» данные, такие как CData, в XML?Я бы попытался избежать кодирования сценария, потому что я хочу, чтобы он был читабельным в файле проекта.

Самый простой вариант - экранировать символы [и], но, по-видимому, нельзя.

Я мог бы разбить скрипт на отдельные строки, экранировать его и объединить:

-- 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.

РЕШЕНИЕ
После изучения некоторых вариантови Indeas я пошел с решением, основанным на предложении lhf.Я написал несколько классов C ++ для Lua Writer, поэтому, когда я пишу строку, я проверяю, является ли она многострочной строкой.Если это так, я просто вставляю [====================================================================[ -- 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 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать столько =, сколько необходимо в длинной строковой кавычке [====[.Просто найдите самый длинный прогон = в строке и добавьте один =.

. Вы также можете использовать %q в string.format, который будет заключать в кавычки все символы, которые нужно заключить в кавычки.

...