Class: Markly::Merge::Backend::Node

Inherits:
TreeHaver::Base::Node
  • Object
show all
Defined in:
lib/markly/merge/backend.rb

Overview

Markly node wrapper

Wraps Markly::Node to provide TreeHaver::Node-compatible interface.

Constant Summary collapse

TYPE_MAP =

Type normalization map (Markly → canonical)

{
  header: "heading",
  hrule: "thematic_break",
  html: "html_block",
}.freeze
DEFAULT_SOURCE_POSITION =

Default source position for nodes that don’t have position info

{
  start_line: 1,
  start_column: 1,
  end_line: 1,
  end_column: 1,
}.freeze

Instance Method Summary collapse

Instance Method Details

#childrenArray<Node>

Get child nodes (Markly uses first_child/next pattern)

Returns:

  • (Array<Node>)

    Child nodes



226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/markly/merge/backend.rb', line 226

def children
  result = []
  child = begin
    inner_node.first_child
  rescue
    nil
  end
  while child
    result << Node.new(child, source: source, lines: lines)
    child = begin
      child.next
    rescue
      nil
    end
  end
  result
end

#end_byteObject



251
252
253
254
# File 'lib/markly/merge/backend.rb', line 251

def end_byte
  pos = inner_source_position
  calculate_byte_offset(pos[:end_line] - 1, pos[:end_column] - 1)
end

#end_pointObject



261
262
263
264
# File 'lib/markly/merge/backend.rb', line 261

def end_point
  pos = inner_source_position
  {row: pos[:end_line] - 1, column: pos[:end_column] - 1}
end

#inner_source_positionHash{Symbol => Integer}

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Get source position from the inner Markly node

Returns:

  • (Hash{Symbol => Integer})

    Source position from Markly



181
182
183
184
185
186
187
# File 'lib/markly/merge/backend.rb', line 181

def inner_source_position
  @inner_source_position ||= if inner_node.respond_to?(:source_position)
    inner_node.source_position || DEFAULT_SOURCE_POSITION
  else
    DEFAULT_SOURCE_POSITION
  end
end

#raw_typeString

Get the raw (non-normalized) type

Returns:

  • (String)


199
200
201
# File 'lib/markly/merge/backend.rb', line 199

def raw_type
  inner_node.type.to_s
end

#start_byteObject

Position information



246
247
248
249
# File 'lib/markly/merge/backend.rb', line 246

def start_byte
  pos = inner_source_position
  calculate_byte_offset(pos[:start_line] - 1, pos[:start_column] - 1)
end

#start_pointObject



256
257
258
259
# File 'lib/markly/merge/backend.rb', line 256

def start_point
  pos = inner_source_position
  {row: pos[:start_line] - 1, column: pos[:start_column] - 1}
end

#textString

Get the text content of this node

Returns:

  • (String)

    Node text



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/markly/merge/backend.rb', line 206

def text
  if inner_node.respond_to?(:string_content)
    content = inner_node.string_content.to_s
    return content unless content.empty?
  end

  if inner_node.respond_to?(:to_plaintext)
    begin
      inner_node.to_plaintext
    rescue
      children.map(&:text).join
    end
  else
    children.map(&:text).join
  end
end

#to_commonmarkObject

Convert node to CommonMark/Markdown/HTML/plaintext



267
268
269
# File 'lib/markly/merge/backend.rb', line 267

def to_commonmark
  inner_node.to_commonmark
end

#to_htmlObject



279
280
281
# File 'lib/markly/merge/backend.rb', line 279

def to_html
  inner_node.to_html
end

#to_markdownObject



271
272
273
# File 'lib/markly/merge/backend.rb', line 271

def to_markdown
  inner_node.to_markdown
end

#to_plaintextObject



275
276
277
# File 'lib/markly/merge/backend.rb', line 275

def to_plaintext
  inner_node.to_plaintext
end

#typeString

Get the node type as a string (normalized)

Returns:

  • (String)

    Node type



192
193
194
195
# File 'lib/markly/merge/backend.rb', line 192

def type
  raw = inner_node.type.to_s
  TYPE_MAP[raw.to_sym]&.to_s || raw
end