Модуль:Документация

-- Этот модуль реализует {{documentation}}. -- Получить требуемые модули. local getArgs = require ( 'Module:Arguments' ). getArgs -- Получить таблицу config. local cfg = mw . loadData ( 'Module:Documentation/config' ) local p = {} -- Часто используемые функции. local ugsub = mw . ustring . gsub local format = mw . ustring . format ---------------------------------------------------------------------------- -- Вспомогательные функции -- -- Они определены как локальные функции, но доступны в таблице p -- для целей тестирования. ---------------------------------------------------------------------------- local function message ( cfgKey , valArray , expectType ) --[[ -- Получает сообщение из таблицы cfg и форматирует его при необходимости. -- Функция выдает ошибку, если значение из таблицы cfg не имеет -- типа expectType. Тип по умолчанию для expectType — 'string'. -- Если присутствует таблица valArray, то такие строки, как $1, $2 и т. д. в сообщении, заменяются значениями из ключей таблицы [1], [2] и т. д. -- Например, если сообщение "foo-message" имеет значение 'Foo $2 bar $1.', -- message('foo-message', {'baz', 'qux'}) вернет "Foo qux bar baz." --]] локальное сообщение = cfg [ cfgKey ] expectType = expectType или 'string' if type ( msg ) ~= expectType then error ( 'message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type ( msg ) .. ')' , 2 ) end if not valArray then return msg end local function getMessageVal ( match ) match = tonumber                                                   ( match ) return valArray [ match ] или error ( 'message: не найдено значение для ключа $' .. match .. ' в message cfg.' .. cfgKey , 4 ) end return ugsub ( msg , '$([1-9][0-9]*)' , getMessageVal ) end p . message = message local function makeWikilink ( page , display ) if display then return format ( '[[%s|%s]]' , page , display ) else return format ( '[[%s]]' , page ) end end p . makeWikilink = makeWikilink local function makeCategoryLink ( cat , sort ) local catns = mw . site . namespaces [ 14 ]. name return makeWikilink ( catns .. ':' .. cat , sort ) end p . makeCategoryLink = makeCategoryLink локальная функция makeUrlLink ( url , display ) return format ( '[%s %s]' , url , display ) end p . makeUrlLink = makeUrlLink локальная функция makeToolbar (...) локальный ret = {} локальный lim = select ( '#' , ...) если lim < 1 , то вернуть nil end for i = 1 , lim do ret [ # ret + 1 ] = select ( i , ...)                                                                         конец -- 'documentation-toolbar' возвращает формат ( '<span class="%s">(%s)</span>' , message ( 'toolbar-class' ), table.concat ( ret , ' | ' ) ) конец p . makeToolbar = makeToolbar ---------------------------------------------------------------------------- -- Обработка аргументов ---------------------------------------------------------------------------- local function makeInvokeFunc ( funcName ) return function ( frame ) local args = getArgs ( frame , { valueFunc = function ( key , value ) if type ( value ) == 'string' then value = value : match ( '^%s*(.-)%s*$' ) -- Удалить пробелы. if key == 'heading' or value ~ = '' then return value else return nil end else return value end end } ) return p [ funcName ] ( args ) end end ---------------------------------------------------------------------------- -- Точки входа ---------------------------------------------------------------------------- function p.nonexistent ( frame ) if mw.title.getCurrentTitle ( ) . subpageText == ' testcases' then return frame : expandTemplate { title = 'уведомление о тестовых случаях модуля' } else return p.main ( frame ) end end p.main = makeInvokeFunc ( ' _main ' ) function p .                                               _main ( args ) --[[ -- Эта функция определяет логический поток для модуля. -- @args - таблица аргументов, переданных пользователем --]] local env = p . getEnvironment ( args ) local root = mw . html . create ( ) root : wikitext ( p._getModuleWikitext ( args , env ) ) : wikitext ( p.protectionTemplate ( env )) : wikitext ( p.sandboxNotice ( args , env )) : tag ( 'div' ) -- ' documentation-container' : addClass ( message ( ' container' )) : attr ( 'role' , ' complementary' ) : attr ( 'aria- labelledby ' , args.heading ~ = '' и 'documentation-heading' или nil ) : attr ( ' aria- label ' , args.heading == '' и 'Documentation' или nil ) : newline ( ) : tag ( 'div' ) -- 'documentation' : addClass ( message ( 'main-div-classes' )) : newline () : wikitext ( p . _startBox ( args , env )) : wikitext ( p . _content ( args , env )) : tag ( 'div' ) -- 'documentation-clear' : addClass ( message ( "clear" )) : Done () : newline () :сделанный () :                         wikitext ( p._endBox ( args , env ))  : done ( ) : wikitext ( p.addTrackingCategories ( env )) -- 'Module:Documentation/styles.css' return mw.getCurrentFrame ( ) : extensionTag ( ' templatestyles ' , '' , { src = cfg [ 'templatestyles' ] }) ..tostring ( root ) end ---------------------------------------------------------------------------- -- Параметры среды ---------------------------------------------------------------------------- function p.getEnvironment ( args ) --[[ -- Возвращает таблицу с информацией об среде, включая title -- объекты и другие данные , связанные с пространством имен или путем. -- @args - таблица аргументов, переданных пользователем -- -- Объекты Title включают: -- env.title - страница, для которой мы создаем документацию (обычно текущий заголовок) -- env.templateTitle - шаблон (или модуль, файл и т. д.) -- env.docTitle - подстраница /doc. -- env.sandboxTitle - подстраница /sandbox. -- env.testcasesTitle - подстраница /testcases. -- -- Данные включают: -- env.protectionLevels - таблица уровней защиты объекта title. -- env.subjectSpace - номер пространства имен субъекта заголовка. -- env.docSpace - номер пространства имен, в которое заголовок помещает свою документацию. -- env.docpageBase - текст базовой страницы страниц /doc, /sandbox и /testcases с пространством имен. -- env.compareUrl - URL страницы Special:ComparePages, сравнивающей песочницу с шаблоном. -- -- Все поиски по таблицам проходят через pcall, чтобы отлавливать ошибки. Если возникает ошибка, возвращаемое значение будет равно nil. --]] local env , envFuncs = {}, {} -- Настраиваем метатаблицу. При срабатывании мы вызываем соответствующую функцию в таблице envFuncs. Значение , возвращаемое этой функцией, -- запоминается в таблице env, чтобы мы не вызывали ни одну из функций более одного раза. (Значения nil не будут запоминаться.) setmetatable ( env            ,  { __index = function ( t , key ) local envFunc = envFuncs [ key ] if envFunc then local success , val = pcall ( envFunc ) if success then env [ key ] = val -- Запоминаем значение. return val end end return nil end }) function envFuncs . title () -- Объект заголовка для текущей страницы или тестовой страницы, переданной с помощью args.page. local title local titleArg = args . page if titleArg then title = mw . title . new ( titleArg ) else title = mw . title . getCurrentTitle () end return title end function envFuncs . templateTitle () --[[ -- Объект заголовка шаблона (или модуля и т. д.). -- Сообщения: -- 'sandbox-subpage' --> 'sandbox' -- 'testcases-subpage' --> 'testcases' --]] local subjectSpace = env . subjectSpace local title = env . title local subpage = title . subpageText if subpage == message ( 'sandbox-subpage' ) or subpage == message ( 'testcases-subpage' ) then return mw . title . makeTitle ( subjectSpace , title . baseText ) else return mw . title . makeTitle ( subjectSpace , title . text ) end end function envFuncs .                                                       docTitle () --[[ -- Объект заголовка подстраницы /doc. -- Сообщения: -- 'doc-subpage' --> 'doc' --]] local title = env . title local docname = args [ 1 ] -- Указанная пользователем страница документа. local docpage if docname then docpage = docname else docpage = env . docpageBase .. '/' .. message ( 'doc-subpage' ) end return mw . title . new ( docpage ) end function envFuncs . sandboxTitle () --[[ -- Объект заголовка подстраницы /sandbox. -- Сообщения: -- 'sandbox-subpage' --> 'sandbox' --]] return mw . title . new ( env . docpageBase .. '/' .. message ( 'sandbox-subpage' )) end function envFuncs . testcasesTitle () --[[ -- Объект заголовка для подстраницы /testcases. -- Сообщения: -- 'testcases-subpage' --> 'testcases' --]] return mw . title . new ( env . docpageBase .. '/' .. message ( 'testcases-subpage' )) end function envFuncs . protectionLevels () -- Таблица уровней защиты объекта заголовка. return env . title . protectionLevels end function envFuncs . subjectSpace () -- Номер пространства имен субъекта. return mw . site . namespaces [ env . title . namespace ]. subject . id end function envFuncs . docSpace ()                                    -- Номер пространства имен документации. Для большинства пространств имен это -- то же самое, что и пространство имен темы. Однако страницы в пространствах имен Article, File, -- MediaWiki или Category должны иметь свои страницы /doc, /sandbox и -- /testcases в пространстве обсуждения. local subjectSpace = env . subjectSpace if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then return subjectSpace + 1 else return subjectSpace end end function envFuncs . docpageBase () -- Базовая страница подстраниц /doc, /sandbox и /testcases. -- Для некоторых пространств имен это страница обсуждения, а не страница шаблона. local templateTitle = env . templateTitle local docSpace = env . docSpace local docSpaceText = mw . site . namespaces [ docSpace ]. name -- Соберите ссылку. docSpace никогда не является основным пространством имен, поэтому мы можем жестко закодировать двоеточие. return docSpaceText .. ':' .. templateTitle . text end function envFuncs . compareUrl () -- Сравнение ссылок между песочницей и основным шаблоном с помощью [[Special:ComparePages]]. local templateTitle = env . templateTitle local sandboxTitle = env . sandboxTitle если templateTitle . существует и sandboxTitle . существует , то local compareUrl = mw . uri . canonicalUrl ( 'Special:ComparePages' , { page1 = templateTitle . prefixedText , page2 = sandboxTitle . prefixedText } ) return tostring ( compareUrl ) else return nil                                                            end end return env end ---------------------------------------------------------------------------- -- Вспомогательные шаблоны ---------------------------------------------------------------------------- p . getModuleWikitext = makeInvokeFunc ( '_getModuleWikitext' ) function p . _getModuleWikitext ( args , env ) local currentTitle = mw . title . getCurrentTitle () if currentTitle . contentModel ~= 'Scribunto' then return end pcall ( require , currentTitle . prefixedText ) -- если не удается, то нам все равно local moduleWikitext = package.loaded [ "Module:Module wikitext" ] if moduleWikitext then return moduleWikitext . main () end end function p . sandboxNotice ( args , env ) --[=[ -- Создает уведомление песочницы для отображения над страницами песочницы. -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовков и т. д., созданная с помощью p.getEnvironment -- -- Сообщения: -- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]' -- 'sandbox-notice-blurb' --> 'Это $1 за $2.' -- 'sandbox-notice-diff-blurb' --> 'Это $1 за $2 ($3).' -- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] страница' -- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] страница' -- 'sandbox-notice-pagetype-other' --> 'sandbox страница' -- 'sandbox-notice-compare-link-display' --> 'diff' -- 'sandbox-notice-testcases-blurb' --> 'См. также сопутствующую подстраницу за 1 доллар.' -- 'sandbox-notice-testcases-link-display' --> 'тестовые случаи' -- 'sandbox-category' --> 'Песочницы шаблонов' -- 'module-sandbox-category' --> 'Песочницы модулей' -- 'other-sandbox-category' --> 'Песочницы вне пространства имен шаблонов или модулей' --]=] local title = env .                           title local sandboxTitle = env . sandboxTitle local templateTitle = env . templateTitle local subjectSpace = env . subjectSpace if not ( subjectSpace and title and sandboxTitle and templateTitle and mw . title . equals ( title , sandboxTitle )) then return nil end -- Создаем таблицу аргументов для передачи в {{ombox}}. Нам нужно всего два поля: "image" и "text". local omargs = {} omargs . image = message ( 'sandbox-notice-image' ) -- Получаем текст. Начнем с вводной аннотации, которая выглядит примерно так : "Это шаблонная песочница для [[Template:Foo]] (diff)." локальный текст = '__EXPECTUNUSEDTEMPLATE__' локальный тип страницы , sandboxCat если subjectSpace == 10 тогда тип страницы = сообщение ( 'sandbox-notice-pagetype-template' ) sandboxCat = сообщение ( 'sandbox-category' ) иначе если subjectSpace == 828 тогда тип страницы = сообщение ( 'sandbox-notice-pagetype-module' ) sandboxCat = сообщение ( 'module-sandbox-category' ) иначе тип страницы = сообщение ( 'sandbox-notice-pagetype-other' ) sandboxCat = сообщение ( 'other-sandbox-category' ) конец локальная templateLink = makeWikilink ( templateTitle . prefixedText ) локальная compareUrl = env . compareUrl если compareUrl тогда локальный compareDisplay = сообщение ( 'sandbox-notice-compare-link-display' ) локальный compareLink = makeUrlLink (                                                                 compareUrl ,  compareDisplay ) text = text .. message ( 'sandbox-notice-diff-blurb' , { pagetype , templateLink , compareLink }) else text = text .. message ( 'sandbox-notice-blurb' , { pagetype , templateLink }) end -- Получить аннотацию страницы тестовых случаев, если страница существует. Это что-то вроде -- "См. также сопутствующую подстраницу для [[Template:Foo/testcases|test cases]]." local testcasesTitle = env . testcasesTitle если testcasesTitle и testcasesTitle . существует тогда если testcasesTitle . contentModel == "Scribunto" then local testcasesLinkDisplay = message ( 'sandbox-notice-testcases-link-display' ) local testcasesRunLinkDisplay = message ( 'sandbox-notice-testcases-run-link-display' ) local testcasesLink = makeWikilink ( testcasesTitle.prefixedText , testcasesLinkDisplay ) local testcasesRunLink = makeWikilink ( testcasesTitle.talkPageTitle.prefixedText , testcasesRunLinkDisplay ) text = text .. '<br />' .. message ( ' sandbox-notice - testcases -run-blurb' , {testcasesLink, testcasesRunLink } ) else local testcasesLinkDisplay = message ( ' sandbox - notice - testcases-link-display' ) local testcasesLink = makeWikilink ( testcasesTitle . prefixedText , testcasesLinkDisplay ) текст = текст .. '<br />' .. сообщение ( 'sandbox-notice-testcases-blurb' , { testcasesLink }) конец                                                            end -- Добавляем песочницу в категорию песочниц. omargs . text = text .. makeCategoryLink ( sandboxCat ) -- 'documentation-clear' return '<div class="' .. message ( 'clear' ) .. '"></div>' .. require ( 'Module:Message box' ). main ( 'ombox' , omargs ) end function p . protectionTemplate ( env ) -- Генерирует значок замка в правом верхнем углу. -- @env - таблица окружения, содержащая объекты title и т. д., созданная с помощью p.getEnvironment -- Сообщения: -- 'protection-template' --> 'pp-template' -- 'protection-template-args' --> {docusage = 'yes'} local protectionLevels = env . protectionLevels if not protectionLevels then return nil end local editProt = protectionLevels . edit и protectionLevels . edit [ 1 ] local moveProt = protectionLevels . move и protectionLevels . move [ 1 ] if editProt then -- Страница защищена от редактирования. return require ( 'Module:Protection banner' ). _main { message ( 'protection-reason-edit' ), small = true } elseif moveProt и moveProt ~= 'autoconfirmed' then -- Страница защищена от перемещения, но не от редактирования. Исключить защиту от перемещения с уровнем "autoconfirmed", так как это эквивалентно -- отсутствию защиты от перемещения вообще. return require ( 'Module:Protection banner' ). _main { action = 'move' ,small = true } else return nil end end ----------------------------------------------------------------------------- -- Начальное поле                                                ---------------------------------------------------------------------------- p . startBox = makeInvokeFunc ( '_startBox' ) function p . _startBox ( args , env ) --[[ -- Эта функция генерирует начальное поле. -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовков и т. д., сгенерированная с помощью p.getEnvironment -- -- Фактическая работа выполняется p.makeStartBoxLinksData и p.renderStartBoxLinks, которые создают -- ссылки [view] [edit] [history] [purge], а также p.makeStartBoxData и p.renderStartBox , которые генерируют HTML-код поля. --]] env = env или p . getEnvironment ( args ) локальные ссылки local content = args . content if not content or args [ 1 ] then -- Нет необходимости включать ссылки, если документация находится на самой странице шаблона. local linksData = p . makeStartBoxLinksData ( args , env ) if linksData then links = p . renderStartBoxLinks ( linksData ) end end -- Генерирует начальное поле html. local data = p . makeStartBoxData ( args , env , links ) if data then return p . renderStartBox ( data ) else -- Пользователь не указал заголовок. return nil end end function p . makeStartBoxLinksData ( args , env ) --[[ -- Выполняет начальную обработку данных для создания ссылок [view] [edit] [history] [purge]. -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовка и т. д., созданная с помощью p.getEnvironment -- -- Сообщения: -- 'view-link-display' --> 'view' -- 'edit-link-display' --> 'edit'                                    -- 'history-link-display' --> 'history' -- 'purge-link-display' --> 'purge' -- 'module-preload' --> 'Template:Documentation/preload-module-doc' -- 'docpage-preload' --> 'Template:Documentation/preload' -- 'create-link-display' --> 'create' --]] local subjectSpace = env . subjectSpace local title = env . title local docTitle = env . docTitle если не title или не docTitle , то вернуть nil end if docTitle . isRedirect then docTitle = docTitle . redirectTarget end -- Создать ссылку, если /doc не существует. local preload = args . preload if not preload then if subjectSpace == 828 then -- Пространство имен модуля preload = message ( 'module-preload' ) else preload = message ( 'docpage-preload' ) end end return { title = title , docTitle = docTitle , -- Просмотр, отображение, редактирование и удаление ссылок, если существует /doc. viewLinkDisplay = message ( 'view-link-display' ), editLinkDisplay = message ( 'edit-link-display' ), historyLinkDisplay = message ( 'history-link-display' ), purgeLinkDisplay = message ( 'purge-link-display' ), preload = preload , createLinkDisplay = message ( 'create-link-display' ) } end function p . renderStartBoxLinks ( data ) --[[ -- Создает ссылки [view][edit][history][purge] или [create][purge] из таблицы данных. -- @data - таблица данных, созданная p.makeStartBoxLinksData --]] локальный docTitle = данные                                                         . docTitle -- да, мы намерены очистить страницу шаблона, на которой отображается документация local purgeLink = makeWikilink ( " Special:Purge/" .. data.title.prefixedText , data.purgeLinkDisplay ) if docTitle.existent then local viewLink = makeWikilink ( docTitle.prefixedText , data.viewLinkDisplay ) local editLink = makeWikilink ( " Special :EditPage/"..docTitle.prefixedText, data.editLinkDisplay) local historyLink = makeWikilink ( " Special : PageHistory / " .. docTitle.prefixedText , data.historyLinkDisplay ) return " & # 91 ; " ..viewLink .. " & # 93 ; & # 91 ; " ..editLink .. " & # 93 ; & # 91; " .. historyLink .. "] [" .. purgeLink .. "]" else local createLink = makeUrlLink ( docTitle : canonicalUrl { action = 'edit' , preload = data . preload }, data . createLinkDisplay ) return "[" .. createLink .. "] [" .. purgeLink .. "]" end return ret end function p . makeStartBoxData ( args , env , links ) --[=[ -- Выполняет начальную обработку данных для передачи в функцию рендеринга начального поля p.renderStartBox. -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовка и т. д., сгенерированная с помощью p.getEnvironment -- @links — строка, содержащая ссылки [view][edit][history][purge] — может быть равна нулю в случае ошибки. --                                                               -- Сообщения: -- 'documentation-icon-wikitext' --> '[[Файл:Test Template Info-Icon - Версия (2).svg|50px|link=|alt=]]' -- 'template-namespace-heading' --> 'Документация шаблона' -- 'module-namespace-heading' --> 'Документация модуля' -- 'file-namespace-heading' --> 'Summary' -- 'other-namespaces-heading' --> 'Документация' -- 'testcases-create-link-display' --> 'create' --]=] local subjectSpace = env . subjectSpace if not subjectSpace then -- По умолчанию используется пространство имен "другие пространства имен", чтобы мы получили хоть какой-то вывод -- в случае возникновения ошибки. subjectSpace = 2 end local data = {} -- Заголовок local heading = args . heading -- Пустые значения не удаляются. if heading == '' then -- Не отображать начальное поле, если аргумент заголовка определен, но пуст. return nil end if heading then data . heading = heading elseif subjectSpace == 10 then -- Данные пространства имен шаблона . heading = message ( 'documentation-icon-wikitext' ) .. ' ' .. message ( 'template-namespace-heading' ) elseif subjectSpace == 828 then -- Данные пространства имен модуля . heading = message ( 'documentation-icon-wikitext' ) .. ' ' .. message ( 'module-namespace-heading' ) elseif subjectSpace == 6 then -- Данные пространства имен файла . heading = message ( 'file-namespace-heading' ) else data .heading = message ( 'other-namespaces-heading' ) end -- Локальный CSS заголовка headingStyle = args [ 'heading-style' ] if headingStyle then data .                                                            headingStyleText  =  headingStyle else -- 'documentation-heading' data . headingClass = message ( 'main-div-heading-class' ) end -- Данные для ссылок [view][edit][history][purge] или [create]. if links then -- 'mw-editsection-like plainlinks' data . linksClass = message ( 'start-box-link-classes' ) data . links = links end return data end function p . renderStartBox ( data ) -- Отображает начальное поле html. -- @data - таблица данных, сгенерированная p.makeStartBoxData. local sbox = mw . html . создать ( 'div' ) sbox -- 'documentation-startbox' : addClass ( message ( 'start-box-class' )) : newline () : tag ( 'span ' ) : addClass ( data . headingClass ) : attr ( 'id' , 'documentation-heading' ) : cssText ( data . headingStyleText ) : wikitext ( data . heading ) локальные ссылки = data . links если ссылки тогда sbox : tag ( 'span ' ) : addClass ( data . linksClass ) : attr ( 'id' , data . linksId ) : wikitext ( links ) конец вернуть tostring ( sbox ) конец ---------------------------------------------------------------------------- -- Содержимое документации ---------------------------------------------------------------------------- p . content = makeInvokeFunc (                       '_content' ) function p . _content ( args , env ) -- Отображает содержимое документации -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовков и т. д., сгенерированная с помощью p.getEnvironment env = env или p . getEnvironment ( args ) local docTitle = env . docTitle local content = args . content если не content и docTitle и docTitle . существует , то content = args . _content или mw . getCurrentFrame (): expandTemplate { title = docTitle . prefixedText } end -- Разрывы строк ниже необходимы для того, чтобы "=== Заголовки ===" в начале и конце -- документов интерпретировались правильно. return ' \n ' .. ( content или '' ) .. ' \n ' end p . contentTitle = makeInvokeFunc ( ' _ contentTitle ' ) function p._contentTitle ( args , env ) env = env или p.getEnvironment ( args ) local docTitle = env.docTitle если не args.content и docTitle и docTitle.существует , то вернуть docTitle.prefixedText иначе вернуть ' ' end end ----------------------------------------------------------------------------- -- Конец box ---------------------------------------------------------------------------- p.endBox = makeInvokeFunc ( ' _ endBox ' ) function p._endBox                                                        ( args ,  env ) --[=[ -- Эта функция генерирует конечный блок (также известный как блок ссылок). -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовков и т. д., сгенерированная с помощью p.getEnvironment -- --]=] -- Получить данные окружения. env = env или p . getEnvironment ( args ) local subjectSpace = env . subjectSpace local docTitle = env . docTitle if not subjectSpace или not docTitle then return nil end -- Проверить, следует ли вообще выводить конечный блок. Добавить конечный блок по умолчанию, если документация существует или если мы находимся в пространствах имен -- user, module или template. local linkBox = args [ 'link box' ] if linkBox == 'off' or not ( docTitle . exist or subjectSpace == 2 or subjectSpace == 828 or subjectSpace == 10 ) then return nil end -- Собираем link box. local text = '' if linkBox then text = text .. linkBox else text = text .. ( p . makeDocPageBlurb ( args , env ) or '' ) -- "Эта документация включена из [[Foo]]." if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then -- Мы находимся в пространствах имен пользователя, шаблона или модуля. -- Добавьте ссылки на песочницу и тестовые случаи. -- "Редакторы могут экспериментировать на страницах песочницы и тестовых случаев этого шаблона." текст = текст .. ( p . makeExperimentBlurb ( args , env ) или                                                                       '' )  ..  '<br />' if not args . content and not args [ 1 ] then -- "Пожалуйста, добавьте категории на подстраницу /doc." -- Не отображайте это сообщение со встроенными документами или с явно указанной страницей документа, -- так как тогда неясно, куда добавлять категории. text = text .. ( p . makeCategoriesBlurb ( args , env ) или '' ) end text = text .. ' ' .. ( p . makeSubpagesBlurb ( args , env ) или '' ) --"Подстраницы этого шаблона" end end local box = mw . html . create ( 'div' ) -- 'documentation-metadata' box : attr ( 'role' , 'note' ) : addClass ( message ( 'end-box-class' )) -- 'plainlinks' : addClass ( message ( 'end-box-plainlinks' )) : wikitext ( text ) : done () return ' \n ' .. tostring ( box ) end function p . makeDocPageBlurb ( args , env ) --[=[ -- Создает аннотацию "Эта документация включена из [[Template:Foo]] (edit, history)". -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовков и т. д., сгенерированная с помощью p.getEnvironment -- -- Сообщения: -- 'edit-link-display' --> 'edit' -- 'history-link-display' --> 'history' -- 'transcluded-from-blurb' --> -- 'Приведенная выше [[Wikipedia:Template documentation|documentation]] -- [[Help:Transclusion|transcluded]] из $1.' -- 'module-preload' --> 'Шаблон:Документация/preload-module-doc' -- 'create-link-display' --> 'create' -- 'create-module-doc-blurb' -->                                -- 'Возможно, вам понадобится $1 страница документации для этого [[Wikipedia:Lua|модуля Scribunto]].' --]=] local docTitle = env . docTitle if not docTitle then return nil end if docTitle . exist then -- /doc существует; ссылка на него. local docLink = makeWikilink ( docTitle.prefixedText ) local editDisplay = message ( 'edit-link-display' ) local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, editDisplay ) local historyDisplay = message ( ' history-link-display') local historyLink = makeWikilink ( " Special : PageHistory / " .. docTitle.prefixedText , historyDisplay ) return message ( ' transcluded - from - blurb ' , { docLink } ) .. ' ' .. makeToolbar ( editLink , historyLink ) .. ' <br /> ' elseif env.subjectSpace == 828 then -- / doc не существует; попросите создать его . local createUrl = docTitle : canonicalUrl { action = 'edit' , preload = message ( 'module-preload' )} local createDisplay = message ( 'create-link-display' ) local createLink = makeUrlLink ( createUrl , createDisplay ) return message ( 'create-module-doc-blurb' , { createLink }) .. '<br />' end end function p . makeExperimentBlurb ( args , env ) --[[                                                            -- Отображает текст «Редакторы могут экспериментировать на страницах песочницы (редактирование | сравнение) и тестовых случаев (редактирование) этого шаблона». -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовков и т. д., сгенерированная с помощью p.getEnvironment -- -- Сообщения: -- 'sandbox-link-display' --> 'sandbox' -- 'sandbox-edit-link-display' --> 'edit' -- 'compare-link-display' --> 'diff' -- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox' -- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox' -- 'sandbox-create-link-display' --> 'create' -- 'mirror-edit-summary' --> 'Создать версию $1 для песочницы' -- 'mirror-link-display' --> 'mirror' -- 'mirror-link-preload' --> 'Шаблон:Документация/зеркало' -- 'sandbox-link-display' --> 'sandbox' -- 'testcases-link-display' --> 'тестовые случаи' -- 'testcases-edit-link-display'--> 'редактировать' -- 'template-sandbox-preload' --> 'Шаблон:Документация/preload-sandbox' -- 'testcases-create-link-display' --> 'создать' -- 'testcases-link-display' --> 'тестовые случаи' -- 'testcases-edit-link-display' --> 'редактировать' -- 'module-testcases-preload' --> 'Шаблон:Документация/preload-module-testcases' -- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases' -- 'experiment-blurb-module' --> 'Редакторы могут экспериментировать на страницах $1 и $2 этого модуля.' -- 'experiment-blurb-template' --> 'Редакторы могут экспериментировать на страницах $1 и $2 этого шаблона.' --]] local subjectSpace = env . subjectSpace local templateTitle = env . templateTitle local sandboxTitle = env . sandboxTitle local testcasesTitle = env . testcasesTitle local templatePage = templateTitle . prefixedText if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then return nil end -- Создание ссылок.local sandboxLinks , testcasesLinks если sandboxTitle . существует , то local sandboxPage = sandboxTitle . prefixedText local                                    sandboxDisplay  =  сообщение ( 'sandbox-link-display' ) локальный sandboxLink = makeWikilink ( sandboxPage , sandboxDisplay ) локальный sandboxEditDisplay = сообщение ( 'sandbox-edit-link-display' ) локальный sandboxEditLink = makeWikilink ( "Special:EditPage/" .. sandboxPage , sandboxEditDisplay ) локальный compareUrl = env . compareUrl локальный compareLink если compareUrl тогда локальный compareDisplay = message ( 'compare-link-display' ) compareLink = makeUrlLink ( compareUrl , compareDisplay ) конец sandboxLinks = sandboxLink .. ' ' .. makeToolbar ( sandboxEditLink , compareLink ) иначе локальный sandboxPreload если subjectSpace == 828 тогда sandboxPreload = message ( 'module-sandbox-preload' ) иначе sandboxPreload = message ( 'template-sandbox-preload' ) конец локальный sandboxCreateUrl = sandboxTitle : canonicalUrl { action = 'edit' , preload = sandboxPreload } локальный sandboxCreateDisplay = message ( 'sandbox-create-link-display' ) локальный sandboxCreateLink = makeUrlLink ( sandboxCreateUrl , sandboxCreateDisplay ) local mirrorSummary = message ( 'mirror-edit-summary' , { makeWikilink ( templatePage )}) local mirrorPreload = message ( 'mirror-link-preload' ) local mirrorUrl = sandboxTitle : canonicalUrl {                                                                  action  =  'edit' ,  preload  =  mirrorPreload ,  summary  =  mirrorSummary } if subjectSpace == 828 then mirrorUrl = sandboxTitle : canonicalUrl { action = 'edit' , preload = templateTitle.prefixedText , summary = mirrorSummary } end local mirrorDisplay = message ( ' mirror-link-display' ) local mirrorLink = makeUrlLink ( mirrorUrl , mirrorDisplay ) sandboxLinks = message ( ' sandbox -link-display' ) .. ' ' .. makeToolbar ( sandboxCreateLink , mirrorLink ) end if testcasesTitle.existent then local testcasesPage = testcasesTitle . prefixedText local testcasesDisplay = message ( 'testcases-link-display' ) local testcasesLink = makeWikilink ( testcasesPage , testcasesDisplay ) local testcasesEditUrl = testcasesTitle : canonicalUrl { action = 'edit' } local testcasesEditDisplay = message ( 'testcases-edit-link-display' ) local testcasesEditLink = makeWikilink ( "Special:EditPage/" .. testcasesPage , testcasesEditDisplay ) -- для модулей добавьте ссылку на запуск тестовых случаев, если она существует, если testcasesTitle . contentModel == "Scribunto" и testcasesTitle . talkPageTitle и testcasesTitle . talkPageTitle . существует , то local testcasesRunLinkDisplay = message ( 'testcases-run-link-display' )                                                                 local  testcasesRunLink  =  makeWikilink ( testcasesTitle.talkPageTitle.prefixedText , testcasesRunLinkDisplay )  testcasesLinks = testcasesLink .. ' ' .. makeToolbar ( testcasesEditLink , testcasesRunLink ) else testcasesLinks = testcasesLink .. ' ' .. makeToolbar ( testcasesEditLink ) end else local testcasesPreload if subjectSpace == 828 then testcasesPreload = message ( 'module- testcases -preload' ) else testcasesPreload = message ( ' template- testcases - preload ' ) end local testcasesCreateUrl = testcasesTitle : canonicalUrl { action = 'edit' , preload = testcasesPreload } local testcasesCreateDisplay = message ( 'testcases-create-link-display' ) local testcasesCreateLink = makeUrlLink ( testcasesCreateUrl , testcasesCreateDisplay ) testcasesLinks = message ( 'testcases-link-display' ) .. ' ' .. makeToolbar ( testcasesCreateLink ) end local messageName if subjectSpace == 828 then messageName = 'experiment-blurb-module' else messageName = 'experiment-blurb-template' end return message ( messageName , { sandboxLinks , testcasesLinks }) end function p . makeCategoriesBlurb ( args , env ) --[[ -- Генерирует текст "Пожалуйста, добавьте категории на подстраницу /doc." -- @args - таблица аргументов, переданных пользователем                                                         -- @env - таблица окружения, содержащая объекты заголовков и т. д., созданная с помощью p.getEnvironment -- Сообщения: -- 'doc-link-display' --> '/doc' -- 'add-categories-blurb' --> 'Пожалуйста, добавьте категории на подстраницу $1.' --]] local docTitle = env . docTitle if not docTitle then return nil end local docPathLink = makeWikilink ( docTitle . prefixedText , message ( 'doc-link-display' )) return message ( 'add-categories-blurb' , { docPathLink }) end function p . makeSubpagesBlurb ( args , env ) --[[ -- Создает ссылку "Подстраницы этого шаблона". -- @args - таблица аргументов, переданных пользователем -- @env - таблица окружения, содержащая объекты заголовков и т. д., сгенерированная с помощью p.getEnvironment -- Сообщения: -- 'template-pagetype' --> 'template' -- 'module-pagetype' --> 'module' -- 'default-pagetype' --> 'page' -- 'subpages-link-display' --> 'Подстраницы этого $1' --]] local subjectSpace = env . subjectSpace local templateTitle = env . templateTitle если не subjectSpace или не templateTitle тогда вернуть nil конец локального типа страницы если subjectSpace == 10 тогда тип страницы = сообщение ( 'template-pagetype' ) иначе если subjectSpace == 828 тогда тип страницы = сообщение ( 'module-pagetype' ) иначе тип страницы = сообщение ( 'default-pagetype' ) конец локального subpagesLink = makeWikilink ( 'Special:PrefixIndex/' .. templateTitle . prefixedText .. '/' , сообщение ( 'subpages-link-display' ,{ тип страницы }) )                                                   return  message ( 'subpages-blurb' ,  { subpagesLink }) end ---------------------------------------------------------------------------- -- Отслеживание категорий ---------------------------------------------------------------------------- function p . addTrackingCategories ( env ) --[[ -- Проверяет, включена ли {{documentation}} на странице /doc или /testcases. -- @env - таблица окружения, содержащая объекты title и т. д., сгенерированная с помощью p.getEnvironment -- Сообщения: -- 'display-strange-usage-category' --> true -- 'doc-subpage' --> 'doc' -- 'testcases-subpage' --> 'testcases' -- 'strange-usage-category' --> 'Страницы Википедии со странным использованием ((documentation))' -- -- Страницы /testcases в пространстве имен модуля не категоризируются, поскольку они могли быть -- {{documentation}} автоматически включены. --]] local title = env . title local subjectSpace = env . subjectSpace if not title or not subjectSpace then return nil end local subpage = title . subpageText если message ( 'display-strange-usage-category' , nil , 'boolean' ) и ( subpage == message ( 'doc-subpage' ) или subjectSpace ~= 828 и subpage == message ( 'testcases-subpage' ) ) , то вернуть makeCategoryLink ( message ( 'strange-usage-category' )) end return '' end return p                                 
Взято с "https://en.wikipedia.org/w/index.php?title=Module:Documentation&oldid=1243757855"