Простой HTML Pretty Print - PullRequest
       19

Простой HTML Pretty Print

5 голосов
/ 02 декабря 2011

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

Это может быть бесполезным усилием, но я лично считаю, что это возможно.

Я не лучший в Javascript или jQuery, однакоЯ думаю, что нашел простой способ сделать простой prettyprint для html.

В этом prettyprint есть четыре типа кода:

  1. Обычный текст
  2. Элементы
  3. Атрибуты
  4. Значения

Чтобы стилизовать это, я хочу обернуть elements, attibutes и values интервалами с собственными классами.


Первый способ сделать это - сохранить каждый вид элемента и атрибута (как показано ниже), а затем обернуть их соответствующими интервалами

$(document).ready(function() {

    $('pre.prettyprint.html').each(function() {

        $(this).css('white-space','pre-line');

        var code = $(this).html();

        var html-element = $(code).find('a, abbr, acronym, address, area, article, aside, audio, b, base, bdo, bdi, big, blockquote, body, br, button, canvas, caption, cite, code, col, colgroup, command, datalist, dd, del, details, dfn, div, dl, dt, em, embed, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, head, header, hgroup, hr, html, i, img, input, ins, kbd, keygen, label, legend, li, link, map, mark, meta, meter, nav, noscript, object, ol, optgroup, option, output, p, param, pre, progress, q, rp, rt, ruby, samp, script, section, select, small, source, span, strong, summary, style, sub, sup, table, tbody, td, textarea, tfoot, th, thead, title, time, tr, track, tt, ul, var, video, wbr');

        var html-attribute = $(code).find('abbr, accept-charset, accept, accesskey, actionm, align, alink, alt, archive, axis, background, bgcolor, border, cellpadding, cellspacing, char, charoff, charset, checked, cite, class, classid, clear, code, codebase, codetype, color, cols, colspan, compact, content, coords, data, datetime, declare, defer, dir, disabled, enctype, face, for, frame, frameborder, headers, height, href, hreflang, hspace, http-equiv, id, ismap, label, lang, language, link, longdesc, marginheight, marginwidth, maxlength, media, method, multiple, name, nohref, noresize, noshade, nowrap, object, onblur, onchange,onclick ondblclick onfocus onkeydown, onkeypress, onkeyup, onload, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onreset, onselect, onsubmit, onunload, profile, prompt, readonly, rel, rev, rows, rowspan, rules, scheme, scope, scrolling, selected, shape, size, span, src, standby, start, style, summary, tabindex, target, text, title, type, usemap, valign, value, valuetype, version, vlink, vspace, width');

        var html-value = $(code).find(/* Any instance of text inbetween two parenthesis */);

        $(element).wrap('<span class="element" />');
        $(attribute).wrap('<span class="attribute" />');
        $(value).wrap('<span class="value" />');

        $(code).find('<').replaceWith('&lt');
        $(code).find('>').replaceWith('&gt');
    });
});

Второй способ, о котором я подумал, - обнаружить elements как любое количество текста, окруженного двумя <>, а затем обнаружить attributes как текст внутри element, который либо окружен двумя пробелами, либо имеет = сразу после него.

$(document).ready(function() {

    $('pre.prettyprint.html').each(function() {

        $(this).css('white-space','pre-line');

        var code = $(this).html();

        var html-element = $(code).find(/* Any instance of text inbeween two < > */);

        var html-attribute = $(code).find(/* Any instance of text inside an element that has a = immeadiatly afterwards or has spaces on either side */);

        var html-value = $(code).find(/* Any instance of text inbetween two parenthesis */);

        $(element).wrap('<span class="element" />');
        $(attribute).wrap('<span class="attribute" />');
        $(value).wrap('<span class="value" />');

        $(code).find('<').replaceWith('&lt');
        $(code).find('>').replaceWith('&gt');
    });
});

Как будет закодирован любой из них, если это вообще возможно

Опять вы можете увидеть это здесь как jsfiddle: http://jsfiddle.net/JamesKyle/L4b8b/

Ответы [ 3 ]

18 голосов
/ 06 декабря 2011

Не будьте уверены, что вы получили все, что нужно, чтобы красиво печатать HTML в несколько строк.Мне потребовалось чуть больше года и 2000 строк, чтобы действительно понять эту тему.Вы можете просто использовать мой код напрямую или изменить его в соответствии с вашими потребностями:

https://github.com/prettydiff/prettydiff/blob/master/lib/markuppretty.js проект Github )

Вы можете продемонстрировать его на http://prettydiff.com/?m=beautify&html

Причина, по которой требуется так много кода, состоит в том, что люди действительно не понимают и не ценят важность текстовых узлов.Если вы добавляете новые и пустые текстовые узлы во время украшения, то вы делаете это неправильно и, скорее всего, портите ваш контент.Кроме того, это действительно легко испортить его другим способом и удалить пробелы внутри вашего контента.Вы должны быть осторожны с этим, иначе вы полностью разрушите целостность вашего документа.

Кроме того, что если ваш документ содержит CSS или JavaScript.Они также должны быть довольно напечатаны, но предъявляют очень разные требования к HTML.Даже HTML и XML имеют разные требования.Пожалуйста, поверьте мне на слово, что это не простая вещь, чтобы понять.HTML Tidy занимается этим уже более десяти лет и до сих пор ломает множество крайних случаев.

Насколько я знаю, мое приложение markup_beauty.js является самым полным принтером для создания красоток, написанным для HTML / XML.,Я знаю, что это очень смелое заявление, и, возможно, высокомерное, но до сих пор его никогда не оспаривали.Посмотрите мой код, и если вам нужно что-то, чего он не делает, пожалуйста, дайте мне знать, и я найду время для его добавления.

2 голосов
/ 03 декабря 2011

Лично я бы обернул HTML предварительно и не пытался делать какую-либо красивую печать.Есть множество библиотек для форматирования кода, просто хорошенькая печать.Простое добавление HTML к pre автоматически сделает его «напечатанным» кодом.

Для JavaScript вы можете использовать JSON.stringify для воссоздания кода, передавая несколько пробелов для вложенных структур.

JSON.stringify({ name: 'value' }, null, 2); //Change to four, for four spaces
0 голосов
/ 02 декабря 2011

Если вы выполняете эту клиентскую часть, и у вас уже есть DOM, то было бы эффективнее сериализовать ее самостоятельно, вставляя соответствующие тэги по ходу, а не сериализовать все поддерево сразу, а затем пытаться выполнить повторную обработку это.

...