- 浏览: 23205 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
RyanPoy:
<div class='quote_title'> ...
令人郁闷的socket重联问题 -
snoopy7713:
让我看看,我需要,谢谢
文章已删除
jQuery+kefir-bb打造UBB交互
结构 jsp + jquery + kafir-bb
在数据库存为ubbCode 前台显示为解析为htmlCode
kefir-bb架包: http://sourceforge.net/projects/kefir-bb/files/kefir-bb/kefir-bb-0.4/kefir-bb-0.4.jar/download
前台 test.jsp
<%@ page language="java" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>ubb测试</title> <style type="text/css"> .editor-toolbar {width:100%; height: 20px;padding: 2px;background: #eee;} .editor-mask {position:absolute; width:100%; height:2000px; left:0; top:0; z-index:100; display:none;} .editor-button {display: block;float: left;overflow: hidden;margin: 0 2px;text-indent: -10000em;width: 21px;height: 20px;cursor: pointer;background: transparent url() left top no-repeat;} .editor-button:hover {background-color: #b7d4ff;} .editor-btnLink {background-image: url(http://static.l99.com/skin/default/images/message/bb_link.gif);} .editor-btnImage {background-image: url(http://static.l99.com/skin/default/images/message/bb_image.gif);} .editor-content{background-color: #eeeeee;border: 2px #cccccc solid; padding: 2px;} .editor-content a.close{position:absolute;right:3px;top:5px;background: url(http://static.l99.com/skin/default/images/record_delete.gif) no-repeat; width: 16px;height: 16px; } .answers{text-align: right;} </style> </head> <body> <h1>jQuery的UBB</h1> <div> <form action="EditBBcode_save.action" method="post"> <div style="width: 60%;"> <textarea id="editor" name="bbCode" style="width:100%;" rows="10" >[b]样例文字。[/b]</textarea> </div> <input id="submit" type="submit" value="提交表单" /> </form> </div> </div> <script type="text/javascript" src="js/jquery-1.3.2-min.js"></script> <script type="text/javascript" src="js/test/ubb_tools_test.js"></script> <script type="text/javascript"> $("document").ready(function(){ $.TextAreaUbb("editor"); }); </script> </body> </html>
前台 ubb_tools_test.js:
/** * 插入UBB */ (function($) { $.fn.extend({ makeLink : function () { return this.click(function(){ var b = $(this), f = UbbOption.ubbObject.getSelection(), c = b.offset(), d = document, t; if(jQuery.trim(f) === ""){return;} c.top += b.height(); if (d.selection && d.selection.createRange) { t = d.selection.createRange(); } UbbOption.ubbObject.showPrompt("LINK", function () { var e = this.txt.val(); if(e == "")return; var g = "[url=" + e + "]" + f + "[/url]"; UbbOption.ubbObject.insertText(g, t); UbbOption.ubbObject.ubbText.keyup(); }, c); }); }, makeImage : function () { return this.click(function(){ var b = $(this), g = UbbOption.ubbObject.getSelection(), c = b.offset(), d = document, t; c.top += b.height(); if (d.selection && d.selection.createRange) { t = d.selection.createRange(); } UbbOption.ubbObject.showPrompt("IMG", function () { var h = this.txt.val(); if(h == "")return; var g = "[img=" + h + "]"; var it = this.txt.attr("title"); if(it){ g = "[img=" + h + " imgtitle=" + it + "]"; } UbbOption.ubbObject.insertText(g, t); UbbOption.ubbObject.ubbText.keyup(); }, c); }); } }); var UbbOption = { ubbObject:null }; /** * UBB初始化 */ $.TextAreaUbb = function(ubbId){ if(ubbId == 'undefined'){ return; } if(UbbOption.ubbObject != null){ return; } UbbOption.ubbObject = this; createUbb(); function createUbb(){ UbbOption.ubbObject.ubbText = $("#" + ubbId); UbbOption.ubbObject.ubbText.wrap("<div id=\"" + ubbId + "-wrapper\"></div>").parent("div").addClass("editor-wrapper"); UbbOption.ubbObject.toolbar = $("<div id=\"" + ubbId + "-toolbar\"></div>").insertBefore(UbbOption.ubbObject.ubbText).addClass("editor-toolbar"); btnLink = makeButton("btnLink", "链接").makeLink(); btnImage = makeButton("btnImage", "插入图片").makeImage(); $("<div style=\"padding-top: 5px; font-size: 12px;\">(还可以输入<span class=\"text_orange\" id=\"ubb_text_warning\">400</span>个字)</div>").appendTo(UbbOption.ubbObject.toolbar); } function makeButton(a, b, c) { return $("<a href=\"javascript:void(0);\" title=\"" + b + "\" class=\"editor-button editor-" + a + "\" " + (c?"id=\"" + c +"\"":"") + " >" + b + "</a>").appendTo(UbbOption.ubbObject.toolbar); } UbbOption.ubbObject.getSelection = function (){ var j = window, f = document, g = UbbOption.ubbObject.ubbText.get(0); if (UbbOption.ubbObject.def(g.selectionStart)) { return g.value.substr(g.selectionStart, g.selectionEnd - g.selectionStart); } else { if (f.selection && f.selection.createRange) { return f.selection.createRange().text; } else { if (j.getSelection) { return window.getSelection() + ""; } } } return null; }; UbbOption.ubbObject.def = function() { if (arguments.length == 0) { return true; } if (arguments.length == 1) { return (typeof (arguments[0]) != "undefined"); } for (var a = 0; a < arguments.length; ++a) { if (!UbbOption.ubbObject.def(arguments[a])) { return false; } } return true; } UbbOption.ubbObject.showPrompt = function(a, e, b, d) { new Prompt().show(a, e, b, d); }; UbbOption.ubbObject.insertText = function(l, t) { var n = this, i = document, j = UbbOption.ubbObject.ubbText.get(0); if (UbbOption.ubbObject.def(j.selectionStart)) { var b = j.selectionStart + 0; j.value = j.value.substr(0, j.selectionStart) + l + j.value.substr(j.selectionEnd); } else { if (i.selection && i.selection.createRange && t && t.text!="") { var g = i.selection.createRange(); t.text = l.replace(/\r?\n/g, "\r\n"); g.select(); } else { j.value += l; } } }; }; /** * UBB遮盖层 */ var Prompt = function () { var a = this; if (!Prompt.instance) { a.mask = $("<div class=\"editor-mask\"></div>").appendTo(document.body).hide(); a.boxy = $("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" class=\"boxy-wrapper\"><tr><td class=\"top-left\"></td><td class=\"top\"></td><td class=\"top-right\"></td></tr><tr><td class=\"boxy-left\"></td><td class=\"boxy-inner\"><div class=\"editor-content\" style=\"display: block;\"></div></td><td class=\"boxy-right\"></td></tr><tr><td class=\"bottom-left\"></td><td class=\"bottom\"></td><td class=\"bottom-right\"></td></tr></table>").css({position:"absolute", zIndex:101}).appendTo(document.body).hide(); a.container = $('.editor-content', a.boxy); a.cancel = $("<a class=\"close\" href=\"javascript:void(0);\"> </a>").appendTo(a.container).click(function () { a.hide(); }); a.mask.click(function(){ a.cancel.click(); }); } return Prompt.instance; }; Prompt.prototype = {mask:$(), container:$(), ok:$(), cancel:$(), onOk:function (a) { }, show:function (e, c, d) { var b = this; b.onOk = c; switch(e){ case "LINK":{ b.container.append($("<div class=\"subcontext\">插入链接</div>")); b.cencontext = $("<div class=\"cencontext\"></div>").appendTo(b.container); b.supcontext = $("<div class=\"answers\"></div>").appendTo(b.container); b.txt = $("<input type=\"text\" value=\"http://\" />").appendTo(b.cencontext).css({width:"200px", margin:"5px 0"}).keypress(function (b) { if (b.keyCode == 13) { b.ok.click(); } }); b.cencontext.prepend("请输入链接地址:"); b.ok = $("<input type=\"button\" value=\"确定\" />").appendTo(b.supcontext).css({background:"#FC5A0A", color:"#FFFFFF", width:"40px"}).click(function () { if ($.isFunction(b.onOk)) { b.onOk.call(b); } b.hide(); }); break; }; case "IMG":{ b.container.append($("<div class=\"subcontext\">网络图片</div>")); b.cencontext = $("<div class=\"cencontext\"></div>").appendTo(b.container); b.netpic = $("<div id=\"net_pic\"></div>").appendTo(b.cencontext); b.txt = $("<input type=\"text\" value=\"http://\" />").appendTo(b.netpic).css({width:"200px", margin:"5px 0"}).keypress(function (b) { if (b.keyCode == 13) { b.ok.click(); } }); b.netpic.append("<div class=\"clear\"></div>"); b.supcontext = $("<div class=\"answers\"></div>").appendTo(b.netpic); b.netpic.prepend("请输入图片地址:"); b.ok = $("<input type=\"button\" value=\"确定\" />").appendTo(b.supcontext).css({background:"#FC5A0A", color:"#FFFFFF", width:"40px"}).click(function () { if ($.isFunction(b.onOk)) { b.onOk.call(b); } b.hide(); }); break; }; } if (d) { b.boxy.css(d); } b.mask.fadeIn("fast"); b.boxy.slideDown("fast"); }, hide:function () { this.boxy.slideUp("fast",function(){$(this).remove();}); this.mask.fadeOut("fast",function(){$(this).remove();}); }}; })(jQuery);
前台生成的ubbCode数据
[img=http://www.google.cn/images/nav_logo7.png]\r\n[url=http://www.google.cn/images/nav_logo7.png][img=http://www.google.cn/images/nav_logo7.png][/url]
后台 bbcode_test.xml
<?xml version="1.0" encoding="utf-8"?> <configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://kefir-bb.sourceforge.net/schemas" xsi:schemaLocation="http://kefir-bb.sourceforge.net/schemas http://kefir-bb.sourceforge.net/schemas/kefir-bb-0.4.xsd"> <!-- XML escape symbols --> <scope name="escapeXml"> <coderef name="amp"/> <coderef name="apos"/> <coderef name="lt"/> <coderef name="gt"/> <coderef name="quot"/> </scope> <code name="amp" priority="100"> <pattern>&</pattern> <template>&amp;</template> </code> <code name="apos" priority="100"> <pattern>'</pattern> <template>&apos;</template> </code> <code name="lt" priority="100"> <pattern><</pattern> <template>&lt;</template> </code> <code name="gt" priority="100"> <pattern>></pattern> <template>&gt;</template> </code> <code name="quot" priority="100"> <pattern>"</pattern> <template>&quot;</template> </code> <!-- Root scope. This scope uses when processor started work and by default, if not set other scope --> <scope name="ROOT" parent="escapeXml"> <coderef name="noubb"/> <coderef name="nbsp"/> <coderef name="br1"/> <coderef name="br2"/> <coderef name="br3"/> <coderef name="br4"/> <coderef name="br5"/> <coderef name="slash"/> <coderef name="left_square_bracket"/> <coderef name="right_square_bracket"/> <coderef name="bold"/> <coderef name="u"/> <coderef name="s"/> <coderef name="i"/> <coderef name="code"/> <coderef name="img1"/> <coderef name="img2"/> <coderef name="img3"/> <coderef name="url1"/> <coderef name="url2"/> <coderef name="url3"/> <coderef name="url4"/> <coderef name="url5"/> <coderef name="color"/> <coderef name="size"/> <coderef name="symbol"/> <coderef name="comment"/> <coderef name="ul"/> <coderef name="li"/> <coderef name="p1"/> <coderef name="p2"/> <coderef name="p3"/> <coderef name="div1"/> <coderef name="div2"/> <coderef name="span1"/> <coderef name="span2"/> <coderef name="span3"/> </scope> <code name="noubb" priority="10"> <pattern>[noubb]<var parse="false"/>[/noubb]</pattern> <template><var/></template> </code> <!-- line feed characters --> <code name="br1" priority="3"> <pattern>

</pattern> <template><br/></template> </code> <code name="br2" priority="2"> <pattern>
</pattern> <template><br/></template> </code> <code name="br3" priority="1"> <pattern>
</pattern> <template><br/></template> </code> <code name="br4" priority="0"> <pattern>
</pattern> <template><br/></template> </code> <code name="br5" priority="4"> <pattern>[br /]</pattern> <template><br/></template> </code> <!-- Escape bb-code symbols double slash to slash slash + square bracket to square bracket --> <code name="slash" priority="10"> <pattern>\\</pattern> <template>\</template> </code> <code name="left_square_bracket" priority="9"> <pattern>\[</pattern> <template>[</template> </code> <code name="right_square_bracket" priority="9"> <pattern>\]</pattern> <template>]</template> </code> <!-- Simple formatting --> <code name="bold"> <pattern>[b]<var/>[/b]</pattern> <template><span style="font-weight:bold;"><var/></span></template> </code> <code name="u"> <pattern>[u]<var/>[/u]</pattern> <template><span style="text-decoration:underline;"><var/></span></template> </code> <code name="s"> <pattern>[s]<var/>[/s]</pattern> <template><span style="text-decoration:line-through;"><var/></span></template> </code> <code name="i"> <pattern>[i]<var/>[/i]</pattern> <template><span style="font-style:italic;"><var/></span></template> </code> <!-- Quote code block --> <code name="code"> <pattern>[code]<var scope="codeScope"/>[/code]</pattern> <template><pre><var/></pre></template> </code> <scope name="codeScope" parent="escapeXml"> <coderef name="br1"/> <coderef name="br2"/> <coderef name="br3"/> <coderef name="br4"/> <coderef name="br5"/> <coderef name="slash"/> <coderef name="left_square_bracket"/> <coderef name="right_square_bracket"/> <coderef name="symbol"/> <coderef name="comment"/> </scope> <!-- Insert image --> <code name="img1" priority="3"> <pattern>[img=http://<var name="src" scope="escapeXml"/> imgtitle=<var name="imgtitle" scope="escapeXml"/> imgclass=<var name="imgclass" scope="escapeXml"/>]</pattern> <template><img src="http://<var name="src"/>" title="<var name="imgtitle"/>" class="<var name="imgclass"/>" alt="图片载入中..."/></template> </code> <code name="img2" priority="2"> <pattern>[img=http://<var name="src" scope="escapeXml"/> imgtitle=<var name="imgtitle" scope="escapeXml"/>]</pattern> <template><img src="http://<var name="src"/>" title="<var name="imgtitle"/>" class="ubb_img" alt="图片载入中..."/></template> </code> <code name="img3" priority="1"> <pattern>[img=http://<var scope="escapeXml"/>]</pattern> <template><img src="http://<var/>" class="ubb_img" alt="图片载入中..."/></template> </code> <!-- Links. http, malto protocols --> <code name="url1" priority="6"> <pattern>[url=http://<var name="url" scope="escapeXml"/>]<var name="text"/>[/url]</pattern> <template><a href="http://<var name="url"/>" target="_blank" ><var name="text"/></a></template> </code> <code name="url2" priority="3"> <pattern>[url]http://<var name="url" scope="escapeXml"/>[/url]</pattern> <template><a href="http://<var name="url"/>" target="_blank" >http://<var name="url"/></a></template> </code> <code name="url3" priority="5"> <pattern>[url=mailto:<var name="url" scope="escapeXml"/>]<var name="text"/>[/url]</pattern> <template><a href="mailto:<var name="url"/>" target="_blank" ><var name="text"/></a></template> </code> <code name="url4" priority="7"> <pattern>[url=<var name="url" scope="escapeXml"/> style=<var name="style" scope="escapeXml" />]<var name="text"/>[/url]</pattern> <template><a href="<var name="url"/>" style="<var name="style"/>" target="_blank" ><var name="text"/></a></template> </code> <code name="url5" priority="7"> <pattern>[url=<var name="url" scope="escapeXml"/> class=<var name="class" scope="escapeXml" />]<var name="text"/>[/url]</pattern> <template><a href="<var name="url"/>" class="<var name="class"/>" target="_blank" ><var name="text"/></a></template> </code> <!-- Font color --> <code name="color"> <pattern>[color=<var name="color" scope="escapeXml"/>]<var name="text"/>[/color]</pattern> <template><span style="color:<var name="color"/>;"><var name="text"/></span></template> </code> <!-- Comment --> <code name="comment"> <pattern>[*<var parse="false"/>*]</pattern> <template/> </code> <!-- Font size --> <code name="size"> <pattern>[size=<var name="size" scope="escapeXml"/>]<var name="text"/>[/size]</pattern> <template><span style="font-size:<var name="size"/>;"><var name="text"/></span></template> </code> <!-- Special html symbols --> <code name="symbol"> <pattern>[symbol=<var scope="escapeXml"/>/]</pattern> <template>&<var/>;</template> </code> <!-- extend --> <code name="nbsp"> <pattern> </pattern> <template>&nbsp;</template> </code> <code name="ul"> <pattern>[ul=<var name="style" scope="escapeXml"/>]<var name="text"/>[/ul]</pattern> <template><ul style="<var name="style"/>"><var name="text"/></ul></template> </code> <code name="li"> <pattern>[li=<var name="style" scope="escapeXml"/>]<var name="text"/>[/li]</pattern> <template><li style="<var name="style"/>"><var name="text"/></li></template> </code> <code name="p1"> <pattern>[p=<var name="style" scope="escapeXml"/>]<var name="text"/>[/p]</pattern> <template><p style="<var name="style"/>"><var name="text"/></p></template> </code> <code name="p2"> <pattern>[p]<var name="text"/>[/p]</pattern> <template><p><var name="text"/></p></template> </code> <code name="p3"> <pattern>[p class=<var name="class" scope="escapeXml"/>]<var name="text"/>[/p]</pattern> <template><p class="<var name="class"/>"><var name="text"/></p></template> </code> <code name="div1"> <pattern>[div=<var name="style" scope="escapeXml"/>]<var name="text"/>[/div]</pattern> <template><div style="<var name="style"/>"><var name="text"/></div></template> </code> <code name="div2"> <pattern>[div class=<var name="class" scope="escapeXml"/>]<var name="text"/>[/div]</pattern> <template><div class="<var name="class"/>"><var name="text"/></div></template> </code> <code name="span1" priority="3"> <pattern>[span=<var name="style" scope="escapeXml"/>]<var name="text"/>[/span]</pattern> <template><span style="<var name="style"/>"><var name="text"/></span></template> </code> <code name="span2" priority="2"> <pattern>[span class=<var name="class" scope="escapeXml"/>]<var name="text"/>[/span]</pattern> <template><span class="<var name="class"/>" ><var name="text"/></span></template> </code> <code name="span3" priority="1"> <pattern>[span title=<var name="title" scope="escapeXml"/> class=<var name="class" scope="escapeXml"/>]<var name="text"/>[/span]</pattern> <template><span class="<var name="class"/>" title="<var name="title"/>" ><var name="text"/></span></template> </code> </configuration>
后台java解析
TextProcessor processor = BBProcessorFactory.getInstance().createFromResource("bbcode_test.xml"); String htmlCode = processor.process(bbCode);
最后生成html代码
<img src="http://www.google.cn/images/nav_logo7.png" alt="图片载入中..."/><br/><a href="http://www.google.cn/images/nav_logo7.png" target="_blank" ><img src="http://www.google.cn/images/nav_logo7.png" alt="图片载入中..."/></a>
相关推荐
kefir-jquery-ajax 提出$ .ajax请求,退还开菲尔(kefir)属性! 安装 npm install kefir-jquery-ajax 用法示例 var kefirAjax = require ( 'kefir-jquery-ajax' ) //returns a promise for a GET to the query ...
开菲尔-jquery jQuery 绑定安装新产品管理 npm install kefir-jquery鲍尔 bower install kefir-jquery没有包管理 < script src =" ...kefir.js " > </ script >< script src =" ...jquery.js " > ...
将 Kefir 流映射到 WebWorker 入门 使用 bower 或 npm 安装 bower install kefir-webworker npm install kefir-webworker 用法 在您的主要 javascript 中使用mapWithWorker : Kefir . emitter ( ) . ...
开菲尔项目构建docker映像并将其推送到GCR cd appgcloud builds submit --tag gcr.io/kefir-306607/kefir:v1.6在terrraform目录中检查变量(请确保docker映像版本合适) cd terraformvim variables.tf运行“ ...
使Kefir可以从节点streams2流中观察到,并具有适当的延迟读取行为。 用法示例 var fromNodeStream = require('kefir-node-stream'); var index = require('fs').createReadableStream(__filename); fromNodeStream...
开菲尔计数 ...npm install kefir-count 用法 count = require ( 'kefir-count' ) count ( sensorReadings . throttle ( 50 ) ) count . log ( ) // > 1 // > 2 // > 3 // > ... 执照 麻省理工学院
npm install kefir-get 用法 var KefirGet = require ( 'kefir-get' ) KefirGet ( 'https://en.wikipedia.org/wiki/Special:RecentChanges' ) . map ( parseHTML ) . map ( articles ) 原料药 KefirGet(网址) ...
开菲尔React-es6 此仓库包含一些框架文件,以支持JavaScript ES6 / webpack / react / kefir开发。 运行npm install和npm start来查看演示应用程序。 运行npm run build来准备优化的最小化版本。与Kefir一起使用...
而Kefir.js则是在这个环境中诞生的一个响应式编程库,尤其注重性能优化和内存效率。 响应式编程是一种编程范式,它将数据流和变换处理方式结合在一起,使得程序能够自动地处理数据的变化。Kefir.js是受ReactiveX...
#Kefir套接字聊天客户端和服务器 使用webpack / Babel / ES6 基于 #Dependencies webpack webpack-dev-server npm安装webpack-dev-server -g npm安装webpack -g #跑步 npm安装 节点/服务器 webpack-dev-server...
基于Kefir的Flux架构(概念证明) 这是一个示例Todo-List应用程序,它使用和基于的流(也称为Keflux )的类似的架构开发。 它具有使用数据结构的功能。 令人惊讶的是,此应用程序模仿了传统上用来展示如何在不同的...
在Kefir中,这些包装器类提供了更高级别的抽象,将Glade的XML描述转化为Python对象,使开发者可以直接与这些对象交互,减少了转换和绑定的工作,提高了开发效率。 利用Kefir,程序员可以创建代码草图,模拟出程序的...
奇异的发酵乳--Kefir,王菁蕊,王艳萍,开菲尔(Kefir)是一种特殊的发酵型乳制品,起源于俄罗斯北高加索山区一带,是一种由其发酵剂--开菲尔粒(Kefir Grains)发酵所得的具�
开菲尔计算器是一款基于HTML的工具,专为制作发酵饮料的人设计,帮助他们精确地计算所需的水、糖和开菲尔酒粒(也称为开菲尔菌种)的比例。在制作开菲尔饮料时,正确比例的掌握至关重要,因为它直接影响到最终产品的...
开菲尔网站 这是开菲尔网站。 本网站旨在通过不同设备负责和访问,以使导航用户体验变得轻松愉快。用户体验(UX)用户故事作为首次访问者,我想快速了解该网站的目的以及如何从所提供的产品和服务中受益。...
在实际项目中,结合Kefir和Pug,你可以创建一个响应式的前端应用,其中用户交互和数据流管理由Kefir处理,而UI布局和渲染则由Pug完成。通过解压并研究"kefir-master"文件,你可以深入理解Kefir的工作原理,甚至可以...
**Angular与Kefir结合应用** Angular是一款强大的前端框架,由Google维护,主要用于构建复杂的单页应用程序(SPA)。而Kefir则是一个基于JavaScript的响应式编程库,它提供了流(Stream)和Property两种数据类型,...
交互程序 作者:Jiří Keller,医学博士,博士 介绍 有几个商业 fMRI 软件包,如 E-prime、Presentation 等,也有一些非商业的,如 Exyriment、Psychopy 等。我们尝试使用其中的几个,但并不完全满意。 因此,这是...
tcomb-kefir 为流和属性提供类型组合器。 这允许您创建具有类型安全值的流和属性。 例子 这里我们创建了一个类型安全的函数greet 。 它接受一个字符串Tcomb.Str并返回一个字符串流TcombKefir.stream(Tcomb.Str) 。 ...
Kefir —是一个受和启发JavaScriptReact式编程库,专注于高性能和低内存使用。 对于文档,请访问 。 另请参见。 安装 Kefir可以NPM和Bower软件包的形式下载,也可以下载简单的文件。 NPM npm install kefir 凉亭 ...