Модуль:Sanitiser

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

Модуль для санитизации строчных стилей (style="CSS-свойства") до разрешённых свойств CSS. Полезен для стандартизации оформления и оставления отдельных допустимых возможностей оформления при отключении потенциально вредоносных для читателей.

Функция[править код]

local sanitiser = require('Module:Sanitiser')._main

sanitiser( 'background:#eaecf0; padding-left:.4em; padding-right:.4em; white-space:nowrap', { 'background' } )
-- background:#eaecf0

Образец[править код]

{{#invoke:Sanitiser|main|background:#eaecf0; padding-left:.4em; padding-right:.4em; white-space:nowrap|white-space}}

white-space:nowrap

{{#invoke:Sanitiser|main|background:#eaecf0; padding-left:.4em; padding-right:.4em; white-space:nowrap|white-space|background}}

white-space:nowrap; background:#eaecf0;


local getArgs = require('Module:Arguments').getArgs
local p = {}

-- Escape function for patterns
-- Source: https://stackoverflow.com/a/20778724
local function escape( str )
	local quotepattern = '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])'
	
	return str:gsub( quotepattern, '%%%1' )
end

-- CSS sanitiser function for usage in modules
function p._main( style, exceptions )
	local str = ''
	
	if style == nil or style == '' then
		return ''
	end
	
	-- Match safe CSS properties in provided styles
	for k, v in pairs( exceptions ) do
		local property = mw.ustring.match( style, escape( v ) .. '[^;]*;?' )
		if style ~= property and property then
			-- Don’t break CSS by random order of properties
			if str ~= '' then
				local lastChar = mw.ustring.sub( str, -1 )
				if lastChar ~= ';' then
					str = str .. ';'
				end
				
				str = str .. ' '
			end
			
			str = str .. property
		end
	end
	
	return str
end

-- Function for usage in templates
function p.main( frame )
	local args = getArgs( frame )
	local style = args[ '1' ]
	
	return p._main( style, args )
end

return p