Ноу-хау: умная выборка по тегу в Trunk Notes

12 июля 2017 (00:00:00)

Любая нормальная вики имеет средства для пометки страниц тегами и формирования списков страниц по тегам. Trunk Notes не исключение, однако есть один нюанс.

Соответствующая функция-макрос (она называется tagged) вовращает список внутренних имён страниц. А эти внутренние имена, во-первых, не обязаны быть внятными (сии строки сейчас пишутся мной на странице, названной SmartChoiceByTagForTrunkNotes), а во-вторых, их по ряду причин целесообразно оформлять в латинице. Результат же хочется иметь в кириллице и в полных заголовках, дабы он был удобочитаемым, да ещё и отсортированным (по кириллическому же алфавиту, естественно).

Для решения этой задачи предлагается следующий скрипт на Lua. Его нужно сохранить в своей вики под каким-то именем — пусть это будет FindByTag.lua.

Дальше всё очень просто. Практически любая страница в вики, какое бы внутреннее имя она не носила, начинается у меня с заголовка первого уровня:


    # Заголовок страницы

    Текст страницы…

Вот из этих-то заголовков, отсортированных по алфавиту, скрипт и будет формировать список.

Предположим, нам требуется список всех хранящихся в вики рецептов, при этом каждая страница с рецептом помечена тегом Рецепт (кириллические теги обрабатываются в Trunk Notes совершенно нормально). Просто вставляем в то место, где должен появиться список, следующий макрос (обращаю внимание: тег не нужно заключать ни в какие кавычки!)

    {{lua FindByTag.lua,Рецепт}}

Список здесь и появится, причём он будет завершаться указанием количества своих элементов. Если это указание не требуется, то последнюю строчку скрипта нужно укоротить до «return sp».

Нюанс: буква «ё» занимает в кодировке кириллицы место не по чину, поэтому её присутствие может чуть сбить порядок сортировки. Но во-первых, совсем чуть, а во-вторых, чтобы такое организовать, нужно постараться. (:

Ну и вот сам текст скрипта:

 


 

-- Строит в алфавитном порядке список заголовков первого уровня
-- по тем страницам, которые помечены тегом-аргументом скрипта.
-- Принимает один аргумент — искомый тег.

-- получаем список помеченных страниц (внутренние имена)
lst=wiki.exprl('tagged',args[1])
sp,titles,refs = "", {}, {}

-- обходим список, сохраняя внутренние имена и заголовки
-- первого уровня из этих страниц (если есть)
for _,j in pairs(lst) do
  i=wiki.expr('head',j,1).out
  if string.match(i,"#") then
    ttl=string.match(i,"[#%s]+([^\n]*)")
    table.insert(titles,ttl)
    refs[ttl]=j
  end
end

-- сортируем по алфавиту
table.sort(titles)

-- формируем результирующий список в формате Markdown
for i=1,#titles do
  sp=sp.."* "..refs[titles[i] ].."|"..titles[i].."\n"
end

return sp.."\n\nВсего в списке: "..#titles