- From: Tom Potts <karaken12@gmail.com>
- Date: Tue, 23 Oct 2012 07:36:14 +0100
- To: François REMY <fremycompany_pub@yahoo.fr>
- Cc: CSS WG <www-style@w3.org>
- Message-ID: <CAF2aeH2iuqU8yeWXH20_fbhWRcZSmao3FbPytbYNRcn+05=f9w@mail.gmail.com>
Very interesting, François. I've been thinking about something similar, but I wasn't able to come up with a working algorithm. Am I right in thinking that this only solves problems where backup values are defined? Or are you suggesting that el { my-property-a: no-b; my-property-a: get(my-property-b); my-property-b: get(my-property-a); } would also resolve to "no-b" for both properties? Tom On 21 October 2012 17:58, François REMY <fremycompany_pub@yahoo.fr> wrote: > Hi everybody, > > Here was my (favorite) technical challenge of the week-end: > > el { > my-property-a: get( my-property-b || no-b ); > my-property-b: get( my-property-a ); > } > > I would like to get things like this resolve to : > > el { > my-property-a: no-b; > my-property-b: no-b; > } > > In the CSS Custom draft, I esquiss an algorithm which is able to solve > this problem, but this algorithm is not parallelizable. Also, it doesn't > handle all cases. In particular, it doesn't handle cases where the fallback > value of a reference does contain another reference (and after some > reasearch I actually find that useful). > > I spent some time this weekend on resolving the issue and here's the > algorithm I propose : > > I propose a backtracking : > - where we start from the token list of the property > - where we try to replace each reference by its referenced value > - when we hit a cyclical reference, we backtrack to the nearest point > where a fallback value was defined > - and we replace the reference in question by its fallback value > > When we hit a cyclical reference and there's no possible backtrack > anymore, the property is marked invalid (obviously). > > The nice thing about this algorithm is that it's implementable in parallel > as you don't need to know about the resolved state of any other property to > continue. Also, it handles really well most cases when an human would find > a nice way to resolve the fallback-enabled cyclical references. > > It's evident that properties can be resolved in any order (otherwhise this > would not be parallelizable) and that their declaration order do not impact > the algorithm outcome. > > Last but not least, it's easy to track the dependencies of such an > algorithm since every reference you "touch" in the algorithm is a > dependency. There's no need to track cross-property dependencies. Tracking > dependencies may help implementors to optimize the re-evaluation strategy > of references if they use an observable pattern. > > > > ==============================**========= > NOTE: You can test the algorithm here: > ==============================**========= > > http://fremycompany.com/temp/**2012-10/ReferenceResolver/** > algo-resolve-references.html<http://fremycompany.com/temp/2012-10/ReferenceResolver/algo-resolve-references.html> > > The input format is a list of property definitions. > - A definition is a list of token. > -- A token is a list of possible replacement values. > --- ref(...) are property references. > --- val(...) are plain tokens. > > ==============================**========= > > > > > I would love to get your feedback on this. > > Best regards, > François > >
Received on Tuesday, 23 October 2012 06:36:43 UTC