`

JE 博客页面的"回复"函数quote_comment 修改版

阅读更多
在blog 页面 中, 每个回复旁边的那个"回复"按钮 对应的是 一个类似"引用" 功能的函数
quote_comment:

  function quote_comment(link) {
    quote_user = $(link).previous(0).innerHTML;
    quote_body = $(link).up().next().innerHTML.stripTags();
    editor.bbcode_editor.textarea.insertAfterSelection('\n' + quote_body + '\n
\n'); }

该函数实现的功能比较简单 效果也不是很好.

我做了一个增强的版本, (见后 )

效果也不是很完美 主要是解决了 多层嵌套引用的问题,
代码写的不是很好 而且没有解决换行弄丢的bug.(现在quote_comment 也有该问题)
唉 郁闷啊. 这个很难解决, 除非对字符串进行复杂的查找替换等工作.

(但是肯定解决, 毕竟这个引用功能无论多复杂 都没有语法着色来得复杂).

最好的方法我觉得需要从两方面下手 :
1是js方面写的再强大些
2是后台到前台输出的html代码结构再重新规划一下.

不过这本身就不是什么重要功能 无所谓了.

======================================


我写的这个代码并不好 还有很大优化和完善的余地 大家一起来吧
就当做个游戏.

其实 要想完美实现这个js端的引用 还是蛮难的哦 有挑战

==============================

代码很长 但是其中一些是公共的功能函数, 可以提取出去的.
function quote_comment(link) {
	var BR='\r\n';
	var maxDepth=20,depth=0;
	function removeNode(el){
		if (!el) { 	return;	}
		var orphanDiv= $('_orphan_div');
		if (!orphanDiv) {
			orphanDiv=document.createElement('div');
			orphanDiv.id='_orphan_div';
			orphanDiv.style.display='none';
		}
		orphanDiv.appendChild(el);
		orphanDiv.innerHTML = '';
	}
	
	function getText(el) {
		return el.innerHTML.stripTags();
		//return el.textContent || el.innerText; 
	}
	function createQuote(quoteBody){
		var children=quoteBody.childElements();
		for (var i=0,child;child=children[i];i++) {
			if (child.className=='quote_title') {
				var title=getText(child).strip();
				if (!title||title=="引用") {
					child.innerHTML= BR +'
引用
'; }else{ title= title.endsWith("写道")?title.substring(0,title.length-2):title; child.innerHTML= BR +'
'+ title.strip() +' 写道
'; } }else if (child.className=='quote_div') { var subQuoteBody = child.select('[class="quote_div"]'); var quoteBodyText=null; if (subQuoteBody && subQuoteBody.length>0 && depth++<maxDepth ) { quoteBodyText = createQuote(child); }else{ quoteBodyText= getText(child); } child.innerHTML=quoteBodyText+'
'+BR; }else{ // do nothing } } return getText(quoteBody); } var quoteUser = getText( $(link).previous(0) ); var commentBody = $(link).up().next().cloneNode(true); var quote=[ '
'+quoteUser+' 写道
', createQuote(commentBody), '
'+BR ] var editorArea=editor.bbcode_editor.textarea; editorArea.insertAfterSelection(quote.join(BR)); removeNode(commentBody); }
分享到:
评论
3 楼 QuakeWang 2009-01-12  
汗,通过回帖发现一个bbcode到html转换的bug,被code包含起来的bbcode也被转换了,赶紧去修改
2 楼 fins 2009-01-12  
代码贴到这里来就乱了

这个要是想用JS做个完美的确实不简单啊

而且 我觉得"完美"应该做不到

bbcode-->html的时候 有些东西会丢失 , 或者是多个不同的东西转换成了一种html

有时候是不可逆的吧

除非在 bbcode-->html 时 就像语法着色时一样, 用很多的DIV SPAN(配合class)对很多东西都做出标记
1 楼 QuakeWang 2009-01-12  
这个功能是为了提供一个简单的引用回复,要用js完美解决相当于实现一个HTML到BBCode完全转换,我们后台的ruby代码实现过一次(用正则表达式的),移植到js倒是很简单。
在贴上我的实现之前,先贴单元测试的代码,你可以试试看用js来通过所有的单元测试:
require 'test/unit'
require 'bbcodeize_helper'

class DeBbcodeizerTest < Test::Unit::TestCase
  include BBCodeizeHelper
      
  def test_bold
    assert_equal(
      "I am [b]really[/b] happy!",
      debbcodeize("I am <strong>really</strong> happy!"))
  end
  
  def test_italic
    assert_equal(
      "Have you read [i]Catcher in the Rye[/i]?",
      debbcodeize("Have you read <em>Catcher in the Rye</em>?"))
  end
  
  def test_underline
    assert_equal(
      "[u]Please note[/u]:",
      debbcodeize("<u>Please note</u>:"))
  end
  
  def test_email
    assert_equal(
      "You can also [email=jd@example.com]contact me by e-mail[/email].",
      debbcodeize("You can also <a href=\"mailto:jd@example.com\">contact me by e-mail</a>."))
  end
  
  def test_url
    assert_equal(
      "Check out [url=http://www.rubyonrails.com]Ruby on Rails[/url]!",
      debbcodeize("Check out <a href=\"http://www.rubyonrails.com\">Ruby on Rails</a>!"))
    assert_equal(
      "Check out [url=http://www.rubyonrails.com]Ruby on Rails[/url]!",
      debbcodeize("Check out <a href=\"http://www.rubyonrails.com\" target=\"_blank\">Ruby on Rails</a>!"))    
  end
  
  def test_image
    assert_equal(
      "[img]http://example.com/example.gif[/img]",
      debbcodeize("<img src=\"http://example.com/example.gif\" />"))
  end
  
  def test_align
    assert_equal("[align=center]test[/align]", debbcodeize("<div align=\"center\">test</div>"))
  end

  def test_align
    assert_equal("[align=center]test[/align]", debbcodeize("<div style=\"align: center\">test</div>"))
  end
  
  def test_flash
    assert_equal("[flash=100,50]a.swf[/flash]",debbcodeize('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="100" height="50"><param name="movie" value="a.swf" /><param name="quality" value="high" /><param name="menu" value="false" /><param name="wmode" value="" /><embed src="a.swf" wmode="" quality="high" menu="false" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="100" height="50"></embed></object>'))
    assert_equal("[flash=100,50]a.swf[/flash]",debbcodeize("<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"100\" height=\"50\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\">\n<param name=\"src\" value=\"a.swf\" /><embed type=\"application/x-shockwave-flash\" width=\"100\" height=\"50\" src=\"a.swf\"></embed>\n</object>"))
  end  
  
  def test_size
    assert_equal(
      "[size=32]Big Text[/size]",
      debbcodeize("<span style=\"font-size: 32\">Big Text</span>"))
  end
  
  def test_color
    assert_equal(
      "[color=red]Red Text[/color]",
      debbcodeize("<span style=\"color: red\">Red Text</span>"))
  end

  def test_dequote
    assert_equal(
      "[quote=\"name\"]test\nquote",
      debbcodeize("<div class=\"quote_title\">name 写道</div><div class=\"quote_div\">test\nquote</div>")
    )
    assert_equal(
      "[quote=\"name\"]test\nquote",
      debbcodeize("<div class=\"quote_title\">name 写道</div>\n<div class=\"quote_div\">test\nquote</div>")
    )    
    assert_equal(
      "[quote=\"name\"]test\nquotetest\n",
      debbcodeize("<div class=\"quote_title\">name 写道</div><div class=\"quote_div\">test\nquote</div><p>test</p>")
    )    
    assert_equal(
      "
引用
test\nquote
", debbcodeize("<div class=\"quote_title\">引用</div><div class=\"quote_div\">test\nquote</div>") ) assert_equal( "
引用
test\nquote
", debbcodeize("<div class=\"quote_title\">引用</div>\n<div class=\"quote_div\">test\nquote</div>") ) assert_equal( "
引用
test\nquote
test
引用
test\nquote
", debbcodeize("<div class=\"quote_title\">引用</div><div class=\"quote_div\">test\nquote</div>test<div class=\"quote_title\">引用</div><div class=\"quote_div\">test\nquote</div>") ) end def test_nested_quote assert_equal( '
1 写道
1 写道
a
', debbcodeize(bbcodeize('
1 写道
1 写道
a
')) ) end end

相关推荐

    MR-JE-A.rar_MR-je伺服软件ID_MR_JE_mr 编码_三菱伺服手册_伺服

    压缩包中的"MR-JE_A伺服放大器技术资料集.pdf"包含了MR-JE系列伺服放大器的技术规格、操作指南和实例应用等内容,是进一步学习和实践的宝贵资料。而"产品购买.url"和"工控论坛.url"则是获取更多支持和交流的渠道,...

    jexi-src-1.0b.zip_java je_je_jexi_jexi ja_jexi-bin-1.0b

    "je_je_jexi_jexi ja_jexi-bin-1.0b"这些标签,揭示了该项目的主要技术关键词,包括Java(ja)、Jexi以及项目版本号1.0b,这表明Jexi是一个不断迭代和优化的软件。 在提供的压缩包中,我们发现了几个关键的文件和...

    JE695R3HC2L_LD-S18Y15A_20210617_202110266789.pdf

    根据提供的文件信息,我们可以推断出这是一份关于LCD面板JE695R3HC2L的技术规格书。下面将详细解析这份文档的关键知识点。 ### 一、文档概述 文档标题为“JE695R3HC2L_LD-S18Y15A_20210617_202110266789.pdf”,...

    MR-JE-B技术资料集manual_2015210173530294.pdf

    【MR-JE-B技术资料集】是关于三菱通用AC伺服驱动器MR-JE-B系列的专业文档,主要涉及安全注意事项、防止触电、防止火灾、防止伤害以及各注意事项等多个方面,适用于设备安装、运行、维护和检查人员。以下是该资料集中...

    je-analysis-1.5.3.zip_JE-Analysis_分词 英文

    《JE-Analysis 1.5.3:中英文分词利器详解》 在IT领域,数据处理和文本分析是不可或缺的部分,而分词作为基础步骤,其效率和准确性直接影响后续的处理效果。JE-Analysis 1.5.3,作为一款专攻中英文分词的工具,因其...

    Python库 | je_auto_control-0.0.76-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:je_auto_control-0.0.76-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    je-analysis-1.5.3.rar_JE-Analysis

    import com.je_analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; // 创建分词器实例 Analyzer analyzer = new Analyzer(); // 获取TokenStream对象,处理文本 TokenStream tokenStream = ...

    Python库 | je_api_testka_dev-0.0.21-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:je_api_testka_dev-0.0.21-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    总账_日记账导入_表关联关系

    - GL_JE_HEADERS与GL_JE_LINES通过JE_HEADER_ID关联,表示一个日记账条目包含了多个分录。 - GL_JE_HEADERS与GL_JE_SOURCES_TL通过JE_HEADER_ID关联,表示日记账条目的来源。 - GL_JE_HEADERS与GL_JE_CATEGORIES_TL...

    je_gray_02je_gray_02_VR游戏开发_天空盒子_Skybox_高清_16K_EXR

    可用于UnityVR开发,3D游戏开发,高清天空盒子Skybox素材,游戏环境背景素材,无水印。 让你身临其境的天空盒子,各类题材丰富,都是辛苦搜罗所得的高清exr格式,可以直接用于Unity开发,特别是VR游戏的开发。...

    MR-JE-_A伺服放大器技术资料集(定位模式篇)_三菱伺服器说明书_

    《MR-JE-A伺服放大器技术资料集》是关于三菱伺服器在定位模式下的详细技术指南,主要针对MR-JE系列伺服放大器的使用、配置和优化提供了全面的知识点。这篇说明书旨在帮助工程师和技术人员更好地理解和操作这一系列的...

    Python库 | je_editor_dev-0.0.3-py3-none-any.whl

    为了了解"je_editor_dev-0.0.3-py3-none-any.whl"的具体功能和使用方法,通常需要查看其文档,或者通过`pip install je_editor_dev-0.0.3-py3-none-any.whl`来安装并尝试使用库中的函数和类。安装完成后,可以使用...

    AMD_WISTRON_JE40-SB_宏基4560G(A70)

    1. 产品型号知识:文档中提及的AMD_WISTRON_JE40-SB_宏基4560G(A70)是AMD(超威半导体公司)联合Wistron Corporation(纬创公司)生产的一款笔记本电脑主板型号。这说明了AMD与ODM(原始设计制造商)之间的合作模式...

    GX Works3的MR-JE-C的CC-LINK IE Field Basic通信_描述文件

    《GX Works3与MR-JE-C的CC-LINK IE Field Basic通信详解》 在工业自动化领域,GX Works3是一款广泛使用的编程软件,主要用于三菱电机的PLC(可编程逻辑控制器)编程。而MR-JE-C系列伺服驱动器是三菱电机推出的一款...

    JE.rar_Java编程_Java_

    标题中的"JE.rar"是一个压缩文件,通常包含多个文件或文件夹,这里提及的是与Java编程相关的资料,尤其是关于“Java_”可能是指Java技术的一个特定领域或项目。描述中提到的"JE中文分词压缩包"指的是一个专门用于...

    Berkeley DB je3.3版

    **Berkeley DB je3.3版详解** Berkeley DB(简称BDB)是Oracle公司提供的一款开源、轻量级、高性能的嵌入式数据库系统。它最初由Sleepycat Software开发,后被Oracle收购。Berkeley DB je是其增强版,专为Java环境...

    jemalloc库windows版本

    jemalloc库是用来替代系统自带的malloc和...extern "C" __declspec(dllimport) void* je_malloc(size_t size); extern "C" __declspec(dllimport) void je_free(void *ptr); #pragma comment (lib, "jemalloc.lib")

    je-5.0.73-API文档-中文版.zip

    包含翻译后的API文档:je-5.0.73-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.sleepycat:je:5.0.73; 标签:sleepycat、je、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index....

Global site tag (gtag.js) - Google Analytics