Almirah 0.2.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/almirah/doc_items/blockquote.rb +2 -2
- data/lib/almirah/doc_items/code_block.rb +2 -2
- data/lib/almirah/doc_items/controlled_paragraph.rb +11 -11
- data/lib/almirah/doc_items/controlled_table.rb +8 -4
- data/lib/almirah/doc_items/doc_footer.rb +2 -2
- data/lib/almirah/doc_items/doc_item.rb +1 -1
- data/lib/almirah/doc_items/heading.rb +80 -85
- data/lib/almirah/doc_items/image.rb +2 -2
- data/lib/almirah/doc_items/markdown_list.rb +134 -143
- data/lib/almirah/doc_items/markdown_table.rb +52 -48
- data/lib/almirah/doc_items/paragraph.rb +5 -3
- data/lib/almirah/doc_items/text_line.rb +247 -264
- data/lib/almirah/doc_items/todo_block.rb +2 -2
- data/lib/almirah/doc_parser.rb +50 -54
- data/lib/almirah/doc_types/index.rb +17 -17
- data/lib/almirah/doc_types/specification.rb +56 -93
- data/lib/almirah/dom/doc_section.rb +1 -1
- data/lib/almirah/search/specifications_db.rb +18 -1
- data/lib/almirah/templates/css/main.css +5 -2
- data/lib/almirah/templates/page.html +3 -1
- data/lib/almirah/templates/scripts/main.js +20 -3
- data/lib/almirah/templates/scripts/orama_search.js +3 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34b91589658288fe6c451f14cbb14601ac2c4d083e28b4495aef3f1bb1edcd34
|
4
|
+
data.tar.gz: 3d834bb51eb285b7acac6b7c44090bab14c40d0d2e64b4743c5867b41375c0ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48e6c007534e2af97110faa435a2596fdd772c2a0acc8cc4980432cdc7c9d99b517f13a9460a05d8d5c0a7d3564ebd53249cffcb571f3087dd9cb3317c5c4093
|
7
|
+
data.tar.gz: 22ec1eaef53f7cf629ebd607fc321555f759c33b18510ec0787bdea61918636a985d84d7068ce02f6a81803a6dfe17fdd7250fc7ca8cd75a2fb1f4ed47a99981
|
@@ -11,9 +11,9 @@ class Blockquote < DocItem
|
|
11
11
|
def to_html
|
12
12
|
s = ''
|
13
13
|
f_text = format_string(@text)
|
14
|
-
if @@
|
14
|
+
if @@html_table_render_in_progress
|
15
15
|
s += "</table>\n"
|
16
|
-
@@
|
16
|
+
@@html_table_render_in_progress = false
|
17
17
|
end
|
18
18
|
|
19
19
|
s += "<div class=\"blockquote\"><p>#{f_text}</div>\n"
|
@@ -13,9 +13,9 @@ class CodeBlock < DocItem
|
|
13
13
|
def to_html
|
14
14
|
s = ''
|
15
15
|
|
16
|
-
if @@
|
16
|
+
if @@html_table_render_in_progress
|
17
17
|
s += "</table>\n"
|
18
|
-
@@
|
18
|
+
@@html_table_render_in_progress = false
|
19
19
|
end
|
20
20
|
s += "<code>"
|
21
21
|
@code_lines.each do |l|
|
@@ -19,14 +19,14 @@ class ControlledParagraph < Paragraph
|
|
19
19
|
|
20
20
|
def to_html
|
21
21
|
s = ''
|
22
|
-
unless @@
|
22
|
+
unless @@html_table_render_in_progress
|
23
23
|
s += "<table class=\"controlled\">\n"
|
24
|
-
s += "\t<thead> <th>#</th> <th></th> <th>UL</th> <th>DL</th> <th>COV</th> </thead>\n"
|
25
|
-
@@
|
24
|
+
s += "\t<thead> <th>#</th> <th></th> <th title=\"Up-links\">UL</th> <th title=\"Down-links\">DL</th> <th title=\"Test Coverage\">COV</th> </thead>\n"
|
25
|
+
@@html_table_render_in_progress = true
|
26
26
|
end
|
27
27
|
f_text = format_string(@text)
|
28
28
|
s += "\t<tr>\n"
|
29
|
-
s += "\t\t<td class=\"item_id\"> <a name=\"#{@id}\" id=\"#{@id}\" href=\"##{@id}\">#{@id}</a></td>\n"
|
29
|
+
s += "\t\t<td class=\"item_id\"> <a name=\"#{@id}\" id=\"#{@id}\" href=\"##{@id}\" title=\"Paragraph ID\">#{@id}</a></td>\n"
|
30
30
|
s += "\t\t<td class=\"item_text\">#{f_text}</td>\n"
|
31
31
|
|
32
32
|
if @up_link_ids
|
@@ -34,18 +34,18 @@ class ControlledParagraph < Paragraph
|
|
34
34
|
if tmp = /^([a-zA-Z]+)[-]\d+/.match(@up_link_ids[0])
|
35
35
|
up_link_doc_name = tmp[1].downcase
|
36
36
|
end
|
37
|
-
s += "\t\t<td class=\"item_id\"><a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html##{@up_link_ids[0]}\" class=\"external\">#{@up_link_ids[0]}</a></td>\n"
|
37
|
+
s += "\t\t<td class=\"item_id\"><a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html##{@up_link_ids[0]}\" class=\"external\" title=\"Linked to\">#{@up_link_ids[0]}</a></td>\n"
|
38
38
|
else
|
39
39
|
s += "\t\t<td class=\"item_id\">"
|
40
40
|
s += "<div id=\"DL_#{@id}\" style=\"display: block;\">"
|
41
|
-
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\">#{@up_link_ids.length}</a>"
|
41
|
+
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\" title=\"Number of up-links\">#{@up_link_ids.length}</a>"
|
42
42
|
s += "</div>"
|
43
43
|
s += "<div id=\"DLS_#{@id}\" style=\"display: none;\">"
|
44
44
|
@up_link_ids.each do |lnk|
|
45
45
|
if tmp = /^([a-zA-Z]+)[-]\d+/.match(lnk)
|
46
46
|
up_link_doc_name = tmp[1].downcase
|
47
47
|
end
|
48
|
-
s += "\t\t\t<a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html##{lnk}\" class=\"external\">#{lnk}</a>\n<br>"
|
48
|
+
s += "\t\t\t<a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html##{lnk}\" class=\"external\" title=\"Linked to\">#{lnk}</a>\n<br>"
|
49
49
|
end
|
50
50
|
s += "</div>"
|
51
51
|
s += "</td>\n"
|
@@ -59,15 +59,15 @@ class ControlledParagraph < Paragraph
|
|
59
59
|
down_link_doc_name = tmp[1].downcase
|
60
60
|
end
|
61
61
|
if @down_links.length == 1
|
62
|
-
s += "\t\t<td class=\"item_id\"><a href=\"./../#{down_link_doc_name}/#{down_link_doc_name}.html##{@down_links[0].id}\" class=\"external\">#{@down_links[0].id}</a></td>\n"
|
62
|
+
s += "\t\t<td class=\"item_id\"><a href=\"./../#{down_link_doc_name}/#{down_link_doc_name}.html##{@down_links[0].id}\" class=\"external\" title=\"Referenced in\">#{@down_links[0].id}</a></td>\n"
|
63
63
|
else
|
64
64
|
s += "\t\t<td class=\"item_id\">"
|
65
65
|
s += "<div id=\"DL_#{@id}\" style=\"display: block;\">"
|
66
|
-
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\">#{@down_links.length}</a>"
|
66
|
+
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\" title=\"Number of references\">#{@down_links.length}</a>"
|
67
67
|
s += "</div>"
|
68
68
|
s += "<div id=\"DLS_#{@id}\" style=\"display: none;\">"
|
69
69
|
@down_links.each do |lnk|
|
70
|
-
s += "\t\t\t<a href=\"./../#{lnk.parent_doc.id}/#{lnk.parent_doc.id}.html##{lnk.id}\" class=\"external\">#{lnk.id}</a>\n<br>"
|
70
|
+
s += "\t\t\t<a href=\"./../#{lnk.parent_doc.id}/#{lnk.parent_doc.id}.html##{lnk.id}\" class=\"external\" title=\"Referenced in\">#{lnk.id}</a>\n<br>"
|
71
71
|
end
|
72
72
|
s += "</div>"
|
73
73
|
s += "</td>\n"
|
@@ -80,7 +80,7 @@ class ControlledParagraph < Paragraph
|
|
80
80
|
if tmp = /^(.+)[.]\d+/.match(@coverage_links[0].id) # guessing that all the links refer to one document
|
81
81
|
cov_link_doc_name = tmp[1].downcase
|
82
82
|
end
|
83
|
-
s += "\t\t<td class=\"item_id\"><a href=\"./../../tests/protocols/#{cov_link_doc_name}/#{cov_link_doc_name}.html\" class=\"external\">#{@coverage_links.length}</a></td>\n"
|
83
|
+
s += "\t\t<td class=\"item_id\"><a href=\"./../../tests/protocols/#{cov_link_doc_name}/#{cov_link_doc_name}.html\" class=\"external\" title=\"Number of verification steps\">#{@coverage_links.length}</a></td>\n"
|
84
84
|
else
|
85
85
|
s += "\t\t<td class=\"item_id\"></td>\n"
|
86
86
|
end
|
@@ -87,10 +87,14 @@ class ControlledTable < DocItem
|
|
87
87
|
|
88
88
|
attr_accessor :column_names
|
89
89
|
attr_accessor :rows
|
90
|
+
attr_accessor :is_separator_detected
|
91
|
+
|
92
|
+
def initialize(doc, markdown_table)
|
93
|
+
@parent_doc = doc
|
94
|
+
@parent_heading = doc.headings[-1]
|
90
95
|
|
91
|
-
def initialize(markdown_table, parent_doc)
|
92
|
-
@parent_doc = parent_doc
|
93
96
|
@column_names = markdown_table.column_names
|
97
|
+
@is_separator_detected = markdown_table.is_separator_detected
|
94
98
|
# copy and re-format existing rows
|
95
99
|
@rows = Array.new
|
96
100
|
|
@@ -151,9 +155,9 @@ class ControlledTable < DocItem
|
|
151
155
|
|
152
156
|
def to_html
|
153
157
|
s = ''
|
154
|
-
if @@
|
158
|
+
if @@html_table_render_in_progress
|
155
159
|
s += "</table>\n"
|
156
|
-
@@
|
160
|
+
@@html_table_render_in_progress = false
|
157
161
|
end
|
158
162
|
|
159
163
|
s += "<table class=\"markdown_table\">\n"
|
@@ -1,98 +1,93 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'paragraph'
|
2
4
|
|
3
5
|
class Heading < Paragraph
|
6
|
+
attr_accessor :level, :anchor_id, :section_number
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def initialize(doc, text, level)
|
12
|
-
@parent_doc = doc
|
13
|
-
@text = text
|
14
|
-
@level = level
|
15
|
-
|
16
|
-
if level != 0 # skip Doc Title
|
17
|
-
if @@global_section_number == ""
|
18
|
-
@@global_section_number = "1"
|
19
|
-
for n in 1..(level-1) do
|
20
|
-
@@global_section_number += ".1"
|
21
|
-
end
|
22
|
-
else
|
23
|
-
previous_level = @@global_section_number.split(".").length
|
24
|
-
|
25
|
-
if previous_level == level
|
26
|
-
|
27
|
-
a = @@global_section_number.split(".")
|
28
|
-
a[-1] = (a[-1].to_i() +1).to_s
|
29
|
-
@@global_section_number = a.join(".")
|
30
|
-
|
31
|
-
elsif level > previous_level
|
32
|
-
|
33
|
-
a = @@global_section_number.split(".")
|
34
|
-
a.push("1")
|
35
|
-
@@global_section_number = a.join(".")
|
36
|
-
|
37
|
-
else # level < previous_level
|
38
|
-
|
39
|
-
a = @@global_section_number.split(".")
|
40
|
-
delta = previous_level - level
|
41
|
-
a.pop(delta)
|
42
|
-
@@global_section_number = a.join(".")
|
43
|
-
# increment
|
44
|
-
a = @@global_section_number.split(".")
|
45
|
-
a[-1] = (a[-1].to_i() +1).to_s
|
46
|
-
@@global_section_number = a.join(".")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
@section_number = @@global_section_number
|
51
|
-
@anchor_id = get_anchor_text()
|
52
|
-
end
|
8
|
+
@@global_section_number = ''
|
9
|
+
|
10
|
+
def initialize(doc, text, level)
|
11
|
+
super(doc, text)
|
12
|
+
@level = level
|
53
13
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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'
|
59
19
|
end
|
60
|
-
|
20
|
+
else
|
21
|
+
previous_level = @@global_section_number.split('.').length
|
61
22
|
|
62
|
-
|
63
|
-
s = @section_number + "-" + getTextWithoutSpaces()
|
64
|
-
end
|
23
|
+
if previous_level == level
|
65
24
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
s += "</table>\n"
|
70
|
-
@@htmlTableRenderInProgress = false
|
71
|
-
end
|
72
|
-
heading_level = level.to_s
|
73
|
-
heading_text = get_section_info()
|
74
|
-
if level == 0
|
75
|
-
heading_level = 1.to_s # Render Doc Title as a regular h1
|
76
|
-
heading_text = @text # Doc Title does not have a section number
|
77
|
-
end
|
78
|
-
s += "<a name=\"#{@anchor_id}\"></a>\n"
|
79
|
-
s += "<h#{heading_level}> #{heading_text} <a href=\"\##{@anchor_id}\" class=\"heading_anchor\">"
|
80
|
-
s += "¶</a></h#{heading_level}>"
|
81
|
-
return s
|
82
|
-
end
|
25
|
+
a = @@global_section_number.split('.')
|
26
|
+
a[-1] = (a[-1].to_i + 1).to_s
|
27
|
+
@@global_section_number = a.join('.')
|
83
28
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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('.')
|
88
45
|
end
|
46
|
+
end
|
89
47
|
end
|
90
|
-
|
91
|
-
|
92
|
-
|
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}"
|
93
57
|
end
|
58
|
+
end
|
94
59
|
|
95
|
-
|
96
|
-
|
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
|
97
79
|
end
|
98
|
-
|
80
|
+
s += "<a name=\"#{@anchor_id}\"></a>\n"
|
81
|
+
s += "<h#{heading_level}> #{heading_text} <a href=\"\##{@anchor_id}\" class=\"heading_anchor\">"
|
82
|
+
s += "¶</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
|
@@ -16,9 +16,9 @@ class Image < DocItem
|
|
16
16
|
|
17
17
|
def to_html
|
18
18
|
s = ''
|
19
|
-
if @@
|
19
|
+
if @@html_table_render_in_progress
|
20
20
|
s += "</table>\n"
|
21
|
-
@@
|
21
|
+
@@html_table_render_in_progress = false
|
22
22
|
end
|
23
23
|
|
24
24
|
s += "<p style=\"margin-top: 15px;\"><img src=\"#{@path}\" alt=\"#{@text}\" "
|
@@ -1,167 +1,158 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'doc_item'
|
2
4
|
|
3
5
|
class MarkdownList < DocItem
|
6
|
+
attr_accessor :rows, :text, :is_ordered, :indent_position, :current_nesting_level
|
4
7
|
|
5
|
-
|
6
|
-
attr_accessor :text
|
7
|
-
attr_accessor :is_ordered
|
8
|
-
attr_accessor :indent_position
|
9
|
-
attr_accessor :current_nesting_level
|
8
|
+
@@lists_stack = []
|
10
9
|
|
11
|
-
|
10
|
+
def initialize(doc, is_ordered)
|
11
|
+
super()
|
12
|
+
@parent_doc = doc
|
13
|
+
@parent_heading = doc.headings[-1]
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
@rows = []
|
16
|
+
@is_ordered = is_ordered
|
17
|
+
@current_nesting_level = 0
|
18
|
+
@indent_position = 0
|
19
|
+
@text = ''
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
@current_nesting_level = 0
|
20
|
-
@indent_position = 0
|
21
|
-
@text = ''
|
21
|
+
@@lists_stack.push(self)
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
24
|
+
def addRow(raw_text)
|
25
|
+
pos = calculate_text_position(raw_text)
|
26
|
+
row = raw_text[pos..-1]
|
25
27
|
|
26
|
-
|
27
|
-
pos = calculate_text_position(raw_text)
|
28
|
-
row = raw_text[pos..-1]
|
29
|
-
|
30
|
-
pos = calculate_indent_position(raw_text)
|
31
|
-
|
32
|
-
if pos > @@lists_stack[-1].indent_position
|
33
|
-
|
34
|
-
prev_lists_stack_item = @@lists_stack[-1]
|
35
|
-
# the following line pushes new list to the lists_stack in the constructor!
|
36
|
-
nested_list = MarkdownList.new( @parent_doc, MarkdownList.ordered_list_item?(raw_text) )
|
37
|
-
nested_list.current_nesting_level = @current_nesting_level + 1
|
38
|
-
nested_list.indent_position = pos
|
39
|
-
|
40
|
-
prev_row = prev_lists_stack_item.rows[-1]
|
41
|
-
if prev_row.is_a?(MarkdownList)
|
42
|
-
#cannot be there
|
43
|
-
else
|
44
|
-
nested_list.text = prev_row
|
45
|
-
#puts "Length: " + prev_lists_stack_item.rows.length.to_s
|
46
|
-
prev_lists_stack_item.rows[-1] = nested_list
|
47
|
-
end
|
48
|
-
|
49
|
-
nested_list.addRow(raw_text)
|
50
|
-
|
51
|
-
elsif pos < @@lists_stack[-1].indent_position
|
52
|
-
|
53
|
-
while pos < @@lists_stack[-1].indent_position
|
54
|
-
@@lists_stack.pop
|
55
|
-
end
|
56
|
-
@@lists_stack[-1].rows.append(row)
|
57
|
-
|
58
|
-
else
|
59
|
-
@@lists_stack[-1].rows.append(row)
|
28
|
+
pos = calculate_indent_position(raw_text)
|
60
29
|
|
61
|
-
|
62
|
-
end
|
30
|
+
if pos > @@lists_stack[-1].indent_position
|
63
31
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
break
|
70
|
-
end
|
71
|
-
pos += 1
|
72
|
-
end
|
73
|
-
return pos
|
74
|
-
end
|
75
|
-
def calculate_text_position(s)
|
76
|
-
s.downcase
|
77
|
-
pos = 0
|
78
|
-
state = 'looking_for_list_item_marker'
|
79
|
-
s.each_char do |c|
|
80
|
-
if state == 'looking_for_list_item_marker'
|
81
|
-
if c == '*'
|
82
|
-
state = 'looking_for_space'
|
83
|
-
elsif numeric?(c)
|
84
|
-
state = 'looking_for_dot'
|
85
|
-
end
|
86
|
-
elsif state == 'looking_for_dot'
|
87
|
-
if c == '.'
|
88
|
-
state = 'looking_for_space'
|
89
|
-
end
|
90
|
-
elsif state == 'looking_for_space'
|
91
|
-
if c == ' ' || c == '\t'
|
92
|
-
state = 'looking_for_non_space'
|
93
|
-
end
|
94
|
-
elsif state == 'looking_for_non_space'
|
95
|
-
if c != ' ' || c != '\t'
|
96
|
-
state = 'list_item_text_pos_found'
|
97
|
-
break
|
98
|
-
end
|
99
|
-
end
|
100
|
-
pos += 1
|
101
|
-
end
|
102
|
-
return pos
|
103
|
-
end
|
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
|
104
37
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
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
|
112
46
|
|
113
|
-
|
114
|
-
c.match?(/[[:graph:]]/)
|
115
|
-
end
|
47
|
+
nested_list.addRow(raw_text)
|
116
48
|
|
117
|
-
|
49
|
+
elsif pos < @@lists_stack[-1].indent_position
|
118
50
|
|
119
|
-
|
120
|
-
|
121
|
-
end
|
122
|
-
return false
|
123
|
-
end
|
51
|
+
@@lists_stack.pop while pos < @@lists_stack[-1].indent_position
|
52
|
+
@@lists_stack[-1].rows.append(row)
|
124
53
|
|
125
|
-
|
54
|
+
else
|
55
|
+
@@lists_stack[-1].rows.append(row)
|
126
56
|
|
127
|
-
if res = /\d[.]\s(.*)/.match(raw_text)
|
128
|
-
return true
|
129
|
-
end
|
130
|
-
return false
|
131
57
|
end
|
58
|
+
end
|
132
59
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
end
|
60
|
+
def calculate_indent_position(s)
|
61
|
+
s.downcase
|
62
|
+
pos = 0
|
63
|
+
s.each_char do |c|
|
64
|
+
break if c != ' ' && c != '\t'
|
139
65
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
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'
|
144
82
|
end
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
f_text = format_string(r)
|
154
|
-
#puts f_text
|
155
|
-
s += "\t<li>#{f_text}</li>\n"
|
156
|
-
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
|
157
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
|
158
113
|
|
159
|
-
|
160
|
-
|
161
|
-
else
|
162
|
-
s += "</ul>\n"
|
163
|
-
end
|
114
|
+
false
|
115
|
+
end
|
164
116
|
|
165
|
-
|
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
|
166
148
|
end
|
167
|
-
|
149
|
+
|
150
|
+
s += if @is_ordered
|
151
|
+
"</ol>\n"
|
152
|
+
else
|
153
|
+
"</ul>\n"
|
154
|
+
end
|
155
|
+
|
156
|
+
s
|
157
|
+
end
|
158
|
+
end
|