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



270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'lib/markly/merge/backend.rb', line 270

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



295
296
297
298
# File 'lib/markly/merge/backend.rb', line 295

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

#end_pointObject



305
306
307
308
# File 'lib/markly/merge/backend.rb', line 305

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

#fence_infoString?

Get fence info for code blocks

Returns:

  • (String, nil)


342
343
344
345
346
347
348
349
# File 'lib/markly/merge/backend.rb', line 342

def fence_info
  return unless type == "code_block"
  begin
    inner_node.fence_info
  rescue
    nil
  end
end

#header_levelInteger?

Get heading level (1-6)

Returns:

  • (Integer, nil)


331
332
333
334
335
336
337
338
# File 'lib/markly/merge/backend.rb', line 331

def header_level
  return unless raw_type == "header"
  begin
    inner_node.header_level
  rescue
    nil
  end
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



225
226
227
228
229
230
231
# File 'lib/markly/merge/backend.rb', line 225

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

#next_siblingNode?

Get the next sibling (Markly uses .next)

Returns:



369
370
371
372
373
374
375
376
# File 'lib/markly/merge/backend.rb', line 369

def next_sibling
  sibling = begin
    inner_node.next
  rescue
    nil
  end
  sibling ? Node.new(sibling, source: source, lines: lines) : nil
end

#parentNode?

Get the parent node

Returns:



391
392
393
394
395
396
397
398
# File 'lib/markly/merge/backend.rb', line 391

def parent
  p = begin
    inner_node.parent
  rescue
    nil
  end
  p ? Node.new(p, source: source, lines: lines) : nil
end

#prev_siblingNode?

Get the previous sibling

Returns:



380
381
382
383
384
385
386
387
# File 'lib/markly/merge/backend.rb', line 380

def prev_sibling
  sibling = begin
    inner_node.previous
  rescue
    nil
  end
  sibling ? Node.new(sibling, source: source, lines: lines) : nil
end

#raw_typeString

Get the raw (non-normalized) type

Returns:

  • (String)


243
244
245
# File 'lib/markly/merge/backend.rb', line 243

def raw_type
  inner_node.type.to_s
end

#start_byteObject

Position information



290
291
292
293
# File 'lib/markly/merge/backend.rb', line 290

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

#start_pointObject



300
301
302
303
# File 'lib/markly/merge/backend.rb', line 300

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



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/markly/merge/backend.rb', line 250

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

#titleString?

Get title for links/images

Returns:

  • (String, nil)


361
362
363
364
365
# File 'lib/markly/merge/backend.rb', line 361

def title
  inner_node.title
rescue
  nil
end

#to_commonmarkObject

Convert node to CommonMark/Markdown/HTML/plaintext



311
312
313
# File 'lib/markly/merge/backend.rb', line 311

def to_commonmark
  inner_node.to_commonmark
end

#to_htmlObject



323
324
325
# File 'lib/markly/merge/backend.rb', line 323

def to_html
  inner_node.to_html
end

#to_markdownObject



315
316
317
# File 'lib/markly/merge/backend.rb', line 315

def to_markdown
  inner_node.to_markdown
end

#to_plaintextObject



319
320
321
# File 'lib/markly/merge/backend.rb', line 319

def to_plaintext
  inner_node.to_plaintext
end

#typeString

Get the node type as a string (normalized)

Returns:

  • (String)

    Node type



236
237
238
239
# File 'lib/markly/merge/backend.rb', line 236

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

#urlString?

Get URL for links/images

Returns:

  • (String, nil)


353
354
355
356
357
# File 'lib/markly/merge/backend.rb', line 353

def url
  inner_node.url
rescue
  nil
end