Markdown是一种轻量级标记语言,它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档”。
Markdown 的这种特性,非常适合于作为文档编写和展示的系统。于是乎,我们便在最近的项目中,采用了 Markdown 作为标记语言,作为我们的文档部分的核心。
在我们的系统中,采用了多种模式来展示 Markdown 相关的内容:
当然了,这个需求是最后的产出结果,而非一开始的设计需求。
单个 Markdown 文件
Markdown 命令
用户需要:
代码逻辑:
Markdown + Iframe
在这里我们采用的是 ngx-markdown
,它可以支持自定义的渲染方式。即,可以有目标性地对标记进行修改,如自定义 heading 生成的 HTML:
constructor(private markdownService: MarkdownService) { }
ngOnInit() {
this.markdownService.renderer.heading = (text: string, level: number) => {
const escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
return '<h' + level + '>' +
'<a name="' + escapedText + '" class="anchor" href="#' + escapedText + '">' +
'<span class="header-link"></span>' +
'</a>' + text +
'</h' + level + '>';
};
}
由于,下载的文档需要权限管理,也因此文档内的静态资源也需要权限。而这些资源都是通过 HTTP 直接访问的,并非使用前端中的 HTTP Interceptor,因此我们有了 Token 管理需求。为此,我们采用的方式是:在资源的链接后面加上 ?token=xxx
的形式,以实现这个功能。
?token=xxx
。Markdown 本身是支持 HTML 标签,而我们需要支持视频播放,因此需要解析 HTML,并在标记上添加 token。
起先我尝试了 cheerio 来解决,但是在 Angular 中没有集成成功。我便采用了其依赖中的 htmlparser 2 来解析。最后,采用了 htmlparser 2 来解析:
let lastNode = null;
let html = '';
let handler = {
onopentag: function(name, attribs) {
if (name === 'source' && lastNode === 'video') {
let src = attribs['src'] + '?token=233';
html = `<video controls width="250"><source src="${src}" type="video/webm"></video>`
}
lastNode = name;
}
};
let parser = new htmlparser.Parser(handler, {decodeEntities: true});
parser.write(`<video controls width="250"><source src="/media/examples/flower.webm" type="video/webm"></video>`);
parser.end();
项目由于功能需要,需要特殊的排版方式:内容在左,代码在右
围观我的Github Idea墙, 也许,你会遇到心仪的项目