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 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...
随机推荐
- ps学习教程
1.通道抠图:http://www.16xx8.com/photoshop/tongdaokoutu/
- sql —— order by
用于对结果集进行排序. 原表: 根据成绩这列数据进行升序排序: 根据成绩这列数据进行降序排序:
- C++2:函数与传递
C++2:函数与传递 赵强 201831061427 目录 一.函数 二.函数重载 三.值传递 四.地址传递 五.递归函数 一.函数 我们在代码编译中常常会用到函数,函数是模块 ...
- @codeforces - 1214F@ Employment
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有 m 个城市围成一个圆环,编号为 1~m. 某公司有 n 个职 ...
- docker compose安装gitea
docker-compose.yml version: "3.4" networks: gitea: external: false services: server: image ...
- JVM 调优 —— GC 长时间停顿问题及解决方法
零. 简介 垃圾收集器长时间停顿,表现在 Web 页面上可能是页面响应码 500 之类的服务器错误问题,如果是个支付过程可能会导致支付失败,将造成公司的直接经济损失,程序员要尽量避免或者说减少此类情况 ...
- oracle函数 CONCAT(c1,c2)
[功能]连接两个字符串 [参数]c1,c2 字符型表达式 [返回]字符型 同:c1||c2 [示例] select concat('010-','88888888')||'转23' 高乾竞电话 fro ...
- 手动实现如何从H264流中提取SPS/PPS信息
1,代码比较简单,可以直接用了.流的第一个NALU一定是SPS void get_sps_pps_nalu(uint8_t *data, int len, std::vector<uint8_t ...
- C# 总结复习---知识点
知识点: 1. 转义字符: Console.WriteLine("C:\\asdfg\\sdfd"); ---- "\\"是转义斜杠后面紧跟着的字符C ...
- Vue进阶
组件深入 过渡&动画 可复用性&组合 工具&规模化&内在 ****************参考*************** vue官方教程