dress_code 1.0.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/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:
|