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_RERegexp (readonly)

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

Returns:

  • (Regexp)

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



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

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

#BLOCKQUOTE_RERegexp (readonly)

Returns 引用块起始:^>.

Returns:

  • (Regexp)

    引用块起始:^>



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

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

#CODE_BLOCK_FENCERegexp (readonly)

Returns 围栏代码块起始:^“‘(w*).

Returns:

  • (Regexp)

    围栏代码块起始:^“‘(w*)



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

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

#CODE_BLOCK_INDENTRegexp (readonly)

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

Returns:

  • (Regexp)

    缩进代码块:^( |t)



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

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

#HORIZONTAL_RULERegexp (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_RERegexp (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_RERegexp (readonly)

Returns 字母列表:^()[.)]s+.

Returns:



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

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

#LIST_BULLET_RERegexp (readonly)

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

Returns:

  • (Regexp)

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



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

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

#LIST_NUMBER_RERegexp (readonly)

Returns:



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

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

#REFERENCE_DEFRegexp (readonly)

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

Returns:



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

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

#TABLE_ROW_RERegexp (readonly)

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

Returns:

  • (Regexp)

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



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

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

#TABLE_SEP_RERegexp (readonly)

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

Returns:



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

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

Instance Method Details

#to_htmlString

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

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_contentString

生成目录 HTML。

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

Returns:

  • (String)

    目录 HTML(<ul> 列表),如果无标题返回空字符串



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