我正在使用Rails 4和Kramdown,但我相信这个问题可以扩展到任何支持Markdown的(网页)编程语言。
我正在建立一个博客网站。在概述页面上,我想展示每篇文章的开头。
由于文章可能很长,我只想展示第一部分。
一个简单的想法是在N个字符后截断文章。一个稍微好一点的想法是在N个单词之后截断文章。
当然,在处理包含额外标记的文档(例如markdown)时,这会破坏内容,因此需要另一种解决方案。
如何在不破坏降价标记的情况下,仅显示Markdown文档的第一个,比方说100个单词?
答案 0 :(得分:4)
Let's use this **sample document** with _various_ types of [Markdown](http://daringfireball.net/projects/markdown/) markup.
现在,我们假设您采用前20个字符。你会得到:
Let's use this **sam
和100个字符给你:
Let's use this **sample document** with _various_ types of [Markdown](http://dar
虽然这些字符长度是任意的,可能不是你要使用的长度,但重点是每个字符都会破坏Markdown语法。更好的方法是将文档解析为HTML,然后打开HTML文档的开头。
当然,出于同样的原因,您可能希望将HTML文档模型用于某种排序,而不是拆分原始char长度。为什么不简单地采取第一段?如果段落很长,则在第N个字符处中断,但仅计算正文中的字符,而不是构成HTML标记的字符。如何做到这将取决于您使用哪个工具/库来处理HTML,而这不是制作工具推荐的地方(我对Ruby / Rails不太熟悉 - 更多的是Python人)。
请注意,我在上面给出的第二个示例打破了链接URL中间的Markdown。如果您首先将Markdown转换为HTML并且只打破计算文本字符,那么即使链接文本(标签)被截断,URL也将保持完好。虽然,在这种情况下,最好在链接结束后截断文本。这取决于你想要制作代码的复杂程度。
自然的下一步是问为什么不用Markdown文本做所有这些而不是先将整个文档转换为HTML?你可以,但是你会重新实现你自己的Markdown解析器...除非你碰巧使用Markdown解析器,它允许你访问内部(通过一些插件API)或输出一个解析三。如果您使用的是返回解析树的解析器,则可以截断解析树,然后将其传递给渲染器。除此之外,使用解析的HTML可能是最好的选择。
无论哪种方式,让我们通过一个例子。上面示例的HTML看起来像这样:
<p>Let's use this <strong>sample document</strong> with <emphasis>various</emphasis> types of <a href="http://daringfireball.net/projects/markdown/">Markdown</a> documents</p>
现在,让我们将该文档表示为某种伪文档对象(使用JSON):
[{
'type': 'element',
'tag': 'p',
'children' :
[
{
'type': 'text',
'text': "Let's use this "
},
{
'type': 'element',
'tag': 'strong',
'children':
[
{
'type': text,
'text': "sample document"
}
]
},
{
'type': 'text',
'text': " with "
},
{
'type': 'element',
'tag': 'emphasis',
'children':
[
{
'type': text,
'text': "various"
}
]
},
{
'type': 'text',
'text': " types of "
},
{
'type': 'element',
'tag': 'a',
'href': 'http://daringfireball.net/projects/markdown/'
'children':
[
{
'type': text,
'text': "Markdown"
}
]
},
{
'type': 'text',
'text': " markup."
}
]
}]
现在,只需遍历该文档(及其子文件),只计算“文本”类型的“文本”字段的字符,直到达到最大值。然后在文档中截断之后的任何其他元素。呈现文档时(使用适当的HTML呈现器),将正确关闭所有HTML元素。显然,确切的过程将取决于文档所包含的文档对象类型(这可能取决于您正在使用的HTML解析器和/或Markdown解析器)。
无论如何,文件被截断为20个字符会导致:
[{
'type': 'element',
'tag': 'p',
'children' :
[
{
'type': 'text',
'text': "Let's use this "
},
{
'type': 'element',
'tag': 'strong',
'children':
[
{
'type': text,
'text': "sampl"
}
]
},
]
}]
将呈现为:
<p>Let's use this <strong>sampl</strong></p>
请注意,仅文本(Let's us this sampl
)计为20个字符。
虽然上面的示例使用了字符,但您当然可以使用相同的原则并计算单词。