Очистка и объединение встроенных стилей CSS
Я пытаюсь очистить введенный пользователем HTML-код, который имеет много встроенного CSS, особенно со стилями, и я не уверен, с чего начать. Кто-нибудь знает способ объединения пролетов и стилей с помощью JavaScript? Я нашел способы конвертировать встроенные стили, переместив все стили в таблицу стилей, но пока невозможно сохранить страницу CSS в нашей системе, как сейчас. (Надеюсь, это будет целью в ближайшем будущем, но не мой призыв)
Пример - перевернуть этот беспорядок:
<span style="font-size: large;"><span style="font-family: arial black,avant garde;"><span style="font-size: xx-large;"><span style="font-size: large;"><span style="font-family: arial black,avant garde;"><span style="font-size: xx-large;"><span style="color: #000000;"><span style="font-size: x-large;"><span style="font-size: large;"><span style="font-family: arial black,avant garde;"><span style="font-size: xx-large;"><span style="color: #000000;"><span style="font-size: x-large;"><a href="index.php?p=75">Home</a></span></span></span></span></span></span></span></span></span></span></span></span></span>
в это:
<span style="font-size: x-large;color: #000000;font-family: arial black,avant garde;"><a href="index.php?p=75">Home</a></span>
1 ответ
Как насчет этого?
window.onload = function(){
var spans = document.querySelectorAll('span');
for (var i = 0; i < spans.length; i++)
{
if (spans[i].hasChildNodes() && spans[i].childNodes.length == 1
&& spans[i].firstChild.tagName == 'SPAN')
{
var parent = spans[i];
var child = spans[i].firstChild;
// Copy new properties to child.
for (var j = 0; j < parent.style.length; j++)
{
var prop = parent.style[j];
if (child.style.getPropertyValue(prop) === "")
{
child.style.setProperty(
prop,
parent.style.getPropertyValue(prop),
''
);
}
}
// Replace parent with child.
parent.parentNode.insertBefore(child, parent);
parent.parentNode.removeChild(parent);
}
}
}
Это найдет все промежутки и объединит те, у которых есть только один дочерний промежуток.
Это будет игнорировать использование !important
, но я предполагаю, что это не используется в любом случае.
Кроме того, он не будет возвращать точно такие же значения свойств, так как getPropertyValue
нормализует их.
Редактировать:
Приведенный выше пример кода сокращает 13 интервалов в вашем примере до одного для меня, однако Safari отбрасывает некоторые стили в процессе.
Конечно, это довольно упрощенно и основано только на одном примере, поскольку я понятия не имею, к какому типу супа вы можете прибегнуть, или какие именно результаты вы можете ожидать.
Например, вы можете также объединить отрезки так: <p>foo<span style="font-size: x-large"> <span style="font-size: small">bar</span></span></p>
? В конечном итоге вы потеряете размер шрифта в этом месте, но это будет иметь лишь небольшое значение.
Я уверен, что таких случаев гораздо больше, поэтому все зависит от того, насколько чистым вы хотите, чтобы конечный результат был, и сколько времени вы хотите потратить на исправление всех угловых случаев.
Вы можете найти больше информации о методах DOM, которые я использовал, например, в DOM-справке Mozilla для CSSStyleDeclaration и element.