require ( 'Модуль: без глобальных переменных' )локальные m_data = mw . loadData ( "Модуль: язык / данные" )локальный langData = m_data . языки или m_dataместный p = {}локальная функция ifNotEmpty ( значение )если значение == "" тогдавернуть нольещевозвращаемое значениеконецконецлокальная функция makeLinkedName ( languageCode )локальные данные = langData [ languageCode ]местная статья = данные [ "статья" ]local name = data [ "Wikipedia_name" ] или data [ "name" ]return "[[" .. article .. "|" .. name .. "]]: & nbsp;"конецлокальная функция makeEntryName ( слово , languageCode )локальные данные = langData [ languageCode ]местный ugsub = mw . ustring . gsubслово = tostring ( слово )если слово == ноль, тоerror ( "Функция makeEntryName требует строкового аргумента" )elseif word == "" тогдавернуться ""еще- Удалите жирный шрифт и курсив, чтобы слова, содержащие жирный шрифт или ударение, можно было связывать без окантовки.word = word : gsub ( " \ '\' \ ' " , "" )word = word : gsub ( " \ '\' " , "" )если data == nil, тоответное словоещелокальные замены = данные и данные [ "замены" ]если замены == ноль, тоответное словоеще- Разложить так, чтобы диакритические знаки символов такие- поскольку бэкап можно удалить за один раз.- Не нужно сочинять в конце, потому что программа MediaWiki- с этим справлюсь.если замены . разложить тогдаслово = mw . ustring . toNFD ( слово )для i , from in ipairs ( замены . from ) делатьword = ugsub (слово ,из ,замены . к и замены . к [ i ] или "" )конецещедля регулярных выражений , замена в пар ( замены ) делаютword = ugsub ( слово , регулярное выражение , замена )конецконецответное словоконецконецконецконецстр . makeEntryName = makeEntryNameлокальная функция fixScriptCode ( firstLetter , threeLetters )вернуть string.upper ( firstLetter ) .. string.lower ( threeLetters )конецлокальная функция getCodes ( коды , текст )местный languageCode , scriptCode , invalidCodelocal errorTextесли коды == ноль или коды == "" тогдаerrorText = 'не указан язык или код скрипта'elseif коды : find ( "^% a% a% a? $" ) или коды : find ( "^% a% a% a?% -% a% a% a% a $" ), затем- Последовательность из трех или двух букв в нижнем регистре в начале первого параметраlanguageCode =коды : найти ( "^% a% a% a?" ) и (коды : match ( "^ (% l% l% l?)" )или коды : match ( "^ (% a% a% a?)" ): gsub ( "(% a% a% a?)" , string.lower , 1 ))- Одна заглавная и три строчных буквы в конце первого параметраscriptCode =коды : найти ( "% a% a% a% a $" ) и (коды : match ( "(% u% l% l% l) $" )или gsub (коды : match ( "(% a% a% a% a) $" ),"(% a) (% a% a% a)" ,fixScriptCode ,1))elseif коды : find ( "^% a% a% a?% -% a% a% a? $" )или коды : найдите ( "^% a% a% a% -% a% a% a% -% a% a% a $" ) затемlanguageCode = коды- Подтег для частного использования: x, за которым следует одна или несколько последовательностей из 1-8 строчных букв- буквы, разделенные дефисом. Это позволяет использовать только одну последовательность, так как это- необходимо для протоязыков, таких как ine-x-proto (протоиндоевропейский).elseif коды : find ( "^% a% a% a?% - x% -% a% a?% a?% a?% a?% a?% a?% a? $" ) затемlanguageCode , scriptCode =коды : match ( "^ (% a% a% a% -x% -% a% a?% a?% a?% a?% a?% a?% a?)% -? (. *) $ " )если не languageCode, тоerrorText = '<code>' .. codes .. '</code> не является допустимым кодом языка или скрипта.'elseif scriptCode ~ = "", а не scriptCode : find ( "% a% a% a% a" ), тогдаerrorText = '<code>' .. scriptCode .. '</code> не является допустимым кодом сценария.'ещеscriptCode = scriptCode : gsub ("(% a) (% a% a% a)" ,fixScriptCode ,1)конецelseif коды : find ( "^% a% a% a?" ) затемlanguageCode , invalidCode = коды : match ( "^ (% a% a% a?)% -? (. *)" )languageCode = строка.lower ( languageCode )errorText = '<code>' .. invalidCode .. '</code> не является допустимым кодом сценария.'elseif коды : find ( "% -?% a% a% a% a $" ) затемinvalidCode , scriptCode = коды : match ( "(. *)% -? (% a% a% a% a) $" )scriptCode = gsub (scriptCode ,"(% a) (% a% a% a)" ,fixScriptCode)errorText = '<code>' .. invalidCode .. '</code> не является допустимым кодом языка.'ещеerrorText = '<code>' .. codes .. '</code> не является допустимым кодом языка или скрипта.'конецесли не scriptCode или scriptCode == "" тогдаscriptCode = require ( "Модуль: данные Unicode" ). is_Latin ( текст ) и «Latn» или «неизвестно»конецесли errorText, тоerrorText = '<span style = "font-size: less "> [' .. errorText .. '] </span>'ещеerrorText = ""конецlanguageCode = m_data . перенаправляет [ languageCode ] или languageCodeвернуть languageCode , scriptCode , errorTextконец тег локальной функции ( текст , languageCode , скрипт , курсив ) локальные данные = langData [ languageCode ]- Используйте код Википедии, если он был предоставлен: например,- Протоиндоевропейский язык имеет код Викисловаря "ine-pro", но есть Википедия.- код "ine-x-proto".languageCode = данные и данные . Wikipedia_code или languageCodelocal italicize = script == "Latn" и курсивесли не текст, то текст = "[текст?]" конецlocal textDirectionMarkers = { "" , "" , "" }если data и data [ "direction" ] == "rtl", тоtextDirectionMarkers = { 'dir = "rtl"' , '& rlm;' , '& lrm;' }конецlocal out = { textDirectionMarkers [ 2 ] }если курсивом тоtable.insert ( out , "<i lang = \" " .. languageCode .. " \ " " .. textDirectionMarkers [ 1 ] .. ">" .. text .. "</i>" )ещеtable.insert ( out , "<span lang = \" " .. languageCode .. " \ " " .. textDirectionMarkers [ 1 ] .. ">" .. text .. "</span>" )конецtable.insert ( out , textDirectionMarkers [ 3 ])return table.concat ( выход )конецфункция p . lang ( рамка )локальный родитель = кадр : getParent ()локальные аргументы = родитель . args [ 1 ] и родительский . аргументы или фрейм . аргументыместные коды = args [ 1 ] и mw . текст . обрезать ( аргументы [ 1 ])local text = args [ 2 ] или ошибка ( «Укажите текст во втором параметре» )local languageCode , scriptCode , errorText = getCodes ( коды , текст )местный курсив = аргументы . курсив или аргументы . я или аргументы . курсивкурсив = нет ( курсив == "n" или курсив == "-" или курсив == "нет" ) тег возврата ( текст , languageCode , scriptCode , курсив ) .. errorTextконецлокальная функция linkToWiktionary ( запись , linkText , languageCode )локальные данные = langData [ languageCode ]местное имяесли languageCode, тоесли данные и данные . назови тогдаимя = данные . названиееще- На вики-сайтах других языков используйте mw.getContentLanguage (): getCode (),- или замените en на код языка этой вики.имя = мв . язык . fetchLanguageName ( languageCode , 'ru' )если name == "" тоerror ( "Имя для кода языка" .. ( "% q" ): формат ( languageCode или ноль ).. "не удалось получить с помощью mw.language.fetchLanguageName,".. "поэтому его нужно добавить в [[Module: Language / data]]" )конецконецесли запись : sub ( 1 , 1 ) == "*", тоесли имя ~ = "" тогдаentry = "Реконструкция:" .. name .. "/" .. entry : sub ( 2 )ещеошибка ( "Название языка пусто" )конецelseif данные и данные . введите == "реконструированный", затеммв . log ( "Восстановленный язык без звездочки:" , languageCode , имя , запись )локальный кадр = mw . getCurrentFrame ()- Отслеживайте восстановленные записи без звездочки путем включения- несуществующий шаблон. Этот прием используется в Викисловаре:- см. [[wikt: Module: debug]].- [[Special: WhatLinksHere / tracking / wikt-lang / реконструировано без звездочки]]pcall ( frame . expandTemplate , frame ,{ title = 'tracking / wikt-lang / реконструировано без звездочки' })если имя ~ = "" тогдаentry = "Реконструкция:" .. name .. "/" .. entryещеошибка ( "Название языка пусто" )конецelseif данные и данные . введите == "приложение", затемесли имя ~ = "" тогдаentry = "Приложение:" .. name .. "/" .. entryещеошибка ( "Название языка пусто" )конецконецесли entry и linkText, тоreturn "[[wikt:" .. entry .. "#" .. name .. "|" .. linkText .. "]]"ещеerror ( "linkToWiktionary нуждается в записи в Викисловаре или тексте ссылки, или и том и другом" )конецещеreturn "[[wikt:" .. entry .. "|" .. linkText .. "]]"конецконецфункция p . виктланг ( фрейм )локальный родитель = кадр : getParent ()локальные аргументы = родитель . args [ 1 ] и родительский . аргументы или фрейм . аргументыместные коды = args [ 1 ] и mw . текст . обрезать ( аргументы [ 1 ])локальное слово1 = ifNotEmpty ( аргументы [ 2 ])локальное слово2 = ifNotEmpty ( аргументы [ 3 ])если не args [ 2 ], тоошибка ( «Параметр 2 обязателен» )конецlocal languageCode , scriptCode , errorText = getCodes ( коды , слово2 или слово1 )местный курсив = аргументы . курсив или аргументы . якурсив = нет ( курсив == "n" или курсив == "-" )локальная запись , linkTextесли слово2 и слово1, тозапись = makeEntryName ( слово1 , код языка )linkText = word2elseif word1 тогдазапись = makeEntryName ( слово1 , код языка )linkText = word1конецместный изесли languageCode и entry и linkText, тоout = tag ( linkToWiktionary ( запись , linkText , languageCode ), languageCode , scriptCode , курсив )elseif запись и linkText, затемout = linkToWiktionary ( запись , linkText )ещеout = '<span style = "font-size: less;"> [текст?] </span>'конецесли out и errorText, товернуться из .. ErrorTextещевернуть errorText или error ( «Функция wiktlang ничего не сгенерировала» )конецконецфункция p . wikt ( рамка )локальный родитель = кадр : getParent ()локальные аргументы = родитель . args [ 1 ] и родительский . аргументы или фрейм . аргументыместные коды = args [ 1 ] и mw . текст . обрезать ( аргументы [ 1 ])локальное слово1 = ifNotEmpty ( аргументы [ 2 ])локальное слово2 = ifNotEmpty ( аргументы [ 3 ])если не слово1 тоerror ( «Укажите слово в параметре 2» )конецlocal languageCode , scriptCode , errorText = getCodes ( коды , слово1 )локальная запись , linkTextесли слово2 и слово1, тозапись = makeEntryName ( слово1 , код языка )linkText = word2elseif word1 тогдазапись = makeEntryName ( слово1 , код языка )linkText = word1конецместный изесли languageCode и entry и linkText, тоout = linkToWiktionary ( запись , linkText , languageCode ) elseif запись и linkText, затемout = linkToWiktionary ( запись , linkText )ещеout = '<span style = "font-size: less;"> [текст?] </span>'конецесли out и errorText, товернуться из и вне .. ErrorTextещевернуть errorText или error ( «Функция wikt ничего не сгенерировала» )конецконецвернуть p