Almirah 0.2.4 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/bin/almirah +4 -4
  3. data/lib/almirah/doc_fabric.rb +65 -65
  4. data/lib/almirah/doc_items/blockquote.rb +21 -21
  5. data/lib/almirah/doc_items/code_block.rb +26 -26
  6. data/lib/almirah/doc_items/controlled_paragraph.rb +112 -112
  7. data/lib/almirah/doc_items/controlled_table.rb +224 -224
  8. data/lib/almirah/doc_items/controlled_table_row.rb +22 -22
  9. data/lib/almirah/doc_items/doc_footer.rb +16 -16
  10. data/lib/almirah/doc_items/doc_item.rb +22 -20
  11. data/lib/almirah/doc_items/frontmatter.rb +9 -0
  12. data/lib/almirah/doc_items/heading.rb +93 -93
  13. data/lib/almirah/doc_items/image.rb +27 -27
  14. data/lib/almirah/doc_items/markdown_list.rb +156 -158
  15. data/lib/almirah/doc_items/markdown_table.rb +61 -63
  16. data/lib/almirah/doc_items/paragraph.rb +25 -27
  17. data/lib/almirah/doc_items/text_line.rb +296 -296
  18. data/lib/almirah/doc_items/todo_block.rb +21 -21
  19. data/lib/almirah/doc_parser.rb +378 -330
  20. data/lib/almirah/doc_types/base_document.rb +64 -70
  21. data/lib/almirah/doc_types/coverage.rb +95 -81
  22. data/lib/almirah/doc_types/index.rb +173 -169
  23. data/lib/almirah/doc_types/persistent_document.rb +17 -20
  24. data/lib/almirah/doc_types/protocol.rb +24 -24
  25. data/lib/almirah/doc_types/specification.rb +67 -67
  26. data/lib/almirah/doc_types/traceability.rb +142 -142
  27. data/lib/almirah/dom/doc_section.rb +25 -25
  28. data/lib/almirah/dom/document.rb +78 -72
  29. data/lib/almirah/navigation_pane.rb +16 -16
  30. data/lib/almirah/project.rb +287 -306
  31. data/lib/almirah/project_configuration.rb +41 -41
  32. data/lib/almirah/project_template.rb +298 -0
  33. data/lib/almirah/project_utility.rb +52 -0
  34. data/lib/almirah/search/specifications_db.rb +79 -83
  35. data/lib/almirah/templates/css/main.css +300 -300
  36. data/lib/almirah/templates/css/search.css +40 -40
  37. data/lib/almirah/templates/page.html +42 -42
  38. data/lib/almirah/templates/scripts/main.js +111 -111
  39. data/lib/almirah/templates/scripts/orama_search.js +138 -138
  40. data/lib/almirah.rb +93 -49
  41. metadata +28 -5
@@ -1,93 +1,93 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'paragraph'
4
-
5
- class Heading < Paragraph
6
- attr_accessor :level, :anchor_id, :section_number
7
-
8
- @@global_section_number = ''
9
-
10
- def initialize(doc, text, level)
11
- super(doc, text)
12
- @level = level
13
-
14
- if level != 0 # skip Doc Title
15
- if @@global_section_number == ''
16
- @@global_section_number = '1'
17
- (1..(level - 1)).each do |_n|
18
- @@global_section_number += '.1'
19
- end
20
- else
21
- previous_level = @@global_section_number.split('.').length
22
-
23
- if previous_level == level
24
-
25
- a = @@global_section_number.split('.')
26
- a[-1] = (a[-1].to_i + 1).to_s
27
- @@global_section_number = a.join('.')
28
-
29
- elsif level > previous_level
30
-
31
- a = @@global_section_number.split('.')
32
- a.push('1')
33
- @@global_section_number = a.join('.')
34
-
35
- else # level < previous_level
36
-
37
- a = @@global_section_number.split('.')
38
- delta = previous_level - level
39
- a.pop(delta)
40
- @@global_section_number = a.join('.')
41
- # increment
42
- a = @@global_section_number.split('.')
43
- a[-1] = (a[-1].to_i + 1).to_s
44
- @@global_section_number = a.join('.')
45
- end
46
- end
47
- end
48
- @section_number = @@global_section_number
49
- @anchor_id = get_anchor_text
50
- end
51
-
52
- def get_section_info
53
- if level.zero? # Doc Title
54
- @text
55
- else
56
- "#{@section_number} #{@text}"
57
- end
58
- end
59
-
60
- def get_anchor_text
61
- "#{@section_number}-#{getTextWithoutSpaces}"
62
- end
63
-
64
- def get_markdown_anchor_text
65
- getTextWithoutSpaces
66
- end
67
-
68
- def to_html
69
- s = ''
70
- if @@html_table_render_in_progress
71
- s += "</table>\n"
72
- @@html_table_render_in_progress = false
73
- end
74
- heading_level = level.to_s
75
- heading_text = get_section_info
76
- if level.zero?
77
- heading_level = 1.to_s # Render Doc Title as a regular h1
78
- heading_text = @text # Doc Title does not have a section number
79
- end
80
- s += "<a name=\"#{@anchor_id}\"></a>\n"
81
- s += "<h#{heading_level}> #{heading_text} <a href=\"\##{@anchor_id}\" class=\"heading_anchor\">"
82
- s += "&para;</a></h#{heading_level}>"
83
- s
84
- end
85
-
86
- def get_url
87
- "./specifications/#{parent_doc.id}/#{parent_doc.id}.html\##{@anchor_id}"
88
- end
89
-
90
- def self.reset_global_section_number
91
- @@global_section_number = ''
92
- end
93
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'paragraph'
4
+
5
+ class Heading < Paragraph
6
+ attr_accessor :level, :anchor_id, :section_number
7
+
8
+ @@global_section_number = ''
9
+
10
+ def initialize(doc, text, level)
11
+ super(doc, text)
12
+ @level = level
13
+
14
+ if level != 0 # skip Doc Title
15
+ if @@global_section_number == ''
16
+ @@global_section_number = '1'
17
+ (1..(level - 1)).each do |_n|
18
+ @@global_section_number += '.1'
19
+ end
20
+ else
21
+ previous_level = @@global_section_number.split('.').length
22
+
23
+ if previous_level == level
24
+
25
+ a = @@global_section_number.split('.')
26
+ a[-1] = (a[-1].to_i + 1).to_s
27
+ @@global_section_number = a.join('.')
28
+
29
+ elsif level > previous_level
30
+
31
+ a = @@global_section_number.split('.')
32
+ a.push('1')
33
+ @@global_section_number = a.join('.')
34
+
35
+ else # level < previous_level
36
+
37
+ a = @@global_section_number.split('.')
38
+ delta = previous_level - level
39
+ a.pop(delta)
40
+ @@global_section_number = a.join('.')
41
+ # increment
42
+ a = @@global_section_number.split('.')
43
+ a[-1] = (a[-1].to_i + 1).to_s
44
+ @@global_section_number = a.join('.')
45
+ end
46
+ end
47
+ end
48
+ @section_number = @@global_section_number
49
+ @anchor_id = get_anchor_text
50
+ end
51
+
52
+ def get_section_info
53
+ if level.zero? # Doc Title
54
+ @text
55
+ else
56
+ "#{@section_number} #{@text}"
57
+ end
58
+ end
59
+
60
+ def get_anchor_text
61
+ "#{@section_number}-#{getTextWithoutSpaces}"
62
+ end
63
+
64
+ def get_markdown_anchor_text
65
+ getTextWithoutSpaces
66
+ end
67
+
68
+ def to_html
69
+ s = ''
70
+ if @@html_table_render_in_progress
71
+ s += "</table>\n"
72
+ @@html_table_render_in_progress = false
73
+ end
74
+ heading_level = level.to_s
75
+ heading_text = get_section_info
76
+ if level.zero?
77
+ heading_level = 1.to_s # Render Doc Title as a regular h1
78
+ heading_text = @text # Doc Title does not have a section number
79
+ end
80
+ s += "<a name=\"#{@anchor_id}\"></a>\n"
81
+ s += "<h#{heading_level}> #{heading_text} <a href=\"\##{@anchor_id}\" class=\"heading_anchor\">"
82
+ s += "&para;</a></h#{heading_level}>"
83
+ s
84
+ end
85
+
86
+ def get_url
87
+ "./specifications/#{parent_doc.id}/#{parent_doc.id}.html\##{@anchor_id}"
88
+ end
89
+
90
+ def self.reset_global_section_number
91
+ @@global_section_number = ''
92
+ end
93
+ end
@@ -1,28 +1,28 @@
1
- require_relative "doc_item"
2
-
3
- class Image < DocItem
4
-
5
- attr_accessor :text
6
- attr_accessor :path
7
-
8
- def initialize(text, path)
9
- @text = text
10
- @path = path
11
- end
12
-
13
- def getTextWithoutSpaces
14
- return @text.split.join('-')
15
- end
16
-
17
- def to_html
18
- s = ''
19
- if @@html_table_render_in_progress
20
- s += "</table>\n"
21
- @@html_table_render_in_progress = false
22
- end
23
-
24
- s += "<p style=\"margin-top: 15px;\"><img src=\"#{@path}\" alt=\"#{@text}\" "
25
- s += "href=\"javascript:void(0)\" onclick=\"image_OnClick(this)\">"
26
- return s
27
- end
1
+ require_relative "doc_item"
2
+
3
+ class Image < DocItem
4
+
5
+ attr_accessor :text
6
+ attr_accessor :path
7
+
8
+ def initialize(text, path)
9
+ @text = text
10
+ @path = path
11
+ end
12
+
13
+ def getTextWithoutSpaces
14
+ return @text.split.join('-')
15
+ end
16
+
17
+ def to_html
18
+ s = ''
19
+ if @@html_table_render_in_progress
20
+ s += "</table>\n"
21
+ @@html_table_render_in_progress = false
22
+ end
23
+
24
+ s += "<p style=\"margin-top: 15px;\"><img src=\"#{@path}\" alt=\"#{@text}\" "
25
+ s += "href=\"javascript:void(0)\" onclick=\"image_OnClick(this)\">"
26
+ return s
27
+ end
28
28
  end
@@ -1,158 +1,156 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'doc_item'
4
-
5
- class MarkdownList < DocItem
6
- attr_accessor :rows, :text, :is_ordered, :indent_position, :current_nesting_level
7
-
8
- @@lists_stack = []
9
-
10
- def initialize(doc, is_ordered)
11
- super()
12
- @parent_doc = doc
13
- @parent_heading = doc.headings[-1]
14
-
15
- @rows = []
16
- @is_ordered = is_ordered
17
- @current_nesting_level = 0
18
- @indent_position = 0
19
- @text = ''
20
-
21
- @@lists_stack.push(self)
22
- end
23
-
24
- def add_row(raw_text)
25
- pos = calculate_text_position(raw_text)
26
- row = raw_text[pos..-1]
27
-
28
- pos = calculate_indent_position(raw_text)
29
-
30
- if pos > @@lists_stack[-1].indent_position
31
-
32
- prev_lists_stack_item = @@lists_stack[-1]
33
- # the following line pushes new list to the lists_stack in the constructor!
34
- nested_list = MarkdownList.new(@parent_doc, MarkdownList.ordered_list_item?(raw_text))
35
- nested_list.current_nesting_level = @current_nesting_level + 1
36
- nested_list.indent_position = pos
37
-
38
- prev_row = prev_lists_stack_item.rows[-1]
39
- if prev_row.is_a?(MarkdownList)
40
- # cannot be there
41
- else
42
- nested_list.text = prev_row
43
- # puts "Length: " + prev_lists_stack_item.rows.length.to_s
44
- prev_lists_stack_item.rows[-1] = nested_list
45
- end
46
-
47
- nested_list.add_row(raw_text)
48
-
49
- elsif pos < @@lists_stack[-1].indent_position
50
-
51
- @@lists_stack.pop while pos < @@lists_stack[-1].indent_position
52
- @@lists_stack[-1].rows.append(row)
53
-
54
- else
55
- @@lists_stack[-1].rows.append(row)
56
-
57
- end
58
- end
59
-
60
- def calculate_indent_position(s)
61
- s.downcase
62
- pos = 0
63
- s.each_char do |c|
64
- break if c != ' ' && c != '\t'
65
-
66
- pos += 1
67
- end
68
- pos
69
- end
70
-
71
- def calculate_text_position(s)
72
- s.downcase
73
- pos = 0
74
- state = 'looking_for_list_item_marker'
75
- s.each_char do |c|
76
- case state
77
- when 'looking_for_list_item_marker'
78
- if c == '*'
79
- state = 'looking_for_space'
80
- elsif numeric?(c)
81
- state = 'looking_for_dot'
82
- end
83
- when 'looking_for_dot'
84
- state = 'looking_for_space' if c == '.'
85
- when 'looking_for_space'
86
- state = 'looking_for_non_space' if [' ', '\t'].include?(c)
87
- when 'looking_for_non_space'
88
- if c != ' ' || c != '\t'
89
- state = 'list_item_text_pos_found'
90
- break
91
- end
92
- end
93
- pos += 1
94
- end
95
- pos
96
- end
97
-
98
- def letter?(c)
99
- c.match?(/[[:alpha:]]/)
100
- end
101
-
102
- def numeric?(c)
103
- c.match?(/[[:digit:]]/)
104
- end
105
-
106
- def non_blank?(c)
107
- c.match?(/[[:graph:]]/)
108
- end
109
-
110
- def self.unordered_list_item?(raw_text)
111
- res = /(\*\s?)(.*)/.match(raw_text)
112
- return true if res
113
-
114
- false
115
- end
116
-
117
- def self.ordered_list_item?(raw_text)
118
- res = /\d[.]\s(.*)/.match(raw_text)
119
- return true if res
120
-
121
- false
122
- end
123
-
124
- def to_html
125
- s = ''
126
- if @@html_table_render_in_progress
127
- s += "</table>\n"
128
- @@html_table_render_in_progress = false
129
- end
130
-
131
- s += if @is_ordered
132
- "<ol>\n"
133
- else
134
- "<ul>\n"
135
- end
136
-
137
- @rows.each do |r|
138
- if r.is_a?(MarkdownList)
139
- f_text = format_string(r.text)
140
- s += "\t<li>#{f_text}\n"
141
- s += r.to_html
142
- s += "</li>\n"
143
- else
144
- f_text = format_string(r)
145
- # puts f_text
146
- s += "\t<li>#{f_text}</li>\n"
147
- end
148
- end
149
-
150
- s += if @is_ordered
151
- "</ol>\n"
152
- else
153
- "</ul>\n"
154
- end
155
-
156
- s
157
- end
158
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'doc_item'
4
+
5
+ class MarkdownList < DocItem
6
+ attr_accessor :rows, :text, :is_ordered, :indent_position, :current_nesting_level
7
+
8
+ @@lists_stack = []
9
+
10
+ def initialize(doc, is_ordered)
11
+ super(doc)
12
+
13
+ @rows = []
14
+ @is_ordered = is_ordered
15
+ @current_nesting_level = 0
16
+ @indent_position = 0
17
+ @text = ''
18
+
19
+ @@lists_stack.push(self)
20
+ end
21
+
22
+ def add_row(raw_text)
23
+ pos = calculate_text_position(raw_text)
24
+ row = raw_text[pos..-1]
25
+
26
+ pos = calculate_indent_position(raw_text)
27
+
28
+ if pos > @@lists_stack[-1].indent_position
29
+
30
+ prev_lists_stack_item = @@lists_stack[-1]
31
+ # the following line pushes new list to the lists_stack in the constructor!
32
+ nested_list = MarkdownList.new(@parent_doc, MarkdownList.ordered_list_item?(raw_text))
33
+ nested_list.current_nesting_level = @current_nesting_level + 1
34
+ nested_list.indent_position = pos
35
+
36
+ prev_row = prev_lists_stack_item.rows[-1]
37
+ if prev_row.is_a?(MarkdownList)
38
+ # cannot be there
39
+ else
40
+ nested_list.text = prev_row
41
+ # puts "Length: " + prev_lists_stack_item.rows.length.to_s
42
+ prev_lists_stack_item.rows[-1] = nested_list
43
+ end
44
+
45
+ nested_list.add_row(raw_text)
46
+
47
+ elsif pos < @@lists_stack[-1].indent_position
48
+
49
+ @@lists_stack.pop while pos < @@lists_stack[-1].indent_position
50
+ @@lists_stack[-1].rows.append(row)
51
+
52
+ else
53
+ @@lists_stack[-1].rows.append(row)
54
+
55
+ end
56
+ end
57
+
58
+ def calculate_indent_position(s)
59
+ s.downcase
60
+ pos = 0
61
+ s.each_char do |c|
62
+ break if c != ' ' && c != '\t'
63
+
64
+ pos += 1
65
+ end
66
+ pos
67
+ end
68
+
69
+ def calculate_text_position(s)
70
+ s.downcase
71
+ pos = 0
72
+ state = 'looking_for_list_item_marker'
73
+ s.each_char do |c|
74
+ case state
75
+ when 'looking_for_list_item_marker'
76
+ if c == '*'
77
+ state = 'looking_for_space'
78
+ elsif numeric?(c)
79
+ state = 'looking_for_dot'
80
+ end
81
+ when 'looking_for_dot'
82
+ state = 'looking_for_space' if c == '.'
83
+ when 'looking_for_space'
84
+ state = 'looking_for_non_space' if [' ', '\t'].include?(c)
85
+ when 'looking_for_non_space'
86
+ if c != ' ' || c != '\t'
87
+ state = 'list_item_text_pos_found'
88
+ break
89
+ end
90
+ end
91
+ pos += 1
92
+ end
93
+ pos
94
+ end
95
+
96
+ def letter?(c)
97
+ c.match?(/[[:alpha:]]/)
98
+ end
99
+
100
+ def numeric?(c)
101
+ c.match?(/[[:digit:]]/)
102
+ end
103
+
104
+ def non_blank?(c)
105
+ c.match?(/[[:graph:]]/)
106
+ end
107
+
108
+ def self.unordered_list_item?(raw_text)
109
+ res = /(\*\s?)(.*)/.match(raw_text)
110
+ return true if res
111
+
112
+ false
113
+ end
114
+
115
+ def self.ordered_list_item?(raw_text)
116
+ res = /\d[.]\s(.*)/.match(raw_text)
117
+ return true if res
118
+
119
+ false
120
+ end
121
+
122
+ def to_html
123
+ s = ''
124
+ if @@html_table_render_in_progress
125
+ s += "</table>\n"
126
+ @@html_table_render_in_progress = false
127
+ end
128
+
129
+ s += if @is_ordered
130
+ "<ol>\n"
131
+ else
132
+ "<ul>\n"
133
+ end
134
+
135
+ @rows.each do |r|
136
+ if r.is_a?(MarkdownList)
137
+ f_text = format_string(r.text)
138
+ s += "\t<li>#{f_text}\n"
139
+ s += r.to_html
140
+ s += "</li>\n"
141
+ else
142
+ f_text = format_string(r)
143
+ # puts f_text
144
+ s += "\t<li>#{f_text}</li>\n"
145
+ end
146
+ end
147
+
148
+ s += if @is_ordered
149
+ "</ol>\n"
150
+ else
151
+ "</ul>\n"
152
+ end
153
+
154
+ s
155
+ end
156
+ end