Markdown处理引擎:BoostNote-Legacy的核心技术实现

Markdown处理引擎:BoostNote-Legacy的核心技术实现

【免费下载链接】BoostNote-Legacy This repository is outdated and new Boost Note app is available! We've launched a new Boost Note app which supports real-time collaborative writing. https://github.com/BoostIO/BoostNote-App 【免费下载链接】BoostNote-Legacy 项目地址: https://gitcode.com/gh_mirrors/bo/BoostNote-Legacy

BoostNote-Legacy作为一款专业的Markdown笔记应用,其核心的Markdown处理引擎基于强大的markdown-it库构建。通过精心设计的扩展插件体系,它不仅支持标准的Markdown语法,还实现了丰富的自定义功能和特殊语法支持,包括数学公式、表格增强、警告框、自定义渲染规则、安全过滤等内容,为用户提供了卓越的写作体验。

markdown-it扩展插件体系与自定义渲染规则

BoostNote-Legacy作为一款专业的Markdown笔记应用,其核心的Markdown处理引擎基于强大的markdown-it库构建。通过精心设计的扩展插件体系,它不仅支持标准的Markdown语法,还实现了丰富的自定义功能和特殊语法支持,为用户提供了卓越的写作体验。

markdown-it核心架构与插件机制

markdown-it采用模块化的插件架构,允许开发者通过统一的API接口扩展语法解析和渲染功能。BoostNote-Legacy充分利用了这一特性,构建了一个高度可扩展的Markdown处理系统。

mermaid

内置插件体系详解

BoostNote-Legacy集成了多个高质量的markdown-it插件,每个插件都针对特定的使用场景进行了优化配置:

数学公式支持

通过@rokt33r/markdown-it-math插件,系统支持LaTeX数学公式的渲染:

this.md.use(math, {
  inlineOpen: config.preview.latexInlineOpen,
  inlineClose: config.preview.latexInlineClose,
  blockOpen: config.preview.latexBlockOpen,
  blockClose: config.preview.latexBlockClose,
  inlineRenderer: function(str) {
    let output = ''
    try {
      output = katex.renderToString(str.trim())
    } catch (err) {
      output = `<span class="katex-error">${err.message}</span>`
    }
    return output
  },
  blockRenderer: function(str) {
    let output = ''
    try {
      output = katex.renderToString(str.trim(), { displayMode: true })
    } catch (err) {
      output = `<div class="katex-error">${err.message}</div>`
    }
    return output
  }
})
表格增强功能

markdown-it-multimd-table插件提供了增强的表格功能,支持复杂的表格结构和样式:

功能特性描述语法示例
多行表格支持跨行跨列的复杂表格::: span
对齐方式灵活的单元格对齐控制:---: :--- ---:
样式定制支持自定义CSS类名{.class}
admonition警告框

通过markdown-it-admonition插件,支持多种类型的提示框:

::: note
这是一个普通的提示信息
:::

::: danger 警告
这是一个危险警告
:::

系统预定义了9种admonition类型:

  • note, hint, attention, caution, danger, error
  • quote, abstract, question

自定义渲染规则实现

BoostNote-Legacy通过重写markdown-it的渲染器规则,实现了高度定制化的输出效果:

目录(TOC)渲染定制
md.renderer.rules.toc_open = () => '<div class="markdownIt-TOC-wrapper">'
md.renderer.rules.toc_close = () => '</div>'
自定义代码块渲染

系统实现了markdown-it-fence插件来处理特殊的代码块类型:

md.renderer.rules[`${name}_fence`] = (tokens, index) =>
  renderers[name](tokens[index])

支持的特殊代码块类型包括:

mermaid

安全过滤与内容净化

BoostNote-Legacy实现了严格的内容安全策略,通过自定义的sanitize-html配置:

this.md.use(sanitize, {
  allowedTags: [
    'iframe', 'input', 'b', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 
    'br', 'strong', 'em', 'a', 'pre', 'code', 'img', 'tt', 'div',
    'ins', 'del', 'sup', 'sub', 'p', 'ol', 'ul', 'table', 'thead',
    'tbody', 'tfoot', 'blockquote', 'dl', 'dt', 'dd', 'kbd', 'q',
    'samp', 'var', 'hr', 'ruby', 'rt', 'rp', 'li', 'tr', 'td', 'th',
    's', 'strike', 'summary', 'details'
  ],
  allowedAttributes: {
    '*': ['abbr', 'accept', 'accesskey', 'align', 'alt', 'axis', 'border'],
    a: ['href'],
    img: ['src', 'width', 'height'],
    iframe: ['src', 'width', 'height', 'frameborder', 'allowfullscreen']
  },
  allowedIframeHostnames: ['www.youtube.com'],
  allowedSchemes: ['http', 'https', 'ftp', 'mailto']
})

扩展语法解析器

系统实现了多个自定义的语法解析器,扩展了Markdown的标准功能:

定义列表解析器

markdown-it-deflist插件支持定义列表语法:

术语1
: 定义1
: 定义2

术语2
: 定义3

解析器的工作流程:

mermaid

前端元数据解析

markdown-it-frontmatter插件支持YAML格式的前端元数据:

---
title: 文档标题
author: 作者名称
date: 2023-01-01
tags: [技术, 文档]
---

插件配置与管理

BoostNote-Legacy的插件系统支持动态配置,用户可以根据需要启用或禁用特定功能:

const defaultOptions = {
  typographer: config.preview.smartQuotes,
  linkify: true,
  html: true,
  xhtmlOut: true,
  breaks: config.preview.breaks,
  sanitize: 'STRICT',
  onFence: () => {}
}

系统支持的配置级别包括:

配置级别影响范围示例配置
全局配置所有文档smartQuotes, breaks
插件配置特定插件latex分隔符配置
渲染配置输出格式HTML标签白名单

通过这种分层配置体系,BoostNote-Legacy实现了灵活而强大的Markdown处理能力,既保证了核心功能的稳定性,又为特殊需求提供了充分的扩展空间。

LaTeX数学公式与代码块语法高亮支持

BoostNote-Legacy作为一个面向程序员的笔记应用,在Markdown处理引擎中实现了强大的LaTeX数学公式渲染和代码块语法高亮功能。这些功能使得技术文档编写更加专业和高效,特别适合数学推导、算法描述和代码示例的场景。

LaTeX数学公式渲染实现

BoostNote-Legacy采用@rokt33r/markdown-it-math插件来支持LaTeX数学公式,结合KaTeX渲染引擎实现高性能的数学公式显示。系统支持行内公式和块级公式两种模式:

this.md.use(math, {
  inlineOpen: config.preview.latexInlineOpen,
  inlineClose: config.preview.latexInlineClose,
  blockOpen: config.preview.latexBlockOpen,
  blockClose: config.preview.latexBlockClose,
  inlineRenderer: function(str) {
    let output = ''
    try {
      output = katex.renderToString(str.trim())
    } catch (err) {
      output = `<span class="katex-error">${err.message}</span>`
    }
    return output
  },
  blockRenderer: function(str) {
    let output = ''
    try {
      output = katex.renderToString(str.trim(), { displayMode: true })
    } catch (err) {
      output = `<div class="katex-error">${err.message}</div>`
    }
    return output
  }
})

数学公式的处理流程如下:

mermaid

数学公式支持的特性包括:

公式类型语法示例渲染效果
行内公式$E=mc^2$在文本行内显示的小型公式
块级公式$$ \sum_{i=1}^n i = \frac{n(n+1)}{2} $$居中显示的大型公式
矩阵运算$$\begin{bmatrix} a & b \\ c & d \end{bmatrix}$$支持各种矩阵环境
积分微分$\int_a^b f(x)dx = F(b)-F(a)$完整的微积分符号支持

代码块语法高亮机制

代码块语法高亮通过自定义的fence处理器实现,支持丰富的代码语言类型和参数配置:

const paramsRE = /^[ \t]*([\w+#-]+)?(?:\(((?:\s*\w[-\w]*(?:=(?:'(?:.*?[^\\])?'|"(?:.*?[^\\])?"|(?:[^'"][^\s]*)))?)*)\))?(?::([^:]*)(?::(\d+))?)?\s*$/

代码块处理支持以下参数配置:

参数说明示例
语言类型指定代码语言javascriptpythonhtml
文件名显示在代码块顶部的文件名:example.js
起始行号设置行号起始值::10
高度限制设置代码块显示高度(height=300)

代码块渲染流程:

mermaid

错误处理与降级机制

系统实现了完善的错误处理机制,确保在公式渲染失败时提供友好的错误提示:

// LaTeX公式错误处理
inlineRenderer: function(str) {
  let output = ''
  try {
    output = katex.renderToString(str.trim())
  } catch (err) {
    output = `<span class="katex-error">${err.message}</span>`
  }
  return output
}

这种设计确保了即使遇到复杂的数学公式或不受支持的LaTeX语法,用户仍然能够看到具体的错误信息,而不是空白或崩溃的界面。

配置灵活性

用户可以通过应用配置自定义数学公式的分隔符:

const config = ConfigManager.get()
const options = {
  inlineOpen: config.preview.latexInlineOpen,  // 默认 '$'
  inlineClose: config.preview.latexInlineClose, // 默认 '$'
  blockOpen: config.preview.latexBlockOpen,    // 默认 '$$'
  blockClose: config.preview.latexBlockClose   // 默认 '$$'
}

这种灵活的配置机制使得BoostNote-Legacy能够适应不同用户的习惯和偏好,特别是对于那些习惯使用其他LaTeX分隔符的学术用户。

通过这种精心设计的数学公式和代码块处理架构,BoostNote-Legacy为技术文档编写提供了强大而可靠的支持,使得编写包含复杂数学推导和代码示例的技术笔记变得简单高效。

PlantUML图表和流程图集成方案

BoostNote-Legacy通过精心设计的Markdown扩展机制,为开发者提供了强大的PlantUML图表和流程图绘制能力。该方案基于markdown-it生态系统构建,通过自定义渲染器和外部库集成,实现了代码块到可视化图表的无缝转换。

技术架构设计

BoostNote-Legacy采用模块化的架构设计,通过webpack配置外部依赖和自定义渲染器来实现图表功能:

// webpack-skeleton.js 中的外部依赖配置
externals: [
  'markdown-it-plantuml',
  {
    flowchart: 'var flowchart',
    'sequence-diagram': 'var Diagram'
  }
]

这种设计使得图表渲染功能可以作为可选模块加载,既保证了核心功能的轻量化,又为需要图表功能的用户提供了完整的解决方案。

PlantUML集成实现

PlantUML集成通过markdown-it-plantuml插件实现,该插件能够解析特定的代码块语法并将其转换为UML图表:

@startuml
actor 用户
participant "BoostNote" as BN
database 存储

用户 -> BN: 编写PlantUML代码
BN -> BN: 解析代码块
BN -> 存储: 保存原始代码
BN -> PlantUML服务: 请求渲染
PlantUML服务 -> BN: 返回SVG图表
BN -> 用户: 显示渲染结果
@enduml

PlantUML代码块语法示例:

```plantuml
@startuml
class 用户 {
  +String 用户名
  +String 邮箱
  +void 登录()
  +void 注销()
}

class 笔记 {
  +String 标题
  +String 内容
  +Date 创建时间
}

用户 "1" -- "*" 笔记 : 拥有
@enduml
```

流程图渲染机制

流程图功能通过集成flowchart.js库实现,支持多种流程图语法:

// 流程图代码块处理逻辑
flowchart: token => {
  updatedOptions.onFence('flowchart')
  return `<pre class="fence" data-line="${token.map[0]}">
    <span class="filename">${token.fileName}</span>
    <div class="flowchart" data-height="${token.parameters.height}">
      ${token.content}
    </div>
  </pre>`
}

流程图语法示例:

```flowchart
st=>start: 开始
e=>end: 结束
op1=>operation: 操作1
cond=>condition: 条件判断?

st->op1->cond
cond(yes)->e
cond(no)->op1
```

序列图集成方案

序列图功能通过sequence-diagram.js库提供,支持标准的序列图语法:

// 序列图外部依赖配置
'sequence-diagram': 'var Diagram'

序列图使用示例:

```sequence-diagram
Alice->Bob: 你好!
Note right of Bob: Bob思考
Bob-->Alice: 你好!
Bob->John: 你好John!
```

自定义渲染器架构

BoostNote-Legacy采用基于markdown-it-fence的自定义渲染器架构:

mermaid

配置参数支持

图表渲染支持丰富的配置参数,包括高度设置、文件命名等:

参数类型语法示例功能描述
高度设置plantuml(400h)设置图表显示高度为400px
文件名plantuml:class_diagram.puml指定图表文件名
起始行号plantuml::1设置代码行号起始值
组合参数plantuml(400h):diagram:1同时设置高度、文件名和行号

错误处理机制

系统实现了完善的错误处理机制,确保图表渲染失败时仍能正常显示原始代码:

try {
  // 图表渲染逻辑
  const diagram = renderPlantUML(code);
  return diagram;
} catch (error) {
  // 渲染失败时回退到代码显示
  return `<pre class="plantuml-error">${escapeHtml(code)}</pre>`;
}

性能优化策略

为了提升图表渲染性能,BoostNote-Legacy采用了以下优化策略:

  1. 懒加载机制:图表库仅在需要时加载
  2. 缓存策略:已渲染的图表进行缓存避免重复渲染
  3. 异步渲染:图表渲染采用异步操作不阻塞主线程
  4. 按需编译:仅对包含图表语法的文档进行相关库的编译

这种集成方案为技术文档编写、系统设计、流程说明等场景提供了强大的可视化支持,极大地提升了Markdown文档的表现力和专业性。

HTML安全过滤与XSS防护机制

BoostNote-Legacy作为一个专业的Markdown笔记应用,在处理用户输入的Markdown内容时,采用了多层次的安全防护机制来防止XSS(跨站脚本攻击)和其他安全威胁。系统通过深度集成的sanitize-html库和自定义的安全过滤逻辑,构建了全面的HTML安全防护体系。

核心安全架构

BoostNote-Legacy的安全过滤系统采用分层防御策略,其核心架构如下:

mermaid

白名单机制实现

系统采用严格的白名单策略,只允许特定的HTML标签和属性通过:

允许的HTML标签列表
标签类别允许的标签说明
基础文本b, i, strong, em, br, p基本文本格式化
标题h1-h8所有标题级别
链接媒体a, img, iframe链接和嵌入内容
代码相关pre, code, kbd, samp, var代码显示相关
列表表格ol, ul, li, table, tr, td, th结构化内容
引用注释blockquote, q, ins, del引用和修改标记
其他div, span, hr, ruby, rt, rp辅助性标签
属性白名单配置

系统为不同标签配置了精细的属性权限:

allowedAttributes: {
  '*': ['abbr', 'accept', 'accesskey', 'align', 'alt', 'border', /* ... 58个全局属性 */],
  'a': ['href'],  // 链接只允许href属性
  'img': ['src', 'width', 'height'],  // 图片限制属性
  'iframe': ['src', 'width', 'height', 'frameborder', 'allowfullscreen'],
  'input': ['type', 'id', 'checked']
}

URL协议安全验证

系统对所有的URL链接进行严格的协议验证,防止恶意协议执行:

allowedSchemes: ['http', 'https', 'ftp', 'mailto'],
allowedSchemesAppliedToAttributes: ['href', 'src', 'cite'],
allowProtocolRelative: true

特殊的URL安全检查函数:

function naughtyHRef(href, options) {
  if (!href) return false;
  href = href.replace(/<\!\-\-.*?\-\-\>/g, '');  // 移除HTML注释
  
  const matches = href.match(/^([a-zA-Z]+)\:/);
  if (!matches) {
    if (href.match(/^[\/\\]{2}/)) {
      return !options.allowProtocolRelative;
    }
    return false;
  }
  
  const scheme = matches[1].toLowerCase();
  return options.allowedSchemes.indexOf(scheme) === -1;
}

代码块特殊处理

系统对代码块内容采用不同的安全策略,避免破坏代码结构:

if (state.tokens[tokenIdx].type.match(/.*_fence$/)) {
  // escapeHtmlCharacters has better performance
  state.tokens[tokenIdx].content = escapeHtmlCharacters(
    state.tokens[tokenIdx].content,
    { skipSingleQuote: true }
  )
}

字符转义机制

自定义的字符转义函数提供高性能的HTML特殊字符处理:

export function escapeHtmlCharacters(html, opt = { detectCodeBlock: false, skipSingleQuote: false }) {
  const matchHtmlRegExp = /["'&<>]/g;
  const escapes = ['&quot;', '&amp;', '&#39;', '&lt;', '&gt;'];
  
  // 处理代码块检测逻辑
  if (opt.detectCodeBlock) {
    // 检测4空格缩进的代码块
    // 检测```包裹的代码块
  }
  
  // 智能转义逻辑,避免重复转义
  if (current.char === '&') {
    let nextStr = '';
    let nextIndex = current.index;
    let escapedStr = false;
    
    // 检查是否已经是转义字符的一部分
    while (nextStr.length <= 5) {
      nextStr += html[nextIndex];
      nextIndex++;
      if (escapes.indexOf(nextStr) !== -1) {
        escapedStr = true;
        break;
      }
    }
    if (!escapedStr) {
      html = replaceAt(html, current.index, '&amp;');
    }
  }
  // 其他字符转义...
}

安全模式配置

系统提供三种安全级别配置,满足不同使用场景:

模式说明适用场景
STRICT严格模式,启用所有安全过滤默认安全级别
ALLOW_STYLES允许style标签和属性需要自定义样式时
NONE禁用所有安全过滤完全信任环境

iframe内容安全策略

对于嵌入式内容,系统实施额外的安全限制:

allowedIframeHostnames: ['www.youtube.com'],  // 只允许YouTube嵌入
naughtyIFrame: function(src, options) {
  try {
    const parsed = url.parse(src, false, true);
    return options.allowedIframeHostnames.index(parsed.hostname) === -1;
  } catch (e) {
    return true;  // 解析失败视为恶意
  }
}

性能优化策略

安全过滤系统采用多种性能优化技术:

  1. 选择性处理:只在需要时进行安全过滤
  2. 缓存机制:重复内容避免重复处理
  3. 早期终止:发现恶意内容立即终止处理
  4. 批量处理:优化DOM操作性能

测试覆盖保障

系统包含全面的安全测试用例,确保过滤逻辑的正确性:

test('escapeHtmlCharacters should skip code block if that option is enabled', () => {
  const input = `    <no escape>
<escapeMe>`;
  const expected = `    <no escape>
&lt;escapeMe&gt;`;
  const actual = escapeHtmlCharacters(input, { detectCodeBlock: true });
  expect(actual).toBe(expected);
});

test("escapeHtmlCharacters should NOT escape & character if it's a part of an escaped character", () => {
  const input = 'Do not escape &amp; or &quot; but do escape &';
  const expected = 'Do not escape &amp; or &quot; but do escape &amp;';
  const actual = escapeHtmlCharacters(input);
  expect(actual).toBe(expected);
});

通过这种多层次、细粒度的安全防护机制,BoostNote-Legacy能够在保持Markdown丰富表现力的同时,有效防御XSS等安全威胁,为用户提供安全可靠的笔记环境。

总结

BoostNote-Legacy通过多层次、细粒度的安全防护机制,在保持Markdown丰富表现力的同时,有效防御XSS等安全威胁。系统采用分层防御策略,包括严格的白名单机制、URL协议安全验证、字符转义机制和iframe内容安全策略,为用户提供安全可靠的笔记环境。通过这种全面的HTML安全防护体系,BoostNote-Legacy能够在处理用户输入的Markdown内容时确保安全性,同时保持高度的灵活性和可扩展性。

【免费下载链接】BoostNote-Legacy This repository is outdated and new Boost Note app is available! We've launched a new Boost Note app which supports real-time collaborative writing. https://github.com/BoostIO/BoostNote-App 【免费下载链接】BoostNote-Legacy 项目地址: https://gitcode.com/gh_mirrors/bo/BoostNote-Legacy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值