Anda dapat membuat halaman dokumentasi untuk buat pada modul Scribunto ini.
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.
localp={} localdata=mw.loadData('Module:Interlinear/data') localgloss_override={}-- untuk singkatan glosarium kustom localgetArgs=require('Module:Arguments').getArgs localyesno=require('Module:Yesno') locallang_data=mw.loadData('Module:Lang/data') -------------------------- -- Variabel yang hampir global -------------------------- localglossing_type,displaying_messages,free_translation,msg,buffer ------------------- -- Pengaturan umum ------------------- localconf={--pengaturan WordSeparator=" \n\r\t",-- Jangan ganti dengan %s karena akan memasukkan spasi non-putus (non-breaking spaces) GlossAbbrPattern="^([Ø0-9A-Z]+)$",-- ini bukan regex penuh, melainkan pola Lua -- CATATAN: Karakter-karakter berikut harus diformat untuk digunakan dalam set pola. GlossAbbrBoundary="-.,;:<>‹›/\\~+=%?%s%[%]()%_\127'", GlossExcludeTable={I=true,},--string yang tidak akan dianggap sebagai singkatan glosarium GlossExcludePattern='^[0-9][0-9]+$',-- mengecualikan string yang seluruhnya terdiri dari angka GlossSmallCapsExclude="^[AOPS]$",-- singkatan glosarium yang cocok dengan pola ini tidak akan dirender dengan huruf kapital kecil GlossingType="label",-- jika diatur ke "label", singkatan glosarium diformat sebagai <abbr> dengan "label" muncul di tooltip -- jika diatur ke "wikilink", singkatan diformat sebagai pranala wiki ke artikel wikipedia yang relevan -- jika diatur ke "none", singkatan tidak diformat sama sekali ErrorCategory="[[Kategori:Halaman dengan kesalahan pada teks interlinear]]", AmbiguousGlossCategory="[[Kategori:Artikel dengan singkatan glosarium yang ambigu]]", MessageGlossingError="Terjadi kesalahan pada glosarium interlinear", combining_gender_numbers="[0-9][0-9]?$",--misal G4 'gender ke-4' atau CL7 'kelas 7' combining_gender_prefixes={G="gender",CL="class"}, combining_person={["1"]="first person",["2"]="second person",["3"]="third person",}, combining_number={ S="singular",SG="singular", P="plural",PL="plural", D="dual",DU="dual", TRI="trial",PAU="paucal",COL="collective", IN="inclusive",INC="inclusive",INCL="inclusive", EX="exclusive",EXC="exclusive",EXCL="exclusive" }, combining_gender={F="feminine",M="masculine",N="neuter"}, LowerCaseGlosses={ ["1sg"]=true,["2sg"]=true,["3sg"]=true, ["1du"]=true,["2du"]=true,["3du"]=true, ["1pl"]=true,["2pl"]=true,["3pl"]=true, ["Fsg"]=true,["Fpl"]=true,["Msg"]=true,["Mpl"]=true, },-- ini adalah string yang tidak semuanya huruf kapital yang akan dikenali sebagai singkatan glosarium ErrorHelpLocation="Templat:Interlinear", } --------------------- -- Gaya dan kelas CSS --------------------- conf.style={--gaya CSS WordDiv="float: left; margin-bottom: 0.3em;", WordMargin="margin-right: 1em;", WordP="margin: 0px;",-- gaya untuk elemen kata <p> GlossAbbr="font-variant: small-caps; font-variant-numeric: lining-nums; text-transform: lowercase; ",-- tidak akan diterapkan ke singkatan glosarium yang mengandung karakter huruf kecil HiddenText="display: none;", EndDiv="clear: left; display: block;",-- gaya untuk elemen <div> di akhir tampilan interlinear ErrorMessage="font-size: inherit", } conf.class={--kelas CSS Interlinear="interlinear", GlossAbbr="gloss-abbr", GlossAbbrAmb="gloss-abbr-ambiguous", GlossAbbrError="gloss-abbr-error", ErrorMessage="error", } --------------------- -- Transklusi bagian --------------------- localpage_content=nil-- inisialisasi lambat (lazy initialization) localfunctionget_section(frame,section_name) ifpage_content==nilthen localcurrent_title=mw.title.getCurrentTitle() page_content=current_title:getContent() end ifpage_contentthen ifmw.ustring.find(page_content,section_name,1,true)then returnframe:preprocess('{{#section:{{FULLPAGENAME}}|'..section_name..'}}') end end return'' end --------------------- -- Berbagai fungsi kecil --------------------- localfunctionnormalise(str) returnmw.ustring.gsub(str,"["..conf.WordSeparator.."]+"," ") end localfunctiontidyCss(str) str=mw.ustring.gsub(str,'^[\"\']*(.-)[\"\']*$',"%1")-- memangkas tanda kutip ifmw.ustring.sub(str,-1)~=";"thenstr=str..";"end-- menambahkan ";" jika tidak ada returnstr end localfunctionhighlight(text) iftextthen return'<span style="color:#C00;font-weight:bold;">'..text..'</span>' elsereturn""end end localfunctiontone_sup(str) returnmw.ustring.gsub(str,"([^%p%s0-9])([0-9]+)","%1<sup>%2</sup>") end localfunctionis_empty(str)-- mengembalikan "false" jika argumennya adalah string yang mengandung karakter selain spasi dll. ifnotstrthenreturntrueend ifmw.ustring.find(str,"[^"..conf.WordSeparator.."]") thenreturnfalse elsereturntrueend end localfunctionhelp_link(anchor) ifanchorthen return" ([["..conf.ErrorHelpLocation.."#"..anchor.."|bantuan]])" elsereturn""end end -- berikut ini adalah bagian dari uji coba penerapan transliterasi otomatis: localfunctiontransliterate(str,lang_from,lang_to,scheme) locallookup={grc={module='Module:Ancient Greek',funct="transliterate",}} ifnotlang_fromthen msg:add("error","Bahasa sumber untuk transliterasi belum diatur") else localt=lookup[lang_from] iftthen localmodule=require(t.module) returnmodule[t.funct](str) elsemsg:add("error","Tidak dapat menemukan pentransliterasi untuk bahasa '"..lang_from.."'") end end return"" end-- akhir blok uji coba -------------------- -- Dua fungsi berikut memperbarui pengaturan glosarium berdasarkan argumen templat -- yang diterima. set_global_glossing_settings() memperbarui pengaturan global -- yang berlaku untuk semua singkatan glosarium. set_glossing_type() -- mengembalikan tipe glosarium, yang mana dapat bervariasi antar baris. -------------------- localfunctionset_global_glossing_settings(a) localstyle="" ifa.stylethenstyle=tidyCss(a.style)end ifa.underline=="no"then style=style.."text-decoration: none;"end ifa.small_caps=="no"then style=style.."font-variant:normal; text-transform: none;"end ifstyle~=""thenconf.style.GlossAbbr=conf.style.GlossAbbr..styleend end localfunctionset_glossing_type(glossing) ifglossingthen localGlossingType glossing=mw.ustring.lower(mw.text.trim(glossing)) ifmw.ustring.find(glossing,'link')then GlossingType="wikilink" elseifmw.ustring.find(glossing,'label') ormw.ustring.find(glossing,'no link')then GlossingType='label' elseifmw.ustring.find(glossing,'no abbr')then GlossingType="no abbr" elseifyesno(glossing)==falsethen GlossingType=nil elseifyesno(glossing)then GlossingType=conf.GlossingType else msg:add('error','Tipe glosarium "'..glossing..'" tidak dikenali')end returnGlossingType elseerror("set_glossing_type: 'glossing' bernilai nil atau false",2) end end localfunctionset_custom_glosses(list) localabbs=mw.text.split(list,'[;\n\t]') for_,vinpairs(abbs)do localgloss=mw.text.split(v,':') locala=mw.text.trim(gloss[1]) ifaanda~=""then gloss_override[a]={} gloss_override[a].expansion=gloss[2] gloss_override[a].wikipage=gloss[3] end end end --------------------- -- Objek UserMessages berisi dan memproses pesan kesalahan serta peringatan --------------------- localUserMessages={errors={},warnings={},gloss_messages={}} functionUserMessages:add(msgtype,text,gloss) ifmsgtype=="gloss_message"then self.gloss_messages[gloss]=text elseifmsgtype=="warning"then table.insert(self.warnings,text) elseifmsgtype=="non-repeating error"then self.errors.nre=text elseifmsgtype=="ambiguous gloss"then self.if_ambiguous_glosses=true elseifmsgtype=="error"then table.insert(self.errors,text) elsereturnerror("UserMessages:add(): tipe pesan tidak diketahui",2) end end functionUserMessages:print_errors() localout="" localnamespace=mw.title.getCurrentTitle().namespace ifnext(self.errors)orself.warnings[1]then localerr_span=mw.html.create("span") err_span:attr("style",conf.style.ErrorMessage) err_span:addClass(conf.class.ErrorMessage) for_,vinpairs(self.errors)do err_span:wikitext(" "..v..";")end ifnamespace%2==0andnamespace~=2-- ruang nama non-pembicaraan, tidak termasuk halaman pengguna; jika memodifikasi tolong perbarui deskripsi di halaman kategori thenerr_span:wikitext(conf.ErrorCategory) end out=tostring(err_span) mw.addWarning(conf.MessageGlossingError) end ifself.if_ambiguous_glossesthen ifnamespace==0-- ruang nama artikel thenout=out..conf.AmbiguousGlossCategory-- kategori ini hanya akan melacak artikel end end returnout end functionUserMessages:print_warnings() localout="" -- Pesan dan peringatan hanya ditampilkan jika halaman dilihat dalam mode "pratayang" (preview): ifdisplaying_messagesand(next(self.gloss_messages)ornext(self.warnings))then localdiv=mw.html.create("div") div:addClass("interlinear-preview-warning") :cssText('border: 1px solid #a2a9b1; background-color: #f8f9fa; width: 80%; padding: 0.2em;') :wikitext("<i>Kotak pesan ini hanya ditampilkan pada mode pratayang:</i>") :newline() for_,vinipairs(self.warnings)do localp=div:tag("p") p:addClass(conf.class.ErrorMessage) p:attr("style",conf.style.ErrorMessage) p:wikitext(v) end ifself.gloss_messagesthen div:wikitext("<p> Untuk mengubah ekspansi bawaan berikut, lihat [[Templat:Interlinear/doc#Custom abbreviations|dokumentasi templat]]:</p>") end for_,vinpairs(self.gloss_messages)do div:wikitext("<p>"..v.."</p>") end out=out.."\n\n"..tostring(div) end returnout end --------------------- -- gloss_lookup() menerima singkatan glosarium dan mencoba mengungkap maknanya. --------------------- localfunctiongloss_lookup(a,label,wikilink) local_label,_wikilink,_lookup,source=nil,nil,nil,nil ifgloss_override[a]then _lookup=gloss_override[a] source="local" elseifdata.abbreviations[a]then_lookup=data.abbreviations[a]end if_lookupand_lookup.expansion~=""then _label,_wikilink=_lookup.expansion,_lookup.wikipage else localprefix=mw.ustring.sub(a,1,1) localsuffix=mw.ustring.sub(a,2) ifconf.combining_person[prefix]then-- apakah bentuknya 1PL atau 3FS? _label=conf.combining_person[prefix] local_suffix=conf.combining_number[suffix]orconf.combining_gender[suffix] if_suffixthen _label=_label..", ".._suffix else localsuffix1=mw.ustring.sub(suffix,1,1) localsuffix2=mw.ustring.sub(suffix,2) ifconf.combining_gender[suffix1] andconf.combining_number[suffix2]then _label=_label..", "..conf.combining_gender[suffix1]..", "..conf.combining_number[suffix2] else_label=nilend end elseifmw.ustring.match(suffix,conf.combining_gender_numbers)then-- kasus seperti G4 = gender 4 local_i,_j=mw.ustring.find(a,conf.combining_gender_numbers) local_pre=mw.ustring.sub(a,1,_i-1) local_suff=mw.ustring.sub(a,_i) ifconf.combining_gender_prefixes[_pre]then _label=conf.combining_gender_prefixes[_pre].." ".._suff end elseifprefix=="N"then-- menangani kasus seperti NPST = non-past (masa nonlampau) locals=gloss_override[suffix]ordata.abbreviations[suffix] ifs~=nilandnots.ExcludeNegationthen _label="non-"..s.expansion _wikilink=s.wikipage end s=nil end end if_label==""then_label=nilend if_wikilink==""then_wikilink=nilend ifnotlabelthenlabel=_labelend ifnotwikilinkthenwikilink=_wikilinkend returnlabel,wikilink,source end --------------------- -- format_gloss() memanggil gloss_lookup() untuk mencari makna singkatan -- glosarium, lalu kemudian diformat --------------------- localfunctionformat_gloss(gloss,label,wikilink) ifstring.sub(gloss,1,3)=="000"then-- memeriksa komponen umum dari penanda strip yang terekspos (lihat [[:mw:Strip marker]]) returngloss end localgloss2=mw.ustring.gsub(gloss,"<.->","")-- menghapus sisa elemen html (fluff) gloss2=mw.ustring.gsub(gloss2,"%'%'+","")-- menghapus pemformatan tebal/miring wiki gloss2=mw.text.trim(mw.ustring.upper(gloss2)) ifnot(labelorwikilink) or(notlabelandglossing_type=="label") or(notwikilinkandglossing_type=="wikilink") then ifglossing_type~="no abbr" thenlabel,wikilink,source=gloss_lookup(gloss2,label,wikilink) end end localgloss_node ifglossing_type=="no abbr" thengloss_node=mw.html.create("span") elsegloss_node=mw.html.create("abbr")end gloss_node:addClass(conf.class.GlossAbbr) iflabelorwikilinkthen ifnotmw.ustring.match(gloss,"%l")-- mengecualikan glosarium yang mengandung huruf kecil andnotmw.ustring.match(gloss,conf.GlossSmallCapsExclude)-- dan juga mengecualikan A, O dll. agar tidak dirender dengan huruf kapital kecil thengloss_node:attr("style",conf.style.GlossAbbr) end localabbr_label iflabelthenabbr_label=label elseabbr_label=wikilinkend gloss_node:attr("title",abbr_label) ifsource~="local"anddata.abbreviations[gloss2]then ifdata.abbreviations[gloss2].ambiguousthen gloss_node:addClass(conf.class.GlossAbbrAmb) msg:add("ambiguous gloss") end end ifglossing_type=="wikilink"andwikilink thengloss_node:wikitext("[[",wikilink,"|",gloss,"]]") elsegloss_node:wikitext(gloss)end ifsource~="local"anddisplaying_messagesthen-- mencatat pencarian glosarium: localmessage="" iflabelthen message="mengasumsikan "..gloss2.." bermakna \""..abbr_label.."\";"end ifglossing_type=="wikilink"andwikilinkthen message=message.." menautkan ke [["..wikilink.."]];" end msg:add("gloss_message",message,gloss) end elseifglossing_type=="no abbr" thengloss_node :attr("style",conf.style.GlossAbbr) :wikitext(gloss) else ifdisplaying_messagesthen msg:add("warning","Singkatan glosarium "..highlight(gloss2).." tidak dikenali"..help_link("gloss abbr")) end msg:add("non-repeating error","Singkatan glosarium tidak diketahui"..help_link("gloss abbr")) gloss_node :addClass(conf.class.GlossAbbrError) :addClass("error") :css("font-size","100%") :attr("title",gloss2..": singkatan glosarium tidak ditemukan") :attr("style",conf.style.ErrorMessage) :wikitext(gloss) end returntostring(gloss_node) end --------------------- -- find_gloss() mengurai sebuah kata menjadi morfem-morfem, dan memanggil format_gloss() -- untuk apa pun yang terlihat seperti singkatan glosarium. --------------------- localfunctionfind_gloss(word) localfunctionscan_gloss(boundary,gloss_abbr)-- memeriksa suatu morfem apakah itu merupakan singkatan glosarium if(mw.ustring.match(gloss_abbr,conf.GlossAbbrPattern) orconf.LowerCaseGlosses[gloss_abbr]) andnot(conf.GlossExcludeTable[gloss_abbr] ormw.ustring.match(gloss_abbr,conf.GlossExcludePattern)) thengloss_abbr=format_gloss(gloss_abbr) end returnboundary..gloss_abbr end localword=mw.text.decode(word,true) ifword=="I"-- untuk kasus kata bahasa Inggris "I", kata ganti orang pertama tunggal (1SG) thenreturnwordend localpattern="(["..conf.GlossAbbrBoundary.."]?)([^"..conf.GlossAbbrBoundary.."]+)" word=mw.ustring.gsub(word,pattern,scan_gloss)-- memisahkan menjadi morfem-morfem returnword end --------------------- -- Tujuan utama dari fungsi parse() yang rumit ini adalah memisahkan baris menjadi kata-kata dan untuk setiap kata -- yang memenuhi syarat memanggil find_gloss(). Parser menghasilkan kata-kata individual (dengan menerapkan format singkatan glosarium apa pun). -- Pekerjaan sederhana pemisahan spasi menjadi rumit karena a) fakta bahwa masukan dapat berisi -- spasi di dalam berbagai elemen html yang merupakan hasil penerapan berbagai templat pemformatan; -- dan b) kebutuhan untuk mengenali keluaran templat yang memformat singkatan glosarium kustom -- (dan karenanya melewatkan melemparkannya ke find_gloss). --------------------- localfunctionparse(cline,i,tags_found,ifglossing) localfunctionissue_error(message,culprit) UserMessages:add("error",message..": ''"..mw.ustring.sub(cline.whole,1,i-1).."'''"..culprit.."'''''") end ifi>cline.lengththenreturniend--ini hanya akan dipicu jika baris saat ini memiliki lebih sedikit kata daripada baris 1 localnext_step,j,_,chunk localprobe=mw.ustring.sub(cline.whole,i,i) ifmw.ustring.match(probe,"["..conf.WordSeparator.."]")andtags_found==0 thennext_step=i-1 elseifprobe=="["then--Pranala wiki? ifmw.ustring.sub(cline.whole,i+1,i+1)=="["then _,j,chunk=mw.ustring.find(cline.whole,"(%[%[.-%]%])",i) elsechunk="[";j=iend--kalau begitu bukan pranala wiki buffer=buffer..chunk next_step=parse(cline,j+1,tags_found,ifglossing) elseifprobe=="{"andtags_found==0then--tanda kurung kurawal mengapit serangkaian kata untuk diperlakukan sebagai satu kesatuan _,j,chunk=mw.ustring.find(cline.whole,"(.-)(})",i+1) ifnotchunkthen issue_error("Kurung kurawal tidak ditutup","{") chunk=highlight("{");j=i elseififglossing==truethen chunk=find_gloss(chunk) else ifcline.tone_supthenchunk=tone_sup(chunk)end end buffer=buffer..chunk next_step=parse(cline,j+1,tags_found,ifglossing) elseifprobe=="<"then-- Kita menemui tag HTML. Apa yang harus dilakukan sekarang? local_,j,chunk=mw.ustring.find(cline.whole,"(<.->)",i) ifnotchunkthen issue_error("Kurung sudut tidak ditutup","<") chunk=highlight("<");j=i elseifmw.ustring.sub(cline.whole,i,i+1)=="</"then-- Ini adalah tag PENUTUP ifcline.glossing andifglossing==false andmw.ustring.match(chunk,"</abbr>") thenifglossing=trueend tags_found=tags_found-1 elseifnotmw.ustring.match(chunk,"/>$")-- Ini adalah tag PEMBUKA, kecuali ia membuka elemen yang self-closing (dalam hal ini elemen diabaikan) thenififglossing==true-- berikut ini memeriksa keluaran dari {{ggl}}: andmw.ustring.find(chunk,conf.class.GlossAbbr,1,true)-- penting bahwa fungsi "find" menggunakan string literal dan bukan pola thenifglossing=falseend tags_found=tags_found+1 end buffer=buffer..chunk next_step=parse(cline,j+1,tags_found,ifglossing) else-- Tidak ada tag HTML, jadi kita hanya perlu mencari di mana kata tersebut berakhir local_,k,chunk=mw.ustring.find(cline.whole,"(..-)([ <[])",i) ifkthen--teks biasa ififglossing==truethen buffer=buffer..find_gloss(chunk) else ifcline.tone_supthenchunk=tone_sup(chunk)end buffer=buffer..chunk end next_step=parse(cline,k,tags_found,ifglossing) else-- mencapai akhir string ififglossing==truethen chunk=find_gloss(mw.ustring.sub(cline.whole,i)) else chunk=mw.ustring.sub(cline.whole,i) ifcline.tone_supthenchunk=tone_sup(chunk)end end buffer=buffer..chunk next_step=cline.length end end returnnext_step end -------------------- -- Fungsi berikut dipanggil oleh Templat:gcl dan digunakan untuk memformat singkatan glosarium individual -------------------- functionp.gcl(frame) localargs=getArgs(frame,{ trim=true, removeBlanks=false, parentOnly=true, wrappers={'Template:Grammatical category label'}, }) msg=UserMessages set_global_glossing_settings{style=args.style,underline=args.underline,small_caps=args['small-caps']} ifnotargs.glossingthen glossing_type=conf.GlossingType-- variabel global elseglossing_type=set_glossing_type(args.glossing) end localgloss,label,wikilink=args[1],args[2],args[3] ifnotglossthenUserMessages:add("error","Tidak ada glosarium yang diberikan") returnUserMessages:print()end ifwikilinkandnotargs.glossingthen-- jika pranala wiki diberikan dan glosarium tidak diatur ke 'label'... glossing_type='wikilink'end-- .. maka pranala wiki akan diformat sebagaimana mestinya iflabel==""thenlabel=nilend ifwikilink==""thenwikilink=nilend localresult=format_gloss(gloss,label,wikilink) returnresult end -------------------- -- Berikut ini adalah fungsi yang dipanggil oleh Templat:Interlinear. -- Fungsi ini memproses argumen templat, lalu memanggil parse() untuk memisahkan baris masukan menjadi kata-kata -- dan kemudian membangun html keluaran. -------------------- functionp.interlinearise(frame) --------------------- -- Menyiapkan argumen --------------------- localif_auto_translit=false localargs=getArgs(frame,{-- konfigurasi untuk Module:Arguments trim=true, removeBlanks=false, parentFirst=true, wrappers={'Template:Interlinear','Template:Fs interlinear'}, }) localtemplate_name=frame:getParent():getTitle() iftemplate_name=='Template:Fs interlinear'then args.italics1=args.italics1or"no" args.italics2=args.italics2or"yes" args.glossing3=args.glossing3or"yes" ifargs.langandnotargs.lang2thenargs.lang2=args.lang.."-Latn"end ifargs.translandnotargs.transl2thenargs.transl2=args.translend if_auto_translit=true end localrevid=frame:preprocess("{{REVISIONID}}") ifrevid==""then ifnotargs['display-messages']oryesno(args['display-messages'])then displaying_messages=trueend-- pesan hanya akan ditampilkan pada mode pratayang end msg=UserMessages localline={} localfunctionset_italics(n) line[n].attr.style=line[n].attr.style.."font-style: italic;" line[n].tone_sup=true-- angka tunggal diasumsikan sebagai penanda nada sehingga akan dijadikan superskrip ifargs['tone-superscripting']andnotyesno(args['tone-superscripting']) thenline[n].tone_sup=falseend end ifargs.glossingthen-- parameter glossing= menetapkan tipe glosarium bawaan local_gl=set_glossing_type(args.glossing) if_glthenconf.GlossingType=_glend end --ini mencari daftar singkatan glosarium pada halaman yang mentransklusikan templat: local_ablist_section=get_section(frame,'list-of-glossing-abbreviations') if_ablist_sectionand_ablist_section~=""then local_a=mw.ustring.gsub(_ablist_section,'</?div [^\n]*>','')-- menghilangkan tag div set_custom_glosses(_a) end --dan ini mencari daftar singkatan yang ditetapkan di dalam templat: local_ablist=args.abbreviations if_ablistand_ablist~="" thenset_custom_glosses(_ablist)end local_ablist=args.ablist if_ablistand_ablist~="" thenset_custom_glosses(_ablist)end local_spacing=tonumber(args.spacing) if_spacingand_spacing<=20 thenconf.style.WordDiv=conf.style.WordDiv..'margin-right: '.._spacing..'em;' elseconf.style.WordDiv=conf.style.WordDiv..conf.style.WordMargin end localoffset,last_line=0,0 forj,vinipairs(args)do-- mengiterasi parameter tanpa nama dari templat last_line=last_line+1 ifis_empty(v) thenoffset=offset+1 else locali=j-offset line[i]={} v=normalise(v) -- berikut ini adalah bagian dari uji coba penerapan transliterasi otomatis: ifif_auto_translitandv=="auto"andi>1then localsource_line=line[i-1] localsrc_lang=source_line.lang ifnotsrc_langthensrc_lang=args.langend ifsrc_langthen v=transliterate(source_line.whole,src_lang) elsev="";msg:add("error","Tidak ada bahasa yang ditentukan untuk transliterasi otomatis") end end-- akhir blok uji coba line[i].whole=v line[i].length=mw.ustring.len(v) local_c=args["c"..i] if_cand_c~=""then line.hasComments=true line[i].c=_c end ---menyiapkan argumen gaya---- line[i].class="" local_style=args["style"..i] ifnot_stylethen_style="" else_style=tidyCss(_style)end --line[i].attr menyimpan atribut untuk elemen <p> yang mengapit kata-kata pada baris i line[i].attr={style=conf.style.WordP.._style} local_lang=args["lang"..i] if_langand#_lang>1then line[i].lang=_lang else_lang=args.lang if_langand#_lang>1andi==1then-- jika parameter lang= diberikan, diasumsikan berlaku untuk baris 1 line[i].lang=_lang end end line[i].attr.lang=line[i].lang --berikut ini meniru perilaku {{Bo-textonly}} (lihat Template talk:Fs interlinear#Tibetan): iftemplate_name=='Template:Fs interlinear'then if_lang=="bo"andi==1then line[1].class=line[1].class.." uchen" line[1].attr.style=line[1].attr.style.."font-size:1.25em; word-wrap:break-word;" end end --berikut ini meniru perilaku {{Spell-nv}}: iftemplate_name=='Template:Interlinear'then if_lang=="nv"andi==1then line[1].attr.style=line[1].attr.style.."font-family: Aboriginal Sans, DejaVu Sans, Calibri, Arial Unicode MS, sans-serif;" end end ifyesno(args["italics"..i])then set_italics(i) end local_transl=args["transl"..i] if_transland#_transl>1then _transl=mw.ustring.lower(_transl) local_lookup=lang_data.translit_title_table[_transl] if_lookupthen if_langand_lookup[_lang]then _transl=_lookup[_lang] else_transl=_lookup.default end if_translthen line[i].attr.title=_transl end elsemsg:add("error","Skema transliterasi '".._transl.."' tidak dikenali") end end local_glossing=args["glossing"..i] if_glossingthen line[i].glossing=set_glossing_type(_glossing) -- Jangan menganggap pengaturan glosarium bawaan sebagai kustom. ifnot((i==1andnotyesno(_glossing))or(i==2andyesno(_glossing)))then line.HasCustomGlossing=true end end local_ipa=args['ipa'..i] ifyesno(_ipa)then line[i].class="IPA" end local_class=args['class'..i] if_classthen line[i].class=line[i].class.." ".._class end ifline[i].class=="" thenline[i].class=nilend end-- mengakhiri pernyataan if pertama di dalam loop end-- mengakhiri siklus FOR localline_count=#line ifline_count==0then msg:add("error",template_name..": tidak ada baris yang diberikan.") returnmsg:print_errors() end ifline_count>1then local_italics=args.italics localn=tonumber(_italics) ifnandn>0then set_italics(n) elseifnot(_italicsandnotyesno(_italics))andnot(args["italics1"]andnotyesno(args["italics1"]))then set_italics(1)-- secara bawaan, baris pertama akan dicetak miring, kecuali italics=no atau italics1=no end -- parameter tanpa nama yang terakhir diasumsikan sebagai terjemahan bebas: free_translation=args[last_line] ifnotis_empty(free_translation)then line[line_count]=nilend--... dan dengan demikian dikecualikan dari proses interlinearisasi end -- Jika glosarium tidak ditentukan untuk baris mana pun, maka secara bawaan dipilih untuk terjadi -- pada baris kedua, kecuali hanya satu baris yang diberikan, dalam hal ini -- diasumsikan bahwa baris tersebut yang berisi glosarium gramatikal ifyesno(args.glossing)==falsethen line.HasCustomGlossing=true end ifnotline.HasCustomGlossingthen ifline_count==1then line[1].glossing=conf.GlossingType elseifline[2]then line[2].glossing=conf.GlossingType end end set_global_glossing_settings{style=args['glossing-style'],underline=args.underline,small_caps=args['small-caps']} --------------------- -- Mensegmentasi baris menjadi kata-kata --------------------- fori,vinipairs(line)do localifglossing=false ifline[i].glossingthen ifglossing=true-- jika bernilai true, parser akan mencoba memformat singkatan glosarium pada baris saat ini glossing_type=line[i].glossing-- tentu saja merupakan variabel global end localwc,n=1,1 line[i].words={} whilen<=line[i].lengthdo buffer="" n=parse(line[i],n,0,ifglossing)+2 line[i].words[wc]=buffer wc=wc+1 end end ----Memeriksa ketidaksesuaian jumlah kata antarbaris---- localnumber_of_words,mismatch_found=0,false fori,vinipairs(line)do-- mencari jumlah kata maksimum pada setiap baris localwc=#line[i].words ifwc~=number_of_wordsthen ifi~=1andwc~=0then mismatch_found=true end ifwc>number_of_wordsthen number_of_words=wc end end end ----Menangani ketidaksesuaian--- ifmismatch_foundthen localerror_text="Ketidaksesuaian jumlah kata antarbaris: " fori,vinipairs(line)do localwc=#line[i].words error_text=error_text..wc.." kata dalam baris "..i..", " ifwc~=number_of_wordsthen forcurrent_word=wc+1,number_of_wordsdo line[i].words[current_word]=" " end end end ifstring.sub(error_text,-2)==", " thenerror_text=string.sub(error_text,1,#error_text-2).." " end error_text=error_text..help_link("mismatch") UserMessages:add("error",error_text) end --------------------- -- Membangun HTML --------------------- ---- Jika hanya satu baris yang diberikan, format sebagai teks sebaris (inline) ifline_count==1then localspan=mw.html.create('span') span:attr(line[1].attr) forwi=1,number_of_wordsdo localspace ifwi<number_of_wordsthenspace=" "elsespace=""end span:wikitext(line[1].words[wi]..space) end returntostring(span) end ---- Lebih dari satu baris yang diberikan, jadi kita akan menghasilkan tampilan interlinear localdiv=mw.html.create("div") div:addClass(conf.class.Interlinear) -- Untuk sesuatu yang akan ditampilkan di margin kiri, seperti penomoran contoh localnumber,indent=nil,nil ifargs.numberandargs.number~="" thennumber=args.numberend ifargs.indentandargs.indent~="" thenindent=args.indentend ifindentornumberthen ifnotindentthenindent="4"end--nilai bawaan div:css("margin-left",indent..'em') ifnumberthen div:tag("div") :css("position","absolute") :css("left","1em") :wikitext(args.number) end end ifargs.boxandargs.box~=""then div:css("background-color","#f8f9fa") :css("border","1px solid #eaecf0") :css("padding","1em")end ifargs.topandargs.top~=""then--baris yang ditampilkan di atas blok interlinear div:tag("div") :wikitext(args.top) end -- Memproduksi blok interlinear forwi=1,number_of_wordsdo localdiv2=div:tag("div") :attr("style",conf.style.WordDiv) fori,_inipairs(line)do ifline[i].whole~=""then-- melewati baris kosong localp=div2:tag("p") p:attr(line[i].attr) ifline[i].classthen p:addClass(line[i].class) end local_text=line[i].words[wi] if_text==""or_text==" " then_text=" "end-- elemen <p> tanpa konten mengacaukan tampilan interlinear p:wikitext(_text) end end end --- Jika ada "komentar" yang telah ditentukan, tambahkan di akhir setiap baris ifline.hasCommentsthen localdivc=div:tag("div") :attr("style",conf.style.WordDiv) fori,_inipairs(line)do localp=divc:tag("p") p:attr("style",conf.style.WordP) ifline[i].cthen p:wikitext(line[i].c) elsep:wikitext(" ") end end end --Tambahkan baris tersembunyi yang berisi konten dari setiap baris teks interlinear: ini untuk aksesibilitas fori,vinipairs(line)do localhidden_line=div:tag("p") hidden_line:attr("style",conf.style.HiddenText) :wikitext(v.whole) end -- Memformat terjemahan bebas localft_line=div:tag("p") iffree_translationandfree_translation~=""then ft_line:attr("style","clear: left;") ft_line:wikitext(free_translation) end ifargs.bottomandargs.bottom~="" thenlocalbottom=div:tag('p') bottom:css('margin-top','0') bottom:wikitext(args.bottom) end ft_line:node(msg:print_errors())-- untuk pesan kesalahan localend_div=div:tag("div") end_div:attr("style",conf.style.EndDiv) div:newline() localtemp_track="" iflast_line==2 thentemp_track="[[Kategori:Halaman dengan glosarium interlinear menggunakan dua parameter tanpa nama]]" end iflast_line>3andtemplate_name~='Templat:Fs interlinear' thentemp_track="[[Kategori:Halaman dengan glosarium interlinear yang menggunakan lebih dari tiga parameter tanpa nama]]" end returntostring(div)..temp_track..msg:print_warnings() end returnp