Class: TreeHaver::Backends::Commonmarker::Node
- Inherits:
-
Object
- Object
- TreeHaver::Backends::Commonmarker::Node
- 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
-
#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 ⇒ Object
- #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.
- #inspect ⇒ Object
- #missing? ⇒ Boolean
- #named? ⇒ Boolean (also: #structural?)
-
#next_sibling ⇒ Node?
Get the next sibling.
-
#parent ⇒ Node?
Get the parent node.
-
#prev_sibling ⇒ Node?
Get the previous sibling.
-
#source_position ⇒ Hash{Symbol => Integer}
Get position information as a hash.
-
#start_byte ⇒ Object
Position information Commonmarker 2.x provides source_position as a hash with start_line, start_column, end_line, end_column.
- #start_line ⇒ Object
- #start_point ⇒ Object
-
#text ⇒ String
Get the text content of this node.
-
#title ⇒ String?
Get title for links/images.
-
#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.
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_node ⇒ Object (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 |
#source ⇒ Object (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_count ⇒ Object
261 262 263 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 261 def child_count children.size end |
#children ⇒ Array<Node>
Get 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_byte ⇒ Object
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_line ⇒ Object
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_point ⇒ Object
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_info ⇒ String?
Get fence info for code blocks
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_child ⇒ Node?
Get the first child node
374 375 376 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 374 def first_child children.first end |
#has_error? ⇒ Boolean
384 385 386 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 384 def has_error? false end |
#header_level ⇒ Integer?
Get heading level (1-6)
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 |
#inspect ⇒ Object
399 400 401 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 399 def inspect "#<TreeHaver::Backends::Commonmarker::Node type=#{type}>" end |
#missing? ⇒ Boolean
388 389 390 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 388 def missing? false end |
#named? ⇒ Boolean Also known as: structural?
378 379 380 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 378 def named? true end |
#next_sibling ⇒ Node?
Get the next sibling
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 |
#parent ⇒ Node?
Get the parent node
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_sibling ⇒ Node?
Get the previous sibling
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_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.
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_byte ⇒ Object
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_line ⇒ Object
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_point ⇒ Object
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 |
#text ⇒ String
Get the text content of this node
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 |
#title ⇒ String?
Get title for links/images
437 438 439 440 441 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 437 def title @inner_node.title rescue nil end |
#type ⇒ String Also known as: kind
Get the node type as a string
Commonmarker uses symbols like :document, :heading, :paragraph, etc.
220 221 222 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 220 def type @inner_node.type.to_s end |
#url ⇒ String?
Get URL for links/images
429 430 431 432 433 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 429 def url @inner_node.url rescue nil end |