Class: TreeHaver::Backends::Commonmarker::Node

Inherits:
Object
  • Object
show all
Includes:
Comparable, Enumerable
Defined in:
lib/tree_haver/backends/commonmarker.rb

Overview

Commonmarker node wrapper

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node, source, lines = nil) ⇒ Node

Returns a new instance of Node.



209
210
211
212
213
# File 'lib/tree_haver/backends/commonmarker.rb', line 209

def initialize(node, source, lines = nil)
  @inner_node = node
  @source = source
  @lines = lines || source.lines
end

Instance Attribute Details

#inner_nodeObject (readonly)

Returns the value of attribute inner_node.



207
208
209
# File 'lib/tree_haver/backends/commonmarker.rb', line 207

def inner_node
  @inner_node
end

#sourceObject (readonly)

Returns the value of attribute source.



207
208
209
# File 'lib/tree_haver/backends/commonmarker.rb', line 207

def source
  @source
end

Instance Method Details

#<=>(other) ⇒ Object



392
393
394
395
396
397
# File 'lib/tree_haver/backends/commonmarker.rb', line 392

def <=>(other)
  return unless other.respond_to?(:start_byte)
  cmp = start_byte <=> other.start_byte
  return cmp unless cmp&.zero?
  end_byte <=> other.end_byte
end

#child(index) ⇒ Object



265
266
267
# File 'lib/tree_haver/backends/commonmarker.rb', line 265

def child(index)
  children[index]
end

#child_countObject



261
262
263
# File 'lib/tree_haver/backends/commonmarker.rb', line 261

def child_count
  children.size
end

#childrenArray<Node>

Get child nodes

Returns:

  • (Array<Node>)

    Child nodes



248
249
250
251
252
253
254
# File 'lib/tree_haver/backends/commonmarker.rb', line 248

def children
  return [] unless @inner_node.respond_to?(:each)

  result = []
  @inner_node.each { |child| result << Node.new(child, @source, @lines) }
  result
end

#each(&block) ⇒ Object



256
257
258
259
# File 'lib/tree_haver/backends/commonmarker.rb', line 256

def each(&block)
  return to_enum(__method__) unless block
  children.each(&block)
end

#end_byteObject



277
278
279
280
# File 'lib/tree_haver/backends/commonmarker.rb', line 277

def end_byte
  ep = end_point
  calculate_byte_offset(ep.row, ep.column)
end

#end_lineObject



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# File 'lib/tree_haver/backends/commonmarker.rb', line 339

def end_line
  if @inner_node.respond_to?(:source_position)
    pos = begin
      @inner_node.source_position
    rescue
      nil
    end
    return pos[:end_line] if pos && pos[:end_line]
  end
  pos = begin
    @inner_node.sourcepos
  rescue
    nil
  end
  pos ? pos[2] : 1
end

#end_pointObject



302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'lib/tree_haver/backends/commonmarker.rb', line 302

def end_point
  if @inner_node.respond_to?(:source_position)
    pos = begin
      @inner_node.source_position
    rescue
      nil
    end
    if pos && pos[:end_line]
      return Point.new(pos[:end_line] - 1, (pos[:end_column] || 1) - 1)
    end
  end
  pos = begin
    @inner_node.sourcepos
  rescue
    nil
  end
  return Point.new(0, 0) unless pos
  Point.new(pos[2] - 1, pos[3] - 1)
end

#fence_infoString?

Get fence info for code blocks

Returns:

  • (String, nil)


418
419
420
421
422
423
424
425
# File 'lib/tree_haver/backends/commonmarker.rb', line 418

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

#first_childNode?

Get the first child node

Returns:

  • (Node, nil)

    First child or nil



374
375
376
# File 'lib/tree_haver/backends/commonmarker.rb', line 374

def first_child
  children.first
end

#has_error?Boolean

Returns:

  • (Boolean)


384
385
386
# File 'lib/tree_haver/backends/commonmarker.rb', line 384

def has_error?
  false
end

#header_levelInteger?

Get heading level (1-6)

Returns:

  • (Integer, nil)


407
408
409
410
411
412
413
414
# File 'lib/tree_haver/backends/commonmarker.rb', line 407

def header_level
  return unless type == "heading"
  begin
    @inner_node.header_level
  rescue
    nil
  end
end

#inspectObject



399
400
401
# File 'lib/tree_haver/backends/commonmarker.rb', line 399

def inspect
  "#<TreeHaver::Backends::Commonmarker::Node type=#{type}>"
end

#missing?Boolean

Returns:

  • (Boolean)


388
389
390
# File 'lib/tree_haver/backends/commonmarker.rb', line 388

def missing?
  false
end

#named?Boolean Also known as: structural?

Returns:

  • (Boolean)


378
379
380
# File 'lib/tree_haver/backends/commonmarker.rb', line 378

def named?
  true
end

#next_siblingNode?

Get the next sibling

Returns:



445
446
447
448
449
450
451
452
# File 'lib/tree_haver/backends/commonmarker.rb', line 445

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

#parentNode?

Get the parent node

Returns:



467
468
469
470
471
472
473
474
# File 'lib/tree_haver/backends/commonmarker.rb', line 467

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

#prev_siblingNode?

Get the previous sibling

Returns:



456
457
458
459
460
461
462
463
# File 'lib/tree_haver/backends/commonmarker.rb', line 456

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

#source_positionHash{Symbol => Integer}

Get position information as a hash

Returns a hash with 1-based line numbers and 0-based columns. Compatible with *-merge gems’ FileAnalysisBase.

Returns:

  • (Hash{Symbol => Integer})

    Position hash



362
363
364
365
366
367
368
369
# File 'lib/tree_haver/backends/commonmarker.rb', line 362

def source_position
  {
    start_line: start_line,
    end_line: end_line,
    start_column: start_point.column,
    end_column: end_point.column,
  }
end

#start_byteObject

Position information Commonmarker 2.x provides source_position as a hash with start_line, start_column, end_line, end_column



272
273
274
275
# File 'lib/tree_haver/backends/commonmarker.rb', line 272

def start_byte
  sp = start_point
  calculate_byte_offset(sp.row, sp.column)
end

#start_lineObject



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
# File 'lib/tree_haver/backends/commonmarker.rb', line 322

def start_line
  if @inner_node.respond_to?(:source_position)
    pos = begin
      @inner_node.source_position
    rescue
      nil
    end
    return pos[:start_line] if pos && pos[:start_line]
  end
  pos = begin
    @inner_node.sourcepos
  rescue
    nil
  end
  pos ? pos[0] : 1
end

#start_pointObject



282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
# File 'lib/tree_haver/backends/commonmarker.rb', line 282

def start_point
  if @inner_node.respond_to?(:source_position)
    pos = begin
      @inner_node.source_position
    rescue
      nil
    end
    if pos && pos[:start_line]
      return Point.new(pos[:start_line] - 1, (pos[:start_column] || 1) - 1)
    end
  end
  pos = begin
    @inner_node.sourcepos
  rescue
    nil
  end
  return Point.new(0, 0) unless pos
  Point.new(pos[0] - 1, pos[1] - 1)
end

#textString

Get the text content of this node

Returns:

  • (String)

    Node text



229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/tree_haver/backends/commonmarker.rb', line 229

def text
  # Commonmarker nodes have string_content for text nodes
  # Container nodes don't have string_content and will raise TypeError
  if @inner_node.respond_to?(:string_content)
    begin
      @inner_node.string_content.to_s
    rescue TypeError
      # Container node - concatenate children's text
      children.map(&:text).join
    end
  else
    # For container nodes, concatenate children's text
    children.map(&:text).join
  end
end

#titleString?

Get title for links/images

Returns:

  • (String, nil)


437
438
439
440
441
# File 'lib/tree_haver/backends/commonmarker.rb', line 437

def title
  @inner_node.title
rescue
  nil
end

#typeString Also known as: kind

Get the node type as a string

Commonmarker uses symbols like :document, :heading, :paragraph, etc.

Returns:

  • (String)

    Node type



220
221
222
# File 'lib/tree_haver/backends/commonmarker.rb', line 220

def type
  @inner_node.type.to_s
end

#urlString?

Get URL for links/images

Returns:

  • (String, nil)


429
430
431
432
433
# File 'lib/tree_haver/backends/commonmarker.rb', line 429

def url
  @inner_node.url
rescue
  nil
end