【发布时间】:2015-03-01 06:12:31
【问题描述】:
我正在使用所见即所得的编辑器,并试图清理我从中得到的回报。这里有两个转换的例子
<div> <div>
<p> <blockquote>
<blockquote> <span>
<p> <b>
<span> ---> <i>
<b> ---> <u>
<u> <p>
<i> Text
<p> <p>
Text Text
Text
或
<div> <div>
<p> <blockquote>
<blockquote> <h1>
<h1> Text
Text <ul>
<ul> Text
Text ---> <p>
Text ---> Text
<h3> <h3>
<p> <p>
Text Text
<b> <b>
<i> <i>
<h2> <h2>
那么,这里发生了什么:
<p>、<blockquote> 和 <h*> 不允许在彼此内部。
<p>、<blockquote>、<h*>、<ul> 和 <ol> 只能是 <div> 的直系后代。其他任何东西都应该在其中之一内。
所以我需要做的是有效地遍历树,并将它们放置在正确的层次结构中。
从第一个示例中可以看出,<blockquote> 被拉出<p>,<p> 被拉出<p>,然后,创建了一个新的<p> 来保存剩下的Text,第一个<p>被删除(至少我是这么看的,它也可能是最后一个Text被放入未使用的<p>中)。
第二个,<blockquote> 被拉出<p>,剩下的Text 被放入一个新的<p>,或者未使用的<p>,不管你怎么看,<h3>被拉出<p>,其他一切都很好,所以不管它。
我真的很难将逻辑正确地放在正确放置元素并创建新元素的位置。请记住,这是一个非常肤浅的例子,但我可能需要说将一些东西拉出几层,或者删除一个没有做任何事情的节点(<p> 在<blockquote> 内)。
这是我想出的最好的伪代码,但它仍然存在问题。
if not p and not BQ and not h*
create p
fragment.appendChild(node)
else if (p && hasParent(p || BQ || H*)) or
(h* && hasParent(p || h*)) or
(BQ && hasParent(p || h*)
fragment.appendChild(node)
else
fragment.lastChild.appendChild(node)
但它不起作用,因为第一个 if 会不断在子节点上创建 <p>,就像 <blockquote> 内部的 Text。还有一些其他错误,但重要的是它的逻辑有缺陷。
谁能帮我把这个逻辑弄对吗?伪代码显然很好,但我真的很难理解这个层次结构。我突然想到递归函数可能有用,但我什至没有想出半点不错的东西。
感谢所有帮助,谢谢。
【问题讨论】:
标签: javascript dom tree nodes