Class: MarkdownParser
- Inherits:
-
Object
- Object
- MarkdownParser
- 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
-
#ATX_HEADER_RE ⇒ Regexp
readonly
ATX 标题匹配:^#1,6s+.+?s*#s$.
-
#BLOCKQUOTE_RE ⇒ Regexp
readonly
引用块起始:^>.
-
#CODE_BLOCK_FENCE ⇒ Regexp
readonly
围栏代码块起始:^“‘(w*).
-
#CODE_BLOCK_INDENT ⇒ Regexp
readonly
缩进代码块:^( |t).
-
#HORIZONTAL_RULE ⇒ Regexp
readonly
水平分隔线:^*3,|-3,|_3,s*$.
-
#HTML_BLOCK_RE ⇒ Regexp
readonly
HTML 块起始:^<(/?)(w+).
-
#LIST_ALPHA_RE ⇒ Regexp
readonly
字母列表:^()[.)]s+.
-
#LIST_BULLET_RE ⇒ Regexp
readonly
无序列表:^(*|+|-)s+.
-
#LIST_NUMBER_RE ⇒ Regexp
readonly
有序列表:^(d+)s+.
-
#REFERENCE_DEF ⇒ Regexp
readonly
引用定义:^:s*(S+)(?:s+(.+?)[”')])?s*$.
-
#TABLE_ROW_RE ⇒ Regexp
readonly
表格行:^|(.+?)|?s*$.
-
#TABLE_SEP_RE ⇒ Regexp
readonly
表格分隔行:^|?+|?[s:-|]s$.
Instance Method Summary collapse
-
#initialize(text, rdiscount_obj) ⇒ MarkdownParser
constructor
初始化解析器。.
-
#to_html ⇒ String
完整解析流程:预处理 → 分块 → 渲染 → 后处理。.
-
#toc_content ⇒ String
生成目录 HTML。.
Constructor Details
#initialize(text, rdiscount_obj) ⇒ MarkdownParser
初始化解析器。
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,6s+.+?s*#s$.
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
#BLOCKQUOTE_RE ⇒ Regexp (readonly)
Returns 引用块起始:^>.
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
#CODE_BLOCK_FENCE ⇒ Regexp (readonly)
Returns 围栏代码块起始:^“‘(w*).
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
#CODE_BLOCK_INDENT ⇒ Regexp (readonly)
Returns 缩进代码块:^( |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*$.
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
#HTML_BLOCK_RE ⇒ Regexp (readonly)
Returns HTML 块起始:^<(/?)(w+).
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
#LIST_ALPHA_RE ⇒ Regexp (readonly)
Returns 字母列表:^()[.)]s+.
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
#LIST_BULLET_RE ⇒ Regexp (readonly)
Returns 无序列表:^(*|+|-)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+.
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*$.
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
#TABLE_ROW_RE ⇒ Regexp (readonly)
Returns 表格行:^|(.+?)|?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$.
155 |
# File 'lib/mdutils/rediscount.rb', line 155 ATX_HEADER_RE = /^(\#{1,6})\s+(.+?)\s*#*\s*$/ |
Instance Method Details
#to_html ⇒ String
完整解析流程:预处理 → 分块 → 渲染 → 后处理。
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 收集标题信息。
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 |