Module:Banner shell

Documentation for this module may be created at Module:Banner shell/doc

Documentation for this module may be created at Module:Banner shell/doc

local p = {}
local yesno = require('Module:Yesno')

local shell = function(frame, header, content, collapsed, class)
	local styles = frame:extensionTag('templatestyles', '', {src = 'Module:Message box/tmbox.css'})
		.. frame:extensionTag('templatestyles', '', {src = 'Module:Banner shell/styles.css'})
	local content_row
	if content then
		content_row = mw.html.create('tr')
			:tag('td')
			:attr('colspan', '2')
			:addClass('banner-shell-inner'):addClass('outercollapse')
			:wikitext(content)
			:done()
	end
	local holder = mw.html.create('table')
		:attr('role', 'presentation')
		:addClass('tmbox'):addClass('tmbox-notice'):addClass('banner-shell')
		:addClass(class) -- allow additional class to be specified
		:addClass(content and 'mw-collapsible' or nil)
		:addClass(collapsed and 'mw-collapsed' or nil)
		:node(header)
		:node(content_row)
	return styles .. tostring(holder)
end

p.banner_holder = function(frame)
	local args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:Banner holder'}})
	local image = '[[File:' .. (args.image or 'NewFavicon icon.svg')
		.. '|' .. (args.size or '24') .. 'px'
		.. '|link=' .. (args.image_link or '')
		.. '|alt=' .. (args.alt or '') .. ']]'
	local image_cell = mw.html.create('td')
		:addClass('mbox-image')
		:wikitext(image)
	local text_cell = mw.html.create('td')
		:addClass('mbox-text'):addClass('banner-shell-header')
		:tag('span'):addClass('nowrap'):css('float', 'left'):wikitext(string.rep(' ', 10)):done()
		:wikitext(args.text or 'Other talk page banners')
	local header = mw.html.create('tr'):node(image_cell):node(text_cell)
	return shell(frame, header, args[1], yesno(args.collapsed))
end

local DuplicateBanners = function(text)
	local capture = '<span class="wpb%-project">([%w%s]*)</span>'
	local banners = {}
	for project in text:gmatch(capture) do
		if banners[project] == true then
			return project
		end
		banners[project] = true
	end
end

p.banner_shell = function(frame)
	local args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:WikiProject banner shell'}})
	local title = args.demo_page and mw.title.new(args.demo_page) or mw.title.getCurrentTitle()
	local pagetype = require('Module:Pagetype')._main{
		page = title.prefixedText,
		[1] = args.class,
		dab = 'disambiguation page',
		soft_redirect = 'soft redirect',
		defaultns = 'extended'
	}
	local classmask = require('Module:WikiProject banner').class_mask
	local class = pagetype=='article' and args.class or ''
	class = classmask(class, title.talkPageTitle, false, pagetype)
	local demo = not yesno(args.category or true, true) or args.demo_page
	local out = {}
	local addCategory = function(category, sort_key)
		if not demo and title.isTalkPage then
			local category_title = mw.title.new('Category:' .. category)
			table.insert(out, '[[' .. category_title.prefixedText .. (sort_key and ('|' .. sort_key) or '') .. ']]')
		end
	end
	if demo and not args.demo_page then
		pagetype = 'article'
	end
	if yesno(args.blp) or yesno(args.living) then
		table.insert(out, frame:expandTemplate{title = 'BLP'})
	elseif yesno(args.blpo) then
		table.insert(out, frame:expandTemplate{title = 'BLP others'})
	end
	if yesno(args.activepol) then
		table.insert(out, frame:expandTemplate{title = 'Active politician'})
	end
	if class=='' and args[1] then -- check if class parameters are defined by any project banner
		local articleclass = require('Module:WikiProject banner').readarticleclass(
			{ignore_blank = true, only_subtemplates = true},
			title.talkPageTitle.prefixedText
		)
		if articleclass~='' then -- class parameters are defined by one or more project banners
			class = nil -- no global assessment
			local raw_args = require('Module:Arguments').getArgs(frame, {
				wrappers = {'Template:WikiProject banner shell'},
				removeBlanks = false
			})
		end
	end
	local class2 = class and class~='' and (class .. '-Class') or 'Unassessed'
	local vital
	local icon_class = 'council'
	if yesno(args.vital) then
		local page = mw.ustring.upper(mw.ustring.sub(title.subjectPageTitle.text, 1, 1)) -- get first letter of article name
		local codepoint = mw.ustring.codepoint(page, 1, 1)
		if codepoint<65 or codepoint>90 then --first letter is not between A-Z
			page = 'others'
		end
		local data_page = mw.title.new('Wikipedia:Vital articles/data/' .. page .. '.json')
		if data_page.exists then
			local index = title.subjectPageTitle.text
			index = tostring(tonumber(index))==index and tonumber(index) or index --convert to number if page is numerical, otherwise loadJsonData does not work
			local data = mw.loadJsonData(data_page.fullText)[index]
			if data then
				local level = data.level and tostring(data.level)
				if level and data.topic then
					local link = 'Wikipedia:Vital articles'
					if level~='3' then
						link = link .. '/Level/' .. level
					end
					if (level=='4' or level=='5') then
						link = link .. '/' .. data.topic
					end
					if data.sublist then
						link = link .. '/' .. data.sublist
					end
					if data.section then
						link = link .. '#' .. data.section
					end
					if not mw.title.new(link).exists then -- add tracking category if link does not exist
						addCategory('Wikipedia vital articles needing attention', 'L')
					end
					vital = 'This [[File:Círculos Concéntricos.svg|16px|link=|alt=]]&nbsp;<b>[[' .. link .. '|level-' .. level .. ' vital article]]</b> '
				else
					vital = 'This vital article '
				end
				local vitalCat = function(cat, valid) -- valid is table of 3 booleans for class/level/topic, if true then category will not be populated unless valid
					local show_cat = true
					if (valid.class and (class=='NA' or class==nil or class==''))
						or (valid.level and level==nil)
						or (valid.topic and data.topic==nil) then
						show_cat = false
					end
					if show_cat then
						local category = cat:gsub('_CLASS', class2)
							:gsub('_LEVEL', level or 'unknown')
							:gsub('_TOPIC', data.topic or 'an unknown topic')
						addCategory(category)
					end
				end
				vitalCat('_CLASS vital articles', {})
				vitalCat('Wikipedia level-_LEVEL vital articles', {})
				vitalCat('Wikipedia vital articles in _TOPIC', {})
				vitalCat('_CLASS level-_LEVEL vital articles', {class=true, level=true})
				vitalCat('Wikipedia level-_LEVEL vital articles in _TOPIC', {level=true, topic=true})
				vitalCat('_CLASS vital articles in _TOPIC', {class=true, topic=true})
			else
				addCategory('Articles not listed in the vital article list')
			end
		end
	end
	local pagetype_display = pagetype=='article' and 'article'
		or pagetype=='page' and 'page'
		or ('<b>' .. pagetype .. '</b>')-- use bold if page type is not article
	local text = vital or 'This ' .. pagetype_display .. ' '
	if class or not args[1] then
		local icons = { -- map output of pagetype function to input of class icon function
			['project page'] = 'project',
			['user page'] = 'user',
			['interface page'] = 'interface',
			['help page'] = 'help',
			['module'] = 'module',
			['disambiguation page'] = 'disambig',
			['soft redirect'] = 'redirect',
			['page'] = 'na'
		}
		icon_class = class=='NA' and (icons[pagetype] or pagetype) or class
		if class=='' then
			text = text .. 'has not yet been rated'
		elseif class=='NA' then
			text = text .. 'does not require a rating'
		else
			text = text .. 'is rated <span style="font-weight:bold;">' .. class .. '-class</span>'
		end
		text = text .. ' on Wikipedia\'s [[Wikipedia:Content assessment|content assessment]] scale.'
		if args[1] then
			text = text .. '<br>It'
		elseif not yesno(args.vital) then
			addCategory(class2 .. ' articles')
		end
	end
	if args[1] then
		text = text .. ' is of interest to ' .. (yesno(args.collapsed)
			and 'multiple [[Wikipedia:WikiProject|WikiProjects]].'
			or ('the following [[Wikipedia:WikiProject|WikiProjects]]:')
		)
	end
	local icon = require('Module:Class')._icon{icon_class, size='35px'}
	local header = mw.html.create('tr')
		:tag('td'):addClass('assess'):wikitext(icon):done()
		:tag('td'):addClass('banner-shell-header'):css('text-align', 'left'):css('font-weight', 'normal'):wikitext(text):done()
	table.insert(
		out,
		shell(frame, header, args[1], yesno(args.collapsed), 'wpbs')
	)
	if args[1] then
		local duplicate_cat = DuplicateBanners(args[1])
		if duplicate_cat and title.isTalkPage then
			addCategory('Pages using WikiProject banner shell with duplicate banner templates', duplicate_cat)
		end
	end
	if args.listas then
		table.insert(out, frame:preprocess('{{DEFAULTSORT:' .. args.listas .. '}}'))
	end
	if not demo then
		local tracking = require('Module:Check for unknown parameters')._check({
			['unknown']='[[Category:Pages using WikiProject banner shell with unknown parameters|_VALUE_ ]]',
			['preview']='Page using [[Template:WikiProject banner shell]] with unknown parameter "_VALUE_"',
			'1', 'activepol', 'blp', 'blpo', 'category', 'class', 'collapsed', 'demo_page', 'listas', 'living', 'vital'
		}, frame:getParent().args)
		table.insert(out, tracking)
		for _, param in ipairs{'activepol', 'blp', 'blpo', 'category', 'collapsed', 'living'} do
			if yesno(args[param], 'invalid')=='invalid' then
				addCategory('Pages using WikiProject banner shell with invalid parameters', param)
			end
		end
		if pagetype=='article' and args.class and class=='' then -- find pages with invalid class parameter
			addCategory('Pages using WikiProject banner shell with invalid parameters', 'Zclass')
		end
	end
	return table.concat(out)
end

return p


Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.