Module: Sourcerer::MarkDownGrade

Defined in:
lib/sourcerer/mark_down_grade.rb

Defined Under Namespace

Classes: BlockquoteWithAbstract, CustomPre, DdConverter, DlConverter, DtConverter, HeadingWithId, HrConverter, HtmlComment, InlineSemanticConverter, LiWithNestedLists, LinkConverter, SemanticBlockConverter, SpecialDivConverter, TablePassthrough

Constant Summary collapse

VERSION =
'0.1.0'

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.configObject (readonly)

Returns the value of attribute config.



29
30
31
# File 'lib/sourcerer/mark_down_grade.rb', line 29

def config
  @config
end

Class Method Details

.block_title_line(text) ⇒ Object

Render a block-title line with hard line break for immediate continuation.



638
639
640
# File 'lib/sourcerer/mark_down_grade.rb', line 638

def self.block_title_line text
  "#{format_block_title(text)}  \n"
end

.bootstrap!(options = {}) ⇒ Object

Setup all custom converters Options:

preserve_heading_ids: (default: true) Include <a id="..."> anchors before headings
strip_internal_links: (default: false) Remove href from internal anchor links, keeping only text
convert_tables_to_markdown: (default: false) Convert all tables to markdown UNLESS they have .no-markdown class


37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/sourcerer/mark_down_grade.rb', line 37

def self.bootstrap! options={}
  @config.merge!(options)

  register_pre_converter
  register_heading_converters
  register_dl_converters
  register_inline_semantic_converters
  register_block_converters
  register_table_converter
  register_hr_converter
  register_blockquote_converter
  register_comment_converter
  register_link_converter
end

.clean_admonition_inline_title(title, type) ⇒ Object

Remove duplicated admonition label prefixes from converted inline titles.



643
644
645
646
647
648
# File 'lib/sourcerer/mark_down_grade.rb', line 643

def self.clean_admonition_inline_title title, type
  normalized = title.to_s.strip
  label = "#{type.to_s.strip.capitalize}:"
  normalized = normalized.sub(/\A#{Regexp.escape(label)}\s*/i, '')
  normalized.empty? ? nil : normalized
end

.convert(html, options = {}) ⇒ Object



675
676
677
# File 'lib/sourcerer/mark_down_grade.rb', line 675

def self.convert html, options={}
  convert_html(html, options)
end

.convert_html(html, options = {}) ⇒ Object

Convert HTML into Markdown with MarkDownGrade converters. Options include:

convert_tables_to_markdown: Override global config for table conversion (true/false)


653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
# File 'lib/sourcerer/mark_down_grade.rb', line 653

def self.convert_html html, options={}
  bootstrap! unless @setup_complete
  @setup_complete = true

  # Determine effective table conversion mode
  effective_mode = determine_table_conversion_mode(html.to_s, options)
  Thread.current[:sourcerer_table_conversion_mode] = effective_mode

  begin
    normalized_html = normalize_html_for_markdown(html.to_s)
    markdown = ReverseMarkdown.convert(normalized_html, options)
    markdown = markdown.gsub(/(\*\*[^\n]+\*\*  \n)\n+(?=\S)/, '\\1')
    markdown = markdown.gsub(/<figcaption>\s+/, '<figcaption>')
    markdown = markdown.gsub(%r{\s+</figcaption>}, '</figcaption>')

    markdown.gsub('<!--CHECKBOX_CHECKED-->', '- [x]')
            .gsub('<!--CHECKBOX_UNCHECKED-->', '- [ ]')
  ensure
    Thread.current[:sourcerer_table_conversion_mode] = nil
  end
end

.format_block_title(text) ⇒ Object

Apply strong formatting consistently across block titles.



630
631
632
633
634
635
# File 'lib/sourcerer/mark_down_grade.rb', line 630

def self.format_block_title text
  normalized = normalize_block_title(text)
  plain = normalized.gsub(/\*\*([^*]+)\*\*/, '\\1')
  plain = plain.gsub(/\*([^*]+)\*/, '\\1').strip
  plain.empty? ? normalized : "**#{plain}**"
end

.normalize_block_title(text) ⇒ Object

Normalize block titles so escaped inline emphasis from html5s is converted to markdown emphasis consistently with html5 conversions.



623
624
625
626
627
# File 'lib/sourcerer/mark_down_grade.rb', line 623

def self.normalize_block_title text
  normalized = text.to_s.strip.gsub(/\s+/, ' ')
  normalized = normalized.gsub(/\\\*([^*]+)\\\*/, '**\\1**')
  normalized.gsub(/(?<![\\*])\*([^*]+)\*(?!\*)/, '**\\1**')
end

.register_block_convertersObject

Register block converter for special div classes.



587
588
589
590
591
592
593
594
# File 'lib/sourcerer/mark_down_grade.rb', line 587

def self.register_block_converters
  ReverseMarkdown::Converters.register :div, SpecialDivConverter.new
  semantic = SemanticBlockConverter.new
  ReverseMarkdown::Converters.register :section, semantic
  ReverseMarkdown::Converters.register :aside, semantic
  ReverseMarkdown::Converters.register :figure, semantic
  ReverseMarkdown::Converters.register :nav, semantic
end

.register_blockquote_converterObject

Register blockquote converter with abstract handling.



607
608
609
# File 'lib/sourcerer/mark_down_grade.rb', line 607

def self.register_blockquote_converter
  ReverseMarkdown::Converters.register :blockquote, BlockquoteWithAbstract.new
end

.register_comment_converterObject

Register HTML comment converter.



612
613
614
# File 'lib/sourcerer/mark_down_grade.rb', line 612

def self.register_comment_converter
  ReverseMarkdown::Converters.register :comment, HtmlComment.new
end

.register_dl_convertersObject

Register all definition list converters.



573
574
575
576
577
# File 'lib/sourcerer/mark_down_grade.rb', line 573

def self.register_dl_converters
  ReverseMarkdown::Converters.register :dl, DlConverter.new
  ReverseMarkdown::Converters.register :dt, DtConverter.new
  ReverseMarkdown::Converters.register :dd, DdConverter.new
end

.register_heading_convertersObject

Register heading converter that preserves ids.



562
563
564
565
566
567
568
569
570
# File 'lib/sourcerer/mark_down_grade.rb', line 562

def self.register_heading_converters
  converter = HeadingWithId.new
  ReverseMarkdown::Converters.register :h1, converter
  ReverseMarkdown::Converters.register :h2, converter
  ReverseMarkdown::Converters.register :h3, converter
  ReverseMarkdown::Converters.register :h4, converter
  ReverseMarkdown::Converters.register :h5, converter
  ReverseMarkdown::Converters.register :h6, converter
end

.register_hr_converterObject

Register horizontal-rule converter.



602
603
604
# File 'lib/sourcerer/mark_down_grade.rb', line 602

def self.register_hr_converter
  ReverseMarkdown::Converters.register :hr, HrConverter.new
end

.register_inline_semantic_convertersObject

Register inline semantic converters.



580
581
582
583
584
# File 'lib/sourcerer/mark_down_grade.rb', line 580

def self.register_inline_semantic_converters
  ReverseMarkdown::Converters.register(:em, InlineSemanticConverter.new('em', ReverseMarkdown::Converters::Em.new))
  ReverseMarkdown::Converters.register(:strong, InlineSemanticConverter.new('strong', ReverseMarkdown::Converters::Strong.new))
  ReverseMarkdown::Converters.register(:code, InlineSemanticConverter.new('code', ReverseMarkdown::Converters::Code.new))
end

Register custom link converter to support id-only anchors and optional stripping.



617
618
619
# File 'lib/sourcerer/mark_down_grade.rb', line 617

def self.register_link_converter
  ReverseMarkdown::Converters.register :a, LinkConverter.new
end

.register_pre_converterObject

Register the enhanced Pre converter.



557
558
559
# File 'lib/sourcerer/mark_down_grade.rb', line 557

def self.register_pre_converter
  ReverseMarkdown::Converters.register :pre, CustomPre.new
end

.register_table_converterObject

Register table passthrough converter.



597
598
599
# File 'lib/sourcerer/mark_down_grade.rb', line 597

def self.register_table_converter
  ReverseMarkdown::Converters.register :table, TablePassthrough.new
end