Модуль:Emoji

Материал из Тептар — свободной энциклопедии
Перейти к навигации Перейти к поиску

Этот модуль может использоваться для отображения различных эмодзи в обсуждениях статей. Список предоставленных эмодзи находится на странице с данными. Не все эмодзи одинаково поддерживаются всеми наборами.

Используйте шаблон {{-:}} для вставки эмодзи на страницы, здесь продемонстрирована функциональность самого модуля.

Параметры[править код]

Механизм вызова: {{#invoke:Emoji|render}}. При вызове можно использовать следующие параметры (добавляются к {{#invoke}}; вариант по умолчанию выделен курсивом):

  • name — название эмодзи либо сам эмодзи (slightly_smiling_face);
  • size — размер эмодзи (16 пкс);
  • theme — тема отображения эмодзи (на выбор — Firefox OS Emoji (firefox), EmojiOne (one), Noto Color Emoji (noto) или Twitter Emoji (twitter) или тема без изображения).

Вид эмодзи по умолчанию: 🙂

Использование[править код]

Примеры использования:

  • С названием эмодзи:
    😎
    {{#invoke:Emoji|render|name=sunglasses}}
  • С эмодзи вместо его названия:
    👍
    {{#invoke:Emoji|render|name=👍}}
  • С изменением размера:
    😡
    {{#invoke:Emoji|render|name=rage|size=24}}
  • С изменением темы:
    😢
    {{#invoke:Emoji|render|name=cry|size=32|theme=twitter}}
  • Без изображения:
    😂
    {{#invoke:Emoji|render|name=joy|size=48|theme=none}}

Ошибки[править код]

Если набор эмодзи не имеет соответствующего файла для выбранного эмодзи, отображается вариант «без изображения» с подсказкой про отсутствие эмодзи в наборе:

  • 🇳🇴{{#invoke:Emoji|render|name=flag-no|theme=noto}};
  • 😡👍{{#invoke:Emoji|render|name=😡👍}}.

-- Модуль для показа эмодзи в различных конфигурациях

-- Данные эмодзи-кодов 8-)
local emoji = mw.loadData('Module:Emoji/data');
local p = {};

-- Проверка пустоты параметра :-O
local function isEmpty(s)
	return s == nil or s == ''
end

-- Вывод названия файла для показа эмодзи :-3
local function fileName(code, theme)
	-- Стиль Noto требует другого форматирования двойных эмодзи >:-(
	if theme == 'noto' then
		code = code:gsub('%-',' ')
	end

	-- Темы и их сокращения <3
	local themes = {
		['firefox'] = 'Fxemoji u' .. string.upper(code),
		['noto'] = 'Noto Emoji Pie' .. string.lower(code),
		['one'] = 'Emojione ' .. string.upper(code),
		['twitter'] = 'Twemoji12 ' .. string.lower(code),
	}
	themes['fx'] = themes['firefox'];
	themes['tw'] = themes['twitter'];

	return themes[theme]
end

-- Вывод HTML-кода соответствующих эмодзи D-:
local function toHTML(code)
	local r = ''
	if string.match(code,'-') then
		local spl = mw.text.split(code,'-',true)
		r = '&#x' .. spl[1] .. ';' .. '&#x' .. spl[2] .. ';'
	else
		r = '&#x' .. code .. ';'
	end

	return r
end

-- Получение ключей по значениям {-:
local function getKey(t, value)
	for k, v in pairs(t) do
		if v == value then return k end
	end
	return nil
end

-- Получение HTML-мнемоники из эмодзи :=|
local function getCode(str)
	local r = '';
	for i = 1, mw.ustring.len(str) do
		r = r .. string.format('%04x', mw.ustring.codepoint(str, i, (i+1))) .. '-';
	end
	return r:sub(1,-2)
end

-- Вывод названия файла ;-1
function p.fileName(frame)
	local f = frame.args
	local name = f.name
	local theme = f.theme
	local code = emoji[name]
	
	if isEmpty(code) then
		if getKey(emoji,name) ~= nil then
			code = name
		else
			code = getCode(name)
		end
	end
	
	return fileName(code, theme)
end

-- Вывод шаблона с эмодзи ;-)
function p.render(frame)
	local f = frame.args
	local name = f.name
	local size = f.size
	local theme = f.theme
	
	-- Выбор стандартного эмодзи :-)
	if isEmpty(name) then
		name = 'slightly_smiling_face'
	end

	-- Выбор стандартного размера c-:
	if isEmpty(size) then
		size = '16'
	end

	-- Выбор темы по умолчанию :->
	if isEmpty(theme) then
		theme = 'one'
	end
	
	local code = emoji[name]
	if isEmpty(code) then
		if getKey(emoji,name) ~= nil then
			code = name
		else
			code = getCode(name)
		end
	end
	local span = mw.html.create():tag('span')

	span:addClass('emoji')
	span:cssText('font-size:' .. size .. 'px; font-family:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",sans-serif; line-height:' .. size .. 'px;')

	-- Названия тем :-D
	local themes = {
		['firefox'] = 'Firefox Emoji',
		['noto'] = 'Noto Color Emoji',
		['one'] = 'EmojiOne',
		['twitter'] = 'Twitter Emoji',
	}
	themes['fx'] = themes['firefox'];
	themes['tw'] = themes['twitter'];

	-- Вывод символа или символов или файла в зависимости от темы :-*
	if theme == 'none' then
		span:attr('title',name)
		span:wikitext(toHTML(code))
	else
		local file = fileName(code, theme)
		if not isEmpty(file) then
			file = string.format('Файл:%s.svg', file)
		end
		
		if not isEmpty(file) and mw.title.new(file).fileExists then
			span:wikitext(string.format('[[%s|%spx|%s|alt=%s]]', file, size, name, toHTML(code)))
		else
			span:attr('title',string.format('Эмодзи %s нет в наборе %s',name,themes[theme]))
			span:wikitext(toHTML(code))
		end
	end

	return tostring(span:done())
end

return p