Module:character info/sandbox

Hello, you have come here looking for the meaning of the word Module:character info/sandbox. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:character info/sandbox, but we will also tell you about its etymology, its characteristics and you will know how to say Module:character info/sandbox in singular and plural. Everything you need to know about the word Module:character info/sandbox you have here. The definition of the word Module:character info/sandbox will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:character info/sandbox, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.


local m_str_utils = require("Module:string utilities")

local cp = m_str_utils.codepoint
local decode_entities = m_str_utils.decode_entities
local encode_entities = m_str_utils.encode_entities
local floor = math.floor
local gcodepoint = m_str_utils.gcodepoint
local toNFD = mw.ustring.toNFD
local u = m_str_utils.char
local ulen = m_str_utils.len

local m_unicode = require("Module:Unicode data/sandbox")
local char_to_script = require("Module:scripts").charToScript

local export = {}

local dingbat_scripts = {
	 = true;
	 = true;
	 = true;
}

local function page_exists(title)
	local ok, title_obj = pcall(mw.title.new, title)
	if ok and title_obj then
		local ok, exists = pcall(function() return title_obj.exists end)
		return ok and exists
	else
		return false
	end
end

function export.exotic_symbol_warning(frame)
	local title = mw.title.getCurrentTitle()
	if title.exists then
		return ""
	end
	if ulen(title.fullText) ~= 1 then
		return ""
	end
	
	local codepoint = cp(title.fullText)
	local script_code = char_to_script(codepoint)

	if dingbat_scripts then
		return frame:expandTemplate { title = "editnotice-exotic symbols" }
	end

	return ""
end

local function get_codepoint(codepoint, param_name)
	codepoint = tonumber(codepoint) or decode_entities(codepoint)
	if type(codepoint) == "string" and ulen(codepoint) == 1 then
		codepoint = cp(codepoint)
	elseif type(codepoint) ~= "number" then
		error("Unrecognised string given for the " .. param_name .. " parameter")
	end
	return codepoint
end

function export._show(args, parent_title)
	local codepoint = args.codepoint
	local title = mw.title.getCurrentTitle()
	local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
	local namespace = mw.title.getCurrentTitle().nsText

	if codepoint then
		codepoint = get_codepoint(codepoint, "codepoint")
	else
		if not args.pagename and title.fullText == parent_title then
			codepoint = 0xfffd
		elseif ulen(pagename) == 1 then
			codepoint = cp(pagename)
		else
			error("Page title is not a single Unicode character")
		end
	end

	local image, image_emoji
	if args.image == "-" then
		image = nil
		image_emoji = nil
	else
		image = args.image or m_unicode.lookup_image(codepoint)
		image_emoji = args.image_emoji or m_unicode.lookup_image_emoji(codepoint)
	end

	local table_markup = {}
	table.insert(table_markup,
		'{| class="wikitable floatright character-info" style="width:25em;"\n')

	if image or image_emoji then
		local category = "]"
		if image and not image:match("\127") then -- <hiero> tags generate these; pass them through
			if image:match("^%ile:") or image:match("^%mage:") then
				image = image:gsub("^%ile:", ""):gsub("^mage:", ""):gsub("|.*", ""):gsub("]]", "")
			end
			image = "]"
			if namespace == "" then
				image = image .. category
			end
		end
		
		if image_emoji then
			if image then
				table.insert(table_markup,
					'|-\n! Text style !! Emoji style\n')
			end
			if image_emoji:match("^%ile:") or image_emoji:match("^%mage:") then
				image_emoji = image_emoji:gsub("^%ile:", ""):gsub("^mage:", ""):gsub("|.*", ""):gsub("]]", "")
			end
			image_emoji = "]"
			if namespace == "" and not image then
				image_emoji = image_emoji .. category
			end
			if image then
				table.insert(table_markup,
					('|-\n| style="text-align: center; width: 50%s;" | %s || style="text-align: center; width: 50%s;" | %s\n'):format(
						'%', image, '%', image_emoji
					)
				)
			else
				table.insert(table_markup,
					('|-\n| colspan="2" style="text-align: center;" | %s\n'):format(
						image_emoji
					)
				)
			end
			if args.caption then
				table.insert(table_markup,
				('|-\n| colspan="2 style="text-align: center;" | %s\n'):format(
					args.caption
				)
			)
			end
		else
			table.insert(table_markup,
				('|-\n| colspan="2" style="text-align: center;" | %s<br/>%s\n'):format(
					image, args.caption or ""
				)
			)
		end
	end
	local show_different_styles_if_no_emoji_image = false
	if codepoint > 127343 and codepoint < 129792 then
		show_different_styles_if_no_emoji_image = true
	end
	if show_different_styles_if_no_emoji_image or ((image_emoji or m_unicode.lookup_image_emoji(codepoint)) and not image) then
		table.insert(table_markup,
			'|-\n! Text style !! Emoji style\n')
	end
	if show_different_styles_if_no_emoji_image or image_emoji or m_unicode.lookup_image_emoji(codepoint) then
		table.insert(table_markup,
			('|- style="font-size: 250%; text-align: center; background: rgba(0,0,0,0.1);"\n| style="padding: 0;" | ' .. u(codepoint) .. '&#xFE0E; || style="padding: 0;" | ' .. u(codepoint) .. '&#xFE0F;\n|- style="font-size: 80%;"\n| colspan="2" | Text style is ] ⟨&amp;#xFE0E;⟩ and emoji style with ⟨&amp;#xFE0F;⟩.\n')
		)
	end
	if not image and not image_emoji and args.caption then
		table.insert(table_markup,
			('|-\n| colspan="2" style="text-align: center;" | %s\n'):format(
				args.caption
			)
		)
	end

	local script_code = args.sc and args.sc:getCode() or char_to_script(codepoint)
	local script_data = mw.loadData("Module:scripts/data")
		or error("No data for script code " .. script_code .. ".")
	local script_name = script_data

	local NAMESPACE = title.namespace

	local cat_name
	if not args.nocat and ((NAMESPACE == 0) or (NAMESPACE == 100)) then -- main and Appendix
		if script_data.character_category ~= nil then
			-- false means no category, overriding the default below
			cat_name = script_data.character_category or nil
		elseif script_name then
			cat_name = script_name .. " script characters"
		end
	end

	local block_name = encode_entities(args.block or m_unicode.lookup_block(codepoint))

	local aliases
	if args.aliases == "-" then
		aliases = nil
	else
		aliases = mw.loadData("Module:Unicode data/aliases")
	end

	local function parse_aliases(aliases)
		local result = {}

		if aliases then
			local classif = {}
			for i, alias in ipairs(aliases) do
				if not classif] then
					classif] = {}
				end
				table.insert(classif], encode_entities(alias))
			end

			if classif.correction then
				for i, name in ipairs(classif.correction) do
					local category = "]"
					if namespace == "" then
						table.insert(result,
							("]Corrected: %s"):format(
								name
							)
						)
					else
						table.insert(result,
							("Corrected: %s"):format(
								name
							)
						)
					end
				end
			end

			if classif.alternate then
				for i, name in ipairs(classif.alternate) do
					local category = "]"
					if namespace == "" then
						table.insert(result,
							("]Alternative: %s"):format(
								name
							)
						)
					else
						table.insert(result,
							("Alternative: %s"):format(
								name
							)
						)
					end
				end
			end

			if classif.abbreviation then
				local category = "]"
				if namespace == "" then
					table.insert(result,
						("]Abbreviation: %s"):format(
							table.concat(classif.abbreviation, ", ")
						)
					)
				else
					table.insert(result,
						("Abbreviation: %s"):format(
							table.concat(classif.abbreviation, ", ")
						)
					)
				end
			end

			local parsed_result = table.concat(result, ", ")

			return "<div>(" .. parsed_result .. ")</div>"

		end

		return ""

	end

	local li, vi, ti = nil, nil, nil

	if block_name == "Hangul Syllables" then
		local index = codepoint - 0xAC00
		li, vi, ti = floor(index / 588), floor((index % 588) / 28), index % 28
	end

	local initial_to_letter = {  =
		0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142,
		0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B,
		0x314C, 0x314D, 0x314E,
	}
		
	local vowel_to_letter = {  =
		0x314F, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156,
		0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E,
		0x315F, 0x3160, 0x3161, 0x3162, 0x3163,
	}
		
	local final_to_letter = {
		0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 
		0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 
		0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314A, 0x314B, 
		0x314C, 0x314D, 0x314E,
	}

	local function parse_composition()
		local result = nil

		if block_name == "Hangul Syllables" then
			result = ((ti ~= 0) and
				'<big class="Kore" lang="">] + ] + ]</big>' or
				'<big class="Kore" lang="">] + ]</big>'):format(
					initial_to_letter,
					vowel_to_letter,
					final_to_letter
				)
		else
			local nfd = toNFD(u(codepoint))
			if ulen(nfd) ~= 1 then
				local compo = {}
	
				for nfdcp in gcodepoint(nfd) do
					local dotted_circle = (m_unicode.is_combining(nfdcp) and "◌" or "")
					local link_target = m_unicode.get_entry_title(nfdcp)
					if not link_target or not page_exists(link_target) then
						link_target = nil
					end
					
					local script = char_to_script(nfdcp)

					local character_text =
						link_target and (']')
									:format(link_target, script, dotted_circle, nfdcp, nfdcp)
						or ('<span class="%s">%s&#%u;</span> &#91;U+%04X&#93;')
									:format(script, dotted_circle, nfdcp, nfdcp)

					table.insert(compo, '<span class="character-sample-secondary">' .. character_text .. "</span> ")
				end
			
				result = table.concat(compo, " + ")
			end
		end

		if result then
			return "Composition", result, "]"
		end

		return nil
	end

	-- [[ Egyptian Hieroglyphs
	local function parse_gardiner()
		if args.gardiner then
			local result = (
				"\n"):format(
				args.gardiner, args.gardiner
			)
			return "Gardiner number", result, "]"
		end
		return nil
	end

	local function parse_mdc()
		if args.mdc then
			return "Manuel de Codage", args.mdc, "]"
		end
		return nil
	end

	local function parse_egpz()
		if args.egpz then
			return "EGPZ 1.0", args.egpz, "]"
		end
		return nil
	end

	-- ]]

	local function middle_part()
		local rows = {}

		local function insert_row(row_title, row_contents, row_category)
			if row_contents then
				table.insert(rows,
					('<tr><td style="text-align: left">%s:</td><td>%s%s</td></tr>'):format(row_title, row_contents, row_category))
			end
		end

		insert_row(parse_composition())
		insert_row(parse_gardiner())
		insert_row(parse_egpz())
		insert_row(parse_mdc())

		if rows then
			return ('<table style="margin: 0 auto;">%s</table>')
				:format(table.concat(rows, ""))
		end

		return ""
	end

	local function present_codepoint(codepoint, np, script, combining, name, printable, title)
		local display
		local link_target
		
		if combining == nil then
			combining = m_unicode.is_combining(codepoint)
		end
		
		if printable == nil then
			printable = m_unicode.is_printable(codepoint)
		end
		
		local char = u(codepoint)
		if title == "self" or page_exists(char) then
			link_target = char
		elseif title ~= "-" then
			link_target = m_unicode.get_entry_title(codepoint)
		end

		if printable then
			display = ('<span class="character-sample-secondary %s">%s&#x%04X;</span>'):format(
				script and script:getCode() or char_to_script(codepoint),
				combining and "◌" or "", codepoint
			)
		end
		
		local arrow_and_maybe_char
		if np then
			arrow_and_maybe_char = (display or "") .. " →"
		else
			arrow_and_maybe_char = "← " .. (display or "")
		end
		
		local text = ('<span title="%s">%s<br><small></small></span>')
			:format(encode_entities(name or m_unicode.lookup_name(codepoint)),
				arrow_and_maybe_char, codepoint)
		
		if link_target then
			return ("]")
		else
			return text
		end
	end

	local function get_next(codepoint, step)
		-- Skip past noncharacters and reserved characters (Cn), private-use
		-- characters (Co), surrogates (Cs), and control characters (Cc), all
		-- of which have a label beginning in "<" rather than a proper name.
		if step < 0 and 0 < codepoint or step > 0 and codepoint < 0x10FFFF then
			repeat
				codepoint = codepoint + step
			until m_unicode.lookup_name(codepoint):sub(1, 1) ~= "<"
				or not (0 < codepoint and codepoint < 0x10FFFF)
		end

		return codepoint
	end

	local previous_codepoint =
		args.previous_codepoint and get_codepoint(args.previous_codepoint, "previous_codepoint")
		or get_next(codepoint, -1)
	local next_codepoint =
		args.next_codepoint and get_codepoint(args.next_codepoint, "next_codepoint")
		or get_next(codepoint, 1)

	local combining = args.combining
	if combining == nil then
		combining = m_unicode.is_combining(codepoint)
	end
	
	table.insert(table_markup,
		'|-\n| style="width: 70px;" colspan="2" | ' ..
		"<table>" ..
		"<tr>" ..
		"<td>" ..
			('<span class="character-sample-primary %s">%s&#%u;</span>')
				:format(script_code, combining and "◌" or "", codepoint) ..
		"</td>" ..
		"<td>" ..
			(" "):format(codepoint, codepoint) ..
			", ]\n" ..
		'<div class="character-sample-name">' ..
		encode_entities(args.name or m_unicode.lookup_name(codepoint)) ..
		"</div>" ..
		parse_aliases(aliases) ..
		"</td>" ..
		"</tr>" ..
		"</table>"
	)

	table.insert(table_markup,
		middle_part()
	)

	local previous_unassigned_first = previous_codepoint + 1
	local previous_unassigned_last = codepoint - 1
	local next_unassigned_first = codepoint + 1
	local next_unassigned_last = next_codepoint - 1

	local left_unassigned_text
	local right_unassigned_text

	if previous_codepoint == 0 then
		previous_unassigned_first = 0
	end

	if previous_unassigned_first <= previous_unassigned_last or next_unassigned_first <= next_unassigned_last then
		if previous_unassigned_first < previous_unassigned_last then
			left_unassigned_text = (""):format(previous_unassigned_first, previous_unassigned_last)
		elseif previous_unassigned_first == previous_unassigned_last then
			left_unassigned_text = (""):format(previous_unassigned_first)
		end

		if next_unassigned_first < next_unassigned_last then
			right_unassigned_text = (""):format(next_unassigned_first, next_unassigned_last)
		elseif next_unassigned_first == next_unassigned_last then
			right_unassigned_text = (""):format(next_unassigned_first)
		end
	end
	
	local unassignedsRow = 
		mw.html.create("table"):css("width", "100%"):css("font-size", "80%"):css("white-space", "nowrap")
			:tag("tr")
				:tag("td"):css("width", "50%"):css("text-align", "left"):wikitext(left_unassigned_text or ""):done()
				:tag("td"):css("width", "50%"):css("text-align", "right"):wikitext(right_unassigned_text or ""):done()
			:allDone()
	table.insert(table_markup, tostring(unassignedsRow) .."\n")
	
	local previous_codepoint_text = ""
	local next_codepoint_text = ("%s\n")
		:format(present_codepoint(next_codepoint, true,
			args.next_codepoint_sc, args.next_codepoint_combining,
			args.next_codepoint_name, args.next_codepoint_printable,
			args.next_codepoint_title))

	if previous_codepoint > 0 then
		previous_codepoint_text = ("%s\n")
			:format(present_codepoint(previous_codepoint, false,
				args.previous_codepoint_sc, args.previous_codepoint_combining,
				args.previous_codepoint_name, args.previous_codepoint_printable,
				args.previous_codepoint_title))
	end

	local block_name_text = ("]")
		:format(block_name, block_name)
	if namespace == "" then
		block_name_text = block_name_text .. ("]\n")
		:format(block_name, codepoint)
	else
		block_name_text = block_name_text .. "\n"
	end
	
	local lastRow = 
		mw.html.create("table"):css("width", "100%"):css("text-align", "center")
			:tag("tr")
				:tag("td"):css("width", "20%"):wikitext(previous_codepoint_text):done()
				-- :tag("td"):css("width", "15%")
				-- :tag("span"):wikitext(left_unassigned_text and "'''...'''" or ""):attr("title", left_unassigned_text or ""):done():done()
				:tag("td"):css("width", "60%"):css("font-size", "110%"):css("font-weight", "bold"):wikitext(block_name_text)
				-- :tag("td"):css("width", "15%")
				-- :tag("span"):wikitext(right_unassigned_text and "'''...'''" or ""):attr("title", right_unassigned_text or ""):done():done()
				:tag("td"):css("width", "20%"):wikitext(next_codepoint_text):done()
			:allDone()
	
	table.insert(table_markup, tostring(lastRow) .."\n")

	table.insert(table_markup, "|}")

	if cat_name and namespace == "" then
		table.insert(table_markup, "]")
	end
	
	table.insert(table_markup, require("Module:TemplateStyles")("Template:character info/style.css"))

	return table.concat(table_markup)
end

function export.show(frame)
	local params = {
		 = {alias_of = "codepoint"},
		 = {},
		 = {},
		 = {},
		 = {},
		 = {},
		 = {},
		 = {type = "boolean"},
		 = {type = "boolean"},
		 = {type = "boolean"},
		 = {type = "boolean"},
		 = {type = "boolean"},
		 = {type = "boolean"},
		 = {},
		 = {},
		 = {type = "script"},
		 = {type = "script"},
		 = {type = "script"},
		 = {},
		 = {},
		 = {},
		 = {},
		 = {},
		 = {},
		 = {},
		 = {type = "boolean"},
		 = {}, -- for testing etc.
	}
	local parent_frame = frame:getParent()
	local args = require("Module:parameters").process(parent_frame.args, params)
	return export._show(args, parent_frame:getTitle())
end

return export