モジュール:サンドボックス/Ef3/ExLink
表示
モジュールの解説[作成]
require('strict')
local yesno = require('Module:Yesno')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local ExLink = {}
function ExLink:entity(from)
return mw.wikibase.getEntityObject(from) or error(("(%s) no found in wiki data"):format(tostring(from)), 0)
end
function ExLink:prop(property, from)
return self:entity(from):formatPropertyValues(property or error("prop:", 0)) or error("prop;", 0)
end
function ExLink:propValue(property, from)
return mw.text.decode(self:prop(property, from).value)
end
function ExLink:propLabel(property, from)
return mw.text.decode(self:prop(property, from).label)
end
-- suffix handle
function ExLink.match_suffix(str, suffix)
return str:match(suffix:gsub("[()]", "%%%1") .. '$')
end
-- like python
function ExLink.timeit(f,...)
local t = os.clock()
local r = f(...) -- use xpcall()???
return os.clock() -t , r
end
function ExLink.new(fargs)
fargs = fargs or {}
local args = setmetatable({}, {
__index = function(t,key)
if fargs[key] and fargs[key] == '' then
return nil
end
return fargs[key]
end
})
-- closure for args
function ExLink:id()
return args.id or self:propValue(args.idProp or error("id and idProp no found", 0), args.from)
end
function ExLink:formatterURL()
return mw.text.decode(args.formatter or self:propValue(args.formatterProp or "P1630", args.idProp) or error("ExLink:formatterURL()", 0));
end
function ExLink:name()
return args.name or self:label(args.from) or self:PAGENAME()
end
function ExLink:PAGENAMEBASE(name)
return (name or self:name() or self:PAGENAME() or error("PAGENAMEBASE", 0)):gsub("%s+%b()", "")
end
function ExLink:lang(cont)
local lang = args.lang
return lang and
tostring(mw.html.create('span')
:attr('xml:lang', lang)
:attr('lang', lang)
:wikitext(cont))
or cont
end
function ExLink:label(from)
return mw.wikibase.label(from)
end
function ExLink:url()
return self:formatterURL():gsub("\$1", self:id())
end
function ExLink:PAGENAME()
return mw.title.getCurrentTitle().text
end
function ExLink:getArgs()
return args
end
return setmetatable({args = args}, {__index = ExLink})
end
-- type1 - as Twitter, Facebook and Instagram
function ExLink.type1(frame)
local el = ExLink.new(frame and frame.args or frame or {})
local args = el.getArgs()
local links = args.links or true -- 'yes' is default
return (yesno(links) and "[%s %s]%s - [[%s]]" or "[%s %s]%s - %s" ):format(
el:url(),
el:lang(el:name()),
args.noAccount and "" or
(el.match_suffix(el:name(),(" (%s)"):format(el:id())) and
" " or -- backward compatibility for {{Template:Twitter}}
(" (%s%s)"):format(args.account_prefix or '',el:id())),
args.service or "</nowiki>:service:")
end
return ExLink