Module:TaxonItalics (talk · edit · Module:TaxonItalics · links · doc · subpages · sandbox · testcases)
| Modul Lua ini digunakan pada sekitar 165.000 halaman. Untuk mencegah suntingan mengganggu skala besar dan beban peladen, setiap perubahan harus diuji di subhalaman /bak pasir atau /kasus uji Modul:TaxonItalics, atau bak pasir modul Anda. Perubahan yang telah diuji kemudian dapat ditambahkan ke halaman ini dalam satu suntingan. Pertimbangkan untuk mendiskusikan perubahan di halaman pembicaraan sebelum mengimplementasikannya. |
TujuanTujuan
Modul ini terutama dimaksudkan untuk digunakan oleh sistem kotak takson otomatis. Modul ini mendukung penulisan miring (italik) yang benar untuk nama ilmiah. Nama botani (ICNafp) dapat mengandung "kata penghubung"; bagian-bagian ini tidak boleh ditulis miring. Simbol hibrida, ×, juga tidak boleh ditulis miring. Modul ini secara opsional membuat pranala wiki (wikilink) dan menyingkat nama yang ditulis miring.
Untuk taksa selain virus, penulisan miring digunakan pada peringkat genus atau di bawahnya. Modul ini tidak menentukan apakah suatu nama ilmiah harus ditulis miring. Gunakan {{Is italic taxon}} untuk tujuan ini.
Cara penggunaanCara penggunaan
- {{#invoke:TaxonItalics|main|TAXON_NAME}} – menulis miring nama takson
- {{#invoke:TaxonItalics|main|TAXON_NAME|linked=yes}} – menulis miring nama takson, membuat wikilink pada keluaran miring ke masukan yang tidak diubah
- {{#invoke:TaxonItalics|main|TAXON_NAME|abbreviated=yes}} – menulis miring nama takson, menyingkat semua bagian kecuali bagian terakhir menjadi huruf pertama
- {{#invoke:TaxonItalics|main|TAXON_NAME|dab=yes}} – menulis miring nama takson, menganggap bagian dalam tanda kurung sebagai istilah disambiguasi, dan tidak menulis bagian itu miring
Parameter dapat digabungkan. Modul ini juga dapat digunakan melalui {{Taxon italics}}.
ContohContoh
Hanya ditulis miringHanya ditulis miring
- Kata penghubung
- Pinus subg. Pinus → Pinus subg. Pinus
- P. subgenus Pinus → P. subg. Pinus
- P. subsect. Pinaster → P. subsect. Pinaster
- Acer tataricum subsp. ginnala → Acer tataricum subsp. ginnala
- Aster ericoides var. ericoides → Aster ericoides var. ericoides
- A. ericoides varietas ericoides → A. ericoides var. ericoides
- A. e. subvar. ericoides → A. e. subvar. ericoides
Nama botani hanya boleh mengandung satu epithet infraspesis; sebuah string seperti "Fragaria vesca subsp. vesca f. semperflorens" adalah suatu klasifikasi, bukan nama, dan tidak ditangani oleh modul ini.
- Simbol hibrida
- Elaeagnus × submacrophylla → Elaeagnus × submacrophylla
- ×Beallara → ×Beallara
- × Beallara → × Beallara
- {{hybrid}}Beallara → ×
Beallara
Dengan pranala (linked)Dengan pranala (linked)
Menggunakan |linked=yes
- Populus sect. Aigeiros → Populus sect. Aigeiros
- Elaeagnus × submacrophylla → Elaeagnus × submacrophylla
Disingkat (abbreviated)Disingkat (abbreviated)
Menggunakan |abbreviated=yes
- Populus sect. Aigeiros → P. sect. Aigeiros
- Acer tataricum subsp. ginnala → A. t. subsp. ginnala
- [juga dilink] × Sorbaronia fallax → × S. fallax
- [juga dilink] Elaeagnus × submacrophylla → E. × submacrophylla
- Elaeagnus ×submacrophylla → E. ×submacrophylla
- Elaeagnus {{hybrid}} submacrophylla → E. ×
. submacrophylla
Istilah disambiguasiIstilah disambiguasi
Secara default, bagian nama takson yang berada dalam tanda kurung dianggap sebagai nama subgenus, dan ditulis miring:
- Varanus (Hapturosaurus) → Varanus (Hapturosaurus)
- Caia (plant) → Caia (plant) – salah
Untuk memperlakukan bagian dalam tanda kurung sebagai istilah disambiguasi, gunakan |dab=yes
- Caia (plant) → Caia (plant)
- (juga dilink) Caia (plant) → Caia (plant)
Untuk contoh lebih lengkap, lihat testcases.
Penyunting dapat melakukan uji coba pada halaman bak pasir (buat | cermin) dan kasus uji (buat) modul ini.
Subhalaman modul ini.
--[[========================================================================= Italicize a taxon name appropriately by invoking italicizeTaxonName. The algorithm used is: * If the name has italic markup at the start or the end, do nothing. * Else * Remove (internal) italic markup. * If the name is made up of four words and the third word is a botanical connecting term, de-italicize the connecting term and add italic markup to the outside of the name. * Else if the name is made up of three words and the second word is a botanical connecting term or a variant of "cf.", de-italicize the connecting term and add italic markup to the outside of the name. * Else just add italic markup to the outside of the name. The module also: * Ensures that the hybrid symbol, ×, and parentheses are not italicized, as well as any string inside parentheses if dab is true. * Has an option to abbreviate all parts of taxon names other than the last to the first letter (e.g. "Pinus sylvestris var. sylvestris" becomes "P. s. var. sylvestris"). * Has an option to wikilink the italicized name to the input name. =============================================================================]] localp={} locall={}-- used to store purely local functions --connecting terms in three part names (e.g. Pinus sylvestris var. sylvestris) localcTerms3={ --subsp. subspecies="subsp.", ["subsp."]="subsp.", subsp="subsp.", ["ssp."]="subsp.", ssp="subsp.", --var. varietas="var.", ["var."]="var.", var="var.", --subvar. subvarietas="subvar.", ["subvar."]="subvar.", subvar="subvar.", --f. forma="f.", ["f."]="f.", f="f.", --subf. subforma="subf.", ["subf."]="subf.", subf="subf." } --connecting terms in two part names (e.g. Pinus sect. Pinus) localcTerms2={ --subg. subgenus="subg.", ["subgen."]="subg.", ["subg."]="subg.", subg="subg.", --supersect. supersection="supersect.", ["supersect."]="supersect.", supersect="supersect.", --sect. section="sect.", ["sect."]="sect.", sect="sect.", --subsect. subsection="subsect.", ["subsect."]="subsect.", subsect="subsect.", --ser. series="ser.", ["ser."]="ser.", ser="ser.", --subser. subseries="subser.", ["subser."]="subser.", subser="subser.", --cf. cf="cf.", ["cf."]="cf.", ["c.f."]="cf." } --[[========================================================================= Main function to italicize a taxon name appropriately. For the purpose of the parameters, see p.italicizeTaxonName(). =============================================================================]] functionp.main(frame) localname=frame.args[1]or'' locallinked=frame.args['linked']=='yes' localabbreviated=frame.args['abbreviated']=='yes' localdab=frame.args['dab']=='yes' returnp.italicizeTaxonName(name,linked,abbreviated,dab) end --[[========================================================================= Utility local function to abbreviate an input string to its first character followed by ".". Both "×" and an HTML entity at the start of the string are skipped over in determining first character, as is an opening parenthesis and an opening ", which cause a matching closing character to be included. =============================================================================]] functionl.abbreviate(str) localresult="" localhasParentheses=false localisQuoted=false ifmw.ustring.len(str)<2then --single character strings are left unchanged result=str else --skip over an opening parenthesis that could be present at the start of the string ifmw.ustring.sub(str,1,1)=="("then hasParentheses=true result="(" str=mw.ustring.sub(str,2,mw.ustring.len(str)) elseifmw.ustring.sub(str,1,1)=='"'then isQuoted=true result='"' str=mw.ustring.sub(str,2,mw.ustring.len(str)) end --skip over a hybrid symbol that could be present at the start of the string ifmw.ustring.sub(str,1,1)=="×"then result="×" str=mw.ustring.sub(str,2,mw.ustring.len(str)) end --skip over an HTML entity that could be present at the start of the string ifmw.ustring.sub(str,1,1)=="&"then locali,dummy=mw.ustring.find(str,";",2,plain) result=result..mw.ustring.sub(str,1,i) str=mw.ustring.sub(str,i+1,mw.ustring.len(str)) end --if there's anything left, reduce it to its first character plus ".", --adding the closing parenthesis or quote if required ifstr~=""then result=result..mw.ustring.sub(str,1,1).."." ifhasParenthesesthenresult=result..")" elseifisQuotedthenresult=result..'"' end end end returnresult end --[[========================================================================= The function which does the italicization. Parameters: name (string) – the taxon name to be processed linked (boolean) – should a wikilink be generated? abbreviated (boolean) – should the first parts of the taxon name be reduced to capital letters? dab (boolean) – should any parenthesized part be treated as a disambiguation term and left unitalicized? =============================================================================]] functionp.italicizeTaxonName(name,linked,abbreviated,dab) name=mw.text.trim(name) -- if the name begins with '[', then assume formatting is present ifmw.ustring.sub(name,1,1)=='['thenreturnnameend -- otherwise begin by replacing any use of the HTML italic tags -- by Wikimedia markup; replace any entity alternatives to the hybrid symbol -- by the symbol itself; prevent the hybrid symbol being treated as -- a 'word' by converting a following space to the HTML entity localitalMarker="''" name=string.gsub(mw.text.trim(name),"</?i>",italMarker) name=string.gsub(string.gsub(name,"×","×"),"×","×") name=string.gsub(name,"</?span.->","")-- remove any span markup name=string.gsub(name,"× ","× ") -- now italicize and abbreviate if required localresult=name ifname~=''then ifstring.sub(name,1,2)==italMarkerorstring.sub(name,-2)==italMarkerthen -- do nothing if the name already has italic markers at the start or end else name=string.gsub(name,italMarker,"")-- first remove any internal italics localwords=mw.text.split(name," ",true) if#words==4andcTerms3[words[3]]then -- the third word of a four word name is a connecting term -- ensure the connecting term isn't italicized words[3]='<span style="font-style:normal;">'..cTerms3[words[3]]..'</span>' ifabbreviatedthen words[1]=l.abbreviate(words[1]) words[2]=l.abbreviate(words[2]) end result=words[1].." "..words[2].." "..words[3].." "..words[4] elseif#words==3andcTerms2[words[2]]then -- the second word of a three word name is a connecting term -- ensure the connecting term isn't italicized words[2]='<span style="font-style:normal;">'..cTerms2[words[2]]..'</span>' ifabbreviatedthen words[1]=l.abbreviate(words[1]) end result=words[1].." "..words[2].." "..words[3] else -- not a name as above; only deal with abbreviation ifabbreviatedthen if#words>1then result=l.abbreviate(words[1]) fori=2,#words-1,1do result=result.." "..l.abbreviate(words[i]) end result=result.." "..words[#words] end else result=name end end -- deal with any hybrid symbol as it should not be italicized result=string.gsub(result,"×",'<span style="font-style:normal;">×</span>') -- deal with any parentheses as they should not be italicized ifdabthen result=string.gsub(string.gsub(result,"%(",'<span style="font-style:normal;">('),"%)",')</span>') else result=string.gsub(string.gsub(result,"%(",'<span style="font-style:normal;">(</span>'),"%)",'<span style="font-style:normal;">)</span>') end -- any question marks surrounded by spans can have the spans joined result=string.gsub(result,'</span>%?<span style="font%-style:normal;">','?') -- add outside markup iflinkedthen ifresult~=namethen result="[["..name.."|"..italMarker..result..italMarker.."]]" else result=italMarker.."[["..name.."]]"..italMarker end else result=italMarker..result..italMarker end end end returnresult end --[[========================================================================= Utility function used by other modules to check if a connecting term is present in a name. The value of name is assumed to be plain text. =============================================================================]] functionp.hasCT(frame) returnp.hasConnectingTerm(frame.args[1]or'') end functionp.hasConnectingTerm(name) localwords=mw.text.split(name," ",true) if#words==4andcTerms3[words[3]]thenreturntrue elseif#words==3andcTerms2[words[2]]thenreturntrue elsereturnfalse end end returnp