livingstyleguide 2.0.0.pre.3 → 2.0.0.pre.4

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/bin/livingstyleguide +1 -1
  3. data/lib/livingstyleguide/command_line_interface.rb +14 -11
  4. data/lib/livingstyleguide/commands/colors.rb +16 -16
  5. data/lib/livingstyleguide/commands/default.rb +1 -1
  6. data/lib/livingstyleguide/commands/font_example.rb +2 -1
  7. data/lib/livingstyleguide/commands/full_width.rb +1 -1
  8. data/lib/livingstyleguide/commands/import_and_use.rb +16 -4
  9. data/lib/livingstyleguide/commands/layout.rb +22 -20
  10. data/lib/livingstyleguide/commands/options.rb +9 -9
  11. data/lib/livingstyleguide/commands/sass.rb +5 -11
  12. data/lib/livingstyleguide/commands/search_box.rb +6 -3
  13. data/lib/livingstyleguide/commands/style.rb +1 -1
  14. data/lib/livingstyleguide/document.rb +64 -41
  15. data/lib/livingstyleguide/integration/compass.rb +5 -2
  16. data/lib/livingstyleguide/integration/rails.rb +5 -3
  17. data/lib/livingstyleguide/integration/sass.rb +1 -1
  18. data/lib/livingstyleguide/integration/sprockets.rb +9 -4
  19. data/lib/livingstyleguide/markdown_extensions.rb +20 -11
  20. data/lib/livingstyleguide/templates/code.html.erb +1 -1
  21. data/lib/livingstyleguide/templates/example.html.erb +2 -2
  22. data/lib/livingstyleguide/templates/font-example.html.erb +3 -3
  23. data/lib/livingstyleguide/templates/javascript.html.erb +1 -1
  24. data/lib/livingstyleguide/templates/layout.html.erb +32 -38
  25. data/lib/livingstyleguide/templates/logo.html.erb +1 -1
  26. data/lib/livingstyleguide/templates/scripts/copy.js.erb +12 -12
  27. data/lib/livingstyleguide/templates/scripts/copy_code.js.erb +7 -7
  28. data/lib/livingstyleguide/templates/scripts/copy_colors.js.erb +14 -14
  29. data/lib/livingstyleguide/templates/scripts/search.js.erb +30 -30
  30. data/lib/livingstyleguide/templates/scripts/toggle_code.js.erb +23 -23
  31. data/lib/livingstyleguide/templates/search-box.html.erb +1 -1
  32. data/lib/livingstyleguide/templates/toggle-code.html.erb +1 -1
  33. data/lib/livingstyleguide/tilt_template.rb +17 -19
  34. data/lib/livingstyleguide/version.rb +1 -1
  35. data/lib/livingstyleguide.rb +12 -2
  36. data/stylesheets/_livingstyleguide.scss +76 -65
  37. data/stylesheets/livingstyleguide/_code.scss +51 -51
  38. data/stylesheets/livingstyleguide/_color-swatches.scss +38 -38
  39. data/stylesheets/livingstyleguide/_content.scss +73 -73
  40. data/stylesheets/livingstyleguide/_functions.scss +1 -1
  41. data/stylesheets/livingstyleguide/_layout.scss +22 -22
  42. data/stylesheets/livingstyleguide/_reset.scss +1 -1
  43. data/stylesheets/livingstyleguide/_search-box.scss +14 -14
  44. data/stylesheets/livingstyleguide/_toggle-code.scss +10 -11
  45. metadata +21 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a121cfdb20c0610f7812247a4566ae7143f97ca4
4
- data.tar.gz: 83af58f208d28380bfb9e38546c6c1612313e407
3
+ metadata.gz: 25ce8afc33ae405fcf54ef052d1a3faa6e25b20b
4
+ data.tar.gz: f285f19dcea8ef29dcc9044ad9ecc21b7dc476e2
5
5
  SHA512:
6
- metadata.gz: c41a5dd16192b78f8c42e2ceb2753d8e83ef9e32e767495bd68fa0f22ce0a6674f4eb82d8aa63a0dd2f208a75e03265cb175b8152d2b55f986c7b53ce1e467cb
7
- data.tar.gz: 399f81fd8d0a3e4d358d65294790e8cf21ed8713c8d3bc721d2fc671d8609ef149f355b75f363933cb983a27fb31477ed31937ecc35d4961db93f955e5887c32
6
+ metadata.gz: 651a10ac4ce32ced56f0b1a99c01347bd2c96ef5687db65ad2e3e947855ed595257e97edbae6a7225bf6cbd1fe8f77678c2ecfe4acb7cbcd907011969730fec2
7
+ data.tar.gz: 34d1320a6adf0fe9ea7bad92d885c44873149661ef1827bd1fd07d69b2f24ca8b4d1d00d5062a14cfe3bd0e4cc18f7a2d659c038f72f77f679486295ce232444
data/bin/livingstyleguide CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "rubygems"
4
4
  begin
5
- require "bundler/setup"
5
+ require "bundler/setup"
6
6
  rescue LoadError
7
7
  end
8
8
 
@@ -3,8 +3,8 @@ require "tilt"
3
3
 
4
4
  module LivingStyleGuide
5
5
  class CommandLineInterface < Thor
6
-
7
- desc "compile input_file output_file", "Compiles the living style guide to HTML."
6
+ desc "compile input_file output_file",
7
+ "Compiles the living style guide to HTML."
8
8
  def compile(input_file = nil, output_file = nil)
9
9
  doc = LivingStyleGuide::Document.new(input_file) do
10
10
  input(input_file)
@@ -12,34 +12,37 @@ module LivingStyleGuide
12
12
  output doc.render, input_file, output_file
13
13
  end
14
14
 
15
- desc "version", "Shows the current version of the Gem"
15
+ desc "version",
16
+ "Shows the current version of the Gem"
16
17
  def version
17
18
  puts "LivingStyleGuide #{LivingStyleGuide::VERSION}"
18
19
  end
19
20
 
20
21
  private
22
+
21
23
  def input(input_file = nil)
22
24
  @input ||= if input_file.nil?
23
- $stdin.read
24
- else
25
- File.read(input_file)
26
- end
25
+ $stdin.read
26
+ else
27
+ File.read(input_file)
28
+ end
27
29
  end
28
30
 
29
- private
30
31
  def output(html, input_file = nil, output_file = nil)
31
32
  if input_file.nil?
32
33
  puts html
33
34
  else
34
- output_file = input_file.sub(/(\.html)?\.lsg$/, ".html") if output_file.nil?
35
+ if output_file.nil?
36
+ output_file = input_file.sub(/(\.html)?\.lsg$/, ".html")
37
+ end
35
38
  if defined?(Compass)
36
39
  Compass.add_project_configuration
37
- output_file = output_file.sub(/^#{Compass.configuration.sass_dir}/, Compass.configuration.css_dir)
40
+ output_file = output_file.sub(/^#{Compass.configuration.sass_dir}/,
41
+ Compass.configuration.css_dir)
38
42
  end
39
43
  File.write output_file, html
40
44
  puts "Successfully generated a living style guide at #{output_file}."
41
45
  end
42
46
  end
43
-
44
47
  end
45
48
  end
@@ -1,35 +1,35 @@
1
1
  require "digest/sha1"
2
2
 
3
3
  LivingStyleGuide.command :colors do |arguments, options, content|
4
- colors = content.split(/\n+/).map{ |l| l.strip.split(/(?<![,\(])\s+(?!\))/) }
5
- columns = colors.map{ |l| l.size }.max
4
+ colors = content.split(/\n+/).map { |l| l.strip.split(/(?<![,\(])\s+(?!\))/) }
5
+ columns = colors.map(&:size).max
6
6
  colors = colors.flatten
7
7
 
8
8
  def color_class(color)
9
- "lsg--color-" + Digest::SHA1.hexdigest(color)[0..7]
9
+ "lsg-color-" + Digest::SHA1.hexdigest(color)[0..7]
10
10
  end
11
11
 
12
+ colors_as_sass_map = colors.reject { |c| c == "-" }.uniq.map do |color|
13
+ %Q("#{color_class(color)}": #{color})
14
+ end.join(", ")
12
15
  document.scss << <<-SCSS
13
- $lsg--colors: () !default;
14
- $lsg--colors: join(
15
- $lsg--colors, (#{
16
- colors.reject{ |c| c == '-' }.map do |color|
17
- %Q("#{color_class(color)}": #{color})
18
- end.join(', ')
19
- })
20
- );
16
+ $lsg-colors: () !default;
17
+ $lsg-colors: join($lsg-colors, (#{colors_as_sass_map}));
21
18
  SCSS
22
19
 
23
20
  colors_html = colors.map do |color|
24
21
  if color == "-"
25
- %Q(<li class="lsg--color-swatch -lsg-empty"></li>\n)
22
+ %(<li class="lsg-color-swatch lsg-empty"></li>\n)
26
23
  else
27
24
  unless color =~ /^(#[0-9a-f]{3,6}|[a-z]+)$/
28
- source = %Q(<span class="lsg--color-swatch-source">#{color}</span>)
25
+ source = %(<span class="lsg-color-swatch-source">#{color}</span>)
29
26
  end
30
- value = %Q(<span class="lsg--color-swatch-value #{color_class(color)}"></span>)
31
- %Q(<li class="lsg--color-swatch #{color_class(color)}">#{source}#{value}</li>\n)
27
+ class_name = "lsg-color-swatch-value #{color_class(color)}"
28
+ value = %(<span class="#{class_name}"></span>)
29
+ class_name = "lsg-color-swatch #{color_class(color)}"
30
+ %(<li class="#{class_name}">#{source}#{value}</li>\n)
32
31
  end
33
32
  end.join("\n")
34
- %(<ul class="lsg--color-swatches -lsg-#{columns}-columns">\n#{colors_html}\n</ul>\n)
33
+ class_name = "lsg-color-swatches lsg-#{columns}-columns"
34
+ %(<ul class="#{class_name}">\n#{colors_html}\n</ul>\n)
35
35
  end
@@ -1,5 +1,5 @@
1
1
  LivingStyleGuide.command :default do |arguments, options, block|
2
- key = arguments.first ? arguments.first.gsub("-", "_").to_sym : :global
2
+ key = arguments.first ? arguments.first.tr("-", "_").to_sym : :global
3
3
  document.defaults[key] ||= {}
4
4
  document.defaults[key].merge!(options)
5
5
  nil
@@ -1,4 +1,5 @@
1
- LivingStyleGuide.default_options[:font_example] = { text: <<-TEXT }
1
+ LivingStyleGuide.default_options[:font_example] ||= {}
2
+ LivingStyleGuide.default_options[:font_example][:text] ||= <<-TEXT
2
3
  Aa
3
4
  ABCDEFGHIJKLMNOPQRSTUVWXYZ
4
5
  abcdefghijklmnopqrstuvwxyz
@@ -1,4 +1,4 @@
1
1
  LivingStyleGuide.command :full_width do |arguments, options, block|
2
- document.classes << '-lsg-has-full-width'
2
+ document.classes << "lsg-has-full-width"
3
3
  nil
4
4
  end
@@ -1,11 +1,19 @@
1
1
  require "tilt"
2
2
 
3
- def map_files(glob, &block)
3
+ def map_files(glob)
4
4
  glob << ".lsg" unless glob =~ /\.(\w+|\*)$/
5
5
  glob.gsub!(/[^\/]+$/, "{_,}\\0")
6
6
  glob = File.join(document.path, glob)
7
7
 
8
- Dir.glob(glob).map do |file|
8
+ files = Dir.glob(glob)
9
+ if glob.index("*")
10
+ files.uniq!
11
+ files.reject! { |f| document.files.include?(f) }
12
+ else
13
+ raise Errno::ENOENT if files.empty?
14
+ end
15
+
16
+ files.map do |file|
9
17
  document.depend_on file
10
18
  yield(file)
11
19
  end.join
@@ -14,13 +22,17 @@ end
14
22
  LivingStyleGuide.command :import do |arguments, options, data|
15
23
  glob = arguments.first
16
24
  if glob =~ /\.s[ac]ss$/
17
- raise "Error: Please use `@css #{glob}` instead of `@import #{glob}` for importing Sass."
25
+ raise <<-ERROR.strip.squeeze
26
+ Error: Please use `@css #{glob}` instead of `@import #{glob}`
27
+ for importing Sass.
28
+ ERROR
18
29
  end
19
30
 
20
31
  data = LivingStyleGuide.parse_data(data)
21
32
 
22
33
  map_files glob do |file|
23
- html = ::Tilt.new(file, livingstyleguide: document).render(document.scope, data)
34
+ template = ::Tilt.new(file, livingstyleguide: document)
35
+ html = template.render(document.scope, data)
24
36
  html.gsub!("\n", "\n ")
25
37
  "\n<div>\n#{html}\n</div>\n"
26
38
  end
@@ -3,30 +3,32 @@ LivingStyleGuide.command :title do |arguments, options, block|
3
3
  nil
4
4
  end
5
5
 
6
- { :before => :head, :after => :footer }.each do |name, destination|
7
- eval <<-RUBY
8
- LivingStyleGuide.command :javascript_#{name} do |arguments, options, block|
9
- if src = arguments.first
10
- document.#{destination} << %Q(<script src="\#{src}"></script>)
11
- else
12
- if options[:transpiler] == "coffee-script"
13
- block = Tilt["coffee"].new{ block }.render
14
- end
15
- document.#{destination} << %Q(<script>\\n\#{block}\\n</script>)
6
+ { before: :head, after: :footer }.each do |name, destination|
7
+ LivingStyleGuide.command :"javascript_#{name}" do |arguments, options, block|
8
+ content = document.send(:"#{destination}")
9
+ if src = arguments.first
10
+ content << %Q(<script src="#{src}"></script>)
11
+ else
12
+ if options[:transpiler] == "coffee-script"
13
+ block = Tilt["coffee"].new { block }.render
16
14
  end
17
- nil
15
+ content << %Q(<script>\n#{block}\n</script>)
18
16
  end
19
- RUBY
17
+ document.send(:"#{destination}=", content)
18
+ nil
19
+ end
20
20
  end
21
21
 
22
- %w(head header footer before after).each do |part|
23
- eval <<-RUBY
24
- LivingStyleGuide.command :#{part} do |arguments, options, block|
25
- html = LivingStyleGuide::Document.new(livingstyleguide: document) { block }
26
- html.type = options[:type]
27
- document.#{part} << html.render + "\n"
28
- nil
22
+ %w(head header footer before after).each do |destination|
23
+ LivingStyleGuide.command :"#{destination}" do |arguments, options, block|
24
+ content = document.send(:"#{destination}")
25
+ html = LivingStyleGuide::Document.new(livingstyleguide: document) do
26
+ block
29
27
  end
30
- RUBY
28
+ html.type = options[:type]
29
+ content << html.render + "\n"
30
+ document.send(:"#{destination}=", content)
31
+ nil
32
+ end
31
33
  nil
32
34
  end
@@ -1,15 +1,15 @@
1
1
  LivingStyleGuide.command :set do |arguments, options, block|
2
2
  options.each do |key, value|
3
3
  document.options[key] = case value
4
- when "true"
5
- true
6
- when "false"
7
- false
8
- when /^\d+$/
9
- value.to_i
10
- else
11
- value
12
- end
4
+ when "true"
5
+ true
6
+ when "false"
7
+ false
8
+ when /^\d+$/
9
+ value.to_i
10
+ else
11
+ value
12
+ end
13
13
  end
14
14
  nil
15
15
  end
@@ -2,14 +2,14 @@ require "sass"
2
2
 
3
3
  LivingStyleGuide.command :scss do |arguments, options, scss|
4
4
  file = arguments.first
5
- if file
5
+ if options[:scope] == "global" || file == "!global"
6
+ document.scss << scss
7
+ elsif file
6
8
  if document.file
7
9
  file = File.join(File.dirname(document.file), file)
8
10
  end
9
11
  document.depend_on file
10
12
  document.scss << %Q(@import "#{file}";\n)
11
- elsif options[:scope] == "global"
12
- document.scss << scss
13
13
  else
14
14
  id = document.id.gsub(/[\/\.]/, '\\\\\0')
15
15
  document.scss << "##{id} {\n#{scss}\n}\n"
@@ -18,12 +18,6 @@ LivingStyleGuide.command :scss do |arguments, options, scss|
18
18
  end
19
19
 
20
20
  LivingStyleGuide.command :sass do |arguments, options, sass|
21
- file = arguments.first
22
- if file
23
- scss(arguments, options, nil)
24
- else
25
- converted = Sass::Engine.new(sass).to_tree.to_scss
26
- scss(arguments, options, converted)
27
- end
28
- nil
21
+ converted = Sass::Engine.new(sass).to_tree.to_scss unless sass.nil?
22
+ scss(arguments, options, converted)
29
23
  end
@@ -3,8 +3,11 @@ LivingStyleGuide.default_options[:search_box] = {
3
3
  }
4
4
 
5
5
  LivingStyleGuide.command :search_box do |arguments, options, content|
6
- placeholder = options[:placeholder] || LivingStyleGuide.default_options[:search_box][:placeholder]
7
- document.before << LivingStyleGuide.template("search-box.html.erb", binding)
8
- document.javascript << LivingStyleGuide.template("scripts/search.js.erb", binding)
6
+ placeholder = options[:placeholder]
7
+ placeholder ||= LivingStyleGuide.default_options[:search_box][:placeholder]
8
+ document.before <<
9
+ LivingStyleGuide.template("search-box.html.erb", binding)
10
+ document.javascript <<
11
+ LivingStyleGuide.template("scripts/search.js.erb", binding)
9
12
  nil
10
13
  end
@@ -1,7 +1,7 @@
1
1
  LivingStyleGuide.command :style do |arguments, options, block|
2
2
  options.delete :block_type
3
3
  options.each do |key, value|
4
- document.scss << %Q($lsg--#{key.to_s.gsub("_", "-")}: #{value};\n)
4
+ document.scss << %Q($lsg-#{key.to_s.tr('_', '-')}: #{value};\n)
5
5
  end
6
6
  nil
7
7
  end
@@ -12,7 +12,9 @@ class LivingStyleGuide::Document < ::Tilt::Template
12
12
  attr_accessor :syntax
13
13
  attr_reader :scope
14
14
 
15
- %w(scss head header footer defaults javascript before after).each do |attr|
15
+ %w(
16
+ scss head header footer defaults javascript before after files
17
+ ).each do |attr|
16
18
  define_method attr do
17
19
  if options.has_key?(:livingstyleguide)
18
20
  options[:livingstyleguide].send(attr)
@@ -25,7 +27,7 @@ class LivingStyleGuide::Document < ::Tilt::Template
25
27
  if options.has_key?(:livingstyleguide)
26
28
  options[:livingstyleguide].send("#{attr}=", value)
27
29
  else
28
- instance_variable_get("@#{attr}", value)
30
+ instance_variable_set("@#{attr}", value)
29
31
  end
30
32
  end
31
33
  end
@@ -35,9 +37,14 @@ class LivingStyleGuide::Document < ::Tilt::Template
35
37
  end
36
38
 
37
39
  def prepare
40
+ if options.has_key?(:livingstyleguide)
41
+ @template = :default
42
+ else
43
+ @template = :layout
44
+ @files = []
45
+ end
38
46
  @type = :lsg
39
47
  @commands = LivingStyleGuide::Commands.new(self)
40
- @template = options.has_key?(:livingstyleguide) ? :default : :layout
41
48
  @classes = []
42
49
  @scss = ""
43
50
  @css = ""
@@ -82,7 +89,10 @@ class LivingStyleGuide::Document < ::Tilt::Template
82
89
 
83
90
  def erb
84
91
  @erb ||= parse_commands do |name, arguments, options, block|
85
- options = %Q(document.defaults[:global].merge(document.defaults[:@#{name}] || {}).merge(#{options.inspect}))
92
+ global = "document.defaults[:global]"
93
+ scoped = "document.defaults[:@#{name}] || {}"
94
+ local = options.inspect
95
+ options = "#{global}.merge(#{scoped}).merge(#{local})"
86
96
  "<%= #{name}(#{arguments.inspect}, #{options}, #{block.inspect}) %>\n"
87
97
  end
88
98
  end
@@ -91,7 +101,8 @@ class LivingStyleGuide::Document < ::Tilt::Template
91
101
  @head = ""
92
102
  @javascript = ""
93
103
  %w(copy copy_code copy_colors toggle_code).each do |partial|
94
- @javascript << LivingStyleGuide.template("scripts/#{partial}.js.erb", binding)
104
+ file = "scripts/#{partial}.js.erb"
105
+ @javascript << LivingStyleGuide.template(file, binding)
95
106
  end
96
107
  @header = ""
97
108
  @before = ""
@@ -101,27 +112,31 @@ class LivingStyleGuide::Document < ::Tilt::Template
101
112
  result = ERB.new(erb).result(@commands.get_binding)
102
113
  @source = result
103
114
  @html = render_html(result, locals)
104
- @classes.unshift "lsg--#{@type}-example"
105
- @classes.unshift "lsg--example"
115
+ @classes.unshift "lsg-#{@type}-example"
116
+ @classes.unshift "lsg-example"
106
117
  ERB.new(template_erb).result(binding).gsub(/\n\n+/, "\n")
107
118
  end
108
119
 
109
120
  def depend_on(file)
121
+ files << file
110
122
  @scope.depend_on(File.expand_path(file)) if @scope.respond_to?(:depend_on)
111
123
  end
112
124
 
113
125
  private
126
+
114
127
  def render_html(result, locals)
115
128
  if @type == :lsg
116
- renderer = LivingStyleGuide::RedcarpetHTML.new(LivingStyleGuide.default_options, self)
117
- redcarpet = ::Redcarpet::Markdown.new(renderer, LivingStyleGuide::REDCARPET_RENDER_OPTIONS)
129
+ renderer_options = LivingStyleGuide.default_options
130
+ renderer = LivingStyleGuide::RedcarpetHTML.new(self, renderer_options)
131
+ redcarpet_options = LivingStyleGuide::REDCARPET_RENDER_OPTIONS
132
+ redcarpet = ::Redcarpet::Markdown.new(renderer, redcarpet_options)
118
133
  redcarpet.render(result)
119
134
  elsif engine = Tilt[@type]
120
135
  begin
121
136
  require "tilt/#{template_name}"
122
137
  rescue LoadError
123
138
  end
124
- template = engine.new{ remove_highlights(result) }
139
+ template = engine.new { remove_highlights(result) }
125
140
  (@locals.is_a?(Array) ? @locals : [@locals]).map do |current_locals|
126
141
  template.render(@scope || Object.new, current_locals.merge(locals))
127
142
  end.join("\n")
@@ -132,14 +147,12 @@ class LivingStyleGuide::Document < ::Tilt::Template
132
147
  end
133
148
  end
134
149
 
135
- private
136
- def set_highlights(code, &block)
150
+ def set_highlights(code)
137
151
  code, positions = remove_highlight_marker_and_save_positions(code)
138
152
  html = yield(code)
139
153
  insert_html_highlight_marker(html, positions)
140
154
  end
141
155
 
142
- private
143
156
  def remove_highlight_marker_and_save_positions(code)
144
157
  positions = []
145
158
  index = 0
@@ -150,7 +163,6 @@ class LivingStyleGuide::Document < ::Tilt::Template
150
163
  [code_without_highlights, positions]
151
164
  end
152
165
 
153
- private
154
166
  def insert_html_highlight_marker(html, positions)
155
167
  code_with_highlights = ""
156
168
  index = 0
@@ -169,14 +181,14 @@ class LivingStyleGuide::Document < ::Tilt::Template
169
181
  code_with_highlights << %Q(</strong>)
170
182
  inside_highlight = false
171
183
  else
172
- code_with_highlights << %Q(<strong class="lsg--code-highlight">)
184
+ code_with_highlights << %Q(<strong class="lsg-code-highlight">)
173
185
  inside_highlight = true
174
186
  end
175
187
  next_position = positions.shift
176
188
  end
177
189
  if char == "&"
178
190
  inside_character = true
179
- elsif inside_character and char == ";"
191
+ elsif inside_character && char == ";"
180
192
  inside_character = false
181
193
  index += 1
182
194
  elsif not inside_character
@@ -189,30 +201,24 @@ class LivingStyleGuide::Document < ::Tilt::Template
189
201
  code_with_highlights
190
202
  end
191
203
 
192
- private
193
204
  def remove_highlights(code)
194
205
  code.gsub(/\*\*\*/, "")
195
206
  end
196
207
 
197
- private
198
208
  def template_erb
199
209
  File.read("#{File.dirname(__FILE__)}/templates/#{@template}.html.erb")
200
210
  end
201
211
 
202
- private
203
212
  def parse_commands
204
- data.gsub("<%", "<%%").gsub(/\G(.*?)((```.+?```)|\Z)/m) do
205
- content, code_block = $1, $2
206
- content.gsub!(/^@([\w\d_-]+)(?: ([^\n]*[^\{\n:]))?(?: *\{\n((?:.|\n)*?)\n\}|((?:\n+ .*)+(?=\n|\Z))| *:\n((?:.|\n)*?)(?:\n\n|\Z))?/) do
207
- name, arguments_string, block = $1, $2 || "", $3 || $4 || $5
208
- options = {
209
- block_type: $3 ? :braces : $4 ? :indented : $5 ? :block : :none
210
- }
211
- name = name.gsub("-", "_").to_sym
212
- arguments = parse_arguments(arguments_string, options)
213
- if options[:block_type] == :indented
214
- block.gsub!(/\A\n(\s*)((?:.|\n)+)\Z/){ $2.gsub(/^#{$1}/, "") }
215
- end
213
+ doc = (data || "").gsub("<%", "<%%")
214
+ doc.gsub(/\G(?<content>.*?)(?<code_block>(?:```.+?```)|\Z)/m) do
215
+ content = $~[:content]
216
+ code_block = $~[:code_block]
217
+ content.gsub!(LivingStyleGuide::COMMANDS_REGEXP) do
218
+ name = $~[:name].tr("-", "_").to_sym
219
+ options = {}
220
+ arguments = parse_arguments($~[:arguments], options)
221
+ block = parse_block($~[:braces], $~[:indented], $~[:colon], options)
216
222
  yield name, arguments, options, block
217
223
  end
218
224
  content.gsub!(/^\\@/, "@")
@@ -220,14 +226,14 @@ class LivingStyleGuide::Document < ::Tilt::Template
220
226
  end
221
227
  end
222
228
 
223
- private
224
229
  def parse_arguments(arguments_string, options)
230
+ return [] if arguments_string.nil?
225
231
  arguments = arguments_string.split(/(?<!\\);/)
226
232
  arguments.map! do |argument|
227
233
  argument.strip!
228
234
  argument.gsub! "\\;", ";"
229
235
  if /^(?<key>[a-zA-Z0-9_\-]+):(?<value>.+)$/ =~ argument
230
- options[key.downcase.gsub("-", "_").to_sym] = remove_quots(value.strip)
236
+ options[key.downcase.tr("-", "_").to_sym] = remove_quots(value.strip)
231
237
  nil
232
238
  else
233
239
  remove_quots(argument)
@@ -236,12 +242,32 @@ class LivingStyleGuide::Document < ::Tilt::Template
236
242
  arguments.compact
237
243
  end
238
244
 
239
- private
245
+ def parse_block(braces_block, indented_block, colon_block, options)
246
+ if braces_block
247
+ options[:block_type] = :braces
248
+ braces_block
249
+ elsif indented_block
250
+ options[:block_type] = :indented
251
+ unindent(indented_block)
252
+ elsif colon_block
253
+ options[:block_type] = :colon
254
+ colon_block
255
+ else
256
+ options[:block_type] = :none
257
+ nil
258
+ end
259
+ end
260
+
261
+ def unindent(block)
262
+ block.gsub(/\A\n(?<indent>(?: |\t)*)(?<content>(?:.|\n)+)\Z/) do
263
+ $~[:content].gsub(/^#{$~[:indent]}/, "")
264
+ end
265
+ end
266
+
240
267
  def remove_quots(string)
241
268
  string.sub(/^"(.*)"$|^"(.*)"$|^(.*)$/, "\\1\\2\\3").gsub(/\\("|")/, "\\1")
242
269
  end
243
270
 
244
- private
245
271
  def gsub_content(regexp, &block)
246
272
  if @type == :lsg
247
273
  data.gsub(/\G(.+?)((```.+?```)|\Z)/m) do
@@ -253,12 +279,10 @@ class LivingStyleGuide::Document < ::Tilt::Template
253
279
  end
254
280
  end
255
281
 
256
- private
257
282
  def template_name
258
- (@type == :lsg or @type == :markdown) ? :redcarpet : @type
283
+ (@type == :lsg || @type == :markdown) ? :redcarpet : @type
259
284
  end
260
285
 
261
- private
262
286
  def generate_id
263
287
  if @file
264
288
  id = Pathname.new(@file).cleanpath.to_s
@@ -268,12 +292,10 @@ class LivingStyleGuide::Document < ::Tilt::Template
268
292
  end
269
293
  end
270
294
 
271
- private
272
295
  def scss_template
273
296
  ::LivingStyleGuide.default_options[:scss_template] || Tilt["scss"]
274
297
  end
275
298
 
276
- private
277
299
  def render_scss(scss)
278
300
  sass_options = options.merge(custom: { sprockets_context: @scope })
279
301
  sass_options[:load_paths] ||= []
@@ -283,7 +305,8 @@ class LivingStyleGuide::Document < ::Tilt::Template
283
305
  sass_options[:load_paths] << path
284
306
  end
285
307
  end
286
- scss_template.new(file, sass_options){ scss }.render(@scope || Object.new)
308
+ template = scss_template.new(file, sass_options) { scss }
309
+ template.render(@scope || Object.new)
287
310
  end
288
311
  end
289
312