一个可扩展的高速UBB标签转换引擎(转帖)

转自(java手机网的一个可扩展的高速UBB标签转换引擎

一个可扩展的高速UBB标签转换引擎

编辑:rocks    审核:rocks    文章来源:本站原创

关键词:ubb    发表日期:2006-03-23 15:15:26    浏览次数:266次

 

本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>

[本文章最后由 rocks 在2006-03-23 15:21:43编辑过]

来自:http://www.cnjm.net/tech/article1263.html

下载源代码

现在UBB标签技术已经广泛的应用于网站开发中,比起直接使用Html标签,UBB标签更安全,也更容易学习。

目前各种服务器端技术,无论是CGI(perl), ASP, PHP还是JSP,在网上都能找到大量的UBB转换代码,但经过笔者的考察,大部分都是采用正则表达式匹配替换的方式实现的,用这种方式比较简单易行,但是有一些明显的缺点:

1. 性能较差,因为这种转换方法对每一种UBB标签都要做一次全文的匹配替换,所以UBB标签种类越多,速度越慢

2. 对错误的嵌套方式会做出错误的转换处理,比如"你[i]好啊[/i]",会被转换为"<b>你<i>好</b>啊</i>",这显然是错误的HTML语法,因为HTML的标签只能互相嵌套,而是不允许互相跨越的

3. 不支持同类标签的嵌套使用,比如"",会被转换为"<font color=red>你好</font>啊"

4. 扩展起来较为困难,因为需要扩展者也要有正则表达式的知识才能正确的添加新的UBB标签,而相对来说,正则表达式的理解和学习还是有一定难度的

针对这种现状,笔者在开发本站的UBB标签转换系统时使用了全新的思路和算法,即把整个文章转换成一棵由UBB标签和正文组成的树,针对每个UBB标签的树节点进行转换处理,采用这种全新算法的UBB标签转换器有以下的特点:

JAVA手机网[www.cnjm.net]1. 性能极高,对全文只扫描一遍,且和UBB标签的种类数量无关,因此可以任意添加新的UBB标签而不必担心性能会下降

2. 容错性非常好,对于上面的错误UBB语法"你[i]好啊[/i]",可以选择两种容错模式“忽略(IGNORE)”和“关闭(CLOSE)”,如果采用忽略模式,那么错误的标签会被忽略掉,也就是转换为"<b>你好</b>啊";而如果采用关闭模式,则内层的未关闭UBB标签会被自动关闭,即转换成为"<b>你<i>好</i></b>啊[/i]"。无论哪种模式,产生的HTML代码都是正确的

3. 支持同类标签的多次嵌套

4. 支持“空”标签,也就是形如[img=myimg.gif/]这样用"/]"结尾,且没有对应结束标签的UBB代码

5. 容易扩展,用户只要自定义一个UBB标签处理器,负责可能的UBB标签的鉴别工作,和最后如何对标签的属性和内嵌文本进行处理就可以了。

所谓“可能的UBB标签”,就是任何一对"["和"]"中间的内容,自定义标签处理器要负责判断这段内容是否是合法的UBB标签,并把标签分成UBB标记和标记的属性两部分,比如,引擎调用处理器的方法handler.parseTag("color=red", false),处理器应把参数分成UBB标记"color"和属性"red"两部分并作为字符串数组返回,而对于非UBB标签,比如"[转贴文章]",处理器只要简单的返回null,转换引擎就会把它作为普通文本处理。

而最后的处理工作也很简单,转换引擎会调用处理器的compose方法,把UBB标记,标记的属性和内嵌的文本传给该方法,比如handler.compose("color", "red", "你好啊", false),处理器只要简单的把它们组合成"<font color=red>你好啊</font>"并返回这个字符串就可以了。

本站的文章系统与文章评论就是使用了这套UBB处理引擎,你可以在发表评论的时候测试一下本站的UBB代码支持。

作为一个例子,下面就是一个简单的UBB标签处理器,是本站使用的UBB标签处理器的一个简化版本:

这个简单的例子支持的标签种类不多,你可以继续扩展,另外用一大堆equals挨个进行比较效率比较低,你可以用一个HashMap或Hashtable来进行快速的定位和查找。

=============================== SimpleTagHandler.java源代码 ===============================

package util;

public class SimpleTagHandler implements UBBTagHandler {

      

//    文字加粗体效果

//    文字加倾斜效果

//    文字加下划线效果

JAVA手机网[www.cnjm.net]//    改变文字大小

//    改变文字颜色

//   

这个标签是用来做为引用所设置的,如果你有什么内容是引用自别的地方,请加上这个标签!

 

//    http://www.cnjm.net

//    JAVA手机网

JAVA手机网[www.cnjm.net]//    写信给我

//    webmaster@cnjm.net

//       

  

   public SimpleTagHandler() { }

   public String[] parseTag(String s, boolean isEmpty) {

       if (isEmpty) { // 本处理器不支持空标签

           return null;

JAVA手机网[www.cnjm.net]       }

       // 如果标签中有'='号就把标签分为UBB标记和属性两部分,否则属性为null

       String tag = s, attr = null;

       int idx = s.indexOf('=');

       if (idx >= 0) {

           tag = s.substring(0, idx);

           attr = s.substring(idx + 1);

       }

       String tmp = tag.toLowerCase(); // 大小写不敏感

       // 只有下面的标记是本处理器支持的

       if ("b".equals(tmp) ||

           "i".equals(tmp) ||

           "u".equals(tmp) ||

           "size".equals(tmp) ||

           "color".equals(tmp) ||

           "quote".equals(tmp) ||

           "url".equals(tmp) ||

           "email".equals(tmp) ||

           "img".equals(tmp)) {

           return new String[] { tag, attr };

       }

       // 不是一个合法的UBB标签,作为普通文本处理

       return null;

   }

   public String compose(String tag, String attr, String data, boolean isEmpty) {

       // 针对不同标记进行组合工作

       String tmp = tag;

       if ("b".equals(tmp) ||

           "i".equals(tmp) ||

           "u".equals(tmp)) {

           return "<" + tag + ">" + data + "</" + tag + ">";

       } else if ("size".equals(tmp) ||

           "color".equals(tmp)) {

           return "<font " + tag + "='" + attr + "'>" + data + "</font>";

JAVA手机网[www.cnjm.net]       } else if ("quote".equals(tmp)) {

           return "<table cellpadding=0 cellspacing=0 width=94% bgcolor=#000000 align=center style='table-layout:fixed'><tr><td><table width=100% cellpadding=5 cellspacing=1 style='table-layout:fixed'><tr><td bgcolor=#FFFFFF style='left: 0px; width: 100%; word-wrap: break-word'>"

JAVA手机网[www.cnjm.net]                   + data + "</td></tr></table></td></tr></table>";

       } else if ("url".equals(tmp)) {

           String url = attr != null ? attr : data;

           return "<a href='" + url + "' target=_blank>" + data + "</a>";

       } else if ("email".equals(tmp)) {

           String email = attr != null ? attr : data;

           return "<a href='mailto:" + email + "'>" + data + "</a>";

JAVA手机网[www.cnjm.net]       } else if ("img".equals(tmp)) {

           return "<img src='" + data + "' border=0>";

       }

       return data;

   }

  

   // 测试代码,可以运行这个类,并把包含UBB标签的文本作为参数传入来测试

   // 比如java util.SimpleTagHandler ""

   public static void main(String[] args) throws Exception {

       System.out.println(">>>>" + args[0]);

JAVA手机网[www.cnjm.net]       // 下面采用了忽略模式来容错,你也可以用MODE_CLOSE试验一下关闭模式的容错效果

       System.out.println("=========================\n"

               + UBBDecoder.decode(args[0], new SimpleTagHandler(), UBBDecoder.MODE_IGNORE));

   }

JAVA手机网[www.cnjm.net]}

JAVA手机网[www.cnjm.net]

下载源代码

来自:http://www.cnjm.net/tech/article1263.html

 

 

 

相关文章

    使用Java实现UBBCode的转换  [2006-03-03]

 

学习日记开源项目答疑区

    在这里,您可以把您在学习日记开源项目开发中和安装使用中碰到的疑问以日记的形式提出来,我们程序员练功场聘请的顾问会来这里查看并也许会解答您的问题。

    但是,如果您需要某一位特定顾问的解答,请在私下与他联系。否则,您的疑问是向任何一位顾问提出。

    当然,在这一个答疑区中的问题也并不是只能由顾问解答,如果您知道某一个问题的答案或线索,诚恳的希望您能站出来说一下。这样也可以减少顾问们的劳动量。如果您的回答有什么错漏,别人也可以为您提出来。

学习日记开源项目

学习日记开源项目

1、简介

    就是学习日记网站正在运行的这个基于JSP+STRUTS+MYSQL这个类似blog的web程序,目前以BSD形式的开源项目发布。详情请见我们的学习日记开源社区的项目概述。如果你有兴趣和时间的话,请加入我们吧。

2、练功场所

    1)、学习日记开源社区提供CVS库、bug跟踪系统、邮件列表等等;

    2)、学习日记开源社区提供给大家互相交流开发心得,为着把学习日记做成一个信息时代的学习交流平台而互相鼓励、互相帮助。

3、加入方式

    1)、如果您确定要成为一名学习日记开源平台的开发者,愿意向CVS库提交代码,请在开源社区注册一个用户(最好与123行动!网站的一样),并把你的相关情况(技术经历、加入目的、可以有多少参与开发的时间、愿意参与的模块、对学习日记开源项目的意见或建议、电子邮件等等)和开源社区注册名告知我们(在“123行动!成功互助组织”留言或通过开发社区的电子邮件),由我们审定并确定是否把您加为CVS库的代码提交者;

4、加入这个开源项目有什么回报吗?

    目前没有任何有形的回报,但任何人的细微贡献都会记录在案。

5、与学习日记开源项目有关的目标分类

   

    1)、大家如果有什么关于学习日记内容、形式、开发等创意的灵感可以以日记的形式记在这里供大家交流一下: 学习日记创意集锦,已有的创意

 

    2)、 学习日记项目需求分析设计阶段遇到的技术性问题和解决方案,和有关的学习资料、学习心得:学习日记开发小组需求分析设计区 ,已有的相关资料

 

    3)、在学习日记项目实施阶段遇到的技术性问题和解决方案,和有关的学习资料、学习心得:学习日记开发小组项目实施社区,已有的相关资料

 

    4)、用于汇总学习日记开发过程中的一些文档本站的一些历史文档,例如:贡献人员名单,具有阶段性意义的各种信件,项目开发计划,进度报表: 学习日记开发小组文档维护队工作区,已有的相关文档

程序员练功场答疑区

    在这里,您可以把您在程序员练功场中碰到的疑问以日记的形式提出来,我们程序员练功场聘请的顾问会来这里查看并也许会解答您的问题。

    但是,如果您需要某一位特定顾问的解答,请在私下与他联系。否则,您的疑问是向任何一位顾问提出。

    当然,在这一个答疑区中的问题也并不是只能由顾问解答,如果您知道某一个问题的答案或线索,诚恳的希望您能站出来说一下。这样也可以减少顾问们的劳动量。如果您的回答有什么错漏,别人也可以为您提出来。

程序员练功场

程序员练功场

1、简介

    以一个个小的目标为导向进行程序设计实战与交流。

2、练功场所

    1)、开源社区学习日记提供CVS库、bug跟踪系统、邮件列表等等;

    2)、交流场所学习日记网站提供大家互相交流练功心得,为着一个既定的程序设计目标互相鼓励、互相帮助。

3、加入方式

    1)、确定您想实现的一个程序设计目标,提出你的设想,然后把您的目标添加到行动网站的目标体系中

    2)、在“程序员练功场”中回复,告知你加入练功场的既定程序目标是哪一个;

    3)、别人如果对你的这个目标感兴趣的话,就可以加入这个目标(通过在首页上点击相应目标的加入按纽或者直接在相应的目标中写作日记),并在对应目标的评论中回复加入请求;

    4)、如果您的目标有必要建一个CVS库,根据您向本站提出的申请(请在留言板中留言),我们会在开源社区学习日记为您建一个仅加入成员可以看见的CVS库;

    5)、如果您确定在一个目标程序中向CVS库提交代码,请在开源社区注册注册一个用户(最好与123行动!网站的一样),并把你的相关情况和开源社区注册名告知目标的发起者(在对应目标的回复中或通过开发社区的电子邮件),由他审定把您加为CVS库的代码提交者;

4、练功成果处理

    由目标的发起人和参与者共同决定,原则上是作为开源项目提供给大家使用。作为开源项目后,根据目标发起人的申请,本站可以向开源社区提供者提出申请,把对应的目标项目转为公共开源项目(任何人都可见)。

5、诚恳邀请程序设计高手担任练功场顾问

    如果一群低手凑在一起为一个程序目标奋斗的过程中,能有先行者抽出宝贵的一点时间来为我们指点一二的话,也许我们会少走许多弯路。诚邀各路高手担任行动练功场的顾问,能抽点宝贵的时间来我们的程序员练功场答疑区指点一下正处于迷茫的我们。我们将感激不尽。您若有意成为我们的顾问,请在本站的留言板中留言。我们将把顾问名单和您愿意公布的个人资料公布在本站上。有一点,因为我们是非赢利性质的成功互助组织,所以目前没有任何有形的回报给你们,有的只是我们的一片感激之意。

附录:与程序设计相关的推荐学习目标


  1)学习软件工程

  2)学习UML建模

  3)学习设计模式

  4) java学习日记!

  5)JSP技术

  6)一起学习Struts(MVC)

  7)学习页面制作

  8)使用mysql数据库

  9)学习struts程序的测试技术

  10)jsp图形开发环境的学习

  11)学习cvs

  更多有用的程序设计相关目标等待着您的意见和建议。

本站帖子添加UBB语法标签支持

本站帖子添加UBB语法标签支持

    UBB标签就是不允许使用HTML语法的情况下,通过特殊转换程序,以至可以支持少量常用的、无危害性的HTML效果显示。我们的UBB标签转换引擎基于中国JAVA手机网的一个可扩展的高速UBB标签转换引擎扩展改造,特别向中国JAVA手机网表示感谢。

    本站目前支持下列UBB语法标签,并在继续完善中:

     下面的示范中冒号前面是功能说明,后面是效果显示。为了在本帖中示范用法,在最前面的半边方括号后额外的加了一个点号来避免UBB转换,实际使用时请取消点号。

    * [.b]文字加粗体效果[/b]:文字加粗体效果

    * [.i]文字加倾斜效果[/i]:文字加倾斜效果

    * [.u]文字加下划线效果[/u]:文字加下划线效果

    * [.size=4]改变文字大小[/size]:改变文字大小

    * [.color=red]改变文字颜色[/color]:改变文字颜色

    * [.face=黑体]改变文字字体[/face]:改变文字字体

    * [.align=center]文字居中[/align]:

文字居中

    * [.quote]这个标签是用来做为引用所设置的,如果你有什么内容是引用自别的地方,请加上这个标签![/quote]:

这个标签是用来做为引用所设置的,如果你有什么内容是引用自别的地方,请加上这个标签!

    * [.url]http://java.learndiary.com[/url]: http://java.learndiary.com

    * [.url=http://java.learndiary.com]JAVA学习日记[/url]:JAVA学习日记

    * [.download]http://java.learndiary.com/download/learndiaryV0.9.0.4.war[/download]:http://java.learndiary.com/download/learndiaryV0.9.0.4.war

    * [.download=http://java.learndiary.com/download/learndiaryV0.9.0.4.war]下载学习日记V0.9.0.4[/download]:下载学习日记V0.9.0.4

    * [.email=mdx-xx@tom.com]写信给我[/email]:写信给我

    * [.email]mdx-xx@tom.com[/email]:mdx-xx@tom.com

    * [.img]http://java.learndiary.com/pictures/bull_motor.gif[/img] :

在Linux环境中使用USB接口的存储设备(转帖)

在Linux环境中使用USB接口的存储设备

(转自:(赛迪网社区Linux俱乐部)http://bbs.ccidnet.com/showthread.php?threadid=211409)

如何在Linux环境中使用USB接口的存储设备?这是各大电脑论坛上出现得比较多的一个问题,同此可见这也是摆在许多电脑玩家面前的一道难题。本文就为您提供一套完美的解决方案,通过下面的方法,您仅可以在Linux环境中方便地使用U盘、USB硬盘盒,而且还能将数码相机作为USB大容量存储器。这里就以Red  Hat  Linux  7.2为例,来一步一步地介绍如何在Linux环境中使用USB存储器。

  1.在X-Windows环境中打开“控制中心”,展开“信息→USB设备”控制台树,查看Linux是否已经正确识别您的USB存储器,如果没有看到USB设备信息,那么您就应该要检查USB端口是否已经在BIOS中打开,或USB存储器与电脑的物理连接有没有连接好了。图1所示为笔者的 FinePix数码相机信息。


图1

  2.在控制台状态下输入如下命令:

  fdisk  -l  /dev/sda

  注意:不要在sda后面加通配符“*”或“?”,否则运行命令后返回的信息将不正常。如果您有多个USB设备话,则设备名在Linux下分别表示为sda、sdb、sdc等。

  运行上面的命令后,笔者的电脑上返回如图2所示信息,表示系统已经找到笔者的USB设备,设备名称为/dev/sda1、可启动(Boot下面的那个*表示是活动分区),容量8MB、文件系统为FAT12。


图2

  3.在/mnt目录下建立一个挂装USB存储器的目录:

  mkdir  /mnt/usb

  4.然后再运行装载设备命令,将USB设备挂装到/mnt/usb目录下:

  mount  -t  msdos  /dev/sda1  /mnt/usb 

  注意:如果在图2中显示您的USB设备的文件系统为FAT32,请使用mount  -t  vfat  /dev/sda1  /mnt/usb命令装载USB设备。

  5.运行如下命令即可查看USB存储器中的文件信息:

  ls  /mnt/usb

  然后您就可以像对待硬盘一样对USB存储器中的数据进行拷贝、删除等操作了。

  如果您不习惯于在控制台下敲敲打打,还可以在KDE桌面上建立一个指向USB存储器的快捷方式,用鼠标完成所有的文件操作,就像在Windows中一样简单,建立快捷方式的操作非常简单:用鼠标在桌面空白处单击鼠标,从弹出的快捷菜单中选择“新建/硬盘”,右键单击新创建的快捷方式,选择“属性”菜单命令,切换到“设备”选项卡,分别输入USB存储器的设备名称、安装点和文件系统类型,如图3所示。以后只需要单击该快捷方式即可方便地访问USB存储器了。


图3