Markdown:如何显示预览(例如前N个单词)

时间:2016-01-06 14:55:55

标签: regex string markdown blogs string-split

我正在使用Rails 4和Kramdown,但我相信这个问题可以扩展到任何支持Markdown的(网页)编程语言。

我正在建立一个博客网站。在概述页面上,我想展示每篇文章的开头。

由于文章可能很长,我只想展示第一部分。

一个简单的想法是在N个字符后截断文章。一个稍微好一点的想法是在N个单词之后截断文章。

当然,在处理包含额外标记的文档(例如markdown)时,这会破坏内容,因此需要另一种解决方案。

如何在不破坏降价标记的情况下,仅显示Markdown文档的第一个,比方说100个单词?

1 个答案:

答案 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个字符。

虽然上面的示例使用了字符,但您当然可以使用相同的原则并计算单词。