local
makeUrl
=
require
(
'Module:URL'
).
_url
local
p
=
{}
-- Wrapper for pcall which returns nil on failure.
local
function
quickPcall
(
func
)
local
success
,
result
=
pcall
(
func
)
if
success
then
return
result
end
end
-- Gets the rank for a Wikidata property table. Returns 1, 0 or -1, in
-- order of rank.
local
function
getRank
(
prop
)
local
rank
=
prop
.
rank
if
rank
==
'preferred'
then
return
1
elseif
rank
==
'normal'
then
return
0
elseif
rank
==
'deprecated'
then
return
-
1
else
-- No rank or undefined rank is treated as "normal".
return
0
end
end
-- Finds whether a Wikidata property is qualified as being in English.
local
function
isEnglish
(
prop
)
local
ret
=
quickPcall
(
function
()
for
i
,
lang
in
ipairs
(
prop
.
qualifiers
.
P407
)
do
if
lang
.
datavalue
.
value
[
'numeric-id'
]
==
1860
then
return
true
end
end
return
false
end
)
return
ret
==
true
end
-- Fetches the official website URL from Wikidata.
local
fetchWikidataUrl
fetchWikidataUrl
=
function
()
-- Get objects for all official sites on Wikidata.
local
websites
=
quickPcall
(
function
()
return
mw
.
wikibase
.
getAllStatements
(
mw
.
wikibase
.
getEntityIdForCurrentPage
(),
'P856'
)
end
)
-- Clone the objects in case other code needs them in their original order.
websites
=
websites
and
mw
.
clone
(
websites
)
or
{}
-- Add the table index to the objects in case it is needed in the sort.
for
i
,
website
in
ipairs
(
websites
)
do
website
.
_index
=
i
end
-- Sort the websites, first by highest rank, and then by websites in the
-- English language, then by the website's original position in the
-- property list. When we are done, get the URL from the highest-sorted
-- object.
table.sort
(
websites
,
function
(
ws1
,
ws2
)
local
r1
=
getRank
(
ws1
)
local
r2
=
getRank
(
ws2
)
if
r1
~=
r2
then
return
r1
>
r2
end
local
e1
=
isEnglish
(
ws1
)
local
e2
=
isEnglish
(
ws2
)
if
e1
~=
e2
then
return
e1
end
return
ws1
.
_index
<
ws2
.
_index
end
)
local
url
=
quickPcall
(
function
()
return
websites
[
1
].
mainsnak
.
datavalue
.
value
end
)
-- Cache the result so that we only do the heavy lifting once per #invoke.
fetchWikidataUrl
=
function
()
return
url
end
return
url
end
-- Render the URL link, plus other visible output.
local
function
renderUrl
(
options
)
if
not
options
.
url
and
not
options
.
wikidataurl
then
local
qid
=
mw
.
wikibase
.
getEntityIdForCurrentPage
()
local
result
=
'<strong class="error">'
..
'URL이 없습니다. 여기에 URL을 指定하거나 위키데이터에 URL을 追加해 주십시오.'
..
'</strong>'
if
qid
then
result
=
result
..
' [[파일:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=위키데이터에서 編輯하기 |link=https://www.wikidata.org/wiki/'
..
qid
..
'#P856|위키데이터에서 編輯하기]]'
end
return
result
end
local
ret
=
{}
ret
[
#
ret
+
1
]
=
string.format
(
'<span class="official-website">%s</span>'
,
makeUrl
(
options
.
url
or
options
.
wikidataurl
,
options
.
display
)
)
if
options
.
wikidataurl
and
not
options
.
url
then
local
qid
=
mw
.
wikibase
.
getEntityIdForCurrentPage
()
if
qid
then
ret
[
#
ret
+
1
]
=
'[[파일:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=위키데이터에서 編輯하기 |link=https://www.wikidata.org/wiki/'
..
qid
..
'#P856|위키데이터에서 編輯하기]]'
end
end
if
options
.
format
==
'flash'
then
ret
[
#
ret
+
1
]
=
mw
.
getCurrentFrame
():
expandTemplate
{
title
=
'Color'
,
args
=
{
'#505050'
,
'([[어도비 플래시 플레이어]] 必要)'
}
}
end
if
options
.
mobile
then
ret
[
#
ret
+
1
]
=
'('
..
makeUrl
(
options
.
mobile
,
'모바일'
)
..
')'
end
return
table.concat
(
ret
,
' '
)
end
-- Render the tracking category.
local
function
renderTrackingCategory
(
url
,
wikidataurl
)
if
mw
.
title
.
getCurrentTitle
().
namespace
~=
0
then
return
''
end
local
category
if
not
url
and
not
wikidataurl
then
category
=
'URL이 없는 公式 웹사이트'
elseif
not
url
and
wikidataurl
then
return
''
elseif
url
and
wikidataurl
then
if
url
:
gsub
(
'/%s*$'
,
''
)
~=
wikidataurl
:
gsub
(
'/%s*$'
,
''
)
then
category
=
'위키데이터와 위키百科에서 差異가 있는 公式 웹사이트'
end
else
category
=
'위키데이터에 없는 公式 웹사이트'
end
return
category
and
string.format
(
'[[分類:%s]]'
,
category
)
or
''
end
function
p
.
_main
(
args
)
local
url
=
args
[
1
]
or
args
.
URL
or
args
.
url
local
wikidataurl
=
fetchWikidataUrl
()
local
formattedUrl
=
renderUrl
{
url
=
url
,
wikidataurl
=
wikidataurl
,
-- display = args[2] or args.name or args['이름'] or '公式 웹사이트',
display
=
args
[
2
]
or
args
.
name
or
args
[
'이름'
]
or
mw
.
ustring
.
gsub
(
mw
.
title
.
getCurrentTitle
().
text
,
" %(.*"
,
""
);
format
=
args
.
format
or
args
[
'포맷'
],
mobile
=
args
.
mobile
or
args
[
'모바일'
]
}
--return formattedUrl .. renderTrackingCategory(url, wikidataurl)
return
formattedUrl
..
renderTrackingCategory
(
url
,
wikidataurl
)
..
' - 公式 웹사이트'
end
function
p
.
main
(
frame
)
local
args
=
require
(
'Module:Arguments'
).
getArgs
(
frame
,
{
wrappers
=
'틀:公式 웹사이트'
})
return
p
.
_main
(
args
)
end
return
p