Module: ComposableAgents::Utils::Markdown

Defined in:
lib/composable_agents/utils/markdown.rb

Overview

Internal util methods to handle Markdown

Internal collapse

Class Method Details

.adjust_header_levels(doc, level_diff) ⇒ Object

Adjust header levels in a CommonMarker document by a given difference

Parameters:

  • doc (CommonMarker::Document)

    The parsed CommonMarker document

  • level_diff (Integer)

    The difference to add to each header level



48
49
50
51
52
# File 'lib/composable_agents/utils/markdown.rb', line 48

def adjust_header_levels(doc, level_diff)
  doc.walk do |node|
    node.header_level = node.header_level + level_diff if node.type == :heading
  end
end

.align_markdown_headers(markdown, level: 2) ⇒ String

Align markdown headers in a String to a given level. This method parses the String as a markdown document, sees the minimum current header level, and changes it while preserving the structure and hierarchy so that this min level is equal to level.

Parameters:

  • markdown (String)

    The markdown content to align

  • level (Integer) (defaults to: 2)

    The target level for the minimum header

Returns:

  • (String)

    The aligned markdown content



18
19
20
21
22
23
24
25
26
27
# File 'lib/composable_agents/utils/markdown.rb', line 18

def align_markdown_headers(markdown, level: 2)
  doc = Commonmarker.parse(markdown)
  min_level = find_minimum_header_level(doc)
  return markdown if min_level.nil? || min_level == level

  adjust_header_levels(doc, level - min_level)
  # Unescape dots in headers
  # TODO: Remove this gsub when CommonMarker will be fixed.
  doc.to_commonmark.gsub(/^\#{1,6}\s+\h+\K\\\. /, '. ')
end

.find_minimum_header_level(doc) ⇒ Integer?

Find the minimum header level in a CommonMarker document

Parameters:

  • doc (CommonMarker::Document)

    The parsed CommonMarker document

Returns:

  • (Integer, nil)

    The minimum header level found, or nil if no headers exist



33
34
35
36
37
38
39
40
41
42
# File 'lib/composable_agents/utils/markdown.rb', line 33

def find_minimum_header_level(doc)
  min_level = nil
  doc.walk do |node|
    if node.type == :heading
      current_level = node.header_level
      min_level = current_level if min_level.nil? || current_level < min_level
    end
  end
  min_level
end