mirror of
https://github.com/adamdruppe/arsd.git
synced 2025-04-27 22:00:13 +03:00
nested media queries
This commit is contained in:
parent
6e5f38286e
commit
6cbe5625cd
1 changed files with 39 additions and 6 deletions
35
html.d
35
html.d
|
@ -1210,22 +1210,31 @@ class CssAtRule : CssPart {
|
||||||
assert(css[0] == '@');
|
assert(css[0] == '@');
|
||||||
|
|
||||||
int braceCount = 0;
|
int braceCount = 0;
|
||||||
|
int startOfInnerSlice = -1;
|
||||||
|
|
||||||
foreach(i, c; css) {
|
foreach(i, c; css) {
|
||||||
if(braceCount == 0 && c == ';') {
|
if(braceCount == 0 && c == ';') {
|
||||||
content = css[0 .. i + 1];
|
content = css[0 .. i + 1];
|
||||||
css = css[i + 1 .. $];
|
css = css[i + 1 .. $];
|
||||||
|
|
||||||
|
opener = content;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(c == '{')
|
if(c == '{') {
|
||||||
braceCount++;
|
braceCount++;
|
||||||
|
if(startOfInnerSlice == -1)
|
||||||
|
startOfInnerSlice = i;
|
||||||
|
}
|
||||||
if(c == '}') {
|
if(c == '}') {
|
||||||
braceCount--;
|
braceCount--;
|
||||||
if(braceCount < 0)
|
if(braceCount < 0)
|
||||||
throw new Exception("Bad CSS: mismatched }");
|
throw new Exception("Bad CSS: mismatched }");
|
||||||
|
|
||||||
if(braceCount == 0) {
|
if(braceCount == 0) {
|
||||||
|
opener = css[0 .. startOfInnerSlice];
|
||||||
|
inner = css[startOfInnerSlice + 1 .. i];
|
||||||
|
|
||||||
content = css[0 .. i + 1];
|
content = css[0 .. i + 1];
|
||||||
css = css[i + 1 .. $];
|
css = css[i + 1 .. $];
|
||||||
break;
|
break;
|
||||||
|
@ -1236,9 +1245,14 @@ class CssAtRule : CssPart {
|
||||||
|
|
||||||
string content;
|
string content;
|
||||||
|
|
||||||
|
string opener;
|
||||||
|
string inner;
|
||||||
|
|
||||||
override CssAtRule clone() const {
|
override CssAtRule clone() const {
|
||||||
auto n = new CssAtRule();
|
auto n = new CssAtRule();
|
||||||
n.content = content;
|
n.content = content;
|
||||||
|
n.opener = opener;
|
||||||
|
n.inner = inner;
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
override string toString() const { return content; }
|
override string toString() const { return content; }
|
||||||
|
@ -1477,12 +1491,31 @@ string cssToString(in CssPart[] css) {
|
||||||
const(CssPart)[] denestCss(CssPart[] css) {
|
const(CssPart)[] denestCss(CssPart[] css) {
|
||||||
CssPart[] ret;
|
CssPart[] ret;
|
||||||
foreach(part; css) {
|
foreach(part; css) {
|
||||||
|
auto at = cast(CssAtRule) part;
|
||||||
|
if(at is null) {
|
||||||
auto set = cast(CssRuleSet) part;
|
auto set = cast(CssRuleSet) part;
|
||||||
if(set is null)
|
if(set is null)
|
||||||
ret ~= part;
|
ret ~= part;
|
||||||
else {
|
else {
|
||||||
ret ~= set.deNest();
|
ret ~= set.deNest();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// at rules with content may be denested at the top level...
|
||||||
|
// FIXME: is this even right all the time?
|
||||||
|
|
||||||
|
if(at.inner.length) {
|
||||||
|
auto newCss = at.opener ~ "{\n";
|
||||||
|
|
||||||
|
// the whitespace manipulations are just a crude indentation thing
|
||||||
|
newCss ~= "\t" ~ (cssToString(denestCss(lexCss(at.inner))).replace("\n", "\n\t").replace("\n\t\n\t", "\n\n\t"));
|
||||||
|
|
||||||
|
newCss ~= "\n}";
|
||||||
|
|
||||||
|
ret ~= new CssAtRule(newCss);
|
||||||
|
} else {
|
||||||
|
ret ~= part; // no inner content, nothing special needed
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue