|
|
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
| + | |