pmdtester 1.0.0 → 1.2.0
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/.ci/build.sh +99 -0
- data/.ci/inc/fetch_ci_scripts.bash +19 -0
- data/.ci/manual-integration-tests.sh +37 -0
- data/.github/workflows/build.yml +55 -0
- data/.github/workflows/manual-integration-tests.yml +43 -0
- data/.gitignore +9 -0
- data/.hoerc +1 -1
- data/.rubocop.yml +9 -2
- data/.ruby-version +1 -0
- data/History.md +79 -0
- data/Manifest.txt +28 -9
- data/README.rdoc +59 -33
- data/Rakefile +7 -5
- data/config/all-java.xml +1 -1
- data/config/design.xml +1 -1
- data/config/project-list.xml +8 -7
- data/config/projectlist_1_0_0.xsd +2 -1
- data/config/projectlist_1_1_0.xsd +31 -0
- data/config/projectlist_1_2_0.xsd +39 -0
- data/lib/pmdtester.rb +8 -7
- data/lib/pmdtester/builders/liquid_renderer.rb +130 -0
- data/lib/pmdtester/builders/pmd_report_builder.rb +107 -79
- data/lib/pmdtester/builders/project_builder.rb +105 -0
- data/lib/pmdtester/builders/project_hasher.rb +128 -0
- data/lib/pmdtester/builders/rule_set_builder.rb +96 -47
- data/lib/pmdtester/builders/simple_progress_logger.rb +4 -4
- data/lib/pmdtester/builders/summary_report_builder.rb +63 -131
- data/lib/pmdtester/collection_by_file.rb +55 -0
- data/lib/pmdtester/parsers/options.rb +24 -0
- data/lib/pmdtester/parsers/pmd_report_document.rb +72 -28
- data/lib/pmdtester/parsers/projects_parser.rb +2 -4
- data/lib/pmdtester/pmd_branch_detail.rb +35 -19
- data/lib/pmdtester/pmd_configerror.rb +23 -24
- data/lib/pmdtester/pmd_error.rb +34 -34
- data/lib/pmdtester/pmd_report_detail.rb +10 -13
- data/lib/pmdtester/pmd_tester_utils.rb +58 -0
- data/lib/pmdtester/pmd_violation.rb +66 -28
- data/lib/pmdtester/project.rb +42 -56
- data/lib/pmdtester/report_diff.rb +203 -109
- data/lib/pmdtester/resource_locator.rb +4 -0
- data/lib/pmdtester/runner.rb +67 -64
- data/pmdtester.gemspec +28 -37
- data/resources/_includes/diff_pill_row.html +6 -0
- data/resources/css/bootstrap.min.css +7 -0
- data/resources/css/datatables.min.css +36 -0
- data/resources/css/pmd-tester.css +132 -0
- data/resources/js/bootstrap.min.js +7 -0
- data/resources/js/code-snippets.js +73 -0
- data/resources/js/datatables.min.js +726 -0
- data/resources/js/jquery-3.2.1.slim.min.js +4 -0
- data/resources/js/jquery.min.js +2 -0
- data/resources/js/popper.min.js +5 -0
- data/resources/js/project-report.js +137 -0
- data/resources/project_diff_report.html +214 -0
- data/resources/project_index.html +113 -0
- data/resources/project_pmd_report.html +186 -0
- metadata +73 -25
- data/.travis.yml +0 -40
- data/lib/pmdtester/builders/diff_builder.rb +0 -31
- data/lib/pmdtester/builders/diff_report/configerrors.rb +0 -50
- data/lib/pmdtester/builders/diff_report/errors.rb +0 -71
- data/lib/pmdtester/builders/diff_report/violations.rb +0 -77
- data/lib/pmdtester/builders/diff_report_builder.rb +0 -99
- data/lib/pmdtester/builders/html_report_builder.rb +0 -56
- data/resources/css/maven-base.css +0 -155
- data/resources/css/maven-theme.css +0 -171
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Contains methods to write out html for the configuration errors.
|
4
|
-
# This mixin is used by DiffReportBuilder.
|
5
|
-
module DiffReportBuilderConfigErrors
|
6
|
-
def build_configerrors_section(doc, configerrors_diffs)
|
7
|
-
doc.div(class: 'section', id: 'configerrors') do
|
8
|
-
doc.h2 'Configuration Errors:'
|
9
|
-
|
10
|
-
doc.h3 PmdTester::HtmlReportBuilder::NO_DIFFERENCES_MESSAGE if configerrors_diffs.empty?
|
11
|
-
configerrors_diffs.each do |key, value|
|
12
|
-
doc.div(class: 'section') do
|
13
|
-
doc.h3 key
|
14
|
-
build_configerrors_table(doc, value)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def build_configerrors_table(doc, errors)
|
21
|
-
doc.table(class: 'bodyTable', border: '0') do
|
22
|
-
build_configerrors_table_head(doc)
|
23
|
-
build_configerrors_table_body(doc, errors)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def build_configerrors_table_head(doc)
|
28
|
-
build_table_head(doc, '', 'Rule', 'Message')
|
29
|
-
end
|
30
|
-
|
31
|
-
def build_configerrors_table_body(doc, errors)
|
32
|
-
doc.tbody do
|
33
|
-
errors.each { |pmd_configerror| build_configerrors_table_row(doc, pmd_configerror) }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def build_configerrors_table_row(doc, pmd_configerror)
|
38
|
-
doc.tr(class: pmd_configerror.branch == PmdTester::BASE ? 'b' : 'a') do
|
39
|
-
build_table_anchor_column(doc, 'C', increment_configerror_index)
|
40
|
-
|
41
|
-
doc.td pmd_configerror.rulename
|
42
|
-
doc.td pmd_configerror.msg
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def increment_configerror_index
|
47
|
-
@configerror_index ||= 0 # init with 0
|
48
|
-
@configerror_index += 1
|
49
|
-
end
|
50
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Contains methods to write out html for the errors.
|
4
|
-
# This mixin is used by DiffReportBuilder.
|
5
|
-
module DiffReportBuilderErrors
|
6
|
-
def build_errors_section(doc, error_diffs)
|
7
|
-
doc.div(class: 'section', id: 'Errors') do
|
8
|
-
doc.h2 'Errors:'
|
9
|
-
|
10
|
-
doc.h3 PmdTester::HtmlReportBuilder::NO_DIFFERENCES_MESSAGE if error_diffs.empty?
|
11
|
-
error_diffs.each do |key, value|
|
12
|
-
doc.div(class: 'section') do
|
13
|
-
build_filename_h3(doc, key)
|
14
|
-
build_errors_table(doc, value)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def build_errors_table(doc, errors)
|
21
|
-
doc.table(class: 'bodyTable', border: '0') do
|
22
|
-
build_errors_table_head(doc)
|
23
|
-
build_errors_table_body(doc, errors)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def build_errors_table_head(doc)
|
28
|
-
build_table_head(doc, '', 'Message', 'Details')
|
29
|
-
end
|
30
|
-
|
31
|
-
def build_errors_table_body(doc, errors)
|
32
|
-
if PmdTester::ReportDiff.comparable?(errors)
|
33
|
-
# we have only two errors and those are from base and patch, so we
|
34
|
-
# can compare them and display a nice diff
|
35
|
-
pmd_error_a = errors[0]
|
36
|
-
pmd_error_b = errors[1]
|
37
|
-
diff_a = Differ.diff_by_line(pmd_error_a.text, pmd_error_b.text).format_as(:html)
|
38
|
-
diff_b = Differ.diff_by_line(pmd_error_b.text, pmd_error_a.text).format_as(:html)
|
39
|
-
doc.tbody do
|
40
|
-
build_errors_table_row(doc, pmd_error_a, diff_a)
|
41
|
-
build_errors_table_row(doc, pmd_error_b, diff_b)
|
42
|
-
end
|
43
|
-
else
|
44
|
-
# many errors, just report them one by one
|
45
|
-
doc.tbody do
|
46
|
-
errors.each { |pmd_error| build_errors_table_row(doc, pmd_error) }
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def build_errors_table_row(doc, pmd_error, text = nil)
|
52
|
-
doc.tr(class: pmd_error.branch == PmdTester::BASE ? 'b' : 'a') do
|
53
|
-
build_table_anchor_column(doc, 'B', increment_error_index)
|
54
|
-
|
55
|
-
text = pmd_error.text if text.nil?
|
56
|
-
|
57
|
-
# The error message
|
58
|
-
doc.td pmd_error.msg
|
59
|
-
doc.td do
|
60
|
-
doc.pre do
|
61
|
-
doc << text
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def increment_error_index
|
68
|
-
@error_index ||= 0 # init with 0
|
69
|
-
@error_index += 1
|
70
|
-
end
|
71
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Contains methods to write out html for the violations.
|
4
|
-
# This mixin is used by DiffReportBuilder.
|
5
|
-
module DiffReportBuilderViolations
|
6
|
-
def build_violations_section(doc, violation_diffs)
|
7
|
-
doc.div(class: 'section', id: 'Violations') do
|
8
|
-
doc.h2 'Violations:'
|
9
|
-
|
10
|
-
doc.h3 PmdTester::HtmlReportBuilder::NO_DIFFERENCES_MESSAGE if violation_diffs.empty?
|
11
|
-
violation_diffs.each do |key, value|
|
12
|
-
doc.div(class: 'section') do
|
13
|
-
build_filename_h3(doc, key)
|
14
|
-
build_violation_table(doc, key, value)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def build_violation_table(doc, key, value)
|
21
|
-
doc.table(class: 'bodyTable', border: '0') do
|
22
|
-
build_violation_table_head(doc)
|
23
|
-
build_violation_table_body(doc, key, value)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def build_violation_table_head(doc)
|
28
|
-
build_table_head(doc, '', 'Priority', 'Rule', 'Message', 'Line')
|
29
|
-
end
|
30
|
-
|
31
|
-
def build_violation_table_body(doc, key, value)
|
32
|
-
doc.tbody do
|
33
|
-
value.each do |pmd_violation|
|
34
|
-
build_violation_table_row(doc, key, pmd_violation)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def build_violation_table_row(doc, key, pmd_violation)
|
40
|
-
doc.tr(class: pmd_violation.branch == PmdTester::BASE ? 'b' : 'a') do
|
41
|
-
build_table_anchor_column(doc, 'A', increment_violation_index)
|
42
|
-
|
43
|
-
violation = pmd_violation.attrs
|
44
|
-
|
45
|
-
# The priority of the rule
|
46
|
-
doc.td violation['priority']
|
47
|
-
|
48
|
-
# The rule that trigger the violation
|
49
|
-
doc.td do
|
50
|
-
doc.a(href: (violation['externalInfoUrl']).to_s) { doc.text violation['rule'] }
|
51
|
-
end
|
52
|
-
|
53
|
-
# The violation message
|
54
|
-
doc.td pmd_violation.text
|
55
|
-
|
56
|
-
# The begin line of the violation
|
57
|
-
line = violation['beginline']
|
58
|
-
|
59
|
-
# The link to the source file
|
60
|
-
doc.td do
|
61
|
-
link = get_link_to_source(violation, key)
|
62
|
-
doc.a(href: link.to_s) { doc.text line }
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def get_link_to_source(violation, key)
|
68
|
-
l_str = @project.type == 'git' ? 'L' : 'l'
|
69
|
-
line_str = "##{l_str}#{violation['beginline']}"
|
70
|
-
@project.get_webview_url(key) + line_str
|
71
|
-
end
|
72
|
-
|
73
|
-
def increment_violation_index
|
74
|
-
@violation_index ||= 0 # init with 0
|
75
|
-
@violation_index += 1
|
76
|
-
end
|
77
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'nokogiri'
|
4
|
-
require 'differ'
|
5
|
-
|
6
|
-
module PmdTester
|
7
|
-
# Building diff report for a single project
|
8
|
-
class DiffReportBuilder < HtmlReportBuilder
|
9
|
-
include PmdTester
|
10
|
-
include DiffReportBuilderViolations
|
11
|
-
include DiffReportBuilderErrors
|
12
|
-
include DiffReportBuilderConfigErrors
|
13
|
-
|
14
|
-
def build(project)
|
15
|
-
@project = project
|
16
|
-
@report_diff = project.report_diff
|
17
|
-
|
18
|
-
index = File.new(project.diff_report_index_path, 'w')
|
19
|
-
|
20
|
-
html_report = build_html_report('pmd xml difference report')
|
21
|
-
copy_css(project.target_diff_report_path)
|
22
|
-
|
23
|
-
index.puts html_report
|
24
|
-
index.close
|
25
|
-
|
26
|
-
logger.info "Built difference report of #{project.name} successfully!"
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_body(doc)
|
30
|
-
violation_diffs = @report_diff.violation_diffs
|
31
|
-
error_diffs = @report_diff.error_diffs
|
32
|
-
configerrors_diffs = @report_diff.configerrors_diffs
|
33
|
-
doc.body(class: 'composite') do
|
34
|
-
doc.div(id: 'contentBox') do
|
35
|
-
build_summary_section(doc)
|
36
|
-
build_violations_section(doc, violation_diffs)
|
37
|
-
build_errors_section(doc, error_diffs)
|
38
|
-
build_configerrors_section(doc, configerrors_diffs)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def build_summary_section(doc)
|
44
|
-
doc.div(class: 'section', id: 'Summary') do
|
45
|
-
doc.h2 'Summary:'
|
46
|
-
build_summary_table(doc)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def build_summary_table(doc)
|
51
|
-
doc.table(class: 'bodyTable', border: '0') do
|
52
|
-
build_table_head(doc, 'Item', 'Base', 'Patch', 'Difference')
|
53
|
-
build_summary_table_body(doc)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def build_summary_table_body(doc)
|
58
|
-
doc.tbody do
|
59
|
-
build_summary_row(doc, 'number of errors', @report_diff.base_errors_size,
|
60
|
-
@report_diff.patch_errors_size, @report_diff.removed_errors_size,
|
61
|
-
@report_diff.new_errors_size)
|
62
|
-
build_summary_row(doc, 'number of violations', @report_diff.base_violations_size,
|
63
|
-
@report_diff.patch_violations_size, @report_diff.removed_violations_size,
|
64
|
-
@report_diff.new_violations_size)
|
65
|
-
build_summary_row(doc, 'number of config errors', @report_diff.base_configerrors_size,
|
66
|
-
@report_diff.patch_configerrors_size,
|
67
|
-
@report_diff.removed_configerrors_size,
|
68
|
-
@report_diff.new_configerrors_size)
|
69
|
-
build_summary_row(doc, 'execution time', @report_diff.base_execution_time,
|
70
|
-
@report_diff.patch_execution_time, @report_diff.diff_execution_time)
|
71
|
-
build_summary_row(doc, 'timestamp', @report_diff.base_timestamp,
|
72
|
-
@report_diff.patch_timestamp, '')
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def build_summary_row(doc, item, base, patch, *diff)
|
77
|
-
doc.tr do
|
78
|
-
doc.td(class: 'c') { doc.text item }
|
79
|
-
doc.td(class: 'b') { doc.text base }
|
80
|
-
doc.td(class: 'a') { doc.text patch }
|
81
|
-
doc.td(class: 'c') do
|
82
|
-
if diff.size == 1
|
83
|
-
doc.text diff[0]
|
84
|
-
else
|
85
|
-
build_table_content_for(doc, diff[0], diff[1])
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def build_filename_h3(doc, filename)
|
92
|
-
doc.h3 do
|
93
|
-
doc.a(href: @project.get_webview_url(filename)) do
|
94
|
-
doc.text @project.get_path_inside_project(filename)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module PmdTester
|
4
|
-
# This class is the parent of all classes which is used to build html report
|
5
|
-
class HtmlReportBuilder
|
6
|
-
CSS_SRC_DIR = ResourceLocator.locate('resources/css')
|
7
|
-
NO_DIFFERENCES_MESSAGE = 'No differences found!'
|
8
|
-
|
9
|
-
def build_html_report(title_name)
|
10
|
-
html_builder = Nokogiri::HTML::Builder.new do |doc|
|
11
|
-
doc.html do
|
12
|
-
build_head(doc, title_name)
|
13
|
-
build_body(doc)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
html_builder.to_html
|
17
|
-
end
|
18
|
-
|
19
|
-
def build_head(doc, title_name)
|
20
|
-
doc.head do
|
21
|
-
doc.title title_name
|
22
|
-
|
23
|
-
doc.style(type: 'text/css', media: 'all') do
|
24
|
-
doc.text '@import url("./css/maven-base.css");@import url("./css/maven-theme.css");'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_table_head(doc, *columns)
|
30
|
-
doc.thead do
|
31
|
-
doc.tr do
|
32
|
-
columns.each do |column|
|
33
|
-
doc.th column
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def build_table_anchor_column(doc, prefix, index)
|
40
|
-
doc.td do
|
41
|
-
doc.a(id: "#{prefix}#{index}", href: "##{prefix}#{index}") { doc.text '#' }
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def copy_css(report_dir)
|
46
|
-
css_dest_dir = "#{report_dir}/css"
|
47
|
-
FileUtils.copy_entry(CSS_SRC_DIR, css_dest_dir)
|
48
|
-
end
|
49
|
-
|
50
|
-
def build_table_content_for(doc, removed_size, new_size)
|
51
|
-
doc.font(color: 'red') { doc.text "-#{removed_size}" }
|
52
|
-
doc.text ' | '
|
53
|
-
doc.font(color: 'green') { doc.text "+#{new_size}" }
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,155 +0,0 @@
|
|
1
|
-
body {
|
2
|
-
margin: 0px;
|
3
|
-
padding: 0px;
|
4
|
-
}
|
5
|
-
img {
|
6
|
-
border:none;
|
7
|
-
}
|
8
|
-
table {
|
9
|
-
padding:0px;
|
10
|
-
width: 100%;
|
11
|
-
margin-left: -2px;
|
12
|
-
margin-right: -2px;
|
13
|
-
}
|
14
|
-
acronym {
|
15
|
-
cursor: help;
|
16
|
-
border-bottom: 1px dotted #feb;
|
17
|
-
}
|
18
|
-
table.bodyTable th, table.bodyTable td {
|
19
|
-
padding: 2px 4px 2px 4px;
|
20
|
-
vertical-align: top;
|
21
|
-
}
|
22
|
-
div.clear{
|
23
|
-
clear:both;
|
24
|
-
visibility: hidden;
|
25
|
-
}
|
26
|
-
div.clear hr{
|
27
|
-
display: none;
|
28
|
-
}
|
29
|
-
#bannerLeft, #bannerRight {
|
30
|
-
font-size: xx-large;
|
31
|
-
font-weight: bold;
|
32
|
-
}
|
33
|
-
#bannerLeft img, #bannerRight img {
|
34
|
-
margin: 0px;
|
35
|
-
}
|
36
|
-
.xleft, #bannerLeft img {
|
37
|
-
float:left;
|
38
|
-
}
|
39
|
-
.xright, #bannerRight {
|
40
|
-
float:right;
|
41
|
-
}
|
42
|
-
#banner {
|
43
|
-
padding: 0px;
|
44
|
-
}
|
45
|
-
#banner img {
|
46
|
-
border: none;
|
47
|
-
}
|
48
|
-
#breadcrumbs {
|
49
|
-
padding: 3px 10px 3px 10px;
|
50
|
-
}
|
51
|
-
#leftColumn {
|
52
|
-
width: 170px;
|
53
|
-
float:left;
|
54
|
-
overflow: auto;
|
55
|
-
}
|
56
|
-
#bodyColumn {
|
57
|
-
margin-right: 1.5em;
|
58
|
-
margin-left: 197px;
|
59
|
-
}
|
60
|
-
#legend {
|
61
|
-
padding: 8px 0 8px 0;
|
62
|
-
}
|
63
|
-
#navcolumn {
|
64
|
-
padding: 8px 4px 0 8px;
|
65
|
-
}
|
66
|
-
#navcolumn h5 {
|
67
|
-
margin: 0;
|
68
|
-
padding: 0;
|
69
|
-
font-size: small;
|
70
|
-
}
|
71
|
-
#navcolumn ul {
|
72
|
-
margin: 0;
|
73
|
-
padding: 0;
|
74
|
-
font-size: small;
|
75
|
-
}
|
76
|
-
#navcolumn li {
|
77
|
-
list-style-type: none;
|
78
|
-
background-image: none;
|
79
|
-
background-repeat: no-repeat;
|
80
|
-
background-position: 0 0.4em;
|
81
|
-
padding-left: 16px;
|
82
|
-
list-style-position: outside;
|
83
|
-
line-height: 1.2em;
|
84
|
-
font-size: smaller;
|
85
|
-
}
|
86
|
-
#navcolumn li.expanded {
|
87
|
-
background-image: url(../images/expanded.gif);
|
88
|
-
}
|
89
|
-
#navcolumn li.collapsed {
|
90
|
-
background-image: url(../images/collapsed.gif);
|
91
|
-
}
|
92
|
-
#navcolumn li.none {
|
93
|
-
text-indent: -1em;
|
94
|
-
margin-left: 1em;
|
95
|
-
}
|
96
|
-
#poweredBy {
|
97
|
-
text-align: center;
|
98
|
-
}
|
99
|
-
#navcolumn img {
|
100
|
-
margin-top: 10px;
|
101
|
-
margin-bottom: 3px;
|
102
|
-
}
|
103
|
-
#poweredBy img {
|
104
|
-
display:block;
|
105
|
-
margin: 20px 0 20px 17px;
|
106
|
-
}
|
107
|
-
#search img {
|
108
|
-
margin: 0px;
|
109
|
-
display: block;
|
110
|
-
}
|
111
|
-
#search #q, #search #btnG {
|
112
|
-
border: 1px solid #999;
|
113
|
-
margin-bottom:10px;
|
114
|
-
}
|
115
|
-
#search form {
|
116
|
-
margin: 0px;
|
117
|
-
}
|
118
|
-
#lastPublished {
|
119
|
-
font-size: x-small;
|
120
|
-
}
|
121
|
-
.navSection {
|
122
|
-
margin-bottom: 2px;
|
123
|
-
padding: 8px;
|
124
|
-
}
|
125
|
-
.navSectionHead {
|
126
|
-
font-weight: bold;
|
127
|
-
font-size: x-small;
|
128
|
-
}
|
129
|
-
.section {
|
130
|
-
padding: 4px;
|
131
|
-
}
|
132
|
-
#footer {
|
133
|
-
padding: 3px 10px 3px 10px;
|
134
|
-
font-size: x-small;
|
135
|
-
}
|
136
|
-
#breadcrumbs {
|
137
|
-
font-size: x-small;
|
138
|
-
margin: 0pt;
|
139
|
-
}
|
140
|
-
.source {
|
141
|
-
padding: 12px;
|
142
|
-
margin: 1em 7px 1em 7px;
|
143
|
-
}
|
144
|
-
.source pre {
|
145
|
-
margin: 0px;
|
146
|
-
padding: 0px;
|
147
|
-
}
|
148
|
-
#navcolumn img.imageLink, .imageLink {
|
149
|
-
padding-left: 0px;
|
150
|
-
padding-bottom: 0px;
|
151
|
-
padding-top: 0px;
|
152
|
-
padding-right: 2px;
|
153
|
-
border: 0px;
|
154
|
-
margin: 0px;
|
155
|
-
}
|