Как сделать простой prettyprint с jquery
Я пытаюсь сделать чрезвычайно простую функцию prettyprint с помощью jQuery, но я не знаю, как найти элементы, атрибуты и значения (показано в jsfiddle).
Я пытаюсь выполнить следующее:
- обернуть элементы с
<span class="element" />
- обернуть атрибуты с
<span class="attribute" />
- обернуть значения с
<span class="value" />
- заменить
<
С<
- заменить
>
С>
вот текущий jQuery, который у меня есть:
$(document).ready(function() {
$('pre.prettyprint').each(function() {
$(this).css('whitespace','pre-line');
/* Why isnt ^this^ working? */
var code = $(this).html();
// How should I define the following
var element = $(code).find(/* ELEMENTS */);
var attribute = $(code).find(/* ATTRIBUTES */);
var value = $(code).find(/* Values */);
$(element).wrap('<span class="element" />');
$(attribute).wrap('<span class="attribute" />');
$(value).wrap('<span class="value" />');
$(code).find('<').replaceWith('<');
$(code).find('>').replaceWith('>');
});
});
который пытается отформатировать этот:
<pre class="prettyprint">
<a href="http://website.com">Visit Website</a>
<a href="#top">Back to Top</a>
</pre>
в:
<pre class="prettyprint">
<span class="element">a <span class="attribute">href</span>=<span class="value">”http://website.com”</span></span>Visit Website<span class="element">/a</span>
<br/>
<span class="element">a <span class="attribute">href</span>=<span class="value">”#top”</span></span>Back to Top<span class="element">/a</span>
</pre>
спасибо заранее!
вы можете увидеть jsfiddle здесь: http://jsfiddle.net/JamesKyle/L4b8b/
3 ответов
настоящая магия будет заключаться в обработке тега произвольных свойств. Вот простая "Якорная" версия:jsFiddle
$('pre.prettyprint').each(function() {
$('a').each(function(){
$anchor = $(this);
html = '<span class="element"><a ';
html += '<span class="attribute">href</span>=<span class="value">"' + $anchor.attr('href') + '"></span>';
html += '</span>' + $anchor.text() + '<span class="element"></a></span>'
$anchor.replaceWith(html);
});
});
Я не знаю, как это сделать с jQuery, и никто другой тоже не делает, потому что это не так просто, как вы это делаете. К счастью для вас, кто-то уже написал крутое решение pretty-print в JavaScript для разметки:
http://prettydiff.com/markup_beauty.js
насколько я знаю, это самый полный алгоритм pretty-print для языков разметки, когда-либо написанных.
честно говоря, вы не сможете обернуть элементы и атрибуты, как вы хотите, используя .find()
- самый простой способ достичь того, что вы хотите, - использовать регулярные выражения, чтобы выяснить, что нужно обернуть, и применить его. Конечно, это гораздо легче сказать, чем сделать