Class: Marko::TreeNode

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Enumerable
Defined in:
lib/marko/tree_node.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(title = '', body = '', **meta) ⇒ TreeNode

Returns a new instance of TreeNode.



29
30
31
32
33
34
35
# File 'lib/marko/tree_node.rb', line 29

def initialize(title = '', body = '', **meta)
  @parent, @items = nil, []
  @title = MustbeString.(title, :title)
  @body = MustbeString.(body, :body)
  @meta = meta
  @meta[:id] = '' unless @meta[:id]
end

Instance Attribute Details

#bodyObject (readonly)

Returns the value of attribute body.



21
22
23
# File 'lib/marko/tree_node.rb', line 21

def body
  @body
end

#metaObject (readonly)

Returns the value of attribute meta.



20
21
22
# File 'lib/marko/tree_node.rb', line 20

def meta
  @meta
end

#parentObject

Returns the value of attribute parent.



18
19
20
# File 'lib/marko/tree_node.rb', line 18

def parent
  @parent
end

#titleObject (readonly)

Returns the value of attribute title.



19
20
21
# File 'lib/marko/tree_node.rb', line 19

def title
  @title
end

Instance Method Details

#<<(node) ⇒ Object



37
38
39
40
41
42
# File 'lib/marko/tree_node.rb', line 37

def <<(node)
  MustbeTreeNode.(node)
  node.parent = self
  @items << node
  node
end

#belongs_to?(ref) ⇒ Boolean

Returns:

  • (Boolean)


87
88
89
90
91
# File 'lib/marko/tree_node.rb', line 87

def belongs_to?(ref)
  node = self.parent
  node = node.parent while node && node.id != ref
  node&.id == ref
end

#each {|_self| ... } ⇒ Object

see Enumerable#each

Yields:

  • (_self)

Yield Parameters:



45
46
47
48
49
# File 'lib/marko/tree_node.rb', line 45

def each(&block)
  return to_enum(__callee__) unless block_given?
  yield(self)
  items.each{|n| n.each(&block) }
end

#find_item(ref) ⇒ Object



65
66
67
# File 'lib/marko/tree_node.rb', line 65

def find_item(ref)
  @items.find{|n| n.id == ref || n.id.end_with?(ref)}
end

#find_node(ref) ⇒ Object



69
70
71
72
# File 'lib/marko/tree_node.rb', line 69

def find_node(ref)
  return find_item(ref) if ref.start_with?(?.)
  root.find{|n| n.id == ref}
end

#idObject



59
60
61
62
63
# File 'lib/marko/tree_node.rb', line 59

def id
  val = @meta.fetch(:id, '')
  return val unless @parent
  val.start_with?('.') ? @parent.id + val : val
end

#itemsArray<Node>

Returns ordered list of child nodes.

Returns:

  • (Array<Node>)

    ordered list of child nodes



75
76
77
78
79
80
81
82
83
84
85
# File 'lib/marko/tree_node.rb', line 75

def items
  return @items unless order_index.any?
  [].tap do |ary|
    src = Array.new(@items)
    order_index.each do |i|
      node = find_item(i)
      ary << src.delete(node) if node
    end
    ary.concat(src)
  end
end

Returns macro links in the node #body IT IS RATHER MACRO FOR WRITER SO TI SHOULD BE PROCESSED APPROPRIATELY.

Returns:

  • (Array<String>)

    macro links in the node #body IT IS RATHER MACRO FOR WRITER SO TI SHOULD BE PROCESSED APPROPRIATELY



110
111
112
113
# File 'lib/marko/tree_node.rb', line 110

def links
  return [] if @body.empty?
  @body.scan(/\[\[([\w\.]*)\]\]/).flatten.uniq
end

#nesting_levelInteger

Returns the node level in the node hierarchy.

Returns:

  • (Integer)

    the node level in the node hierarchy



105
106
107
# File 'lib/marko/tree_node.rb', line 105

def nesting_level
  @parent.nil? ? 0 : @parent.nesting_level + 1
end

#order_indexArray<String>

Returns:

  • (Array<String>)


52
53
54
55
56
57
# File 'lib/marko/tree_node.rb', line 52

def order_index
  @meta
    .fetch(:order_index, '')
    .strip
    .split(/\s{1,}/)
end

#orphan!Object



115
116
117
118
119
# File 'lib/marko/tree_node.rb', line 115

def orphan!
  return unless @parent
  @parent.delete_item(self)
  @parent = nil
end

#rootNode

Returns the root node in the node hierarchy.

Returns:

  • (Node)

    the root node in the node hierarchy



94
95
96
97
98
# File 'lib/marko/tree_node.rb', line 94

def root
  n = self
  n = n.parent while n.parent
  n
end

#root?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/marko/tree_node.rb', line 100

def root?
  self == root
end