Как сделать простой prettyprint с jquery

http://jsfiddle.net/JamesKyle/L4b8b/

Я пытаюсь сделать чрезвычайно простую функцию prettyprint с помощью jQuery, но я не знаю, как найти элементы, атрибуты и значения (показано в jsfiddle).

Я пытаюсь выполнить следующее:

  1. обернуть элементы с <span class="element" />
  2. обернуть атрибуты с <span class="attribute" />
  3. обернуть значения с <span class="value" />
  4. заменить < С &lt
  5. заменить > С &gt

вот текущий 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('&lt');
        $(code).find('>').replaceWith('&gt');
    });
});

который пытается отформатировать этот:

<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">&lt;a ';
        html += '<span class="attribute">href</span>=<span class="value">"' + $anchor.attr('href') + '"&gt;</span>';
        html += '</span>' + $anchor.text() + '<span class="element">&lt;/a&gt;</span>'
        $anchor.replaceWith(html);
    });
});

Я не знаю, как это сделать с jQuery, и никто другой тоже не делает, потому что это не так просто, как вы это делаете. К счастью для вас, кто-то уже написал крутое решение pretty-print в JavaScript для разметки:

http://prettydiff.com/markup_beauty.js

насколько я знаю, это самый полный алгоритм pretty-print для языков разметки, когда-либо написанных.


честно говоря, вы не сможете обернуть элементы и атрибуты, как вы хотите, используя .find() - самый простой способ достичь того, что вы хотите, - использовать регулярные выражения, чтобы выяснить, что нужно обернуть, и применить его. Конечно, это гораздо легче сказать, чем сделать