「テンプレート:Listen」の版間の差分

提供: wikipokpok
移動先: 案内検索
(ページの作成:「-- This module implments {{listen}}. local mFileLink = require('Module:File link') local mTableTools = require('Module:TableTools') local mSideBox = require('Module:Side...」)
 
(テンプレート:試聴への転送ページ)
 
1行目: 1行目:
-- This module implments {{listen}}.
+
#redirect [[Template:試聴]]
 
+
local mFileLink = require('Module:File link')
+
local mTableTools = require('Module:TableTools')
+
local mSideBox = require('Module:Side box')
+
 
+
local p = {}
+
 
+
function p.main(frame)
+
local origArgs = frame:getParent().args
+
local args = {}
+
for k, v in pairs(origArgs) do
+
v = v:match('^%s*(.-)%s*$')
+
if v ~= '' then
+
args[k] = v
+
end
+
end
+
return p._main(args)
+
end
+
 
+
function p._main(args)
+
-- Organise the arguments by number.
+
local numArgs = {}
+
do
+
local origNumArgs = mTableTools.numData(args)
+
origNumArgs[1] = origNumArgs.other -- Overwrite args.filename1 etc. with args.filename etc.
+
origNumArgs = mTableTools.compressSparseArray(origNumArgs)
+
for i, t in ipairs(origNumArgs) do
+
if t.filename then
+
numArgs[#numArgs + 1] = t
+
end
+
end
+
end
+
 
+
-- Find whether we are outputting a plain or an embedded box.
+
local isPlain = args.plain == 'yes'
+
local isEmbedded = args.embed and true or false
+
 
+
-- Build the arguments for {{side box}}
+
local sbargs = {}
+
sbargs.metadata = 'no'
+
sbargs.position = args.pos
+
 
+
-- Style arguments
+
do
+
local style = {}
+
if isPlain then
+
style[#style + 1] = 'border:none'
+
style[#style + 1] = 'background:transparent'
+
style[#style + 1] = 'float:none'
+
end
+
if isEmbedded then
+
style[#style + 1] = 'border-collapse:collapse'
+
style[#style + 1] = 'border-width:1px 0 0 0'
+
style[#style + 1] = 'background:transparent'
+
style[#style + 1] = 'float:none'
+
style[#style + 1] = 'margin:0 -5px'
+
end
+
if args.pos == 'left' then
+
style[#style + 1] = 'float:left'
+
end
+
style[#style + 1] = args.style
+
sbargs.style = table.concat(style, '; ')
+
end
+
sbargs.textstyle = 'line-height:1.1em'
+
 
+
-- Image
+
if not isPlain and not isEmbedded then
+
if args.image then
+
sbargs.image = args.image
+
else
+
local images = {
+
speech = 'Audio-input-microphone.svg',
+
music = 'Gnome-mime-audio-openclipart.svg'
+
}
+
local image = args.type
+
and images[args.type]
+
or 'Gnome-mime-sound-openclipart.svg'
+
sbargs.image = mFileLink._main{
+
file = image,
+
size = '65x50px',
+
location = 'center',
+
link = '',
+
alt = ''
+
}
+
end
+
end
+
 
+
-- Text
+
do
+
local header
+
if args.header then
+
header = mw.html.create('div')
+
header
+
:css{
+
background = 'transparent',
+
['text-align'] = 'left',
+
padding = args.embed and '2px 0' or '2px'
+
}
+
:wikitext(args.header)
+
header = tostring(header)
+
header = header .. '\n'
+
else
+
header = ''
+
end
+
local text = {}
+
for i, t in ipairs(numArgs) do
+
text[#text + 1] = p.renderRow(t.filename, t.title, t.play, t.alt, t.description)
+
end
+
sbargs.text = header .. table.concat(text)
+
end
+
 
+
-- Below
+
if not isPlain and not isEmbedded and args.help ~= 'no' then
+
sbargs.below = string.format(
+
'<span style="font-size:smaller;">'
+
.. "''%sがうまく視聴できない場合は、[[Help:音声・動画の再生]]をご覧ください。''"
+
.. '</span>',
+
#numArgs > 1 and 'これらの音声や映像' or 'この音声や映像'
+
)
+
end
+
 
+
-- Render the side box.
+
local sideBox = mSideBox._main(sbargs)
+
 
+
-- Render the tracking categories.
+
local trackingCategories = p.renderTrackingCategories(args, numArgs)
+
 
+
return sideBox .. trackingCategories
+
end
+
 
+
function p.renderRow(filename, title, play, alt, description)
+
-- Renders the HTML for one file description row.
+
if not filename then
+
return nil
+
end
+
local root = mw.html.create('')
+
root
+
:tag('div')
+
:addClass('haudio')
+
:newline()
+
:tag('div')
+
:css('padding', '2px 0')
+
:wikitext(string.format('[[:File:%s|%s]]', filename, title or ''))
+
:done()
+
:newline()
+
:tag('div')
+
:css('padding-right', '4px')
+
:wikitext(
+
play ~= 'no'
+
and mFileLink._main{
+
file = filename,
+
size = '220px',
+
alt = alt
+
}
+
or nil
+
)
+
:done()
+
:newline()
+
:tag('div')
+
:css('padding', '2px 0 0 0')
+
:addClass('description')
+
:wikitext(description)
+
:done()
+
:done()
+
:tag('hr', {selfClosing = true})
+
return tostring(root)
+
end
+
 
+
function p.renderTrackingCategories(args, numArgs, titleObj)
+
-- Renders all tracking categories produced by the template.
+
-- args and numArgs are passed through from p._main,
+
-- and the titleObj is only used for testing purposes.
+
local cats = {}
+
 
+
local currentTitle = titleObj or mw.title.getCurrentTitle()
+
if currentTitle.namespace == 0 then
+
-- We are in mainspace.
+
cats[#cats + 1] = ''
+
 
+
for i, t in ipairs(numArgs) do
+
local success, title = pcall(mw.title.new, 'Media:' .. t.filename)
+
if success and title and not title.exists then
+
cats[#cats + 1] = ''
+
break
+
end
+
end
+
end
+
 
+
if args.plain == 'yes' then
+
cats[#cats + 1] = ''
+
end
+
 
+
for i, cat in ipairs(cats) do
+
cats[i] = string.format('', cat)
+
end
+
return table.concat(cats)
+
end
+
 
+
return p
+

2015年6月15日 (月) 21:13時点における最新版