Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
node-sass
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
楚学文
node-sass
Commits
2e7085c0
Commit
2e7085c0
authored
May 30, 2012
by
Aaron Leung
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implemented @for. Ran into some stupid bugs.
parent
f032b652
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
88 additions
and
3 deletions
+88
-3
document.hpp
document.hpp
+1
-0
document_parser.cpp
document_parser.cpp
+26
-0
eval_apply.cpp
eval_apply.cpp
+25
-0
node.cpp
node.cpp
+5
-2
node.hpp
node.hpp
+10
-1
prelexer.cpp
prelexer.cpp
+15
-0
prelexer.hpp
prelexer.hpp
+6
-0
No files found.
document.hpp
View file @
2e7085c0
...
@@ -161,6 +161,7 @@ namespace Sass {
...
@@ -161,6 +161,7 @@ namespace Sass {
Node
parse_string
();
Node
parse_string
();
Node
parse_value_schema
();
Node
parse_value_schema
();
Node
parse_if_directive
(
Node
surrounding_ruleset
);
Node
parse_if_directive
(
Node
surrounding_ruleset
);
Node
parse_for_directive
(
Node
surrounding_ruleset
);
Selector_Lookahead
lookahead_for_selector
(
const
char
*
start
=
0
);
Selector_Lookahead
lookahead_for_selector
(
const
char
*
start
=
0
);
...
...
document_parser.cpp
View file @
2e7085c0
...
@@ -39,6 +39,9 @@ namespace Sass {
...
@@ -39,6 +39,9 @@ namespace Sass {
else
if
(
peek
<
if_directive
>
())
{
else
if
(
peek
<
if_directive
>
())
{
root
<<
parse_if_directive
(
Node
());
root
<<
parse_if_directive
(
Node
());
}
}
else
if
(
peek
<
for_directive
>
())
{
root
<<
parse_for_directive
(
Node
());
}
else
{
else
{
lex
<
spaces_and_comments
>
();
lex
<
spaces_and_comments
>
();
throw_syntax_error
(
"invalid top-level expression"
);
throw_syntax_error
(
"invalid top-level expression"
);
...
@@ -490,6 +493,9 @@ namespace Sass {
...
@@ -490,6 +493,9 @@ namespace Sass {
else
if
(
peek
<
if_directive
>
())
{
else
if
(
peek
<
if_directive
>
())
{
block
<<
parse_if_directive
(
surrounding_ruleset
);
block
<<
parse_if_directive
(
surrounding_ruleset
);
}
}
else
if
(
peek
<
for_directive
>
())
{
block
<<
parse_for_directive
(
surrounding_ruleset
);
}
else
if
(
!
peek
<
exactly
<
';'
>
>
())
{
else
if
(
!
peek
<
exactly
<
';'
>
>
())
{
Node
rule
(
parse_rule
());
Node
rule
(
parse_rule
());
// check for lbrace; if it's there, we have a namespace property with a value
// check for lbrace; if it's there, we have a namespace property with a value
...
@@ -898,6 +904,26 @@ namespace Sass {
...
@@ -898,6 +904,26 @@ namespace Sass {
}
}
return
conditional
;
return
conditional
;
}
}
Node
Document
::
parse_for_directive
(
Node
surrounding_ruleset
)
{
lex
<
for_directive
>
();
size_t
for_line
=
line
;
if
(
!
lex
<
variable
>
())
throw_syntax_error
(
"@for directive requires an iteration variable"
);
Node
var
(
context
.
new_Node
(
Node
::
variable
,
path
,
line
,
lexed
));
if
(
!
lex
<
from
>
())
throw_syntax_error
(
"expected 'from' keyword in @for directive"
);
Node
lower_bound
(
parse_expression
());
Node
::
Type
for_type
=
Node
::
for_through_directive
;
if
(
lex
<
through
>
())
for_type
=
Node
::
for_through_directive
;
else
if
(
lex
<
to
>
())
for_type
=
Node
::
for_to_directive
;
else
throw_syntax_error
(
"expected 'through' or 'to' keywod in @for directive"
);
Node
upper_bound
(
parse_expression
());
if
(
!
peek
<
exactly
<
'{'
>
>
())
throw_syntax_error
(
"expected '{' after the upper bound in @for directive"
);
Node
body
(
parse_block
(
surrounding_ruleset
));
Node
loop
(
context
.
new_Node
(
for_type
,
path
,
for_line
,
3
));
loop
<<
var
<<
lower_bound
<<
upper_bound
<<
body
;
return
loop
;
}
Selector_Lookahead
Document
::
lookahead_for_selector
(
const
char
*
start
)
Selector_Lookahead
Document
::
lookahead_for_selector
(
const
char
*
start
)
{
{
...
...
eval_apply.cpp
View file @
2e7085c0
...
@@ -316,6 +316,31 @@ namespace Sass {
...
@@ -316,6 +316,31 @@ namespace Sass {
}
}
}
break
;
}
break
;
case
Node
:
:
for_through_directive
:
case
Node
:
:
for_to_directive
:
{
Node
fake_mixin
(
new_Node
(
Node
::
mixin
,
expr
.
path
(),
expr
.
line
(),
3
));
Node
fake_param
(
new_Node
(
Node
::
parameters
,
expr
.
path
(),
expr
.
line
(),
1
));
fake_mixin
<<
new_Node
(
Node
::
none
,
""
,
0
,
0
)
<<
(
fake_param
<<
expr
[
0
])
<<
expr
[
3
];
Node
lower_bound
(
eval
(
expr
[
1
],
prefix
,
env
,
f_env
,
new_Node
,
ctx
));
Node
upper_bound
(
eval
(
expr
[
2
],
prefix
,
env
,
f_env
,
new_Node
,
ctx
));
if
(
!
(
lower_bound
.
is_numeric
()
&&
upper_bound
.
is_numeric
()))
{
throw_eval_error
(
"bounds of @for directive must be numeric"
,
expr
.
path
(),
expr
.
line
());
}
expr
.
pop_back
();
expr
.
pop_back
();
expr
.
pop_back
();
expr
.
pop_back
();
for
(
double
i
=
lower_bound
.
numeric_value
(),
U
=
upper_bound
.
numeric_value
()
+
((
expr
.
type
()
==
Node
::
for_to_directive
)
?
0
:
1
);
i
<
U
;
++
i
)
{
Node
i_node
(
new_Node
(
expr
.
path
(),
expr
.
line
(),
i
));
Node
fake_arg
(
new_Node
(
Node
::
arguments
,
expr
.
path
(),
expr
.
line
(),
1
));
fake_arg
<<
i_node
;
expr
+=
apply_mixin
(
fake_mixin
,
fake_arg
,
prefix
,
env
,
f_env
,
new_Node
,
ctx
);
}
}
break
;
default:
{
default:
{
return
expr
;
return
expr
;
}
break
;
}
break
;
...
...
node.cpp
View file @
2e7085c0
...
@@ -13,10 +13,11 @@ namespace Sass {
...
@@ -13,10 +13,11 @@ namespace Sass {
void
Node
::
flatten
()
void
Node
::
flatten
()
{
{
if
(
type
()
!=
block
&&
type
()
!=
expansion
&&
type
()
!=
root
)
return
;
if
(
type
()
!=
block
&&
type
()
!=
expansion
&&
type
()
!=
root
&&
type
()
!=
for_through_directive
&&
type
()
!=
for_to_directive
)
return
;
// size can change during flattening, so we need to call size() on each pass
// size can change during flattening, so we need to call size() on each pass
for
(
size_t
i
=
0
;
i
<
size
();
++
i
)
{
for
(
size_t
i
=
0
;
i
<
size
();
++
i
)
{
if
((
at
(
i
).
type
()
==
expansion
)
||
(
at
(
i
).
type
()
==
block
))
{
Type
i_type
=
at
(
i
).
type
();
if
((
i_type
==
expansion
)
||
(
i_type
==
block
)
||
(
i_type
==
for_through_directive
)
||
(
i_type
==
for_to_directive
))
{
Node
expn
(
at
(
i
));
Node
expn
(
at
(
i
));
if
(
expn
.
has_expansions
())
expn
.
flatten
();
if
(
expn
.
has_expansions
())
expn
.
flatten
();
ip_
->
has_statements
|=
expn
.
has_statements
();
ip_
->
has_statements
|=
expn
.
has_statements
();
...
@@ -25,6 +26,8 @@ namespace Sass {
...
@@ -25,6 +26,8 @@ namespace Sass {
// TO DO: make this more efficient -- replace with a dummy node instead of erasing
// TO DO: make this more efficient -- replace with a dummy node instead of erasing
ip_
->
children
.
erase
(
begin
()
+
i
);
ip_
->
children
.
erase
(
begin
()
+
i
);
insert
(
begin
()
+
i
,
expn
.
begin
(),
expn
.
end
());
insert
(
begin
()
+
i
,
expn
.
begin
(),
expn
.
end
());
// skip over what we just spliced in
i
+=
expn
.
size
()
-
1
;
}
}
}
}
}
}
...
...
node.hpp
View file @
2e7085c0
...
@@ -148,7 +148,8 @@ namespace Sass {
...
@@ -148,7 +148,8 @@ namespace Sass {
arguments
,
arguments
,
if_directive
,
if_directive
,
for_directive
,
for_through_directive
,
for_to_directive
,
each_directive
,
each_directive
,
while_directive
,
while_directive
,
...
@@ -280,10 +281,18 @@ namespace Sass {
...
@@ -280,10 +281,18 @@ namespace Sass {
case
Node
:
:
css_import
:
case
Node
:
:
css_import
:
case
Node
:
:
rule
:
case
Node
:
:
rule
:
case
Node
:
:
propset
:
has_statements
=
true
;
break
;
case
Node
:
:
propset
:
has_statements
=
true
;
break
;
case
Node
:
:
ruleset
:
has_blocks
=
true
;
break
;
case
Node
:
:
ruleset
:
has_blocks
=
true
;
break
;
case
Node
:
:
if_directive
:
case
Node
:
:
if_directive
:
case
Node
:
:
for_through_directive
:
case
Node
:
:
for_to_directive
:
case
Node
:
:
each_directive
:
case
Node
:
:
while_directive
:
case
Node
:
:
expansion
:
has_expansions
=
true
;
break
;
case
Node
:
:
expansion
:
has_expansions
=
true
;
break
;
case
Node
:
:
backref
:
has_backref
=
true
;
break
;
case
Node
:
:
backref
:
has_backref
=
true
;
break
;
default
:
break
;
default
:
break
;
}
}
if
(
n
.
has_backref
())
has_backref
=
true
;
if
(
n
.
has_backref
())
has_backref
=
true
;
...
...
prelexer.cpp
View file @
2e7085c0
...
@@ -115,6 +115,7 @@ namespace Sass {
...
@@ -115,6 +115,7 @@ namespace Sass {
const
char
*
extend
(
const
char
*
src
)
{
const
char
*
extend
(
const
char
*
src
)
{
return
exactly
<
extend_kwd
>
(
src
);
return
exactly
<
extend_kwd
>
(
src
);
}
}
extern
const
char
if_kwd
[]
=
"@if"
;
extern
const
char
if_kwd
[]
=
"@if"
;
extern
const
char
if_chars
[]
=
"if"
;
extern
const
char
if_chars
[]
=
"if"
;
const
char
*
if_directive
(
const
char
*
src
)
{
const
char
*
if_directive
(
const
char
*
src
)
{
...
@@ -129,10 +130,24 @@ namespace Sass {
...
@@ -129,10 +130,24 @@ namespace Sass {
spaces_and_comments
,
spaces_and_comments
,
exactly
<
if_chars
>
>
(
src
);
exactly
<
if_chars
>
>
(
src
);
}
}
extern
const
char
for_kwd
[]
=
"@for"
;
extern
const
char
for_kwd
[]
=
"@for"
;
const
char
*
for_directive
(
const
char
*
src
)
{
const
char
*
for_directive
(
const
char
*
src
)
{
return
exactly
<
for_kwd
>
(
src
);
return
exactly
<
for_kwd
>
(
src
);
}
}
extern
const
char
from_kwd
[]
=
"from"
;
const
char
*
from
(
const
char
*
src
)
{
return
exactly
<
from_kwd
>
(
src
);
}
extern
const
char
to_kwd
[]
=
"to"
;
const
char
*
to
(
const
char
*
src
)
{
return
exactly
<
to_kwd
>
(
src
);
}
extern
const
char
through_kwd
[]
=
"through"
;
const
char
*
through
(
const
char
*
src
)
{
return
exactly
<
through_kwd
>
(
src
);
}
extern
const
char
each_kwd
[]
=
"@each"
;
extern
const
char
each_kwd
[]
=
"@each"
;
const
char
*
each_directive
(
const
char
*
src
)
{
const
char
*
each_directive
(
const
char
*
src
)
{
return
exactly
<
each_kwd
>
(
src
);
return
exactly
<
each_kwd
>
(
src
);
...
...
prelexer.hpp
View file @
2e7085c0
...
@@ -315,8 +315,14 @@ namespace Sass {
...
@@ -315,8 +315,14 @@ namespace Sass {
const
char
*
if_directive
(
const
char
*
src
);
const
char
*
if_directive
(
const
char
*
src
);
const
char
*
else_directive
(
const
char
*
src
);
const
char
*
else_directive
(
const
char
*
src
);
const
char
*
elseif_directive
(
const
char
*
src
);
const
char
*
elseif_directive
(
const
char
*
src
);
const
char
*
for_directive
(
const
char
*
src
);
const
char
*
for_directive
(
const
char
*
src
);
const
char
*
from
(
const
char
*
src
);
const
char
*
to
(
const
char
*
src
);
const
char
*
through
(
const
char
*
src
);
const
char
*
each_directive
(
const
char
*
src
);
const
char
*
each_directive
(
const
char
*
src
);
const
char
*
while_directive
(
const
char
*
src
);
const
char
*
while_directive
(
const
char
*
src
);
// Match CSS type selectors
// Match CSS type selectors
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment