dress_code 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/README.md +89 -0
- data/bin/dress_code +95 -0
- data/lib/dress_code.rb +3 -0
- data/lib/dress_code/document.rb +27 -0
- data/lib/dress_code/extractor.rb +46 -0
- data/lib/dress_code/generator.rb +61 -0
- data/lib/dress_code/renderer.rb +21 -0
- data/lib/static/base.css +70 -0
- data/lib/static/docs.js +76 -0
- data/lib/static/github.css +61 -0
- data/lib/static/styleguide.html.mustache +36 -0
- metadata +140 -0
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2013 Instructure, Inc.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
5
|
+
the Software without restriction, including without limitation the rights to use,
|
6
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
7
|
+
Software, and to permit persons to whom the Software is furnished to do so,
|
8
|
+
subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
17
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
19
|
+
|
data/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
Dress Code
|
2
|
+
==========
|
3
|
+
|
4
|
+
You haven't shown up to the office in your underwear, neither should your UI.
|
5
|
+
|
6
|
+
## About
|
7
|
+
|
8
|
+
Dress Code extracts certain comment blocks from your stylesheets and creates a styleguide with them.
|
9
|
+
|
10
|
+
Its really flexible, you can:
|
11
|
+
|
12
|
+
- Include your own CSS
|
13
|
+
- Include your own JS
|
14
|
+
- Render the styleguide with your own template
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
`gem install dress_code`
|
19
|
+
|
20
|
+
Dress code requires the python library "pygments" for syntax highlighting.
|
21
|
+
|
22
|
+
`sudo easy_install pygments`
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
Dress Code is generally used as a command line tool that takes a yaml config file. It will search your files and extract documentation that matches a regular expresssion.
|
27
|
+
|
28
|
+
Usage:
|
29
|
+
|
30
|
+
dress_code [config_path]
|
31
|
+
|
32
|
+
Example:
|
33
|
+
|
34
|
+
dress_code config/styleguide.yml
|
35
|
+
|
36
|
+
Example config yaml file:
|
37
|
+
|
38
|
+
```yaml
|
39
|
+
# required - the file to generate
|
40
|
+
out_file: styleguide/index.html
|
41
|
+
|
42
|
+
# required - the files to extract docs from
|
43
|
+
glob: stylesheets/**/*.css
|
44
|
+
|
45
|
+
# optional - components can display where they are defined, this will be
|
46
|
+
# stripped from that definition
|
47
|
+
base_dir: stylesheets
|
48
|
+
|
49
|
+
# optional - mustache template rendered for the `out_file`
|
50
|
+
template: styleguide/index.mustache
|
51
|
+
|
52
|
+
# optional - CSS files to load in the template
|
53
|
+
css:
|
54
|
+
- public/stylesheets/framework.css
|
55
|
+
- public/stylesheets/app.css
|
56
|
+
|
57
|
+
# optional - Inline DressCode CSS styles, defaults to true
|
58
|
+
dress_code_css: false
|
59
|
+
|
60
|
+
# optional - JavaScript files to load in the template
|
61
|
+
js:
|
62
|
+
- public/js/behaviors.js
|
63
|
+
|
64
|
+
# optional - Inline DressCode JS, defaults to true
|
65
|
+
dress_code_js: false
|
66
|
+
```
|
67
|
+
|
68
|
+
## Documentation Syntax
|
69
|
+
|
70
|
+
Comments like the following will be extracted from your stylesheets:
|
71
|
+
|
72
|
+
/*
|
73
|
+
@styleguide Buttons
|
74
|
+
|
75
|
+
Buttons are amazing.
|
76
|
+
|
77
|
+
```html
|
78
|
+
<button class="btn">Button</button>
|
79
|
+
```
|
80
|
+
*/
|
81
|
+
|
82
|
+
The content of your comment block is parsed as yaml. HTML code fences will be syntax highlighted and rendered in your styleguide.
|
83
|
+
|
84
|
+
Feel free to extend `DressCode::Extractor` to match your own style of comments.
|
85
|
+
|
86
|
+
## API
|
87
|
+
|
88
|
+
You can require any of the classes in lib to extend Dress Code for your particular needs. Check out `bin/dress_code` to see how to use them.
|
89
|
+
|
data/bin/dress_code
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'colored'
|
4
|
+
require 'yaml'
|
5
|
+
require_relative '../lib/dress_code'
|
6
|
+
|
7
|
+
help = "
|
8
|
+
|
9
|
+
Usage:
|
10
|
+
|
11
|
+
dress_code [config_path]
|
12
|
+
|
13
|
+
Example:
|
14
|
+
|
15
|
+
dress_code config/styleguide.yml
|
16
|
+
|
17
|
+
"
|
18
|
+
|
19
|
+
config_help = "
|
20
|
+
Example config yaml file:
|
21
|
+
|
22
|
+
#{'# required - the file to generate'.yellow}
|
23
|
+
out_file: styleguide/index.html
|
24
|
+
|
25
|
+
#{'# required - the files to extract docs from'.yellow}
|
26
|
+
glob: stylesheets/**/*.css
|
27
|
+
|
28
|
+
#{'# optional - components can display where they are defined, this will be'.yellow}
|
29
|
+
#{'# stripped from that definition'.yellow}
|
30
|
+
base_dir: stylesheets
|
31
|
+
|
32
|
+
#{'# optional - mustache template rendered for the `out_file`'.yellow}
|
33
|
+
template: styleguide/index.mustache
|
34
|
+
|
35
|
+
#{'# optional - CSS files to load in the template'.yellow}
|
36
|
+
css:
|
37
|
+
- public/stylesheets/framework.css
|
38
|
+
- public/stylesheets/app.css
|
39
|
+
|
40
|
+
|
41
|
+
#{'# optional - Inline DressCode CSS styles, defaults to true'.yellow}
|
42
|
+
dress_code_css: false
|
43
|
+
|
44
|
+
#{'# optional - JavaScript files to load in the template'.yellow}
|
45
|
+
js:
|
46
|
+
- public/js/behaviors.js
|
47
|
+
|
48
|
+
#{'# optional - Inline DressCode JS, defaults to true'.yellow}
|
49
|
+
dress_code_js: false
|
50
|
+
|
51
|
+
"
|
52
|
+
|
53
|
+
config_path = ARGV[0]
|
54
|
+
|
55
|
+
if ['--help', '-h'].include?(ARGV[0])
|
56
|
+
puts help + config_help
|
57
|
+
exit
|
58
|
+
end
|
59
|
+
|
60
|
+
if !config_path
|
61
|
+
puts help
|
62
|
+
exit
|
63
|
+
end
|
64
|
+
|
65
|
+
begin
|
66
|
+
config = YAML::load_file(config_path)
|
67
|
+
rescue
|
68
|
+
puts help + "Error: Could not find config file at '#{config_path}'.".red
|
69
|
+
exit
|
70
|
+
end
|
71
|
+
|
72
|
+
if !config['out_file']
|
73
|
+
puts config_help + "Error: I need an `out_file` in your config, view the sample above.".red
|
74
|
+
exit
|
75
|
+
end
|
76
|
+
|
77
|
+
if !config['glob']
|
78
|
+
puts config_help + "Error: I need a `glob` in your config, view the sample above.".red
|
79
|
+
exit
|
80
|
+
end
|
81
|
+
|
82
|
+
extractor = DressCode::Extractor.new({
|
83
|
+
:files => Dir.glob(config['glob']),
|
84
|
+
:base_dir => config['base_dir']
|
85
|
+
})
|
86
|
+
generator = DressCode::Generator.new({
|
87
|
+
:out_file => config['out_file'],
|
88
|
+
:docs => extractor.docs,
|
89
|
+
:css => config['css'],
|
90
|
+
:js => config['js'],
|
91
|
+
:dress_code_css => config['dress_code_css'],
|
92
|
+
:dress_code_js => config['dress_code_js']
|
93
|
+
})
|
94
|
+
generator.generate()
|
95
|
+
|
data/lib/dress_code.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative '../dress_code'
|
2
|
+
require_relative 'renderer'
|
3
|
+
|
4
|
+
class DressCode::Document
|
5
|
+
|
6
|
+
MD = Redcarpet::Markdown.new(DressCode::Renderer.new, {
|
7
|
+
fenced_code_blocks: true,
|
8
|
+
strikethrough: true,
|
9
|
+
superscript: true
|
10
|
+
})
|
11
|
+
|
12
|
+
attr_accessor :path, :relative_path, :prose, :component
|
13
|
+
|
14
|
+
def initialize(attributes)
|
15
|
+
@attributes = attributes
|
16
|
+
@path = @attributes[:path]
|
17
|
+
@relative_path = @attributes[:relative_path]
|
18
|
+
@prose = @attributes[:prose]
|
19
|
+
@component = @attributes[:component]
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_html
|
23
|
+
MD.render(@prose)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative '../dress_code'
|
2
|
+
require_relative 'document'
|
3
|
+
require 'debugger'
|
4
|
+
|
5
|
+
class DressCode::Extractor
|
6
|
+
|
7
|
+
attr_accessor :files
|
8
|
+
|
9
|
+
def initialize(opts)
|
10
|
+
@files = opts[:files]
|
11
|
+
@base_dir = opts[:base_dir]
|
12
|
+
@matcher = %r{/*\s+@styleguide\s+([^\n]+)(.+?)\*/}m
|
13
|
+
end
|
14
|
+
|
15
|
+
def extract
|
16
|
+
parse_files.sort_by { |doc| doc.component }
|
17
|
+
end
|
18
|
+
alias_method :docs, :extract
|
19
|
+
|
20
|
+
def parse_files
|
21
|
+
@files.flat_map { |path| parse_file(path) }.compact
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_file(path)
|
25
|
+
src = File.read(path)
|
26
|
+
matches = scan(src)
|
27
|
+
return unless matches.length
|
28
|
+
matches.map { |match| create_doc(match, path) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def scan(src)
|
32
|
+
src.scan(@matcher)
|
33
|
+
end
|
34
|
+
|
35
|
+
# must return an instance of Doc
|
36
|
+
def create_doc(match, path)
|
37
|
+
DressCode::Document.new({
|
38
|
+
:component => match[0],
|
39
|
+
:prose => match[1].strip,
|
40
|
+
:path => path,
|
41
|
+
:relative_path => path.gsub(@base_dir, '').gsub(/^\//, '')
|
42
|
+
})
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'mustache'
|
2
|
+
require_relative '../dress_code'
|
3
|
+
require 'debugger'
|
4
|
+
|
5
|
+
class DressCode::Generator
|
6
|
+
|
7
|
+
STATIC = "#{File.dirname(__FILE__)}/../static"
|
8
|
+
TEMPLATE = File.read("#{STATIC}/styleguide.html.mustache")
|
9
|
+
|
10
|
+
def initialize(opts)
|
11
|
+
@out_file = opts[:out_file] || 'styleguide.html'
|
12
|
+
@docs = opts[:docs]
|
13
|
+
@css = opts[:css]
|
14
|
+
@js = opts[:js]
|
15
|
+
@template = opts[:template] || TEMPLATE
|
16
|
+
@inline_css = opts[:dress_code_css].nil? ? true : !!opts[:dress_code_css]
|
17
|
+
@inline_js = opts[:dress_code_js].nil? ? true : !!opts[:dress_code_js]
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate
|
21
|
+
write_file(@out_file, Mustache.render(@template, {
|
22
|
+
:docs => map_docs,
|
23
|
+
:css => @css,
|
24
|
+
:js => @js,
|
25
|
+
:dress_code_css => dress_code_css,
|
26
|
+
:dress_code_js => dress_code_js
|
27
|
+
}))
|
28
|
+
end
|
29
|
+
|
30
|
+
def dress_code_css
|
31
|
+
return unless @inline_css
|
32
|
+
File.read("#{STATIC}/base.css") + File.read("#{STATIC}/github.css")
|
33
|
+
end
|
34
|
+
|
35
|
+
def dress_code_js
|
36
|
+
return unless @inline_js
|
37
|
+
File.read("#{STATIC}/docs.js")
|
38
|
+
end
|
39
|
+
|
40
|
+
def map_docs
|
41
|
+
@docs.map { |doc| map_doc(doc) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def map_doc(doc)
|
45
|
+
{
|
46
|
+
:id => "#{doc.component.gsub(' ', '_').downcase}",
|
47
|
+
:prose => doc.to_html,
|
48
|
+
:component => doc.component,
|
49
|
+
:file => doc.relative_path
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def write_file(path, content)
|
54
|
+
File.open(path, 'w') do |file|
|
55
|
+
puts "# writing file: #{path}"
|
56
|
+
file.write(content)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'redcarpet'
|
2
|
+
require 'pygments'
|
3
|
+
require_relative '../dress_code'
|
4
|
+
|
5
|
+
class DressCode::Renderer < Redcarpet::Render::HTML
|
6
|
+
|
7
|
+
def block_code(code, language)
|
8
|
+
syntax = Pygments.highlight(code, {
|
9
|
+
lexer: language,
|
10
|
+
options: { encoding: 'utf-8' }
|
11
|
+
})
|
12
|
+
inner = if language == 'html'
|
13
|
+
"#{syntax} <div class='code-rendered'>#{code}</div>"
|
14
|
+
else
|
15
|
+
syntax
|
16
|
+
end
|
17
|
+
"<div class='code-demo'>#{inner}</div>"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
data/lib/static/base.css
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
#nav {
|
2
|
+
position: absolute;
|
3
|
+
top: 0;
|
4
|
+
left: 0;
|
5
|
+
width: 200px;
|
6
|
+
bottom: 0;
|
7
|
+
overflow: auto;
|
8
|
+
-webkit-overflow-scrolling: touch;
|
9
|
+
}
|
10
|
+
|
11
|
+
#nav > *:fist-child {
|
12
|
+
height: 100.5%
|
13
|
+
}
|
14
|
+
|
15
|
+
#nav ul {
|
16
|
+
padding: 0;
|
17
|
+
margin: 0;
|
18
|
+
list-style: none;
|
19
|
+
}
|
20
|
+
|
21
|
+
#nav a {
|
22
|
+
display: block;
|
23
|
+
border-bottom: solid 1px #ccc;
|
24
|
+
padding: 8px 4px;
|
25
|
+
text-decoration: none;
|
26
|
+
background: #fff;
|
27
|
+
color: #454545;
|
28
|
+
}
|
29
|
+
|
30
|
+
#nav a:hover {
|
31
|
+
background: #f5f5f5;
|
32
|
+
}
|
33
|
+
|
34
|
+
#nav a.active {
|
35
|
+
background: #0088cc;
|
36
|
+
color: #fff;
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
#docs {
|
41
|
+
border-left: solid 1px;
|
42
|
+
position: absolute;
|
43
|
+
top: 0;
|
44
|
+
left: 200px;
|
45
|
+
right: 0;
|
46
|
+
bottom: 0;
|
47
|
+
overflow: auto;
|
48
|
+
-webkit-overflow-scrolling: touch;
|
49
|
+
background: #ccc;
|
50
|
+
}
|
51
|
+
|
52
|
+
#docs > article {
|
53
|
+
margin: 40px 20px;
|
54
|
+
padding: 20px;
|
55
|
+
min-height: 60%;
|
56
|
+
box-shadow: 2px 6px 16px rgba(0, 0, 0, 0.5);
|
57
|
+
background: #fff;
|
58
|
+
max-width: 700px;
|
59
|
+
}
|
60
|
+
|
61
|
+
#docs > article:first-child {
|
62
|
+
border:none;
|
63
|
+
}
|
64
|
+
|
65
|
+
.code-demo:hover {
|
66
|
+
margin-left: -12px;
|
67
|
+
border-left: solid 4px #0088cc;
|
68
|
+
padding-left: 8px;
|
69
|
+
}
|
70
|
+
|
data/lib/static/docs.js
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
;(function() {
|
2
|
+
var items = document.querySelectorAll('#nav a');
|
3
|
+
var docs = document.getElementById('docs');
|
4
|
+
var articles = [].slice.call(docs.querySelectorAll('article'), 0);
|
5
|
+
var tops;
|
6
|
+
|
7
|
+
var setTops = function() {
|
8
|
+
tops = articles.map(function(header) {
|
9
|
+
return header.offsetTop;
|
10
|
+
});
|
11
|
+
setTimeout(setTops, 1000);
|
12
|
+
};
|
13
|
+
|
14
|
+
var setAnchor = function() {
|
15
|
+
var top = docs.scrollTop + (docs.offsetHeight / 2);
|
16
|
+
var inView;
|
17
|
+
for (var i = 0; i < tops.length; i += 1) {
|
18
|
+
if (tops[i] >= top) break;
|
19
|
+
}
|
20
|
+
setCurrent(i - 1);
|
21
|
+
};
|
22
|
+
|
23
|
+
var setCurrent = (function() {
|
24
|
+
var current;
|
25
|
+
return function(index) {
|
26
|
+
var item = items[index];
|
27
|
+
if (current) current.setAttribute('class', '');
|
28
|
+
item.setAttribute('class', 'active');
|
29
|
+
current = item;
|
30
|
+
var article = articles[index];
|
31
|
+
var id = article.getAttribute('id');
|
32
|
+
article.setAttribute('id', '');
|
33
|
+
location.hash = item.hash
|
34
|
+
article.setAttribute('id', id);
|
35
|
+
}
|
36
|
+
})();
|
37
|
+
|
38
|
+
var throttle = function(func, wait) {
|
39
|
+
var context, args, timeout, throttling, more;
|
40
|
+
var whenDone = debounce(function(){ more = throttling = false; }, wait);
|
41
|
+
return function() {
|
42
|
+
context = this; args = arguments;
|
43
|
+
var later = function() {
|
44
|
+
timeout = null;
|
45
|
+
if (more) func.apply(context, args);
|
46
|
+
whenDone();
|
47
|
+
};
|
48
|
+
if (!timeout) timeout = setTimeout(later, wait);
|
49
|
+
if (throttling) {
|
50
|
+
more = true;
|
51
|
+
} else {
|
52
|
+
func.apply(context, args);
|
53
|
+
}
|
54
|
+
whenDone();
|
55
|
+
throttling = true;
|
56
|
+
};
|
57
|
+
};
|
58
|
+
|
59
|
+
var debounce = function(func, wait) {
|
60
|
+
var timeout;
|
61
|
+
return function() {
|
62
|
+
var context = this, args = arguments;
|
63
|
+
var later = function() {
|
64
|
+
timeout = null;
|
65
|
+
func.apply(context, args);
|
66
|
+
};
|
67
|
+
clearTimeout(timeout);
|
68
|
+
timeout = setTimeout(later, wait);
|
69
|
+
};
|
70
|
+
};
|
71
|
+
|
72
|
+
setTops();
|
73
|
+
docs.addEventListener('scroll', throttle(setAnchor, 100));
|
74
|
+
|
75
|
+
})();
|
76
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
.hll { background-color: #ffffcc }
|
2
|
+
.c { color: #999988; font-style: italic } /* Comment */
|
3
|
+
.err { color: #a61717; background-color: #e3d2d2 } /* Error */
|
4
|
+
.k { color: #000000; font-weight: bold } /* Keyword */
|
5
|
+
.o { color: #000000; font-weight: bold } /* Operator */
|
6
|
+
.cm { color: #999988; font-style: italic } /* Comment.Multiline */
|
7
|
+
.cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */
|
8
|
+
.c1 { color: #999988; font-style: italic } /* Comment.Single */
|
9
|
+
.cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
|
10
|
+
.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
|
11
|
+
.ge { color: #000000; font-style: italic } /* Generic.Emph */
|
12
|
+
.gr { color: #aa0000 } /* Generic.Error */
|
13
|
+
.gh { color: #999999 } /* Generic.Heading */
|
14
|
+
.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
|
15
|
+
.go { color: #888888 } /* Generic.Output */
|
16
|
+
.gp { color: #555555 } /* Generic.Prompt */
|
17
|
+
.gs { font-weight: bold } /* Generic.Strong */
|
18
|
+
.gu { color: #aaaaaa } /* Generic.Subheading */
|
19
|
+
.gt { color: #aa0000 } /* Generic.Traceback */
|
20
|
+
.kc { color: #000000; font-weight: bold } /* Keyword.Constant */
|
21
|
+
.kd { color: #000000; font-weight: bold } /* Keyword.Declaration */
|
22
|
+
.kn { color: #000000; font-weight: bold } /* Keyword.Namespace */
|
23
|
+
.kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */
|
24
|
+
.kr { color: #000000; font-weight: bold } /* Keyword.Reserved */
|
25
|
+
.kt { color: #445588; font-weight: bold } /* Keyword.Type */
|
26
|
+
.m { color: #009999 } /* Literal.Number */
|
27
|
+
.s { color: #d01040 } /* Literal.String */
|
28
|
+
.na { color: #008080 } /* Name.Attribute */
|
29
|
+
.nb { color: #0086B3 } /* Name.Builtin */
|
30
|
+
.nc { color: #445588; font-weight: bold } /* Name.Class */
|
31
|
+
.no { color: #008080 } /* Name.Constant */
|
32
|
+
.nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */
|
33
|
+
.ni { color: #800080 } /* Name.Entity */
|
34
|
+
.ne { color: #990000; font-weight: bold } /* Name.Exception */
|
35
|
+
.nf { color: #990000; font-weight: bold } /* Name.Function */
|
36
|
+
.nl { color: #990000; font-weight: bold } /* Name.Label */
|
37
|
+
.nn { color: #555555 } /* Name.Namespace */
|
38
|
+
.nt { color: #000080 } /* Name.Tag */
|
39
|
+
.nv { color: #008080 } /* Name.Variable */
|
40
|
+
.ow { color: #000000; font-weight: bold } /* Operator.Word */
|
41
|
+
.w { color: #bbbbbb } /* Text.Whitespace */
|
42
|
+
.mf { color: #009999 } /* Literal.Number.Float */
|
43
|
+
.mh { color: #009999 } /* Literal.Number.Hex */
|
44
|
+
.mi { color: #009999 } /* Literal.Number.Integer */
|
45
|
+
.mo { color: #009999 } /* Literal.Number.Oct */
|
46
|
+
.sb { color: #d01040 } /* Literal.String.Backtick */
|
47
|
+
.sc { color: #d01040 } /* Literal.String.Char */
|
48
|
+
.sd { color: #d01040 } /* Literal.String.Doc */
|
49
|
+
.s2 { color: #d01040 } /* Literal.String.Double */
|
50
|
+
.se { color: #d01040 } /* Literal.String.Escape */
|
51
|
+
.sh { color: #d01040 } /* Literal.String.Heredoc */
|
52
|
+
.si { color: #d01040 } /* Literal.String.Interpol */
|
53
|
+
.sx { color: #d01040 } /* Literal.String.Other */
|
54
|
+
.sr { color: #009926 } /* Literal.String.Regex */
|
55
|
+
.s1 { color: #d01040 } /* Literal.String.Single */
|
56
|
+
.ss { color: #990073 } /* Literal.String.Symbol */
|
57
|
+
.bp { color: #999999 } /* Name.Builtin.Pseudo */
|
58
|
+
.vc { color: #008080 } /* Name.Variable.Class */
|
59
|
+
.vg { color: #008080 } /* Name.Variable.Global */
|
60
|
+
.vi { color: #008080 } /* Name.Variable.Instance */
|
61
|
+
.il { color: #009999 } /* Literal.Number.Integer.Long */
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
|
3
|
+
<html lang="en">
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
|
6
|
+
<title>Styleguide</title>
|
7
|
+
<style>{{{dress_code_css}}}</style>
|
8
|
+
{{#css}}
|
9
|
+
<link href="{{.}}" rel="stylesheet" charset="utf-8">
|
10
|
+
{{/css}}
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
|
14
|
+
<nav id="nav">
|
15
|
+
<ul>
|
16
|
+
{{#docs}}
|
17
|
+
<li><a href="#{{id}}">{{component}}</a></li>
|
18
|
+
{{/docs}}
|
19
|
+
</ul>
|
20
|
+
</nav>
|
21
|
+
|
22
|
+
<section id="docs">
|
23
|
+
{{#docs}}
|
24
|
+
<article id="{{id}}">
|
25
|
+
<h2>{{component}}</h2>
|
26
|
+
<p><small>Defined in <em>{{file}}</em></small></p>
|
27
|
+
{{{prose}}}
|
28
|
+
</article>
|
29
|
+
{{/docs}}
|
30
|
+
</section>
|
31
|
+
|
32
|
+
{{#js}}
|
33
|
+
<script src="{{.}}"></script>
|
34
|
+
{{/js}}
|
35
|
+
<script>{{{dress_code_js}}}</script>
|
36
|
+
|
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dress_code
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ryan Florence
|
9
|
+
- Cameron Matheson
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2013-03-18 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: redcarpet
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: pygments.rb
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mustache
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: colored
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rspec
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
description: Dress Code extracts comment blocks from your stylesheets and creates
|
96
|
+
a styleguide using your CSS.
|
97
|
+
email:
|
98
|
+
executables:
|
99
|
+
- dress_code
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- bin/dress_code
|
104
|
+
- lib/dress_code/document.rb
|
105
|
+
- lib/dress_code/extractor.rb
|
106
|
+
- lib/dress_code/generator.rb
|
107
|
+
- lib/dress_code/renderer.rb
|
108
|
+
- lib/dress_code.rb
|
109
|
+
- lib/static/base.css
|
110
|
+
- lib/static/docs.js
|
111
|
+
- lib/static/github.css
|
112
|
+
- lib/static/styleguide.html.mustache
|
113
|
+
- LICENSE
|
114
|
+
- README.md
|
115
|
+
homepage: http://github.com/instructure/dress_code
|
116
|
+
licenses: []
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 1.8.23
|
136
|
+
signing_key:
|
137
|
+
specification_version: 3
|
138
|
+
summary: CSS Documentation and Styleguide Generator
|
139
|
+
test_files: []
|
140
|
+
has_rdoc:
|