Module : Logoform

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Lua

Code Discussion Edit History Links Link count Subpages: Documentation Tests Results Sandbox Live code All modules

global function "format"

is invoked from e.g. Created with/layout when

  • either the name of the logo starts with U+ or &#
  • and/or an iconsize is specified .
  1. analize logo : when it contains a dot, it cannot be a codepoint
    no further checks are performed whether is is a valid file name, e.g. "U+2861.svg";
    without a dot it is assumed to be a codepoint, as e.g. ⡡
    no further checks are performed whether is is a valid codepoint,
    but the notation U+ is converted to &#x... and the display becomes tooltipped
  2. analize iconsize : when it is missing , useful defaults are set: 33px for Unicode, 36x22px for files
    when it is specified , the absence/presence of the px dimension is verified
  3. either the file, or the codepoint is displayed

With other file names and no iconsize, no invocation occurs

Code

--  Module for: Formatting Logo

local
 p
 =
 {}


local
 concat
 =
 table.concat

local
 split
 =
 mw
.
text
.
split

local
 trim
 =
 mw
.
text
.
trim

local
 upper
 =
 mw
.
ustring
.
upper

local
 sub
 =
 mw
.
ustring
.
sub


local
 function
 ucfirst
(
s
)

	return
 upper
(
sub
(
s
,
 1
,
 1
))
 ..
 sub
(
s
,
 2
)

end


function
 p
.
format
(
frame
)

	local
 gpar
 =
 frame
.
args
 -- global


	local
 fname
 =
 ucfirst
(
trim
(
gpar
[
1
]
 or
 ''
))

	if
 fname
 ==
 ''
 then
 return
 ''
 end
 -- if file name is "unspecified"


	local
 size
 =
 trim
(
gpar
[
2
]
 or
 ''
)
 -- or '0' for "unspecified"

	if
 size
:
sub
(
-
2
)
 ==
 'px'
 then
 size
 =
 size
:
sub
(
1
,
 -
3
)
 end
 -- discard 'px' unit if present

	size
 =
 split
(
size
,
 'x'
)
 -- {width, height} or {height}

	size
 =
 size
[
2
]
 and
 size
[
2
]
 or
 size
[
1
]
 -- keep only the specified height (in px)


	local
 style
 =
 trim
(
gpar
[
3
]
 or
 ''
)
 -- or '-' for "unspecified"

	if
	style
 ==
 '-'
 then
 style
 =
 ''
 end


	local
 title
 =
 trim
(
gpar
[
4
]
 or
 ''
)
 -- or '' for "unspecified"

	local
 what
 =
 split
(
fname
,
 '.'
,
 true
--[[plain, not regexp]]
)
 --[[detect a filename extension]]

	--[[if there's a non-empty part before a supported extension, with 1 to 4 characters: 'jpg', 'jpeg', 'gif', 'png', 'svg', 'webp', 'djvu', 'tif', 'tiff'...]]

	if
 #
what
 >
 1
 and
 #
(
what
[
#
what
])
 >
 0
 and
 #
(
what
[
#
what
])
 <
 5
 then

		if
 title
 ==
 ''
 then

			title
 =
 concat
(
what
,
 '.'
,
 1
,
 -
2
):
gsub
(
'_'
,
 ' '
)
 --[[default title from fname without this extension, underscores replaced by spaces]]

		end

		what
 =
 'F'
 -- displaying a file

		if
 size
 ==
 ''
 or
 size
 ==
 '0'
 then

			size
 =
 '36'
 --	default file size (in px)

		end

	elseif
 fname
:
sub
(
1
,
 2
)
 ==
 'U+'
 or
 fname
:
sub
(
1
,
 2
)
 ==
 '&#'
 then

		what
 =
 'U'
 -- displaying an Unicode code point instead of a file

		if
	size
 ==
 ''
 or
 size
 ==
 '0'
 then

			size
 =
 '15'
 -- Unicode default font-size (in px)

		end

		if
 title
 ==
 ''
 then

			title
 =
 fname
--[[default title]]

		end

		title
 =
 trim
(
title

			:
gsub
(
'U%+([0-9A-Fa-f]+) ?'
,
 function
(
x
)
 return
 'U+'
 ..
 upper
(
x
)
 ..
 ' '
 end
)

			:
gsub
(
'&#([0-9A-Fa-f]+);?'
,
 function
(
x
)
 return
 'U+'
 ..
 upper
(
x
)
 ..
 ' '
 end
))

		fname
 =
 fname

			:
gsub
(
'&#([0-9A-Fa-f]+);?'
,
 function
(
x
)
 return
 '&#x'
 ..
 upper
(
x
)
 ..
 ';'
 end
)

			:
gsub
(
'U%+([0-9A-Fa-f]+) ?'
,
 function
(
x
)
 return
 '&#x'
 ..
 upper
(
x
)
 ..
 ';'
 end
)
 ..
 '&#xFE0F;'
--[[Emoji-style variation selector 16]]

	end


	if
 what
 ==
 'F'
 then
 -- displaying a file

		if
 style
 ~=
 ''
 then

			style
 =
 '|'
 ..
 style

		end

		if
 title
 ~=
 ''
 then

			title
 =
 '|'
 ..
 title

				:
gsub
(
'%['
,
 '&#91;'
)

				:
gsub
(
'%]'
,
 '&#93;'
)

				:
gsub
(
'%|'
,
 '&#123;'
)

		end

		return
 concat
{
 '[[File:'
,
 fname
,
 '|'
,
 size
,
 'x22px'
,
 style
--[[allow linking]]
,
 title
,
 ']]'
 }

	else
 -- displaying an Unicode code point

		if
 title
 ~=
 ''
 then

			title
 =
 concat
{
 ' title="'
,
 title
:
gsub
(
'"'
,
 '&#34;'
),
 '"'
 }

		end

		return
 concat
{
 '<div style="display:inline-block;position:relative;font-size:'
,
 size
,
 'px;line-height:22px;vertical-align:middle;top:-1px'
,
 style
,
 '"'
,
 title
,
 '>'
,
 fname
,
 '</div>'
 }

	end
	
end
 -- function format


return
 p