Skip to content

Commit

Permalink
Save source file to nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
ai committed Dec 15, 2013
1 parent 731aee0 commit 3910a56
Show file tree
Hide file tree
Showing 22 changed files with 309 additions and 115 deletions.
50 changes: 28 additions & 22 deletions lib/parse.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -89,26 +89,26 @@ class Parser
@addType('atrule-name')
true

inAtrule: (finish) ->
inAtrule: (close) ->
if @inside('atrule-name')
if @space()
@checkAtruleName()
@buffer = @buffer[@current.name.length..-1]
@trimmed = ''
@setType('atrule-param')

else if @letter == ';' or @letter == '{' or finish
else if @letter == ';' or @letter == '{' or close
@checkAtruleName()
@endAtruleParams(finish)
@endAtruleParams()

else
@current.name += @letter
true

else if @inside('atrule-param')
if @letter == ';' or @letter == '{' or finish
if @letter == ';' or @letter == '{' or close
@current.params = new Raw(@prevBuffer(), @trim @trimmed)
@endAtruleParams(finish)
@endAtruleParams()

else
@trimmed += @letter
Expand Down Expand Up @@ -145,12 +145,11 @@ class Parser
@error('Unexpected }')
else
if @inside('value')
start = @buffer.search(/\s*\}$/)
after = @buffer[start..-2]

start = @buffer.search(/\s*\}$/)
after = @buffer[start..-2]
@buffer = @buffer[0..start]
@inValue(true)

@inValue('close')
@current.after = after
else
@current.semicolon = true if @semicolon
Expand Down Expand Up @@ -187,14 +186,14 @@ class Parser
@semicolon = false
true

inValue: (finish) ->
inValue: (close) ->
if @inside('value')
if @letter == '('
@inBrackets = true
else if @inBrackets and @letter == ')'
@inBrackets = false

if (@letter == ';' and not @inBrackets) or finish
if (@letter == ';' and not @inBrackets) or close
@semicolon = true if @letter == ';'
@current.value = new Raw(@prevBuffer(), @trim @trimmed)
@pop()
Expand All @@ -208,21 +207,26 @@ class Parser

endFile: ->
if @inside('atrule-param') or @inside('atrule-name')
@inAtrule(true)
start = @buffer.search(/\s*$/)
after = @buffer[start..-1]
@buffer = @buffer[0..start]

@inAtrule('close')
@buffer = after

if @parents.length > 1
@error('Unclosed block', @current.line, @current.column)
@error('Unclosed block', @current.source.start)
else if @inside('comment')
@error('Unclosed comment', @commentPos.line, @commentPos.column)
@error('Unclosed comment', @commentPos)
else if @quote
@error('Unclosed quote', @quotePos.line, @quotePos.column)
@error('Unclosed quote', @quotePos)
else
@root.after = @buffer

# Helpers

error: (message, line = @line, column = @column) ->
throw new SyntexError(message, @source, line, column, @opts.file)
error: (message, position = { line: @line, column: @column }) ->
throw new SyntexError(message, @source, position, @opts.file)

move: ->
@pos += 1
Expand Down Expand Up @@ -252,9 +256,12 @@ class Parser
@parents.push(node)
@current = node

node.line = @line
node.column = @column
node.before = @buffer[0..-2]
@current.source =
start:
line: @line
column: @column
@current.source.file = @opts.file if @opts.file
@current.before = @buffer[0..-2]
@buffer = ''

pop: ->
Expand Down Expand Up @@ -282,7 +289,7 @@ class Parser
else
'rules'

endAtruleParams: (finish) ->
endAtruleParams: ->
if @letter == '{'
type = @atruleType()
@current.addMixin(type)
Expand All @@ -291,7 +298,6 @@ class Parser
else
@current.semicolon = true if @letter == ';'
@pop()
@buffer = @letter if @letter != ';'

checkAtruleName: ->
@error('At-rule without name') if @current.name == ''
Expand Down
7 changes: 5 additions & 2 deletions lib/syntax-error.coffee
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
# Error while CSS parsing
class SyntaxError extends Error
constructor: (text, @source, @line, @column, @file) ->
@message = "Can't parse CSS: #{ text } at line #{ @line }:#{ @column }"
constructor: (text, @source, pos, @file) ->
@line = pos.line
@column = pos.column
@message = "Can't parse CSS: #{ text }"
@message += " at line #{ pos.line }:#{ pos.column }"
@message += " in #{ @file }" if @file

module.exports = SyntaxError
64 changes: 48 additions & 16 deletions test/cases/parse/atrule-decls.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
"rules": [
{
"type": "atrule",
"line": 1,
"column": 1,
"source": {
"start": {
"line": 1,
"column": 1
}
},
"before": "",
"name": "page",
"_params": {
Expand All @@ -14,8 +18,12 @@
"decls": [
{
"type": "decl",
"line": 2,
"column": 5,
"source": {
"start": {
"line": 2,
"column": 5
}
},
"before": "\n ",
"prop": "background",
"between": "",
Expand All @@ -29,8 +37,12 @@
},
{
"type": "atrule",
"line": 5,
"column": 1,
"source": {
"start": {
"line": 5,
"column": 1
}
},
"before": "\n\n",
"name": "font-face",
"_params": {
Expand All @@ -40,8 +52,12 @@
"decls": [
{
"type": "decl",
"line": 6,
"column": 5,
"source": {
"start": {
"line": 6,
"column": 5
}
},
"before": "\n ",
"prop": "family-name",
"between": "",
Expand All @@ -56,8 +72,12 @@
},
{
"type": "atrule",
"line": 9,
"column": 1,
"source": {
"start": {
"line": 9,
"column": 1
}
},
"before": "\n\n",
"name": "viewport",
"_params": {
Expand All @@ -67,8 +87,12 @@
"decls": [
{
"type": "decl",
"line": 10,
"column": 5,
"source": {
"start": {
"line": 10,
"column": 5
}
},
"before": "\n ",
"prop": "width",
"between": "",
Expand All @@ -83,8 +107,12 @@
},
{
"type": "atrule",
"line": 13,
"column": 1,
"source": {
"start": {
"line": 13,
"column": 1
}
},
"before": "\n\n",
"name": "-ms-viewport",
"_params": {
Expand All @@ -94,8 +122,12 @@
"decls": [
{
"type": "decl",
"line": 14,
"column": 5,
"source": {
"start": {
"line": 14,
"column": 5
}
},
"before": "\n ",
"prop": "width",
"between": "",
Expand Down
8 changes: 6 additions & 2 deletions test/cases/parse/atrule-empty.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
"rules": [
{
"type": "atrule",
"line": 1,
"column": 1,
"source": {
"start": {
"line": 1,
"column": 1
}
},
"before": "",
"name": "charset",
"_params": {
Expand Down
8 changes: 6 additions & 2 deletions test/cases/parse/atrule-no-params.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
"rules": [
{
"type": "atrule",
"line": 1,
"column": 1,
"source": {
"start": {
"line": 1,
"column": 1
}
},
"before": "",
"name": "page",
"decls": [],
Expand Down
1 change: 1 addition & 0 deletions test/cases/parse/atrule-no-semicolon.css
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@

@charset "UTF-8"

10 changes: 7 additions & 3 deletions test/cases/parse/atrule-no-semicolon.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
"rules": [
{
"type": "atrule",
"line": 2,
"column": 1,
"source": {
"start": {
"line": 2,
"column": 1
}
},
"before": "\n",
"name": "charset",
"_params": {
Expand All @@ -13,5 +17,5 @@
}
}
],
"after": "\n"
"after": "\n\n"
}
8 changes: 6 additions & 2 deletions test/cases/parse/atrule-params.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
"rules": [
{
"type": "atrule",
"line": 1,
"column": 1,
"source": {
"start": {
"line": 1,
"column": 1
}
},
"before": "",
"name": "-moz-document",
"_params": {
Expand Down
Loading

0 comments on commit 3910a56

Please sign in to comment.