Module:Sister project links: Difference between revisions
From WikiMD's Wellness Encyclopedia
m 1 revision imported |
No edit summary Tag: Manual revert |
||
| (5 intermediate revisions by 2 users not shown) | |||
| Line 5: | Line 5: | ||
local sideBox = require('Module:Side box')._main | local sideBox = require('Module:Side box')._main | ||
local p = {} | local p = {} | ||
local inSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true) | local inSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true) | ||
| Line 106: | Line 12: | ||
return inSandbox and s.."-sand" or s | return inSandbox and s.."-sand" or s | ||
end | end | ||
-- Information about how to handle each sister lives in separate data file | |||
local cfg = mw.loadData(sandbox('Module:Sister project links/config')) | |||
local logo = cfg.logo | |||
local prefixList = cfg.prefixList | |||
local sisterName = cfg.sisterName | |||
local sisterInfo = cfg.sisterInfo | |||
local defaultSisters = cfg.defaultSisters | |||
local sisterDb = cfg.sisterDb | |||
local trackingType = cfg.trackingType | |||
-- Function to canonicalize string | -- Function to canonicalize string | ||
local function canonicalize(s) | local function canonicalize(s) | ||
if s == nil then | if s == nil then | ||
return {nil, nil} | return {nil, nil} | ||
end | end | ||
if tostring(type(s)) == "table" then | if tostring(type(s)) == "table" then | ||
return s | return s | ||
| Line 129: | Line 36: | ||
end | end | ||
local lowerS = s:lower() | local lowerS = s:lower() | ||
if lowerS == 'yes' or lowerS == 'y' or lowerS == 't' or lowerS == '1' or lowerS == 'true' or lowerS == 'on' then | |||
if lowerS == 'yes' or lowerS == 'y' or lowerS == 't' | |||
return {nil, true} | return {nil, true} | ||
end | end | ||
if lowerS == 'no' or lowerS == 'n' or lowerS == 'f' or lowerS == '0' or lowerS == 'false' or lowerS == 'off' then | |||
if lowerS == 'no' or lowerS == 'n' or lowerS == 'f' | |||
return {nil, false} | return {nil, false} | ||
end | end | ||
return {s, true} | return {s, true} | ||
end | end | ||
local function mergeArgs(argList, noAll) | |||
local test = nil | |||
local function mergeArgs(argList,noAll) | |||
local test = nil | |||
if noAll then | if noAll then | ||
test = false | test = false | ||
end | end | ||
local allSame = true | local allSame = true | ||
for _, arg in ipairs(argList) do | for _, arg in ipairs(argList) do | ||
if arg[2] then | if arg[2] then | ||
return arg | return arg | ||
end | end | ||
allSame = allSame and (arg[2] == test) | allSame = allSame and (arg[2] == test) | ||
end | end | ||
if allSame then | if allSame then | ||
return {nil, test} | return {nil, test} | ||
end | end | ||
if noAll then | if noAll then | ||
return {nil, nil} | return {nil, nil} | ||
| Line 173: | Line 66: | ||
end | end | ||
local function getSitelink(wiki, qid) | |||
if mw.wikibase and mw.wikibase.getSitelink then | |||
return qid and mw.wikibase.getSitelink(qid, wiki) | |||
end | |||
local function getSitelink(wiki,qid) | return nil | ||
end | end | ||
local function fetchWikidata(prefix, qid) | |||
if mw.wikibase then | |||
local sisterDbName = sisterDb[prefix] | |||
return sisterDbName and getSitelink(sisterDbName, qid) | |||
local function fetchWikidata(prefix,qid) | end | ||
local sisterDbName = sisterDb[prefix] | return nil | ||
end | end | ||
local function genSisterLink(args, tracking) | local function genSisterLink(args, tracking) | ||
if args[1][2] == false or (not args.default and args[1][2] == nil) then | if args[1][2] == false or (not args.default and args[1][2] == nil) then | ||
return nil | return nil | ||
end | end | ||
local sitelink = args.sitelink or fetchWikidata(args.sisterPrefix,args.qid) | local sitelink = args.sitelink or fetchWikidata(args.sisterPrefix, args.qid) | ||
if args.auto and not sitelink and args[1][2] == nil then | if args.auto and not sitelink and args[1][2] == nil then | ||
return nil | return nil | ||
end | end | ||
local link = args[1][1] or sitelink or (args.search and "Special:"..args.search) | local link = args[1][1] or sitelink or (args.search and "Special:"..args.search) | ||
if not link then | if not link then | ||
return nil | return nil | ||
end | end | ||
if tracking then | if tracking then | ||
if args[1][1] and sitelink then | if args[1][1] and sitelink then | ||
local page = mw.ustring.gsub(args[1][1], "_", " ") | |||
local page = mw.ustring.gsub(args[1][1],"_"," ") | page = mw.ustring.sub(page, 1, 1):upper()..mw.ustring.sub(page, 2) | ||
page = mw.ustring.sub(page,1,1):upper()..mw.ustring.sub(page,2) | local pageNS = mw.ustring.match(page, "^([^:]+):") | ||
local pageNS = mw.ustring.match(page,"^([^:]+):") | local sitelinkNS = mw.ustring.match(sitelink, "^([^:]+):") | ||
local sitelinkNS = mw.ustring.match(sitelink,"^([^:]+):") | |||
if page == sitelink then | if page == sitelink then | ||
tracking.wdHidden = args.sisterPrefix | tracking.wdHidden = args.sisterPrefix | ||
| Line 231: | Line 106: | ||
tracking.wdMismatch = args.sisterPrefix | tracking.wdMismatch = args.sisterPrefix | ||
end | end | ||
elseif not (args[1][2] or sitelink) and args.search then | elseif not (args[1][2] or sitelink) and args.search then | ||
tracking.defaultSearch = args.sisterPrefix | tracking.defaultSearch = args.sisterPrefix | ||
| Line 238: | Line 112: | ||
return {prefix=args.sisterPrefix, link=link, logo=args.logo, name=args.name, | return {prefix=args.sisterPrefix, link=link, logo=args.logo, name=args.name, | ||
information=args.information, prep=args.prep} | information=args.information, prep=args.prep} | ||
end | end | ||
| Line 466: | Line 117: | ||
local titleObject = mw.title.getCurrentTitle() | local titleObject = mw.title.getCurrentTitle() | ||
local ns = titleObject.namespace | local ns = titleObject.namespace | ||
if mw.wikibase then | |||
args.qid = args.qid or mw.wikibase.getEntityIdForTitle(args[1] or "") or mw.wikibase.getEntityIdForCurrentPage() | |||
else | |||
args.qid = nil | |||
end | |||
args.qid = args.qid and args.qid:upper() | args.qid = args.qid and args.qid:upper() | ||
args[1] = args[1] or (mw.wikibase and mw.wikibase.getSitelink(args.qid or "")) or titleObject.text | |||
args.c = args.c or args.commons | |||
for _, k in ipairs(prefixList) do | for _, k in ipairs(prefixList) do | ||
args[k] = canonicalize(args[k]) | args[k] = canonicalize(args[k]) | ||
end | end | ||
args.cookbook = canonicalize(args.cookbook) | args.cookbook = canonicalize(args.cookbook) | ||
args.b = mergeArgs({args.b,args.cookbook}) | args.b = mergeArgs({args.b, args.cookbook}) | ||
args.cookbook = args.cookbook[2] | args.cookbook = args.cookbook[2] | ||
if args.trackSingle == nil then | if args.trackSingle == nil then | ||
args.trackSingle = true | args.trackSingle = true | ||
| Line 488: | Line 137: | ||
args.trackSingle = false | args.trackSingle = false | ||
end | end | ||
for _,k in pairs({"auto", "commonscat", "author", "bar", "tracking", "sandbox", "trackSingle"}) do | |||
for _,k in pairs({"auto","commonscat","author","bar","tracking","sandbox","trackSingle"}) do | |||
args[k] = canonicalize(args[k])[2] | args[k] = canonicalize(args[k])[2] | ||
end | end | ||
local tracking = (args.tracking or ns == 0) and {} | local tracking = (args.tracking or ns == 0) and {} | ||
local sisterList = {} | local sisterList = {} | ||
for _, prefix in ipairs(prefixList) do | for _, prefix in ipairs(prefixList) do | ||
local link = sisterLink(prefix, args, tracking) | local link = sisterLink(prefix, args, tracking) | ||
| Line 505: | Line 150: | ||
local box = mw.html.create() | local box = mw.html.create() | ||
if args.bar and #sisterList > 0 then | if args.bar and #sisterList > 0 then | ||
box:node(createSisterBar(sisterList, args)) | |||
box:node(createSisterBar(sisterList,args)) | |||
elseif #sisterList == 1 then | elseif #sisterList == 1 then | ||
local sister = sisterList[1] | local sister = sisterList[1] | ||
local link = | local link = "[["..sister.prefix..":"..sister.link.."|<b><i>"..(args.display or args[1]).."</i></b>]]" | ||
if sister.name == 'Commons' then | if sister.name == 'Commons' then | ||
sister.name = 'Wikimedia Commons' | sister.name = 'Wikimedia Commons' | ||
end | end | ||
local text = sister.name.." has "..mw.ustring.lower(sister.information).." related to "..link | local text = sister.name.." has "..mw.ustring.lower(sister.information).." related to "..link.."." | ||
if sister.name == 'Wikipedia' then | if sister.name == 'Wikipedia' then | ||
text = "[["..sister.prefix..":"..sister.link.."|<b><i>"..sister.information.."</i></b>]] "..sister.prep.." [[Wikipedia]], the free encyclopedia" | text = "[["..sister.prefix..":"..sister.link.."|<b><i>"..sister.information.."</i></b>]] "..sister.prep.." [[Wikipedia]], the free encyclopedia" | ||
end | end | ||
| Line 526: | Line 167: | ||
metadata='no', | metadata='no', | ||
class='plainlinks sistersitebox', | class='plainlinks sistersitebox', | ||
text=text | text=text | ||
})) | })) | ||
elseif #sisterList > 0 then | elseif #sisterList > 0 then | ||
box:wikitext(createSisterBox(sisterList, args)) | |||
box:wikitext(createSisterBox(sisterList,args)) | |||
end | end | ||
if #sisterList == 0 and args.auto then | if #sisterList == 0 and args.auto then | ||
box:wikitext("[[Category:Pages with empty sister project links]]") | |||
box:wikitext( | |||
end | end | ||
return tostring(box) | return tostring(box) | ||
end | end | ||
return p | return p | ||
Latest revision as of 02:07, 22 December 2024
| This module depends on the following other modules: |
Lua error in Module:TNT at line 159: Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:I18n/Uses TemplateStyles.tab. Implements {{Sister project links}}
See {{Sister project links/testcases}} for test cases for box, {{Sister bar/testcases}} for bar.
Note: in order to make the test cases work, the Sandbox CSS classes have "-sand" appended to their names. If you wish to update the CSS, copy the contents of each class from Module:Sister project links/sandbox/styles.css to Module:Sister project links/styles.css, but do not alter the class names, nor just copy-paste the entire CSS file. For the current difference in CSS between Sandbox and Main, see here.
require('strict')
-- Module to create sister project link box
local getArgs = require('Module:Arguments').getArgs
local sideBox = require('Module:Side box')._main
local p = {}
local inSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
-- Function to add "-sand" to classes when called from sandbox
local function sandbox(s)
return inSandbox and s.."-sand" or s
end
-- Information about how to handle each sister lives in separate data file
local cfg = mw.loadData(sandbox('Module:Sister project links/config'))
local logo = cfg.logo
local prefixList = cfg.prefixList
local sisterName = cfg.sisterName
local sisterInfo = cfg.sisterInfo
local defaultSisters = cfg.defaultSisters
local sisterDb = cfg.sisterDb
local trackingType = cfg.trackingType
-- Function to canonicalize string
local function canonicalize(s)
if s == nil then
return {nil, nil}
end
if tostring(type(s)) == "table" then
return s
end
s = mw.text.trim(tostring(s))
if s == "" then
return {nil, nil}
end
local lowerS = s:lower()
if lowerS == 'yes' or lowerS == 'y' or lowerS == 't' or lowerS == '1' or lowerS == 'true' or lowerS == 'on' then
return {nil, true}
end
if lowerS == 'no' or lowerS == 'n' or lowerS == 'f' or lowerS == '0' or lowerS == 'false' or lowerS == 'off' then
return {nil, false}
end
return {s, true}
end
local function mergeArgs(argList, noAll)
local test = nil
if noAll then
test = false
end
local allSame = true
for _, arg in ipairs(argList) do
if arg[2] then
return arg
end
allSame = allSame and (arg[2] == test)
end
if allSame then
return {nil, test}
end
if noAll then
return {nil, nil}
end
return {nil, false}
end
local function getSitelink(wiki, qid)
if mw.wikibase and mw.wikibase.getSitelink then
return qid and mw.wikibase.getSitelink(qid, wiki)
end
return nil
end
local function fetchWikidata(prefix, qid)
if mw.wikibase then
local sisterDbName = sisterDb[prefix]
return sisterDbName and getSitelink(sisterDbName, qid)
end
return nil
end
local function genSisterLink(args, tracking)
if args[1][2] == false or (not args.default and args[1][2] == nil) then
return nil
end
local sitelink = args.sitelink or fetchWikidata(args.sisterPrefix, args.qid)
if args.auto and not sitelink and args[1][2] == nil then
return nil
end
local link = args[1][1] or sitelink or (args.search and "Special:"..args.search)
if not link then
return nil
end
if tracking then
if args[1][1] and sitelink then
local page = mw.ustring.gsub(args[1][1], "_", " ")
page = mw.ustring.sub(page, 1, 1):upper()..mw.ustring.sub(page, 2)
local pageNS = mw.ustring.match(page, "^([^:]+):")
local sitelinkNS = mw.ustring.match(sitelink, "^([^:]+):")
if page == sitelink then
tracking.wdHidden = args.sisterPrefix
elseif pageNS ~= sitelinkNS then
tracking.wdNamespace = args.sisterPrefix
else
tracking.wdMismatch = args.sisterPrefix
end
elseif not (args[1][2] or sitelink) and args.search then
tracking.defaultSearch = args.sisterPrefix
end
end
return {prefix=args.sisterPrefix, link=link, logo=args.logo, name=args.name,
information=args.information, prep=args.prep}
end
function p._main(args)
local titleObject = mw.title.getCurrentTitle()
local ns = titleObject.namespace
if mw.wikibase then
args.qid = args.qid or mw.wikibase.getEntityIdForTitle(args[1] or "") or mw.wikibase.getEntityIdForCurrentPage()
else
args.qid = nil
end
args.qid = args.qid and args.qid:upper()
args[1] = args[1] or (mw.wikibase and mw.wikibase.getSitelink(args.qid or "")) or titleObject.text
args.c = args.c or args.commons
for _, k in ipairs(prefixList) do
args[k] = canonicalize(args[k])
end
args.cookbook = canonicalize(args.cookbook)
args.b = mergeArgs({args.b, args.cookbook})
args.cookbook = args.cookbook[2]
if args.trackSingle == nil then
args.trackSingle = true
end
if ns ~= 0 and ns ~= 14 then
args.trackSingle = false
end
for _,k in pairs({"auto", "commonscat", "author", "bar", "tracking", "sandbox", "trackSingle"}) do
args[k] = canonicalize(args[k])[2]
end
local tracking = (args.tracking or ns == 0) and {}
local sisterList = {}
for _, prefix in ipairs(prefixList) do
local link = sisterLink(prefix, args, tracking)
if link then
table.insert(sisterList, link)
end
end
local box = mw.html.create()
if args.bar and #sisterList > 0 then
box:node(createSisterBar(sisterList, args))
elseif #sisterList == 1 then
local sister = sisterList[1]
local link = "[["..sister.prefix..":"..sister.link.."|<b><i>"..(args.display or args[1]).."</i></b>]]"
if sister.name == 'Commons' then
sister.name = 'Wikimedia Commons'
end
local text = sister.name.." has "..mw.ustring.lower(sister.information).." related to "..link.."."
if sister.name == 'Wikipedia' then
text = "[["..sister.prefix..":"..sister.link.."|<b><i>"..sister.information.."</i></b>]] "..sister.prep.." [[Wikipedia]], the free encyclopedia"
end
box:wikitext(sideBox({
role = 'navigation',
position=args.position,
image="[[File:"..sister.logo.."|40x40px|class=noviewer|alt=|link=]]",
metadata='no',
class='plainlinks sistersitebox',
text=text
}))
elseif #sisterList > 0 then
box:wikitext(createSisterBox(sisterList, args))
end
if #sisterList == 0 and args.auto then
box:wikitext("[[Category:Pages with empty sister project links]]")
end
return tostring(box)
end
return p