Во всевозможных персональных информационных пространствах часто присутствуют разные списки — список книг для чтения, список фильмов к просмотру, список действий для выполнения в какой-то связи… да мало ли что ещё.
Предлагаемый ниже скрипт на Lua предназначен для персональной вики Trunk Notes; он отображает прогресс-индикатор выполнения списков.
Фрагмент кода приведён в конце, его нужно сохранить в вики на странице, имя которой имеет расширение .lua
, например Progress.lua
.
Прогресс будет отображаться пустыми и заполненными квадратиками, например так: ■■■■■■□□□□ — то есть выполнено 6/10 (или чуть больше, но менее 7/10) списка. За формирование индикатора отвечает функция ProgressBar()
, в которой эти символы можно поменять. В большинстве шрифтов iOS эти квадратики есть и отображаются правильно.
Возможно, вам не нужен красивый индикатор, а нужен просто лаконичный результат типа «17/23», то есть выполнено 17 пунктов списка из 23. В этом случае измените последнюю строчку скрипта на следующую:
return n..'/'..t
или как вам хочется. (Переменная n — это количество выполненных элементов, а переменная t — общее количество элементов списка.)
Список, для которого будет отображаться индикатор, должен быть отдельной страницей вашей вики. Смешивать на одной странице несколько разных списков нельзя! Правило оформления списка очень простое: каждый его элемент должен заключаться в двойные фигурные скобки и начинаться со слова check
. Например, так:
{{check Вырастить пузо}}
{{check Посадить печень}}
{{check Построить тёщу}}
Для каждого элемента будет создан собственный чекбокс, состояние которого говорит о том, выполнен этот элемент или нет. Прочее оформление — целиком на ваше усмотрение. Между элементами списка, до них и после них можно вставлять всё что угодно, например какие-то пояснения и примечания.
Допустим, вы храните этот список на странице вики с именем MyToDoList
. Тогда сформировать для него прогресс-индикатор можно с помощью макроса
{{lua Progress.lua,MyToDoList}}
который размещается в нужном месте нужной страницы. Если ей является сама страница списка, то её имя можно опустить и написать просто {{lua Progress.lua}}
Вторым параметром скрипта может быть число, равное общему числу квадратиков в индикаторе:
{{lua Progress.lua,MyToDoList,25}}
Если он опущен, то число квадратиков будет равно числу чекбоксов на странице, то есть один закрашенный квадратик символизирует один выполненный пункт списка. Если список содержит не больше пары-тройки десятков элементов, то это работает нормально.
Внимание: если у вас в вики несколько списков, то не нужно создавать несколько копий этого скрипта. Разве что вам для разных списков понадобятся совсем разные оформления индикаторов.
Ну и далее собственно текст скрипта:
-- Считает на вызвавшей или переданной странице количество
-- отмеченных чекбоксов, общее количество чекбоксов, и
-- возвращает строку прогресс-индикатора
function ProgressBar(i,j) -- формирует строку индикатора
r=Disc*i/j
res=""
for k=1,Disc do
if k<=r then res=res.."■" else res=res.."□" end
end
return res
end
-- Если нет аргументов, то работает с вызвавшей страницей
-- Если есть аргумент, то использует его как имя страницы
page_title=args[1] or page.title
g,n,t = wiki.get(page_title),0,0
-- Подсчёт общего числа чекбоксов
for _ in string.gmatch(g.contents,'{{check') do t=t+1 end
-- По умолчанию число пунктов индикатора равно числу чекбоксов
Disc=args[2] or t
-- Подсчёт отмеченных чекбоксов
for k,_ in pairs(g.metadata) do
if string.match(k,'checked_') then n=n+1 end
end
return ProgressBar(n,t)