Тонкости Lua-скриптинга в Trunk Notes

21 июня 2017 (00:00:00)

Буквы кириллицы в именах тегов и страниц, а также в именах чекбоксов обрабатываются правильно. Однако в регулярных выражениях символы кириллицы не считаются за буквы! (Это не баг в Trunk Notes, а особенность Lua, работающего в ASCII.) Чтобы нормально работать с текстом, для буквы вместо простого «%a» нужно использовать диапазон с явным указанием заглавной буквы "Ё":


    [а-яА-ЯЁ%a]

Вызов функции wiki.expr возвращает результат в виде таблицы с единственным элементом, доступ к которому осуществляется по ключу "out":


    t=wiki.expr('head','Book',1) -- аналог {{head Book,1}}
    if t then str=t.out end

Вызов функции wiki.exprl возвращает массив, который можно обычным образом обходить с помощью pairs() или ipairs().

Обратные апостофы и прочие средства показа кода не экранируют вызовы функций динамического содержимого через фигурные скобки {{}}.

При вызове скрипта через {{lua}} с аргументами нужно после слова «lua» всё перечислять через запятую:


    {{lua myscript.lua,arg1,arg2,arg3}}

Скрипт получит эти аргументы в виде массива args (буква "s" на конце присутствует правильно!), элементы которого являются строками. То есть в данном примере


    args[1]=='arg1' and args[2]=='arg2' and args[3]=='arg3'

Это преобразование в строки выполняется автоматически, и дополнительно заключать аргументы вызова в кавычки или апострофы не нужно!

Прочитать состояния чекбоксов на странице можно через метаданные этой страницы. Допустим, на странице с именем page_title присутствует чекбокс, описанный в виде


    {{check Использовать UTF8}}

Для него будет сформирован ключ с именем «checked_использоватьutf8» (ключ всегда начинается с «checked_» и далее следует алфавитно-цифровая последовательность из описания чекбокса — только буквы в нижнем регистре и цифры). Буквы кириллицы обрабатываются правильно.

Если чекбокс установлен, то таблица метаданных страницы будет содержать элемент с этим ключом и строковым значением 'YES'. Если чекбокс не установлен, то для него в метаданных не будет содержаться ничего — то есть по данному ключу из таблицы будет извлечено nil. Проверка может выглядеть1 примерно так:


    g=wiki.get(page_title).metadata
    if g["checked_использоватьutf8"]
        then sp="Yes!"  -- Чекбокс установлен
        else sp="No!"   -- Чекбокс не установлен
    end
    return sp

Единственной возможностью получить список всех чекбоксов на странице вне зависимости от их состояния является разбор содержимого страницы — скажем, с помощью string.gmatch. При этом, разумеется, будут возвращаться не ключи, а их полнотекстовые описания:


    g=wiki.get(page_title).contents
    for t in string.gmatch(g,"{{check%s+([^}]+)}}") do
        -- t имеет значение, совпадающее с описанием очередного чекбокса
    end

Чтобы получить ключ из найденного таким образом t, нужно преобразовать строку в нижний регистр, выбросить из неё всё, что не буквы и не цифры, и наконец, приписать к ней спереди префикс.


  1. В этих примерах предполагается, что требуемая страница заведомо существует. По-хорошему нужно сначала выполнить wiki.get(page_title), потом проверить, что вернулся не nil, и только потом уже извлекать оттуда метаданные либо содержание. ↩︎