Angular 利用 marked.js 添加 Markdown + HTML 同时渲染的 Pipe
背景
最近在公司开发的一个项目需要在 Angular 上展示图文,并且需要同时支持 Markdown 和 HTML
对于同时支持 Markdown 和 HTML ,应该要分为编辑和渲染两部分考虑。
对于编辑,目前尚未找到同时支持两种格式的编辑器。我个人认为 Markdown 最好的开源编辑器是 Editor.md,最好的 HTML 编辑器是 UEditor,虽然他们俩都已经很久很久没更新过……
所以在编辑页面就只能提供两个编辑器的切换,对于 Markdown 和 HTML 分部用各自的编辑器。 但是,我可以存到同一个字段吗?
这就要考虑到渲染了,如果能找到同时支持渲染 Markdown 和 HTML 的组件,我就不需要在后端把 Markdown 原文和渲染后的 HTML 分开字段存储了,还有利于对 Markdown 文本的修改。
于是找到了 marked.js
marked.js 介绍
marked.js 是一个普通的js库,并不是 Angular 特有的组件,所以我们在集成时还是需要进行一些编码。同时也说明它能支持其他前端框架,甚至是普通 HTML 的直接引用,非常轻量。
给 Angular 添加一个用于 Markdown 渲染的 Pipe
Angular Pipe 是 Angular 中用于字符格式转换的组件,专门处理输出字符的转换,如日期、翻译等等在Angular开发中都比较常用。今天我们就给项目添加一个用于 Markdown 渲染的 Pipe。
一、npm 引用
需要引用marked.js和它的 typescript 类型库来辅助模块声明
npm install marked
npm install @types/marked
二、创建 Pipe
通过 angular-cli 创建 Pipe 文件
ng generate pipe marked
这样它能自动创建一个名为 "marked" 的 Pipe (marked.pipe.ts),并导入到你的 app.module.ts 文件中了。
修改 marked.pipe.ts
生成出来的 marked.pipe.ts 文件如下:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'marked'
})
export class MarkedPipe implements PipeTransform {
transform(value: any, args?: any): any {
return null;
}
}
我们需要导入 marked , 然后修改 transform 方法来解析 Markdown 并返回 HTML 字符串。
更改之后的代码如下:
import { Pipe, PipeTransform } from "@angular/core";
import * as marked from "marked";
@Pipe({
name: "marked"
})
export class MarkedPipe implements PipeTransform {
transform(value: any): any {
if (value && value.length > 0) {
return marked(value);
}
return value;
}
}
其中的 transform 方法将接受文本作为值,如果它有长度,则返回解析后的 HTML。否则,它只返回传递的值。
使用方法
使用方法跟其他 Pipe 几乎差不多,但是有一点,就是如果渲染出来的是 HTML 字符串,需要让 Angular 自己在渲染成最终的 HTML,我们需要把 HTML 字符串传入到 Angular 模版中一个 HTML 元素的 innerHTML 属性中,举个例子:
// app.component.ts
...
public markdownString: string = 'This is text with **markdown**';
...
// app.component.html
...
<div [innerHTML]="markdownString | marked"></div>
...
总结
这样就大功告成啦!你可以尝试使用同时含有 Markdown 和 HTML 的字符串,就像 Github 里众多开源项目的 README 文档一样,使用穿插着 HTML 排版的文档来渲染美观的图文。
Angular 利用 marked.js 添加 Markdown + HTML 同时渲染的 Pipe的更多相关文章
- vue使用marked.js实现markdown转html并提取标题生成目录
html: <template> <div class="wrapper"> <div class="container"> ...
- 关于如何利用原生js动态给一个空对象添加属性以及属性值
首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...
- Angular和Vue.js 深度对比
Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面.当和其它网络工具配合使用时,Vue.js 的优秀功能会得到大大加强.如今,已有许多开发人员开始使用 Vue ...
- Angular和Vue.js
Angular和Vue.js Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面.当和其它网络工具配合使用时,Vue.js 的优秀功能会得到大大加强.如今,已 ...
- NO.05--谈一谈Angular 和 Vue.js 的对比。
几天的vue之后,给需要的盆友们带来一篇对比,也算是我近期之内业余时间的大工程,现在开始: Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面.当和其它网络工 ...
- 利用Vue.js实现拼图游戏
之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...
- marked.js简易手册
marked.js简易手册 本文介绍的是marked.js.秉持"来之即用"的原则,对它进行简要的翻译和归纳, 安装 在网上引用或者是引用本地文件即可.要么就用命令行: npm i ...
- angular利用ui-router登录检查
angular利用ui-router登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检查登 ...
- 利用Node.js对某智能家居服务器重构
原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...
随机推荐
- el-dialog 一些问题 局中滚动
.el-dialog { position: absolute; top: 50%; left: 50%; margin: 0 !important; transform: translate(-50 ...
- 2018-7-9-dotnet-设计规范-·-数组定义
title author date CreateTime categories dotnet 设计规范 · 数组定义 lindexi 2018-07-09 14:26:48 +0800 2018-2- ...
- 两个[\\s\\S]*?之间可为空元素没有意义
两个[\\s\\S]*?之间的* ? {0,n}等元素无效,即使出现这样的元素,也会被当做[\\s\\S]*?处理,[\\s\\S]*+也类似 除非两个[\\s\\S]*?之间设置必定出现的元素才有意 ...
- Python关键点常识
关键点常识 Python的发音与拼写 Python的作者是Guido van Rossum(龟叔) Python正式诞生于1991年 Python的解释器如今有多个语言实现,我们常用的是CPython ...
- 解析P2P金融的业务安全
看了很多乙方同学们写的业务安全,总结下来,其出发点主要是在技术层面风险问题.另外捎带一些业务风险.今天我要谈的是甲方眼里的业务安全问题,甲方和乙方在业务安全的视野上会有一些区别和一些重合.在同一个问题 ...
- JS遍历数组
for 如果用var会造成变量声明提前等问题for(var i = 1; i <= arr.length; i++){ console.log(arr[i - 1]);} for(let i = ...
- js切割字符串
var time_str= '2019-9-10 13:18:20'; var t = time_str.substr(2,8); console.log(t); 输出 19-9-10
- js获取当前时间戳以及前一天时间戳
js获取当前时间戳以及前一天时间戳(毫秒) var timestamp = (new Date()).getTime(); console.log(timestamp);//打印当前时间戳 conso ...
- laravel validate 设置为中文(验证提示为中文)
把 resources\lang 下en 的文件夹 复制在同一目录并改名为 zn 把zn 中的 validation.php文件修改为 https://laravel-china.org/articl ...
- springmvc单Redis实例实现分布式锁(解决锁超时问题)
一.前言 关于redis分布式锁, 查了很多资料, 发现很多只是实现了最基础的功能, 但是, 并没有解决当锁已超时而业务逻辑还未执行完的问题, 这样会导致: A线程超时时间设为10s(为了解决死锁问题 ...