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.
185 186 187 188 189 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 185 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.
183 184 185 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 183 def inner_node @inner_node end |
#source ⇒ Object (readonly)
Returns the value of attribute source.
183 184 185 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 183 def source @source end |
Instance Method Details
#<=>(other) ⇒ Object
368 369 370 371 372 373 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 368 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
241 242 243 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 241 def child(index) children[index] end |
#child_count ⇒ Object
237 238 239 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 237 def child_count children.size end |
#children ⇒ Array<Node>
Get child nodes
224 225 226 227 228 229 230 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 224 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
232 233 234 235 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 232 def each(&block) return to_enum(__method__) unless block children.each(&block) end |
#end_byte ⇒ Object
253 254 255 256 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 253 def end_byte ep = end_point calculate_byte_offset(ep.row, ep.column) end |
#end_line ⇒ Object
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 315 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
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 278 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
394 395 396 397 398 399 400 401 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 394 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
350 351 352 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 350 def first_child children.first end |
#has_error? ⇒ Boolean
360 361 362 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 360 def has_error? false end |
#header_level ⇒ Integer?
Get heading level (1-6)
383 384 385 386 387 388 389 390 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 383 def header_level return unless type == "heading" begin @inner_node.header_level rescue nil end end |
#inspect ⇒ Object
375 376 377 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 375 def inspect "#<TreeHaver::Backends::Commonmarker::Node type=#{type}>" end |
#missing? ⇒ Boolean
364 365 366 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 364 def missing? false end |
#named? ⇒ Boolean Also known as: structural?
354 355 356 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 354 def named? true end |
#next_sibling ⇒ Node?
Get the next sibling
421 422 423 424 425 426 427 428 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 421 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
443 444 445 446 447 448 449 450 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 443 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
432 433 434 435 436 437 438 439 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 432 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.
338 339 340 341 342 343 344 345 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 338 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
248 249 250 251 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 248 def start_byte sp = start_point calculate_byte_offset(sp.row, sp.column) end |
#start_line ⇒ Object
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 298 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
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 258 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
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 205 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
413 414 415 416 417 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 413 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.
196 197 198 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 196 def type @inner_node.type.to_s end |
#url ⇒ String?
Get URL for links/images
405 406 407 408 409 |
# File 'lib/tree_haver/backends/commonmarker.rb', line 405 def url @inner_node.url rescue nil end |