主要是当我们缩短/截断文本内容时,我们通常只是在特定字符索引处截断它.无论如何,HTML已经很复杂,但我想div使用不同的措施截断我的HTML内容(使用内容可编辑生成):
我将定义N将用作截断起始点限制的字符索引
算法将检查内容是否至少为N字符长(仅文本;不计算标签); 如果不是,它将只返回整个内容
然后,它将从检查N-X到N+X字符位置(文字只)并搜索块的节点的端部; X是预定义的偏移值,可能N/5是N/4;
如果多个块节点在此范围内结束,则算法将选择最接近限制索引的那个节点 N
如果没有块节点在此范围内结束,则它将在相同范围内找到最接近的字边界,并选择最接近N并在该位置截断的索引.
使用有效的HTML返回截断的内容(所有标记在结尾处关闭)
我的内容可编辑生成的内容可能包含段落(带换行符),预先格式化的代码块,块引号,有序和无序列表,标题,粗体和斜体(它们是内联节点,不应计入截断过程)等.实现当然会定义哪些元素特别是可能的截断候选者.标题即使它们是块HTML元素也不会被视为截断点,因为我们不需要寡居标题.段落,列出单个项目,整个有序和无序列表,块引号,预格式化块,无效元素等都是好的.标题和所有内联块元素都不是.
例
让我们把这个stackoverflow问题作为我想要截断的HTML内容的一个例子.我们将截断限制设置为1000,偏移量为250个字符(1/4).
此DotNetFiddle显示此问题的文本,同时还在其中添加限制标记(|MIN|表示字符750,|LIMIT|表示字符1000 |MAX|,表示字符1250).
从示例中可以看出,两个块节点与字符1000之间最接近的截断边界在和之间P(我的内容可编辑生成...).这意味着我的HTML应该在这两个标记之间被截断,这将导致内容文本明智地少于1000个字符,但保持截断的内容有意义,因为它不会在某些文本段落的某个地方截断.
我希望这能解释事情应该如何与这个算法相关.
问题
我在这里看到的第一个问题是我正在处理像HTML这样的嵌套结构.我还必须检测不同的元素(只有块元素,没有内联元素).最后但并非最不重要的是,我将只计算字符串中的某些字符并忽略那些属于标记的字符.
可能的解决方案
我可以通过创建表示内容节点及其层次结构的对象树来手动解析我的内容
我可以将HTML转换为更容易管理的内容,如markdown,然后只需搜索最接近我提供的索引的新行N并转换回HTML
使用类似HTML Agility Pack的东西,用它替换我的#1解析,然后以某种方式使用XPath来提取块节点并截断内容
第二个想法
我确信我可以通过做#1做到这一点,但感觉我正在重新发明轮子.
我不认为#2有任何C#库,所以我也应该手动对Markdown进行HTML操作,或者将pandoc作为外部进程运行.
我可以使用HAP,因为它非常适合操作HTML,但我不确定我的截断是否足够简单.我担心在我的自定义代码中,大部分处理仍然在HAP之外
如何处理这种截断算法?我的头似乎太累了,无法达成共识(或解决方案).