Almirah 0.1.9 → 0.2.1

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.
@@ -1,10 +1,10 @@
1
1
  require 'fileutils'
2
- require 'yaml'
3
2
  require_relative "doc_fabric"
4
3
  require_relative "navigation_pane"
5
4
  require_relative "doc_types/traceability"
6
5
  require_relative "doc_types/coverage"
7
6
  require_relative "doc_types/index"
7
+ require_relative "search/specifications_db"
8
8
 
9
9
  class Project
10
10
 
@@ -12,14 +12,13 @@ class Project
12
12
  attr_accessor :protocols
13
13
  attr_accessor :traceability_matrices
14
14
  attr_accessor :coverage_matrices
15
- attr_accessor :project_root_directory
16
15
  attr_accessor :specifications_dictionary
17
16
  attr_accessor :index
18
17
  attr_accessor :project
19
- attr_accessor :project_configuration
18
+ attr_accessor :configuration
20
19
 
21
- def initialize(path)
22
- @project_root_directory = path
20
+ def initialize(configuration)
21
+ @configuration = configuration
23
22
  @specifications = Array.new
24
23
  @protocols = Array.new
25
24
  @traceability_matrices = Array.new
@@ -27,19 +26,22 @@ class Project
27
26
  @specifications_dictionary = Hash.new
28
27
  @index = nil
29
28
  @project = self
30
- @project_configuration = {}
31
- load_project_file()
32
- FileUtils.remove_dir(@project_root_directory + "/build", true)
29
+ FileUtils.remove_dir(@configuration.project_root_directory + "/build", true)
30
+ copy_resources
33
31
  end
34
32
 
35
- def load_project_file
36
- begin
37
- @project_configuration = YAML.load_file(@project_root_directory + '/project.yml')
38
- rescue Psych::SyntaxError => e
39
- puts "YAML syntax error: #{e.message}"
40
- rescue Errno::ENOENT
41
- puts "Project file not found: project.yml"
42
- end
33
+ def copy_resources
34
+ # scripts
35
+ gem_root = File.expand_path './../..', File.dirname(__FILE__)
36
+ src_folder = gem_root + "/lib/almirah/templates/scripts"
37
+ dst_folder = @configuration.project_root_directory + "/build/scripts"
38
+ FileUtils.mkdir_p(dst_folder)
39
+ FileUtils.copy_entry( src_folder, dst_folder )
40
+ # css
41
+ src_folder = gem_root + "/lib/almirah/templates/css"
42
+ dst_folder = @configuration.project_root_directory + "/build/css"
43
+ FileUtils.mkdir_p(dst_folder)
44
+ FileUtils.copy_entry( src_folder, dst_folder )
43
45
  end
44
46
 
45
47
  def specifications_and_protocols
@@ -55,6 +57,7 @@ class Project
55
57
  render_all_specifications(@coverage_matrices)
56
58
  render_all_protocols
57
59
  render_index
60
+ create_search_data
58
61
  end
59
62
 
60
63
  def specifications_and_results( test_run )
@@ -70,6 +73,7 @@ class Project
70
73
  render_all_specifications(@coverage_matrices)
71
74
  render_all_protocols
72
75
  render_index
76
+ create_search_data
73
77
  end
74
78
 
75
79
  def transform( file_extension )
@@ -78,10 +82,10 @@ class Project
78
82
 
79
83
  def transform_all_specifications( file_extension )
80
84
 
81
- path = @project_root_directory
85
+ path = @configuration.project_root_directory
82
86
 
83
87
  # find all specifications
84
- Dir.glob( "#{@project_root_directory}/specifications/**/*.md" ).each do |f|
88
+ Dir.glob( "#{path}/specifications/**/*.md" ).each do |f|
85
89
  puts f
86
90
  # make a copy with another extention to preserve the content
87
91
  f_directory = File.dirname(f)
@@ -93,12 +97,13 @@ class Project
93
97
  end
94
98
 
95
99
  def parse_all_specifications
100
+ path = @configuration.project_root_directory
96
101
  # do a lasy pass first to get the list of documents id
97
- Dir.glob( "#{@project_root_directory}/specifications/**/*.md" ).each do |f|
102
+ Dir.glob( "#{path}/specifications/**/*.md" ).each do |f|
98
103
  DocFabric.add_lazy_doc_id(f)
99
104
  end
100
105
  # parse documents in the second pass
101
- Dir.glob( "#{@project_root_directory}/specifications/**/*.md" ).each do |f|
106
+ Dir.glob( "#{path}/specifications/**/*.md" ).each do |f|
102
107
  doc = DocFabric.create_specification(f)
103
108
  @specifications.append(doc)
104
109
  @specifications_dictionary[doc.id.to_s.downcase] = doc
@@ -106,7 +111,8 @@ class Project
106
111
  end
107
112
 
108
113
  def parse_all_protocols
109
- Dir.glob( "#{@project_root_directory}/tests/protocols/**/*.md" ).each do |f|
114
+ path = @configuration.project_root_directory
115
+ Dir.glob( "#{path}/tests/protocols/**/*.md" ).each do |f|
110
116
  puts "Prot: " + f
111
117
  doc = DocFabric.create_protocol(f)
112
118
  @protocols.append(doc)
@@ -114,7 +120,8 @@ class Project
114
120
  end
115
121
 
116
122
  def parse_test_run( test_run )
117
- Dir.glob( "#{@project_root_directory}/tests/runs/#{test_run}/**/*.md" ).each do |f|
123
+ path = @configuration.project_root_directory
124
+ Dir.glob( "#{path}/tests/runs/#{test_run}/**/*.md" ).each do |f|
118
125
  puts "Run: " + f
119
126
  doc = DocFabric.create_protocol(f)
120
127
  @protocols.append(doc)
@@ -128,14 +135,12 @@ class Project
128
135
  # puts "Link: #{c[0].id} - #{c[1].id}"
129
136
  end
130
137
  # separatelly create design inputs treceability
131
- if (@project_configuration.key? 'specifications') and (@project_configuration['specifications'].key? 'input')
132
- @project_configuration['specifications']['input'].each do |i|
133
- if @specifications_dictionary.has_key? i.to_s.downcase
134
- document = @specifications_dictionary[i.to_s.downcase]
135
- if document
136
- trx = Traceability.new document, nil, true
137
- @traceability_matrices.append trx
138
- end
138
+ @configuration.get_design_inputs.each do |i|
139
+ if @specifications_dictionary.has_key? i.to_s.downcase
140
+ document = @specifications_dictionary[i.to_s.downcase]
141
+ if document
142
+ trx = Traceability.new document, nil, true
143
+ @traceability_matrices.append trx
139
144
  end
140
145
  end
141
146
  end
@@ -144,7 +149,7 @@ class Project
144
149
  def link_all_protocols
145
150
  @protocols.each do |p|
146
151
  @specifications.each do |s|
147
- if p.up_link_doc_id.has_key?(s.id.to_s)
152
+ if p.up_link_docs.has_key?(s.id.to_s)
148
153
  link_protocol_to_spec(p,s)
149
154
  end
150
155
  end
@@ -160,7 +165,7 @@ class Project
160
165
  end
161
166
 
162
167
  @specifications.each do |s|
163
- s.up_link_doc_id.each do |key, value|
168
+ s.up_link_docs.each do |key, value|
164
169
  unless available_specification_ids.has_key?(key)
165
170
  # now key points to the doc_id that does not exist
166
171
  wrong_doc_id = key
@@ -184,10 +189,10 @@ class Project
184
189
 
185
190
  def link_two_specifications(doc_A, doc_B)
186
191
 
187
- if doc_B.up_link_doc_id.has_key?(doc_A.id.to_s)
192
+ if doc_B.up_link_docs.has_key?(doc_A.id.to_s)
188
193
  top_document = doc_A
189
194
  bottom_document = doc_B
190
- elsif doc_A.up_link_doc_id.has_key?(doc_B.id.to_s)
195
+ elsif doc_A.up_link_docs.has_key?(doc_B.id.to_s)
191
196
  top_document = doc_B
192
197
  bottom_document = doc_A
193
198
  else
@@ -253,16 +258,16 @@ class Project
253
258
 
254
259
  def render_all_specifications(spec_list)
255
260
 
256
- pass = @project_root_directory
261
+ path = @configuration.project_root_directory
257
262
 
258
- FileUtils.mkdir_p(pass + "/build/specifications")
263
+ FileUtils.mkdir_p(path + "/build/specifications")
259
264
 
260
265
  spec_list.each do |doc|
261
266
 
262
267
  doc.to_console
263
268
 
264
- img_src_dir = pass + "/specifications/" + doc.id + "/img"
265
- img_dst_dir = pass + "/build/specifications/" + doc.id + "/img"
269
+ img_src_dir = path + "/specifications/" + doc.id + "/img"
270
+ img_dst_dir = path + "/build/specifications/" + doc.id + "/img"
266
271
 
267
272
  FileUtils.mkdir_p(img_dst_dir)
268
273
 
@@ -272,7 +277,7 @@ class Project
272
277
 
273
278
  # create a sidebar first
274
279
  nav_pane = NavigationPane.new(doc)
275
- doc.to_html( nav_pane, "#{pass}/build/specifications/" )
280
+ doc.to_html( nav_pane, "#{path}/build/specifications/" )
276
281
  end
277
282
  end
278
283
 
@@ -281,15 +286,14 @@ class Project
281
286
  # create a sidebar first
282
287
  # nav_pane = NavigationPane.new(@specifications)
283
288
 
284
- pass = @project_root_directory
289
+ path = @configuration.project_root_directory
285
290
 
286
- # FileUtils.remove_dir(pass + "/build/tests", true)
287
- FileUtils.mkdir_p(pass + "/build/tests/protocols")
291
+ FileUtils.mkdir_p(path + "/build/tests/protocols")
288
292
 
289
293
  @protocols.each do |doc|
290
294
 
291
- img_src_dir = pass + "/tests/protocols/" + doc.id + "/img"
292
- img_dst_dir = pass + "/build/tests/protocols/" + doc.id + "/img"
295
+ img_src_dir = path + "/tests/protocols/" + doc.id + "/img"
296
+ img_dst_dir = path + "/build/tests/protocols/" + doc.id + "/img"
293
297
 
294
298
  FileUtils.mkdir_p(img_dst_dir)
295
299
 
@@ -297,17 +301,24 @@ class Project
297
301
  FileUtils.copy_entry( img_src_dir, img_dst_dir )
298
302
  end
299
303
 
300
- doc.to_html( nil, "#{pass}/build/tests/protocols/" )
304
+ doc.to_html( nil, "#{path}/build/tests/protocols/" )
301
305
  end
302
306
  end
303
307
 
304
- def render_index
308
+ def render_index
305
309
 
306
- path = @project_root_directory
310
+ path = @configuration.project_root_directory
307
311
 
308
312
  doc = @index
309
313
  doc.to_console
310
314
 
311
315
  doc.to_html("#{path}/build/")
312
316
  end
317
+
318
+ def create_search_data
319
+ db = SpecificationsDb.new @specifications
320
+ data_path = @configuration.project_root_directory + "/build/data"
321
+ FileUtils.mkdir_p(data_path)
322
+ db.save(data_path)
323
+ end
313
324
  end
@@ -0,0 +1,42 @@
1
+ require 'yaml'
2
+
3
+ class ProjectConfiguration
4
+
5
+ attr_accessor :project_root_directory
6
+ attr_accessor :parameters
7
+
8
+ def initialize(path)
9
+ @project_root_directory = path
10
+ @parameters = {}
11
+ load_project_file()
12
+ end
13
+
14
+ def load_project_file
15
+ begin
16
+ @parameters = YAML.load_file(@project_root_directory + '/project.yml')
17
+ rescue Psych::SyntaxError => e
18
+ puts "YAML syntax error: #{e.message}"
19
+ rescue Errno::ENOENT
20
+ puts "Project file not found: project.yml"
21
+ end
22
+ end
23
+
24
+ def get_design_inputs
25
+ if (@parameters.key? 'specifications') and (@parameters['specifications'].key? 'input')
26
+ return @parameters['specifications']['input']
27
+ end
28
+ return []
29
+ end
30
+
31
+ def is_spec_db_shall_be_created
32
+ if (@parameters.key? 'output')
33
+ @parameters['output'].each do |p|
34
+ if p == 'specifications_db'
35
+ return true
36
+ end
37
+ end
38
+ end
39
+ return false
40
+ end
41
+
42
+ end
@@ -0,0 +1,66 @@
1
+ require 'json'
2
+ # Prepare JSON database file for further indexing by other tools
3
+ class SpecificationsDb
4
+
5
+ attr_accessor :specifications
6
+ attr_accessor :data
7
+
8
+ def initialize(spec_list)
9
+ @specifications = spec_list
10
+ @data = []
11
+ create_data
12
+ end
13
+
14
+ def create_data
15
+ @specifications.each do |sp|
16
+ sp.items.each do |i|
17
+ if (i.instance_of? Paragraph) or (i.instance_of? ControlledParagraph)
18
+ e = {"document" => i.parent_doc.title, \
19
+ "doc_color" => i.parent_doc.color, \
20
+ "text" => i.text, \
21
+ "heading_url" => i.parent_heading.get_url(), \
22
+ "heading_text" => i.parent_heading.get_section_info()
23
+ }
24
+ @data.append e
25
+ elsif i.instance_of? MarkdownList
26
+ e = add_markdown_list_item_to_db( @data, i, i)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def add_markdown_list_item_to_db(data, item_for_reference, item_to_process)
33
+ e = nil
34
+ item_to_process.rows.each do |r|
35
+ if r.is_a?(MarkdownList)
36
+ f_text = r.text
37
+ e = { "document" => item_for_reference.parent_doc.title, \
38
+ "doc_color" => item_for_reference.parent_doc.color, \
39
+ "text" => f_text, \
40
+ "heading_url" => item_for_reference.parent_heading.get_url(), \
41
+ "heading_text" => item_for_reference.parent_heading.get_section_info()
42
+ }
43
+ data << e
44
+ add_markdown_list_item_to_db(data, item_for_reference, r)
45
+ else
46
+ f_text = r
47
+ e = { "document" => item_for_reference.parent_doc.title, \
48
+ "doc_color" => item_for_reference.parent_doc.color, \
49
+ "text" => f_text, \
50
+ "heading_url" => item_for_reference.parent_heading.get_url(), \
51
+ "heading_text" => item_for_reference.parent_heading.get_section_info()
52
+ }
53
+ data << e
54
+ end
55
+ end
56
+ return e
57
+ end
58
+
59
+ def save(path)
60
+ json = JSON.generate(@data)
61
+
62
+ file = File.open( path + "/specifications_db.json", "w" )
63
+ file.puts json
64
+ file.close
65
+ end
66
+ end
@@ -0,0 +1,298 @@
1
+ body {
2
+ font-family: Verdana, sans-serif;
3
+ font-size: 12px;
4
+ color: #333;
5
+ margin: 0;
6
+ padding: 0;
7
+ min-width: 900px;
8
+ }
9
+ #main {
10
+ flex-grow: 2;
11
+ display: flex;
12
+ flex-direction: row;
13
+ }
14
+ #content {
15
+ flex-grow: 1;
16
+ background-color: #fff;
17
+ margin-top: 30px;
18
+ padding: 10px 16px 10px 16px;
19
+ overflow-x: auto;
20
+ }
21
+ #content h1, h2, h3, h4, h5, h6 {
22
+ color: #555;
23
+ font-family: "Trebuchet MS", Verdana, sans-serif;
24
+ padding: 2px 10px 1px 0px;
25
+ margin: 0 0 10px 0;
26
+ }
27
+ h1 {
28
+ font-size: 2em;
29
+ }
30
+ h2 {
31
+ font-size: 1.8em;
32
+ }
33
+ h3 {
34
+ font-size: 1.5em;
35
+ }
36
+ h4 {
37
+ font-size: 1.2em;
38
+ border: none;
39
+ font-weight: bold;
40
+ }
41
+ h5 {
42
+ font-size: 1em;
43
+ }
44
+ h6 {
45
+ font-size: 1em; color: #8e8e8e;
46
+ }
47
+ a.heading_anchor {
48
+ display: none;
49
+ margin-left: 6px;
50
+ text-decoration: none;
51
+ }
52
+ table.markdown_table{
53
+ border: 1px solid #bbb;
54
+ border-collapse: collapse;
55
+ padding: 4px;
56
+ margin-bottom: 4px;
57
+ overflow: hidden;
58
+ }
59
+ table.markdown_table th{
60
+ border: 1px solid #bbb;
61
+ padding: 4px;
62
+ display: table-cell;
63
+ vertical-align: inherit;
64
+ background-color:#EEEEEE;
65
+ }
66
+ table.markdown_table td{
67
+ border: 1px solid #bbb;
68
+ padding: 4px;
69
+ display: table-cell;
70
+ vertical-align: inherit;
71
+ }
72
+ table.controlled{
73
+ border: 1px solid #e4e4e4;
74
+ border-collapse: collapse;
75
+ width: 100%;
76
+ margin-bottom: 4px;
77
+ border-spacing: 0px;
78
+ border-radius: 3px;
79
+ overflow: hidden;
80
+ }
81
+ table.controlled th {
82
+ background-color:#e1f1fa;
83
+ padding: 4px;
84
+ white-space:nowrap;
85
+ font-weight:normal;
86
+ border: 1px solid #bbb;
87
+ }
88
+ table.controlled td {
89
+ padding: 4px;
90
+ text-align:center;
91
+ vertical-align:middle;
92
+ padding-right:10px;
93
+ border: 1px solid #bbb;
94
+ }
95
+ table.controlled tr:first-child th {
96
+ border-top: 0;
97
+ }
98
+ table.controlled tr:last-child td {
99
+ border-bottom: 0;
100
+ }
101
+ table.controlled tr td:first-child,
102
+ table.controlled tr th:first-child {
103
+ border-left: 0;
104
+ }
105
+ table.controlled tr td:last-child,
106
+ table.controlled tr th:last-child {
107
+ border-right: 0;
108
+ }
109
+ table.controlled td.item_id {
110
+ width: 3%;
111
+ text-align: center;
112
+ }
113
+ table.controlled td.item_text{
114
+ text-align: left;
115
+ }
116
+ table.controlled:not(.odd-even) tbody tr:nth-child(odd) { background-color:#f6f7f8; }
117
+ table.controlled:not(.odd-even) tbody tr:nth-child(even) { background-color: #fff; }
118
+ table.controlled:not(.odd-even) tbody tr:nth-child(odd):hover,
119
+ table.controlled:not(.odd-even) tbody tr:nth-child(even):hover { background-color:#ffffdd; }
120
+ a, a:link, a:visited {
121
+ color: #169;
122
+ text-decoration: none;
123
+ display: inline-block;
124
+ }
125
+ a:active {
126
+ color: #555;
127
+ background-color:#deb887;
128
+ text-decoration: none;
129
+ display: inline-block;
130
+ }
131
+ div.blockquote {
132
+ display: block;
133
+ background:#f9f9fb;
134
+ border-left: 3px double #bbb;
135
+ font-style: italic;
136
+ padding: 4px 1em 4px 4px;
137
+ margin-top: 4px;
138
+ margin-bottom: 4px;
139
+ }
140
+ code {
141
+ display: block;
142
+ background:#ffffee;
143
+ border-left: 3px double #bbb;
144
+ font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace;
145
+ padding: 4px 1em 4px 4px;
146
+ margin-top: 4px;
147
+ margin-bottom: 4px;
148
+ }
149
+ div.todoblock {
150
+ display: block;
151
+ background:#fcc;
152
+ border-left: 3px double #bbb;
153
+ font-style: italic;
154
+ padding: 4px 1em 4px 4px;
155
+ margin-top: 4px;
156
+ margin-bottom: 4px;
157
+ }
158
+ img:hover{
159
+ transition: 0.3s;
160
+ }
161
+ img{
162
+ opacity: 0.9;
163
+ cursor: pointer;
164
+ }
165
+ #modal_image_id{
166
+ cursor: default;
167
+ }
168
+ #closed_nav_pane{
169
+ padding: 0px;
170
+ background: #169;
171
+ border: 0px;
172
+ position: fixed;
173
+ width: 5px;
174
+ height: 100%; /* 100% Full-height */
175
+ visibility: visible;
176
+ cursor: pointer;
177
+ }
178
+ #closed_nav_pane:hover{
179
+ width: 10px;
180
+ }
181
+ #nav_pane{
182
+ flex-shrink: 0;
183
+ padding: 32px 8px 8px 8px;
184
+ background: #EEEEEE;
185
+ border: 1px solid #ddd;
186
+ position: fixed;
187
+ height: 100%; /* 100% Full-height */
188
+ visibility: hidden;
189
+ z-index: 1;
190
+ overflow-y: auto;
191
+ cursor: pointer;
192
+ }
193
+ @media screen and (min-width: 0px) and (max-width: 1089px) {#nav_pane{width: 22%;}}
194
+ @media screen and (min-width: 1090px) and (max-width: 1279px) {#nav_pane{width: 240px;}}
195
+ @media screen and (min-width: 1280px) and (max-width: 1599px) {#nav_pane{width: 280px;}}
196
+ @media screen and (min-width: 1600px) and (max-width: 1919px) {#nav_pane{width: 320px;}}
197
+ @media screen and (min-width: 1920px) and (max-width: 2559px) {#nav_pane{width: 360px;}}
198
+ @media screen and (min-width: 2560px) {#nav_pane{width: 380px;}}
199
+
200
+ #top_nav{
201
+ background-color: #169;
202
+ overflow: hidden;
203
+ position: fixed;
204
+ width: 100%;
205
+ z-index: 2;
206
+ }
207
+ #top_nav a {
208
+ float: left;
209
+ color: white;
210
+ text-align: center;
211
+ padding: 4px 6px;
212
+ text-decoration: none;
213
+ font-size: 1.5em;
214
+ font-family: "Trebuchet MS", Verdana, sans-serif;
215
+ }
216
+ #top_nav a.split {
217
+ float: right;
218
+ color: white;
219
+ text-align: center;
220
+ padding: 4px 6px;
221
+ text-decoration: none;
222
+ font-size: 1.5em;
223
+ font-family: "Trebuchet MS", Verdana, sans-serif;
224
+ }
225
+ #top_nav a:hover {
226
+ background-color: black;
227
+ color: white;
228
+ }
229
+ #top_nav a.active {
230
+ background-color: #169;
231
+ color: white;
232
+ }
233
+ #searchInput{
234
+ float: left;
235
+ margin: 4px 6px;
236
+ text-decoration: none;
237
+ }
238
+ .modal {
239
+ display: none; /* Hidden by default */
240
+ position: fixed; /* Stay in place */
241
+ z-index: 1; /* Sit on top */
242
+ padding-top: 100px; /* Location of the box */
243
+ left: 0;
244
+ top: 0;
245
+ width: 100%; /* Full width */
246
+ height: 100%; /* Full height */
247
+ overflow: auto; /* Enable scroll if needed */
248
+ background-color: rgb(0,0,0); /* Fallback color */
249
+ background-color: rgba(0,0,0,0.9); /* Black w/ opacity */
250
+ }
251
+ .modal_image {
252
+ margin: auto;
253
+ display: block;
254
+ width: 97%;
255
+ /*max-width: 700px;*/
256
+ }
257
+ #modal_image_caption {
258
+ margin: auto;
259
+ display: block;
260
+ width: 80%;
261
+ max-width: 700px;
262
+ text-align: center;
263
+ color: #ccc;
264
+ padding: 10px 0;
265
+ height: 150px;
266
+ }
267
+ .modal_image, #modal_image_caption {
268
+ animation-name: zoom;
269
+ animation-duration: 0.6s;
270
+ }
271
+ @keyframes zoom {
272
+ from {transform: scale(0.1)}
273
+ to {transform: scale(1)}
274
+ }
275
+ .modal_close_btn {
276
+ position: absolute;
277
+ top: 15px;
278
+ right: 35px;
279
+ color: #f1f1f1;
280
+ font-size: 30px;
281
+ font-weight: bold;
282
+ transition: 0.3s;
283
+ }
284
+ .modal_close_btn:hover,
285
+ .modal_close_btn:focus {
286
+ color: #bbb;
287
+ text-decoration: none;
288
+ cursor: pointer;
289
+ }
290
+ #footer {
291
+ clear: both;
292
+ border-top: 1px solid #bbb;
293
+ font-size: 0.9em;
294
+ color: #aaa;
295
+ padding: 5px;
296
+ text-align:center;
297
+ background:#fff;
298
+ }
@@ -0,0 +1,40 @@
1
+ /* Dropdown Content (Hidden by Default) */
2
+ .search-results-content {
3
+ display: none;
4
+ position: absolute;
5
+ background-color: #f6f6f6;
6
+ min-width: 600px;
7
+ border: 1px solid #ddd;
8
+ z-index: 2;
9
+ }
10
+
11
+ /* Links inside the dropdown
12
+ .search-results-content a, a:link, a:visited {
13
+ color: #169;
14
+ text-decoration: none;
15
+ display: inline-block;
16
+ }*/
17
+
18
+ div.search-item {
19
+ padding: 2px;
20
+ text-align:left;
21
+ vertical-align:middle;
22
+ padding-right:10px;
23
+ border: 1px solid #bbb;
24
+ }
25
+ table.search-result-table{
26
+ border: 0;
27
+ margin: 0;
28
+ border-collapse: collapse;
29
+ width: 100%;
30
+ margin-bottom: 0px;
31
+ border-spacing: 0px;
32
+ overflow: hidden;
33
+ }
34
+ table.search-result-table td {
35
+ padding: 4px;
36
+ width: 50%;
37
+ text-align:left;
38
+ vertical-align:middle;
39
+ padding-right:10px;
40
+ }