Class: Markdown::Merge::ProviderBackend

Inherits:
Object
  • Object
show all
Defined in:
lib/markdown/merge/source_preserving_provider.rb,
sig/markdown/merge.rbs

Overview

Parser adapter used by the conservative Markdown provider. Backends supply native AST facts; the provider owns all source-range and merge policy. rubocop:disable Metrics/AbcSize, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity -- backend ASTs expose materially different heading facts

Defined Under Namespace

Classes: Heading

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, package:, dialects:, parser:, headings:) ⇒ ProviderBackend

Returns a new instance of ProviderBackend.



16
17
18
19
20
21
22
# File 'lib/markdown/merge/source_preserving_provider.rb', line 16

def initialize(id:, package:, dialects:, parser:, headings:)
  @id = id.to_sym
  @package = package
  @dialects = dialects.map(&:to_sym).freeze
  @parser = parser
  @headings = headings
end

Instance Attribute Details

#dialectsArray[Symbol] (readonly)

Returns the value of attribute dialects.

Returns:

  • (Array[Symbol])


14
15
16
# File 'lib/markdown/merge/source_preserving_provider.rb', line 14

def dialects
  @dialects
end

#idSymbol (readonly)

Returns the value of attribute id.

Returns:

  • (Symbol)


14
15
16
# File 'lib/markdown/merge/source_preserving_provider.rb', line 14

def id
  @id
end

#packageString (readonly)

Returns the value of attribute package.

Returns:

  • (String)


14
15
16
# File 'lib/markdown/merge/source_preserving_provider.rb', line 14

def package
  @package
end

Class Method Details

.native_headings(root, source, kramdown: false) ⇒ Array[ProviderBackend::Heading]

Parameters:

  • root (Object)
  • source (String)
  • kramdown: (Boolean) (defaults to: false)

Returns:



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/markdown/merge/source_preserving_provider.rb', line 36

def native_headings(root, source, kramdown: false)
  root.children.filter_map do |node|
    next unless node.type.to_s == 'heading'

    start_line = point_row(node.start_point)
    end_line = point_row(node.end_point)
    level = node.header_level.to_i
    text = node.text.to_s.chomp
    style = if kramdown
              kramdown_atx?(node, source, start_line, level, text) ? :atx : :setext
            else
              start_line == end_line ? :atx : :setext
            end
    Heading.new(level: level, text: text, start_line: start_line, end_line: end_line, style: style)
  end
end

.tree_sitter_headings(root, _source) ⇒ Array[ProviderBackend::Heading]

Parameters:

  • root (Object)
  • source (String)

Returns:



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/markdown/merge/source_preserving_provider.rb', line 53

def tree_sitter_headings(root, _source)
  document_section_headings(root).filter_map do |node|
    type = node.type.to_s
    level = atx_level(node)
    if level
      Heading.new(
        level: level,
        text: heading_inline_text(node),
        start_line: point_row(node.start_point),
        end_line: point_row(node.end_point),
        style: :atx
      )
    elsif type.start_with?('setext_') && type.end_with?('_heading')
      Heading.new(
        level: type.include?('h1') ? 1 : 2,
        text: heading_inline_text(node),
        start_line: point_row(node.start_point),
        end_line: point_row(node.end_point),
        style: :setext
      )
    end
  end
end

Instance Method Details

#parse(source) ⇒ [untyped, Array[ProviderBackend::Heading]]

Parameters:

  • source (String)

Returns:

Raises:

  • (TreeHaver::NotAvailable)


24
25
26
27
28
29
30
31
32
33
# File 'lib/markdown/merge/source_preserving_provider.rb', line 24

def parse(source)
  tree = @parser.call(source)
  root = tree.root_node
  raise TreeHaver::NotAvailable, 'Markdown parser returned no root node' unless root
  if root.respond_to?(:has_error?) && root.has_error?
    raise TreeHaver::NotAvailable, 'Markdown parser reported a syntax error'
  end

  [root, @headings.call(root, source)]
end