Ноу-хау: прогресс-индикатор для Trunk Notes

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

Во всевозможных персональных информационных пространствах часто присутствуют разные списки — список книг для чтения, список фильмов к просмотру, список действий для выполнения в какой-то связи… да мало ли что ещё.

Предлагаемый ниже скрипт на 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)