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
f0945040
Commit
f0945040
authored
Mar 13, 2012
by
Aaron Leung
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Parsing back-references (i.e., the ampersand).
parent
b8630d7c
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
79 additions
and
13 deletions
+79
-13
back_references.scss
back_references.scss
+17
-0
document_parser.cpp
document_parser.cpp
+42
-8
node.hpp
node.hpp
+20
-5
No files found.
back_references.scss
0 → 100644
View file @
f0945040
/*hey, ho {
& > boo, foo &.goo {
bloo: bloo;
}
blah: blah;
}
*/
div
{
a
:
a
;
p
{
b
:
b
;
&
*
{
c
:
c
;
}
}
}
\ No newline at end of file
document_parser.cpp
View file @
f0945040
...
@@ -53,25 +53,59 @@ namespace Sass {
...
@@ -53,25 +53,59 @@ namespace Sass {
lex
<
exactly
<
'>'
>
>
())
{
lex
<
exactly
<
'>'
>
>
())
{
selector
<<
Node
(
line_number
,
Node
::
selector_combinator
,
lexed
);
selector
<<
Node
(
line_number
,
Node
::
selector_combinator
,
lexed
);
}
}
selector
<<
parse_simple_selector_sequence
();
Node
s
(
parse_simple_selector_sequence
());
if
(
s
.
has_backref
)
selector
.
has_backref
=
true
;
selector
<<
s
;
// if (s.terminal_backref) return selector;
while
(
lex
<
exactly
<
'+'
>
>
()
||
while
(
lex
<
exactly
<
'+'
>
>
()
||
lex
<
exactly
<
'~'
>
>
()
||
lex
<
exactly
<
'~'
>
>
()
||
lex
<
exactly
<
'>'
>
>
()
||
lex
<
exactly
<
'>'
>
>
()
||
lex
<
ancestor_of
>
())
{
lex
<
ancestor_of
>
()
||
s
.
terminal_backref
&&
lex
<
no_spaces
>
())
{
selector
<<
Node
(
line_number
,
Node
::
selector_combinator
,
lexed
);
selector
<<
Node
(
line_number
,
Node
::
selector_combinator
,
lexed
);
selector
<<
parse_simple_selector_sequence
();
s
=
parse_simple_selector_sequence
();
if
(
s
.
has_backref
)
selector
.
has_backref
=
true
;
selector
<<
s
;
// if (s.terminal_backref) break;
}
}
// while (1) {
// if (lex< exactly<'+'> >() || lex< exactly<'~'> >() ||
// lex< exactly<'>'> >() || lex< ancestor_of >()) {
// selector << Node(line_number, Node::selector_combinator, lexed);
// Node s(parse_simple_selector_sequence());
// if (s.has_backref) selector.has_backref = true;
// selector << s;
// }
// else if (selector.children->back().has_backref &&
// selector.children->back().children->size() == 1 &&
// lex< alternatives < type_selector, universal > >()) {
// Node s(parse_simple_selector_sequence());
// if (s.has_backref) selector.has_backref = true;
// selector << s;
// }
// else break;
// }
return
selector
;
return
selector
;
}
}
Node
Document
::
parse_simple_selector_sequence
()
Node
Document
::
parse_simple_selector_sequence
()
{
{
Node
seq
uence
(
line_number
,
Node
::
simple_selector_sequence
,
1
);
Node
seq
(
line_number
,
Node
::
simple_selector_sequence
,
1
);
if
(
lex
<
alternatives
<
type_selector
,
universal
>
>
())
{
if
(
lex
<
alternatives
<
type_selector
,
universal
>
>
())
{
sequence
<<
Node
(
line_number
,
Node
::
simple_selector
,
lexed
);
seq
<<
Node
(
line_number
,
Node
::
simple_selector
,
lexed
);
}
else
if
(
lex
<
exactly
<
'&'
>
>
())
{
seq
<<
Node
(
line_number
,
Node
::
backref
,
lexed
);
seq
.
has_backref
=
true
;
if
(
peek
<
sequence
<
no_spaces
,
alternatives
<
type_selector
,
universal
>
>
>
(
position
))
{
cerr
<<
"Terminal backref!"
<<
endl
;
seq
.
terminal_backref
=
true
;
return
seq
;
}
}
}
else
{
else
{
seq
uence
<<
parse_simple_selector
();
seq
<<
parse_simple_selector
();
}
}
while
(
!
peek
<
spaces
>
(
position
)
&&
while
(
!
peek
<
spaces
>
(
position
)
&&
!
(
peek
<
exactly
<
'+'
>
>
(
position
)
||
!
(
peek
<
exactly
<
'+'
>
>
(
position
)
||
...
@@ -79,9 +113,9 @@ namespace Sass {
...
@@ -79,9 +113,9 @@ namespace Sass {
peek
<
exactly
<
'>'
>
>
(
position
)
||
peek
<
exactly
<
'>'
>
>
(
position
)
||
peek
<
exactly
<
','
>
>
(
position
)
||
peek
<
exactly
<
','
>
>
(
position
)
||
peek
<
exactly
<
'{'
>
>
(
position
)))
{
peek
<
exactly
<
'{'
>
>
(
position
)))
{
seq
uence
<<
parse_simple_selector
();
seq
<<
parse_simple_selector
();
}
}
return
seq
uence
;
return
seq
;
}
}
Node
Document
::
parse_simple_selector
()
Node
Document
::
parse_simple_selector
()
...
...
node.hpp
View file @
f0945040
...
@@ -17,6 +17,7 @@ namespace Sass {
...
@@ -17,6 +17,7 @@ namespace Sass {
selector
,
selector
,
selector_combinator
,
selector_combinator
,
simple_selector_sequence
,
simple_selector_sequence
,
backref
,
simple_selector
,
simple_selector
,
type_selector
,
type_selector
,
class_selector
,
class_selector
,
...
@@ -41,6 +42,8 @@ namespace Sass {
...
@@ -41,6 +42,8 @@ namespace Sass {
bool
has_rules_or_comments
;
bool
has_rules_or_comments
;
bool
has_rulesets
;
bool
has_rulesets
;
bool
has_propsets
;
bool
has_propsets
;
bool
has_backref
;
bool
terminal_backref
;
Node
()
:
type
(
nil
),
children
(
0
)
{
++
fresh
;
}
Node
()
:
type
(
nil
),
children
(
0
)
{
++
fresh
;
}
...
@@ -51,7 +54,9 @@ namespace Sass {
...
@@ -51,7 +54,9 @@ namespace Sass {
type
(
n
.
type
),
type
(
n
.
type
),
has_rules_or_comments
(
n
.
has_rules_or_comments
),
has_rules_or_comments
(
n
.
has_rules_or_comments
),
has_rulesets
(
n
.
has_rulesets
),
has_rulesets
(
n
.
has_rulesets
),
has_propsets
(
n
.
has_propsets
)
has_propsets
(
n
.
has_propsets
),
has_backref
(
n
.
has_backref
),
terminal_backref
(
n
.
terminal_backref
)
{
/*n.release();*/
++
copied
;
}
// No joint custody.
{
/*n.release();*/
++
copied
;
}
// No joint custody.
Node
(
size_t
line_number
,
Type
type
,
size_t
length
=
0
)
Node
(
size_t
line_number
,
Type
type
,
size_t
length
=
0
)
...
@@ -61,7 +66,9 @@ namespace Sass {
...
@@ -61,7 +66,9 @@ namespace Sass {
type
(
type
),
type
(
type
),
has_rules_or_comments
(
false
),
has_rules_or_comments
(
false
),
has_rulesets
(
false
),
has_rulesets
(
false
),
has_propsets
(
false
)
has_propsets
(
false
),
has_backref
(
false
),
terminal_backref
(
false
)
{
children
->
reserve
(
length
);
++
fresh
;
}
{
children
->
reserve
(
length
);
++
fresh
;
}
Node
(
size_t
line_number
,
Type
type
,
const
Node
&
n
)
Node
(
size_t
line_number
,
Type
type
,
const
Node
&
n
)
...
@@ -71,7 +78,9 @@ namespace Sass {
...
@@ -71,7 +78,9 @@ namespace Sass {
type
(
type
),
type
(
type
),
has_rules_or_comments
(
false
),
has_rules_or_comments
(
false
),
has_rulesets
(
false
),
has_rulesets
(
false
),
has_propsets
(
false
)
has_propsets
(
false
),
has_backref
(
false
),
terminal_backref
(
false
)
{
++
fresh
;
}
{
++
fresh
;
}
Node
(
size_t
line_number
,
Type
type
,
const
Node
&
n
,
const
Node
&
m
)
Node
(
size_t
line_number
,
Type
type
,
const
Node
&
n
,
const
Node
&
m
)
...
@@ -81,7 +90,9 @@ namespace Sass {
...
@@ -81,7 +90,9 @@ namespace Sass {
type
(
type
),
type
(
type
),
has_rules_or_comments
(
false
),
has_rules_or_comments
(
false
),
has_rulesets
(
false
),
has_rulesets
(
false
),
has_propsets
(
false
)
has_propsets
(
false
),
has_backref
(
false
),
terminal_backref
(
false
)
{
{
children
->
reserve
(
2
);
children
->
reserve
(
2
);
children
->
push_back
(
n
);
children
->
push_back
(
n
);
...
@@ -96,7 +107,9 @@ namespace Sass {
...
@@ -96,7 +107,9 @@ namespace Sass {
type
(
type
),
type
(
type
),
has_rules_or_comments
(
false
),
has_rules_or_comments
(
false
),
has_rulesets
(
false
),
has_rulesets
(
false
),
has_propsets
(
false
)
has_propsets
(
false
),
has_backref
(
false
),
terminal_backref
(
false
)
{
++
fresh
;
}
{
++
fresh
;
}
//~Node() { delete children; }
//~Node() { delete children; }
...
@@ -111,6 +124,8 @@ namespace Sass {
...
@@ -111,6 +124,8 @@ namespace Sass {
has_rules_or_comments
=
n
.
has_rules_or_comments
;
has_rules_or_comments
=
n
.
has_rules_or_comments
;
has_rulesets
=
n
.
has_rulesets
;
has_rulesets
=
n
.
has_rulesets
;
has_propsets
=
n
.
has_propsets
;
has_propsets
=
n
.
has_propsets
;
has_backref
=
n
.
has_backref
;
terminal_backref
=
n
.
terminal_backref
;
++
copied
;
++
copied
;
return
*
this
;
return
*
this
;
}
}
...
...
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