Skip to content

Commit

Permalink
Merge pull request #89 from rtts/scss
Browse files Browse the repository at this point in the history
Scss
  • Loading branch information
JaapJoris authored Mar 7, 2023
2 parents 2e2142d + 0959f0c commit 9386cb1
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 38 deletions.
21 changes: 12 additions & 9 deletions djhtml/modes.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ def __init__(self, source=None, return_mode=None):
self.return_mode = return_mode or self
self.token_re = compile_re(self.RAW_TOKENS)

# To keep track of the current offsets.
# To keep track of the current and previous offsets.
self.offsets = dict(relative=0, absolute=0)
self.previous_offsets = []

def indent(self, tabwidth):
"""
Expand Down Expand Up @@ -330,6 +331,7 @@ class DjCSS(DjTXT):

RAW_TOKENS = DjTXT.RAW_TOKENS + [
r"</style>",
r"//.*",
r"[{()}]",
r"/\*",
r'"(?:\\.|[^\\"])*"', # "string"
Expand All @@ -342,13 +344,13 @@ def create_token(self, raw_token, src, line):
mode = self

if raw_token in "{(":
token = Token.Open(raw_token, mode=DjCSS, **self.offsets)
if raw_token == "{":
self.offsets["absolute"] = 0
self.previous_offsets.append(self.offsets.copy())
self.offsets = dict(relative=0, absolute=0)
token = Token.Open(raw_token, mode=DjCSS)
elif raw_token in "})":
if raw_token == "}":
self.offsets["absolute"] = 0
token = Token.Close(raw_token, mode=DjCSS, **self.offsets)
if self.previous_offsets:
self.offsets = self.previous_offsets.pop()
token = Token.Close(raw_token, mode=DjCSS)
elif raw_token.endswith(": "):
token = Token.Text(raw_token, mode=DjCSS, **self.offsets)
self.offsets["absolute"] = len(line) + len(raw_token)
Expand All @@ -359,6 +361,8 @@ def create_token(self, raw_token, src, line):
token, mode = Token.Open(raw_token, mode=DjCSS, ignore=True), Comment(
r"\*/", mode=DjCSS, return_mode=self
)
elif raw_token.startswith("//"):
token = Token.Text(raw_token, mode=DjCSS, ignore=True)
elif raw_token == "</style>":
token, mode = (
Token.Close(raw_token, mode=self.return_mode.__class__),
Expand All @@ -383,7 +387,7 @@ class DjJS(DjTXT):
r'"(?:\\.|[^\\"])*"', # "string"
r"'(?:\\.|[^\\'])*'", # 'string'
r"`(?:\\.|[^\\`])*`", # `string`
r"/(?:\\.|[^\\/\n])*/", # /string/
r"/(?:\\.|[^\\/ \n])*/", # /string/ (but without spaces)
r"[{[()\]}]",
r"var ",
r"let ",
Expand All @@ -397,7 +401,6 @@ class DjJS(DjTXT):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.previous_offsets = []
self.haskell = False
self.haskell_re = re.compile(r"^ *, ([$\w-]+ *=|[$\w-]+;?)")
self.variable_re = re.compile(r"^ *([$\w-]+ *=|[$\w-]+;?)")
Expand Down
26 changes: 22 additions & 4 deletions tests/suite/css.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
<style>
#gradient {
background: linear-gradient(
to top left,
rgba(204,0,0,1),
rgba(204,0,0,0)
);
to top left,
rgba(204,0,0,1),
rgba(204,0,0,0)
);
}
</style>

Expand Down Expand Up @@ -194,3 +194,21 @@
foo: "\"bar";
.icon-x-alarm:before { content: '\e800'; } /* '' */
</style>


<!-- SCSS comments -->
<style>
div {
foo: bar; // comment: ignore
font-weight: bold;
}
</style>


<!-- SCSS mixins -->
<style>
@include button-outline-variant(
$color: $white,
$hover-background;
)
</style>
48 changes: 33 additions & 15 deletions tests/suite/css.tokens
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ Line([])
Line([Open('<!--', mode=DjHTML, ignore=True), Text(' CSS Function ', mode=Comment, ignore=True), Close('-->', mode=DjHTML, ignore=True)], ignore=True)
Line([Text('<', mode=DjHTML), Text('style', mode=InsideHTMLTag, absolute=7), Open('>', mode=DjHTML)])
Line([Text(' #gradient ', mode=DjCSS), Open('{', mode=DjCSS, level=1)], level=1)
Line([Text(' ', mode=DjCSS), Text('background: ', mode=DjCSS), Text('linear-gradient', mode=DjCSS, absolute=12), Open('(', mode=DjCSS, level=2, absolute=12)], level=2)
Line([Text(' to top left,', mode=DjCSS, absolute=12)], level=3, offset=12)
Line([Text(' rgba', mode=DjCSS, absolute=12), Open('(', mode=DjCSS, level=3, absolute=12), Text('204,0,0,1', mode=DjCSS, absolute=12), Close(')', mode=DjCSS, absolute=12), Text(',', mode=DjCSS, absolute=12)], level=3, offset=12)
Line([Text(' rgba', mode=DjCSS, absolute=12), Open('(', mode=DjCSS, level=3, absolute=12), Text('204,0,0,0', mode=DjCSS, absolute=12), Close(')', mode=DjCSS, absolute=12)], level=3, offset=12)
Line([Text(' ', mode=DjCSS, absolute=12), Close(')', mode=DjCSS, absolute=12), Text(';', mode=DjCSS)], level=2, offset=12)
Line([Text(' ', mode=DjCSS), Text('background: ', mode=DjCSS), Text('linear-gradient', mode=DjCSS, absolute=12), Open('(', mode=DjCSS, level=2)], level=2)
Line([Text(' to top left,', mode=DjCSS)], level=3)
Line([Text(' rgba', mode=DjCSS), Open('(', mode=DjCSS, level=3), Text('204,0,0,1', mode=DjCSS), Close(')', mode=DjCSS), Text(',', mode=DjCSS)], level=3)
Line([Text(' rgba', mode=DjCSS), Open('(', mode=DjCSS, level=3), Text('204,0,0,0', mode=DjCSS), Close(')', mode=DjCSS)], level=3)
Line([Text(' ', mode=DjCSS), Close(')', mode=DjCSS), Text(';', mode=DjCSS)], level=2)
Line([Text(' ', mode=DjCSS), Close('}', mode=DjCSS)], level=1)
Line([Close('</style>', mode=DjHTML)])
Line([])
Expand All @@ -44,11 +44,11 @@ Line([Text(' @font-face ', mode=DjCSS), Open('{', mode=DjCSS, level=1)], leve
Line([Text(' ', mode=DjCSS), Text('font-family: ', mode=DjCSS), Text("'Open Sans'", mode=DjCSS, absolute=13), Text(';', mode=DjCSS)], level=2)
Line([Text(' ', mode=DjCSS), Text('font-style: ', mode=DjCSS), Text('normal', mode=DjCSS, absolute=12), Text(';', mode=DjCSS)], level=2)
Line([Text(' ', mode=DjCSS), Text('font-weight: ', mode=DjCSS), Text('normal', mode=DjCSS, absolute=13), Text(';', mode=DjCSS)], level=2)
Line([Text(' ', mode=DjCSS), Text('src: ', mode=DjCSS), Text('url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'Open_Sans.woff2'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'woff2'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(',', mode=DjCSS, absolute=5)], level=2)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'Open_Sans.woff'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'woff'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'Open_Sans.eot?#iefix'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'embedded-opentype'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'Open_Sans.svg#OpenSans'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'svg'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'Open_Sans.ttf'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'truetype'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(';', mode=DjCSS)], level=2, offset=5)
Line([Text(' ', mode=DjCSS), Text('src: ', mode=DjCSS), Text('url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'Open_Sans.woff2'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'woff2'", mode=DjCSS), Close(')', mode=DjCSS), Text(',', mode=DjCSS, absolute=5)], level=2)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'Open_Sans.woff'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'woff'", mode=DjCSS), Close(')', mode=DjCSS), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'Open_Sans.eot?#iefix'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'embedded-opentype'", mode=DjCSS), Close(')', mode=DjCSS), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'Open_Sans.svg#OpenSans'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'svg'", mode=DjCSS), Close(')', mode=DjCSS), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'Open_Sans.ttf'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'truetype'", mode=DjCSS), Close(')', mode=DjCSS), Text(';', mode=DjCSS)], level=2, offset=5)
Line([Text(' ', mode=DjCSS), Close('}', mode=DjCSS)], level=1)
Line([Close('</style>', mode=DjHTML)])
Line([])
Expand All @@ -58,17 +58,17 @@ Line([Text('<', mode=DjHTML), Text('style', mode=InsideHTMLTag, absolute=7), Ope
Line([Text(' @font-face ', mode=DjCSS), Open('{', mode=DjCSS, level=1)], level=1)
Line([Text(' ', mode=DjCSS), Text('font-family: ', mode=DjCSS), Text('Helvetica', mode=DjCSS, absolute=13), Text(';', mode=DjCSS)], level=2)
Line([Text(' ', mode=DjCSS), Text('src: ', mode=DjCSS), Open('{% for format, filename in licensed_fonts %}', mode=DjTXT, level=2, absolute=5)], level=2)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=3, absolute=5), Text("'{% static filename %}'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=3, absolute=5), Text("'{{ format }}'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(',', mode=DjCSS, absolute=5)], level=3, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=3), Text("'{% static filename %}'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=3), Text("'{{ format }}'", mode=DjCSS), Close(')', mode=DjCSS), Text(',', mode=DjCSS, absolute=5)], level=3, offset=5)
Line([Text(' ', mode=DjCSS, absolute=5), Close('{% endfor %}', mode=DjTXT, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'Arial.woff2'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'woff2'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'Arial.woff'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2, absolute=5), Text("'woff'", mode=DjCSS, absolute=5), Close(')', mode=DjCSS, absolute=5), Text(';', mode=DjCSS)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'Arial.woff2'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'woff2'", mode=DjCSS), Close(')', mode=DjCSS), Text(',', mode=DjCSS, absolute=5)], level=2, offset=5)
Line([Text(' url', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'Arial.woff'", mode=DjCSS), Close(')', mode=DjCSS), Text(' format', mode=DjCSS, absolute=5), Open('(', mode=DjCSS, level=2), Text("'woff'", mode=DjCSS), Close(')', mode=DjCSS), Text(';', mode=DjCSS)], level=2, offset=5)
Line([Text(' ', mode=DjCSS), Close('}', mode=DjCSS)], level=1)
Line([Close('</style>', mode=DjHTML)])
Line([])
Line([])
Line([Open('<!--', mode=DjHTML, ignore=True), Text(' @media ', mode=Comment, ignore=True), Close('-->', mode=DjHTML, ignore=True)], ignore=True)
Line([Text('<', mode=DjHTML), Text('style', mode=InsideHTMLTag, absolute=7), Open('>', mode=DjHTML)])
Line([Text(' @media', mode=DjCSS), Open('(', mode=DjCSS, level=1), Text('max-width: ', mode=DjCSS), Text('800px', mode=DjCSS, absolute=18), Close(')', mode=DjCSS, absolute=18), Text(' ', mode=DjCSS, absolute=18), Open('{', mode=DjCSS, level=1, absolute=18)], level=1)
Line([Text(' @media', mode=DjCSS), Open('(', mode=DjCSS, level=1), Text('max-width: ', mode=DjCSS), Text('800px', mode=DjCSS, absolute=18), Close(')', mode=DjCSS), Text(' ', mode=DjCSS), Open('{', mode=DjCSS, level=1)], level=1)
Line([Text(' body ', mode=DjCSS), Open('{', mode=DjCSS, level=2)], level=2)
Line([Text(' ', mode=DjCSS), Text('margin-top: ', mode=DjCSS), Text('1em', mode=DjCSS, absolute=12), Text(';', mode=DjCSS)], level=3)
Line([Text(' ', mode=DjCSS), Text('margin-bottom: ', mode=DjCSS), Text('1em', mode=DjCSS, absolute=15), Text(';', mode=DjCSS)], level=3)
Expand Down Expand Up @@ -130,7 +130,7 @@ Line([Text('<', mode=DjHTML), Text('style', mode=InsideHTMLTag, absolute=7), Ope
Line([Text(' blockquote:before ', mode=DjCSS), Open('{', mode=DjCSS, level=1)], level=1)
Line([Text(' ', mode=DjCSS), Text('content: ', mode=DjCSS), Text('"text-align: right"', mode=DjCSS, absolute=9), Text(';', mode=DjCSS)], level=2)
Line([Text(' ', mode=DjCSS), Close('}', mode=DjCSS)], level=1)
Line([Text(' @media', mode=DjCSS), Open('(', mode=DjCSS, level=1), Text('text-align: ', mode=DjCSS), Text('right', mode=DjCSS, absolute=19), Close(')', mode=DjCSS, absolute=19), Text(' ', mode=DjCSS, absolute=19), Open('{', mode=DjCSS, level=1, absolute=19)], level=1)
Line([Text(' @media', mode=DjCSS), Open('(', mode=DjCSS, level=1), Text('text-align: ', mode=DjCSS), Text('right', mode=DjCSS, absolute=19), Close(')', mode=DjCSS), Text(' ', mode=DjCSS), Open('{', mode=DjCSS, level=1)], level=1)
Line([Text(' a:hover, a:active ', mode=DjCSS), Open('{', mode=DjCSS, level=2)], level=2)
Line([Text(' text-decoration:none', mode=DjCSS)], level=3)
Line([Text(' ', mode=DjCSS), Close('}', mode=DjCSS)], level=2)
Expand Down Expand Up @@ -194,4 +194,22 @@ Line([Text('<', mode=DjHTML), Text('style', mode=InsideHTMLTag, absolute=7), Ope
Line([Text(' ', mode=DjCSS), Text('foo: ', mode=DjCSS), Text('"\\"bar"', mode=DjCSS, absolute=5), Text(';', mode=DjCSS)], level=1)
Line([Text(' .icon-x-alarm:before ', mode=DjCSS), Open('{', mode=DjCSS, level=1), Text(' ', mode=DjCSS), Text('content: ', mode=DjCSS), Text("'\\e800'", mode=DjCSS, absolute=32), Text(';', mode=DjCSS), Text(' ', mode=DjCSS), Close('}', mode=DjCSS), Text(' ', mode=DjCSS), Open('/*', mode=DjCSS, level=1, ignore=True), Text(" '\ue800' ", mode=Comment, ignore=True), Close('*/', mode=DjCSS, ignore=True)], level=1)
Line([Close('</style>', mode=DjHTML)])
Line([])
Line([])
Line([Open('<!--', mode=DjHTML, ignore=True), Text(' SCSS comments ', mode=Comment, ignore=True), Close('-->', mode=DjHTML, ignore=True)], ignore=True)
Line([Text('<', mode=DjHTML), Text('style', mode=InsideHTMLTag, absolute=7), Open('>', mode=DjHTML)])
Line([Text(' div ', mode=DjCSS), Open('{', mode=DjCSS, level=1)], level=1)
Line([Text(' ', mode=DjCSS), Text('foo: ', mode=DjCSS), Text('bar', mode=DjCSS, absolute=5), Text(';', mode=DjCSS), Text(' ', mode=DjCSS), Text('// comment: ignore', mode=DjCSS, ignore=True)], level=2)
Line([Text(' ', mode=DjCSS), Text('font-weight: ', mode=DjCSS), Text('bold', mode=DjCSS, absolute=13), Text(';', mode=DjCSS)], level=2)
Line([Text(' ', mode=DjCSS), Close('}', mode=DjCSS)], level=1)
Line([Close('</style>', mode=DjHTML)])
Line([])
Line([])
Line([Open('<!--', mode=DjHTML, ignore=True), Text(' SCSS mixins ', mode=Comment, ignore=True), Close('-->', mode=DjHTML, ignore=True)], ignore=True)
Line([Text('<', mode=DjHTML), Text('style', mode=InsideHTMLTag, absolute=7), Open('>', mode=DjHTML)])
Line([Text(' @include button-outline-variant', mode=DjCSS), Open('(', mode=DjCSS, level=1)], level=1)
Line([Text(' $', mode=DjCSS), Text('color: ', mode=DjCSS), Text('$white,', mode=DjCSS, absolute=8)], level=2)
Line([Text(' $hover-background', mode=DjCSS, absolute=8), Text(';', mode=DjCSS)], level=2, offset=8)
Line([Text(' ', mode=DjCSS), Close(')', mode=DjCSS)], level=1)
Line([Close('</style>', mode=DjHTML)])
Line([])
14 changes: 11 additions & 3 deletions tests/suite/js.html
Original file line number Diff line number Diff line change
Expand Up @@ -444,12 +444,20 @@
space_re = / foo /
single_re = /foo\/ + bar/
double_re = /foo/ + /bar/
look_like_comment = /\(//
looks_like_comment = /\(//

// The following is known to be broken
const x = 42
const y = 7
const six = x / (function() { // comment
return y
return y
})();

foo = /([{/
bar = /\/{/
baz = //{//

// The following is known to be broken
/function() {/
return
}
</script>
Loading

0 comments on commit 9386cb1

Please sign in to comment.