local
mFileLink
=
require
(
'Module:File link'
)
local
mTableTools
=
require
(
'Module:TableTools'
)
local
mSideBox
=
require
(
'Module:Side box'
)
local
lang
=
mw
.
language
.
new
(
'en'
)
local
p
=
{}
local
function
formatLength
(
length
)
-- Formats a duration in seconds in "(h:)mm:ss" (minutes are zero-padded
-- only if there are hours).
if
not
length
or
length
==
0
then
return
nil
end
-- Add 0.5 to offset the rounding down
local
t
=
lang
:
getDurationIntervals
(
length
+
0.5
,
{
'hours'
,
'minutes'
,
'seconds'
})
local
s
=
t
.
seconds
and
string.format
(
'%02d'
,
t
.
seconds
)
or
'00'
local
m
=
t
.
minutes
or
0
local
span
=
mw
.
html
.
create
(
'span'
):
addClass
(
'duration'
)
if
t
.
hours
then
span
:
tag
(
'span'
)
:
addClass
(
'h'
)
:
wikitext
(
t
.
hours
)
:
done
()
:
wikitext
(
':'
)
m
=
string.format
(
'%02d'
,
m
)
end
span
:
tag
(
'span'
)
:
addClass
(
'min'
)
:
wikitext
(
m
)
:
done
()
:
wikitext
(
':'
)
:
tag
(
'span'
)
:
addClass
(
's'
)
:
wikitext
(
s
)
:
done
()
return
tostring
(
span
)
end
local
function
renderRow
(
filename
,
title
,
play
,
alt
,
description
,
start
,
length
,
hasImage
)
-- Renders the HTML for one file description row.
if
not
filename
then
return
nil
end
length
=
formatLength
(
length
)
length
=
length
and
string.format
(
' (%s)'
,
length
)
or
''
local
root
=
mw
.
html
.
create
(
''
)
root
:
tag
(
'div'
)
:
addClass
(
'haudio'
)
:
newline
()
:
tag
(
'div'
)
:
addClass
(
'listen-file-header'
)
:
wikitext
(
string.format
(
'[[:파일:%s|%s]]%s'
,
filename
,
title
or
''
,
length
))
:
done
()
:
newline
()
:
tag
(
'div'
)
:
wikitext
(
play
~=
'no'
and
mFileLink
.
_main
{
file
=
filename
,
size
=
hasImage
and
'232px'
or
'215px'
,
alt
=
alt
,
start
=
start
}
or
nil
)
:
done
()
:
newline
()
:
tag
(
'div'
)
:
addClass
(
'description'
)
:
wikitext
(
description
)
:
done
()
:
done
()
return
tostring
(
root
)
end
local
function
renderTrackingCategories
(
isPlain
,
hasMissing
,
isEmpty
,
titleObj
)
-- Renders all tracking categories produced by the template.
-- isPlain, hasMissing and isEmpty 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.
if
not
isEmpty
then
cats
[
#
cats
+
1
]
=
'hAudio 마이크로포맷을 使用하는 文書'
end
if
hasMissing
then
cats
[
#
cats
+
1
]
=
'비어있는 듣기 틀을 使用하는 文書'
end
end
if
isPlain
then
cats
[
#
cats
+
1
]
=
'plain 變數를 使用하는 듣기 틀'
end
for
i
,
cat
in
ipairs
(
cats
)
do
cats
[
i
]
=
string.format
(
'[[分類:%s]]'
,
cat
)
end
return
table.concat
(
cats
)
end
function
p
.
_main
(
args
)
-- Organise the arguments by number.
local
isPlain
=
(
args
.
plain
or
args
[
"簡單"
])
==
'yes'
local
isEmbedded
=
args
.
embed
and
true
local
hasImage
=
not
isPlain
and
not
isEmbedded
and
(
args
.
image
or
args
[
"그림"
])
~=
'none'
local
numArgs
,
missingFiles
=
{},
{}
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
-- Check if the files exist.
local
obj
=
(
t
.
filename
or
t
[
"파일이름"
]
or
t
[
"파일 이름"
])
and
mw
.
title
.
makeTitle
(
-
2
,
(
t
.
filename
or
t
[
"파일이름"
]
or
t
[
"파일 이름"
]))
if
obj
and
obj
.
exists
then
if
(
t
.
length
or
t
[
"길이"
])
==
'yes'
or
-- Show length if the video height would be less than 150px
obj
.
file
.
width
/
obj
.
file
.
height
>
(
hasImage
and
1.547
or
1.434
)
then
t
.
length
=
obj
.
file
.
length
else
t
.
length
=
nil
end
numArgs
[
#
numArgs
+
1
]
=
t
else
missingFiles
[
#
missingFiles
+
1
]
=
(
t
.
filename
or
t
[
"파일이름"
]
or
t
[
"파일 이름"
])
or
i
end
end
end
-- Render warning
local
hasMissing
=
#
missingFiles
~=
0
local
previewWarning
=
''
if
hasMissing
then
for
i
,
v
in
ipairs
(
missingFiles
)
do
missingFiles
[
i
]
=
type
(
v
)
==
'string'
and
string.format
(
'없는 파일 "%s"'
,
v
)
or
string.format
(
'비어있는 파일이름 #%s'
,
v
)
end
previewWarning
=
string.format
(
'%s을 包含하는 [[틀:듣기]]를 使用하는 文書'
,
mw
.
text
.
listToText
(
missingFiles
)
)
previewWarning
=
require
(
'Module:If preview'
).
_warning
({
previewWarning
})
end
-- Exit early if none exist.
if
#
numArgs
==
0
then
return
previewWarning
..
renderTrackingCategories
(
isPlain
,
hasMissing
,
true
)
end
-- Build the arguments for {{side box}}
local
sbArgs
=
{
metadata
=
'no'
,
position
=
(
isPlain
or
isEmbedded
)
and
'left'
or
(
args
.
pos
or
args
[
"位置"
]),
style
=
(
args
.
style
or
args
[
"模樣"
]),
templatestyles
=
'Module:Listen/styles.css'
}
-- Class arguments
do
local
class
=
{
'listen'
,
'noprint'
}
if
isPlain
then
table.insert
(
class
,
'listen-plain'
)
end
if
isEmbedded
then
table.insert
(
class
,
'listen-embedded'
)
end
if
not
hasImage
then
table.insert
(
class
,
'listen-noimage'
)
end
if
(
args
.
pos
or
args
[
"位置"
])
==
'left'
and
not
isPlain
and
not
isEmbedded
then
table.insert
(
class
,
'listen-left'
)
elseif
(
args
.
pos
or
args
[
"位置"
])
==
'center'
then
table.insert
(
class
,
'listen-center'
)
end
sbArgs
.
class
=
table.concat
(
class
,
' '
)
end
-- Image
if
not
isPlain
and
not
isEmbedded
then
if
(
args
.
image
or
args
[
"그림"
])
then
sbArgs
.
image
=
(
args
.
image
or
args
[
"그림"
])
else
local
images
=
{
[
"소리"
]
=
'Audio-input-microphone.svg'
,
speech
=
'Audio-input-microphone.svg'
,
[
"音樂"
]
=
'Gnome-mime-audio-openclipart.svg'
,
music
=
'Gnome-mime-audio-openclipart.svg'
,
default
=
'Gnome-mime-sound-openclipart.svg'
}
sbArgs
.
image
=
mFileLink
.
_main
{
file
=
(
args
.
type
or
args
[
"類型"
])
and
images
[(
args
.
type
or
args
[
"類型"
])]
or
images
.
default
,
size
=
'65x50px'
,
location
=
'center'
,
link
=
''
,
alt
=
''
}
end
end
-- Text
do
local
header
if
(
args
.
header
or
args
[
"윗글"
])
then
header
=
mw
.
html
.
create
(
'div'
)
header
:
addClass
(
'listen-header'
)
:
wikitext
(
args
.
header
or
args
[
"윗글"
])
header
=
tostring
(
header
)
..
'
\n
'
else
header
=
''
end
local
text
=
{}
for
i
,
t
in
ipairs
(
numArgs
)
do
text
[
#
text
+
1
]
=
renderRow
(
(
t
.
filename
or
t
[
"파일이름"
]
or
t
[
"파일 이름"
]),
(
t
.
title
or
t
[
"題目"
]),
(
t
.
play
or
t
[
"再生"
]),
t
.
alt
,
(
t
.
description
or
t
[
"說明"
]),
(
t
.
start
or
t
[
"始作"
]),
(
t
.
length
or
t
[
"길이"
]),
hasImage
)
if
numArgs
[
i
+
1
]
then
text
[
#
text
+
1
]
=
'<hr/>'
end
end
sbArgs
.
text
=
header
..
table.concat
(
text
)
end
-- Below
if
not
isPlain
and
not
isEmbedded
and
(
args
.
help
or
args
[
"도움말"
])
~=
'no'
then
sbArgs
.
below
=
string.format
(
'<hr/><div class="selfreference">%s을 듣기에 問題가 있으면 [[위키百科:미디어 도움말|미디어 도움말]]을 參照하세요.</div>'
,
#
numArgs
==
1
and
'이 파일'
or
'이 파일들'
)
end
-- Render the side box.
local
sideBox
=
mSideBox
.
_main
(
sbArgs
)
-- Render the tracking categories.
local
trackingCategories
=
renderTrackingCategories
(
isPlain
,
hasMissing
)
return
previewWarning
..
sideBox
..
trackingCategories
end
function
p
.
main
(
frame
)
local
origArgs
=
frame
:
getParent
().
args
local
args
=
{}
for
k
,
v
in
pairs
(
origArgs
)
do
if
v
~=
''
then
args
[
k
]
=
v
end
end
return
p
.
_main
(
args
)
end
return
p