Class: TreeHaver::Backends::Markly::Node
- Inherits:
-
Object
- Object
- TreeHaver::Backends::Markly::Node
- Includes:
- Comparable, Enumerable
- Defined in:
- lib/tree_haver/backends/markly.rb
Overview
Markly node wrapper
Wraps Markly::Node to provide TreeHaver::Node-compatible interface.
Note: Markly uses different type names than Commonmarker:
-
:header instead of :heading
-
:hrule instead of :thematic_break
-
:blockquote instead of :block_quote
-
:html instead of :html_block
Constant Summary collapse
- TYPE_MAP =
Type normalization map (Markly → canonical)
{ header: "heading", hrule: "thematic_break", html: "html_block", # blockquote is the same # Most types are the same between Markly and Commonmarker }.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 Attribute Summary collapse
-
#inner_node ⇒ Object
readonly
Returns the value of attribute inner_node.
-
#source ⇒ Object
readonly
Returns the value of attribute source.
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #child(index) ⇒ Object
- #child_count ⇒ Object
-
#children ⇒ Array<Node>
Get child nodes.
- #each(&block) ⇒ Object
- #end_byte ⇒ Object
-
#end_line ⇒ Integer
Get the 1-based line number where this node ends.
- #end_point ⇒ Object
-
#fence_info ⇒ String?
Get fence info for code blocks.
-
#first_child ⇒ Node?
Get the first child node.
- #has_error? ⇒ Boolean
-
#header_level ⇒ Integer?
Get heading level (1-6).
-
#initialize(node, source, lines = nil) ⇒ Node
constructor
A new instance of Node.
-
#inner_source_position ⇒ Hash{Symbol => Integer}
private
Get source position from the inner Markly node.
- #inspect ⇒ Object
- #missing? ⇒ Boolean
- #named? ⇒ Boolean (also: #structural?)
-
#next_sibling ⇒ Node?
Get the next sibling (Markly uses .next).
-
#parent ⇒ Node?
Get the parent node.
-
#prev_sibling ⇒ Node?
Get the previous sibling.
-
#raw_type ⇒ String
Get the raw (non-normalized) type.
-
#source_position ⇒ Hash{Symbol => Integer}
Get position information as a hash.
-
#start_byte ⇒ Object
Position information Markly provides source_position as a hash with :start_line, :start_column, :end_line, :end_column (1-based).
-
#start_line ⇒ Integer
Get the 1-based line number where this node starts.
- #start_point ⇒ Object
-
#text ⇒ String
Get the text content of this node.
-
#title ⇒ String?
Get title for links/images.
-
#to_commonmark ⇒ String
Convert node to CommonMark format.
-
#to_html ⇒ String
Convert node to HTML.
-
#to_markdown ⇒ String
Convert node to Markdown format.
-
#to_plaintext ⇒ String
Convert node to plain text.
-
#type ⇒ String
(also: #kind)
Get the node type as a string.
-
#url ⇒ String?
Get URL for links/images.
Constructor Details
#initialize(node, source, lines = nil) ⇒ Node
Returns a new instance of Node.
224 225 226 227 228 |
# File 'lib/tree_haver/backends/markly.rb', line 224 def initialize(node, source, lines = nil) @inner_node = node @source = source @lines = lines || source.lines end |
Instance Attribute Details
#inner_node ⇒ Object (readonly)
Returns the value of attribute inner_node.
222 223 224 |
# File 'lib/tree_haver/backends/markly.rb', line 222 def inner_node @inner_node end |
#source ⇒ Object (readonly)
Returns the value of attribute source.
222 223 224 |
# File 'lib/tree_haver/backends/markly.rb', line 222 def source @source end |
Instance Method Details
#<=>(other) ⇒ Object
401 402 403 404 405 406 |
# File 'lib/tree_haver/backends/markly.rb', line 401 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
314 315 316 |
# File 'lib/tree_haver/backends/markly.rb', line 314 def child(index) children[index] end |
#child_count ⇒ Object
310 311 312 |
# File 'lib/tree_haver/backends/markly.rb', line 310 def child_count children.size end |
#children ⇒ Array<Node>
Get child nodes
Markly uses first_child/next pattern
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 |
# File 'lib/tree_haver/backends/markly.rb', line 287 def children result = [] child = begin @inner_node.first_child rescue nil end while child result << Node.new(child, @source, @lines) child = begin child.next rescue nil end end result end |
#each(&block) ⇒ Object
305 306 307 308 |
# File 'lib/tree_haver/backends/markly.rb', line 305 def each(&block) return to_enum(__method__) unless block children.each(&block) end |
#end_byte ⇒ Object
328 329 330 331 332 333 |
# File 'lib/tree_haver/backends/markly.rb', line 328 def end_byte pos = inner_source_position line = pos[:end_line] - 1 col = pos[:end_column] - 1 calculate_byte_offset(line, col) end |
#end_line ⇒ Integer
Get the 1-based line number where this node ends
361 362 363 |
# File 'lib/tree_haver/backends/markly.rb', line 361 def end_line inner_source_position[:end_line] end |
#end_point ⇒ Object
342 343 344 345 346 347 |
# File 'lib/tree_haver/backends/markly.rb', line 342 def end_point pos = inner_source_position line = pos[:end_line] - 1 col = pos[:end_column] - 1 Point.new(line, col) end |
#fence_info ⇒ String?
Get fence info for code blocks
463 464 465 466 467 468 469 470 |
# File 'lib/tree_haver/backends/markly.rb', line 463 def fence_info return unless type == "code_block" begin @inner_node.fence_info rescue nil end end |
#first_child ⇒ Node?
Get the first child node
383 384 385 |
# File 'lib/tree_haver/backends/markly.rb', line 383 def first_child children.first end |
#has_error? ⇒ Boolean
393 394 395 |
# File 'lib/tree_haver/backends/markly.rb', line 393 def has_error? false end |
#header_level ⇒ Integer?
Get heading level (1-6)
452 453 454 455 456 457 458 459 |
# File 'lib/tree_haver/backends/markly.rb', line 452 def header_level return unless raw_type == "header" begin @inner_node.header_level rescue nil end end |
#inner_source_position ⇒ Hash{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
Markly provides source_position as a hash with :start_line, :start_column, :end_line, :end_column (all 1-based).
237 238 239 240 241 242 243 |
# File 'lib/tree_haver/backends/markly.rb', line 237 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 |
#inspect ⇒ Object
408 409 410 |
# File 'lib/tree_haver/backends/markly.rb', line 408 def inspect "#<TreeHaver::Backends::Markly::Node type=#{type} raw_type=#{raw_type}>" end |
#missing? ⇒ Boolean
397 398 399 |
# File 'lib/tree_haver/backends/markly.rb', line 397 def missing? false end |
#named? ⇒ Boolean Also known as: structural?
387 388 389 |
# File 'lib/tree_haver/backends/markly.rb', line 387 def named? true end |
#next_sibling ⇒ Node?
Get the next sibling (Markly uses .next)
490 491 492 493 494 495 496 497 |
# File 'lib/tree_haver/backends/markly.rb', line 490 def next_sibling sibling = begin @inner_node.next rescue nil end sibling ? Node.new(sibling, @source, @lines) : nil end |
#parent ⇒ Node?
Get the parent node
512 513 514 515 516 517 518 519 |
# File 'lib/tree_haver/backends/markly.rb', line 512 def parent p = begin @inner_node.parent rescue nil end p ? Node.new(p, @source, @lines) : nil end |
#prev_sibling ⇒ Node?
Get the previous sibling
501 502 503 504 505 506 507 508 |
# File 'lib/tree_haver/backends/markly.rb', line 501 def prev_sibling sibling = begin @inner_node.previous rescue nil end sibling ? Node.new(sibling, @source, @lines) : nil end |
#raw_type ⇒ String
Get the raw (non-normalized) type
259 260 261 |
# File 'lib/tree_haver/backends/markly.rb', line 259 def raw_type @inner_node.type.to_s end |
#source_position ⇒ Hash{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.
371 372 373 374 375 376 377 378 |
# File 'lib/tree_haver/backends/markly.rb', line 371 def source_position { start_line: start_line, end_line: end_line, start_column: start_point.column, end_column: end_point.column, } end |
#start_byte ⇒ Object
Position information Markly provides source_position as a hash with :start_line, :start_column, :end_line, :end_column (1-based)
321 322 323 324 325 326 |
# File 'lib/tree_haver/backends/markly.rb', line 321 def start_byte pos = inner_source_position line = pos[:start_line] - 1 col = pos[:start_column] - 1 calculate_byte_offset(line, col) end |
#start_line ⇒ Integer
Get the 1-based line number where this node starts
Markly provides 1-based line numbers via source_position hash.
354 355 356 |
# File 'lib/tree_haver/backends/markly.rb', line 354 def start_line inner_source_position[:start_line] end |
#start_point ⇒ Object
335 336 337 338 339 340 |
# File 'lib/tree_haver/backends/markly.rb', line 335 def start_point pos = inner_source_position line = pos[:start_line] - 1 col = pos[:start_column] - 1 Point.new(line, col) end |
#text ⇒ String
Get the text content of this node
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 |
# File 'lib/tree_haver/backends/markly.rb', line 266 def text # Markly nodes have string_content for leaf nodes if @inner_node.respond_to?(:string_content) @inner_node.string_content.to_s elsif @inner_node.respond_to?(:to_plaintext) # For container nodes, use to_plaintext or concatenate begin @inner_node.to_plaintext rescue children.map(&:text).join end else children.map(&:text).join end end |
#title ⇒ String?
Get title for links/images
482 483 484 485 486 |
# File 'lib/tree_haver/backends/markly.rb', line 482 def title @inner_node.title rescue nil end |
#to_commonmark ⇒ String
Convert node to CommonMark format
Delegates to the inner Markly node’s to_commonmark method.
417 418 419 |
# File 'lib/tree_haver/backends/markly.rb', line 417 def to_commonmark @inner_node.to_commonmark end |
#to_html ⇒ String
Convert node to HTML
Delegates to the inner Markly node’s to_html method.
444 445 446 |
# File 'lib/tree_haver/backends/markly.rb', line 444 def to_html @inner_node.to_html end |
#to_markdown ⇒ String
Convert node to Markdown format
Delegates to the inner Markly node’s to_markdown method.
426 427 428 |
# File 'lib/tree_haver/backends/markly.rb', line 426 def to_markdown @inner_node.to_markdown end |
#to_plaintext ⇒ String
Convert node to plain text
Delegates to the inner Markly node’s to_plaintext method.
435 436 437 |
# File 'lib/tree_haver/backends/markly.rb', line 435 def to_plaintext @inner_node.to_plaintext end |
#type ⇒ String Also known as: kind
Get the node type as a string
Normalizes Markly types to canonical names for consistency.
250 251 252 253 |
# File 'lib/tree_haver/backends/markly.rb', line 250 def type raw_type = @inner_node.type.to_s TYPE_MAP[raw_type.to_sym]&.to_s || raw_type end |
#url ⇒ String?
Get URL for links/images
474 475 476 477 478 |
# File 'lib/tree_haver/backends/markly.rb', line 474 def url @inner_node.url rescue nil end |