locallanguages=mw.loadData("Module:Languages/data")localp={}-- вспомогательная функция, удаляет пробелыlocalfunctiontrimstr(s)return(s:gsub("^%s*(.-)%s*$","%1"))end-- получает код языка, возвращает ссылку и нормализованный код языка (или пустые строки)localfunctionget_lang_data(code)locall=languages[code];ifl~=nilthenreturn"[["..l[2].."|"..l[1].."]]",codeelseifcode~=""thenreturncode,""elsereturn"",""endendfunctionp.getRefHtmlFrame(frame)returnp.getRefHtml(trimstr(frame.args[1]))endfunctionp.getRefHtml(wikidataItemId)localcodeByItemId=mw.loadData("Module:Wikidata/Language-codes")localcode=codeByItemId[wikidataItemId];ifcode==nilthenmw.log('Language code not found for '..wikidataItemId)return""elselocall=languages[code];ifl==nilthenmw.log('Language description for code '..code..' not found')return""elsereturn'<span class="ref-info" title="'..l[2]..'" style="font-size:85%; cursor:help; color:#888;">('..l[1]..')</span>'endendend-- принимает zh|我|tt|мин, возвращает список через запятуюfunctionp.list(frame)localcurr_lang=nillocalresult=nilforn,vinframe:argumentPairs()dolocaltrimmed=trimstr(v)ifcurr_lang==niltheniftrimmed~=''then-- если язык пропущен, оставим прошлыйcurr_lang=trimstr(v)endelseiftrimmed~=''thenlocallink,lang_code=get_lang_data(curr_lang)locallist_itemiflang_code~=''thenlist_item=link.." <span lang='"..lang_code.."'>"..trimmed.."</span>"elselist_item=link.." <span class='unknown-foreign-lang'>"..trimmed.."</span>"endifresult==nilthenresult=list_itemelseresult=result..", "..list_itemendelse-- Пустой текст — значит, текущий язык совпадает с следующимlocallink,lang_code=get_lang_data(curr_lang)ifresult==nilthenresult=linkelseresult=result..", "..linkendendcurr_lang=nilendend-- просто #invoke:Languages|list|yue должно возвращать всё же ссылку без текстаifcurr_lang~=nilthenlocallink,lang_code=get_lang_data(curr_lang)ifresult~=nilthenresult=result..", "..linkelseresult=linkendendreturnresultendreturnp