Любая нормальная вики имеет средства для пометки страниц тегами и формирования списков страниц по тегам. 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