<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Army</title>
    <description>[color=red]发上等愿，结中等缘，享下等福。
择高处立，就平处坐，往宽处行。[/color]</description>
    <link>http://army.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>JSSC 3 rc（js语法高亮器 ver3 rc）&amp;&amp; JSSC 2.2 发布。</title>
        <author>Army</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://army.javaeye.com">Army</a>&nbsp;
          链接：<a href="http://army.javaeye.com/blog/189502" style="color:red;">http://army.javaeye.com/blog/189502</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://army.512j.com/creations/code/jssc3/index.html" target="_blank">http://army.512j.com/creations/code/jssc3/index.html</a></p>
<p><a href="http://army.512j.com/creations/code/jssc3/index.html" target="_blank"></a>
<br />
不到两个月的时间，jssc3的beta版再次与大家见面了。5.1这几天比较空也比较有条件，正好可以继续开发我的jssc。大概由于习惯吧，也是为了区分SyntaxHighlighter，偶一直都习惯叫它&ldquo;着色&rdquo;，而不是&ldquo;高亮&rdquo;。即使这种叫法不是很考证、很专业，但大家都明白就成了～<br />
上次发布的jssc2获得了不少人的反馈，其中有的意见是十分有价值的，它也成为了我继续改进程序的参考。感谢所有人的关心和支持，没有你们的帮助，jssc是不可能那么顺利地发展下去的。</p>
<p><br />
根据我收到的多方的信息来看，jssc3准备对以下几点进行改进：</p>
<p><br />
<span style="color: red;">1.string的跨行和结尾转义问题（感谢apoclast的建议）：</span>
<br />
string末尾的转义存在问题，其实在写之时我就知道有这么一个bug，只是当时想这种极端情况应该不会有人去写吧？事实也的确如此。不过这个bug不改我也一直觉得缺点什么，尤其被人提出之后。<br />
过去也确实没有好的想法，如今我打算引入&ldquo;着色模式&rdquo;来进行语法分析着色：一种模式是&ldquo;正则匹配&rdquo;，另一种是&ldquo;线性搜索&rdquo;。不同的语法选择不同的模式进行解析，如此一来功能和速度都得以解决，bug也相应消除，相信它是一个很好的方案。</p>
<p><br />
<span style="color: red;">2.多行方式问题：</span>
<br />
jssc3将继续沿用前两版的多行处理方式，这是自己发明的算法，和SyntaxHighlighter是不同的。由于跨行和转义的改进，多行也相应地进行了调整。实验证明它的速度在领先SyntaxHighlighter的前提下，又有了略微的提升。</p>
<p><br />
<span style="color: red;">3.自动装载：</span>
<br />
有人抱怨jssc2提供的Individual（每种语言独立版本）和All-in-one（全部混在一起的版本）还是不够完善，应该有自动装载。于是，在jssc3中将使用延迟异步装载来解决这一问题，并提供一个新的版本：auto-load。</p>
<p><br />
<span style="color: red;">4.代码折叠（感谢jindw给与的方法提示）：</span>
<br />
如今的语法高亮器有代码折叠功能的我曾经见过，但不多（本来高亮器就不多了），应用的范围很小，功能等等都不足，我没详细研究过。SyntaxHighlighter里也没有，因此我决定尽量为每种语言加入折叠功能，它们大体上分为3种：c风格的花括号折叠、ruby风格的关键字折叠、python风格的缩进折叠。<br />
这里面c风格的折叠功能提供的较早，而其它的语法我不太熟悉，希望他人能够多帮忙。</p>
<p><br />
<span style="color: red;">5.轻量级的语言解析正则的问题（感谢hax在博客中的分析）：</span>
<br />
perl风格的正则和除法在轻量级解析上不能十全十美，目前jssc的做法是尽可能地匹配一个正则表达式，并将它着色成默认颜色（即不着色），而除法的/符号也是不着色的，如此在表面上看来显示的还是正确的。因为js语法高亮的功能并不要求底层的代码解析也要完全正确，只需显示正常，因此这一点点瑕疵并不会产生影响。况且能写出极端复杂的正则的情况也是微乎其微的，可以采取一些折中。</p>
<p><br />
<span style="color: red;">6.html、css、xml的解析（感谢hax在博客中的分析）：</span>
<br />
jssc在解析这三种语言上还是弱项，它们本身就比较复杂，再加上有些场景会出现多种语言嵌套的问题（如html嵌套css和脚本，有的内嵌xml）等，这种情况非常复杂，轻量级的解析方法几乎无法应对。</p>
<p><br />
<span style="color: red;">7.别名和标题以及未知语言</span>
<br />
新版将仿照sh的方式提供语法别名，标题也可以自定义。另外对于未知语言不报错，只是没有高亮显示，只能够最基础的分行显示。</p>
<p><br />
<span style="color: red;">8.其它</span>
<br />
代码长度、复用、可维护性、结构、速度等等能改善的已经不多了，当然还会继续挖掘隐藏着的那一点点潜力。</p>
<p><br />
---<br />
以下将详细叙述主要改进的两点：&ldquo;着色模式&rdquo;和&ldquo;折叠功能&rdquo;。</p>
<p><br />
<span style="color: blue;">1.&ldquo;着色模式&rdquo;</span>
<br />
&ldquo;着色模式&rdquo;分&ldquo;正则匹配&rdquo;和&ldquo;线性搜索&rdquo;两种，它们分别适应不同的情况。<br />
比如我要判断解析的代码片段是否为数字，就应该用/\d+/这样的正则来匹配，成功则相应地着色为数字。而若要解析的代码片段是个string，则无法写出完美的方案。<br />
考虑如下一行代码："string\"。很显然这个字符串没有闭合，当前的语境应该是：这行全为字符串，并以下面某行中第一个未被转义的"符号结束。要想改变这一情况，正则的写法必须要求"符号前不能有\转义符。<br />
而如果出现这种情况："string\\"。这个字符串的末尾有转义符，但转义符本身被前面的转义符给转义了，如此这个string是闭合的。而正则想要写出这种情况比较复杂。<br />
如此递归下去："string\\"，"string\\\"，"string\\\\"&hellip;&hellip;虽然几乎没有人会写出这样的代码，但毕竟它是理论上可能的，正则在这种情况下就显得束手无策了。<br />
为此，jssc3中采用的是jssc1里面最简单最直接也是最根本的方法：&ldquo;线性搜索&rdquo;。当语法分析遇到字符串开始的"符号后，将直接去查找后面的"符号，找到后统计它前面的转义字符数。如果是偶数说明没有被转移，这个string到此闭合；否则继续查找，本行内没有就继续查找后面的行，直到找到为止。<br />
这也是设置多行方式的重要原因之一。</p>
<p><br />
<span style="color: blue;">2.&ldquo;折叠功能&rdquo;</span>
<br />
这是受jindw在它的jsi中应用相同功能的思维启发，采用深度计数器来实现。<br />
以c系列风格语言为例：先设定aFoldList数组用以保存需要折叠的节点，aFoldDepth数组用以保存相应节点的深度。每解析一行代码时，如遇到{符号则iDepth++，并且本行节点入栈aFoldList，新的深度0入栈aFoldDepth；如遇到}符号则iDepth--，aFoldList出栈，aFoldDepth出栈。一行分析完成后aFoldDepth中所有的深度计数器自增。<br />
在aFoldList出栈的时候，如果相应的aFoldDepth出栈的深度计数器&gt;1，则说明aFoldList出栈的那个节点可以折叠，折叠的数目就是出栈的深度计数器-1。如此一来即使嵌套的{}折叠也得以解决。</p>
<p><br />
---<br />
自动装载的版本和普通的相差不大，只多了个通过xhr加载语法脚本的过程。你可以通过<a href="http://army.512j.com/creations/code/jssc3/autoload.html" target="_blank">http://army.512j.com/creations/code/jssc3/autoload.html</a>
查看这个版本，可以看出它在功能上是没有任何区别的。</p>
<p><br />
另外，由于多了折叠过程，因此jssc3在代码量和性能上要比jssc2多耗一点。如果你觉得折叠没什么用处，而且还不稳定的话，可以选择继续使用jssc2。它的核心部分已经改进，和没有折叠的jssc3是完全一样的。</p>
<p><br />
jssc2：<a href="http://army.512j.com/creations/code/jssc2/index.html" target="_blank">http://army.512j.com/creations/code/jssc2/index.html</a>
</p>
<p><br />
好了，就到这里了，相信jssc3的正式版本很快就能和大家见面了。最后还要感谢那些给我来信、回帖的人，你们的支持和意见是无比珍贵的，它是对jssc最大的帮助！</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://army.javaeye.com/blog/189502#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 20:17:26 +0800</pubDate>
        <link>http://army.javaeye.com/blog/189502</link>
        <guid>http://army.javaeye.com/blog/189502</guid>
      </item>
      <item>
        <title>尝试写了个表格装饰jstd</title>
        <author>Army</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://army.javaeye.com">Army</a>&nbsp;
          链接：<a href="http://army.javaeye.com/blog/172380" style="color:red;">http://army.javaeye.com/blog/172380</a>&nbsp;
          发表时间: 2008年03月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          预览效果：<br />jstd 0.8beta：<a href="http://army.512j.com/temp/table.html" target="_blank">http://army.512j.com/temp/table.html</a><br />jstd 0.9alpha：<a href="http://army.512j.com/temp/table2.html" target="_blank">http://army.512j.com/temp/table2.html</a><br /><br />尝试写着玩儿的，也算锻炼一下吧~<br />使用方法：先引入jstd.js文件，当然最好是在head部分了。然后在要装饰的table后面（建议body末尾）加上一句：<br />&lt;script type="text/javascript"><br />jstd.exec(id);<br />&lt;/script><br />id就是要装饰表格的id。<br /><br />0.8目前实现了排序、自定义着色（高亮），改变列宽、双击隐藏列功能。<br /><br />自定义着色方面通过color属性来，用数学上的区间来表示。比如(1,10]:#f33就是说这一列单元格的内容中如果在1和10之间（不包括1但包括10，开闭区间的不同）就着上#f33的颜色。<br /><br />排序和着色种类则是通过命名name属性来，比如int、num、string、date、price等等。<br /><br />代码写得很乱，很多地方还要改，先搞定功能后全面优化……<br /><br />今天下午尝试0.9加入拖动改变列序的时候遇到问题了，头疼好久也没搞定……只要和隐藏列混到一起就会出现问题，调试的我头都大了，虽然知道完全归于自己开始设计上的失误，也知道问题出的方向所在，可就是改不好它。都准备放弃这一功能，在jstd2里再重新设计引入了……果然还是太年轻，经验不足啊……<br /><br />另外在0.9页面里我把那几个表头上附着的红色div给显示出来了，这就是列宽和列序拖动的关键所在：每个th后面通过计算附加一个小div来实现拖拽，从而原有的table的dom没有任何改变。<br /><br />写得不是很好，提点意见吧……
          <br/>
          <span style="color:red;">
            <a href="http://army.javaeye.com/blog/172380#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 16 Mar 2008 19:03:20 +0800</pubDate>
        <link>http://army.javaeye.com/blog/172380</link>
        <guid>http://army.javaeye.com/blog/172380</guid>
      </item>
      <item>
        <title>JSSC ver2.0 正式版：挑战Google开源项目SyntaxHighlighter</title>
        <author>Army</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://army.javaeye.com">Army</a>&nbsp;
          链接：<a href="http://army.javaeye.com/blog/158778" style="color:red;">http://army.javaeye.com/blog/158778</a>&nbsp;
          发表时间: 2008年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: red">JavaScriptSyntaxColor ver2.0</span><br /><br />JS语法着色器第二版页面：<a href="http://army.512j.com/creations/code/jssc2/" target="_blank">http://army.512j.com/creations/code/jssc2/</a><br /><br />---<br /><br />Google开源项目（SyntaxHighlighter 1.51）主页：<a href="http://code.google.com/p/syntaxhighlighter/" target="_blank">http://code.google.com/p/syntaxhighlighter/</a><br /><br />JS语法着色器第一版（JavaScriptSyntaxColor ver 1.1）主页：<a href="http://army.512j.com/creations/code/highlight/" target="_blank">http://army.512j.com/creations/code/highlight/</a><br /><br />---<br /><br />去年夏天时间左右因为上编译原理课程的缘故，我写了个js的语法着色器，主要是着色js和java，后来就成为了JSC1.0版，过后我又对它进行了细微的更新，并将最终版1.1版放在了我的个人主页上。经过一段时间后，特别是在我看了当年dp.SyntaxHighlighter的部分代码（dp.SyntaxHighlighter已发布为Google下开源项目），而后又看了开源后的SyntaxHighlighter一些代码后决定重新发布新版本。<br /><br />从元旦开始，我就进行整体构思了。因为学期末的原因时间较紧，一直拖到现在放假才开行进行。不过有了第一版的基础，第二版的开发会顺利不少，但也存在许多新的难题。我准备在第二版完成之后再考虑进行第三版的开发，到时将主要添加代码折叠功能。这段假期我当然是用来学习咯～<br /><br />---<br /><br /><span style="color: blue">第一版与原先dp.SyntaxHighlighter相比存在的优缺点为：<br />1.优点<br />代码长度较短（240行对700多行）<br />着色效果更好（对字符串、数字的效果以及sh存在一个字符串bug）<br />在低版本浏览器上表现更好（我的IE6.0中若代码太长需要拖动SyntaxHighlighter会出现色块）<br />用esc进行压缩的比率更好（lv4压缩）<br />2.缺点<br />可扩展性差（每一种语言得全部重新编写）<br />支持种类少（仅js和javascript）<br />可读性差（没有进行重构）<br />支持的着色标签单一（只能textare）<br />功能方面不如<br />一些细节方面的缺陷</span><br /><br />---<br /><br /><span style="color: red">针对这些缺点我进行第二版的编写后，目前经测试版后发布beta供大家试用，请将出现的bug一一反馈给我，好进行分析修改。另外源码也是开放的，如果有好的意见和提议或是什么错误的地方也请说出来讨论。这篇文章现在发了3个论坛，就是为了集思广益。</span><br /><br />---<br /><br /><span style="color: blue">第二版与目前SyntaxHighlighter相比的优缺点为：<br />1.优点<br />代码长度更短（233行对700多行）<br />着色效果更好（保留1.1版的优势并着重加强了数字润色，并且可以交叉着色）<br />在低版本浏览器上表现更好（同第一版）<br />压缩的比率更好（可以用jsa混淆变量压缩）<br />扩展性增强（应该不相上下）<br />可读性维护性增强（也应该不相上下，不过更短的代码阅读维护应该更方便些）<br />2.缺点<br />可能存在一些细节方面的缺陷</span><br /><br />---<br /><br />第二版的代码构思一部分源于1.1版，另一部分源于开源的SyntaxHighlighter，剩下的则是新思维创造。面对1.1版的缺陷，2.0版代码在阅读性、维护性、可扩展性、着色功能、代码长度方面都提升了不少，支持的种类也只需编写相应的语法关键词和正则库即可。<br /><br />由于js运行的速度主要取决于网络下载的速度及下载量，因此在压缩率和长度均占优势的情况下jsc ver 2.0总体上还是不输给对手的。现在缺的就是继续对功能、细节以及多种语法的关键词和正则库进行编写。我会继续进行的。<br /><br />---<br /><br />使用说明：<br /><br />和SyntaxHighlighter一样，在head区里或者body区里添加js文件链接core.js，然后再将相应的语法关键词和正则库文件加入：如javascript.js，表明页面中需要对一段js代码进行着色。记得core.js必须首先添加。<br /><br />将要着色的代码放入&lt;textarea>标签中，并设置此标签的class属性为代码名，如：&lt;textarea class="javascript">，再将其命名为code，如：&lt;textarea class="javascript" name="code">，将代码放入即可。<br /><br />最后在body尾部加入：<br />&lt;script type="text/javascript"><br />jsc.colorAll("code");<br />&lt;/script><br />如此就可以了。如果命名code和你的页面有冲突，可以进行改名，并将改名之后的新名称替换body尾部中的"code"名字即可。<br /><br /><span style="color: blue">目前两种着色器都存在的bug就是：由于浏览器会将&lt;，>，&一些特殊字符解析，因此若源代码中出现他们的解析字符如：&amp;gt;，&amp;lt;，&amp;amp;则会失效，唯一的解决办法是将&替换成&amp;amp;后再进行着色。</span>
          <br/>
          <span style="color:red;">
            <a href="http://army.javaeye.com/blog/158778#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jan 2008 16:34:28 +0800</pubDate>
        <link>http://army.javaeye.com/blog/158778</link>
        <guid>http://army.javaeye.com/blog/158778</guid>
      </item>
  </channel>
</rss>