मॉड्यूल:Citeq
"इस मॉड्यूल हेतु प्रलेख मॉड्यूल:Citeq/doc पर बनाया जा सकता है"
require('Module:No globals')
local citeq = {}
--[[--------------------------< 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.
]]
local function is_set( var )
return not (var == nil or var == '');
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
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 |wdlinks= parameter; a boolean passed to enable links to Wikidata when no article exists
returns nothing; modifies the args table
]=]
local function get_name_list (nl_type, args, qid, wdl)
local propertyID = "P50"
if 'author' == nl_type then
propertyID = 'P50'; -- for authors
elseif 'editor' == nl_type then
propertyID = 'P98'; -- for editors
else
return; -- not specified so return
end
-- wdlinks 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
if wdl and (#wdl > 0) then
wdl = wdl:lower()
if (wdl == "false") or (wdl == "no") or (wdl == "0") then
wdl = false
else
wdl = true
end
else
-- wdl is empty, so
wdl = false
end
local entity, props
local entity = mw.wikibase.getEntity(qid)
if entity and entity.claims then
props = entity.claims[propertyID]
else
-- there's no such entity or no claims for the entity
return nil
end
-- Make sure it actually has the property requested
if not props or not props[1] then
return nil
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
local out = {}
local link = {}
if props[1].mainsnak.datavalue.type == "wikibase-entityid" then
-- it's wiki-linked value, so output as link if possible
for k, v in pairs(props) do
local qnumber = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
local sitelink = mw.wikibase.sitelink(qnumber)
local label = mw.wikibase.label(qnumber)
if label then
label = mw.text.nowiki(label)
else
label = qnumber
end
if sitelink then
-- just the plain name,
-- but keep a record of the links, using the same index
out[#out + 1] = label
link[#out] = sitelink
else
-- no sitelink, so check first for a redirect with that label
local artitle = mw.title.new(label, 0)
if artitle.id > 0 then
if artitle.isRedirect then
-- no sitelink,
-- but there's a redirect with the same title as the label;
-- so store the link to that
out[#out + 1] = label
link[#out] = label
else
-- no sitelink and not a redirect but an article exists with the same title as the label
-- that's probably a dab page, so output the plain label
out[#out + 1] = label
end
else
-- no article or redirect with the same title as the label
if wdl then
-- show that there's a Wikidata entry available
out[#out + 1] = "[[: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[#out + 1] = label
end
end
end
end
else
-- not a linkable article title
out[#out+1] = entity:formatPropertyValues(propertyID).value
end
-- if there's anything to return, then insert the additions in the template arguments table
-- in the form |author1=firstname secondname |author2= ...
if #out > 0 then
for k,v in ipairs(out) do -- authorn or editorn
args[nl_type .. k] = v
end
for k,v in pairs(link) do -- author-linkn or editor-linkn
args[nl_type .. '-link' .. k] = v
end
end
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.
]]
function citeq.cite_q (frame)
local citeq_args = {};
local qid;
local wdl;
local pframe = frame:getParent()
local args = pframe.args; -- first get parent frame arguments - these from the template call
for k, v in pairs (args) do -- copy named parameters and their values into citeq_args
if type( k ) == 'string' then -- numbered parameters ignored
citeq_args[k] = v;
end
end
args = frame.args; -- now get frame arguments (from the template wikisource)
for k, v in pairs (args) do -- copy args into citeq_args
if 'qid' == k then -- don't copy qid
qid = v; -- save its value
elseif 'wdlinks' == k then -- don't copy wdlinks
wdl = v; -- save its value
else
citeq_args[k] = v -- but copy everything else
end
end
if is_set (qid) then
if not is_set (citeq_args.author) and not is_set (citeq_args.author1) 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
if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) 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
end
return frame:expandTemplate{title = 'citation', args = citeq_args}; -- render the citation
end
return citeq