پودمان:Navbar: تفاوت میان نسخه‌ها

از ویکی حسین
پرش به ناوبری پرش به جستجو
جز (1 نسخه واردشده)
 
جز (۱ نسخه واردشده)
 
(یک نسخهٔ میانی ویرایش شده توسط یک کاربر دیگر نشان داده نشد)
خط ۱: خط ۱:
local p = {}
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')


local getArgs
local function get_title_arg(is_collapsible, template)
local ul
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end


function p.addItem (mini, full, link, descrip, args, url)
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
local l
if url then
if link_description.url then
l = {'[', '', ']'}
l = {'[', '', ']'}
else
else
خط ۱۲: خط ۴۱:
end
end
ul:tag('li')
ul:tag('li')
:addClass('nv-'..full)
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link .. l[2])
:wikitext(l[1] .. link_description.link .. l[2])
:tag(args.mini and 'abbr' or 'span')
:tag(is_mini and 'abbr' or 'span')
:attr('title', descrip..' this template')
:attr('title', link_description.html_title)
:cssText(args.fontstyle)
:cssText(font_style)
:wikitext(args.mini and mini or full)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:done()
:wikitext(l[3])
:wikitext(l[3])
:done()
end
end


function p.brackets (position, c, args, div)
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
if args.brackets then
div
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
:tag('span')
if not title then
:css('margin-'..position, '-0.125em')
error(cfg.invalid_title .. title_text)
:cssText(args.fontstyle)
end
:wikitext(c)
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'] = 'این الگو را مشاهده کنید',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 'ب', ['full'] = 'بحث', ['html_title'] = 'بحث دربارهٔ این الگو',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'و', ['full'] = 'ویرایش', ['html_title'] = 'این الگو را ویرایش کنید',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'ت', ['full'] = 'تاریخچه', ['html_title'] = 'تاریخچهٔ این الگو',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'ا', ['full'] = 'انتقال', ['html_title'] = 'این الگو را منتقل کنید',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'پ', ['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
end
return ul:done()
end
end


function p._navbar(args)
function p._navbar(args)
local show = {true, true, true, false, false, false}
local titleArg = 1
if args.collapsible then
-- TODO: We probably don't need both fontstyle and fontcolor...
titleArg = 2
local font_style = args.fontstyle
if not args.plain then args.mini = 1 end
local font_color = args.fontcolor
if args.fontcolor then
local is_collapsible = args.collapsible
args.fontstyle = 'color:' .. args.fontcolor .. ';'
local is_mini = args.mini
end
local is_plain = args.plain
args.style = 'float:left; text-align:left'
end
if args.template then
local collapsible_class = nil
titleArg = 'template'
if is_collapsible then
show = {true, false, false, false, false, false}
collapsible_class = cfg.classes.collapsible
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
if not is_plain then is_mini = 1 end
for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
if font_color then
local num = index[v]
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
if num then show[num] = true end
end
end
end
end
if args.noedit then show[3] = false end
local navbar_style = args.style
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local title = mw.title.new(mw.text.trim(titleText), 'Template')
if not title then
error('Invalid title ' .. titleText)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
local div = mw.html.create():tag('div')
local div = mw.html.create():tag('div')
div
div
:addClass('plainlinks')
:addClass(cfg.classes.navbar)
:addClass('hlist')
:addClass(cfg.classes.plainlinks)
:addClass('navbar')
:addClass(cfg.classes.horizontal_list)
:cssText(args.style)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)


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


if not (args.mini or args.plain) then
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
div
:tag('span')
:tag('span')
:css('word-spacing', 0)
:addClass(cfg.classes.box_text)
:cssText(args.fontstyle)
:cssText(font_style)
:wikitext(args.text or 'This box:')
:wikitext(box_text)
:wikitext(' ')
end
end
p.brackets('right', '[ ', args, div)
local template = args.template
local displayed_links = choose_links(template, args)
ul = div:tag('ul')
local has_brackets = args.brackets
if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end
local title_arg = get_title_arg(is_collapsible, template)
if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end
div:node(list)
if show[5] then
 
local move = mw.title.new ('Special:Movepage')
if is_collapsible then
p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end
local title_text_class
if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
p.brackets('left', ' ]', args, div)
else
title_text_class = cfg.classes.collapsible_title_full
if args.collapsible then
end
div
div:done()
:done()
:tag('div')
:tag('div')
:addClass(title_text_class)
:css('font-size', '114%')
:cssText(font_style)
:css('margin', args.mini and '0 4em' or '0 7em')
:cssText(args.fontstyle)
:wikitext(args[1])
:wikitext(args[1])
end
end
 
return tostring(div:done())
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
end


function p.navbar(frame)
function p.navbar(frame)
if not getArgs then
return p._navbar(require('Module:Arguments').getArgs(frame))
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
end
end


return p
return p

نسخهٔ کنونی تا ‏۳ فوریهٔ ۲۰۲۲، ساعت ۱۸:۱۶

این لوآ برای اجرای {{Navbar}} است. از آن در پودمان:Navbox استفاده می‌شود.


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'] = 'ن', ['full'] = 'نمایش', ['html_title'] = 'این الگو را مشاهده کنید',
			['link'] = title.fullText, ['url'] = false },
		{ ['mini'] = 'ب', ['full'] = 'بحث', ['html_title'] = 'بحث دربارهٔ این الگو',
			['link'] = talkpage, ['url'] = false },
		{ ['mini'] = 'و', ['full'] = 'ویرایش', ['html_title'] = 'این الگو را ویرایش کنید',
			['link'] = title:fullUrl('action=edit'), ['url'] = true },
		{ ['mini'] = 'ت', ['full'] = 'تاریخچه', ['html_title'] = 'تاریخچهٔ این الگو',
			['link'] = title:fullUrl('action=history'), ['url'] = true },
		{ ['mini'] = 'ا', ['full'] = 'انتقال', ['html_title'] = 'این الگو را منتقل کنید',
			['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
		{ ['mini'] = 'پ', ['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
	
	return mw.getCurrentFrame():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