W3C home > Mailing lists > Public > www-style@w3.org > July 2011

Re: [cssom] Unrecognized - request for more information

From: Brian Kardell <bkardell@gmail.com>
Date: Wed, 27 Jul 2011 10:47:25 -0400
Message-ID: <CADC=+jfFTKzX1KeMg1Ghp9oj3APBy+LxU+EPsmAy5Gpe6=uBpA@mail.gmail.com>
To: www-style@w3.org
So to put this into somewhat more concrete terms, here is something
more detailed in terms of what might be a useful meta-definition that
could be exposed for "things that look like rules" which, for whatever
reason, that the browser
cannot understand but can still mostly parse because of the
forward-compatiblity ideas in CSS...

Rule definition (object):
	
    "selectors"      - an array of selector definitions
                       (see below - array because of groups)

    "declarations":  - an object defining the guts of the rules in meta terms


Selector definition (object):

	"select"         - a simple string representation of a selector
	
	"specificity"    - a numerical representation of the selector's specificity
	
	
Declarations definition (object):

    "module":        - the name of the module (background, border, etc... )
                       Easily recognizable as any property before a dash or
                       alone in shorthand, right?

    ("properties"    - an object whose keys are the properties specified
                       for this module
                       and whose values are value definition objects.
    ||

    "shorthand")     - an array of unnamed value definition objects


Values definition (object):

	"type"			 - string whose purpose is to help identify
						parseable css types
						
	"values"         - an array of primitives or nested value definitions
	                   (mostly for aiding further parsing of complex
values which include functions - see examples below)
	



While I understand the idea of not prefixing and wanting to use
prefixed properties, I'm not going to use them in these examples
because I think it adds complexity in reading, and as I discussed
before - there may be "safe" ways to avoid that by requring that these
be in a seperate sheet with a differnt mime type or something.  In any
case, using this as a definition, if you had this today and someone
had this definition, but a browser didn't support it...

    div {
            transition-property: opacity, left, top, width;
            transition-duration: 2s, 1s;
    }



Today, things like shims have to go scan the document for all of the
links/style tags, then in the case of links make an XHR to get the
text, then parse the text, then somehow identify which ones need
shimming in this particular browser, etc.  This would allow them to
just ask the browser for the "things that look like rules, but I am
unable to respect" and it would give you the rule above as:

    {
        "selectors":   [ { "select": "div", "specificity": 1 } ],
        "declaration": {
            "module":  "transition",
            "properties": {
                "property":  [
                    { "type": "constant", "values":  ["opacity"] },
                    { "type": "constant", "values":  ["left"] },
                    { "type": "constant", "values":  ["top"] },
                    { "type": "constant", "values":  ["width"] }
                ],
                "duration":  [
                    { "type": "time", value: ["2s"] },
                    { "type": "time", values: ["1s"] }
                ]
            }
    }


Or if the rule was:
    div {
            transition: opacity 1s, height 2s;
    }


Then it would give you:
    {
        "selectors":   [ { "select": "div", "specificity": 1 } ],
        "declaration": {
            "module":  "transition",
            "shorthand": [
                [
                    { "type": "constant", "values":  ["opacity"] },
                    { "type": "time", "values":  ["1s"]
                ],
                [
                    { "type": "constant", value: ["height"] },
                    { "type": "time", values: ["2s"] }
                ]
            ]
    }




This format would also allow the complex values and functions (not shorthand):

    .article{
        box-shadow:    rgba(1, 0, 0, 0.4)  10px 10px;
    }


... to be parsed fairly generically into something much easier to deal with:

    {
        "selectors":  [ { "select": ".article", "specificity": 16 } ],
        "declaration": {
            "module":  "box",
            "properties": {
                "shadow":  [
                    {
                        "type": "complex",
                        "values":  [
                            {
                                "type":    "function"
                                "name":    "rgba",
                                "values":   [
                                    {
                                        "type":   "number",
                                        "values": [1]
                                    },
                                    {
                                        "type":   "number",
                                        "values": [0]
                                    },
                                    {
                                        "type":   "number",
                                        "values": [0]
                                    },
                                    {
                                        "type":   "number",
                                        "values": [0.4]
                                    }
                                ]
                            },
                            {
                                "type":  "pixel-unit",
                                "values": [10]
                            },
                            {
                                "type":  "pixel-unit",
                                "values": [10]
                            }
                        ]
                    },
                    { "type": "constant", "values":  ["left"] },
                    { "type": "constant", "values":  ["top"] },
                    { "type": "constant", "values":  ["width"] }
                ]
            }
    }
Received on Wednesday, 27 July 2011 14:47:53 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:42 GMT