Module: Brief::Document::SourceMap

Included in:
Brief::Document
Defined in:
lib/brief/document/source_map.rb

Instance Method Summary collapse

Instance Method Details

#content_under_heading(heading_element, include_heading = true) ⇒ Object



62
63
64
65
66
# File 'lib/brief/document/source_map.rb', line 62

def content_under_heading(heading_element, include_heading=true)
  start_index, end_index = line_numbers_for_heading(heading_element, include_heading)
  lines = raw_content.lines.dup.slice(start_index - 1, end_index)
  Array(include_heading ? lines : lines.slice(1, lines.length)).join("")
end

#heading_detailsObject



10
11
12
13
14
15
# File 'lib/brief/document/source_map.rb', line 10

def heading_details
  @heading_details ||= structure.get_heading_details.tap do |list|
    list.map! {|i| i.line_number = i.line_number.to_i; i.level = i.level.to_i; i }
    list.sort_by! {|i| i.line_number }
  end
end

#heading_element_tagsObject



6
7
8
# File 'lib/brief/document/source_map.rb', line 6

def heading_element_tags
  css('h1,h2,h4,h5,h6')
end

#heading_line_numbersObject



2
3
4
# File 'lib/brief/document/source_map.rb', line 2

def heading_line_numbers
  heading_element_tags.map {|el| el.attr('data-line-number') }
end

#line_numbers_for_heading(heading_element, include_heading = true) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/brief/document/source_map.rb', line 34

def line_numbers_for_heading(heading_element, include_heading=true)
  if heading_element.nil?
    binding.pry
  end
  if heading_element.is_a?(String) && heading_element.length > 1
    heading_element = heading_element_tags.find do |el|
      el.attr('data-heading').include?(heading_element.strip.downcase) || el.text.to_s.strip.downcase.include?(heading_element.strip.downcase)
    end
  end

  if heading_element.nil?
    binding.pry
  end

  start_index = heading_element.attr('data-line-number').to_i

  if next_heading = next_sibling_heading_for(heading_element)
    end_index = next_heading.attr('data-line-number').to_i
  else
    end_index = raw_content.lines.length + 1
  end

  end_index = end_index - start_index
  start_index = 0 if start_index < 0

  [start_index, end_index]
end

#next_sibling_heading_for(heading_element) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/brief/document/source_map.rb', line 17

def next_sibling_heading_for(heading_element)
  if heading_element.is_a?(String) && heading_element.length > 1
    heading_element = heading_element_tags.find do |el|
      el.attr('data-heading').include?(heading_element) || el.text.to_s.include?(heading_element)
    end
  end

  line  = heading_element.attr('data-line-number').to_i
  level = heading_element.attr('data-level').to_i

  superior = heading_details.find do |next_element|
    next_element.line_number.to_i > line && next_element.level.to_i >= level
  end

  superior && superior.element
end