Sfoglia il codice sorgente

assira.ui: support for identifiers
assira.ui: draft for font

Ranides Atterwim 1 anno fa
parent
commit
fdf5eab656

+ 12 - 9
assira.g4interpreter/src/main/java/net/ranides/assira/grammar/impl/G4ParserInterpreter.java

@@ -38,6 +38,7 @@ import org.antlr.v4.tool.Rule;
 import org.antlr.v4.tool.ast.AltAST;
 import org.antlr.v4.tool.ast.GrammarAST;
 import org.antlr.v4.tool.ast.GrammarRootAST;
+import org.antlr.v4.tool.ast.PlusBlockAST;
 
 import java.util.Collection;
 import java.util.List;
@@ -348,15 +349,17 @@ public class G4ParserInterpreter implements G4Parser {
                             alias = alt.ruleRefs.keySet().iterator().next();
                         }
                         if(alias != null && alt.ast.getChildren().size() == 1) {
-                            int ri = rule.index;
-                            int ai = alt.altNum;
-                            String altName = branchLabels.get(ri, ai);
-
-                            if(altName != null) {
-                                aliases.put(rule.name + NodeSupport.QUALIFIER_NAME+ altName, alias);
-                            }
-                            else if(rule.alt.length == 2) {
-                                aliases.put(rule.name, alias);
+                            Object inside = alt.ast.getChildren().get(0);
+                            if(!(inside instanceof PlusBlockAST)) {
+                                int ri = rule.index;
+                                int ai = alt.altNum;
+                                String altName = branchLabels.get(ri, ai);
+
+                                if (altName != null) {
+                                    aliases.put(rule.name + NodeSupport.QUALIFIER_NAME + altName, alias);
+                                } else if (rule.alt.length == 2) {
+                                    aliases.put(rule.name, alias);
+                                }
                             }
                         }
                     }

+ 25 - 7
assira.ui/src/main/antlr4/imports/BaseNumbers.g4

@@ -1,4 +1,4 @@
-grammar BaseNumbers;
+grammar BasePrimitives;
 
 number
     : numberInt
@@ -18,31 +18,49 @@ codeHex
     | CODE_HEX8     #codeHex8
     ;
 
+word : (ANY|CHAR_Q)+ ;
+
+words: word (WS word)* ;
+
+// ------------------------------------
+
+fragment CHAR_HEX : '#';
+fragment DIGIT : [0-9] ;
+fragment DIGIT_NZ : [1-9] ;
+fragment DIGIT_Z : '0' ;
+fragment DIGIT_HEX: [0-9a-fA-F] ;
+
+fragment CHAR_WS: [ \t\r\n,?!.;]+;
+
+// ------------------------------------
+
 LP   : '(' CHAR_WS*;
 LB   : '[' CHAR_WS*;
 LT   : '<' CHAR_WS*;
 RP   : CHAR_WS* ')';
 RB   : CHAR_WS* ']';
 GT   : CHAR_WS* '>';
+HP   : '-';
 
 CS    : CHAR_WS* ',' CHAR_WS*;
 DOT   : CHAR_WS* '.' CHAR_WS*;
 WS    : CHAR_WS+;
 
+// ------------------------------------
+
 NUMBER_INT   : DIGIT+;
 NUMBER_PCT   : DIGIT+ ('.' DIGIT+)? '%';
 NUMBER_REAL  : DIGIT+ '.' DIGIT+ ('e' '-'? DIGIT+)?;
+
 NUMBER_HEX   : '0x' DIGIT_HEX+ ;
+
 CODE_HEX8 : CHAR_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX;
 CODE_HEX6 : CHAR_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX;
 CODE_HEX4 : CHAR_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX;
 CODE_HEX3 : CHAR_HEX DIGIT_HEX DIGIT_HEX DIGIT_HEX;
 
+// ------------------------------------
 
-fragment CHAR_HEX : '#';
-fragment DIGIT : [0-9] ;
-fragment DIGIT_NZ : [1-9] ;
-fragment DIGIT_Z : '0' ;
-fragment DIGIT_HEX: [0-9a-fA-F] ;
+CHAR_Q: 'q'; // please see CssUnit: unitLength: 'q'
 
-fragment CHAR_WS: [ \t\r\n,?!.;]+;
+ANY  : [0-9a-zA-Z];

+ 0 - 20
assira.ui/src/main/antlr4/imports/BaseSwing.g4

@@ -1,20 +0,0 @@
-grammar BaseSwing;
-
-import BaseNumbers;
-
-
-point
-    : x=numberInt CS y=numberInt
-    ;
-
-dimension2d
-    : w=numberInt CS h=numberInt
-    ;
-
-rectangle
-    : x=numberInt CS y=numberInt CS w=numberInt CS h=numberInt
-    ;
-
-insets
-    : t=numberInt CS l=numberInt CS b=numberInt CS r=numberInt
-    ;

+ 1 - 1
assira.ui/src/main/antlr4/imports/CssBorder.g4

@@ -1,6 +1,6 @@
 grammar CssBorder;
 
-import BaseNumbers, CssColor, CssUnit;
+import BasePrimitives, CssColor, CssUnit;
 
 borderCSS
     : borderCSS_Style WS color WS borderSize

+ 1 - 1
assira.ui/src/main/antlr4/imports/CssColor.g4

@@ -1,6 +1,6 @@
 grammar CssColor;
 
-import BaseNumbers, CssUnit;
+import BasePrimitives, CssUnit;
 
 color
     : colorHSL      #color_hsl

+ 3 - 3
assira.ui/src/main/antlr4/imports/CssUnit.g4

@@ -1,6 +1,6 @@
 grammar CssUnit;
 
-import BaseNumbers;
+import BasePrimitives;
 
 length:
     number unitLength
@@ -15,7 +15,7 @@ unitLength
     | CSS2_UNIT_PT
     | CSS2_UNIT_CM
     | CSS2_UNIT_MM
-    | CSS2_UNIT_Q
+    | CHAR_Q
     | CSS2_UNIT_IN
     | CSS2_UNIT_PC
 
@@ -52,7 +52,7 @@ CSS2_UNIT_PX : 'px';
 CSS2_UNIT_PT : 'pt';
 CSS2_UNIT_CM : 'cm';
 CSS2_UNIT_MM : 'mm';
-CSS2_UNIT_Q  : 'q';
+//CSS2_UNIT_Q  : 'q';
 CSS2_UNIT_IN : 'in';
 CSS2_UNIT_PC : 'pc';
 

+ 1 - 1
assira.ui/src/main/antlr4/imports/SwingBorder.g4

@@ -1,6 +1,6 @@
 grammar SwingBorder;
 
-import BaseNumbers, CssColor;
+import BasePrimitives, CssColor;
 
 borderSwingSimple
     : borderSwingSimple_Style WS borderSwingSimple_Type (WS color)? (WS color)?

+ 30 - 0
assira.ui/src/main/antlr4/imports/SwingFont.g4

@@ -0,0 +1,30 @@
+grammar SwingFont;
+
+import BasePrimitives, CssUnit;
+
+fontSwing
+    : fontSwingLong
+    | fontSwingShort
+    ;
+
+fontSwingLong
+    : name=words (HP style=fontSwingStyle)? (HP size=numberInt)?
+    ;
+
+fontSwingShort
+    : name=word (WS style=fontSwingStyle)? (WS size=numberInt)?
+    ;
+
+
+fontSwingStyle
+    : SWING_FONT_STYLE_BOLD
+    | SWING_FONT_STYLE_ITALIC
+    | SWING_FONT_STYLE_BOLD_ITALIC
+    | SWING_FONT_STYLE_PLAIN
+    ;
+
+
+SWING_FONT_STYLE_BOLD: 'BOLD';
+SWING_FONT_STYLE_ITALIC: 'ITALIC';
+SWING_FONT_STYLE_BOLD_ITALIC: 'BOLDITALIC';
+SWING_FONT_STYLE_PLAIN: 'PLAIN';

+ 10 - 3
assira.ui/src/main/antlr4/net/ranides/grammars/generated/UiGrammar.g4

@@ -1,6 +1,6 @@
 grammar UiGrammar;
 
-import BaseNumbers, CssColor, CssUnit, CssBorder, BaseSwing, SwingBorder;
+import BasePrimitives, CssColor, CssUnit, CssBorder, SwingBorder, SwingFont;
 
 root_colors
     : color (WS color)+ EOF    #color_list
@@ -15,6 +15,13 @@ root_border
     ;
 
 border
-    : borderCSS
-    | borderSwingSimple
+    : borderCSS | borderSwingSimple
     ;
+
+root_font
+    : font EOF
+    ;
+
+font
+    : fontSwing
+    ;

+ 0 - 2
assira.ui/src/main/java/net/ranides/assira/ui/parsers/ParseCssColor.java

@@ -3,12 +3,10 @@ package net.ranides.assira.ui.parsers;
 import lombok.experimental.UtilityClass;
 import net.ranides.assira.collection.maps.ArrayMap;
 import net.ranides.assira.collection.query.CQuery;
-import net.ranides.assira.grammar.G4Node;
 import net.ranides.assira.grammar.G4Selector;
 import net.ranides.assira.grammar.G4SelectorBuilder;
 import net.ranides.assira.ui.helpers.ColorUtils;
 import net.ranides.assira.ui.model.CssHexCode;
-import org.jetbrains.annotations.NotNull;
 
 import java.awt.*;
 import java.util.Map;

+ 62 - 0
assira.ui/src/main/java/net/ranides/assira/ui/parsers/ParseCssFont.java

@@ -0,0 +1,62 @@
+package net.ranides.assira.ui.parsers;
+
+import lombok.experimental.UtilityClass;
+import net.ranides.assira.grammar.G4Node;
+import net.ranides.assira.grammar.G4Selector;
+import net.ranides.assira.grammar.G4SelectorBuilder;
+import net.ranides.grammars.generated.UiGrammarParser;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+@UtilityClass
+public class ParseCssFont {
+
+    public static final G4Selector<Integer> FONT_STYLE = new G4SelectorBuilder<Integer>()
+        .withName("CssFont:FONT_STYLE")
+        .withParser(GrammarBase.PARSER)
+        .valueForToken(UiGrammarParser.SWING_FONT_STYLE_PLAIN, Font.PLAIN)
+        .valueForToken(UiGrammarParser.SWING_FONT_STYLE_BOLD, Font.BOLD)
+        .valueForToken(UiGrammarParser.SWING_FONT_STYLE_ITALIC, Font.ITALIC)
+        .valueForToken(UiGrammarParser.SWING_FONT_STYLE_BOLD_ITALIC, Font.BOLD | Font.ITALIC)
+        .prepare();
+
+    public static final G4Selector<Font> FONT = new G4SelectorBuilder<Font>()
+        .withName("CssColor:FONT")
+        .withParser(GrammarBase.PARSER)
+        .mapRule("fontSwingLong", node -> {
+            return createFont(node);
+        })
+        .mapRule("fontSwingShort", node -> {
+            return createFont(node);
+        })
+
+
+        .prepare();
+
+    @NotNull
+    private static Font createFont(G4Node node) {
+        String name = node.child("@name").text();
+
+        int style = node.children("@style")
+            .map(FONT_STYLE::single).first()
+            .orElse(Font.PLAIN);
+
+        int size = node.children("@size")
+            .map(ParsePrimitives.INT::single).first()
+            .orElseGet( () -> GrammarBase.component(node).getFont().getSize());
+
+        return new Font(name, style, size);
+    }
+
+
+    public static Font font(String value) {
+        return GrammarBase.parseSingle(FONT, "root_font", value);
+    }
+
+    public static Font font(String value, JComponent component) {
+        return GrammarBase.parseSingle(FONT, "root_font", component, value);
+    }
+
+}

+ 1 - 1
assira.ui/src/main/java/net/ranides/assira/ui/parsers/ParseCssUnit.java

@@ -22,7 +22,7 @@ public class ParseCssUnit {
         .valueForToken(UiGrammarParser.CSS2_UNIT_PT, CssUnit.PT)
         .valueForToken(UiGrammarParser.CSS2_UNIT_CM, CssUnit.CM)
         .valueForToken(UiGrammarParser.CSS2_UNIT_MM, CssUnit.MM)
-        .valueForToken(UiGrammarParser.CSS2_UNIT_Q, CssUnit.Q)
+        .valueForToken(UiGrammarParser.CHAR_Q, CssUnit.Q)
         .valueForToken(UiGrammarParser.CSS2_UNIT_IN, CssUnit.IN)
         .valueForToken(UiGrammarParser.CSS2_UNIT_PC, CssUnit.PC)
 

+ 1 - 0
assira.ui/src/test/java/net/ranides/assira/ui/parsers/ExampleComponents.java

@@ -21,6 +21,7 @@ public class ExampleComponents {
         PANEL = new JPanel();
         PANEL.setSize(180, 120);
         PANEL.setBackground(Color.RED);
+        PANEL.setFont(Font.decode("Arial 18"));
         PANEL.setLocation(25, 50);
 
         FRAME.add(PANEL);

+ 2 - 1
assira.ui/src/test/java/net/ranides/assira/ui/parsers/GrammarBaseTest.java

@@ -21,7 +21,7 @@ import java.io.StringWriter;
 import static net.ranides.assira.junit.NewAssert.assertThrows;
 import static org.junit.Assert.assertEquals;
 
-public class GrammarBaseTest {
+public class GrammarUtilsTest {
 
     G4Parser CSS_PARSER = G4Parser.builder()
         .lexer(UiGrammarLexer.class)
@@ -43,6 +43,7 @@ public class GrammarBaseTest {
         .valueForToken("PREFIX_HSLA", true)
         .valueForToken("PREFIX_RGB", true)
         .valueForToken("PREFIX_RGBA", true)
+        .valueForToken("ANY", true)
         .prepare();
 
     @Test

+ 29 - 0
assira.ui/src/test/java/net/ranides/assira/ui/parsers/ParseCssFontTest.java

@@ -0,0 +1,29 @@
+package net.ranides.assira.ui.parsers;
+
+import org.junit.Test;
+
+import java.awt.*;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+public class ParseCssFontTest {
+
+    @Test
+    public void basic() {
+
+        assertEquals(new Font("Arial Strange", Font.PLAIN, 20), ParseCssFont.font("Arial Strange-PLAIN-20") );
+
+        assertEquals(new Font("Arial", Font.PLAIN, 20), ParseCssFont.font("Arial-20") );
+
+        assertEquals(new Font("Verdana", Font.BOLD, 15), ParseCssFont.font("Verdana BOLD 15") );
+
+        assertThrows(IllegalArgumentException.class, () -> {
+            ParseCssFont.font("Verdana Strange BOLD 15");
+        });
+
+        assertEquals(new Font("Verdana", Font.PLAIN, 15), ParseCssFont.font("Verdana 15") );
+
+        assertEquals(new Font("Verdana", Font.ITALIC, 18), ParseCssFont.font("Verdana ITALIC", ExampleComponents.PANEL) );
+    }
+}

+ 15 - 5
assira.ui/src/test/resources/grammars/CssCoverage.txt

@@ -1,3 +1,5 @@
+1: ANY
+1: CHAR_Q
 1: CODE_HEX3
 1: CODE_HEX4
 1: CODE_HEX6
@@ -28,7 +30,6 @@
 1: CSS2_UNIT_PC
 1: CSS2_UNIT_PT
 1: CSS2_UNIT_PX
-1: CSS2_UNIT_Q
 1: CSS2_UNIT_RCAP
 1: CSS2_UNIT_RCH
 1: CSS2_UNIT_REM
@@ -48,6 +49,7 @@
 1: CSS4_TURN
 1: DOT
 1: GT
+0: HP
 1: LB
 1: LP
 1: LT
@@ -66,6 +68,10 @@
 1: SWING_BORDER_etched
 0: SWING_BORDER_lowered
 0: SWING_BORDER_raised
+0: SWING_FONT_STYLE_BOLD
+0: SWING_FONT_STYLE_BOLD_ITALIC
+0: SWING_FONT_STYLE_ITALIC
+0: SWING_FONT_STYLE_PLAIN
 1: WS
 1: angle
 0: border
@@ -104,19 +110,23 @@
 1: componentLightness <= numberPct
 1: componentRGB <= numberInt
 1: componentSaturation <= numberPct
-0: dimension2d
-0: insets
+0: font <= fontSwing
+0: fontSwing
+0: fontSwingLong
+0: fontSwingShort
+0: fontSwingStyle
 1: length
 0: number
 1: numberHex <= NUMBER_HEX
 1: numberInt <= NUMBER_INT
 1: numberPct <= NUMBER_PCT
 1: numberReal <= NUMBER_REAL
-0: point
-0: rectangle
 0: root_border
 0: root_color
 0: root_colors
    0: root_colors#color_list
+0: root_font
 0: unitAngle
 0: unitLength
+0: word
+0: words