`
rainlife
  • 浏览: 233339 次
  • 性别: Icon_minigender_1
  • 来自: 我也来自火星?
社区版块
存档分类
最新评论

简单的在线编辑器,处理JSSC ver2.0的一个缺点

阅读更多

最近在JE论坛上面看到一位学生朋友实现的代码着色的JS代码,下载下来试用一下,先自己写了一个非常简单的简单的在线编辑器,类似于JE的“BBCoce编辑器”:

////////////////////////////////////////////////////////////////////////
// 简单的在线编辑器 (支持IE,OPERA,FIREFOX)                      //
// 参数说明:                                                                     //
//  htmlElement : 需要使用该在线编辑器的HTML元素             //
//  tagPrefix : 编辑器标签                                                  //
///////////////////////////////////////////////////////////////////////
function Tag(htmlElement, tagPrefix) {
    var element = document.getElementsByTagName(htmlElement)[0];
    var tagSuffix = tagPrefix.replace(/\[/ig, '[/');
            //IE
    if (document.selection && document.selection.type == "Text") {
        var sel = document.selection.createRange();
        if (sel.text.length > 0) {
            code = tagPrefix + sel.text + tagSuffix;
            sel.text = code;
        }
    } else if (window.getSelection && element.selectionStart > -1) { //如果选择textarea编辑框的第一个字符开始选择,则element.selectionStart = 0
        //firefox  需要根据光标的位置来或取选择的文本
        var startP = element.selectionStart;
        var endP = element.selectionEnd;
        if (startP != endP) {
            element.value = element.value.substring(0, startP) + tagPrefix +
                   element.value.substring(startP, endP) + tagSuffix +
                   element.value.slice(endP);
        } else {
            element.value += tagPrefix + tagSuffix;
        }
    }
}

如何使用:

<input type="button" value="Code" onclick="Tag('textarea','[code]');">
<input type="button" value="B" style="font-weight:bold;" onclick="Tag('textarea','[b]');">

 通过button的onclick事件调用Tag函数。

JCC2这个着色工具在使用的时候,是匹配页面中〈textarea name="code"〉或〈pre name="code"〉这样的元素,然后再着色,所以在显示的页面,需要加上如下的javascript代码:

<script type="text/javascript">
    jssc.colorAll("code");
</script>

当然,由于页面中标签都是“[” , “]”,首先需要在显示页面中将这些标签格式成HTML的标签:

function tagCode2html(str) {
    var searchArray = new Array(
            '\\\[b\\\]', '\\\[\\\/b\\\]',
            '\\\[i\\\]', '\\\[\\\/i\\\]', '\\\[u\\\]', '\\\[\\\/u\\\]',
            '\\\[code\\\]', '\\\[\\/code\\]'
            );
    var replaceArray = new Array(
             '<b>', '</b>', '<i>','</i>', '<u>', '</u>',
            '<textarea name=\"code\" class=\"java\">', '</textarea>'
            );
    var len = searchArray.length;
    for (var i = 0; i < len; i++) {
        re = new RegExp(searchArray[i], "ig");
        str = str.replace(re, replaceArray[i]);
    }
    return str;
}

 这样,就可以实现代码的着色。

但JCC2这个着色工具有一个致命的弱点。

看这一段代码:

E[F].parentNode.appendChild(D);
E[F].parentNode.appendChild(A);
E[F].style.display = "none" 

 将着过色后的代码,append到Node中去,这样造成的后果是:着过色后的代码,都会显示在输出文本的最后。

所以,将着色引擎换成dp.SyntaxHighlighter:

dp.SyntaxHighlighter.HighlightAll("code");

 ----------------------------------------------------------------------------------------------------------------------

解决JCCS的缺点:

E[F].parentNode.appendChild(D);
E[F].parentNode.appendChild(A);
E[F].style.display = "none"

 这三句代码改成:

E[F].parentNode.replaceChild(A,E[F]);

 使用节点A来替换E[F]节点,这样,就可以了,但还有一个问题,节点D无法append上去,暂时还没有想到解决的方法。

-----------------------------------------------------------------------------------------------------------------------

再次解决JCCS的缺点:

将colorList方法改成如下方法:

jssc.colorList = function(E) {
    for (var F in E) {
        var _ = E[F].firstChild.nodeValue,B = this.splitLine(_),C = E[F].className,$ = this.colorCode(_, B, C);
        E[F].id = "jssc" + F;
        var newNode = document.createElement("div");
        newNode.id = E[F].id
        var A = document.createElement("div"),D = document.createElement("div");
        D.innerHTML = C.substr(0, 1).toUpperCase() + C.substr(1) + " \u4ee3\u7801";
        D.innerHTML += "<span onclick='jssc.copyToClipboard(\"" + _ + "\")'>\u590d\u5236\u5230\u526a\u8d34\u677f</span>";
        D.className = "jssccodetitle";
        A.appendChild($);
        A.className = "jssc";
        newNode.appendChild(D);
        newNode.appendChild(A);
        E[F].parentNode.replaceChild(newNode, E[F]);
    }
};

 主要是新建一个div的node ---- newNode,然后将A和D都append到新建的newNode上,再用newNode去replace掉E[F]这个node。

另外,对于

copyToClipboard
这个方法也做了一点小修改,直接将着色部分的文本作为参数传递过去,而不再是传递一个Node 的 id。

 

 

 

 

 

 

 

分享到:
评论
7 楼 Army 2008-02-09  
不是,第2个回复是针对将appandChild改成replace的回复。
6 楼 rainlife 2008-02-09  
不太明白你两个帖子的意思
这个帖子:
引用
另外,其实这些问题还有个很简便的解决方法:把textarea放在一个div里……

算是对下面这个帖子:
引用
关于“copyToClipboard”方法的修改,我提一点小疑问:
源代码中有许多特殊的字符:" ' < > & \n 等等,直接将源代码文本作为参数传递过来错误是很多的,需要经过一些手段处理,如此将增加复杂性,你是怎么做的呢?

我用的另外一种方法不是太好,先听听意见。

的回复吗?
5 楼 Army 2008-02-09  
另外,其实这些问题还有个很简便的解决方法:把textarea放在一个div里……
4 楼 Army 2008-02-09  
关于“copyToClipboard”方法的修改,我提一点小疑问:
源代码中有许多特殊的字符:" ' < > & \n 等等,直接将源代码文本作为参数传递过来错误是很多的,需要经过一些手段处理,如此将增加复杂性,你是怎么做的呢?

我用的另外一种方法不是太好,先听听意见。
3 楼 rainlife 2008-02-08  
不用多谢,
引用

我觉得写一个例子的话最好能给个链接展示一下,如此能让大家更直观形象得体会~

其实这样的例子,并不会展示,应该现在网上到处都有UUB的在线编辑器,我只是看看怎么写的,另外就是试试你的代码着色工具。另外提个建议,将“拷贝到剪贴板”的样式换一下,你用〈span〉 来做,又没有提示,感觉不是太好。
2 楼 Army 2008-02-06  
我觉得写一个例子的话最好能给个链接展示一下,如此能让大家更直观形象得体会~
1 楼 Army 2008-02-06  
很高兴您能指出它的不足之处,非常感谢您的帮忙!

关于那个替换原节点,的确是我的疏忽,曾经开始时我想到使用replace,后来不知什么原因一下子给漏掉了,您的改正对我很有帮助,谢谢!

另外的两个部分也是非常好的建议,我会抽空将其修改完善的~

最后,祝大家新年愉快!

相关推荐

    jSSC-2.7.0-Release.zip

    这个库的版本2.7.0,包含在名为"jSSC-2.7.0-Release.zip"的压缩包中,为开发者提供了一个简单且高效的API来访问和控制串口。在本文中,我们将详细探讨jSSC库的核心功能、如何使用它以及串口通信的基础知识。 首先,...

    JSSC 2023.3 all papers

    Guo 等人则提出了一个高效的 Tri-State Pipelined-SAR ADC,具有很高的采样率和低噪声性能。 F. Buccoleri 等人则展示了一款高速的 Fractional-N 数字 PLL,具有低抖动和高频率特性。 Z. Deng 等人则提出了一个...

    JSSC串口通信包(jar)ver 2.9.4

    `JSSC`(Java Simple Serial Connector)是一个针对Java平台的开源库,专门用于实现串口通信功能。标题中的"JSSC串口通信包(jar)ver 2.9.4"指的是这个库的特定版本,即2.9.4,通常包含该库的可执行代码、源码以及...

    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

    2012_jssc_Processor合集

    在【压缩包子文件的文件名称列表】中,只有一个文件名"jssc",这可能是该合集中论文或报告的总览文档,包含了当年JSSC关于处理器技术的所有文章目录或者摘要。通常,这样的文档会详细列出每篇论文的标题、作者、摘要...

    关于运放的jssc经典论文

    本研究提出了一种运算放大器设计方案,该设计包含了一个互补输入级,可在全轨到轨的共模输入电压范围内工作,且具有恒定的跨导特性,即使在1.0伏特的供电电压下也能正常工作。此外,该方案还包括一个互补的AB类输出...

    IEEE JSSC论文(1月2)

    1. 高速ADC(模数转换器)与DAC(数模转换器)的设计:随着通信系统对数据速率要求的不断提高,高速转换器在信号处理中的作用日益凸显。这些论文可能会讨论新的架构设计、噪声管理策略和功耗优化技术。 2. 能效优化...

    Java调用串口包---jssc包

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

    IEEE JSSC论文集下载地址

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

    JSSC 2022.02

    这种收发器可以同时工作在两个频率带上,提高了系统的灵活性和可靠性。 2. 卫星通信系统 卫星通信系统是现代通信领域的重要组件之一。论文《A Ka-Band SATCOM Transceiver in 65-nm CMOS With High-Linearity TX ...

    JSSC_Multi_SerialPort.rar

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

    JSSC 2023.1 all papers

    本篇论文介绍了一种基于 3D 集成 SiPh-CMOS 平台的高速光学传输器,使用分段 MOSCAP 调制器实现了 100Gb/s 的高速数据传输速率。 五、A 4.6-pJ/b 200-Gb/s Analog DP-QPSK Coherent Optical Receiver in 28-nm CMOS...

    串口调试助手2.0

    RXTX提供了一个Java API,允许直接访问底层的串行和并行端口,而JSSC则是一个纯Java实现的串行通信库,无需额外的本地库支持。这些库通常包含打开、关闭串口,设置波特率、数据位、停止位、校验位,以及读写数据等...

    JSSC 2022.10

    3. **Arithmetic Progression Switched-Capacitor DC-DC Converter Topology**:论文提出了一个使用软VCR过渡和准对称两相电荷传输的算术进度开关电容直流-直流转换器拓扑。这种拓扑结构优化了转换效率和动态性能,...

    2011年IEEE JSSC论文(7月)

    这份论文集收录了2011年7月份该期刊上发布的一系列高影响力研究文章,涵盖了半导体器件、集成电路设计、模拟与数字混合信号处理等多个关键领域的最新研究成果。 JSSC作为全球最顶级的固态电路学术出版物之一,其...

    JSSC 2023.7 all papers

    ### JSSC 2023.7 特刊知识点概览 #### 一、特刊概述 **《JSSC 2023.7 all papers》**是一本聚焦于2022年欧洲固态电路会议(ESSCIRC)的特刊,...对于从事相关领域的研究人员来说,这期特刊无疑是一个宝贵的信息来源。

    IEEE JSSC论文

    - **功率控制机制**:通过在每个单元放大器与正电源之间设置一个PMOS开关,当某个单元放大器关闭时可以避免功率损耗,从而实现了更精细的功率控制。 #### 三、实验结果与性能指标 - **实测数据**:该功率放大器...

    JSSC 2022.11

    JavaScript Standard Style Check(简称JSSC)是2022年11月发布的一个版本,旨在为JavaScript开发者提供一套统一的代码风格规范和自动化检查工具。这个版本的更新可能包括对现有规则的改进、新功能的添加以及修复...

    JSSC 2-T bandgap

    标题与描述中的“JSSC 2-T bandgap”指的是发表在《IEEE固态电路杂志》(IEEE Journal of Solid-State ...这些内容共同构成了一个全面且深入的超低功耗电压参考电路设计方案,为相关领域的研究与开发提供了宝贵的参考。

    JSSC 2011年07全部论文

    JSSC 2011年07全部论文.It is good for all Master of PhD students to be familiar with all the papers in the JSSC!!!

Global site tag (gtag.js) - Google Analytics