-- Module to find commons galleries and categories based on wikidata entrieslocal getArgs = require('Module:Arguments').getArgslocal p =
local function _getTitleQID(qid) local titleObject = mw.title.getCurrentTitle qid = (qid or ""):upper -- look up qid for current page (if not testing) if qid
-- Lookup Commons gallery in Wikidata-- Arguments:-- qid = QID of current article-- fetch = whether to lookup Commons sitelink (bool)-- commonsSitelink = default value for Commons sitelink-- Returns:-- categoryLink = name of Commons category, nil if nothing is found-- consistent = multiple wikidata fields are examined: are they consistent?-- commonsSitelink = commons sitelink for current articlelocal function _lookupGallery(qid,fetch,commonsSitelink) local galleryLink = nil local consistent = true -- look up commons sitelink for article, use if not category if fetch then commonsSitelink = mw.wikibase.getSitelink(qid,"commonswiki") or commonsSitelink end if commonsSitelink and mw.ustring.sub(commonsSitelink,1,9) ~= "Category:" then galleryLink = commonsSitelink end -- P935 is the "commons gallery" property for this article local P935 = mw.wikibase.getBestStatements(qid, "P935")[1] if P935 and P935.mainsnak.datavalue then local gallery = P935.mainsnak.datavalue.value if galleryLink and galleryLink ~= gallery then consistent = false else galleryLink = gallery end end return galleryLink, consistent, commonsSitelinkend
-- Find fallback category by looking up Commons sitelink of different page-- Arguments:-- qid = QID for current article-- property = property that refers to other article whose sitelink to return-- Returns: either category-stripped name of article, or nillocal function _lookupFallback(qid,property) if not qid then return nil end -- If property exists on current article, get value (other article qid) local value = mw.wikibase.getBestStatements(qid, property)[1] if value and value.mainsnak.datavalue and value.mainsnak.datavalue.value.id then -- Look up Commons sitelink of other article local sitelink = mw.wikibase.getSitelink(value.mainsnak.datavalue.value.id,"commonswiki") -- Check to see if it starts with "Category:". If so, strip it and return if sitelink and mw.ustring.sub(sitelink,1,9)
-- Find Commons category by looking in wikidata-- Arguments:-- qid = QID of current article-- fetch = whether to lookup Commons sitelink (bool)-- commonsSitelink = default value for Commons sitelink-- Returns:-- categoryLink = name of Commons category, nil if nothing is found-- consistent = multiple wikidata fields are examined: are they consistent?-- commonsSitelink = commons sitelink for current articlelocal function _lookupCategory(qid, fetch, commonsSitelink) local categoryLink = nil local consistent = true -- look up commons sitelink for article, use if starts with "Category:" if fetch then commonsSitelink = mw.wikibase.getSitelink(qid,"commonswiki") or commonsSitelink end if commonsSitelink and mw.ustring.sub(commonsSitelink,1,9)
-- Create Commons gallery link corresponding to current article-- Arguments:-- default = use as Commons link, don't access wikidata-- linktext = text to display in link-- search = string to search for-- qid = QID to lookup in wikidata (for testing only)-- Returns:-- formatted wikilink to Commons galleryfunction p._getGallery(default,linktext,search,qid) if default then return ""..(linktext or default).."" end if search then return ""..(linktext or search).."" end local title, ns title, ns, qid = _getTitleQID(qid) -- construct default result (which searches for title) local searchResult = ""..(linktext or title).."" if qid then local galleryLink, consistent = _lookupGallery(qid,true) -- use wikidata if either sitelink or P935 exist, and they both agree if galleryLink and consistent then return ""..(linktext or galleryLink).."" end -- if not consistent, fall back to search and add to tracking cat if not consistent and ns
-- Create Commons category link corresponding to current article-- Arguments:-- default = use as Commons category link, don't access wikidata-- linktext = text to display in link-- search = string to search for-- qid = QID to lookup in wikidata (for testing only)-- Returns:-- formatted wikilink to Commons galleryfunction p._getCategory(default,linktext,search,qid) if default then return ""..(linktext or default).."" end if search then return ""..(linktext or search).."" end local title, ns title, ns, qid = _getTitleQID(qid) -- construct default result (which searches for title in Category space) local searchResult = ""..(linktext or title).."" if qid then local categoryLink, consistent = _lookupCategory(qid,true) -- if any of sitelink category, P373, and P910/P1754 commons sitelinks exist, -- use it. But don't use if they don't agree with each other if categoryLink and consistent then return ""..(linktext or categoryLink).."" end -- if not consistent, fall back to search, but add tracking category if not consistent and ns
-- Returns "best" Commons link: first look for gallery, then try category-- Arguments:-- default = use as Commons link, don't access wikidata-- linktext = text to display in link-- search = string to search for-- qid = QID to lookup in wikidata (for testing only)-- Returns:-- formatted wikilink to Commons "best" landing pagefunction p._getGalleryOrCategory(default,linktext,search,qid) if default then return ""..(linktext or default).."" end if search then return ""..(linktext or search).."" end local title, ns title, ns, qid = _getTitleQID(qid) -- construct default result (which searches for title) local searchResult = ""..(linktext or title).."" local trackingCats = "" if qid then local galleryLink, consistent, commonsSitelink = _lookupGallery(qid,true) -- use wikidata if either sitelink or P935 exist, and they both agree if galleryLink and consistent then return ""..(linktext or galleryLink).."" end if not consistent and ns
0 then trackingCats = trackingCats.."" end end return searchResult..trackingCatsend
-- Testing-only entry point for _getTitleQIDfunction p.getTitleQID(frame) local args = getArgs(frame,) local text, ns, qid = _getTitleQID(args[1]) return text..","..ns..","..(qid or "nil")end
-- Testing-only entry point for _lookupFallbackfunction p.lookupFallback(frame) local args = getArgs(frame,) local fallback = _lookupFallback(args[1],args[2]) return fallback or "nil"end
-- Find the Commons gallery page associated with articlefunction p.getGallery(frame) local args = getArgs(frame,) return p._getGallery(args[1],args.linktext,args.search,args.qid)end
-- Find the Commons category page associated with articlefunction p.getCategory(frame) local args = getArgs(frame,) return p._getCategory(args[1],args.linktext,args.search,args.qid)end
function p.getGalleryOrCategory(frame) local args = getArgs(frame,) return p._getGalleryOrCategory(args[1],args.linktext,args.search,args.qid)end
return p