话虽如此,我所知道的最简单的解决方案是清理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相关推荐

  1. java包装器类_Java中的基本类型和包装类

    Java中基本数据类型与包装类型有 基本类型 包装器类型 boolean Boolean char Character int Integer byte Byte short Short long L ...

  2. C++——包装器std::function与绑定器std::bind

    C++--包装器std::function与绑定器std::bind 1.可调用对象的包装器 std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可 ...

  3. [C++11]可调用对象包装器function

    可调用对象包装器 std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象.通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指 ...

  4. php7 curl开源库,7个适用于PHP的最佳Curl包装器库

    本文概述 当我们谈论HTTP客户端库来访问PHP中的Web API时, Guzzle和Unirest才是王道, 但是有时根据项目的规模或重要性, 你不需要这样的库, 而只需要cURL.关键是使用默认语 ...

  5. Java包装器类及自动装箱(自动打包)

    1.为什么需要包装器类? Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便.例如,我们有时候需要将int这种基本类型转换为对象类型的,所有的 ...

  6. python 如何封装dll_如何为DLL库创建Python包装器

    我试图从软件SDK中获取一个提供的DLL文件并创建一个python包装器,以便将其与我的代码库的其余部分集成.我在网上看了不少指南,还是没找到.在 我现在的Python代码是:from ctypes ...

  7. javaweb 中的过滤器 包装器

    过滤器要做的事情: 请求过滤器:完毕安全检查,又一次格式化请求首部或体.建立请求审计或日志 响应过滤器:     压缩响应流,追加或改动响应流创建一个全然不同的响应. 过滤器和servlet三个相似地 ...

  8. 《Java 核心技术卷1 第10版》学习笔记------ 对象包装器、自动装箱、拆箱

    有时, 需要将 int 这样的基本类型转换为对象. 所有的基本类型都冇一个与之对应的类.例如,Integer 类对应基本类型 int.通常, 这些类称为包装器 ( wrapper ) 这些对象包装器类 ...

  9. SwiftUI之深入解析属性包装器如何处理结构体

    已经了解了 SwiftUI 如何通过使用 @State 属性包装器将变化的数据存储在结构体中,如何使用 $ 将状态绑定到 UI 控件的值,以及更改 @state 包装的属性时是如何自动让 SwiftU ...

最新文章

  1. EMC升级Celerra 支持闪存及重复数据删除
  2. Java自学手记——servlet3.0新特性
  3. 我的Spring 之旅---Spring实战
  4. android虚线边框_Android实现代码画虚线边框背景效果
  5. android 打印机列表中,在android中打印只搜索打印机
  6. reprint函数的用法c语言,百篇大计敬本年之C语言巅峰之道《五》—— snprintf 是否需要 memset 缓冲区...
  7. 通用业务平台设计(一):概览
  8. 以太坊开发入门,完整入门篇
  9. command shortcut paste
  10. Linux平台下卸载MySQL的方法
  11. mysql-proxy 读写分离_mysql 基于mysql-proxy实现读写分离
  12. MySQL MVCC(多版本并发控制)
  13. inovance变频器说明书参数设置_汇川md500说明书|汇川md500变频器使用说明书(汇川md500用户手册)下载 PDF 官方版 - 比克尔下载...
  14. nodejs+vue+elementui企业考勤管理系统
  15. 美团2022届秋招内推二维码
  16. wlan和wifi的区别
  17. 计算机专业职业适应性考试包括什么内容,2020年分类招生《职业适应性测试(职业技能测试)》大纲...
  18. Tcache Attack
  19. 创业圈里不讲武德,大厂高管也得挨市场的毒打
  20. [精选]万能节日国庆头像小程序(可引流,开通流量主,带pc后台管理)

热门文章

  1. 平面设计师培训,平面设计师培训课程学费多少钱
  2. 抖音小店无货源运营操作详解,实操干活,建议收藏
  3. vscode资源管理器中调整字体大小的方法
  4. android仿照360壁纸照片显示特效,Android仿360桌面手机卫士悬浮窗效果
  5. 体育专业国培计算机感言,国培计划体育学习心得体会
  6. 删除某个文件或文件夹时,系统提示无法删除!
  7. 大龄java_28岁大龄人学java不是不可能
  8. 计算机一级考试模块数是什么意思,计算机内存模块的参数是什么意思?您能区分DDR3和DDR4吗?...
  9. 掘金 AMA:听 Vue.js 作者--尤雨溪谈 Vue.js 独立开发 设计那些事
  10. Office2016与Visio2016不兼容——已解决