blueprintr 0.1.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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +35 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/bin/blueprintr +3 -0
- data/blueprintr.gemspec +119 -0
- data/lib/blueprint-css/.gitignore +5 -0
- data/lib/blueprint-css/AUTHORS.textile +42 -0
- data/lib/blueprint-css/CHANGELOG +159 -0
- data/lib/blueprint-css/LICENSE +314 -0
- data/lib/blueprint-css/README.textile +81 -0
- data/lib/blueprint-css/TUTORIAL.textile +206 -0
- data/lib/blueprint-css/blueprint/ie.css +35 -0
- data/lib/blueprint-css/blueprint/plugins/buttons/icons/cross.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/buttons/icons/key.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/buttons/icons/tick.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/buttons/readme.txt +32 -0
- data/lib/blueprint-css/blueprint/plugins/buttons/screen.css +97 -0
- data/lib/blueprint-css/blueprint/plugins/fancy-type/readme.txt +14 -0
- data/lib/blueprint-css/blueprint/plugins/fancy-type/screen.css +71 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/doc.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/email.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/external.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/feed.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/im.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/pdf.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/visited.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/icons/xls.png +0 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/readme.txt +18 -0
- data/lib/blueprint-css/blueprint/plugins/link-icons/screen.css +40 -0
- data/lib/blueprint-css/blueprint/plugins/rtl/readme.txt +10 -0
- data/lib/blueprint-css/blueprint/plugins/rtl/screen.css +110 -0
- data/lib/blueprint-css/blueprint/print.css +29 -0
- data/lib/blueprint-css/blueprint/screen.css +258 -0
- data/lib/blueprint-css/blueprint/src/forms.css +65 -0
- data/lib/blueprint-css/blueprint/src/grid.css +280 -0
- data/lib/blueprint-css/blueprint/src/grid.png +0 -0
- data/lib/blueprint-css/blueprint/src/ie.css +76 -0
- data/lib/blueprint-css/blueprint/src/print.css +85 -0
- data/lib/blueprint-css/blueprint/src/reset.css +45 -0
- data/lib/blueprint-css/blueprint/src/typography.css +106 -0
- data/lib/blueprint-css/lib/blueprint/blueprint.rb +39 -0
- data/lib/blueprint-css/lib/blueprint/compressor.rb +265 -0
- data/lib/blueprint-css/lib/blueprint/core_ext.rb +39 -0
- data/lib/blueprint-css/lib/blueprint/css_parser.rb +69 -0
- data/lib/blueprint-css/lib/blueprint/custom_layout.rb +71 -0
- data/lib/blueprint-css/lib/blueprint/grid.css.erb +146 -0
- data/lib/blueprint-css/lib/blueprint/grid_builder.rb +54 -0
- data/lib/blueprint-css/lib/blueprint/namespace.rb +38 -0
- data/lib/blueprint-css/lib/blueprint/semantic_class_names.rb +57 -0
- data/lib/blueprint-css/lib/blueprint/validate/COPYRIGHT.html +93 -0
- data/lib/blueprint-css/lib/blueprint/validate/JIGSAW_COPYRIGHT +64 -0
- data/lib/blueprint-css/lib/blueprint/validate/README.html +83 -0
- data/lib/blueprint-css/lib/blueprint/validate/XERCES_COPYING.txt +56 -0
- data/lib/blueprint-css/lib/blueprint/validate/css-validator-javadoc.jar +0 -0
- data/lib/blueprint-css/lib/blueprint/validate/css-validator.jar +0 -0
- data/lib/blueprint-css/lib/blueprint/validate/jigsaw.jar +0 -0
- data/lib/blueprint-css/lib/blueprint/validate/xerces.jar +0 -0
- data/lib/blueprint-css/lib/blueprint/validator.rb +49 -0
- data/lib/blueprint-css/lib/compress.rb +149 -0
- data/lib/blueprint-css/lib/settings.example.yml +33 -0
- data/lib/blueprint-css/lib/validate.rb +15 -0
- data/lib/blueprint-css/templates/psd/fixed-width.psd +0 -0
- data/lib/blueprint-css/tests/index.html +83 -0
- data/lib/blueprint-css/tests/parts/elements.html +247 -0
- data/lib/blueprint-css/tests/parts/forms.html +191 -0
- data/lib/blueprint-css/tests/parts/grid.html +163 -0
- data/lib/blueprint-css/tests/parts/sample.html +75 -0
- data/lib/blueprint-css/tests/parts/test-small.jpg +0 -0
- data/lib/blueprint-css/tests/parts/test.jpg +0 -0
- data/lib/blueprint-css/tests/parts/valid.png +0 -0
- data/lib/blueprintr.rb +23 -0
- data/test/helper.rb +9 -0
- data/test/test_blueprintr.rb +14 -0
- metadata +139 -0
Binary file
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/* --------------------------------------------------------------
|
2
|
+
|
3
|
+
ie.css
|
4
|
+
|
5
|
+
Contains every hack for Internet Explorer,
|
6
|
+
so that our core files stay sweet and nimble.
|
7
|
+
|
8
|
+
-------------------------------------------------------------- */
|
9
|
+
|
10
|
+
/* Make sure the layout is centered in IE5 */
|
11
|
+
body { text-align: center; }
|
12
|
+
.container { text-align: left; }
|
13
|
+
|
14
|
+
/* Fixes IE margin bugs */
|
15
|
+
* html .column, * html .span-1, * html .span-2,
|
16
|
+
* html .span-3, * html .span-4, * html .span-5,
|
17
|
+
* html .span-6, * html .span-7, * html .span-8,
|
18
|
+
* html .span-9, * html .span-10, * html .span-11,
|
19
|
+
* html .span-12, * html .span-13, * html .span-14,
|
20
|
+
* html .span-15, * html .span-16, * html .span-17,
|
21
|
+
* html .span-18, * html .span-19, * html .span-20,
|
22
|
+
* html .span-21, * html .span-22, * html .span-23,
|
23
|
+
* html .span-24 { display:inline; overflow-x: hidden; }
|
24
|
+
|
25
|
+
|
26
|
+
/* Elements
|
27
|
+
-------------------------------------------------------------- */
|
28
|
+
|
29
|
+
/* Fixes incorrect styling of legend in IE6. */
|
30
|
+
* html legend { margin:0px -8px 16px 0; padding:0; }
|
31
|
+
|
32
|
+
/* Fixes wrong line-height on sup/sub in IE. */
|
33
|
+
sup { vertical-align:text-top; }
|
34
|
+
sub { vertical-align:text-bottom; }
|
35
|
+
|
36
|
+
/* Fixes IE7 missing wrapping of code elements. */
|
37
|
+
html>body p code { *white-space: normal; }
|
38
|
+
|
39
|
+
/* IE 6&7 has problems with setting proper <hr> margins. */
|
40
|
+
hr { margin:-8px auto 11px; }
|
41
|
+
|
42
|
+
/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */
|
43
|
+
img { -ms-interpolation-mode:bicubic; }
|
44
|
+
|
45
|
+
/* Clearing
|
46
|
+
-------------------------------------------------------------- */
|
47
|
+
|
48
|
+
/* Makes clearfix actually work in IE */
|
49
|
+
.clearfix, .container { display:inline-block; }
|
50
|
+
* html .clearfix,
|
51
|
+
* html .container { height:1%; }
|
52
|
+
|
53
|
+
|
54
|
+
/* Forms
|
55
|
+
-------------------------------------------------------------- */
|
56
|
+
|
57
|
+
/* Fixes padding on fieldset */
|
58
|
+
fieldset { padding-top:0; }
|
59
|
+
|
60
|
+
/* Makes classic textareas in IE 6 resemble other browsers */
|
61
|
+
textarea { overflow:auto; }
|
62
|
+
|
63
|
+
/* Fixes rule that IE 6 ignores */
|
64
|
+
input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; }
|
65
|
+
input.text:focus, input.title:focus { border-color:#666; }
|
66
|
+
input.text, input.title, textarea, select { margin:0.5em 0; }
|
67
|
+
input.checkbox, input.radio { position:relative; top:.25em; }
|
68
|
+
|
69
|
+
/* Fixes alignment of inline form elements */
|
70
|
+
form.inline div, form.inline p { vertical-align:middle; }
|
71
|
+
form.inline label { position:relative;top:-0.25em; }
|
72
|
+
form.inline input.checkbox, form.inline input.radio,
|
73
|
+
form.inline input.button, form.inline button {
|
74
|
+
margin:0.5em 0;
|
75
|
+
}
|
76
|
+
button, input.button { position:relative;top:0.25em; }
|
@@ -0,0 +1,85 @@
|
|
1
|
+
/* --------------------------------------------------------------
|
2
|
+
|
3
|
+
print.css
|
4
|
+
* Gives you some sensible styles for printing pages.
|
5
|
+
* See Readme file in this directory for further instructions.
|
6
|
+
|
7
|
+
Some additions you'll want to make, customized to your markup:
|
8
|
+
#header, #footer, #navigation { display:none; }
|
9
|
+
|
10
|
+
-------------------------------------------------------------- */
|
11
|
+
|
12
|
+
body {
|
13
|
+
line-height: 1.5;
|
14
|
+
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
|
15
|
+
color:#000;
|
16
|
+
background: none;
|
17
|
+
font-size: 10pt;
|
18
|
+
}
|
19
|
+
|
20
|
+
|
21
|
+
/* Layout
|
22
|
+
-------------------------------------------------------------- */
|
23
|
+
|
24
|
+
.container {
|
25
|
+
background: none;
|
26
|
+
}
|
27
|
+
|
28
|
+
hr {
|
29
|
+
background:#ccc;
|
30
|
+
color:#ccc;
|
31
|
+
width:100%;
|
32
|
+
height:2px;
|
33
|
+
margin:2em 0;
|
34
|
+
padding:0;
|
35
|
+
border:none;
|
36
|
+
}
|
37
|
+
hr.space {
|
38
|
+
background: #fff;
|
39
|
+
color: #fff;
|
40
|
+
visibility: hidden;
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
/* Text
|
45
|
+
-------------------------------------------------------------- */
|
46
|
+
|
47
|
+
h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; }
|
48
|
+
code { font:.9em "Courier New", Monaco, Courier, monospace; }
|
49
|
+
|
50
|
+
a img { border:none; }
|
51
|
+
p img.top { margin-top: 0; }
|
52
|
+
|
53
|
+
blockquote {
|
54
|
+
margin:1.5em;
|
55
|
+
padding:1em;
|
56
|
+
font-style:italic;
|
57
|
+
font-size:.9em;
|
58
|
+
}
|
59
|
+
|
60
|
+
.small { font-size: .9em; }
|
61
|
+
.large { font-size: 1.1em; }
|
62
|
+
.quiet { color: #999; }
|
63
|
+
.hide { display:none; }
|
64
|
+
|
65
|
+
|
66
|
+
/* Links
|
67
|
+
-------------------------------------------------------------- */
|
68
|
+
|
69
|
+
a:link, a:visited {
|
70
|
+
background: transparent;
|
71
|
+
font-weight:700;
|
72
|
+
text-decoration: underline;
|
73
|
+
}
|
74
|
+
|
75
|
+
a:link:after, a:visited:after {
|
76
|
+
content: " (" attr(href) ")";
|
77
|
+
font-size: 90%;
|
78
|
+
}
|
79
|
+
|
80
|
+
/* If you're having trouble printing relative links, uncomment and customize this:
|
81
|
+
(note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */
|
82
|
+
|
83
|
+
/* a[href^="/"]:after {
|
84
|
+
content: " (http://www.yourdomain.com" attr(href) ") ";
|
85
|
+
} */
|
@@ -0,0 +1,45 @@
|
|
1
|
+
/* --------------------------------------------------------------
|
2
|
+
|
3
|
+
reset.css
|
4
|
+
* Resets default browser CSS.
|
5
|
+
|
6
|
+
-------------------------------------------------------------- */
|
7
|
+
|
8
|
+
html, body, div, span, object, iframe,
|
9
|
+
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
10
|
+
a, abbr, acronym, address, code,
|
11
|
+
del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
|
12
|
+
fieldset, form, label, legend,
|
13
|
+
table, caption, tbody, tfoot, thead, tr, th, td,
|
14
|
+
article, aside, dialog, figure, footer, header,
|
15
|
+
hgroup, nav, section {
|
16
|
+
margin: 0;
|
17
|
+
padding: 0;
|
18
|
+
border: 0;
|
19
|
+
font-weight: inherit;
|
20
|
+
font-style: inherit;
|
21
|
+
font-size: 100%;
|
22
|
+
font-family: inherit;
|
23
|
+
vertical-align: baseline;
|
24
|
+
}
|
25
|
+
|
26
|
+
article, aside, dialog, figure, footer, header,
|
27
|
+
hgroup, nav, section {
|
28
|
+
display:block;
|
29
|
+
}
|
30
|
+
|
31
|
+
body {
|
32
|
+
line-height: 1.5;
|
33
|
+
}
|
34
|
+
|
35
|
+
/* Tables still need 'cellspacing="0"' in the markup. */
|
36
|
+
table { border-collapse: separate; border-spacing: 0; }
|
37
|
+
caption, th, td { text-align: left; font-weight: normal; }
|
38
|
+
table, td, th { vertical-align: middle; }
|
39
|
+
|
40
|
+
/* Remove possible quote marks (") from <q>, <blockquote>. */
|
41
|
+
blockquote:before, blockquote:after, q:before, q:after { content: ""; }
|
42
|
+
blockquote, q { quotes: "" ""; }
|
43
|
+
|
44
|
+
/* Remove annoying border on linked images. */
|
45
|
+
a img { border: none; }
|
@@ -0,0 +1,106 @@
|
|
1
|
+
/* --------------------------------------------------------------
|
2
|
+
|
3
|
+
typography.css
|
4
|
+
* Sets up some sensible default typography.
|
5
|
+
|
6
|
+
-------------------------------------------------------------- */
|
7
|
+
|
8
|
+
/* Default font settings.
|
9
|
+
The font-size percentage is of 16px. (0.75 * 16px = 12px) */
|
10
|
+
html { font-size:100.01%; }
|
11
|
+
body {
|
12
|
+
font-size: 75%;
|
13
|
+
color: #222;
|
14
|
+
background: #fff;
|
15
|
+
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
|
16
|
+
}
|
17
|
+
|
18
|
+
|
19
|
+
/* Headings
|
20
|
+
-------------------------------------------------------------- */
|
21
|
+
|
22
|
+
h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; }
|
23
|
+
|
24
|
+
h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
|
25
|
+
h2 { font-size: 2em; margin-bottom: 0.75em; }
|
26
|
+
h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
|
27
|
+
h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
|
28
|
+
h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
|
29
|
+
h6 { font-size: 1em; font-weight: bold; }
|
30
|
+
|
31
|
+
h1 img, h2 img, h3 img,
|
32
|
+
h4 img, h5 img, h6 img {
|
33
|
+
margin: 0;
|
34
|
+
}
|
35
|
+
|
36
|
+
|
37
|
+
/* Text elements
|
38
|
+
-------------------------------------------------------------- */
|
39
|
+
|
40
|
+
p { margin: 0 0 1.5em; }
|
41
|
+
p img.left { float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
|
42
|
+
p img.right { float: right; margin: 1.5em 0 1.5em 1.5em; }
|
43
|
+
|
44
|
+
a:focus,
|
45
|
+
a:hover { color: #000; }
|
46
|
+
a { color: #009; text-decoration: underline; }
|
47
|
+
|
48
|
+
blockquote { margin: 1.5em; color: #666; font-style: italic; }
|
49
|
+
strong { font-weight: bold; }
|
50
|
+
em,dfn { font-style: italic; }
|
51
|
+
dfn { font-weight: bold; }
|
52
|
+
sup, sub { line-height: 0; }
|
53
|
+
|
54
|
+
abbr,
|
55
|
+
acronym { border-bottom: 1px dotted #666; }
|
56
|
+
address { margin: 0 0 1.5em; font-style: italic; }
|
57
|
+
del { color:#666; }
|
58
|
+
|
59
|
+
pre { margin: 1.5em 0; white-space: pre; }
|
60
|
+
pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
|
61
|
+
|
62
|
+
|
63
|
+
/* Lists
|
64
|
+
-------------------------------------------------------------- */
|
65
|
+
|
66
|
+
li ul,
|
67
|
+
li ol { margin: 0; }
|
68
|
+
ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; }
|
69
|
+
|
70
|
+
ul { list-style-type: disc; }
|
71
|
+
ol { list-style-type: decimal; }
|
72
|
+
|
73
|
+
dl { margin: 0 0 1.5em 0; }
|
74
|
+
dl dt { font-weight: bold; }
|
75
|
+
dd { margin-left: 1.5em;}
|
76
|
+
|
77
|
+
|
78
|
+
/* Tables
|
79
|
+
-------------------------------------------------------------- */
|
80
|
+
|
81
|
+
table { margin-bottom: 1.4em; width:100%; }
|
82
|
+
th { font-weight: bold; }
|
83
|
+
thead th { background: #c3d9ff; }
|
84
|
+
th,td,caption { padding: 4px 10px 4px 5px; }
|
85
|
+
tr.even td { background: #e5ecf9; }
|
86
|
+
tfoot { font-style: italic; }
|
87
|
+
caption { background: #eee; }
|
88
|
+
|
89
|
+
|
90
|
+
/* Misc classes
|
91
|
+
-------------------------------------------------------------- */
|
92
|
+
|
93
|
+
.small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
|
94
|
+
.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
|
95
|
+
.hide { display: none; }
|
96
|
+
|
97
|
+
.quiet { color: #666; }
|
98
|
+
.loud { color: #000; }
|
99
|
+
.highlight { background:#ff0; }
|
100
|
+
.added { background:#060; color: #fff; }
|
101
|
+
.removed { background:#900; color: #fff; }
|
102
|
+
|
103
|
+
.first { margin-left:0; padding-left:0; }
|
104
|
+
.last { margin-right:0; padding-right:0; }
|
105
|
+
.top { margin-top:0; padding-top:0; }
|
106
|
+
.bottom { margin-bottom:0; padding-bottom:0; }
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
module Blueprint
|
3
|
+
# path to the root Blueprint directory
|
4
|
+
ROOT_PATH = File.join(File.expand_path(File.dirname(__FILE__)), "../../")
|
5
|
+
# path to where the Blueprint CSS files are stored
|
6
|
+
BLUEPRINT_ROOT_PATH = File.join(Blueprint::ROOT_PATH, 'blueprint')
|
7
|
+
# path to where the Blueprint CSS raw CSS files are stored
|
8
|
+
SOURCE_PATH = File.join(Blueprint::BLUEPRINT_ROOT_PATH, 'src')
|
9
|
+
# path to where the Blueprint CSS generated test files are stored
|
10
|
+
TEST_PATH = File.join(Blueprint::ROOT_PATH, 'tests')
|
11
|
+
# path to the root of the Blueprint scripts
|
12
|
+
LIB_PATH = File.join(Blueprint::ROOT_PATH, 'lib', 'blueprint')
|
13
|
+
# path to where Blueprint plugins are stored
|
14
|
+
PLUGINS_PATH = File.join(Blueprint::BLUEPRINT_ROOT_PATH, 'plugins')
|
15
|
+
# settings YAML file where custom user settings are saved
|
16
|
+
SETTINGS_FILE = File.join(Blueprint::ROOT_PATH, 'lib', 'settings.yml')
|
17
|
+
# path to validator jar file to validate generated CSS files
|
18
|
+
VALIDATOR_FILE = File.join(Blueprint::LIB_PATH, 'validate', 'css-validator.jar')
|
19
|
+
# hash of compressed and source CSS files
|
20
|
+
CSS_FILES = {
|
21
|
+
'screen.css' => ['reset.css', 'typography.css', 'forms.css', 'grid.css'],
|
22
|
+
'print.css' => ['print.css'],
|
23
|
+
'ie.css' => ['ie.css']
|
24
|
+
}
|
25
|
+
|
26
|
+
# default number of columns for Blueprint layout
|
27
|
+
COLUMN_COUNT = 24
|
28
|
+
# default column width (in pixels) for Blueprint layout
|
29
|
+
COLUMN_WIDTH = 30
|
30
|
+
# default gutter width (in pixels) for Blueprint layout
|
31
|
+
GUTTER_WIDTH = 10
|
32
|
+
|
33
|
+
INPUT_PADDING = 5
|
34
|
+
INPUT_BORDER = 1
|
35
|
+
end
|
36
|
+
|
37
|
+
Dir["#{File.join(Blueprint::LIB_PATH)}/*"].each do |file|
|
38
|
+
require "#{file}" if file =~ /\.rb$/ && file !~ /blueprint.rb/
|
39
|
+
end
|
@@ -0,0 +1,265 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'optparse'
|
3
|
+
module Blueprint
|
4
|
+
class Compressor
|
5
|
+
TEST_FILES = ['index.html',
|
6
|
+
'parts/elements.html',
|
7
|
+
'parts/forms.html',
|
8
|
+
'parts/grid.html',
|
9
|
+
'parts/sample.html']
|
10
|
+
|
11
|
+
attr_accessor :namespace, :custom_css, :custom_layout, :semantic_classes, :project_name, :plugins
|
12
|
+
attr_reader :custom_path, :loaded_from_settings, :destination_path, :script_name
|
13
|
+
|
14
|
+
# overridden setter method for destination_path
|
15
|
+
# also sets custom_path flag on Blueprint::Compressor instance
|
16
|
+
def destination_path=(path)
|
17
|
+
@destination_path = path
|
18
|
+
@custom_path = @destination_path != Blueprint::BLUEPRINT_ROOT_PATH
|
19
|
+
end
|
20
|
+
|
21
|
+
# constructor
|
22
|
+
def initialize
|
23
|
+
# set up defaults
|
24
|
+
@script_name = File.basename($0)
|
25
|
+
@loaded_from_settings = false
|
26
|
+
@settings_file = Blueprint::SETTINGS_FILE
|
27
|
+
self.namespace = ""
|
28
|
+
self.destination_path = Blueprint::BLUEPRINT_ROOT_PATH
|
29
|
+
self.custom_layout = CustomLayout.new
|
30
|
+
self.project_name = nil
|
31
|
+
self.custom_css = {}
|
32
|
+
self.semantic_classes = {}
|
33
|
+
self.plugins = []
|
34
|
+
|
35
|
+
self.options.parse!(ARGV)
|
36
|
+
initialize_project_from_yaml(self.project_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
# generates output CSS based on any args passed in
|
40
|
+
# overwrites any existing CSS, as well as grid.png and tests
|
41
|
+
def generate!
|
42
|
+
output_header # information to the user (in the console) describing custom settings
|
43
|
+
generate_css_files # loops through Blueprint::CSS_FILES to generate output CSS
|
44
|
+
generate_tests # updates HTML with custom namespaces in order to test the generated library. TODO: have tests kick out to custom location
|
45
|
+
output_footer # informs the user that the CSS generation process is complete
|
46
|
+
end
|
47
|
+
|
48
|
+
def options #:nodoc:#
|
49
|
+
OptionParser.new do |o|
|
50
|
+
o.set_summary_indent(' ')
|
51
|
+
o.banner = "Usage: #{@script_name} [options]"
|
52
|
+
o.define_head "Blueprint Compressor"
|
53
|
+
o.separator ""
|
54
|
+
o.separator "options"
|
55
|
+
o.on( "-fSETTINGS_FILE", "--settings_file=SETTINGS_FILE", String,
|
56
|
+
"Specify a non-default settings file path.") { |file| @settings_file = file }
|
57
|
+
o.on( "-oOUTPUT_PATH", "--output_path=OUTPUT_PATH", String,
|
58
|
+
"Define a different path to output generated CSS files to. Default is current working directory.") { |path| self.destination_path = path }
|
59
|
+
o.on( "-nBP_NAMESPACE", "--namespace=BP_NAMESPACE", String,
|
60
|
+
"Define a namespace prepended to all Blueprint classes (e.g. .your-ns-span-24)") { |ns| self.namespace = ns }
|
61
|
+
o.on( "-pPROJECT_NAME", "--project=PROJECT_NAME", String,
|
62
|
+
"If using the settings.yml file, PROJECT_NAME is the project name you want to export") {|project| @project_name = project }
|
63
|
+
o.on( "--column_width=COLUMN_WIDTH", Integer,
|
64
|
+
"Set a new column width (in pixels) for the output grid") {|cw| self.custom_layout.column_width = cw }
|
65
|
+
o.on( "--gutter_width=GUTTER_WIDTH", Integer,
|
66
|
+
"Set a new gutter width (in pixels) for the output grid") {|gw| self.custom_layout.gutter_width = gw }
|
67
|
+
o.on( "--column_count=COLUMN_COUNT", Integer,
|
68
|
+
"Set a new column count for the output grid") {|cc| self.custom_layout.column_count = cc }
|
69
|
+
#o.on("-v", "--verbose", "Turn on verbose output.") { |$verbose| }
|
70
|
+
o.on("-h", "--help", "Show this help message.") { puts o; exit }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
# attempts to load output settings from settings.yml
|
77
|
+
def initialize_project_from_yaml(project_name = nil)
|
78
|
+
# ensures project_name is set and settings.yml is present
|
79
|
+
return unless (project_name && File.exist?(@settings_file))
|
80
|
+
|
81
|
+
# loads yaml into hash
|
82
|
+
projects = YAML::load(File.path_to_string(@settings_file))
|
83
|
+
|
84
|
+
if (project = projects[project_name]) # checks to see if project info is present
|
85
|
+
self.namespace = project['namespace'] || ""
|
86
|
+
self.destination_path = (self.destination_path == Blueprint::BLUEPRINT_ROOT_PATH ? project['path'] : self.destination_path) || Blueprint::BLUEPRINT_ROOT_PATH
|
87
|
+
self.custom_css = project['custom_css'] || {}
|
88
|
+
self.semantic_classes = project['semantic_classes'] || {}
|
89
|
+
self.plugins = project['plugins'] || []
|
90
|
+
|
91
|
+
if (layout = project['custom_layout'])
|
92
|
+
self.custom_layout = CustomLayout.new(:column_count => layout['column_count'], :column_width => layout['column_width'], :gutter_width => layout['gutter_width'], :input_padding => layout['input_padding'], :input_border => layout['input_border'])
|
93
|
+
end
|
94
|
+
@loaded_from_settings = true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def generate_css_files
|
99
|
+
Blueprint::CSS_FILES.each do |output_file_name, css_source_file_names|
|
100
|
+
css_output_path = File.join(destination_path, output_file_name)
|
101
|
+
puts "\n Assembling to #{custom_path ? css_output_path : "default blueprint path"}"
|
102
|
+
|
103
|
+
# CSS file generation
|
104
|
+
css_output = css_file_header # header included on all three Blueprint-generated files
|
105
|
+
css_output += "\n\n"
|
106
|
+
|
107
|
+
# Iterate through src/ .css files and compile to individual core compressed file
|
108
|
+
css_source_file_names.each do |css_source_file|
|
109
|
+
puts " + src/#{css_source_file}"
|
110
|
+
css_output += "/* #{css_source_file} */\n" if css_source_file_names.any?
|
111
|
+
|
112
|
+
source_options = if self.custom_layout && css_source_file == 'grid.css'
|
113
|
+
self.custom_layout.generate_grid_css
|
114
|
+
else
|
115
|
+
File.path_to_string File.join(Blueprint::SOURCE_PATH, css_source_file)
|
116
|
+
end
|
117
|
+
|
118
|
+
css_output += Blueprint::CSSParser.new(source_options, :namespace => namespace).to_s
|
119
|
+
css_output += "\n"
|
120
|
+
end
|
121
|
+
|
122
|
+
#append CSS from plugins
|
123
|
+
css_output = append_plugin_css(css_output, output_file_name)
|
124
|
+
|
125
|
+
# append CSS from custom files
|
126
|
+
css_output = append_custom_css(css_output, output_file_name)
|
127
|
+
|
128
|
+
#save CSS to correct path, stripping out any extra whitespace at the end of the file
|
129
|
+
File.string_to_file(css_output.rstrip, css_output_path)
|
130
|
+
end
|
131
|
+
|
132
|
+
# append semantic class names if set
|
133
|
+
append_semantic_classes
|
134
|
+
|
135
|
+
#attempt to generate a grid.png file
|
136
|
+
if (grid_builder = GridBuilder.new(:column_width => self.custom_layout.column_width, :gutter_width => self.custom_layout.gutter_width, :output_path => File.join(self.destination_path, 'src')))
|
137
|
+
grid_builder.generate!
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def append_custom_css(css, current_file_name)
|
142
|
+
# check to see if a custom (non-default) location was used for output files
|
143
|
+
# if custom path is used, handle custom CSS, if any
|
144
|
+
return css unless self.custom_path and self.custom_css[current_file_name]
|
145
|
+
|
146
|
+
self.custom_css[current_file_name].each do |custom_css|
|
147
|
+
overwrite_base = custom_css || "my-#{current_file_name}"
|
148
|
+
overwrite_path = File.join(destination_path, overwrite_base)
|
149
|
+
overwrite_css = File.exists?(overwrite_path) ? File.path_to_string(overwrite_path) : ""
|
150
|
+
|
151
|
+
# if there's CSS present, add it to the CSS output
|
152
|
+
unless overwrite_css.blank?
|
153
|
+
puts " + custom styles (#{custom_css})\n"
|
154
|
+
css += "/* #{overwrite_base} */\n"
|
155
|
+
css += CSSParser.new(overwrite_css).to_s + "\n"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
css
|
160
|
+
end
|
161
|
+
|
162
|
+
def append_plugin_css(css, current_file_name)
|
163
|
+
return css unless self.plugins.any?
|
164
|
+
|
165
|
+
plugin_css = ""
|
166
|
+
|
167
|
+
self.plugins.each do |plugin|
|
168
|
+
plugin_file_specific = File.join(Blueprint::PLUGINS_PATH, plugin, current_file_name)
|
169
|
+
plugin_file_generic = File.join(Blueprint::PLUGINS_PATH, plugin, "#{plugin}.css")
|
170
|
+
|
171
|
+
file = if File.exists?(plugin_file_specific)
|
172
|
+
plugin_file_specific
|
173
|
+
elsif File.exists?(plugin_file_generic) && current_file_name =~ /^screen|print/
|
174
|
+
plugin_file_generic
|
175
|
+
end
|
176
|
+
|
177
|
+
if file
|
178
|
+
puts " + #{plugin} plugin\n"
|
179
|
+
plugin_css += "/* #{plugin} */\n"
|
180
|
+
plugin_css += CSSParser.new(File.path_to_string(file)).to_s + "\n"
|
181
|
+
|
182
|
+
Dir.glob(File.join(File.dirname(file), "**", "**")).each do |cp|
|
183
|
+
short_path = cp.gsub(/#{File.dirname(file)}./ , '')
|
184
|
+
# make directory if it doesn't exist
|
185
|
+
directory = File.dirname(short_path)
|
186
|
+
FileUtils.mkdir_p(File.join(destination_path, directory)) unless directory == "."
|
187
|
+
FileUtils.cp cp, File.join(destination_path, short_path) unless File.directory?(File.join(File.dirname(file), short_path)) || cp == file
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
css += plugin_css
|
193
|
+
end
|
194
|
+
|
195
|
+
def append_semantic_classes
|
196
|
+
screen_output_path = File.join(self.destination_path, "screen.css")
|
197
|
+
semantic_styles = SemanticClassNames.new(:namespace => self.namespace, :source_file => screen_output_path).css_from_assignments(self.semantic_classes)
|
198
|
+
return if semantic_styles.blank?
|
199
|
+
|
200
|
+
css = File.path_to_string(screen_output_path)
|
201
|
+
css += "\n\n/* semantic class names */\n"
|
202
|
+
css += semantic_styles
|
203
|
+
File.string_to_file(css.rstrip, screen_output_path)
|
204
|
+
end
|
205
|
+
|
206
|
+
def generate_tests
|
207
|
+
# puts "\n Updating namespace to \"#{namespace}\" in test files:"
|
208
|
+
# test_files = Compressor::TEST_FILES.map {|f| File.join(Blueprint::TEST_PATH, *f.split(/\//))}
|
209
|
+
#
|
210
|
+
# test_files.each do |file|
|
211
|
+
# puts " + #{file}"
|
212
|
+
# Namespace.new(file, namespace)
|
213
|
+
# end
|
214
|
+
end
|
215
|
+
|
216
|
+
def output_header
|
217
|
+
puts "\n"
|
218
|
+
puts " #{"*" * 100}"
|
219
|
+
puts " **"
|
220
|
+
puts " ** Blueprint CSS Compressor"
|
221
|
+
puts " **"
|
222
|
+
puts " ** Builds compressed files from the source directory."
|
223
|
+
puts " **"
|
224
|
+
puts " ** Loaded from settings.yml" if loaded_from_settings
|
225
|
+
puts " ** Namespace: '#{namespace}'" unless namespace.blank?
|
226
|
+
puts " ** Output to: #{destination_path}"
|
227
|
+
puts " ** Grid Settings:"
|
228
|
+
puts " ** - Column Count: #{self.custom_layout.column_count}"
|
229
|
+
puts " ** - Column Width: #{self.custom_layout.column_width}px"
|
230
|
+
puts " ** - Gutter Width: #{self.custom_layout.gutter_width}px"
|
231
|
+
puts " ** - Total Width : #{self.custom_layout.page_width}px"
|
232
|
+
puts " **"
|
233
|
+
puts " #{"*" * 100}"
|
234
|
+
end
|
235
|
+
|
236
|
+
def output_footer
|
237
|
+
puts "\n\n"
|
238
|
+
puts " #{"*" * 100}"
|
239
|
+
puts " **"
|
240
|
+
puts " ** Done!"
|
241
|
+
puts " ** Your compressed files and test files are now up-to-date."
|
242
|
+
puts " **"
|
243
|
+
puts " #{"*" * 100}\n\n"
|
244
|
+
end
|
245
|
+
|
246
|
+
def css_file_header
|
247
|
+
%(/* -----------------------------------------------------------------------
|
248
|
+
|
249
|
+
|
250
|
+
Blueprint CSS Framework 0.9
|
251
|
+
http://blueprintcss.org
|
252
|
+
|
253
|
+
* Copyright (c) 2007-Present. See LICENSE for more info.
|
254
|
+
* See README for instructions on how to use Blueprint.
|
255
|
+
* For credits and origins, see AUTHORS.
|
256
|
+
* This is a compressed file. See the sources in the 'src' directory.
|
257
|
+
|
258
|
+
----------------------------------------------------------------------- */)
|
259
|
+
end
|
260
|
+
|
261
|
+
def putsv(str)
|
262
|
+
puts str if $verbose
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|