Skip to content

Commit 35ca4fd

Browse files
Add flex-flow to flexbox
1 parent 591573b commit 35ca4fd

File tree

8 files changed

+135
-3
lines changed

8 files changed

+135
-3
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.github.webicitybrowser.spec.css.parser.property.flex;
2+
3+
import java.util.List;
4+
5+
import com.github.webicitybrowser.spec.css.parser.TokenLike;
6+
import com.github.webicitybrowser.spec.css.parser.property.PropertyValueParseResult;
7+
import com.github.webicitybrowser.spec.css.parser.property.PropertyValueParser;
8+
import com.github.webicitybrowser.spec.css.parser.property.imp.PropertyValueParseResultImp;
9+
import com.github.webicitybrowser.spec.css.parser.property.shared.anyorder.AnyOrderParser;
10+
import com.github.webicitybrowser.spec.css.property.flexbox.FlexDirectionValue;
11+
import com.github.webicitybrowser.spec.css.property.flexbox.FlexFlowValue;
12+
import com.github.webicitybrowser.spec.css.property.flexbox.FlexWrapValue;
13+
14+
public class FlexFlowValueParser implements PropertyValueParser<FlexFlowValue> {
15+
16+
private final AnyOrderParser anyOrderParser = new AnyOrderParser(List.of(
17+
new FlexDirectionValueParser(),
18+
new FlexWrapValueParser()
19+
));
20+
21+
@Override
22+
public PropertyValueParseResult<FlexFlowValue> parse(TokenLike[] tokens, int offset, int length) {
23+
PropertyValueParseResult<AnyOrderParser.AnyOrderParserResult> anyOrderParserResult = anyOrderParser.parse(tokens, offset, length);
24+
if (anyOrderParserResult.getResult().isEmpty()) {
25+
return PropertyValueParseResultImp.empty();
26+
}
27+
28+
List<?> results = anyOrderParserResult.getResult().get().results();
29+
30+
FlexDirectionValue flexDirection = (FlexDirectionValue) results.get(0);
31+
FlexWrapValue flexWrap = (FlexWrapValue) results.get(1);
32+
33+
if (flexDirection == null && flexWrap == null) {
34+
return PropertyValueParseResultImp.empty();
35+
}
36+
37+
return PropertyValueParseResultImp.of(
38+
new FlexFlowValue(flexDirection, flexWrap),
39+
anyOrderParserResult.getLength()
40+
);
41+
}
42+
43+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.github.webicitybrowser.spec.css.property.flexbox;
2+
3+
import com.github.webicitybrowser.spec.css.property.CSSValue;
4+
5+
public record FlexFlowValue(FlexDirectionValue flexDirection, FlexWrapValue flexWrap) implements CSSValue {
6+
7+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.github.webicitybrowser.spec.css.parser.property.flex;
2+
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.BeforeEach;
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Test;
7+
8+
import com.github.webicitybrowser.spec.css.parser.TokenLike;
9+
import com.github.webicitybrowser.spec.css.parser.property.PropertyValueParseResult;
10+
import com.github.webicitybrowser.spec.css.parser.tokens.IdentToken;
11+
import com.github.webicitybrowser.spec.css.property.flexbox.FlexDirectionValue;
12+
import com.github.webicitybrowser.spec.css.property.flexbox.FlexFlowValue;
13+
import com.github.webicitybrowser.spec.css.property.flexbox.FlexWrapValue;
14+
15+
public class FlexFlowValueParserTest {
16+
17+
private FlexFlowValueParser parser;
18+
19+
@BeforeEach
20+
public void setup() throws Exception {
21+
parser = new FlexFlowValueParser();
22+
}
23+
24+
@Test
25+
@DisplayName("Can parse flex flow value")
26+
public void canParseFlexFlowValue() {
27+
TokenLike[] tokens = new TokenLike[] {
28+
(IdentToken) () -> "row",
29+
(IdentToken) () -> "wrap"
30+
};
31+
32+
PropertyValueParseResult<FlexFlowValue> parseResult = parser.parse(tokens, 0, tokens.length);
33+
Assertions.assertTrue(parseResult.getResult().isPresent());
34+
Assertions.assertEquals(2, parseResult.getLength());
35+
FlexFlowValue value = parseResult.getResult().get();
36+
Assertions.assertEquals(FlexDirectionValue.ROW, value.flexDirection());
37+
Assertions.assertEquals(FlexWrapValue.WRAP, value.flexWrap());
38+
}
39+
40+
}

Webicity/src/main/java/com/github/webicitybrowser/webicity/renderer/frontend/thready/html/style/cssbinding/decparser/layout/flexbox/CSSOMFlexBindings.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public static void installTo(Map<String, CSSOMNamedDeclarationParser<?>> namedDe
1414
namedDeclarationParsers.put("flex", new CSSOMFlexDeclarationParser());
1515
namedDeclarationParsers.put("flex-direction", new CSSOMFlexDirectionDeclarationParser());
1616
namedDeclarationParsers.put("flex-wrap", new CSSOMFlexWrapDeclarationParser());
17+
namedDeclarationParsers.put("flex-flow", new CSSOMFlexFlowDeclarationParser());
1718
namedDeclarationParsers.put("flex-grow", new CSSOMFlexFactorDeclarationParser<>(FlexGrowDirective::of, FlexGrowDirective.class));
1819
namedDeclarationParsers.put("flex-shrink", new CSSOMFlexFactorDeclarationParser<>(FlexShrinkDirective::of, FlexShrinkDirective.class));
1920
namedDeclarationParsers.put("justify-content", new CSSOMFlexJustifyContentDeclarationParser());

Webicity/src/main/java/com/github/webicitybrowser/webicity/renderer/frontend/thready/html/style/cssbinding/decparser/layout/flexbox/CSSOMFlexDeclarationParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
public class CSSOMFlexDeclarationParser implements CSSOMNamedDeclarationParser<FlexValue> {
1515

16-
private PropertyValueParser<FlexValue> parser = new FlexShorthandValueParser();
16+
private final PropertyValueParser<FlexValue> parser = new FlexShorthandValueParser();
1717

1818
@Override
1919
public PropertyValueParser<FlexValue> getPropertyValueParser() {

Webicity/src/main/java/com/github/webicitybrowser/webicity/renderer/frontend/thready/html/style/cssbinding/decparser/layout/flexbox/CSSOMFlexDirectionDeclarationParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public List<Class<? extends Directive>> getResultantDirectiveClasses() {
3030
return List.of(FlexDirectionDirective.class);
3131
}
3232

33-
private FlexDirection convertFlexDirection(FlexDirectionValue value) {
33+
public static FlexDirection convertFlexDirection(FlexDirectionValue value) {
3434
return switch(value) {
3535
case ROW -> FlexDirection.ROW;
3636
case ROW_REVERSE -> FlexDirection.ROW_REVERSE;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.github.webicitybrowser.webicity.renderer.frontend.thready.html.style.cssbinding.decparser.layout.flexbox;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import com.github.webicitybrowser.spec.css.parser.property.PropertyValueParser;
7+
import com.github.webicitybrowser.spec.css.parser.property.flex.FlexFlowValueParser;
8+
import com.github.webicitybrowser.spec.css.property.flexbox.FlexFlowValue;
9+
import com.github.webicitybrowser.thready.gui.directive.core.Directive;
10+
import com.github.webicitybrowser.threadyweb.graphical.directive.layout.flexbox.FlexDirectionDirective;
11+
import com.github.webicitybrowser.threadyweb.graphical.directive.layout.flexbox.FlexWrapDirective;
12+
import com.github.webicitybrowser.webicity.renderer.frontend.thready.html.style.cssbinding.CSSOMNamedDeclarationParser;
13+
14+
public class CSSOMFlexFlowDeclarationParser implements CSSOMNamedDeclarationParser<FlexFlowValue> {
15+
16+
private final PropertyValueParser<FlexFlowValue> parser = new FlexFlowValueParser();
17+
18+
@Override
19+
public PropertyValueParser<FlexFlowValue> getPropertyValueParser() {
20+
return parser;
21+
}
22+
23+
@Override
24+
public Directive[] translatePropertyValue(FlexFlowValue value) {
25+
List<Directive> directives = new ArrayList<>(2);
26+
if (value.flexDirection() != null) {
27+
directives.add(FlexDirectionDirective.of(CSSOMFlexDirectionDeclarationParser.convertFlexDirection(value.flexDirection())));
28+
}
29+
if (value.flexWrap() != null) {
30+
directives.add(FlexWrapDirective.of(CSSOMFlexWrapDeclarationParser.convertFlexWrap(value.flexWrap())));
31+
}
32+
33+
return directives.toArray(new Directive[0]);
34+
}
35+
36+
@Override
37+
public List<Class<? extends Directive>> getResultantDirectiveClasses() {
38+
return List.of(FlexDirectionDirective.class, FlexWrapDirective.class);
39+
}
40+
41+
}

Webicity/src/main/java/com/github/webicitybrowser/webicity/renderer/frontend/thready/html/style/cssbinding/decparser/layout/flexbox/CSSOMFlexWrapDeclarationParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public List<Class<? extends Directive>> getResultantDirectiveClasses() {
3030
return List.of(FlexWrapDirective.class);
3131
}
3232

33-
private FlexWrap convertFlexWrap(FlexWrapValue value) {
33+
public static FlexWrap convertFlexWrap(FlexWrapValue value) {
3434
return switch(value) {
3535
case NOWRAP -> FlexWrap.NOWRAP;
3636
case WRAP -> FlexWrap.WRAP;

0 commit comments

Comments
 (0)