class MinimalMarkdown::Parser

Constants

DEFAULT_PARSERS
STYLES

Attributes

parsers[R]
text[R]

Public Class Methods

new(text, style: :markdown, parsers: DEFAULT_PARSERS) click to toggle source
# File lib/minimal_markdown/parser.rb, line 13
def initialize(text, style: :markdown, parsers: DEFAULT_PARSERS)
  raise ArgumentError, 'invalid style' unless STYLES.include?(style)

  @text = text
  @style = style
  @parsers = parsers
end

Public Instance Methods

parse() click to toggle source
# File lib/minimal_markdown/parser.rb, line 21
def parse
  prepared_text = text.strip.gsub("\r", "")

  preline_parsers, postline_parsers = parsers.map { |parser| parser.new(@style) }.partition(&:multiline?)

  preline_tree = run_parsers(preline_parsers, [prepared_text])
  postline_tree = convert_to_lines(preline_tree)
  run_parsers(postline_parsers, postline_tree)
end

Private Instance Methods

convert_to_lines(tree) click to toggle source
# File lib/minimal_markdown/parser.rb, line 39
def convert_to_lines(tree)
  tree.flat_map do |node|
    if node.is_a?(String)
      parse_lines(node)
    else
      node
    end
  end
end
parse_lines(text) click to toggle source
# File lib/minimal_markdown/parser.rb, line 49
def parse_lines(text)
  text.scan(/(.*)(\s*\n)*/).flat_map do |line, spaces|
    if line.empty?
      []
    else
      Nodes::Line.new(Nodes::Text.new(line), spaces&.count("\n") || 0)
    end
  end
end
run_parsers(parsers, input_tree) click to toggle source
# File lib/minimal_markdown/parser.rb, line 33
def run_parsers(parsers, input_tree)
  parsers.inject(input_tree) do |tree, parser|
    parser.update_tree(tree)
  end
end