Almirah 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/almirah/doc_fabric.rb +85 -23
- data/lib/almirah/doc_items/controlled_paragraph.rb +32 -7
- data/lib/almirah/doc_items/doc_item.rb +2 -0
- data/lib/almirah/doc_items/heading.rb +45 -0
- data/lib/almirah/doc_items/image.rb +2 -1
- data/lib/almirah/doc_items/todo_block.rb +22 -0
- data/lib/almirah/doc_types/base_document.rb +2 -0
- data/lib/almirah/doc_types/index.rb +22 -1
- data/lib/almirah/doc_types/specification.rb +4 -0
- data/lib/almirah/doc_types/traceability.rb +16 -7
- data/lib/almirah/project.rb +13 -8
- data/lib/almirah/templates/page.html +145 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48020d93e573f2cf9f630bc92e1b74f0f64fcdf3fe74986ab1f833437bb13aed
|
4
|
+
data.tar.gz: e38751efb3beaa7abc28c9eb58d0b604c0dc658a22e25498b39e27001e5c163c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cf68af758e43a86e79215b9017084246713b3a72b189a154e609a7f8da1709d7fe30de638493d52668349ed4a49e07977e53b6534f4a6fd92ba3ad8d484c4ac
|
7
|
+
data.tar.gz: 4eed1d68e546d5cb6ef70e7b6f6e2cb2217a22b6c6ba1356108cc341456889e3d857b50551a1398c53fe5d54eb1f27674a17955f60e7606b7fa4003b2eee12f0
|
data/lib/almirah/doc_fabric.rb
CHANGED
@@ -8,6 +8,7 @@ require_relative "doc_items/doc_item"
|
|
8
8
|
require_relative "doc_items/heading"
|
9
9
|
require_relative "doc_items/paragraph"
|
10
10
|
require_relative "doc_items/blockquote"
|
11
|
+
require_relative "doc_items/todo_block"
|
11
12
|
require_relative "doc_items/controlled_paragraph"
|
12
13
|
require_relative "doc_items/markdown_table"
|
13
14
|
require_relative "doc_items/controlled_table"
|
@@ -58,25 +59,32 @@ class DocFabric
|
|
58
59
|
|
59
60
|
level = res[1].length
|
60
61
|
value = res[2]
|
62
|
+
|
63
|
+
if level == 1 && doc.title == ""
|
64
|
+
doc.title = value
|
65
|
+
Heading.reset_global_section_number()
|
66
|
+
end
|
67
|
+
|
61
68
|
item = Heading.new(value, level)
|
62
69
|
item.parent_doc = doc
|
63
70
|
doc.items.append(item)
|
64
71
|
doc.headings.append(item)
|
65
|
-
|
66
|
-
if level == 1 && doc.title == ""
|
67
|
-
doc.title = value
|
68
|
-
end
|
72
|
+
|
69
73
|
elsif res = /^\%\s(.*)/.match(s) # Pandoc Document Title
|
70
74
|
|
71
75
|
title = res[1]
|
76
|
+
|
77
|
+
if doc.title == ""
|
78
|
+
doc.title = title
|
79
|
+
Heading.reset_global_section_number()
|
80
|
+
end
|
81
|
+
|
72
82
|
item = Heading.new(title, 1)
|
73
83
|
item.parent_doc = doc
|
74
84
|
doc.items.append(item)
|
75
85
|
doc.headings.append(item)
|
76
86
|
|
77
|
-
|
78
|
-
doc.title = title
|
79
|
-
end
|
87
|
+
Heading.reset_global_section_number() # Pandoc Document Title is not a section, so it shall not be taken into account in numbering
|
80
88
|
|
81
89
|
elsif res = /^\[(\S*)\]\s+(.*)/.match(s) # Controlled Paragraph
|
82
90
|
|
@@ -91,34 +99,70 @@ class DocFabric
|
|
91
99
|
|
92
100
|
id = res[1]
|
93
101
|
text = res[2]
|
102
|
+
up_links = nil
|
103
|
+
|
104
|
+
#check if it contains the uplink (one or many)
|
105
|
+
#TODO: check this regular expression
|
106
|
+
first_pos = text.length # for trailing commas
|
107
|
+
tmp = text.scan( /(>\[(?>[^\[\]]|\g<0>)*\])/ ) # >[SRS-001], >[SYS-002]
|
108
|
+
if tmp.length >0
|
109
|
+
up_links = Array.new
|
110
|
+
tmp.each do |ul|
|
111
|
+
up_links.append(ul[0])
|
112
|
+
# try to find the real end of text
|
113
|
+
pos = text.index(ul[0])
|
114
|
+
if pos < first_pos
|
115
|
+
first_pos = pos
|
116
|
+
end
|
117
|
+
# remove uplink from text
|
118
|
+
text = text.split(ul[0]).join("")
|
119
|
+
end
|
120
|
+
# remove trailing commas and spaces
|
121
|
+
if text.length > first_pos
|
122
|
+
first_pos -= 1
|
123
|
+
text = text[0..first_pos].strip
|
124
|
+
end
|
125
|
+
end
|
94
126
|
|
95
|
-
#
|
96
|
-
|
127
|
+
# since we already know id and text
|
128
|
+
item = ControlledParagraph.new( text, id )
|
97
129
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
130
|
+
if up_links
|
131
|
+
doc.items_with_uplinks_number += 1 #for statistics
|
132
|
+
up_links.each do |ul|
|
133
|
+
if tmp = />\[(\S*)\]$/.match(ul) # >[SRS-001]
|
134
|
+
up_link_id = tmp[1]
|
135
|
+
|
136
|
+
unless item.up_link_ids
|
137
|
+
item.up_link_ids = Array.new
|
138
|
+
end
|
139
|
+
|
140
|
+
item.up_link_ids.append(up_link_id)
|
141
|
+
|
142
|
+
if tmp = /^([a-zA-Z]+)[-]\d+/.match(up_link_id) # SRS
|
143
|
+
doc.up_link_doc_id[ tmp[1].downcase.to_s ] = tmp[1].downcase # multiple documents could be up-linked
|
144
|
+
end
|
145
|
+
end
|
103
146
|
end
|
104
147
|
end
|
105
148
|
|
106
|
-
|
149
|
+
|
107
150
|
item.parent_doc = doc
|
108
|
-
|
109
|
-
item.up_link = up_link
|
110
|
-
doc.items_with_uplinks_number += 1 #for statistics
|
111
|
-
end
|
151
|
+
item.parent_heading = doc.headings[-1]
|
112
152
|
|
113
153
|
doc.items.append(item)
|
114
|
-
|
154
|
+
#for statistics
|
155
|
+
if doc.dictionary.has_key?( id.to_s )
|
156
|
+
doc.duplicated_ids_number += 1
|
157
|
+
doc.duplicates_list.append(item)
|
158
|
+
else
|
159
|
+
doc.dictionary[ id.to_s ] = item #for fast search
|
160
|
+
end
|
115
161
|
doc.controlled_items.append(item) #for fast search
|
116
162
|
|
117
163
|
#for statistics
|
118
164
|
n = /\d+/.match(id)[0].to_i
|
119
|
-
if n
|
120
|
-
doc.duplicated_ids_number += 1
|
121
|
-
elsif n > doc.last_used_id_number
|
165
|
+
if n > doc.last_used_id_number
|
122
166
|
doc.last_used_id = id
|
123
167
|
doc.last_used_id_number = n
|
124
168
|
end
|
@@ -228,6 +272,24 @@ class DocFabric
|
|
228
272
|
item = Blockquote.new(res[1])
|
229
273
|
item.parent_doc = doc
|
230
274
|
doc.items.append(item)
|
275
|
+
|
276
|
+
elsif res = /^TODO\:(.*)/.match(s) #check if TODO block
|
277
|
+
|
278
|
+
if tempMdTable
|
279
|
+
doc.items.append tempMdTable
|
280
|
+
tempMdTable = nil
|
281
|
+
end
|
282
|
+
if tempMdList
|
283
|
+
doc.items.append tempMdList
|
284
|
+
tempMdList = nil
|
285
|
+
end
|
286
|
+
|
287
|
+
text = "**TODO**: " + res[1]
|
288
|
+
|
289
|
+
item = TodoBlock.new(text)
|
290
|
+
item.parent_doc = doc
|
291
|
+
doc.items.append(item)
|
292
|
+
doc.todo_blocks.append(item)
|
231
293
|
|
232
294
|
else # Reqular Paragraph
|
233
295
|
if tempMdTable
|
@@ -3,14 +3,14 @@ require_relative "paragraph"
|
|
3
3
|
class ControlledParagraph < Paragraph
|
4
4
|
|
5
5
|
attr_accessor :id
|
6
|
-
attr_accessor :
|
6
|
+
attr_accessor :up_link_ids
|
7
7
|
attr_accessor :down_links
|
8
8
|
attr_accessor :coverage_links
|
9
9
|
|
10
10
|
def initialize(text, id)
|
11
11
|
@text = text.strip
|
12
12
|
@id = id
|
13
|
-
@
|
13
|
+
@up_link_ids = nil
|
14
14
|
@down_links = nil
|
15
15
|
@coverage_links = nil
|
16
16
|
end
|
@@ -27,11 +27,27 @@ class ControlledParagraph < Paragraph
|
|
27
27
|
s += "\t\t<td class=\"item_id\"> <a name=\"#{@id}\" id=\"#{@id}\" href=\"##{@id}\">#{@id}</a></td>\n"
|
28
28
|
s += "\t\t<td class=\"item_text\">#{f_text}</td>\n"
|
29
29
|
|
30
|
-
if @
|
31
|
-
if
|
32
|
-
|
30
|
+
if @up_link_ids
|
31
|
+
if @up_link_ids.length == 1
|
32
|
+
if tmp = /^([a-zA-Z]+)[-]\d+/.match(@up_link_ids[0])
|
33
|
+
up_link_doc_name = tmp[1].downcase
|
34
|
+
end
|
35
|
+
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"
|
36
|
+
else
|
37
|
+
s += "\t\t<td class=\"item_id\">"
|
38
|
+
s += "<div id=\"DL_#{@id}\" style=\"display: block;\">"
|
39
|
+
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\">#{@up_link_ids.length}</a>"
|
40
|
+
s += "</div>"
|
41
|
+
s += "<div id=\"DLS_#{@id}\" style=\"display: none;\">"
|
42
|
+
@up_link_ids.each do |lnk|
|
43
|
+
if tmp = /^([a-zA-Z]+)[-]\d+/.match(lnk)
|
44
|
+
up_link_doc_name = tmp[1].downcase
|
45
|
+
end
|
46
|
+
s += "\t\t\t<a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html##{lnk}\" class=\"external\">#{lnk}</a>\n<br>"
|
47
|
+
end
|
48
|
+
s += "</div>"
|
49
|
+
s += "</td>\n"
|
33
50
|
end
|
34
|
-
s += "\t\t<td class=\"item_id\"><a href=\"./../#{up_link_doc_name}/#{up_link_doc_name}.html##{@up_link}\" class=\"external\">#{@up_link}</a></td>\n"
|
35
51
|
else
|
36
52
|
s += "\t\t<td class=\"item_id\"></td>\n"
|
37
53
|
end
|
@@ -43,7 +59,16 @@ class ControlledParagraph < Paragraph
|
|
43
59
|
if @down_links.length == 1
|
44
60
|
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"
|
45
61
|
else
|
46
|
-
s += "\t\t<td class=\"item_id\"
|
62
|
+
s += "\t\t<td class=\"item_id\">"
|
63
|
+
s += "<div id=\"DL_#{@id}\" style=\"display: block;\">"
|
64
|
+
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\">#{@down_links.length}</a>"
|
65
|
+
s += "</div>"
|
66
|
+
s += "<div id=\"DLS_#{@id}\" style=\"display: none;\">"
|
67
|
+
@down_links.each do |lnk|
|
68
|
+
s += "\t\t\t<a href=\"./../#{lnk.parent_doc.id}/#{lnk.parent_doc.id}.html##{lnk.id}\" class=\"external\">#{lnk.id}</a>\n<br>"
|
69
|
+
end
|
70
|
+
s += "</div>"
|
71
|
+
s += "</td>\n"
|
47
72
|
end
|
48
73
|
else
|
49
74
|
s += "\t\t<td class=\"item_id\"></td>\n"
|
@@ -4,11 +4,52 @@ class Heading < Paragraph
|
|
4
4
|
|
5
5
|
attr_accessor :level
|
6
6
|
attr_accessor :anchor_id
|
7
|
+
attr_accessor :section_number
|
8
|
+
|
9
|
+
@@global_section_number = ""
|
7
10
|
|
8
11
|
def initialize(text, level)
|
9
12
|
@text = text
|
10
13
|
@level = level
|
11
14
|
@anchor_id = getTextWithoutSpaces()
|
15
|
+
|
16
|
+
if @@global_section_number == ""
|
17
|
+
@@global_section_number = "1"
|
18
|
+
for n in 1..(level-1) do
|
19
|
+
@@global_section_number += ".1"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
previous_level = @@global_section_number.split(".").length
|
23
|
+
|
24
|
+
if previous_level == level
|
25
|
+
|
26
|
+
a = @@global_section_number.split(".")
|
27
|
+
a[-1] = (a[-1].to_i() +1).to_s
|
28
|
+
@@global_section_number = a.join(".")
|
29
|
+
|
30
|
+
elsif level > previous_level
|
31
|
+
|
32
|
+
a = @@global_section_number.split(".")
|
33
|
+
a.push("1")
|
34
|
+
@@global_section_number = a.join(".")
|
35
|
+
|
36
|
+
else # level < previous_level
|
37
|
+
|
38
|
+
a = @@global_section_number.split(".")
|
39
|
+
delta = previous_level - level
|
40
|
+
a.pop(delta)
|
41
|
+
@@global_section_number = a.join(".")
|
42
|
+
# increment
|
43
|
+
a = @@global_section_number.split(".")
|
44
|
+
a[-1] = (a[-1].to_i() +1).to_s
|
45
|
+
@@global_section_number = a.join(".")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
@section_number = @@global_section_number
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_section_info
|
52
|
+
s = @section_number + " " + @text
|
12
53
|
end
|
13
54
|
|
14
55
|
def to_html
|
@@ -23,4 +64,8 @@ class Heading < Paragraph
|
|
23
64
|
s += "¶</a></h#{headingLevel}>"
|
24
65
|
return s
|
25
66
|
end
|
67
|
+
|
68
|
+
def self.reset_global_section_number
|
69
|
+
@@global_section_number = ""
|
70
|
+
end
|
26
71
|
end
|
@@ -21,7 +21,8 @@ class Image < DocItem
|
|
21
21
|
@@htmlTableRenderInProgress = false
|
22
22
|
end
|
23
23
|
|
24
|
-
s += "<p style=\"margin-top: 15px;\"><img src=\"#{@path}\" alt=\"#{@text}\"
|
24
|
+
s += "<p style=\"margin-top: 15px;\"><img src=\"#{@path}\" alt=\"#{@text}\" "
|
25
|
+
s += "href=\"javascript:void(0)\" onclick=\"image_OnClick(this)\">"
|
25
26
|
return s
|
26
27
|
end
|
27
28
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative "doc_item"
|
2
|
+
|
3
|
+
class TodoBlock < DocItem
|
4
|
+
|
5
|
+
attr_accessor :text
|
6
|
+
|
7
|
+
def initialize(text)
|
8
|
+
@text = text
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_html
|
12
|
+
s = ''
|
13
|
+
f_text = format_string(@text)
|
14
|
+
if @@htmlTableRenderInProgress
|
15
|
+
s += "</table>\n"
|
16
|
+
@@htmlTableRenderInProgress = false
|
17
|
+
end
|
18
|
+
|
19
|
+
s += "<div class=\"todoblock\"><p>#{f_text}</div>\n"
|
20
|
+
return s
|
21
|
+
end
|
22
|
+
end
|
@@ -34,6 +34,7 @@ class Index < BaseDocument
|
|
34
34
|
s += "\t\t<th>Items<br>w/ Downlinks</th>\n"
|
35
35
|
s += "\t\t<th>Covered<br>by Tests</th>\n"
|
36
36
|
s += "\t\t<th>Duplicated<br>ids</th>\n"
|
37
|
+
s += "\t\t<th>TODOs</th>\n"
|
37
38
|
s += "\t\t<th>Last Used<br>id</th>\n"
|
38
39
|
s += "</thead>\n"
|
39
40
|
html_rows.append s
|
@@ -47,7 +48,27 @@ class Index < BaseDocument
|
|
47
48
|
s += "\t\t<td class=\"item_id\" style='width: 7%;'>#{doc.items_with_uplinks_number.to_s}</td>\n"
|
48
49
|
s += "\t\t<td class=\"item_id\" style='width: 7%;'>#{doc.items_with_downlinks_number.to_s}</td>\n"
|
49
50
|
s += "\t\t<td class=\"item_id\" style='width: 7%;'>#{doc.items_with_coverage_number.to_s}</td>\n"
|
50
|
-
|
51
|
+
|
52
|
+
if doc.duplicated_ids_number >0
|
53
|
+
s += "\t\t<td class=\"item_id\" style='width: 7%; background-color: #fcc;'>"
|
54
|
+
s += "<div id=\"DL_#{doc.id}\" style=\"display: block;\">"
|
55
|
+
s += "<a href=\"#\" onclick=\"downlink_OnClick(this.parentElement); return false;\" class=\"external\">#{doc.duplicated_ids_number.to_s}</a>"
|
56
|
+
s += "</div>"
|
57
|
+
s += "<div id=\"DLS_#{doc.id}\" style=\"display: none;\">"
|
58
|
+
doc.duplicates_list.each do |lnk|
|
59
|
+
s += "\t\t\t<a href=\"./specifications/#{doc.id}/#{doc.id}.html##{lnk.id}\" class=\"external\">#{lnk.id}</a>\n<br>"
|
60
|
+
end
|
61
|
+
s += "</div>"
|
62
|
+
s += "</td>\n"
|
63
|
+
else
|
64
|
+
s += "\t\t<td class=\"item_id\" style='width: 7%;'>#{doc.duplicated_ids_number.to_s}</td>\n"
|
65
|
+
end
|
66
|
+
if doc.todo_blocks.length >0
|
67
|
+
color = "background-color: #fcc;"
|
68
|
+
else
|
69
|
+
color = ""
|
70
|
+
end
|
71
|
+
s += "\t\t<td class=\"item_id\" style='width: 7%; #{color}'>#{doc.todo_blocks.length.to_s}</td>\n"
|
51
72
|
s += "\t\t<td class=\"item_id\" style='width: 7%;'>#{doc.last_used_id.to_s}</td>\n"
|
52
73
|
s += "</tr>\n"
|
53
74
|
html_rows.append s
|
@@ -5,11 +5,13 @@ class Specification < BaseDocument
|
|
5
5
|
attr_accessor :up_link_doc_id
|
6
6
|
attr_accessor :dictionary
|
7
7
|
attr_accessor :controlled_items
|
8
|
+
attr_accessor :todo_blocks
|
8
9
|
|
9
10
|
attr_accessor :items_with_uplinks_number
|
10
11
|
attr_accessor :items_with_downlinks_number
|
11
12
|
attr_accessor :items_with_coverage_number
|
12
13
|
attr_accessor :duplicated_ids_number
|
14
|
+
attr_accessor :duplicates_list
|
13
15
|
attr_accessor :last_used_id
|
14
16
|
attr_accessor :last_used_id_number
|
15
17
|
|
@@ -21,6 +23,8 @@ class Specification < BaseDocument
|
|
21
23
|
@headings = Array.new
|
22
24
|
@controlled_items = Array.new
|
23
25
|
@dictionary = Hash.new
|
26
|
+
@duplicates_list = Array.new
|
27
|
+
@todo_blocks = Array.new
|
24
28
|
|
25
29
|
@items_with_uplinks_number = 0
|
26
30
|
@items_with_downlinks_number = 0
|
@@ -36,7 +36,10 @@ class Traceability < BaseDocument
|
|
36
36
|
html_rows.append('')
|
37
37
|
s = "<h1>#{@title}</h1>\n"
|
38
38
|
s += "<table class=\"controlled\">\n"
|
39
|
-
s += "\t<thead> <th>#</th> <th style='font-weight: bold;'>#{@top_doc.title}</th>
|
39
|
+
s += "\t<thead> <th>#</th> <th style='font-weight: bold;'>#{@top_doc.title}</th> "
|
40
|
+
s += "<th>#</th> <th style='font-weight: bold;'>#{@bottom_doc.title}</th> "
|
41
|
+
s += "<th style='font-weight: bold;'>Document Section</th>"
|
42
|
+
s += "</thead>\n"
|
40
43
|
html_rows.append s
|
41
44
|
|
42
45
|
sorted_items = @top_doc.controlled_items.sort_by { |w| w.id }
|
@@ -67,11 +70,13 @@ class Traceability < BaseDocument
|
|
67
70
|
|
68
71
|
top_item.down_links.each do |bottom_item|
|
69
72
|
bottom_f_text = bottom_item.format_string( bottom_item.text )
|
73
|
+
document_section = bottom_item.parent_heading.get_section_info
|
70
74
|
s += "\t<tr>\n"
|
71
75
|
s += "\t\t<td class=\"item_id\" #{id_color}><a href=\"./../#{top_item.parent_doc.id}/#{top_item.parent_doc.id}.html##{top_item.id}\" class=\"external\">#{top_item.id}</a></td>\n"
|
72
|
-
s += "\t\t<td class=\"item_text\" style='width:
|
76
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'>#{top_f_text}</td>\n"
|
73
77
|
s += "\t\t<td class=\"item_id\"><a href=\"./../#{bottom_item.parent_doc.id}/#{bottom_item.parent_doc.id}.html##{bottom_item.id}\" class=\"external\">#{bottom_item.id}</a></td>\n"
|
74
|
-
s += "\t\t<td class=\"item_text\" style='width:
|
78
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'>#{bottom_f_text}</td>\n"
|
79
|
+
s += "\t\t<td class=\"item_text\" style='width: 16%;'>#{document_section}</td>\n"
|
75
80
|
s += "\t</tr>\n"
|
76
81
|
end
|
77
82
|
|
@@ -83,11 +88,14 @@ class Traceability < BaseDocument
|
|
83
88
|
if bottom_item.parent_doc.id == @bottom_doc.id
|
84
89
|
|
85
90
|
bottom_f_text = bottom_item.format_string( bottom_item.text )
|
91
|
+
document_section = bottom_item.parent_heading.get_section_info
|
92
|
+
|
86
93
|
s += "\t<tr>\n"
|
87
94
|
s += "\t\t<td class=\"item_id\" #{id_color}><a href=\"./../#{top_item.parent_doc.id}/#{top_item.parent_doc.id}.html##{top_item.id}\" class=\"external\">#{top_item.id}</a></td>\n"
|
88
|
-
s += "\t\t<td class=\"item_text\" style='width:
|
95
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'>#{top_f_text}</td>\n"
|
89
96
|
s += "\t\t<td class=\"item_id\"><a href=\"./../#{bottom_item.parent_doc.id}/#{bottom_item.parent_doc.id}.html##{bottom_item.id}\" class=\"external\">#{bottom_item.id}</a></td>\n"
|
90
|
-
s += "\t\t<td class=\"item_text\" style='width:
|
97
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'>#{bottom_f_text}</td>\n"
|
98
|
+
s += "\t\t<td class=\"item_text\" style='width: 16%;'>#{document_section}</td>\n"
|
91
99
|
s += "\t</tr>\n"
|
92
100
|
end
|
93
101
|
end
|
@@ -95,9 +103,10 @@ class Traceability < BaseDocument
|
|
95
103
|
else
|
96
104
|
s += "\t<tr>\n"
|
97
105
|
s += "\t\t<td class=\"item_id\"><a href=\"./../#{top_item.parent_doc.id}/#{top_item.parent_doc.id}.html##{top_item.id}\" class=\"external\">#{top_item.id}</a></td>\n"
|
98
|
-
s += "\t\t<td class=\"item_text\" style='width:
|
106
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'>#{top_f_text}</td>\n"
|
99
107
|
s += "\t\t<td class=\"item_id\"></td>\n"
|
100
|
-
s += "\t\t<td class=\"item_text\" style='width:
|
108
|
+
s += "\t\t<td class=\"item_text\" style='width: 34%;'></td>\n"
|
109
|
+
s += "\t\t<td class=\"item_text\" style='width: 16%;'></td>\n"
|
101
110
|
s += "\t</tr>\n"
|
102
111
|
end
|
103
112
|
return s
|
data/lib/almirah/project.rb
CHANGED
@@ -137,15 +137,20 @@ class Project
|
|
137
137
|
#puts "Link: #{doc_A.id} - #{doc_B.id}"
|
138
138
|
bottom_document.controlled_items.each do |item|
|
139
139
|
|
140
|
-
if
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
140
|
+
if item.up_link_ids
|
141
|
+
item.up_link_ids.each do |up_lnk|
|
142
|
+
|
143
|
+
if top_document.dictionary.has_key?(up_lnk.to_s)
|
144
|
+
|
145
|
+
topItem = top_document.dictionary[up_lnk.to_s]
|
146
|
+
|
147
|
+
unless topItem.down_links
|
148
|
+
topItem.down_links = Array.new
|
149
|
+
top_document.items_with_downlinks_number += 1 # for statistics
|
150
|
+
end
|
151
|
+
topItem.down_links.append(item)
|
152
|
+
end
|
147
153
|
end
|
148
|
-
topItem.down_links.append(item)
|
149
154
|
end
|
150
155
|
end
|
151
156
|
# create treceability document
|
@@ -2,6 +2,7 @@
|
|
2
2
|
<html lang="en">
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8" />
|
5
|
+
<title>{{DOCUMENT_TITLE}}</title>
|
5
6
|
<!-- CSS -->
|
6
7
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
7
8
|
<style>
|
@@ -144,6 +145,25 @@
|
|
144
145
|
margin-top: 4px;
|
145
146
|
margin-bottom: 4px;
|
146
147
|
}
|
148
|
+
div.todoblock {
|
149
|
+
display: block;
|
150
|
+
background:#fcc;
|
151
|
+
border-left: 3px double #bbb;
|
152
|
+
font-style: italic;
|
153
|
+
padding: 4px 1em 4px 4px;
|
154
|
+
margin-top: 4px;
|
155
|
+
margin-bottom: 4px;
|
156
|
+
}
|
157
|
+
img:hover{
|
158
|
+
transition: 0.3s;
|
159
|
+
}
|
160
|
+
img{
|
161
|
+
opacity: 0.9;
|
162
|
+
cursor: pointer;
|
163
|
+
}
|
164
|
+
#modal_image_id{
|
165
|
+
cursor: default;
|
166
|
+
}
|
147
167
|
#nav_pane{
|
148
168
|
flex-shrink: 0;
|
149
169
|
padding: 16px 8px 2px 8px;
|
@@ -164,6 +184,7 @@
|
|
164
184
|
overflow: hidden;
|
165
185
|
position: fixed;
|
166
186
|
width: 100%;
|
187
|
+
z-index: 1;
|
167
188
|
}
|
168
189
|
#top_nav a {
|
169
190
|
float: left;
|
@@ -174,6 +195,15 @@
|
|
174
195
|
font-size: 1.5em;
|
175
196
|
font-family: "Trebuchet MS", Verdana, sans-serif;
|
176
197
|
}
|
198
|
+
#top_nav a.split {
|
199
|
+
float: right;
|
200
|
+
color: white;
|
201
|
+
text-align: center;
|
202
|
+
padding: 4px 6px;
|
203
|
+
text-decoration: none;
|
204
|
+
font-size: 1.5em;
|
205
|
+
font-family: "Trebuchet MS", Verdana, sans-serif;
|
206
|
+
}
|
177
207
|
#top_nav a:hover {
|
178
208
|
background-color: black;
|
179
209
|
color: white;
|
@@ -182,7 +212,67 @@
|
|
182
212
|
background-color: #169;
|
183
213
|
color: white;
|
184
214
|
}
|
185
|
-
|
215
|
+
.modal {
|
216
|
+
display: none; /* Hidden by default */
|
217
|
+
position: fixed; /* Stay in place */
|
218
|
+
z-index: 1; /* Sit on top */
|
219
|
+
padding-top: 100px; /* Location of the box */
|
220
|
+
left: 0;
|
221
|
+
top: 0;
|
222
|
+
width: 100%; /* Full width */
|
223
|
+
height: 100%; /* Full height */
|
224
|
+
overflow: auto; /* Enable scroll if needed */
|
225
|
+
background-color: rgb(0,0,0); /* Fallback color */
|
226
|
+
background-color: rgba(0,0,0,0.9); /* Black w/ opacity */
|
227
|
+
}
|
228
|
+
.modal_image {
|
229
|
+
margin: auto;
|
230
|
+
display: block;
|
231
|
+
width: 97%;
|
232
|
+
/*max-width: 700px;*/
|
233
|
+
}
|
234
|
+
#modal_image_caption {
|
235
|
+
margin: auto;
|
236
|
+
display: block;
|
237
|
+
width: 80%;
|
238
|
+
max-width: 700px;
|
239
|
+
text-align: center;
|
240
|
+
color: #ccc;
|
241
|
+
padding: 10px 0;
|
242
|
+
height: 150px;
|
243
|
+
}
|
244
|
+
.modal_image, #modal_image_caption {
|
245
|
+
animation-name: zoom;
|
246
|
+
animation-duration: 0.6s;
|
247
|
+
}
|
248
|
+
@keyframes zoom {
|
249
|
+
from {transform: scale(0.1)}
|
250
|
+
to {transform: scale(1)}
|
251
|
+
}
|
252
|
+
.modal_close_btn {
|
253
|
+
position: absolute;
|
254
|
+
top: 15px;
|
255
|
+
right: 35px;
|
256
|
+
color: #f1f1f1;
|
257
|
+
font-size: 30px;
|
258
|
+
font-weight: bold;
|
259
|
+
transition: 0.3s;
|
260
|
+
}
|
261
|
+
.modal_close_btn:hover,
|
262
|
+
.modal_close_btn:focus {
|
263
|
+
color: #bbb;
|
264
|
+
text-decoration: none;
|
265
|
+
cursor: pointer;
|
266
|
+
}
|
267
|
+
#footer {
|
268
|
+
clear: both;
|
269
|
+
border-top: 1px solid #bbb;
|
270
|
+
font-size: 0.9em;
|
271
|
+
color: #aaa;
|
272
|
+
padding: 5px;
|
273
|
+
text-align:center;
|
274
|
+
background:#fff;
|
275
|
+
}
|
186
276
|
</style>
|
187
277
|
<script>
|
188
278
|
function openNav() {
|
@@ -194,12 +284,56 @@ function closeNav() {
|
|
194
284
|
document.getElementById("nav_pane").style.visibility = "hidden";
|
195
285
|
console.log("Mouse Out");
|
196
286
|
}
|
287
|
+
|
288
|
+
window.onload = (event) => {
|
289
|
+
for (var i = 0, n = document.images.length; i < n; i++)
|
290
|
+
{
|
291
|
+
elem = document.images[i];
|
292
|
+
if (elem.width > 640)
|
293
|
+
{
|
294
|
+
elem.style.width = "640px";
|
295
|
+
}
|
296
|
+
}
|
297
|
+
};
|
298
|
+
|
299
|
+
function downlink_OnClick(clicked){
|
300
|
+
clicked.style.display = 'none';
|
301
|
+
id_parts = clicked.id.split("_");
|
302
|
+
required_id = "DLS_" + id_parts[1];
|
303
|
+
document.getElementById(required_id).style.display = 'block';
|
304
|
+
}
|
305
|
+
|
306
|
+
function navigate_to_home(){
|
307
|
+
if (document.title != "Document Index")
|
308
|
+
{
|
309
|
+
window.location.href = "./../../index.html";
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
// Modal window for image zoom
|
314
|
+
function image_OnClick(clicked){
|
315
|
+
|
316
|
+
var modal = document.getElementById('image_modal_div');
|
317
|
+
var modalImg = document.getElementById("modal_image_id");
|
318
|
+
var captionText = document.getElementById("modal_image_caption");
|
319
|
+
|
320
|
+
modal.style.display = "block";
|
321
|
+
modalImg.src = clicked.src;
|
322
|
+
captionText.innerHTML = clicked.alt;
|
323
|
+
}
|
324
|
+
|
325
|
+
function modal_close_OnClick(clicked){
|
326
|
+
var modal = document.getElementById('image_modal_div');
|
327
|
+
modal.style.display = "none";
|
328
|
+
}
|
329
|
+
|
197
330
|
</script>
|
198
331
|
</head>
|
199
332
|
<body>
|
200
333
|
<div id="top_nav">
|
201
|
-
<a href="
|
334
|
+
<a href="javascript:void(0)" onclick="navigate_to_home()"><span><i class="fa fa-home" aria-hidden="true"></i></span> Home</a>
|
202
335
|
<!--a href="javascript:void(0)"> About</a-->
|
336
|
+
<a class="split">{{DOCUMENT_TITLE}}</a>
|
203
337
|
</div>
|
204
338
|
<div id="main">
|
205
339
|
<div id="nav_pane">
|
@@ -209,5 +343,14 @@ function closeNav() {
|
|
209
343
|
{{CONTENT}}
|
210
344
|
</div>
|
211
345
|
</div>
|
346
|
+
<!-- The modal window for image zoom -->
|
347
|
+
<div id="image_modal_div" class="modal">
|
348
|
+
<span class="modal_close_btn" href="javascript:void(0)" onclick="modal_close_OnClick(this)">×</span>
|
349
|
+
<img class="modal_image" id="modal_image_id">
|
350
|
+
<div id="modal_image_caption"></div>
|
351
|
+
</div>
|
352
|
+
<div id="footer">
|
353
|
+
Powered by <a target="_blank" rel="noopener" href="https://www.almirah.site/">Almirah Framework</a>
|
354
|
+
</div>
|
212
355
|
</body>
|
213
356
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Almirah
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleksandr Ivanov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The software part of the Almirah framework
|
14
14
|
email: oleksandr.ivanov.development@gmail.com
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- lib/almirah/doc_items/markdown_table.rb
|
32
32
|
- lib/almirah/doc_items/paragraph.rb
|
33
33
|
- lib/almirah/doc_items/text_line.rb
|
34
|
+
- lib/almirah/doc_items/todo_block.rb
|
34
35
|
- lib/almirah/doc_types/base_document.rb
|
35
36
|
- lib/almirah/doc_types/coverage.rb
|
36
37
|
- lib/almirah/doc_types/index.rb
|