У меня есть приложение, написанное на 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.
РЕШЕНИЕ
После изучения некоторых вариантов и вариантов я выбрал решение, основанное на предложении 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 перед конечной последовательностью.
Вы можете использовать как можно больше =
по мере необходимости в длинную строку цитаты [====[
, Просто найдите самый длинный пробег =
в строку и добавить один =
,
Вы также можете использовать %q
в string.format, который будет заключать все символы в кавычки.
Других решений пока нет …