Модуль:UserLinks

-------------------------------------------------------------------------------- -- UserLinks -- -- Этот модуль создает список ссылок о данном пользователе. Он может использоваться -- -- сам по себе или из шаблона. Дополнительную документацию см. на странице /doc. -- -------------------------------------------------------------------------------- -- Требуются необходимые модули local yesno = require ( 'Module:Yesno' ) -- Лениво инициализируем модули, которые могут понадобиться или не понадобиться local mExtra -- [[Module:UserLinks/extra]] local mArguments -- [[Module:Arguments]] local mToolbar -- [[Module:Toolbar]] local mCategoryHandler -- [[Module:Category handler]] local mTableTools -- [[Module:TableTools]] local interwikiTable -- [[Module:InterwikiTable]], загруженные с помощью mw.loadData -- Загружаем общие вспомогательные функции local mShared = require ( 'Module:UserLinks/shared' ) local raiseError = mShared . raiseError local maybeLoadModule = mShared . maybeLoadModule local makeWikitextError = mShared . makeWikitextError local makeWikilink = mShared . makeWikilink local makeUrlLink = mShared . makeUrlLink local makeFullUrlLink = mShared . makeFullUrlLink local message = mShared . message local p = {} -------------------------------------------------------------------------------- -- Таблица ссылок -------------------------------------------------------------------------------- function p . getLinks ( snippets ) --[=[ -- Получить таблицу ссылок, которые могут быть проиндексированы с помощью кодов ссылок. Таблица возвращается пустой, но ссылки добавляются в нее по требованию, когда она индексируется. Это становится возможным благодаря метатаблице и различным функциям ссылок, некоторые из которых определены здесь, а некоторые определены                                           -- в [[Module:UserLinks/extra]]. --]=] локальные ссылки , linkFunctions = {}, {} ---------------------------------------------------------------------------- -- Функции ссылок -- -- Следующие функции создают ссылки из кодов ссылок и фрагментов пользовательских данных. Новые функции ссылок должны быть добавлены под существующими -- функциями. ---------------------------------------------------------------------------- function linkFunctions . u ( snippets ) -- Страница пользователя return makeWikilink ( snippets . interwiki , 2 , snippets . username , snippets . username ) end function linkFunctions . np ( snippets ) -- Страница пользователя (без ping) return '<span class="plainlinks">' .. makeFullUrlLink ( snippets . interwiki , 2 , snippets . username , '' , snippets . username ) .. '</span>' end function linkFunctions . t ( snippets ) -- Страница обсуждения пользователя return makeWikilink ( snippets . interwiki , 3 , snippets . username , message ( 'display-talk' ) ) end function linkFunctions . c ( snippets ) -- Вклад return makeWikilink ( snippets . interwiki , - 1 , 'Contribs/' .. snippets . username , message ( 'display-contributions' ) ) end function linkFunctions . c64 ( snippets ) Вклады локальные first64 = snippets.имя пользователя : совпадение                       ( '^%x+:%x+:%x+:%x+:' ) или snippets.username: match ( '^%x+:%x+:%x+:' ) или snippets.username : match ( ' ^ % x + : % x + :' ) или snippets.username : match ( '^%x+:' ) возвращают first64 и makeWikilink ( snippets.interwiki , - 1 , ' Contribs/' .. first64 .. ':/64' , ' ( / 64 ) ' ) или ' ' end function linkFunctions . ct ( snippets ) — Количество правок return makeWikilink ( 'xtools' , 0 , 'ec/' .. snippets . toolLang .. '.' .. snippets . projectLong .. '.org/' .. snippets . username , message ( 'display-count' ) ) end function linkFunctions . m ( snippets ) — Перемещения страниц return makeWikilink ( snippets . interwiki , -1 , 'Log/move/' .. snippets . username , message ( ' display -moves' ) ) end function linkFunctions . l ( snippets ) — Журналы return makeWikilink ( snippets . interwiki , - 1 , 'Log/' .. snippets . username , message ( 'display-logs' ) ) end function linkFunctions . ae ( snippets ) — Автоматизированные правки (и неавтоматизированные дополнения). return makeWikilink ( 'xtools' ,0 ,                                  'autoedits/'  ..  snippets . toolLang  ..  '.'  ..  snippets . projectLong  ..  '.org/'  ..  snippets . username , message ( 'display-autoedits' ) ) end function linkFunctions . bl ( snippets ) -- Журнал блоков return makeFullUrlLink ( snippets . interwiki , - 1 , 'Log/block' , { page = 'User:' .. snippets . username }, message ( 'display-blocklog' ) ) end function linkFunctions . bls ( snippets ) — Блокирует return makeWikilink ( snippets . interwiki , - 1 , 'Log/block/' .. snippets . username , message ( 'display-blocks' ) ) end function linkFunctions . bu ( snippets ) — Блокирует пользователя return makeWikilink ( snippets . interwiki , - 1 , 'Block/' .. snippets . username , message ( 'display-blockuser' ) ) end function linkFunctions . ca ( snippets ) — Центральная аутентификация return makeWikilink ( snippets . interwiki , - 1 , 'CentralAuth/' .. snippets . username , message ( 'display-centralauth' ) ) end function linkFunctions . dc ( snippets ) Удаленные вклады вернуть makeWikilink ( snippets.interwiki , - 1                    , 'DeletedContributions/' .. snippets . username , message ( 'display-deletedcontributions' ) ) end function linkFunctions . e ( snippets ) -- Электронная почта return makeWikilink ( snippets . interwiki , - 1 , 'EmailUser/' .. snippets . username , message ( 'display-email' ) ) end function linkFunctions . es ( snippets ) -- Редактировать сводки return makeWikilink ( 'xtools' , 0 , 'editsummary/' .. snippets . toolLang .. '.' .. snippets . projectLong .. '.org/' .. snippets . username , message ( 'display-editsummaries' ) ) end function linkFunctions . del ( snippets ) -- Удаления return makeWikilink ( snippets . interwiki , - 1 , 'Log/delete/' .. snippets . username , message ( 'display-deletions' ) ) end function linkFunctions . lu ( snippets ) -- Список пользователей return makeFullUrlLink ( snippets . interwiki , - 1 , 'ListUsers' , { limit = 1 , username = snippets . username }, message ( 'display-listuser' ) ) end function linkFunctions . sul ( snippets ) -- SUL return makeWikilink ( nil , nil , 'sulutil:' ..                                 snippets.username , message ( ' display-sul' ) ) end function linkFunctions.tl ( snippets ) целевые журналы return makeFullUrlLink ( snippets.interwiki , -1 , ' Log ' , { page = mw.site.namespaces [ 2 ] .name .. ' : ' .. snippets.username } , message ( ' display-targetlogs ' ) ) end function linkFunctions.efl ( snippets ) журнал фильтра редактирования return makeFullUrlLink ( snippets.interwiki , -1 , ' AbuseLog ' , { wpSearchUser = snippets.username } , message ( ' display - abuselog ' ) ) end function linkFunctions . pr ( snippets ) -- Защиты return makeWikilink ( snippets . interwiki , - 1 , 'Log/protect/' .. snippets . username , message ( 'display-protections' ) ) end function linkFunctions . rl ( snippets ) -- Права пользователя return makeWikilink ( snippets . interwiki , - 1 , 'Log/rights/' .. snippets . username , message ( 'display-rights' ) ) end function linkFunctions . ren ( snippets ) -- Переименования return makeWikilink ( snippets . interwiki , - 1 , 'Log/renameuser/'                       ..  snippets . username , message ( 'display-renames' ) ) end function linkFunctions . rfa ( snippets ) — Запросы на администрирование return makeWikilink ( nil , - 1 , 'PrefixIndex/' .. message ( 'page-rfa' ) .. '/' .. snippets . username , message ( 'display-rfa' ) ) end function linkFunctions . api ( snippets ) -- данные пользователя API return makeUrlLink ( { host = snippets . fullDomain , path = '/w/api.php' , query = { action = 'query' , list = 'users' , usprop = 'groups|editcount' , ususers = snippets . username } }, message ( 'display-api' ) ) end function linkFunctions . up ( snippets ) -- Загрузки return makeWikilink ( snippets . interwiki , - 1 , 'ListFiles/' .. snippets . username , message ( 'display-uploads' ) ) end function linkFunctions . nuke ( snippets ) -- Массовое удаление/Специальное:Nuke return makeWikilink ( snippets . interwiki , - 1 , 'Nuke/' .. snippets . username , message ( 'display-nuke' ) ) end function linkFunctions . gender ( snippets ) -- Пол return mw .                                  getCurrentFrame (): callParserFunction ( 'GENDER' , snippets . username , 'he/him' , 'she/her' , 'they/them' ) end ---------------------------------------------------------------------------- -- Конец функций ссылок ---------------------------------------------------------------------------- -- Определение метатаблицы, которая запоминает функции ссылок и извлекает функции ссылок из [[Module:UserLinks/extra]] при необходимости. -- Ленивая инициализация таблицы extraLinkFunctions. Мы хотим загружать -- [[Module:UserLinks/extra]] только по мере необходимости, чтобы она имела низкий -- счетчик трансклюзий. local extraLinkFunctions -- Определение функций для общего кода в метатаблице. local function validateCode ( code ) -- Проверяет, является ли code допустимым кодом ссылки, т. е. проверяет, является ли он строкой и не является ли он пустой строкой. Возвращает код, если -- проверка пройдена, и nil, если нет. if type ( code ) == 'string' and code ~= '' then return code else return nil end end local function getExtraLinkFunctions () -- Загружает таблицу дополнительных функций связи из модуля /extra. -- Если возникла проблема с его загрузкой, вернуть false. Мы используем -- различие между false и nil, чтобы записать, пытались ли мы уже -- загрузить его. if extraLinkFunctions ~= nil then return extraLinkFunctions end if mExtra == nil then -- Если загрузка модуля не удалась, maybeLoadModule возвращает false. -- Здесь мы используем различие между false и nil, чтобы записать , пытались ли мы уже загрузить модуль /extra. mExtra = maybeLoadModule ( ' Module : UserLinks /extra' ) end if type ( mExtra ) == ' table ' and type ( mExtra.linkFunctions ) == 'table' then extraLinkFunctions = mExtra.linkFunctions                                  else extraLinkFunctions = false end return extraLinkFunctions end local function memoizeExtraLink ( code , func ) local success , link = pcall ( func , snippets ) if success and type ( link ) == 'string' then links [ code ] = link return link end return nil end -- Определите метатаблицу. setmetatable ( links , { __index = function ( t , key ) local code = validateCode ( key ) if not code then raiseError ( message ( 'error-malformedlinkcode' ), message ( 'error-malformedlinkcode-section' ) ) end local linkFunction = linkFunctions [ code ] local link if linkFunction then link = linkFunctions ( snippets ) links [ code ] = link else extraLinkFunctions = getExtraLinkFunctions () if extraLinkFunctions then local extraLinkFunction = extraLinkFunctions [ code ] if type ( extraLinkFunction ) == 'function' then link = memoizeExtraLink ( code , extraLinkFunction ) end end end if link then return link else raiseError ( message ( 'error-invalidlinkcode' , code ), message ( 'error-invalidlinkcode-section' ) ) end end                                                            , __pairs = function () extraLinkFunctions = getExtraLinkFunctions () if extraLinkFunctions then for code , func in pairs ( extraLinkFunctions ) do if validateCode ( code ) and type ( func ) == 'function' then memoizeExtraLink ( code , func ) end end end -- Разрешить встроенным функциям перезаписывать дополнительные функции. for code , func in pairs ( linkFunctions ) do local link = func ( snippets ) links [ code ] = link end return function ( t , key ) return next ( links , key ) end end }) return links end -------------------------------------------------------------------------------- -- Фрагменты пользовательских данных -------------------------------------------------------------------------------- function p . getSnippets ( args ) --[=[ -- Эта функция получает фрагменты пользовательских данных из аргументов и из -- [[Module:InterwikiTable]]. Данные загружаются по мере необходимости и запоминаются в таблице фрагментов для повышения производительности. -- -- По умолчанию фрагменты представляют собой пустую строку '', поэтому их можно использовать в операциях конкатенации, не беспокоясь о возникновении ошибок. По этой причине были написаны локальные функции snippetExists и -- getSnippet, чтобы помочь людям, пишущим новые фрагменты. Эти -- функции обрабатывают пустую строку как false. Нет необходимости возвращать -- пустую строку из функции фрагмента, поскольку значения nil и false автоматически преобразуются в пустую строку метатаблицей. -- -- Если вы добавляете новый фрагмент, пожалуйста, задокументируйте его в -- [[Module:UserLinks#Adding new links]]. --]=] local snippets , snippetFunctions                                       =  {},  {} setmetatable ( snippets , { __index = function ( t , key ) local snippetFunction = snippetFunctions [ key ] if snippetFunction then snippets [ key ] = snippetFunction () or '' return snippets [ key ] else raiseError ( message ( 'error-nosnippet' , key ), message ( 'error-nosnippet-section' ) ) end end }) -- Определяем вспомогательные функции для написания функций сниппета. local function snippetExists ( key ) -- Мы настроили метатаблицу так, чтобы для сниппетов по умолчанию использовалось значение '', поэтому нам -- не нужно проверять на false или nil. return snippets [ key ] ~= '' end local function getSnippet ( key ) local ret = snippets [ key ] if ret == '' then return nil else return ret end end -- Запуск функций сниппета. function snippetFunctions . username () -- Имя пользователя. local username = args . user или args . User return username или raiseError ( message ( 'error-nousername' ), message ( 'error-nousername-section' ) ) end function snippetFunctions . usernameHtml () -- Имя пользователя в кодировке html. Пробелы кодируются как плюсы. return mw . uri . encode ( snippets . username ) end function snippetFunctions . project () -- Имя проекта.                                            -- Также выполняет работу для snippetFunctions.interwikiTableKey и добавляет -- значение проекта в snippets.lang , если это допустимый код языка. local project = args.Project или args.project if not project then return nil end local projectValidated , interwikiTableKey = p.validateProjectCode ( project ) if not projectValidated then if mw.language.isKnownLanguageTag ( project ) then if not snippetExists ( 'lang' ) then snippets.lang = project end else raiseError ( message ( ' error - invalidproject ' , project ) , message ( ' error - invalidproject - section ' ) ) end end snippets.interwikiTableKey = interwikiTableKey return project end function snippetFunctions . interwikiTableKey () -- Ключ для проекта в Module:InterwikiTable. -- Полагается на snippetFunctions.project для выполнения реальной работы. local temp = snippets . project -- обязательно; помещает ключ в таблицу snippets return rawget ( snippets , 'interwikiTableKey' ) end function snippetFunctions . toolProject () -- Короткий код проекта для использования с toolserver или labs. Он всегда присутствует, даже если аргумент "project" отсутствует. Значением по умолчанию является сообщение "snippet-project-default". local project = getSnippet ( 'project' ) if not project then return message ( 'snippet-project-default' ) else return project end end function snippetFunctions . projectLong ()                                            -- Полная форма названия проекта, например «википедия» или «викикниги». local key = getSnippet ( 'interwikiTableKey' ), если не ключ , то вернуть сообщение ( 'snippet-projectlong-default' ) end interwikiTable = interwikiTable или mw . loadData ( 'Module:InterwikiTable' ) локальные префиксы = interwikiTable [ key ]. iw_prefix — Использование префиксов[2] — это своего рода хитрость, но в большинстве случаев нужно найти длинное имя. возвращать префиксы [ 2 ] или префиксы [ 1 ] в конце функции snippetFunctions . lang () -- Код языка. местный язык = args . язык или аргументы . Lang , если не lang, то вернуть nil end, если mw . язык . isKnownLanguageTag ( lang ) then return lang else raiseError ( message ( 'error-invalidlanguage' , lang ), message ( 'error-invalidlanguage-section' ) ) end end function snippetFunctions . toolLang () — Код языка для использования с toolserver или labs tools. Он всегда -- присутствует, даже если аргумент "lang" отсутствует. Значение по умолчанию -- сообщение "snippet-lang-default". return getSnippet ( 'lang' ) или message ( 'snippet-lang -default' ) end function snippetFunctions . interwiki () -- Префикс interwiki, состоящий из значений проекта и языка, -- разделенных двоеточиями, например ":wikt:es:".локальный проект = getSnippet ( 'project' ) локальный язык = getSnippet ( 'lang' ) если нет                                             project     , а не lang , затем верните nil end local ret = {} ret [ #ret + 1 ] = project ret [ #ret + 1 ] = lang return table.concat ( ret , ':' ) end function snippetFunctions . fullDomain () — полное доменное имя сайта, например www.mediawiki.org, — en.wikipedia.org или ja.wikibooks.org. local fullDomain local lang = getSnippet ( 'toolLang' ) local key = getSnippet ( 'interwikiTableKey' ) if key then interwikiTable = interwikiTable или mw . loadData ( 'Module:InterwikiTable' ) локальный домен = interwikiTable [ ключ ]. локальный домен takeLangPrefix = interwikiTable [ ключ ]. takes_lang_prefix if takesLangPrefix then fullDomain = lang .. '.' .. domain else fullDomain = domain end else fullDomain = lang .. '.wikipedia.org' end return fullDomain end -- Конец функций сниппета. Если вы добавляете новую функцию сниппета, пожалуйста -- задокументируйте это в [[Module:UserLinks#Добавление новых ссылок]]. return snippets end function p . validateProjectCode ( s ) -- Проверяет код проекта, проверяя, присутствует ли он в -- [[Module:InterwikiTable] ]. Если он присутствует, возвращает код и -- ключ InterwikiTable для соответствующего сайта. Если отсутствует, -- возвращает nil для обоих. interwikiTable = interwikiTable или mw . loadData ( 'Module:InterwikiTable' ) for key , t                                                           in  pairs ( interwikiTable )  do for i , prefix in ipairs ( t . iw_prefix ) do if s == prefix then return s , key end end end return nil , nil end -------------------------------------------------------------------------------- -- Основные функции -------------------------------------------------------------------------------- local function makeInvokeFunction ( funcName ) -- Создает функцию, к которой можно получить доступ из #invoke. Это необходимо только для функций, которым требуется доступ к аргументам. return function ( frame ) mArguments = require ( 'Module:Arguments' ) local args = mArguments . getArgs ( frame ) return p [ funcName ]( args ) end end p . main = makeInvokeFunction ( '_main' ) function p . _main ( args ) -- Основная функция. Это та, которая вызывается из [[Template:User-multi]], -- через p.main. local options = p . getOptions ( args ) local snippets = p . getSnippets ( args ) local codes = p . getCodes ( args ) local links = p . getLinks ( snippets ) -- Перегружает встроенную функцию ошибок Lua для генерации ошибок викитекста -- предназначенных для конечных пользователей. Это затрудняет отладку при возникновении реальных ошибок, но это единственный реалистичный способ показать ошибки викитекста и при этом иметь нормальный код при использовании метатаблиц и т. д. local success , result = pcall ( p . export                                          ,  codes ,  links ,  options ) если успешно , то return result иначе return makeWikitextError ( result , options . isDemo ) end end function p . getOptions ( args ) -- Получает параметры из таблицы args, чтобы нам не приходилось постоянно перебирать -- всю таблицу args. local options = {} options . isDemo = yesno ( args . demo ) или false options . noPing = yesno ( args . noPing ) или yesno ( args . noping ) или yesno ( args . np ) или false options . toolbarStyle = yesno ( args . small ) и 'font-size: 90%;' или nil options . sup = yesno ( args . sup , true ) options . Separater = args . Separater options . span = args . span return options end function p . getCodes ( args ) -- Получает коды ссылок из аргументов. Коды не проверяются -- на данном этапе. mTableTools = maybeLoadModule ( 'Module:TableTools' ) локальные коды if mTableTools then коды = mTableTools . compressSparseArray ( args ) else коды = {} for i , код в ipairs ( args ) do коды [ i ] = код конец                                                    end return codes end function p . export ( codes , links , options ) -- Создаем пользовательскую ссылку. local userLink = options . noPing и links . np или links . u -- Если нам не были переданы никакие коды ссылок, просто возвращаем пользовательскую ссылку. if # codes < 1 then return userLink end -- Создаем панель инструментов. mToolbar = require ( 'Module:Toolbar' ) local toolbarArgs = {} for i , code in ipairs ( codes ) do local link = links [ code ] toolbarArgs [ # toolbarArgs + 1 ] = link end toolbarArgs . style = options . toolbarStyle toolbarArgs . Separater = options . Separater или 'dot' toolbarArgs . span = options . span local toolbar = mToolbar . main ( toolbarArgs ) -- Применяем опцию sup. if options . sup then toolbar = '<sup>' .. toolbar .. '</sup>' end -- Если мы выполняем транскцию, добавьте неразрывный пробел, но если мы выполняем подстановку -- просто используйте обычный пробел local space = mw . isSubsting () и ' ' или ' ' return userLink .. space .. toolbar end -------------------------------------------------------------------------------- -- Функция одиночной ссылки -------------------------------------------------------------------------------- p . single = makeInvokeFunction (                                                                  '_single' ) function p . _single ( args ) -- Извлекает одну ссылку из таблицы ссылок. local options = p . getOptions ( args ) local snippets = p . getSnippets ( args ) local links = p . getLinks ( snippets ) local code = args [ 1 ] local success , link = pcall ( p . exportSingle , links , code ) if success then return link else return makeWikitextError ( link , options . isDemo ) end end function p . exportSingle ( links , code ) -- Если возникнут какие-либо ошибки, они, вероятно, возникнут здесь. Эта функция -- существует исключительно для того, чтобы все ошибки, которые возникнут в p._single , можно было -- обработать с помощью одного pcall. если не код , то raiseError ( message ( 'error-nolinkcode' ), message ( 'error-nolinkcode-section' ) ) конец возврат ссылок [ код ] конец возврат p                               
Retrieved from "https://en.wikipedia.org/w/index.php?title=Module:UserLinks&oldid=1243294035"