local p = {} -- Функциональность Unescape взята из https://stackoverflow.com/a/14899740/1832568 local function unescape ( str ) str = string.gsub ( str , '&#(%d+);' , string.char ) str = string.gsub ( str , '&#x(%d+);' , function ( n ) return string.char ( tonumber ( n , 16 )) end ) return str end -- Функция подсчета, принимающая строку haystack и таблицу иголок local function count ( haystack , needles ) local number = 0 -- Пока у нас есть иголки для поиска for index , needle in ipairs ( needles ) do -- находим их все в нашем стоге сена for m in string.gmatch ( haystack , needle ) do number = number + 1 end end return number end -- Функция принимает любое количество имен страниц, разделенных #, и номеров уровней разделов function p . main ( frame ) local total = 0 local needles = {} local haystack = '' -- Отдельные имена страниц из строки, разделенной #, в таблицу local pages = mw . text . split ( unescape ( frame . args [ 1 ]), '%s*#%s*' ) -- Отдельные номера уровней разделов, разделенные пробелами, в таблицу local levels = mw . text . split ( frame . args [ 'level' ], '%s*' ) -- Итерация по уровням для уровня в mw . text . gsplit ( table. concat ( levels ), '' ) do -- и добавляем уровень needle к needles needles [ # needles + 1 ] = ' \n ' .. string. rep ( '=' , tonumber ( level )) .. '[^=]' end -- Для каждого имени страницы в pages for index , page in ipairs ( pages ) do -- создаем haystack для поиска по содержимому страницы haystack = mw . title . new ( page ): getContent () -- Если мы запросили содержимое легитимной страницы if haystack then --[[ передаем необработанную разметку и needles для подсчета и добавляем возврат к total ]] total = total + count ( ' \n ' .. haystack , needles ) end end --[[ затем возвращаем количество разделов требуемого уровня во всех переданных страницах ]] return total end return p