2011-12-01 58 views
3

http://jsfiddle.net/JamesKyle/L4b8b/简单的HTML代码优化

这可能是一个徒劳的努力,但我个人认为它可能。

我不是在JavaScript或jQuery的最好的,但我想我已经找到了制作一个简单的prettyprint对HTML的一个简单方法。

有四种类型的代码,在此prettyprint:

  1. 纯文本
  2. 元素
  3. 属性

为了风格化这一点,我想包装elementsattibutesvalues与自己的类跨度。


我有这样做的第一种方式是存储每个单一种类的元素和属性(如下所示)中,然后用相应的跨度包裹它们

$(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的内部文本或者由两个空间包围或具有= immedi在它之后。

$(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

而你的问题是? –

+0

实际上如何编码 –

+0

为什么不使用已经在那里的几个服务器端模板引擎之一? –

回答

17

不要那么肯定,你已经得到了所有的东西,在这么几行中漂亮地打印HTML。我花了一年多一点的时间和2000多条线来真正指出这个话题。你只可以直接使用我的代码或重构它满足您的需求:

https://github.com/prettydiff/prettydiff/blob/master/lib/markuppretty.js(和Github project

您可以在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和其他一些。然而,公司很快就想要一个模型,所以我只需要向他们展示我所拥有的东西。任何帮助是极大的赞赏! –

+0

markup_beauty应用程序只接受一个参数,在应用程序中称为“arg”。该参数是一个对象字面值,其顶部注释的“选项”部分中指定了属性。这意味着您需要编写一些代码来接受输入并将输入打包为适当的格式。一旦你的输入被打包,你只需运行:var pretty_code = markup_beauty(your_input_object);该应用程序返回两件事。主要是应用程序只返回美化的代码,它可以分配给像这个评论中的代码示例这样的变量。另一个是... – austincheney

+0

应用程序的第二个输出提供给“摘要”变量。该变量不在应用程序范围内,因为它旨在用于更高范围的闭包。如果你不想使用它,你可以通过简单地删除最后一个函数开始,直到1714行开始,你可以明显加快处理速度。如果你想使用这个报告,那么你需要在markup_beauty应用程序之外声明一个名为“summary”的变量。这对于提供一种从外部访问应用程序私有变量和数据的方法是必要的。 – austincheney

-1

如果你正在做这个客户端 - 侧,并且你已经有了DOM,那么这将是更有效的连载它自己插入适当的标签,当您去,而不是一次连载的整个子树,然后试图重新分析它。

2

个人而言,我想包HTML预,不要试图做任何漂亮的印刷。有很多图书馆的代码格式只是谷歌漂亮打印。用pre包装HTML会自动将它打印出来。

对于JavaScript,你可以使用JSON.stringify通过传递一些嵌套结构的空间来重新创建代码。

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