当我们缩短/截断文本内容时,我们通常只是在特定的字符索引处截断它。这在HTML中已经很复杂了,但是我想使用不同的度量来截断我的HTML内容(使用内容可编辑的div生成):
N,它将用作截断起始点限制N字符长(仅文本;不计数标记);如果不是,则只返回整个内容。N-X到N+X字符位置(仅文本)并搜索块节点的末端;X是预定义的偏移量值,很可能是关于N/5到N/4的;N的节点。N的索引并在该位置截断。我的内容可编辑生成的内容可能包括段落(带换行)、预先格式化的代码块、块引号、有序和无序列表、标题、粗体和斜体(它们是内联节点,不应该在截断过程中计算)等等。当然,最后的实现将定义哪些元素是可能的截断候选项。头,即使它们是块HTML元素,也不会被计算为截断点,因为我们不希望被守恒的标题。段落,列出个别项目,完整的有序和无序列表,块引号,预先格式化的块,空元素等都是好的。标题和所有内联块元素都不是。
示例
让我们把这个非常堆栈溢出的问题作为HTML内容的一个例子,我想截断它。让我们将截断限制设置为1000,偏移量为250个字符(1/4)。
这个DotNetFiddle显示了这个问题的文本,同时在其中添加了限制标记(|MIN|表示字符750,|LIMIT|表示字符1000,|MAX|表示字符1250)。
从示例中可以看出,两个块节点之间最接近的截断边界(到字符1000 )是在</OL>和P (我的内容可编辑生成.)之间。这意味着我的HTML应该在这两个标记之间被截断,这将导致稍微小于1000个字符的长内容文本,但是保持截断内容的意义,因为它不会只是在某个文本段落中间的某个地方截断。
我希望这能解释为什么事情应该与这个算法相关。
问题所在
我在这里看到的第一个问题是,我正在处理像HTML这样的嵌套结构。我还必须检测不同的元素(只有块元素,没有内联元素)。最后但并非最不重要的一点是,我只需计算字符串中的某些字符,而忽略那些属于标记的字符。
可能的解决办法
N最近的新行,然后再转换回HTML。二思
应该如何处理这种截断算法?我的头脑似乎太累了,无法达成共识(或解决方案)。
发布于 2015-06-29 17:45:43
private void RemoveEmpty(HtmlNode node){
var parent = node.Parent;
node.Remove();
if(parent==null)
return;
// remove parent if it is empty
if(!parent.DescendantNodes.Any()){
RemoveEmpty(parent);
}
}
private void Truncate(DocumentNode root, int maxLimit){
var n = 0;
HtmlTextNode lastNode = null;
foreach(var node in root.DescendantNodes
.OfType<HtmlTextNode>().ToArray()){
var length = node.Text.Length;
n+= length;
if(n + length >= maxLimit){
RemoveEmpty(node);
}
}
}
// you are left with only nodes that add up to your max limit characters.https://stackoverflow.com/questions/30926684
复制相似问题