Dokumentasi di atas ditransklusikan dari Modul:Cite Q/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.
-- Version: 2021-02-21 localp={} require('strict') localwdib=require('Module:WikidataIB') localgetValue=wdib._getValue localgetPropOfProp=wdib._getPropOfProp localfollowQid=wdib._followQid localgetPropertyIDs=wdib._getPropertyIDs locali18n={ ["unknown-author"]=mw.wikibase.getLabel("Q4233718"):gsub("^%l",mw.ustring.upper), ["unknown-author-trackingcat"]="[[Category:Cite Q - pengarang tak diketahui]]", ["ordinal"]={ [1]="", [2]="", [3]="", ["default"]="" }, ["months"]={ "Januari","Februari","Maret","April","Mei","Juni", "Juli","Agustus","September","Oktober","November","Desember" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal=function(cardinal) localcard=tonumber(cardinal) ifnotcardthenreturncardinalend localordsuffix=i18n.ordinal.default ifcard%10==1then ordsuffix=i18n.ordinal[1] elseifcard%10==2then ordsuffix=i18n.ordinal[2] elseifcard%10==3then ordsuffix=i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if(card%100==11)or(card%100==12)or(card%100==13)then ordsuffix=i18n.ordinal.default end returncard..ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section localsimple_properties={ publisher={id="P123",maxvals=1}, oclc={id="P243",maxvals=1}, ['publication-place']={id="P291",maxvals=0,linked='no'},-- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi={id="P356",maxvals=1},-- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue={id="P433",maxvals=0,populate_from_journal=true},-- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid={id="P698",maxvals=1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv={id="P818",maxvals=1}, bibcode={id="P819",maxvals=1},-- take care of |bibcode-access=? jstor={id="P888",maxvals=1},-- take care of |jstor-access=? mr={id="P889",maxvals=1}, rfc={id="P892",maxvals=1}, zbl={id="P894",maxvals=1}, ssrn={id="P893",maxvals=1}, place={id="P1071",maxvals=0,linked='no'},-- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid={id="P8299",maxvals=1},-- take care of |s2cid-access=? pmc={id="P932",maxvals=1},-- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn={id="P1144",maxvals=1}, hdl={id="P1184",maxvals=1},-- take care of |hdl-access=? ismn={id="P1208",maxvals=1}, journal={id="P1433",maxvals=1}, citeseerx={id="P3784",maxvals=1}, osti={id="P3894",maxvals=1},-- take care of |osti-access=? biorxiv={id="P3951",maxvals=1}, asin={id="P5749",maxvals=1},-- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn={id="P212",maxvals=1,populate_from_journal=true},-- ISBN 13 issn={id="P236",maxvals=1,populate_from_journal=true},-- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter={id="P792",maxvals=1}, ['publication-date']={id="P577",maxvals=1,populate_from_journal=true},-- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series={id="P179",maxvals=1,populate_from_journal=true}, version={id="P348",maxvals=0}, edition={id="P393",maxvals=0}, volume={id="P478",maxvals=0,populate_from_journal=true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title={id="P1476",rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages={id="P304",maxvals=0,populate_from_journal=true}, at={id="P958",maxvals=0,populate_from_journal=true},-- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator={id="P110",maxvals=10,others=true},-- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer={id="P86",maxvals=10,others=true},-- goes to "others" section animator={id="P6942",maxvals=10,others=true},-- goes to "others" section director={id="P57",maxvals=10,others=true},-- goes to "others" section screenwriter={id="P58",maxvals=10,others=true},-- goes to "others" section signatory={id="P1891",maxvals=10,others=true},-- goes to "others" section presenter={id="P371",maxvals=10,others=true},-- goes to "others" section performer={id="P175",maxvals=10,others=true},-- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] localfunctionis_set(var) returnnot(var==nilorvar=='') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] localfunctionin_array(needle,haystack) ifneedle==nilthen returnfalse end forn,vinipairs(haystack)do ifv==needlethen returnn end end returnfalse end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] localfunctionaccept_value(param_val,wd_val) localval=param_val ifvalthen ifin_array(val,{'accept','))((',':d:'})then val='(('..wd_val..'))' elseif'((accept))'==valthen val='accept' elseif'(())(())'==valthen val='))((' elseif'((:d:))'==valthen val=':d:' else val=wd_val end end returnval end -- function to fetch a value to display localfunctionmakelink(v,out,link,maxpos,wdl) locallabel ifv.mainsnak.snaktype=="value"then ifv.mainsnak.datatype=="wikibase-item"then localqnumber=v.mainsnak.datavalue.value.id localsitelink=mw.wikibase.getSitelink(qnumber) ifqnumber=="Q2818964"thensitelink=nilend-- suppress link to "Various authors" ifv.qualifiersandv.qualifiers.P1932then label=v.qualifiers.P1932[1].datavalue.value elseifv.qualifiersandv.qualifiers.P1810then label=v.qualifiers.P1810[1].datavalue.value else label=mw.wikibase.getLabel(qnumber) iflabelthen label=mw.text.nowiki(label) else label=qnumber-- should add tracking category end end localposition=maxpos+1-- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. ifv["qualifiers"]andv.qualifiers["P1545"]andv.qualifiers["P1545"][1]then position=tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos=math.max(maxpos,position) ifsitelinkthen -- just the plain name, -- but keep a record of the links, using the same index out[position]=label link[position]=sitelink else ifwdlthen -- show that there's a Wikidata entry available out[position]="[[:d:Q"..v.mainsnak.datavalue.value["numeric-id"].."|"..label.."]] <span title='"..i18n["errors"]["local-article-not-found"].."'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position]=label end end elseifv.mainsnak.datatype=="string"then localposition=maxpos+1-- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. ifv["qualifiers"]andv.qualifiers["P1545"]andv.qualifiers["P1545"][1]then position=tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos=math.max(maxpos,position) out[position]=v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" ifv.qualifiersandv.qualifiers.P1932then label=v.qualifiers.P1932[1].datavalue.value elseifv.qualifiersandv.qualifiers.P1810then label=v.qualifiers.P1810[1].datavalue.value else label=i18n["unknown-author"]..(i18n["unknown-author-trackingcat"]or"") end maxpos=maxpos+1 out[maxpos]=label end returnmaxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] localfunctionget_name_list(nl_type,args,qid,wdl) localpropertyID="P50" localfallbackID="P2093"-- author name string ifnl_type=="author"then propertyID='P50'-- for authors fallbackID='P2093'-- author-string elseifnl_type=="editor"then propertyID='P5769'-- "editor-in-chief" fallbackID='P98'-- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseifnl_type=="translator"then propertyID='P655'-- for translators fallbackID=nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return-- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false ifwdland(#wdl>0)then wdl=wdl:lower() wdl=in_array(wdl,{"false","no","0"}) else -- wdl is empty, so wdl=false end localprops=nil localfallback=nil ifmw.wikibase.entityExists(qid)then props=mw.wikibase.getAllStatements(qid,propertyID) ifpropsandfallbackIDthen fallback=mw.wikibase.getAllStatements(qid,fallbackID) end end -- Make sure it actually has at least one of the properties requested ifnot(propsandprops[1])andnot(fallbackandfallback[1])then returnnil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article localout={} locallink={} localmaxpos=0 ifpropsandprops[1]then fork,vinpairs(props)do maxpos=makelink(v,out,link,maxpos,wdl) end end iffallbackandfallback[1]then -- second properties fork,vinpairs(fallback)do maxpos=makelink(v,out,link,maxpos,wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering localkeys={} fork,vinpairs(out)do keys[#keys+1]=k end table.sort(keys)-- as they might be out of order fori,kinipairs(keys)do mw.log(i.." "..k.." "..(out[k])) ifargs[nl_type..i]then-- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name iflink[k]and(args[nl_type..i]==out[k])then args[nl_type..'-link'..i]=args[nl_type..'-link'..i]orlink[k]-- author-linkn or editor-linkn end else-- name does not get overwritten, so pull name from WD args[nl_type..i]=out[k] iflink[k]then args[nl_type..'-link'..i]=args[nl_type..'-link'..i]orlink[k]-- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table functionp._getLangOfProp(qid,pid) ifnotpidthenreturn{}end localout={} localprops=mw.wikibase.getAllStatements(qid,pid) fori,vinipairs(props)do ifv.mainsnak.datatype=="monolingualtext"andv.mainsnak.datavaluethen out[#out+1]=v.mainsnak.datavalue.value.language end end returnout end functionp.getLangOfProp(frame) localpid=frame.args.pidormw.text.trim(frame.args[1]or"") ifpid==""thenreturnend localqid=frame.args.qid ifqid==""thenqid=nilend returntable.concat(p._getLangOfProp(qid,pid),", ") end -- gets the language codes of a Wikidata entry as a table localfunction_lang_code(qid) locallc=getPropOfProp({qid=qid,prop1="P407",prop2="P424",ps=1}) iflcthenreturnmw.text.split(lc,"[, ]+")end lc=getPropOfProp({qid=qid,prop1="P407",prop2="P218",ps=1}) iflcthenreturnmw.text.split(lc,"[, ]+")end returnp._getLangOfProp(qid,"P1476") end functionp.lang_code(frame) returntable.concat(_lang_code(frame.args.qidormw.text.trim(frame.args[1]or"")),", ") end -- export for debug functionp.getPropOfProp(frame) returngetPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set localfunctionwrap_nowiki(str,disable) ifdisablethenreturnstror''end returnmw.text.nowiki(stror'') end -- sort sequence table whose values are key-value pairs by key localfunctioncomp_key(a,b) returna[1]<b[1] end -- sort sequence table whose values are key-value pairs by value localfunctioncomp_val(a,b) returna[2]<b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] functionp._cite_q(citeq_args) localframe=mw.getCurrentFrame() -- parameters that don't get passed to Citation localexpand=citeq_args.expand-- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> localqid=citeq_args[1]orciteq_args.qid localwdl=citeq_args.wdl localtemplate=citeq_args.template citeq_args.expand=nil citeq_args[1]=nil citeq_args.qid=nil citeq_args.wdl=nil citeq_args.template=nil -- if title supplied, flag to not read html title localtitleforced=(citeq_args.title~=nil) localoth={} -- put the language codes into a sequential table langcodes[] locallangcodes={} ifciteq_args.languagethen -- check these are a supported language codes forlcinmw.text.gsplit(citeq_args.language,"[, ]+",false)do langcodes[#langcodes+1]=mw.language.isSupportedLanguage(citeq_args.language)andciteq_args.language end end ifnotlangcodes[1]then -- try to find language of work langcodes=_lang_code(qid) end ifnotlangcodes[1]then -- try fallback to journal's language localjournal_qid=followQid({qid=qid,props="P1433"}) langcodes=journal_qidand_lang_code(journal_qid) end citeq_args.language=citeq_args.languageortable.concat(langcodes,", ") -- loop through list of simple properties and get their values in citeq_args forname,datainpairs(simple_properties)do citeq_args[name]=getValue({data.id,fwd="ALL",osd="no",noicon="true",qid=qid,maxvals=data.maxvals,linked=data.linked,rank=data.rankor"best",citeq_args[name]}) ifdata.populate_from_journalthen localpublishedin=getValue({"P1433",ps=1,qid=qid,maxvals=0,citeq_args[name],qual=data.id,qualsonly='yes'}) citeq_args[name]=publishedinorgetPropOfProp({qid=qid,prop1="P1433",prop2=data.id,maxvals=data.maxvals,ps=1}) end ifciteq_args[name]andciteq_args[name]:find('[[Category:Artikel tanpa informasi Wikidata]]',1,true)then -- try fallback to work's native language citeq_args[name]=getValue({data.id,ps=1,qid=qid,maxvals=data.maxvals,linked="no",lang=langcodes[1]}) ifciteq_args[name]:find('^Q%d+$')then-- qid was returned -- try fallback to qid's native language localqid_languages=_lang_code(citeq_args[name]) citeq_args[name]=getValue({data.id,ps=1,qid=qid,maxvals=data.maxvals,linked="no",lang=qid_languages[1]}) ifciteq_args[name]:find('^Q%d+$')then-- qid was returned again citeq_args[name]=nil else -- record the language found if no lang specified citeq_args.language=citeq_args.languageorqid_languages[1] end end end ifdata.othersthen oth[#oth+1]=citeq_args[name]and(name:gsub("^%l",string.upper)..": "..citeq_args[name]) citeq_args[name]=nil end end citeq_args.others=citeq_args.othersortable.concat(oth,". ") ifciteq_args.others==""then citeq_args.others=nil end citeq_args.journal=citeq_args.journalandciteq_args.journal:gsub("^''",""):gsub("''$",""):gsub("|''","|"):gsub("'']]","]]") citeq_args.ol=(getValue({"P648",ps=1,qid=qid,maxvals=1,citeq_args.ol})or''):gsub("^OL(.+)$","%1") ifciteq_args.ol==""then citeq_args.ol=nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv=citeq_args.biorxivand("10.1101/"..citeq_args.biorxiv) citeq_args.isbn=getValue({"P957",ps=1,qid=qid,maxvals=1,rank="best",citeq_args.isbn})-- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url localurl ifnotciteq_args.urlthen fori,prinipairs({"P953","P856","P2699"})do url=getValue({pr,ps=1,qid=qid,maxvals=1,qual="P1065"}) ifurlthen citeq_args.url=mw.text.split(url," (",true)[1] localarcurl=mw.ustring.match(url,"%((.*)%)") ifarcurlthen localarcy,arcm,arcd=arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") ifarcyandarcmandarcdthen citeq_args["archive-url"]=arcurl citeq_args["archive-date"]=tonumber(arcd).." "..i18n.months[tonumber(arcm)].." "..arcy end end break end end end ifciteq_args.publisher=="Unknown"then-- look for "stated as" (P1932) localstated_as=getValue({"P123",ps=1,qid=qid,maxvals=1,qual="P1932",qo="y"}) ifstated_asthenciteq_args.publisher=stated_asend end ifnottitleforcedthen localhtmltitle=getValue({"P1476",qual="P6833",ps=1,qid=qid,maxvals=1,qo="y"}) ifhtmltitlethen citeq_args.title=htmltitle:gsub("</?i>","''") else localtitle_display=citeq_args.title ormw.wikibase.getLabel(qid) or(langcodes[1]andmw.wikibase.getLabelByLang(qid,langcodes[1])) or("No label or title -- debug: "..qid) ifciteq_args.urlthen citeq_args.title=wrap_nowiki(title_display) else localslink=mw.wikibase.getSitelink(qid) localslink_flag=false localwrap_title='' localwslink=false ifnotslinkthen -- See if we have wikisource ifnotciteq_args.urlthen localwikisource_sitelink=mw.wikibase.getSitelink(qid,"enwikisource")ornil ifwikisource_sitelinkthen slink=':s:'..wikisource_sitelink wslink=true end end end ifciteq_args.titlethen ifslinkthen wrap_title=wrap_nowiki(citeq_args.title) slink_flag=true else citeq_args.title=wrap_nowiki(citeq_args.title) end else ifslinkandnotwslinkthen ifslink:lower()==title_display:lower()then citeq_args.title='[['..slink..']]' else wrap_title=wrap_nowiki(slink:gsub("%s%(.+%)$",""):gsub(",.+$","")) slink_flag=true end elseifwslinkthen wrap_title=wrap_nowiki(title_display) slink_flag=true else citeq_args.title=wrap_nowiki(title_display) end end ifslink_flagthen ifslink==wrap_titleandnotwslinkthen-- direct link citeq_args.title='[['..slink..']]' else-- piped link citeq_args.title='[['..slink..'|'..wrap_title..']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time ifciteq_args.pageorciteq_args.pthen-- let single take precedence over multiple citeq_args.pages=nil citeq_args.pp=nil end ifciteq_args.pagesthen local_,count=string.gsub(citeq_args.pages,"[,;%s]%d+","") ifcount==1then citeq_args.page=citeq_args.pages citeq_args.pages=nil end end ifis_set(qid)then ifnotis_set(citeq_args.author)andnotis_set(citeq_args.author1) andnotis_set(citeq_args.subject)andnotis_set(citeq_args.subject1) andnotis_set(citeq_args.host)andnotis_set(citeq_args.host1) andnotis_set(citeq_args.last)andnotis_set(citeq_args.last1) andnotis_set(citeq_args.surname)andnotis_set(citeq_args.surname1) andnotis_set(citeq_args['author-last'])andnotis_set(citeq_args['author-last1'])andnotis_set(citeq_args['author1-last']) andnotis_set(citeq_args['author-surname'])andnotis_set(citeq_args['author-surname1'])andnotis_set(citeq_args['author1-surname1'])then-- if neither are set, try to get authors from Wikidata get_name_list('author',citeq_args,qid,wdl)-- modify citeq_args table with authors from Wikidata end ifnotis_set(citeq_args.editor)andnotis_set(citeq_args.editor1) andnotis_set(citeq_args['editor-last'])andnotis_set(citeq_args['editor-last1'])andnotis_set(citeq_args['editor1-last']) andnotis_set(citeq_args['editor-surname'])andnotis_set(citeq_args['editor-surname1'])andnotis_set(citeq_args['editor1-surname'])then-- if neither are set, try to get editors from Wikidata get_name_list('editor',citeq_args,qid,wdl)-- modify citeq_args table with editors from Wikidata end ifnotis_set(citeq_args.translator)andnotis_set(citeq_args.translator1) andnotis_set(citeq_args['translator-last'])andnotis_set(citeq_args['translator-last1'])andnotis_set(citeq_args['translator1-last']) andnotis_set(citeq_args['translator-surname'])andnotis_set(citeq_args['translator-surname1'])andnotis_set(citeq_args['translator1-surname'])then-- if neither are set, try to get translators from Wikidata get_name_list('translator',citeq_args,qid,wdl)-- modify citeq_args table with translators from Wikidata end end fork,vinpairs(citeq_args)do ifin_array(v,{'(())','unset','ignore'})or'string'~=type(k)then-- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k]=nil elseifin_array(v,{'((unset))','((ignore))'})then-- strip off markup for free-text values clashing with local keywords citeq_args[k]='unset' end end localauthor_count=0 fork,vinpairs(citeq_args)do ifk:find("^author%d+$")then author_count=author_count+1 end end ifauthor_count>8then-- convention in astronomy journals, optional mode for this? citeq_args['display-authors']=citeq_args['display-authors']or3 end localeditor_count=0 fork,vinpairs(citeq_args)do ifk:find("^editor%d+$")then editor_count=editor_count+1 end end ifeditor_count>8then-- convention in astronomy journals, optional mode for this? citeq_args['display-editors']=citeq_args['display-editors']or3 end -- change edition to ordinal if it's set and numeric citeq_args.edition=citeq_args.editionandp.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) ifciteq_args.isbnthen template=templateor"book" citeq_args.asin=nil-- suppress ASIN if ISBN exists elseifciteq_args.journalthen template=templateor"journal" elseifciteq_args.websitethen template=templateor"web" end -- template is CS1 designator: journal, web, news, etc. iftemplatethen citeq_args.mode=citeq_args.modeor"cs1" template="Cite "..template else citeq_args.mode=citeq_args.modeor"cs2" template="Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list locallist_sep='. ' ifciteq_args.mode~='cs1'then list_sep=', ' end localid='[[WDQ (pengenal)|Wikidata]] [[:d:'..qid..'|'..qid..']]'-- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. localold_id=citeq_args.id ifwdlthen-- show WD logo id=id..'[[File:Wikidata-logo.svg|16px|alt=|link=]]'-- possibly replace by WD edit icon? end ifis_set(old_id)then citeq_args.id=old_id..list_sep..id-- append to user-specified contents else citeq_args.id=id end -- clean up any blank parameters fork,vinpairs(citeq_args)do ifv==""thenciteq_args[k]=nilend end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like ifexpandthen localexpand_args={"{{"..template}-- init with citation template ifexpand=="self"then citeq_args.id=old_id-- restore original |id= parameter expand_args={"{{cite Q|"..qid}-- expand to itself end -- make a sortable table and sort it by param name localsorttable={} forparam,valinpairs(citeq_args)do table.insert(sorttable,{param,val}) end table.sort(sorttable,comp_key) -- add contents to expand_args foridx,valinipairs(sorttable)do table.insert(expand_args,val[1]..'='..val[2]) end -- make the nowiki'd string and done return"<code>"..table.concat(expand_args,' |').."}}</code>" end localerratumid=getPropertyIDs({"P2507",qid=qid,fwd="ALL",osd="no",rank="best",maxvals=1}) iferratumidthen erratumid=" [[d:"..erratumid.."|(erratum)]]".."[[Category:Cite Q - mengutip karya yang memiliki kesalahan tulis]]" else erratumid="" end localopt_cat='' ifgetValue({"P5824",ps=1,qid=qid})then opt_cat='[[Category:Cite Q - mengutip karya yang telah ditarik]]<!-- retracted -->' end ifgetValue({"P1366",ps=1,qid=qid})then opt_cat=opt_cat..'[[Category:Cite Q - mengutip karya yang telah diganti]]<!-- replaced -->' end returnframe:expandTemplate{title=template,args=citeq_args}..erratumid..opt_cat-- render the template end functionp.cite_q(frame) localargs={} fork,vinpairs(frame:getParent().args)do ifv~=""thenargs[k]=vend end fork,vinpairs(frame.args)do ifv~=""thenargs[k]=vend end args.qid=args.qidorargs[1]or"" ifargs.qid==""thenreturnnilend args[1]=nil localcitesep=(args.citesepor"") ifcitesep==""thencitesep=", "end citesep=citesep:gsub('"','')-- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep=nil localtag=args.tagor"" iftag==""thentag=nilend args.tag=nil locallist=args.listor"" iflist==""thenlist=nilend args.list=nil args.language=args.languageorargs.lang args.lang=nil localcites={} forqinargs.qid:gmatch("Q%d+")do -- make a new copy of the arguments localnewargs={} fork,vinpairs(args)do ifk~="qid"then newargs[k]=v end end newargs.qid=q iftag=="ref"then cites[#cites+1]=frame:callParserFunction{name="#tag:ref",args={p._cite_q(newargs),name=q}} -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites+1]=p._cite_q(newargs) end end iflistthen returnframe:expandTemplate{title=list,args=cites} else returntable.concat(cites,citesep) end end returnp