پرش به محتوا

پودمان:InfoboxPerson/Core: تفاوت میان نسخه‌ها

از ویکی البرز
جزبدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
خط ۵۵: خط ۵۵:
-- Remove invisible Unicode characters
-- Remove invisible Unicode characters
value = mw.ustring.gsub(
value = mw.ustring.gsub(
value,
value,
'[\194\160\226\128\139\226\128\140\226\128\141\239\187\191]',
'[\226\128\139\226\128\141\239\187\191]',
''
''
)
)


if value == '' then
if value == '' then

نسخهٔ ‏۱۳ ژوئیهٔ ۲۰۲۶، ساعت ۱۲:۰۸

توضیحات این پودمان می‌تواند در پودمان:InfoboxPerson/Core/توضیحات قرار گیرد.

local p = {}

----------------------------------------------------------
-- Module:InfoboxPerson/Core
-- WikiAlborz Infobox Engine
-- Version 1.0
----------------------------------------------------------

local html = mw.html

local data = require('Module:InfoboxPerson/Data')

local lookup   = data.lookup
local layouts  = data.layouts
local groups   = data.groups
local defaults = data.defaults



----------------------------------------------------------
-- LOAD TEMPLATESTYLES
----------------------------------------------------------

local function loadStyles()

	return mw.getCurrentFrame():extensionTag{
		name = 'templatestyles',
		args = {
			src = 'Module:InfoboxPerson/styles.css'
		}
	}

end



----------------------------------------------------------
-- NORMALIZE
----------------------------------------------------------

local function normalize(value)

	if value == nil then
		return nil
	end

	value = tostring(value)

	value = mw.text.trim(value)

	if value == '' then
		return nil
	end

	-- Remove invisible Unicode characters
	value = mw.ustring.gsub(
	value,
	'[\226\128\139\226\128\141\239\187\191]',
	''
)

	if value == '' then
		return nil
	end

	return value

end



----------------------------------------------------------
-- HAS VALUE
----------------------------------------------------------

local function hasValue(value)

	return normalize(value) ~= nil

end



----------------------------------------------------------
-- READ ARGUMENT TABLE
----------------------------------------------------------

local function readArguments(source, target)

	if not source then
		return
	end

	for key, value in pairs(source) do

		key = normalize(key)
		value = normalize(value)

		if key and value then
			target[key] = value
		end

	end

end



----------------------------------------------------------
-- COLLECT ARGUMENTS
----------------------------------------------------------

local function collectArgs(frame)

	local args = {}

	local parent = frame:getParent()

	if parent then
		readArguments(parent.args, args)
	end

	readArguments(frame.args, args)

	return args

end



----------------------------------------------------------
-- RESOLVE ALIASES
----------------------------------------------------------

local function resolveArgs(rawArgs)

	local args = {}

	for key, value in pairs(rawArgs) do

		local canonical = lookup[key]

		if canonical then
			args[canonical] = value
		else
			args[key] = value
		end

	end

	return args

end



----------------------------------------------------------
-- CREATE INFOBOX
----------------------------------------------------------

local function createBox()

	return html.create('table')
		:addClass('infobox')
		:addClass('person-infobox')

end
----------------------------------------------------------
-- ADD TITLE
----------------------------------------------------------

local function addTitle(box, args)

	local title = args.name

	if not hasValue(title) then

		title = mw.title.getCurrentTitle().text

	end


	box:tag('tr')
		:tag('th')
		:attr('colspan', '2')
		:addClass('person-infobox-title')
		:wikitext(title)

end



----------------------------------------------------------
-- ADD IMAGE
----------------------------------------------------------

local function addImage(box, args)

	local image = args.image

	if not hasValue(image) then

		return

	end


	box:tag('tr')
		:tag('td')
		:attr('colspan', '2')
		:addClass('person-infobox-image')
		:wikitext(
			'[[File:' ..
			image ..
			'|' ..
			(defaults.image_size or '250px') ..
			']]'
		)


	if hasValue(args.caption) then

		box:tag('tr')
			:tag('td')
			:attr('colspan', '2')
			:addClass('person-infobox-caption')
			:wikitext(args.caption)

	end

end



----------------------------------------------------------
-- ADD HEADER
----------------------------------------------------------

local function addHeader(box, title)

	if not hasValue(title) then

		return

	end


	box:tag('tr')
		:tag('th')
		:attr('colspan', '2')
		:addClass('person-infobox-header')
		:wikitext(title)

end



----------------------------------------------------------
-- ADD ROW
----------------------------------------------------------

local function addRow(box, label, value)

	if not hasValue(value) then

		return false

	end


	local row = box:tag('tr')


	row:tag('th')
		:addClass('person-infobox-label')
		:wikitext(label)



	row:tag('td')
		:addClass('person-infobox-value')
		:wikitext(value)



	return true

end



----------------------------------------------------------
-- RENDER LAYOUT
----------------------------------------------------------

local function renderLayout(box, layout, args)

	if not layout then

		return

	end


	for i = 1, #layout do

		local item = layout[i]

		local label = item[1]
		local field = item[2]


		addRow(
			box,
			label,
			args[field]
		)

	end

end
----------------------------------------------------------
-- CHECK GROUP TRIGGER
----------------------------------------------------------

local function checkTrigger(group, args)

	if not group.trigger then

		return true

	end


	for i = 1, #group.trigger do

		local field = group.trigger[i]


		if hasValue(args[field]) then

			return true

		end

	end


	return false

end



----------------------------------------------------------
-- RENDER GROUP
----------------------------------------------------------

local function renderGroup(box, group, args)

	if not checkTrigger(group, args) then

		return

	end



	if hasValue(group.title) then

		addHeader(
			box,
			group.title
		)

	end



	renderLayout(
		box,
		layouts[group.layout],
		args
	)

end



----------------------------------------------------------
-- RENDER ALL GROUPS
----------------------------------------------------------

local function renderGroups(box, args)

	for i = 1, #groups do

		renderGroup(
			box,
			groups[i],
			args
		)

	end

end



----------------------------------------------------------
-- PREPARE ARGUMENTS
----------------------------------------------------------

local function prepareArgs(args)

	for key, value in pairs(defaults) do

		if args[key] == nil then

			args[key] = value

		end

	end


	return args

end



----------------------------------------------------------
-- RENDER INFOBOX
----------------------------------------------------------

local function render(args)

	local box = createBox()


	addTitle(
		box,
		args
	)


	addImage(
		box,
		args
	)


	renderGroups(
		box,
		args
	)


	return loadStyles()
		.. tostring(box)

end
----------------------------------------------------------
-- MAIN ENTRY POINT
----------------------------------------------------------

function p.main(frame)

	local rawArgs = collectArgs(frame)


	local args = resolveArgs(rawArgs)


	args = prepareArgs(args)


	return render(args)

end



----------------------------------------------------------
-- EXPORT
----------------------------------------------------------

return p