无法创建html包装器,如何防止Markdown将生成的HTML包装在p元素中?/p
话虽如此,我所知道的最简单的解决方案是清理markdown,将其作为后处理步骤通过白名单运行。
简单地剥离
代码可能是不够的,因为意外添加#字符并最终使用流浪h1-6代码或内联{{1}相对容易
只要您处于浏览器上下文或使用类似的DOM API,白名单在JS中就非常简单。
此示例获取
的输出并生成文档片段。然后根据片段中的节点phrasing content(它们是marked个元素可能包含的唯一节点)对片段中的节点进行过滤。在过滤之后,然后返回结果节点,以便它们可以在DOM中使用。
const phrasingContent = [
'#text', 'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button',
'canvas', 'cite', 'code', 'data', 'datalist', 'del', 'dfn', 'em', 'embed',
'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'map', 'mark',
'math', 'meter', 'noscript', 'object', 'output', 'picture', 'progress', 'q',
'ruby', 's', 'samp', 'script', 'select', 'small', 'span', 'strong', 'sub',
'sup', 'svg', 'template', 'textarea', 'time', 'u', 'var', 'video', 'wbr'
]
function sanitize(text) {
const t = document.createElement('template')
t.innerHTML = text
whitelist(t.content, phrasingContent)
return t.content
}
function whitelist(parent, names) {
for (const node of parent.childNodes) {
whitelist(node, names)
if (!names.includes(node.nodeName.toLowerCase())) {
unwrap(node)
}
}
}
function unwrap(node) {
const parent = node.parentNode
while (node.firstChild) {
parent.insertBefore(node.firstChild, node)
}
parent.removeChild(node)
}
function empty(node) {
while (node.firstChild) {
node.removeChild(node.firstChild)
}
}
const form = document.querySelector('form')
const input = document.querySelector('textarea')
const output = document.querySelector('output')
form.addEventListener('submit', e => {
e.preventDefault()
empty(output)
output.appendChild(sanitize(marked(input.value)))
}, false)
当然,所有这些都假设一个浏览器环境,并且可以在通过
*foo*
Test
text text
库处理输入后处理白名单。
无法创建html包装器,如何防止Markdown将生成的HTML包装在p元素中?/p相关推荐
- java包装器类_Java中的基本类型和包装类
Java中基本数据类型与包装类型有 基本类型 包装器类型 boolean Boolean char Character int Integer byte Byte short Short long L ...
- C++——包装器std::function与绑定器std::bind
C++--包装器std::function与绑定器std::bind 1.可调用对象的包装器 std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可 ...
- [C++11]可调用对象包装器function
可调用对象包装器 std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象.通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指 ...
- php7 curl开源库,7个适用于PHP的最佳Curl包装器库
本文概述 当我们谈论HTTP客户端库来访问PHP中的Web API时, Guzzle和Unirest才是王道, 但是有时根据项目的规模或重要性, 你不需要这样的库, 而只需要cURL.关键是使用默认语 ...
- Java包装器类及自动装箱(自动打包)
1.为什么需要包装器类? Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便.例如,我们有时候需要将int这种基本类型转换为对象类型的,所有的 ...
- python 如何封装dll_如何为DLL库创建Python包装器
我试图从软件SDK中获取一个提供的DLL文件并创建一个python包装器,以便将其与我的代码库的其余部分集成.我在网上看了不少指南,还是没找到.在 我现在的Python代码是:from ctypes ...
- javaweb 中的过滤器 包装器
过滤器要做的事情: 请求过滤器:完毕安全检查,又一次格式化请求首部或体.建立请求审计或日志 响应过滤器: 压缩响应流,追加或改动响应流创建一个全然不同的响应. 过滤器和servlet三个相似地 ...
- 《Java 核心技术卷1 第10版》学习笔记------ 对象包装器、自动装箱、拆箱
有时, 需要将 int 这样的基本类型转换为对象. 所有的基本类型都冇一个与之对应的类.例如,Integer 类对应基本类型 int.通常, 这些类称为包装器 ( wrapper ) 这些对象包装器类 ...
- SwiftUI之深入解析属性包装器如何处理结构体
已经了解了 SwiftUI 如何通过使用 @State 属性包装器将变化的数据存储在结构体中,如何使用 $ 将状态绑定到 UI 控件的值,以及更改 @state 包装的属性时是如何自动让 SwiftU ...
最新文章
- EMC升级Celerra 支持闪存及重复数据删除
- Java自学手记——servlet3.0新特性
- 我的Spring 之旅---Spring实战
- android虚线边框_Android实现代码画虚线边框背景效果
- android 打印机列表中,在android中打印只搜索打印机
- reprint函数的用法c语言,百篇大计敬本年之C语言巅峰之道《五》—— snprintf 是否需要 memset 缓冲区...
- 通用业务平台设计(一):概览
- 以太坊开发入门,完整入门篇
- command shortcut paste
- Linux平台下卸载MySQL的方法
- mysql-proxy 读写分离_mysql 基于mysql-proxy实现读写分离
- MySQL MVCC(多版本并发控制)
- inovance变频器说明书参数设置_汇川md500说明书|汇川md500变频器使用说明书(汇川md500用户手册)下载 PDF 官方版 - 比克尔下载...
- nodejs+vue+elementui企业考勤管理系统
- 美团2022届秋招内推二维码
- wlan和wifi的区别
- 计算机专业职业适应性考试包括什么内容,2020年分类招生《职业适应性测试(职业技能测试)》大纲...
- Tcache Attack
- 创业圈里不讲武德,大厂高管也得挨市场的毒打
- [精选]万能节日国庆头像小程序(可引流,开通流量主,带pc后台管理)
热门文章
- 平面设计师培训,平面设计师培训课程学费多少钱
- 抖音小店无货源运营操作详解,实操干活,建议收藏
- vscode资源管理器中调整字体大小的方法
- android仿照360壁纸照片显示特效,Android仿360桌面手机卫士悬浮窗效果
- 体育专业国培计算机感言,国培计划体育学习心得体会
- 删除某个文件或文件夹时,系统提示无法删除!
- 大龄java_28岁大龄人学java不是不可能
- 计算机一级考试模块数是什么意思,计算机内存模块的参数是什么意思?您能区分DDR3和DDR4吗?...
- 掘金 AMA:听 Vue.js 作者--尤雨溪谈 Vue.js 独立开发 设计那些事
- Office2016与Visio2016不兼容——已解决