简单的HTML美化打印

10

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

这可能是一个徒劳的尝试,但我个人认为这是可能的。

虽然我不是最擅长JavaScript或jQuery,但我认为我已经找到了一种制作简单漂亮的HTML格式化输出的简单方法。

此漂亮打印有四种代码:

  1. 普通文本
  2. 元素
  3. 属性

为了美化它,我想用它们自己的类包装元素属性


我第一个方法是存储每一种类型的元素和属性(如下所示),然后将它们与对应的span标签包装起来。

$(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');
    });
});

我想到的第二种方法是将元素检测为两个< >之间的任意文本,然后将属性检测为一个元素中被两个空格包围或者其后面紧跟一个=的文本。
$(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/


为什么不使用已经存在的几个服务器端模板引擎之一呢? - Pastor Bones
因为我完全不知道它们是如何工作的,我是一名设计师而不是开发人员。我只是认为这应该是一个相对容易的事情。 - James Kyle
3个回答

25

不要这么肯定你已经在如此少的代码行中掌握了所有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编写的最完整的美化打印器。我知道这是一个非常大胆和自负的说法,但至今还没有被挑战过。查看我的代码,如果您需要它未执行的功能,请告诉我,我会添加进去。


1
你知道如何使用这个的好资源吗?我正在设计一个易于理解的HTML和CSS指南网站(类似于w3schools,但是符合WC3推荐标准)。最终还会有Javascript/jQuery、PHP和其他一些指南。然而公司希望能够快速看到这个的模型,所以我只需要向他们展示我的成果。非常感谢任何帮助! - James Kyle
markup_beauty应用程序接受一个参数,应用程序中称为“arg”。此参数是一个对象文字,具有在顶部的“选项”部分中指定的属性。这意味着您需要编写一些代码来接受输入并将该输入打包成正确的格式。一旦打包了您的输入,您只需运行:var pretty_code = markup_beauty(your_input_object); 应用程序返回两个东西。主要是应用程序仅返回美化的代码,可以像此注释中的代码示例那样分配给变量。另一个是... - austincheney
应用程序的第二个输出被提供给“summary”变量。该变量不在应用程序范围内,因为它旨在从更高的范围中使用闭包。如果您不想使用它,则可以通过简单地删除大约1714行左右开始的最后一个函数来显著加快处理速度。如果您确实希望使用此报告,则需要在markup_beauty应用程序之外声明名为“summary”的变量。这是为了提供一种访问应用程序私有变量和数据的外部手段。 - austincheney
我会在下一次更新中更新代码中的注释,以展示一个编码示例用途。 - austincheney

0

个人而言,我会使用 pre 标签包装 HTML,而不是尝试进行任何漂亮的打印。有很多库可以用于代码格式化,只需在 Google 上搜索 pretty print 即可。只需使用 pre 标签包装 HTML 就可以自动将其转换为“打印”代码。

对于 JavaScript,您可以使用 JSON.stringify 来通过传入嵌套结构的空格数量来重新创建代码。

JSON.stringify({ name: 'value' }, null, 2); //Change to four, for four spaces

3
我不明白JSON.stringify如何帮助你漂亮打印HTML。 - ggorlen

-1
如果您正在客户端执行此操作,并且已经拥有了DOM,则更有效的方法是在进行序列化时自己插入适当的标记,而不是一次性序列化整个子树,然后尝试重新解析它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接