`
Army
  • 浏览: 37351 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSSC 3 rc(js语法高亮器 ver3 rc)&& JSSC 2.2 发布。

阅读更多

http://army.512j.com/creations/code/jssc3/index.html


不到两个月的时间,jssc3的beta版再次与大家见面了。5.1这几天比较空也比较有条件,正好可以继续开发我的jssc。大概由于习惯吧,也是为了区分SyntaxHighlighter,偶一直都习惯叫它“着色”,而不是“高亮”。即使这种叫法不是很考证、很专业,但大家都明白就成了~
上次发布的jssc2获得了不少人的反馈,其中有的意见是十分有价值的,它也成为了我继续改进程序的参考。感谢所有人的关心和支持,没有你们的帮助,jssc是不可能那么顺利地发展下去的。


根据我收到的多方的信息来看,jssc3准备对以下几点进行改进:


1.string的跨行和结尾转义问题(感谢apoclast的建议):
string末尾的转义存在问题,其实在写之时我就知道有这么一个bug,只是当时想这种极端情况应该不会有人去写吧?事实也的确如此。不过这个bug不改我也一直觉得缺点什么,尤其被人提出之后。
过去也确实没有好的想法,如今我打算引入“着色模式”来进行语法分析着色:一种模式是“正则匹配”,另一种是“线性搜索”。不同的语法选择不同的模式进行解析,如此一来功能和速度都得以解决,bug也相应消除,相信它是一个很好的方案。


2.多行方式问题:
jssc3将继续沿用前两版的多行处理方式,这是自己发明的算法,和SyntaxHighlighter是不同的。由于跨行和转义的改进,多行也相应地进行了调整。实验证明它的速度在领先SyntaxHighlighter的前提下,又有了略微的提升。


3.自动装载:
有人抱怨jssc2提供的Individual(每种语言独立版本)和All-in-one(全部混在一起的版本)还是不够完善,应该有自动装载。于是,在jssc3中将使用延迟异步装载来解决这一问题,并提供一个新的版本:auto-load。


4.代码折叠(感谢jindw给与的方法提示):
如今的语法高亮器有代码折叠功能的我曾经见过,但不多(本来高亮器就不多了),应用的范围很小,功能等等都不足,我没详细研究过。SyntaxHighlighter里也没有,因此我决定尽量为每种语言加入折叠功能,它们大体上分为3种:c风格的花括号折叠、ruby风格的关键字折叠、python风格的缩进折叠。
这里面c风格的折叠功能提供的较早,而其它的语法我不太熟悉,希望他人能够多帮忙。


5.轻量级的语言解析正则的问题(感谢hax在博客中的分析):
perl风格的正则和除法在轻量级解析上不能十全十美,目前jssc的做法是尽可能地匹配一个正则表达式,并将它着色成默认颜色(即不着色),而除法的/符号也是不着色的,如此在表面上看来显示的还是正确的。因为js语法高亮的功能并不要求底层的代码解析也要完全正确,只需显示正常,因此这一点点瑕疵并不会产生影响。况且能写出极端复杂的正则的情况也是微乎其微的,可以采取一些折中。


6.html、css、xml的解析(感谢hax在博客中的分析):
jssc在解析这三种语言上还是弱项,它们本身就比较复杂,再加上有些场景会出现多种语言嵌套的问题(如html嵌套css和脚本,有的内嵌xml)等,这种情况非常复杂,轻量级的解析方法几乎无法应对。


7.别名和标题以及未知语言
新版将仿照sh的方式提供语法别名,标题也可以自定义。另外对于未知语言不报错,只是没有高亮显示,只能够最基础的分行显示。


8.其它
代码长度、复用、可维护性、结构、速度等等能改善的已经不多了,当然还会继续挖掘隐藏着的那一点点潜力。


---
以下将详细叙述主要改进的两点:“着色模式”和“折叠功能”。


1.“着色模式”
“着色模式”分“正则匹配”和“线性搜索”两种,它们分别适应不同的情况。
比如我要判断解析的代码片段是否为数字,就应该用/\d+/这样的正则来匹配,成功则相应地着色为数字。而若要解析的代码片段是个string,则无法写出完美的方案。
考虑如下一行代码:"string\"。很显然这个字符串没有闭合,当前的语境应该是:这行全为字符串,并以下面某行中第一个未被转义的"符号结束。要想改变这一情况,正则的写法必须要求"符号前不能有\转义符。
而如果出现这种情况:"string\\"。这个字符串的末尾有转义符,但转义符本身被前面的转义符给转义了,如此这个string是闭合的。而正则想要写出这种情况比较复杂。
如此递归下去:"string\\","string\\\","string\\\\"……虽然几乎没有人会写出这样的代码,但毕竟它是理论上可能的,正则在这种情况下就显得束手无策了。
为此,jssc3中采用的是jssc1里面最简单最直接也是最根本的方法:“线性搜索”。当语法分析遇到字符串开始的"符号后,将直接去查找后面的"符号,找到后统计它前面的转义字符数。如果是偶数说明没有被转移,这个string到此闭合;否则继续查找,本行内没有就继续查找后面的行,直到找到为止。
这也是设置多行方式的重要原因之一。


2.“折叠功能”
这是受jindw在它的jsi中应用相同功能的思维启发,采用深度计数器来实现。
以c系列风格语言为例:先设定aFoldList数组用以保存需要折叠的节点,aFoldDepth数组用以保存相应节点的深度。每解析一行代码时,如遇到{符号则iDepth++,并且本行节点入栈aFoldList,新的深度0入栈aFoldDepth;如遇到}符号则iDepth--,aFoldList出栈,aFoldDepth出栈。一行分析完成后aFoldDepth中所有的深度计数器自增。
在aFoldList出栈的时候,如果相应的aFoldDepth出栈的深度计数器>1,则说明aFoldList出栈的那个节点可以折叠,折叠的数目就是出栈的深度计数器-1。如此一来即使嵌套的{}折叠也得以解决。


---
自动装载的版本和普通的相差不大,只多了个通过xhr加载语法脚本的过程。你可以通过
http://army.512j.com/creations/code/jssc3/autoload.html 查看这个版本,可以看出它在功能上是没有任何区别的。


另外,由于多了折叠过程,因此jssc3在代码量和性能上要比jssc2多耗一点。如果你觉得折叠没什么用处,而且还不稳定的话,可以选择继续使用jssc2。它的核心部分已经改进,和没有折叠的jssc3是完全一样的。


jssc2:http://army.512j.com/creations/code/jssc2/index.html


好了,就到这里了,相信jssc3的正式版本很快就能和大家见面了。最后还要感谢那些给我来信、回帖的人,你们的支持和意见是无比珍贵的,它是对jssc最大的帮助!

 

分享到:
评论
30 楼 icank 2008-12-02  
呵呵,只能放弃啦。
29 楼 littcai 2008-11-28  
JSSC与mootools-1.2有冲突,怎么解决???
28 楼 icank 2008-10-27  
试了一下,确实挺不错。

不过有个问题,和 mootools 冲突。导入 mootools 就出现 javascript 错误。
不知道楼主能不能解决这个问题啊?谢谢。
我用的是 mootools 1.11 版,其他版本没有试。

再次感谢。
27 楼 weiweichen1985 2008-05-16  
不错不错。。。好东西
26 楼 trydofor 2008-05-12  
相当不错,加油.
python的折叠,是按缩进计算的.需要计算缩进量和转义换行.

关于颜色,可以参考eclipse,kate,emeditor,emacs等着色包.
关于异步载入,不知道a9text中的a9loader.js能否对你有所帮助.
因此也借宝地,给a9text做个广告:http://a9text.sf.net
25 楼 zhu18 2008-05-08  
强烈支持你!
抵制外国人的玩意。

2008年5月8日17:25:18  下班前
24 楼 Army 2008-05-07  
Moore 写道
不知道可以编辑否

那应该称之为JSSE了。

好了,放出下载rc版,等候多方反馈bug了……
23 楼 Moore 2008-05-07  
不知道可以编辑否
22 楼 Army 2008-05-07  
v2更新完毕,有了自动装载了。

css大幅更新了下。

v3的折叠还差python,谁能讲解下python的折叠方式的?另外,ruby系列语法有人熟悉吗?折叠方式正确与否?
21 楼 Army 2008-05-06  
自动装载也可以支持匿名了,ff下正常。
20 楼 Army 2008-05-06  
3个图片合一起opera不兼容,暂时改回分开的方案了。
异步装载改成延迟异步了,绕过ie下栈溢出错误。
19 楼 Army 2008-05-05  
把那3个图片都放在一个图片里了……

貌似找到原因 了……递归调用xhr自动装载脚本,ie下递归超过12次左右会栈溢出产生错误……
18 楼 Army 2008-05-05  
jindw 写道
oXmr.open("get", sUrl, false);

这句要修改。
同步请求必然导致假死。
而且你这个地方,修改成异步方式也很容易。

异步按需装载改得不是很好,其它浏览器还行,ie下第一次浏览还行,刷新一下就看不到了。

http://army.512j.com/creations/code/jssc3/autoload.js
17 楼 Army 2008-05-05  
jindw 写道
oXmr.open("get", sUrl, false);

这句要修改。
同步请求必然导致假死。
而且你这个地方,修改成异步方式也很容易。


改成异步吗?

hax 写道
建议+和-放在一个图片里。

那样要如何改变显示?

hax 写道
它可以有若干个text node。所以可以考虑用textContent属性。

OK

ps:别名更改完了,未知语法可以了,取消使用eval,参考sh的方式。集合了下c里重复率较高的关键字。

dlovek  写道
能讲解一下制作过程和心得就更好了。

这个……这可是长篇大论了……能自己看懂源码最好了……

而且,不知道,制作思路这种文章适不适合发。
16 楼 dlovek 2008-05-05  
能讲解一下制作过程和心得就更好了。
15 楼 hax 2008-05-05  
Army 写道
是+号,那个图片没存好,有30多k,重存了下变成190b了。可能网速原因当时有问题造成显示慢了些……


建议+和-放在一个图片里。

引用
终于发现为何ff处理大量代码的问题了:

若用textarea节点的话,用oTextarea.firstChild.nodeValue提取的代码只有4096字节,ff可能只支持这么大的容量,其它浏览器没问题。

若用oTextarea.value来提取内容则没有这个限制。可是若是pre标签又不支持oPre.value属性,它将是null。


它可以有若干个text node。所以可以考虑用textContent属性。
14 楼 jindw 2008-05-05  
oXmr.open("get", sUrl, false);

这句要修改。
同步请求必然导致假死。
而且你这个地方,修改成异步方式也很容易。
13 楼 Army 2008-05-05  
to dwwind:
好的。

to icank:
是+号,那个图片没存好,有30多k,重存了下变成190b了。可能网速原因当时有问题造成显示慢了些……

1. 支持未知语言格式的基本显示:
的确,当初有个模糊的理念没有细想,这个是必须的。

2.语言的别名问题:
加载某个语法的时候是用的eval(语言名称),我想应该可以用指向相同引用来解决:
jssc.csharp = {定义...}
jssc.c# = jssc.csharp

3.到可以考虑最基本的像if else提取出来作为共同的基础。

---

终于发现为何ff处理大量代码的问题了:

若用textarea节点的话,用oTextarea.firstChild.nodeValue提取的代码只有4096字节,ff可能只支持这么大的容量,其它浏览器没问题。

若用oTextarea.value来提取内容则没有这个限制。可是若是pre标签又不支持oPre.value属性,它将是null。

所以只能写成这样了oTarget.value || oTarget.firstChild.nodeValue。

另外我改了下名字,每种语言的标题名称可以自己定义,更新了,可以看到cpp变成C++,csharp变成c#了。
12 楼 hax 2008-05-05  
Quake Wang 写道
再提2个新的特性要求:
1. 支持未知语言格式的基本显示:比如在论坛中有人可能会发表一些未在列表中语言格式,<textarea name="code" class="lua"> ,我希望JSSC不报错,能够保持缩进的样式就可以了。
2. 支持语言的别名,这个是SH中有的,可以用class名为js/javascript,c#/csharp

另外是一个改进的建议:
一些代码高亮是可以重用的,比如csharp的keyWords可以扩展c的keyWords, 而reglib, collapse都是和C/Java完全一样的,能否设置成
jssc.csharp = {
  extends: "c",
  keyWords: "csharp多出来的keywords"
}

这样可以减少all-in-one.js的大小


第一点大体就是保持原样,但是可以支持行号之类的功能。



关于扩展关键字那个我不太赞同,毕竟这些语言之间并不是直接继承的关系。但可以考虑把相同的提取出来作为一个常量字符串。
11 楼 QuakeWang 2008-05-05  
再提2个新的特性要求:
1. 支持未知语言格式的基本显示:比如在论坛中有人可能会发表一些未在列表中语言格式,<textarea name="code" class="lua"> ,我希望JSSC不报错,能够保持缩进的样式就可以了。
2. 支持语言的别名,这个是SH中有的,可以用class名为js/javascript,c#/csharp

另外是一个改进的建议:
一些代码高亮是可以重用的,比如csharp的keyWords可以扩展c的keyWords, 而reglib, collapse都是和C/Java完全一样的,能否设置成
jssc.csharp = {
  extends: "c",
  keyWords: "csharp多出来的keywords"
}

这样可以减少all-in-one.js的大小

相关推荐

    JSSC串口通信包(jar)ver 2.9.4

    标题中的"JSSC串口通信包(jar)ver 2.9.4"指的是这个库的特定版本,即2.9.4,通常包含该库的可执行代码、源码以及相关的文档。 在提供的压缩包中,有三个主要的文件: 1. **jssc-2.9.4.jar**:这是核心的JSSC库...

    JSSC 2023.3 all papers

    本期刊是 IEEE 发布的 JSSC 2023 年第 3 期期刊,全文包括 Special Section、客座编辑ials 和多篇论文,每篇论文都涵盖了不同的主题和技术领域。 在客座编辑ials 部分,F. Sheikh 和 Y. Lu 为我们带来了 2022 ...

    jSSC-2.8.0(jssc.jar)

    jssc.jar java-simple-serial-connector-2.8.0.tar.gz java-simple-serial-connector-2.8.0.zip jSSC-2.8.0-Release.zip jssc-2.8.0-src.jar

    jSSC-2.7.0-Release.zip

    3. **配置串口参数**:jSSC支持设置串口的各项参数,如波特率(如9600、19200等)、数据位(通常为5、7、8位)、停止位(1或2位)和校验位(无、奇、偶、标记或空间)。 4. **读写数据**:jSSC提供读取和写入串口...

    关于运放的jssc经典论文

    ### 关于运放的jssc经典论文:1-V 运算放大器与轨到轨输入输出范围 #### 摘要 本文介绍了一种能够在极低供电电压(低至1伏特)下运行的双极型运算放大器(OA),该放大器具有轨到轨输入和输出范围。即使在如此低的...

    2012_jssc_Processor合集

    【标题】"2012_jssc_Processor合集"涉及的是2012年《Journal of Solid-State Circuits》(简称JSSC)中关于处理器技术的专题内容。JSSC是电子工程领域内非常权威的一本期刊,专注于固态电路的研究与开发,其涵盖的...

    IEEE JSSC论文集下载地址

    IEEE JSSC论文集下载电骡地址,60年代到2005年全集15G

    IEEE JSSC论文(1月2)

    《IEEE JSSC论文(1月2)》的资源包含了2011年2、3月间发表在《IEEE Journal of Solid-State Circuits》(简称JSSC)上的多篇重要学术论文。作为全球电子与固态电路领域的顶级期刊,IEEE JSSC是研究人员、工程师和...

    Java调用串口包---jssc包

    Java 读取串口数据所需要的包。通过导入jssc包。可以实现Java调用串口

    JSSC 2023.1 all papers

    JSSC 2023.1所有论文 IEEE 国际固态电路会议(ISSCC)是全球最顶尖的固态电路会议之一,每年吸引来自全球的顶尖学者和工程师参与。下面是 JSSC 2023.1 期刊中的所有论文摘要信息: 一、Introduction to the ...

    JSSC 2022.02

    JSSC 2022.02 JSSC 2022.02 是一份ieee期刊,专门出版电子电路和系统领域的研究论文。本期刊包含了多篇论文,涵盖了毫米波收发器、卫星通信、power amplifier、beamforming phased-array receiver、radiator array...

    JSSC 2022.11

    【JSSC 2022.11】——JavaScript标准选择器库 JavaScript Standard Style Check(简称JSSC)是2022年11月发布的一个版本,旨在为JavaScript开发者提供一套统一的代码风格规范和自动化检查工具。这个版本的更新可能...

    JSSC 2023.7 all papers

    ### JSSC 2023.7 特刊知识点概览 #### 一、特刊概述 **《JSSC 2023.7 all papers》**是一本聚焦于2022年欧洲固态电路会议(ESSCIRC)的特刊,由IEEE出版。该期刊旨在为固态电路领域提供最新的研究成果和技术进展。...

    JSSC 2022.10

    【JSSC 2022.10】是2022年10月出版的《固态电路国际期刊》(IJSCBC)的特辑,主要关注2021年亚洲固态电路会议(A-SSCC)的专题论文。这个特辑展示了在微电子领域,特别是固态电路设计和应用的最新研究成果。 首先,编辑...

    IEEE JSSC论文

    - **并行放大架构**:论文提出了一种由三个二进制加权的Class F单元放大器组成的并行放大架构,这些放大器与高效的功率组合网络协同工作,实现了从3位控制信号到输出射频信号幅度之间的数字模拟转换。 - **功率组合...

    2011年IEEE JSSC论文(7月)

    3. **混合信号处理**:可能包含ADC和DAC转换器设计、滤波器实现、射频前端技术等,这些都是现代通信系统中的核心组件。 4. **能源效率与电源管理**:随着便携式设备和物联网的快速发展,电源管理和能源效率成为了...

    2011年IEEE JSSC论文(4月)

    《2011年IEEE JSSC论文(4月)》是电子信息领域内一份非常珍贵的资源,由IEEE固态电路期刊(Journal of Solid-State Circuits, 简称JSSC)在2011年4月出版。IEEE JSSC作为固态电路领域的顶级学术期刊,其发表的文章...

    JSSC 2-T bandgap

    标题与描述中的“JSSC 2-T bandgap”指的是发表在《IEEE固态电路杂志》(IEEE Journal of Solid-State Circuits)上的一篇关于超低功耗、温度补偿型电压参考电路的文章。该文章详细介绍了由Mingoo Seok、Gyouho Kim...

    IEEE JSSC论文(1月)

    《IEEE JSSC论文(1月)》是一个包含2011年2、3月间在国际知名期刊IEEE Journal of Solid-State Circuits (JSSC)发表的论文集合。这本期刊是电子工程领域,尤其是固态电路设计的顶级出版物,汇集了全球顶尖科研人员...

    JSSC_Multi_SerialPort.rar

    Java,使用JSSC开源库,串口收发,自己实现了多个串口同时收发,因为通常操作串口时就有这样的需求:可能不止一个串口,下载看看吧,不会让人失望的,MainPresent.java是调用的地方由于是从项目中扣出来的,删除了...

Global site tag (gtag.js) - Google Analytics