CCS
CCS, short for Cascading Code Sheets, is a CSS3-inspired programming language that allows for programmatical stylization, complete with event-driven code, conditional styles, and declarative programming. In the reference compiler, CCS produces JavaScript; however, compiling CCS will not always produce a single file, rather yielding two files- one CSS file and one JavaScript file- that enact the code in a good compiler.
Features
- Powerful animations (planned)
- Conditional stylization (planned)
- Event-driven programming (defined)
- Logical nesting (defined, at least in my head)
- Expressions (defined)
- Variables (defined)
- Saving rules into variables (defined)
- Importing, so files can be split (planned)
Syntax
Grammar (EBNF)
value ::= exp
| exp PERCENT
| exp VW
| exp VH
| exp SEC
;
var ::= DOLL NAME ;
lit ::= NUM
| STR
| COLOR
| NONE
;
exp1 ::= exp PLUS exp
| exp SUB exp ;
exp2 ::= exp STAR exp
| exp DIV exp
;
exp ::= exp2
| exp1
| lit
| var
;
alist ::= value
| alist COMMA value
;
comma_sep_altexp ::= value
| comma_sep_altexp COMMA value
;
selector ::= STAR -- Any element
| CARET -- This element
| NAME -- Tag reference
| DOT NAME -- Class reference
| HASH NAME -- ID reference
| selector COLON NAME [OPAREN alist CPAREN] -- Pseudo-class
| selector COLON COLON NAME [OPAREN alist CPAREN] -- Pseudo-element
| selector IMM_CHI selector -- Immediate child selector
| selector ADJ_SIB selector -- Adjacent sibling selector
| selector GEN_SIB selector -- General sibling selector
| selector ALT selector -- Alternative selector
| OPAREN selector CPAREN -- Group selectors (for whatever reason)
;
style_type ::= NAME
| NAME OPAREN alist CPAREN
;
stylize ::= style_type COLON comma_sep_altexp ;
trigger ::= style_type COLON rule
| style_type COLON body
;
line ::= stylize SEMI
| trigger SEMI
;
body ::= OBRACE {line} CBRACE;
rule ::= selector body ;
stmt ::= rule
| NAME ASSGN rule
| NAME ASSGN body
| NAME ASSGN exp
| NAME
;
stmts ::= {stmt SEMI} ;
Semantics
A CCS program is written in a declarative, event-driven syntax. Although it includes all the normal features of CSS, it also includes additional features that CSS has nothing even close to.
A CCS program, as you saw if you read the grammar, looks a bit like CSS. You can have rules of the following syntax:
selector {
st1: v ;
st2: va, vb, vc ;
};
(Note the difference from CSS with the trailing semicolon)
A selector follows a certain expression syntax which is virtually identical to CSS3's selectors (but with the additional combinator ALT, written "|", which allows you to alternate selectors. CSS3 may have this feature, I'm not sure).
The "stylations" as I like to call them- the things in the curly braces separated by semicolons- are where things really get interesting. In normal CSS3, a stylation declares that a certain aspect of a selected element's appearance has a certain value. Normally, the value is a number or special value triggered by a keyword. In CCS, the value can be those, or an expression, or even another rule. This is where the event-driven programming comes in.
Event-driven Programming
To make CCS do something event-driven, one gives an element a stylation mapping an event (usually created from an event template by postfixing it with a syntax like a normal language's function call) to an effect. The effect is, oftentimes, another rule. Here's an example:
red := {
background-color: #FF0000
on_click: $white;
};
white := {
background-color: #FFFFFF;
on_click: $red;
};
.swapcol white;
This creates a JavaScript file with the following effect:
- Any element with class "swapcol" has a white background initially
- When clicked, a "swapcol" element turns red (just that one element, not all of them) by changing its style to "red"
- The "red" style makes it so that, when clicked, it changes back to the initial "white" style