Class: MarkdownParser

Inherits:
Object
  • Object
show all
Defined in:
lib/mdutils/rediscount.rb

Overview

============================================================================

内部 Markdown 解析器实现

Constant Summary collapse

ATX_HEADER_RE =

块级正则常量

/^(\#{1,6})\s+(.+?)\s*#*\s*$/
HORIZONTAL_RULE =
/^(\*{3,}|-{3,}|_{3,})\s*$/
CODE_BLOCK_FENCE =
/^```(\w*)/
CODE_BLOCK_INDENT =
/^(    |\t)/
BLOCKQUOTE_RE =
/^\s*>/
LIST_BULLET_RE =
/^(\*|\+|-)\s+/
LIST_NUMBER_RE =
/^(\d+)[.)]\s+/
LIST_ALPHA_RE =
/^([a-zA-Z])[.)]\s+/
REFERENCE_DEF =
/^\[(.+?)\]:\s*(\S+)(?:\s+["'(](.+?)["')])?\s*$/
HTML_BLOCK_RE =
/^<(\/?)(\w+)/
TABLE_ROW_RE =
/^\|(.+?)\|?\s*$/
TABLE_SEP_RE =
/^\|?[\s:|-]+\|?[\s:|-]*\s*$/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(text, rdiscount_obj) ⇒ MarkdownParser

初始化解析器。

Parameters:

  • text (String) —

    Markdown 文本

  • rdiscount_obj (ReDiscount) —

    ReDiscount 实例,提供标志配置



172
173
174
175
176
177
178
179
180
# File 'lib/mdutils/rediscount.rb', line 172

def initialize(text, rdiscount_obj)
  @text = text
  @rd = rdiscount_obj
  @references = {}
  @footnotes = {}
  @footnote_counter = 0
  @toc_entries = []
  @used_footnotes = []
end

Instance Attribute Details

#ATX_HEADER_RE ⇒ Regexp (readonly)

Returns ATX 标题匹配:^#1,6\s+.+?\s*#\s$.

Returns:

  • (Regexp) —

    ATX 标题匹配:^#1,6\s+.+?\s*#\s$



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#BLOCKQUOTE_RE ⇒ Regexp (readonly)

Returns 引用块起始:^>.

Returns:

  • (Regexp) —

    引用块起始:^>



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#CODE_BLOCK_FENCE ⇒ Regexp (readonly)

Returns 围栏代码块起始:^```(\w*).

Returns:

  • (Regexp) —

    围栏代码块起始:^```(\w*)



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#CODE_BLOCK_INDENT ⇒ Regexp (readonly)

Returns 缩进代码块:^( |\t).

Returns:

  • (Regexp) —

    缩进代码块:^( |\t)



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#HORIZONTAL_RULE ⇒ Regexp (readonly)

Returns 水平分隔线:^*3,|-3,|_3,\s*$.

Returns:

  • (Regexp) —

    水平分隔线:^*3,|-3,|_3,\s*$



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#HTML_BLOCK_RE ⇒ Regexp (readonly)

Returns HTML 块起始:^<(/?)(\w+).

Returns:

  • (Regexp) —

    HTML 块起始:^<(/?)(\w+)



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#LIST_ALPHA_RE ⇒ Regexp (readonly)

Returns 字母列表:^([a-zA-Z])[.)]\s+.

Returns:

  • (Regexp) —

    字母列表:^([a-zA-Z])[.)]\s+



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#LIST_BULLET_RE ⇒ Regexp (readonly)

Returns 无序列表:^(*|+|-)\s+.

Returns:

  • (Regexp) —

    无序列表:^(*|+|-)\s+



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#LIST_NUMBER_RE ⇒ Regexp (readonly)

Returns 有序列表:^(\d+)[.)]\s+.

Returns:

  • (Regexp) —

    有序列表:^(\d+)[.)]\s+



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#REFERENCE_DEF ⇒ Regexp (readonly)

Returns 引用定义:^[(.+?)]:\s*(\S+)(?:\s+"'(["')])?\s*$.

Returns:

  • (Regexp) —

    引用定义:^[(.+?)]:\s*(\S+)(?:\s+"'(["')])?\s*$



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#TABLE_ROW_RE ⇒ Regexp (readonly)

Returns 表格行:^|(.+?)|?\s*$.

Returns:

  • (Regexp) —

    表格行:^|(.+?)|?\s*$



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

#TABLE_SEP_RE ⇒ Regexp (readonly)

Returns 表格分隔行:^|?[\s:-]+|?[\s:-|]\s$.

Returns:

  • (Regexp) —

    表格分隔行:^|?[\s:-]+|?[\s:-|]\s$



155
# File 'lib/mdutils/rediscount.rb', line 155

ATX_HEADER_RE    = /^(\#{1,6})\s+(.+?)\s*#*\s*$/

Instance Method Details

#to_html ⇒ String

完整解析流程:预处理 → 分块 → 渲染 → 后处理。

Returns:

  • (String) —

    最终 HTML 字符串(末尾含换行符)



185
186
187
188
189
190
191
# File 'lib/mdutils/rediscount.rb', line 185

def to_html
  normalized = preprocess(@text)
  blocks = parse_blocks(normalized)
  html = render_blocks(blocks)
  html = postprocess(html)
  html.strip + "\n"
end

#toc_content ⇒ String

生成目录 HTML。

需要先调用 to_html 收集标题信息。

Returns:

  • (String) —

    目录 HTML(

      列表),如果无标题返回空字符串



198
199
200
201
202
203
204
205
# File 'lib/mdutils/rediscount.rb', line 198

def toc_content
  normalized = preprocess(@text)
  blocks = parse_blocks(normalized)
  render_blocks(blocks)
  return "" if @toc_entries.empty?

  build_toc_html(@toc_entries)
end