kss 0.1.3 → 0.2.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/lib/kss.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'sass'
2
+ require 'v8'
3
+ require 'less'
2
4
 
3
5
  require 'kss/modifier'
4
6
  require 'kss/parser'
@@ -12,30 +12,75 @@ module Kss
12
12
  @sections = {}
13
13
 
14
14
  Dir["#{base_path}/**/*.*"].each do |filename|
15
- root_node = Sass::SCSS::Parser.new(File.read(filename), filename).parse
16
- parse_node(root_node, filename)
15
+ if File.extname(filename) == ".less"
16
+ tree = Less::Parser.new(:paths => [base_path], :filename => filename).
17
+ # HACK: get the internal JS tree object
18
+ parse(File.read(filename)).instance_variable_get "@tree"
17
19
 
20
+ # inject less.js into a new V8 context
21
+ less = Less.instance_variable_get "@less"
22
+ cxt = V8::Context.new
23
+ cxt['less'] = less
24
+
25
+ # parse node tree for comments
26
+ parse_v8_node(cxt, tree, filename)
27
+ else
28
+ if filename.match(/\.css$/)
29
+ root_node = Sass::SCSS::Parser.new(File.read(filename), filename).parse
30
+ else
31
+ root_node = Sass::Engine.for_file(filename, {}).to_tree
32
+ end
33
+ parse_sass_node(root_node, filename)
34
+ end
18
35
  end
19
36
  end
20
37
 
21
- def parse_node parent_node, filename
38
+ # Given a Sass::Tree::Node, find all CommentNodes and populate @sections
39
+ # with parsed Section objects.
40
+ #
41
+ # parent_node - A Sass::Tree::Node to start at.
42
+ # filename - The filename String this node is found at.
43
+ #
44
+ # Returns the Sass::Tree::Node given.
45
+ def parse_sass_node parent_node, filename
22
46
  parent_node.children.each do |node|
23
47
  unless node.is_a? Sass::Tree::CommentNode
24
- parse_node(node, filename) if node.has_children
48
+ parse_sass_node(node, filename) if node.has_children
25
49
  next
26
50
  end
27
- comment_text = self.class.clean_comments node.value[0]
51
+ comment_text = self.class.clean_comments node.to_scss
52
+ add_section node.to_scss, filename
53
+ end
54
+ parent_node
55
+ end
56
+
57
+ def parse_v8_node cxt, parent_node, filename
58
+ parent_node.rules.each do |node|
59
+ # inject the current to into JS context
60
+ cxt['node'] = node
28
61
 
29
- if self.class.kss_block? comment_text
30
- base_name = File.basename(filename)
31
- section = Section.new(comment_text, base_name)
32
- @sections[section.section] = section
62
+ unless cxt.eval "node instanceof less.tree.Comment"
63
+ parse_v8_node(cxt, node, filename) if cxt.eval 'node.rules != null'
64
+
65
+ next
33
66
  end
67
+
68
+ add_section node.value, filename
34
69
  end
35
70
 
36
71
  parent_node
37
72
  end
38
73
 
74
+ def add_section comment, filename
75
+ comment_text = self.class.clean_comments comment
76
+
77
+ if self.class.kss_block? comment_text
78
+ base_name = File.basename(filename)
79
+ section = Section.new(comment_text, base_name)
80
+ @sections[section.section] = section
81
+ end
82
+ end
83
+
39
84
  # Public: Takes a cleaned (no comment syntax like // or /* */) comment
40
85
  # block and determines whether it is a KSS documentation block.
41
86
  #
@@ -55,10 +100,14 @@ module Kss
55
100
  def self.clean_comments(text)
56
101
  text.strip!
57
102
 
58
- # SASS generated comment syntax
103
+ # SASS generated multi-line comment syntax
59
104
  text.gsub!(/(\/\* )?( \*\/)?/, '') # [/* + space] or [space + */]
60
105
  text.gsub!(/\n\s\* ?/, "\n") # * in front of every line
61
106
 
107
+ # SASS generated single-line comment syntax
108
+ text.gsub!(/\/\/ /, '') # [// + space]
109
+ text.gsub!(/\/\/\n/, "\n") # [// + carriage return]
110
+
62
111
  # Manual generated comment syntax
63
112
  text.gsub!(/^\/\*/, '') # starting block
64
113
  text.gsub!(/\*\/$/, '') # ending block
@@ -1,3 +1,3 @@
1
1
  module Kss
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,10 @@
1
+ /*
2
+ A default form label
3
+
4
+ Styleguide 5.0.0
5
+ */
6
+ label {
7
+ display: block;
8
+ float: left;
9
+ width: 150px;
10
+ }
@@ -0,0 +1,51 @@
1
+ /*
2
+ Your standard form button.
3
+
4
+ :hover - Highlights when hovering.
5
+ :disabled - Dims the button when disabled.
6
+ .primary - Indicates button is the primary action.
7
+ .smaller - A little bit smaller now.
8
+
9
+ Styleguide 2.1.1.
10
+ */
11
+ button, .button {
12
+ padding:5px 15px;
13
+
14
+ &.primary, &.primary:hover{
15
+ color:#fff;
16
+ }
17
+
18
+ &.smaller{
19
+ font-size:9px;
20
+ }
21
+
22
+ &:hover{
23
+ color:#337797;
24
+ }
25
+
26
+ &:disabled{
27
+ opacity:0.5;
28
+ }
29
+ }
30
+
31
+ /*
32
+ A button suitable for giving stars to someone.
33
+
34
+ .star-given - A highlight indicating you've already given a star.
35
+ .disabled - Dims the button to indicate it cannot be used.
36
+
37
+ Styleguide 2.2.1.
38
+ */
39
+ a.button.star{
40
+ display:inline-block;
41
+
42
+ .star{ font-size:10px; }
43
+
44
+ &.star-given{
45
+ color:#ae7e00;
46
+ }
47
+
48
+ &.disabled{
49
+ opacity:0.5;
50
+ }
51
+ }
@@ -0,0 +1,8 @@
1
+ /*
2
+ Your standard grid helper.
3
+
4
+ Styleguide 4.0.0.
5
+ */
6
+ .grid(@columns, @max: 10) {
7
+ width: (@columns / @max) * 960px;
8
+ }
@@ -0,0 +1,17 @@
1
+ @import "_label";
2
+ /*
3
+ Your standard form element.
4
+
5
+ Styleguide 3.0.0
6
+ */
7
+ form {
8
+
9
+ /*
10
+ Your standard text input box.
11
+
12
+ Styleguide 3.0.1
13
+ */
14
+ input[type="text"] {
15
+ border: 1px solid #ccc;
16
+ }
17
+ }
@@ -0,0 +1,40 @@
1
+ /* Your standard form button.
2
+ *
3
+ * :hover - Highlights when hovering.
4
+ * :disabled - Dims the button when disabled.
5
+ * .primary - Indicates button is the primary action.
6
+ * .smaller - A little bit smaller now.
7
+ *
8
+ * Styleguide 2.1.1. */
9
+ button
10
+ padding: 5px 15px
11
+
12
+ &.primary, &.primary:hover
13
+ color: #fff
14
+
15
+ &.smaller
16
+ font-size: 11px
17
+
18
+ &:hover
19
+ color: #337797
20
+
21
+ &:disabled
22
+ opacity: 0.5
23
+
24
+ // A button suitable for giving stars to someone.
25
+ //
26
+ // .star-given - A highlight indicating you've already given a star.
27
+ // .disabled - Dims the button to indicate it cannot be used.
28
+ //
29
+ // Styleguide 2.2.1.
30
+ a.button.star
31
+ display: inline-block
32
+
33
+ .star
34
+ font-size: 10px
35
+
36
+ &.star-given
37
+ color: #ae7e00
38
+
39
+ &.disabled
40
+ opacity: 0.5
@@ -0,0 +1,10 @@
1
+ /* Your standard form element.
2
+ *
3
+ * Styleguide 3.0.0 */
4
+ form
5
+
6
+ /* Your standard text input box.
7
+ *
8
+ * Styleguide 3.0.1 */
9
+ input[type="text"]
10
+ border: 1px solid #ccc
@@ -4,7 +4,9 @@ class ParserTest < Kss::Test
4
4
 
5
5
  def setup
6
6
  @scss_parsed = Kss::Parser.new('test/fixtures/scss')
7
+ @sass_parsed = Kss::Parser.new('test/fixtures/sass')
7
8
  @css_parsed = Kss::Parser.new('test/fixtures/css')
9
+ @less_parsed = Kss::Parser.new('test/fixtures/less')
8
10
 
9
11
  @css_comment = <<comment
10
12
  /*
@@ -26,13 +28,22 @@ comment
26
28
  * Styleguide 2.2.1. */
27
29
  comment
28
30
 
31
+ @slashed_css_comment = <<comment
32
+ // A button suitable for giving stars to someone.
33
+ //
34
+ // .star-given - A highlight indicating you've already given a star.
35
+ // .disabled - Dims the button to indicate it cannot be used.
36
+ //
37
+ // Styleguide 2.2.1.
38
+ comment
39
+
29
40
  @indented_css_comment = <<comment
30
41
  /*
31
42
  A button suitable for giving stars to someone.
32
-
43
+
33
44
  .star-given - A highlight indicating you've already given a star.
34
45
  .disabled - Dims the button to indicate it cannot be used.
35
-
46
+
36
47
  Styleguide 2.2.1.
37
48
  */
38
49
  comment
@@ -54,6 +65,21 @@ comment
54
65
  @scss_parsed.section('2.1.1').description
55
66
  end
56
67
 
68
+ test "parsers KSS comments in LESS" do
69
+ assert_equal 'Your standard form button.',
70
+ @less_parsed.section('2.1.1').description
71
+ end
72
+
73
+ test "parses KSS multi-line comments in SASS (/* ... */)" do
74
+ assert_equal 'Your standard form button.',
75
+ @sass_parsed.section('2.1.1').description
76
+ end
77
+
78
+ test "parses KSS single-line comments in SASS (// ... )" do
79
+ assert_equal 'A button suitable for giving stars to someone.',
80
+ @sass_parsed.section('2.2.1').description
81
+ end
82
+
57
83
  test "parses KSS comments in CSS" do
58
84
  assert_equal 'Your standard form button.',
59
85
  @css_parsed.section('2.1.1').description
@@ -64,6 +90,8 @@ comment
64
90
  Kss::Parser.clean_comments(@css_comment)
65
91
  assert_equal @cleaned_css_comment,
66
92
  Kss::Parser.clean_comments(@starred_css_comment)
93
+ assert_equal @cleaned_css_comment,
94
+ Kss::Parser.clean_comments(@slashed_css_comment)
67
95
  assert_equal @cleaned_css_comment,
68
96
  Kss::Parser.clean_comments(@indented_css_comment)
69
97
  end
@@ -73,4 +101,14 @@ comment
73
101
  assert_equal "Your standard text input box.", @scss_parsed.section('3.0.1').description
74
102
  end
75
103
 
104
+ test "parses nested LESS documents" do
105
+ assert_equal "Your standard form element.", @less_parsed.section('3.0.0').description
106
+ assert_equal "Your standard text input box.", @less_parsed.section('3.0.1').description
107
+ end
108
+
109
+ test "parses nested SASS documents" do
110
+ assert_equal "Your standard form element.", @sass_parsed.section('3.0.0').description
111
+ assert_equal "Your standard text input box.", @sass_parsed.section('3.0.1').description
112
+ end
113
+
76
114
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kss
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 3
10
- version: 0.1.3
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kyle Neath
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-12-10 00:00:00 -08:00
18
+ date: 2012-01-22 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -33,6 +33,21 @@ dependencies:
33
33
  version: "3.1"
34
34
  type: :runtime
35
35
  version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: less
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 2
47
+ - 0
48
+ version: "2.0"
49
+ type: :runtime
50
+ version_requirements: *id002
36
51
  description: " Inspired by TomDoc, KSS attempts to provide a methodology for writing\n maintainable, documented CSS within a team. Specifically, KSS is a CSS\n structure, documentation specification, and styleguide format.\n\n This is a ruby library for parsing KSS documented CSS and generating\n styleguides.\n"
37
52
  email: kneath@gmail.com
38
53
  executables: []
@@ -52,6 +67,12 @@ files:
52
67
  - lib/kss.coffee
53
68
  - lib/kss.rb
54
69
  - test/fixtures/css/buttons.css
70
+ - test/fixtures/less/_label.less
71
+ - test/fixtures/less/buttons.less
72
+ - test/fixtures/less/mixins.less
73
+ - test/fixtures/less/nested.less
74
+ - test/fixtures/sass/buttons.sass
75
+ - test/fixtures/sass/nested.sass
55
76
  - test/fixtures/scss/buttons.scss
56
77
  - test/fixtures/scss/nested.scss
57
78
  - test/helper.rb