| Modul ini dinilai sebagai modul beta, dan siap digunakan secara luas. Modul ini masih baru dan harus digunakan dengan hati-hati untuk memastikan bahwa hasilnya sesuai dengan yang diharapkan. |
| Modul ini menggunakan Lua: |
| Templat-templat bahasa |
|---|
| Nama bahasa (ISO 639) |
|
| Tautan interwiki |
| Teks berbahasa asing |
|
| Lainnya |
|
Dokumentasi di atas ditransklusikan dari Modul:Wikt-lang/doc. (sunting | riwayat)
Penyunting dapat melakukan uji coba pada halaman bak pasir (buat | cermin) dan kasus uji (buat) modul ini.
Subhalaman modul ini.
Penyunting dapat melakukan uji coba pada halaman bak pasir (buat | cermin) dan kasus uji (buat) modul ini.
Subhalaman modul ini.
require('strict') localm_data=mw.loadData("Module:Wikt-lang/data") locallangData=m_data.languagesorm_data localp={} localfunctioncheckForString(variable) returnvariable~=""andvariable~=nil end localfunctionmakeLinkedName(languageCode) localdata=langData[languageCode] localarticle=data["article"] localname=data["Wikipedia_name"]ordata["name"] return"[["..article.."|"..name.."]]: " end localfunctionmakeEntryName(word,languageCode) localdata=langData[languageCode] localugsub=mw.ustring.gsub word=tostring(word) ifword==nilthen error("The function makeEntryName requires a string argument") elseifword==""then return"" else -- Remove bold and italics, so that words that contain bolding or emphasis can be linked without piping. word=word:gsub("\'\'\'","") word=word:gsub("\'\'","") ifdata==nilthen returnword else localreplacements=dataanddata["replacements"] ifreplacements==nilthen returnword else -- Decompose so that the diacritics of characters such -- as รก can be removed in one go. -- No need to compose at the end, because the MediaWiki software -- will handle that. ifreplacements.decomposethen word=mw.ustring.toNFD(word) fori,frominipairs(replacements.from)do word=ugsub( word, from, replacements.toandreplacements.to[i]or"") end else forregex,replacementinpairs(replacements)do word=ugsub(word,regex,replacement) end end returnword end end end end p.makeEntryName=makeEntryName localfunctionfixScriptCode(firstLetter,threeLetters) returnstring.upper(firstLetter)..string.lower(threeLetters) end localfunctiongetCodes(codes,text) locallanguageCode,scriptCode,invalidCode localerrorText ifcodes==nilorcodes==""then errorText='no language or script code provided' elseifcodes:find("^%a%a%a?$")orcodes:find("^%a%a%a?%-%a%a%a%a$")then -- A three- or two-letter lowercase sequence at beginning of first parameter languageCode= codes:find("^%a%a%a?")and( codes:match("^(%l%l%l?)") orcodes:match("^(%a%a%a?)") :gsub("(%a%a%a?)",string.lower,1) ) -- One uppercase and three lowercase letters at the end of the first parameter scriptCode= codes:find("%a%a%a%a$")and( codes:match("(%u%l%l%l)$") orgsub( codes:match("(%a%a%a%a)$"), "(%a)(%a%a%a)", fixScriptCode, 1 ) ) elseifcodes:find("^%a%a%a?%-%a%a%a?$") orcodes:find("^%a%a%a%-%a%a%a%-%a%a%a$")then languageCode=codes -- Private-use subtag: x followed by one or more sequences of 1-8 lowercase -- letters separated by hyphens. This only allows for one sequence, as it is -- needed for proto-languages such as ine-x-proto (Proto-Indo-European). elseifcodes:find("^%a%a%a?%-x%-%a%a?%a?%a?%a?%a?%a?%a?$")then languageCode,scriptCode= codes:match("^(%a%a%a%-x%-%a%a?%a?%a?%a?%a?%a?%a?)%-?(.*)$") ifnotlanguageCodethen errorText='<code>'..codes..'</code> is not a valid language or script code.' elseifscriptCode~=""andnotscriptCode:find("%a%a%a%a")then errorText='<code>'..scriptCode..'</code> is not a valid script code.' else scriptCode=scriptCode:gsub( "(%a)(%a%a%a)", fixScriptCode, 1 ) end elseifcodes:find("^%a%a%a?")then languageCode,invalidCode=codes:match("^(%a%a%a?)%-?(.*)") languageCode=string.lower(languageCode) errorText='<code>'..invalidCode..'</code> is not a valid script code.' elseifcodes:find("%-?%a%a%a%a$")then invalidCode,scriptCode=codes:match("(.*)%-?(%a%a%a%a)$") scriptCode=gsub( scriptCode, "(%a)(%a%a%a)", fixScriptCode ) errorText='<code>'..invalidCode..'</code> is not a valid language code.' else errorText='<code>'..codes..'</code> is not a valid language or script code.' end ifnotscriptCodeorscriptCode==""then scriptCode=require("Module:Unicode data").is_Latin(text)and"Latn"or"unknown" end iferrorTextthen errorText=' <span style="font-size: smaller">['..errorText..']</span>' else errorText="" end languageCode=m_data.redirects[languageCode]orlanguageCode returnlanguageCode,scriptCode,errorText end localfunctiontag(text,languageCode,script,italics) localdata=langData[languageCode] -- Use Wikipedia code if it has been given: for instance, -- Proto-Indo-European has the Wiktionary code "ine-pro" but the Wikipedia -- code "ine-x-proto". languageCode=dataanddata.Wikipedia_codeorlanguageCode localitalicize=script=="Latn"anditalics ifnottextthentext="[text?]"end localtextDirectionMarkers={"","",""} ifdataanddata["direction"]=="rtl"then textDirectionMarkers={' dir="rtl"','‏','‎'} end localout={textDirectionMarkers[2]} ifitalicizethen table.insert(out,"<i lang=\""..languageCode.."\" xml:lang=\""..languageCode.."\""..textDirectionMarkers[1]..">"..text.."</i>") else table.insert(out,"<span lang=\""..languageCode.."\" xml:lang=\""..languageCode.."\""..textDirectionMarkers[1]..">"..text.."</span>") end table.insert(out,textDirectionMarkers[3]) returntable.concat(out) end functionp.lang(frame) localparent=frame:getParent() localargs=parent.args[1]andparent.argsorframe.args localcodes=args[1]andmw.text.trim(args[1]) localtext=args[2]orerror("Provide text in the second parameter") locallanguageCode,scriptCode,errorText=getCodes(codes,text) localitalics=args.italicsorargs.iorargs.italic italics=not(italics=="n"oritalics=="-"oritalics=="no") returntag(text,languageCode,scriptCode,italics)..errorText end localfunctionlinkToWiktionary(entry,linkText,languageCode) localdata=langData[languageCode] localname iflanguageCodethen ifdataanddata.namethen name=data.name elseifmw.language.fetchLanguageName(languageCode,'en')~=""then -- On other languages' wikis, use mw.getContentLanguage():getCode(), or replace with that wiki's language code. name=mw.language.fetchLanguageName(languageCode,'en') else error("No name for the language "..("%q"):format(languageCodeornil).." could be found") end ifentry:sub(1,1)=="*"then ifname~=""then entry="Reconstruction:"..name.."/"..entry:sub(2) else error("Language name is empty") end elseifdataanddata.type=="reconstructed"then mw.log("Reconstructed language without asterisk:",languageCode,name,entry) localframe=mw.getCurrentFrame() -- Track reconstructed entries with no asterisk by transcluding -- a nonexistent template. This technique is used in Wiktionary: -- see [[wikt:Module:debug]]. -- [[Special:WhatLinksHere/tracking/wikt-lang/reconstructed with no asterisk]] pcall(frame.expandTemplate,frame, {title='tracking/wikt-lang/reconstructed with no asterisk'}) ifname~=""then entry="Reconstruction:"..name.."/"..entry else error("Language name is empty") end elseifdataanddata.type=="appendix"then ifname~=""then entry="Appendix:"..name.."/"..entry else error("Language name is empty") end end ifentryandlinkTextthen return"[[wikt:"..entry.."#"..name.."|"..linkText.."]]" else error("linkToWiktionary needs a Wiktionary entry or link text, or both") end else return"[[wikt:"..entry.."|"..linkText.."]]" end end functionp.wiktlang(frame) localparent=frame:getParent() localargs=parent.args[1]andparent.argsorframe.args localcodes=args[1]andmw.text.trim(args[1]) localword1=args[2] localword2=args[3] ifnotargs[2]then error("Parameter 2 is required") end locallanguageCode,scriptCode,errorText=getCodes(codes,word1) localitalics=args.italicsorargs.i italics=not(italics=="n"oritalics=="-") localentry,linkText ifcheckForString(word2)andcheckForString(word1)then entry=makeEntryName(word1,languageCode) linkText=word2 elseifcheckForString(word1)then entry=makeEntryName(word1,languageCode) linkText=word1 end localout iflanguageCodeandentryandlinkTextthen out=tag(linkToWiktionary(entry,linkText,languageCode),languageCode,scriptCode,italics) elseifentryandlinkTextthen out=linkToWiktionary(entry,linkText) else out='<span style="font-size: smaller;">[text?]</span>' end ifoutanderrorTextthen returnout..errorText else returnerrorTextorerror("The function wiktlang generated nothing") end end functionp.wikt(frame) localparent=frame:getParent() localargs=parent.args[1]andparent.argsorframe.args localcodes=args[1]andmw.text.trim(args[1]) localword1=args[2] localword2=args[3] ifnotword1then error("Provide a word in parameter 2.") end locallanguageCode,scriptCode,errorText=getCodes(codes,word1) localentry,linkText ifcheckForString(word2)andcheckForString(word1)then entry=makeEntryName(word1,languageCode) linkText=word2 elseifcheckForString(word1)then entry=makeEntryName(word1,languageCode) linkText=word1 end localout iflanguageCodeandentryandlinkTextthen out=linkToWiktionary(entry,linkText,languageCode) elseifentryandlinkTextthen out=linkToWiktionary(entry,linkText) else out='<span style="font-size: smaller;">[text?]</span>' end ifoutanderrorTextthen returnoutandout..errorText else returnerrorTextorerror("The function wikt generated nothing") end end returnp