Almirah 0.1.9 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+ }