Module:Navbar

local p =

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

local function gettitlearg (is_collapsible, template)

	local title_arg = 1

	if iscollapsible then titlearg = 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

		show2 = false

		show3 = 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 = indexv

			if num then shownum = true end

		end

	end

	local removeeditlink = args.noedit

	if removeeditlink then show3 = false end

	return show

end

local function addlink (linkdescription, ul, ismini, fontstyle)

	local l

	if link_description.url then

		l = {, ,}

	else

		l = {,}

	end

	ul:tag ('li')

		:addClass ('nv-' .. linkdescription.htmlclass)

		:wikitext (l1 .. link_description.link .. l2)

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

			:attr ('title', linkdescription.htmltitle)

			:cssText (font_style)

			:wikitext (ismini and linkdescription.mini or link_description.full)

			:done

		:wikitext (l3)

		:done

end

local function makelist (titletext, hasbrackets, displayedlinks, ismini, fontstyle)

	local title = mw.title.new (mw.text.trim (titletext), cfg.titlenamespace)

	if not title then

		error (cfg.invalidtitle .. titletext)

	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' = ' 查 ', 'full' = ' 檢視 ', 'html_title' = ' 檢視該模板 ',

			'html_class' = 'view', 'link' = title.fullText, 'url' = false },

		{ 'mini' = ' 論 ', 'full' = ' 討論 ', 'html_title' = ' 討論該模板 ',

			'html_class' = 'talk', 'link' = talkpage, 'url' = false },

		{ 'mini' = ' 編 ', 'full' = ' 編輯 ', 'html_title' = ' 編輯該模板 ',

			'html_class' = 'edit', 'link' = 'Special:EditPage/' .. title.fullText, 'url' = false },

		{ 'mini' = ' 史 ', 'full' = ' 歷史 ', 'html_title' = ' 該模板的歷史 ',

			'html_class' = 'hist', 'link' = 'Special:PageHistory/' .. title.fullText, 'url' = false },

		{ 'mini' = ' 移 ', 'full' = ' 移動 ', 'html_title' = ' 移動該模板 ',

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

		{ 'mini' = ' 監 ', 'full' = ' 監視 ', 'html_title' = ' 監視該模板 ',

			'html_class' = 'watch', '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 (displayedlinks) do

		if displayedlinksi then addlink (linkdescriptionsi, ul, ismini, 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 isplain then ismini = 1 end

		if font_color then

			fontstyle = (fontstyle 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 boxtext = (args.text or cfg.boxtext) ..

	 -- the concatenated space guarantees the box text is separated

	if not (ismini or isplain) then

		div

			:tag ('span')

				:addClass (cfg.classes.box_text)

				:cssText (font_style)

				:wikitext (box_text)

	end

	local template = args.template

	local displayedlinks = chooselinks (template, args)

	local has_brackets = args.brackets

	local titlearg = gettitlearg (iscollapsible, template)

	local titletext = argstitlearg or (':' .. mw.getCurrentFrame :getParent :getTitle )

	local list = makelist (titletext, hasbrackets, displayedlinks, ismini, fontstyle)

	div:node (list)

	if is_collapsible then

		local titletextclass

		if is_mini then

			titletextclass = cfg.classes.collapsibletitlemini

		else

			titletextclass = cfg.classes.collapsibletitlefull

		end

		div:done

			:tag ('div')

			:addClass (titletextclass)

			:cssText (font_style)

			:wikitext (args1)

	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