livingstyleguide 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +11 -1
- data/lib/livingstyleguide.rb +11 -2
- data/lib/livingstyleguide/markdown_extensions.rb +107 -0
- data/lib/livingstyleguide/sass_extensions.rb +9 -0
- data/lib/livingstyleguide/sass_extensions/functions.rb +12 -0
- data/lib/livingstyleguide/variables_importer.rb +81 -0
- data/lib/livingstyleguide/variables_importer/content.erb +19 -0
- data/lib/livingstyleguide/version.rb +1 -1
- data/livingstyleguide.gemspec +6 -0
- data/stylesheets/_livingstyleguide.scss +52 -0
- data/stylesheets/livingstyleguide/_code.scss +86 -0
- data/stylesheets/livingstyleguide/_color-swatches.scss +50 -0
- data/stylesheets/livingstyleguide/_content.scss +58 -0
- data/stylesheets/livingstyleguide/_layout.scss +4 -0
- data/test/fixtures/markdown/code-with-highlight-block.md +6 -0
- data/test/fixtures/markdown/code-with-highlight.md +4 -0
- data/test/fixtures/markdown/code.md +6 -0
- data/test/fixtures/markdown/example-with-highlight.md +5 -0
- data/test/fixtures/markdown/example.md +4 -0
- data/test/fixtures/markdown/font-example.md +1 -0
- data/test/fixtures/markdown/layout-example.md +4 -0
- data/test/fixtures/markdown/text.md +13 -0
- data/test/fixtures/markdown/variables.md +1 -0
- data/test/fixtures/stylesheets/variables/_more-other-colors.sass +2 -0
- data/test/fixtures/stylesheets/variables/colors.scss +2 -0
- data/test/fixtures/stylesheets/variables/other-colors.sass +2 -0
- data/test/integration/markdown_test.rb +107 -0
- data/test/integration/variables_test.rb +65 -0
- data/test/test_helper.rb +5 -0
- data/test/unit/sass_extensions_test.rb +28 -0
- metadata +127 -4
data/Rakefile
CHANGED
data/lib/livingstyleguide.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'livingstyleguide/version'
|
2
|
+
require 'livingstyleguide/sass_extensions'
|
3
|
+
require 'livingstyleguide/variables_importer'
|
4
|
+
require 'livingstyleguide/markdown_extensions'
|
5
|
+
require 'sass/plugin'
|
2
6
|
|
3
7
|
module LivingStyleGuide
|
4
|
-
# Your code goes here...
|
5
8
|
end
|
9
|
+
|
10
|
+
Compass.configuration.add_import_path LivingStyleGuide::VariablesImporter.new
|
11
|
+
|
12
|
+
base_directory = File.join(File.dirname(__FILE__), '..')
|
13
|
+
Compass::Frameworks.register 'livingstyleguide', path: base_directory
|
14
|
+
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'redcarpet'
|
2
|
+
require 'tilt'
|
3
|
+
require 'minisyntax'
|
4
|
+
require "erb"
|
5
|
+
|
6
|
+
module LivingStyleGuide
|
7
|
+
class RedcarpetTemplate < ::Tilt::RedcarpetTemplate::Redcarpet2
|
8
|
+
RENDER_OPTIONS = {
|
9
|
+
autolink: true,
|
10
|
+
fenced_code_blocks: true,
|
11
|
+
tables: true,
|
12
|
+
strikethrough: true,
|
13
|
+
space_after_headers: true,
|
14
|
+
superscript: true
|
15
|
+
}
|
16
|
+
|
17
|
+
def generate_renderer
|
18
|
+
RedcarpetHTML.new(RENDER_OPTIONS)
|
19
|
+
end
|
20
|
+
|
21
|
+
def prepare
|
22
|
+
@engine = ::Redcarpet::Markdown.new(generate_renderer, RENDER_OPTIONS)
|
23
|
+
@output = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def evaluate(context, locals, &block)
|
27
|
+
@context ||= context
|
28
|
+
|
29
|
+
if @engine.renderer.respond_to? :middleman_app=
|
30
|
+
@engine.renderer.middleman_app = @context
|
31
|
+
end
|
32
|
+
super
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class RedcarpetHTML < ::Redcarpet::Render::HTML
|
37
|
+
attr_accessor :middleman_app
|
38
|
+
|
39
|
+
def image(link, title, alt_text)
|
40
|
+
middleman_app.image_tag(link, :title => title, :alt => alt_text)
|
41
|
+
end
|
42
|
+
|
43
|
+
def link(link, title, content)
|
44
|
+
middleman_app.link_to(content, link, :title => title)
|
45
|
+
end
|
46
|
+
|
47
|
+
def header(text, header_level)
|
48
|
+
klass = %w(page-title headline sub-headline)[header_level]
|
49
|
+
header_level += 1
|
50
|
+
%Q(<h#{header_level} class="livingstyleguide--#{klass}">#{text}</h#{header_level}>\n)
|
51
|
+
end
|
52
|
+
|
53
|
+
def paragraph(text)
|
54
|
+
if text =~ /^\{\{variables:(.+)\}\}$/
|
55
|
+
uri = $1
|
56
|
+
result = %Q(<ul class="livingstyleguide--color-swatches">\n)
|
57
|
+
VariablesImporter.variables(uri).each do |variable|
|
58
|
+
result << %Q(<li class="livingstyleguide--color-swatch $#{variable}">$#{variable}</li>\n)
|
59
|
+
end
|
60
|
+
result << "</ul>\n"
|
61
|
+
elsif text =~ /^\{\{font-example:(.+)\}\}$/
|
62
|
+
font = $1
|
63
|
+
<<-HTML.gsub(' ', '')
|
64
|
+
<div class="livingstyleguide--font-example" style="font: #{font}">
|
65
|
+
ABCDEFGHIJKLMNOPQRSTUVWXYZ<br>
|
66
|
+
abcdefghijklmnopqrstuvwxyz<br>
|
67
|
+
0123456789<br>
|
68
|
+
!&/()$=@;:,.
|
69
|
+
</div>
|
70
|
+
HTML
|
71
|
+
else
|
72
|
+
%Q(<p class="livingstyleguide--paragraph">#{text}</p>\n)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def list(contents, list_type)
|
77
|
+
tag_name = "#{list_type[0]}l"
|
78
|
+
%Q(<#{tag_name} class="livingstyleguide--#{list_type}-list">\n#{contents}</#{tag_name}>\n)
|
79
|
+
end
|
80
|
+
|
81
|
+
def list_item(text, list_type)
|
82
|
+
%Q(<li class="livingstyleguide--#{list_type}-list-item">#{text.strip}</li>\n)
|
83
|
+
end
|
84
|
+
|
85
|
+
def block_code(code, language)
|
86
|
+
if %w(example layout-example).include?(language)
|
87
|
+
html = code.gsub(/\*\*\*(.+?)\*\*\*/m, '\\1')
|
88
|
+
%Q(<div class="livingstyleguide--#{language}">\n #{html}\n</div>) + "\n" + block_code(code, 'html')
|
89
|
+
else
|
90
|
+
code = ERB::Util.html_escape(code).gsub(/"/, '"')
|
91
|
+
code = ::MiniSyntax.highlight(code.strip, language.to_s.strip.to_sym)
|
92
|
+
code.gsub! /^\s*\*\*\*\n(.+?)\n\s*\*\*\*\n/m, %Q(<strong class="livingstyleguide--code-highlight-block">\\1</strong>)
|
93
|
+
code.gsub! /\*\*\*(.+?)\*\*\*/, %Q(<strong class="livingstyleguide--code-highlight">\\1</strong>)
|
94
|
+
%Q(<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">#{code}</code></pre>)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def codespan(code)
|
99
|
+
code = ERB::Util.html_escape(code)
|
100
|
+
%Q(<code class="livingstyleguide--code-span livingstyleguide--code">#{code}</code>)
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
::Tilt.register RedcarpetTemplate, 'markdown', 'mkd', 'md'
|
106
|
+
end
|
107
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module LivingStyleGuide::SassExtensions::Functions
|
2
|
+
|
3
|
+
def list_variables(uri)
|
4
|
+
uri = uri.value
|
5
|
+
variables = LivingStyleGuide::VariablesImporter.variables(uri)
|
6
|
+
variables.map! do |name|
|
7
|
+
Sass::Script::String.new(name)
|
8
|
+
end
|
9
|
+
Sass::Script::List.new(variables, :space)
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'compass'
|
4
|
+
|
5
|
+
module LivingStyleGuide
|
6
|
+
class VariablesImporter < Sass::Importers::Base
|
7
|
+
VAILD_FILE_NAME = /\A#{Sass::SCSS::RX::IDENT}\Z/
|
8
|
+
VARIABLE_IMPORTER_REGEX = %r{^variables:(((.+/)?([^\*.]+))/(.+?)(\.s[ac]ss)?)$}
|
9
|
+
VALID_EXTENSIONS = %w(*.sass *.scss)
|
10
|
+
|
11
|
+
TEMPLATE_FOLDER = File.join(File.expand_path('../', __FILE__), 'variables_importer')
|
12
|
+
CONTENT_TEMPLATE_FILE = File.join(TEMPLATE_FOLDER, 'content.erb')
|
13
|
+
CONTENT_TEMPLATE = ERB.new(File.read(CONTENT_TEMPLATE_FILE))
|
14
|
+
|
15
|
+
def find(uri, options)
|
16
|
+
if uri =~ VARIABLE_IMPORTER_REGEX
|
17
|
+
uri = $1
|
18
|
+
return self.class.sass_engine(uri, self.class.variables(uri), self, options)
|
19
|
+
end
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_relative(uri, base, options)
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
self.class.name
|
29
|
+
end
|
30
|
+
|
31
|
+
def hash
|
32
|
+
self.class.name.hash
|
33
|
+
end
|
34
|
+
|
35
|
+
def eql?(other)
|
36
|
+
other.class == self.class
|
37
|
+
end
|
38
|
+
|
39
|
+
def key(uri, options={})
|
40
|
+
[self.class.name + ":variables:" + File.dirname(File.expand_path(uri)), File.basename(uri)]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.variables(uri)
|
44
|
+
uri += '.s?ss' unless uri =~ /\.s[ac]ss$/
|
45
|
+
uri.gsub! %r{^(.*)/(.+)$}, '\1/{_,}\2'
|
46
|
+
variables = []
|
47
|
+
paths = [Compass.configuration.sass_path, Compass.configuration.additional_import_paths].flatten
|
48
|
+
paths.each do |path|
|
49
|
+
if path.is_a? String
|
50
|
+
Dir.glob(File.join(path, uri)).each do |file|
|
51
|
+
sass = File.read(file)
|
52
|
+
variables << sass.scan(%r(\$([a-z\-_]+)\s*:))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
variables.flatten!
|
57
|
+
variables.uniq!
|
58
|
+
variables
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.sass_options(uri, importer, options)
|
62
|
+
options.merge! filename: uri.gsub(%r{\*/},"*\\/"), syntax: :scss, importer: importer
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.sass_engine(uri, name, importer, options)
|
66
|
+
content = content_for_images(uri, name, options[:skip_overrides])
|
67
|
+
Sass::Engine.new(content, sass_options(uri, importer, options))
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.content_for_images(uri, variables, skip_overrides = false)
|
71
|
+
binder = LivingStyleGuide::Binding.new(variables: variables)
|
72
|
+
CONTENT_TEMPLATE.result(binder.get_binding)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class Binding < OpenStruct
|
77
|
+
def get_binding
|
78
|
+
binding
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<% variables.each do |variable| %>
|
2
|
+
.\$<%= variable %> {
|
3
|
+
@if type-of($<%= variable %>) == color {
|
4
|
+
@extend %livingstyleguide--color-swatch !optional;
|
5
|
+
@if (lightness($<%= variable %>) < lightness($livingstyleguide--color)) {
|
6
|
+
color: $livingstyleguide--background-color;
|
7
|
+
}
|
8
|
+
|
9
|
+
&:before {
|
10
|
+
background: $<%= variable %>;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
&:after {
|
15
|
+
@extend %livingstyleguide--code !optional;
|
16
|
+
content: "#{$<%= variable %>}";
|
17
|
+
}
|
18
|
+
}
|
19
|
+
<% end %>
|
data/livingstyleguide.gemspec
CHANGED
@@ -16,4 +16,10 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency 'minisyntax'
|
21
|
+
gem.add_dependency 'middleman', '>= 3.0.9'
|
22
|
+
gem.add_dependency 'compass'
|
23
|
+
gem.add_dependency 'sass'
|
24
|
+
gem.add_dependency 'redcarpet'
|
19
25
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
//// INTEGRATION ////
|
2
|
+
|
3
|
+
$livingstyleguide--layout-selector: body !default;
|
4
|
+
|
5
|
+
//// TYPOGRAPHY ////
|
6
|
+
|
7
|
+
$livingstyleguide--base-font: 'Georgia', 'Times New Roman', serif !default;
|
8
|
+
$livingstyleguide--base-font-size: 14px !default;
|
9
|
+
$livingstyleguide--base-font-weight: normal !default;
|
10
|
+
$livingstyleguide--base-line-height: 1.4 !default;
|
11
|
+
$livingstyleguide--headline-font: $livingstyleguide--base-font !default;
|
12
|
+
$livingstyleguide--page-title-font-size: 30px !default;
|
13
|
+
$livingstyleguide--headline-font-size: 22px !default;
|
14
|
+
$livingstyleguide--sub-headline-font-size: 16px !default;
|
15
|
+
$livingstyleguide--headline-font-weight: bold !default;
|
16
|
+
$livingstyleguide--headline-line-height: 1.1 !default;
|
17
|
+
$livingstyleguide--code-font: Courier, "Courier New", monospace !default;
|
18
|
+
$livingstyleguide--code-font-size: 12px !default;
|
19
|
+
$livingstyleguide--code-font-weight: normal !default;
|
20
|
+
$livingstyleguide--code-line-height: 1.5 !default;
|
21
|
+
|
22
|
+
//// STYLING ////
|
23
|
+
|
24
|
+
$livingstyleguide--background-color: #f7f7f7 !default;
|
25
|
+
$livingstyleguide--border-width: 1px !default;
|
26
|
+
$livingstyleguide--border-color: silver !default;
|
27
|
+
$livingstyleguide--border-radius: 0 !default;
|
28
|
+
$livingstyleguide--color: #505050 !default;
|
29
|
+
$livingstyleguide--width: 640px !default;
|
30
|
+
$livingstyleguide--gap-width: 10px !default;
|
31
|
+
|
32
|
+
$livingstyleguide--code-background-color: #505050 !default;
|
33
|
+
$livingstyleguide--code-color: white !default;
|
34
|
+
$livingstyleguide--code-border-width: $livingstyleguide--border-width !default;
|
35
|
+
$livingstyleguide--code-border-color: $livingstyleguide--border-color !default;
|
36
|
+
$livingstyleguide--code-border-radius: $livingstyleguide--border-radius !default;
|
37
|
+
|
38
|
+
$livingstyleguide--color-swatch-color: black !default;
|
39
|
+
$livingstyleguide--color-swatch-border-width: $livingstyleguide--border-width !default;
|
40
|
+
$livingstyleguide--color-swatch-border-color: $livingstyleguide--border-color !default;
|
41
|
+
$livingstyleguide--color-swatch-border-radius: $livingstyleguide--border-radius !default;
|
42
|
+
$livingstyleguide--color-swatches-per-line: 2 !default;
|
43
|
+
|
44
|
+
$livingstyleguide--highlight-color: #f6ffa3 !default;
|
45
|
+
$livingstyleguide--highlight-border-radius: 2px;
|
46
|
+
|
47
|
+
//// IMPORTS ////
|
48
|
+
|
49
|
+
@import "livingstyleguide/layout";
|
50
|
+
@import "livingstyleguide/content";
|
51
|
+
@import "livingstyleguide/code";
|
52
|
+
@import "livingstyleguide/color-swatches";
|
@@ -0,0 +1,86 @@
|
|
1
|
+
.livingstyleguide--code-span,
|
2
|
+
.livingstyleguide--code-block {
|
3
|
+
background: $livingstyleguide--code-background-color;
|
4
|
+
color: $livingstyleguide--code-color;
|
5
|
+
font-family: $livingstyleguide--code-font;
|
6
|
+
font-size: $livingstyleguide--code-font-size;
|
7
|
+
font-weight: $livingstyleguide--code-font-weight;
|
8
|
+
overflow: scroll;
|
9
|
+
padding: 0 3px;
|
10
|
+
-webkit-font-smoothing: subpixel-antialiased;
|
11
|
+
@include border-radius($livingstyleguide--code-border-radius);
|
12
|
+
|
13
|
+
kbd {
|
14
|
+
display: block;
|
15
|
+
font-weight: bold;
|
16
|
+
|
17
|
+
&:before {
|
18
|
+
content: "> ";
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
em {
|
23
|
+
color: lighten($livingstyleguide--code-color, 10%);
|
24
|
+
font-style: normal;
|
25
|
+
font-weight: bold;
|
26
|
+
text-decoration: underline;
|
27
|
+
}
|
28
|
+
|
29
|
+
b {
|
30
|
+
color: lighten($livingstyleguide--code-color, 20%);
|
31
|
+
font-weight: bold;
|
32
|
+
}
|
33
|
+
|
34
|
+
i {
|
35
|
+
color: lighten($livingstyleguide--code-color, 30%);
|
36
|
+
}
|
37
|
+
|
38
|
+
q {
|
39
|
+
color: lighten($livingstyleguide--code-color, 30%);
|
40
|
+
}
|
41
|
+
|
42
|
+
var {
|
43
|
+
text-decoration: underline;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
.livingstyleguide--code-block {
|
48
|
+
display: block;
|
49
|
+
line-height: $livingstyleguide--code-line-height;
|
50
|
+
padding: 3px 6px;
|
51
|
+
width: $livingstyleguide--width - 2 * 6px;
|
52
|
+
}
|
53
|
+
|
54
|
+
.livingstyleguide--example + .livingstyleguide--code-block {
|
55
|
+
margin-top: 0;
|
56
|
+
@include border-top-radius(0);
|
57
|
+
}
|
58
|
+
|
59
|
+
.livingstyleguide--layout-example + .livingstyleguide--code-block {
|
60
|
+
background: $livingstyleguide--code-background-color;
|
61
|
+
margin: 0 0 $livingstyleguide--gap-width;
|
62
|
+
padding: $livingstyleguide--gap-width 0;
|
63
|
+
width: 100%;
|
64
|
+
@include border-radius(0);
|
65
|
+
|
66
|
+
.livingstyleguide--code {
|
67
|
+
display: block;
|
68
|
+
margin: auto;
|
69
|
+
width: $livingstyleguide--width;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
.livingstyleguide--font-example {
|
74
|
+
@extend .livingstyleguide--example;
|
75
|
+
}
|
76
|
+
|
77
|
+
.livingstyleguide--code-highlight {
|
78
|
+
background-color: $livingstyleguide--highlight-color;
|
79
|
+
@include border-radius($livingstyleguide--highlight-border-radius);
|
80
|
+
}
|
81
|
+
|
82
|
+
.livingstyleguide--code-highlight-block {
|
83
|
+
@extend .livingstyleguide--code-highlight;
|
84
|
+
display: block;
|
85
|
+
}
|
86
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
%livingstyleguide--color-swatch {
|
2
|
+
color: $livingstyleguide--color-swatch-color;
|
3
|
+
float: left;
|
4
|
+
font-family: $livingstyleguide--code-font;
|
5
|
+
font-size: $livingstyleguide--code-font-size;
|
6
|
+
font-weight: bold;
|
7
|
+
height: 4em * $livingstyleguide--base-line-height;
|
8
|
+
line-height: $livingstyleguide--base-line-height;
|
9
|
+
list-style: none;
|
10
|
+
margin: 0 $livingstyleguide--gap-width $livingstyleguide--gap-width 0;
|
11
|
+
padding-top: 1em * $livingstyleguide--base-line-height;
|
12
|
+
position: relative;
|
13
|
+
text-align: center;
|
14
|
+
width: floor(
|
15
|
+
($livingstyleguide--width - ($livingstyleguide--color-swatches-per-line - 1) * $livingstyleguide--gap-width)
|
16
|
+
/
|
17
|
+
$livingstyleguide--color-swatches-per-line
|
18
|
+
);
|
19
|
+
z-index: 1;
|
20
|
+
@include box-sizing(border-box);
|
21
|
+
|
22
|
+
&:nth-child(#{$livingstyleguide--color-swatches-per-line}n) {
|
23
|
+
margin-right: 0;
|
24
|
+
}
|
25
|
+
|
26
|
+
&:before {
|
27
|
+
border: $livingstyleguide--color-swatch-border-width $livingstyleguide--code-border-color solid;
|
28
|
+
content: "";
|
29
|
+
display: block;
|
30
|
+
height: 100%;
|
31
|
+
left: 0;
|
32
|
+
position: absolute;
|
33
|
+
top: 0;
|
34
|
+
width: 100%;
|
35
|
+
z-index: -1;
|
36
|
+
@include border-radius($livingstyleguide--color-swatch-border-radius);
|
37
|
+
@include box-sizing(border-box);
|
38
|
+
}
|
39
|
+
|
40
|
+
&:after {
|
41
|
+
display: block;
|
42
|
+
font-weight: normal;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
.livingstyleguide--color-swatches {
|
47
|
+
margin: $livingstyleguide--gap-width auto (-$livingstyleguide--gap-width) auto;
|
48
|
+
width: $livingstyleguide--width;
|
49
|
+
@include clearfix;
|
50
|
+
}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
.livingstyleguide--paragraph,
|
2
|
+
.livingstyleguide--code-block,
|
3
|
+
.livingstyleguide--unordered-list,
|
4
|
+
.livingstyleguide--ordered-list {
|
5
|
+
font-family: $livingstyleguide--base-font;
|
6
|
+
font-size: $livingstyleguide--base-font-size;
|
7
|
+
font-weight: $livingstyleguide--base-font-weight;
|
8
|
+
line-height: $livingstyleguide--base-line-height;
|
9
|
+
margin: $livingstyleguide--gap-width auto;
|
10
|
+
width: $livingstyleguide--width;
|
11
|
+
-webkit-font-smoothing: antialiased;
|
12
|
+
}
|
13
|
+
|
14
|
+
.livingstyleguide--unordered-list-item,
|
15
|
+
.livingstyleguide--ordered-list-item {
|
16
|
+
list-style: disc;
|
17
|
+
margin: ceil($livingstyleguide--gap-width / 2) 0 ceil($livingstyleguide--gap-width / 2) (2 * $livingstyleguide--gap-width);
|
18
|
+
}
|
19
|
+
|
20
|
+
.livingstyleguide--page-title,
|
21
|
+
.livingstyleguide--headline,
|
22
|
+
.livingstyleguide--sub-headline {
|
23
|
+
font-family: $livingstyleguide--headline-font;
|
24
|
+
font-size: $livingstyleguide--headline-font-size;
|
25
|
+
font-weight: $livingstyleguide--headline-font-weight;
|
26
|
+
line-height: $livingstyleguide--headline-line-height;
|
27
|
+
margin: (3 * $livingstyleguide--gap-width) auto $livingstyleguide--gap-width;
|
28
|
+
width: $livingstyleguide--width;
|
29
|
+
-webkit-font-smoothing: antialiased;
|
30
|
+
}
|
31
|
+
|
32
|
+
.livingstyleguide--page-title {
|
33
|
+
font-size: $livingstyleguide--page-title-font-size;
|
34
|
+
}
|
35
|
+
|
36
|
+
.livingstyleguide--sub-headline {
|
37
|
+
font-size: $livingstyleguide--sub-headline-font-size;
|
38
|
+
}
|
39
|
+
|
40
|
+
.livingstyleguide--example {
|
41
|
+
background: white;
|
42
|
+
margin: $livingstyleguide--gap-width auto 0;
|
43
|
+
padding: $livingstyleguide--gap-width;
|
44
|
+
width: $livingstyleguide--width;
|
45
|
+
@include box-sizing(border-box);
|
46
|
+
@include border-top-radius($livingstyleguide--border-radius);
|
47
|
+
|
48
|
+
.livingstyleguide--layout-example & {
|
49
|
+
margin: 0 auto;
|
50
|
+
width: 100%;
|
51
|
+
@include border-radius(0);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
.livingstyleguide--layout-example {
|
56
|
+
@extend #{$livingstyleguide--layout-selector} !optional;
|
57
|
+
padding: $livingstyleguide--gap-width;
|
58
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{{font-example:16px Courier}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{{variables:variables/other-colors}}
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
class MarkdownTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def render(file)
|
7
|
+
template = Tilt.new(file)
|
8
|
+
template.render
|
9
|
+
end
|
10
|
+
|
11
|
+
def assert_markdown(expected, file)
|
12
|
+
expected = expected.gsub(/\s+/m, ' ').gsub(/([\$\(\)\[\]])/) { |s| "\\#{s}" }.strip
|
13
|
+
given = render(File.join(%W(test fixtures markdown #{file})))
|
14
|
+
given = given.gsub(/\s+/m, ' ').strip
|
15
|
+
assert_match /#{expected}/, given
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_examples
|
19
|
+
assert_markdown <<-HTML, 'example.md'
|
20
|
+
<div class="livingstyleguide--example">
|
21
|
+
<button class="button">Test</button>
|
22
|
+
</div>
|
23
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">.+button.+Test.+button.+</code></pre>
|
24
|
+
HTML
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_layout_examples
|
28
|
+
assert_markdown <<-HTML, 'layout-example.md'
|
29
|
+
<div class="livingstyleguide--layout-example">
|
30
|
+
<button class="button">Test</button>
|
31
|
+
</div>
|
32
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">.+button.+Test.+button.+</code></pre>
|
33
|
+
HTML
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_text
|
37
|
+
assert_markdown <<-HTML, 'text.md'
|
38
|
+
<h2 class="livingstyleguide--headline">Hello World</h2>
|
39
|
+
<p class="livingstyleguide--paragraph">Lorem ipsum <strong>dolor</strong> sit amet,
|
40
|
+
<code class="livingstyleguide--code-span livingstyleguide--code"><consectetur> adipiscing</code> elit.
|
41
|
+
Sed a pulvinar turpis.</p>
|
42
|
+
<ul class="livingstyleguide--unordered-list">
|
43
|
+
<li class="livingstyleguide--unordered-list-item">Lorem</li>
|
44
|
+
<li class="livingstyleguide--unordered-list-item">Ipsum</li>
|
45
|
+
<li class="livingstyleguide--unordered-list-item">Dolor</li>
|
46
|
+
</ul>
|
47
|
+
<h3 class="livingstyleguide--sub-headline">More Lorem</h3>
|
48
|
+
<ol class="livingstyleguide--ordered-list">
|
49
|
+
<li class="livingstyleguide--ordered-list-item">Lorem</li>
|
50
|
+
<li class="livingstyleguide--ordered-list-item">Ipsum</li>
|
51
|
+
<li class="livingstyleguide--ordered-list-item">Dolor</li>
|
52
|
+
</ol>
|
53
|
+
HTML
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_code
|
57
|
+
assert_markdown <<-HTML, 'code.md'
|
58
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code"><b><i>.my-class</i></b> {
|
59
|
+
<b>color:</b> <b>red</b>;
|
60
|
+
}</code></pre>
|
61
|
+
HTML
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_code_with_highlight
|
65
|
+
assert_markdown <<-HTML, 'code-with-highlight.md'
|
66
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">.+<strong class="livingstyleguide--code-highlight">example</strong>.+</code></pre>
|
67
|
+
HTML
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_code_with_highlight_block
|
71
|
+
assert_markdown <<-HTML, 'code-with-highlight-block.md'
|
72
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code"><strong class="livingstyleguide--code-highlight-block">.+Block example.+</strong></code></pre>
|
73
|
+
HTML
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_example_with_highlight
|
77
|
+
assert_markdown <<-HTML, 'example-with-highlight.md'
|
78
|
+
<div class="livingstyleguide--example">
|
79
|
+
<img class="inline example">
|
80
|
+
<img class="inline ex-1 ex-2">
|
81
|
+
</div>
|
82
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">.+<strong class="livingstyleguide--code-highlight">example</strong>.+
|
83
|
+
<strong class="livingstyleguide--code-highlight">ex-1</strong> <strong class="livingstyleguide--code-highlight">ex-2</strong>.+</code></pre>
|
84
|
+
HTML
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_variables
|
88
|
+
assert_markdown <<-HTML, 'variables.md'
|
89
|
+
<ul class="livingstyleguide--color-swatches">
|
90
|
+
<li class="livingstyleguide--color-swatch $blue">$blue</li>
|
91
|
+
<li class="livingstyleguide--color-swatch $green">$green</li>
|
92
|
+
</ul>
|
93
|
+
HTML
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_font_example
|
97
|
+
assert_markdown <<-HTML, 'font-example.md'
|
98
|
+
<div class="livingstyleguide--font-example" style="font: 16px Courier">
|
99
|
+
ABCDEFGHIJKLMNOPQRSTUVWXYZ<br>
|
100
|
+
abcdefghijklmnopqrstuvwxyz<br>
|
101
|
+
0123456789<br>
|
102
|
+
!&/()$=@;:,.
|
103
|
+
</div>
|
104
|
+
HTML
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'compass'
|
4
|
+
require 'compass/logger'
|
5
|
+
require 'sass/plugin'
|
6
|
+
|
7
|
+
class VariablesImporterTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
Compass.configure_sass_plugin!
|
11
|
+
end
|
12
|
+
|
13
|
+
def render(scss)
|
14
|
+
scss = %Q(@import "compass"; #{scss})
|
15
|
+
options = Compass.sass_engine_options
|
16
|
+
options[:line_comments] = false
|
17
|
+
options[:style] = :expanded
|
18
|
+
options[:syntax] = :scss
|
19
|
+
options[:compass] ||= {}
|
20
|
+
options[:compass][:logger] ||= Compass::NullLogger.new
|
21
|
+
css = Sass::Engine.new(scss, options).render
|
22
|
+
format_css(css)
|
23
|
+
end
|
24
|
+
|
25
|
+
def format_css(css)
|
26
|
+
css.gsub! %Q(@charset "UTF-8";), ''
|
27
|
+
css.gsub! %r(\n), "\n "
|
28
|
+
css.gsub! %r( +$), ''
|
29
|
+
css.gsub! %r(\n\n+), "\n"
|
30
|
+
css.strip!
|
31
|
+
%Q( #{css}\n)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_output_of_variables
|
35
|
+
css = render <<-SCSS
|
36
|
+
$livingstyleguide--color: black;
|
37
|
+
%livingstyleguide--code {
|
38
|
+
test: code;
|
39
|
+
}
|
40
|
+
%livingstyleguide--color-swatch {
|
41
|
+
test: color;
|
42
|
+
}
|
43
|
+
@import "variables/colors";
|
44
|
+
@import "variables:variables/colors";
|
45
|
+
SCSS
|
46
|
+
|
47
|
+
assert_equal <<-CSS, css
|
48
|
+
.\\$my-wonderful_red:after, .\\$blue:after {
|
49
|
+
test: code;
|
50
|
+
}
|
51
|
+
.\\$my-wonderful_red {
|
52
|
+
test: color;
|
53
|
+
}
|
54
|
+
.\\$my-wonderful_red:before {
|
55
|
+
background: red;
|
56
|
+
}
|
57
|
+
.\\$my-wonderful_red:after {
|
58
|
+
content: "red";
|
59
|
+
}
|
60
|
+
.\\$blue:after {
|
61
|
+
content: "blue";
|
62
|
+
}
|
63
|
+
CSS
|
64
|
+
end
|
65
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SassExtensionsTest < Test::Unit::TestCase
|
4
|
+
def test_list_variables_for_file
|
5
|
+
assert_equal 'my-wonderful_red blue', evaluate(%Q(list-variables("variables/colors.scss")))
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_list_variables_for_scss_files_without_extension
|
9
|
+
assert_equal 'my-wonderful_red blue', evaluate(%Q(list-variables("variables/colors")))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_list_variables_for_sass_files_without_extension
|
13
|
+
assert_equal 'blue green', evaluate(%Q(list-variables("variables/other-colors")))
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_list_variables_for_files_starting_with_underscore
|
17
|
+
assert_equal 'blue green', evaluate(%Q(list-variables("variables/more-other-colors")))
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_list_variables_for_directories
|
21
|
+
assert_equal 'blue green my-wonderful_red', evaluate(%Q(list-variables("variables/*")))
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
def evaluate(value)
|
26
|
+
Sass::Script::Parser.parse(value, 0, 0).perform(Sass::Environment.new).to_s
|
27
|
+
end
|
28
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: livingstyleguide
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,88 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
12
|
+
date: 2013-02-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: minisyntax
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: middleman
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 3.0.9
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.0.9
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: compass
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: sass
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: redcarpet
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
14
94
|
description: Living Style Guide
|
15
95
|
email:
|
16
96
|
- nico@hagenburger.net
|
@@ -24,8 +104,34 @@ files:
|
|
24
104
|
- README.md
|
25
105
|
- Rakefile
|
26
106
|
- lib/livingstyleguide.rb
|
107
|
+
- lib/livingstyleguide/markdown_extensions.rb
|
108
|
+
- lib/livingstyleguide/sass_extensions.rb
|
109
|
+
- lib/livingstyleguide/sass_extensions/functions.rb
|
110
|
+
- lib/livingstyleguide/variables_importer.rb
|
111
|
+
- lib/livingstyleguide/variables_importer/content.erb
|
27
112
|
- lib/livingstyleguide/version.rb
|
28
113
|
- livingstyleguide.gemspec
|
114
|
+
- stylesheets/_livingstyleguide.scss
|
115
|
+
- stylesheets/livingstyleguide/_code.scss
|
116
|
+
- stylesheets/livingstyleguide/_color-swatches.scss
|
117
|
+
- stylesheets/livingstyleguide/_content.scss
|
118
|
+
- stylesheets/livingstyleguide/_layout.scss
|
119
|
+
- test/fixtures/markdown/code-with-highlight-block.md
|
120
|
+
- test/fixtures/markdown/code-with-highlight.md
|
121
|
+
- test/fixtures/markdown/code.md
|
122
|
+
- test/fixtures/markdown/example-with-highlight.md
|
123
|
+
- test/fixtures/markdown/example.md
|
124
|
+
- test/fixtures/markdown/font-example.md
|
125
|
+
- test/fixtures/markdown/layout-example.md
|
126
|
+
- test/fixtures/markdown/text.md
|
127
|
+
- test/fixtures/markdown/variables.md
|
128
|
+
- test/fixtures/stylesheets/variables/_more-other-colors.sass
|
129
|
+
- test/fixtures/stylesheets/variables/colors.scss
|
130
|
+
- test/fixtures/stylesheets/variables/other-colors.sass
|
131
|
+
- test/integration/markdown_test.rb
|
132
|
+
- test/integration/variables_test.rb
|
133
|
+
- test/test_helper.rb
|
134
|
+
- test/unit/sass_extensions_test.rb
|
29
135
|
homepage: ''
|
30
136
|
licenses: []
|
31
137
|
post_install_message:
|
@@ -50,4 +156,21 @@ rubygems_version: 1.8.23
|
|
50
156
|
signing_key:
|
51
157
|
specification_version: 3
|
52
158
|
summary: Living Style Guide
|
53
|
-
test_files:
|
159
|
+
test_files:
|
160
|
+
- test/fixtures/markdown/code-with-highlight-block.md
|
161
|
+
- test/fixtures/markdown/code-with-highlight.md
|
162
|
+
- test/fixtures/markdown/code.md
|
163
|
+
- test/fixtures/markdown/example-with-highlight.md
|
164
|
+
- test/fixtures/markdown/example.md
|
165
|
+
- test/fixtures/markdown/font-example.md
|
166
|
+
- test/fixtures/markdown/layout-example.md
|
167
|
+
- test/fixtures/markdown/text.md
|
168
|
+
- test/fixtures/markdown/variables.md
|
169
|
+
- test/fixtures/stylesheets/variables/_more-other-colors.sass
|
170
|
+
- test/fixtures/stylesheets/variables/colors.scss
|
171
|
+
- test/fixtures/stylesheets/variables/other-colors.sass
|
172
|
+
- test/integration/markdown_test.rb
|
173
|
+
- test/integration/variables_test.rb
|
174
|
+
- test/test_helper.rb
|
175
|
+
- test/unit/sass_extensions_test.rb
|
176
|
+
has_rdoc:
|