모듈 : Navbar

이 페이지는 준보호되어 있습니다.
위키百科, 우리 모두의 百科事典.

local
 p
 =
 {}

local
 cfg
 =
 mw
.
loadData
(
'Module:Navbar/configuration'
)


local
 function
 get_title_arg
(
is_collapsible
,
 template
)

	local
 title_arg
 =
 1

	if
 is_collapsible
 then
 title_arg
 =
 2
 end

	if
 template
 then
 title_arg
 =
 'template'
 end

	return
 title_arg

end


local
 function
 choose_links
(
template
,
 args
)

	-- The show table indicates the default displayed items.

	-- view, talk, edit, hist, move, watch

	-- TODO: Move to configuration.

	local
 show
 =
 {
true
,
 true
,
 true
,
 false
,
 false
,
 false
}

	if
 template
 then

		show
[
2
]
 =
 false

		show
[
3
]
 =
 false

		local
 index
 =
 {
t
 =
 2
,
 d
 =
 2
,
 e
 =
 3
,
 h
 =
 4
,
 m
 =
 5
,
 w
 =
 6
,

			talk
 =
 2
,
 edit
 =
 3
,
 hist
 =
 4
,
 move
 =
 5
,
 watch
 =
 6
}

		-- TODO: Consider removing TableTools dependency.

		for
 _
,
 v
 in
 ipairs
(
require
 (
'Module:TableTools'
).
compressSparseArray
(
args
))
 do

			local
 num
 =
 index
[
v
]

			if
 num
 then
 show
[
num
]
 =
 true
 end

		end

	end


	local
 remove_edit_link
 =
 args
.
noedit

	if
 remove_edit_link
 then
 show
[
3
]
 =
 false
 end

	
	return
 show

	
end


local
 function
 add_link
(
link_description
,
 ul
,
 is_mini
,
 font_style
)

	local
 l

	if
 link_description
.
url
 then

		l
 =
 {
'['
,
 ''
,
 ']'
}

	else

		l
 =
 {
'[['
,
 '|'
,
 ']]'
}

	end

	ul
:
tag
(
'li'
)

		:
addClass
(
'nv-'
 ..
 link_description
.
full
)

		:
wikitext
(
l
[
1
]
 ..
 link_description
.
link
 ..
 l
[
2
])

		:
tag
(
is_mini
 and
 'abbr'
 or
 'span'
)

			:
attr
(
'title'
,
 link_description
.
html_title
)

			:
cssText
(
font_style
)

			:
wikitext
(
is_mini
 and
 link_description
.
mini
 or
 link_description
.
full
)

			:
done
()

		:
wikitext
(
l
[
3
])

		:
done
()

end


local
 function
 make_list
(
title_text
,
 has_brackets
,
 displayed_links
,
 is_mini
,
 font_style
)

	
	local
 title
 =
 mw
.
title
.
new
(
mw
.
text
.
trim
(
title_text
),
 cfg
.
title_namespace
)

	if
 not
 title
 then

		error
(
cfg
.
invalid_title
 ..
 title_text
)

	end

	local
 talkpage
 =
 title
.
talkPageTitle
 and
 title
.
talkPageTitle
.
fullText
 or
 ''

	
	-- TODO: Get link_descriptions and show into the configuration module.

	-- link_descriptions should be easier...

	local
 link_descriptions
 =
 {

		{
 [
'mini'
]
 =
 'v'
,
 [
'full'
]
 =
 '보기'
,
 [
'html_title'
]
 =
 '이 틀을 보기'
,

			[
'link'
]
 =
 title
.
fullText
,
 [
'url'
]
 =
 false
 },

		{
 [
'mini'
]
 =
 't'
,
 [
'full'
]
 =
 '討論'
,
 [
'html_title'
]
 =
 '이 틀에 關해 討論하기'
,

			[
'link'
]
 =
 talkpage
,
 [
'url'
]
 =
 false
 },

		{
 [
'mini'
]
 =
 'e'
,
 [
'full'
]
 =
 '編輯'
,
 [
'html_title'
]
 =
 '이 틀을 編輯하기'
,

			[
'link'
]
 =
 'Special:EditPage/'
 ..
 title
.
fullText
,
 [
'url'
]
 =
 false
 },

		{
 [
'mini'
]
 =
 'h'
,
 [
'full'
]
 =
 '歷史'
,
 [
'html_title'
]
 =
 '이 틀의 歷史'
,

			[
'link'
]
 =
 'Special:PageHistory/'
 ..
 title
.
fullText
,
 [
'url'
]
 =
 false
 },

		{
 [
'mini'
]
 =
 'm'
,
 [
'full'
]
 =
 '移動'
,
 [
'html_title'
]
 =
 '이 틀을 移動하기'
,

			[
'link'
]
 =
 mw
.
title
.
new
(
'Special:Movepage'
):
fullUrl
(
'target='
..
title
.
fullText
),
 [
'url'
]
 =
 true
 },

		{
 [
'mini'
]
 =
 'w'
,
 [
'full'
]
 =
 '注視'
,
 [
'html_title'
]
 =
 '이 틀을 注視하기'
,
 
			[
'link'
]
 =
 title
:
fullUrl
(
'action=watch'
),
 [
'url'
]
 =
 true
 }

	}


	local
 ul
 =
 mw
.
html
.
create
(
'ul'
)

	if
 has_brackets
 then

		ul
:
addClass
(
cfg
.
classes
.
brackets
)

			:
cssText
(
font_style
)

	end

	
	for
 i
,
 _
 in
 ipairs
(
displayed_links
)
 do

		if
 displayed_links
[
i
]
 then
 add_link
(
link_descriptions
[
i
],
 ul
,
 is_mini
,
 font_style
)
 end

	end

	return
 ul
:
done
()

	
end


function
 p
.
_navbar
(
args
)

	
	-- TODO: We probably don't need both fontstyle and fontcolor...

	local
 font_style
 =
 args
.
fontstyle

	local
 font_color
 =
 args
.
fontcolor

	local
 is_collapsible
 =
 args
.
collapsible

	local
 is_mini
 =
 args
.
mini

	local
 is_plain
 =
 args
.
plain

	
	local
 collapsible_class
 =
 nil

	if
 is_collapsible
 then

		collapsible_class
 =
 cfg
.
classes
.
collapsible

		if
 not
 is_plain
 then
 is_mini
 =
 1
 end

		if
 font_color
 then

			font_style
 =
 (
font_style
 or
 ''
)
 ..
 '; color: '
 ..
 font_color
 ..
 ';'

		end

	end

	
	local
 navbar_style
 =
 args
.
style

	local
 div
 =
 mw
.
html
.
create
():
tag
(
'div'
)

	div

		:
addClass
(
cfg
.
classes
.
navbar
)

		:
addClass
(
cfg
.
classes
.
plainlinks
)

		:
addClass
(
cfg
.
classes
.
horizontal_list
)

		:
addClass
(
collapsible_class
)
 -- we made the determination earlier

		:
cssText
(
navbar_style
)


	if
 is_mini
 then
 div
:
addClass
(
cfg
.
classes
.
mini
)
 end


	local
 box_text
 =
 (
args
.
text
 or
 cfg
.
box_text
)
 ..
 ' '

	 -- the concatenated space guarantees the box text is separated

	if
 not
 (
is_mini
 or
 is_plain
)
 then

		div

			:
tag
(
'span'
)

				:
addClass
(
cfg
.
classes
.
box_text
)

				:
cssText
(
font_style
)

				:
wikitext
(
box_text
)

	end

	
	local
 template
 =
 args
.
template

	local
 displayed_links
 =
 choose_links
(
template
,
 args
)

	local
 has_brackets
 =
 args
.
brackets

	local
 title_arg
 =
 get_title_arg
(
is_collapsible
,
 template
)

	local
 title_text
 =
 args
[
title_arg
]
 or
 (
':'
 ..
 mw
.
getCurrentFrame
():
getParent
():
getTitle
())

	local
 list
 =
 make_list
(
title_text
,
 has_brackets
,
 displayed_links
,
 is_mini
,
 font_style
)

	div
:
node
(
list
)


	if
 is_collapsible
 then

		local
 title_text_class

		if
 is_mini
 then

			title_text_class
 =
 cfg
.
classes
.
collapsible_title_mini

		else

			title_text_class
 =
 cfg
.
classes
.
collapsible_title_full

		end

		div
:
done
()

			:
tag
(
'div'
)

			:
addClass
(
title_text_class
)

			:
cssText
(
font_style
)

			:
wikitext
(
args
[
1
])

	end

	
	local
 frame
 =
 mw
.
getCurrentFrame
()

	-- hlist -> navbar is best-effort to preserve old Common.css ordering.

	return
 frame
:
extensionTag
{

		name
 =
 'templatestyles'
,
 args
 =
 {
 src
 =
 cfg
.
hlist_templatestyles
 }

	}
 ..
 frame
:
extensionTag
{

		name
 =
 'templatestyles'
,
 args
 =
 {
 src
 =
 cfg
.
templatestyles
 }

	}
 ..
 tostring
(
div
:
done
())

end


function
 p
.
navbar
(
frame
)

	return
 p
.
_navbar
(
require
(
'Module:Arguments'
).
getArgs
(
frame
))

end


return
 p