Skip to content

Commit

Permalink
Clean up Raw
Browse files Browse the repository at this point in the history
  • Loading branch information
ai committed Dec 26, 2013
1 parent eedb06b commit 4bfffb8
Show file tree
Hide file tree
Showing 24 changed files with 100 additions and 222 deletions.
2 changes: 1 addition & 1 deletion lib/at-rule.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class AtRule extends Container
# Stringify at-rule
stringify: (builder, last) ->
name = '@' + @name + if @afterName? then @afterName else ' '
params = @_params.stringify()
params = if @_params then @_params.toString() else ''

if @rules or @decls
params += if @afterParams?
Expand Down
2 changes: 1 addition & 1 deletion lib/declaration.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class Declaration extends Node
# Stringify declaration
stringify: (builder, semicolon) ->
builder(@before) if @before
string = @prop + (@between || ': ') + @_value.stringify()
string = @prop + (@between || ': ') + @_value.toString()
string += @_important || ''
string += ';' if semicolon
builder(string, @)
Expand Down
13 changes: 8 additions & 5 deletions lib/node.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,20 @@ class Node
@raw: (name) ->
hidden = '_' + name

@prototype[hidden] = Raw.empty

@prop name,
get: ->
@[hidden]?.trimmed
prop = @[hidden]
if prop instanceof Raw
prop.value
else
prop
set: (value) ->
if value instanceof Raw
@[hidden] = value
else
@[hidden] = new Raw() if @[hidden] == Raw.empty
else if @[hidden] instanceof Raw
@[hidden].set(value)
else
@[hidden] = value

# Remove this node from parent.
#
Expand Down
15 changes: 6 additions & 9 deletions lib/parse.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ class Parser
[raw, left] = @startSpaces(@prevBuffer())
[raw, right] = @endSpaces(raw)
@current.afterName = left
@current.params = new Raw(raw, @trim @trimmed)
@current.params = Raw.load(@trimmed.trim(), raw)
@current.afterParams = right
@endAtruleParams()

Expand All @@ -141,7 +141,7 @@ class Parser
if @inside('selector')
if @letter == '{'
[raw, spaces] = @endSpaces(@prevBuffer())
@current.selector = new Raw(raw, @trim @trimmed)
@current.selector = Raw.load(@trimmed.trim(), raw)
@current.between = spaces
@semicolon = false
@buffer = ''
Expand All @@ -155,7 +155,7 @@ class Parser
@init new Rule()
if @letter == '{'
@addType('decls')
@current.selector = new Raw('', '')
@current.selector = ''
@current.between = ''
@semicolon = false
@buffer = ''
Expand Down Expand Up @@ -186,7 +186,7 @@ class Parser
@trimmed = @trimmed[1..-1]
@buffer = @buffer[1..-1]

@current.prop = @trim @trimmed
@current.prop = @trimmed.trim()
@current.between = @prevBuffer()[@current.prop.length..-1]
@buffer = ''

Expand Down Expand Up @@ -217,15 +217,15 @@ class Parser
if (@letter == ';' and not @inBrackets) or close
@semicolon = true if @letter == ';'
[raw, spaces] = @startSpaces(@prevBuffer())
trim = @trim(@trimmed)
trim = @trimmed.trim()

if match = raw.match(/\s+!important\s*$/)
@current._important = match[0]
end = -match[0].length - 1
raw = raw[0..end]
trim = trim.replace(/\s+!important\s*$/, '')

@current.value = new Raw(raw, trim)
@current.value = Raw.load(trim, raw)
@current.between += ':' + spaces
@pop()
else
Expand Down Expand Up @@ -376,9 +376,6 @@ class Parser
else
[string, '']

trim: (string) ->
string.replace(/^\s*/, '').replace(/\s*$/, '')

module.exports = (source, opts = { }) ->
parser = new Parser(source, opts)
parser.loop()
Expand Down
28 changes: 15 additions & 13 deletions lib/raw.coffee
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
# Property with trimmed and raw value (with comments and spaces)
class Raw
constructor: (@raw, @trimmed) ->
# Return Raw only if it necessary
@load: (value, raw) ->
if raw? and value != raw
new Raw(value, raw)
else
value

constructor: (@value, @raw) ->

# Set new trimmed value and mark property as changed
set: (value) ->
if @trimmed != value
if @value != value
@raw = @value
@changed = true
@trimmed = value
@value = value

# Stringify to CSS raw value if trimmed wasn’t changed
stringify: (opts = { }) ->
if not @changed
@raw || ''
else if not @raw
(opts.before || '') + @trimmed + (opts.after || '')
toString: ->
if @changed
@value || ''
else
(if @raw[0] == ' ' then ' ' else '') +
@trimmed +
(if @raw[-1..-1] == ' ' then ' ' else '')

Raw.empty = new Raw()
@raw || @value || ''

module.exports = Raw
3 changes: 1 addition & 2 deletions lib/rule.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ class Rule extends Container.WithDecls

# Stringify rule
stringify: (builder) ->
selector = @_selector.stringify()
between = if @between? then @between else ' '
@stringifyBlock(builder, selector + between + '{')
@stringifyBlock(builder, "#{ @_selector + between }{")

module.exports = Rule
40 changes: 8 additions & 32 deletions test/cases/parse/atrule-decls.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
"before": "",
"name": "page",
"afterName": " ",
"_params": {
"raw": ":left",
"trimmed": ":left"
},
"_params": ":left",
"afterParams": " ",
"decls": [
{
Expand All @@ -37,10 +34,7 @@
"before": "\n ",
"prop": "background",
"between": ": ",
"_value": {
"raw": "black",
"trimmed": "black"
}
"_value": "black"
}
],
"after": "\n"
Expand All @@ -60,10 +54,7 @@
"before": "\n\n",
"name": "font-face",
"afterName": " ",
"_params": {
"raw": "",
"trimmed": ""
},
"_params": "",
"afterParams": "",
"decls": [
{
Expand All @@ -81,10 +72,7 @@
"before": "\n ",
"prop": "family-name",
"between": ": ",
"_value": {
"raw": "\"A;' /**/\"",
"trimmed": "\"A;' /**/\""
}
"_value": "\"A;' /**/\""
}
],
"semicolon": true,
Expand All @@ -105,10 +93,7 @@
"before": "\n\n",
"name": "viewport",
"afterName": " ",
"_params": {
"raw": "",
"trimmed": ""
},
"_params": "",
"afterParams": "",
"decls": [
{
Expand All @@ -126,10 +111,7 @@
"before": "\n ",
"prop": "width",
"between": ": ",
"_value": {
"raw": "110px",
"trimmed": "110px"
}
"_value": "110px"
}
],
"semicolon": true,
Expand All @@ -150,10 +132,7 @@
"before": "\n\n",
"name": "-ms-viewport",
"afterName": " ",
"_params": {
"raw": "",
"trimmed": ""
},
"_params": "",
"afterParams": "",
"decls": [
{
Expand All @@ -171,10 +150,7 @@
"before": "\n ",
"prop": "width",
"between": ": ",
"_value": {
"raw": "100px",
"trimmed": "100px"
}
"_value": "100px"
}
],
"semicolon": true,
Expand Down
5 changes: 1 addition & 4 deletions test/cases/parse/atrule-empty.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
"before": "",
"name": "charset",
"afterName": " ",
"_params": {
"raw": "\"UTF-8\"",
"trimmed": "\"UTF-8\""
},
"_params": "\"UTF-8\"",
"afterParams": "",
"semicolon": true
}
Expand Down
5 changes: 1 addition & 4 deletions test/cases/parse/atrule-no-semicolon.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
"before": "\n",
"name": "charset",
"afterName": " ",
"_params": {
"raw": "\"UTF-8\"",
"trimmed": "\"UTF-8\""
},
"_params": "\"UTF-8\"",
"afterParams": ""
}
],
Expand Down
4 changes: 2 additions & 2 deletions test/cases/parse/atrule-params.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
"name": "-moz-document",
"afterName": "",
"_params": {
"raw": "/* near */ /* filter */ url(\"example.com/{\") /* a */",
"trimmed": "url(\"example.com/{\")"
"value": "url(\"example.com/{\")",
"raw": "/* near */ /* filter */ url(\"example.com/{\") /* a */"
},
"afterParams": " ",
"rules": [],
Expand Down
30 changes: 6 additions & 24 deletions test/cases/parse/atrule-rules.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
"before": "",
"name": "supports",
"afterName": " ",
"_params": {
"raw": "(animation-name: test)",
"trimmed": "(animation-name: test)"
},
"_params": "(animation-name: test)",
"afterParams": " ",
"rules": [
{
Expand All @@ -37,10 +34,7 @@
"before": "\n ",
"name": "-custom-keyframe",
"afterName": " ",
"_params": {
"raw": "anim",
"trimmed": "anim"
},
"_params": "anim",
"afterParams": " ",
"rules": [
{
Expand All @@ -61,10 +55,7 @@
"before": "\n ",
"prop": "color",
"between": ": ",
"_value": {
"raw": "black",
"trimmed": "black"
}
"_value": "black"
}
],
"source": {
Expand All @@ -78,10 +69,7 @@
}
},
"before": "\n ",
"_selector": {
"raw": "from",
"trimmed": "from"
},
"_selector": "from",
"between": " ",
"semicolon": true,
"after": "\n "
Expand All @@ -104,10 +92,7 @@
"before": "\n ",
"prop": "color",
"between": ": ",
"_value": {
"raw": "white",
"trimmed": "white"
}
"_value": "white"
}
],
"source": {
Expand All @@ -121,10 +106,7 @@
}
},
"before": "\n ",
"_selector": {
"raw": "to",
"trimmed": "to"
},
"_selector": "to",
"between": " ",
"after": "\n "
}
Expand Down
14 changes: 4 additions & 10 deletions test/cases/parse/comments.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,7 @@
"before": "\n ",
"prop": "color",
"between": ": ",
"_value": {
"raw": "black",
"trimmed": "black"
}
"_value": "black"
},
{
"type": "comment",
Expand Down Expand Up @@ -91,8 +88,8 @@
"prop": "background",
"between": ": ",
"_value": {
"raw": "white\n /* end */",
"trimmed": "white"
"value": "white",
"raw": "white\n /* end */"
}
}
],
Expand All @@ -107,10 +104,7 @@
}
},
"before": "\n",
"_selector": {
"raw": "div",
"trimmed": "div"
},
"_selector": "div",
"between": " ",
"after": "\n"
},
Expand Down
Loading

0 comments on commit 4bfffb8

Please sign in to comment.