I am dithering between three possible ways of implementing all this, and I have bits of written code for all of them.
Option A is to do the whole job of tokenising and parsing and rendering ourselves.
- We get full control and can do what we like.
- There isn’t much of the full CSS spec we need to honour just to do window borders.
- But we also run the risk of obscure bugs specific to our code…
- …and we’ll have the inevitable need to prove why we didn’t rely on existing libraries.
- I have a working tokeniser written and some of the parser; I just need to decide whether to use them.
Option B is to do the rendering and perhaps some of the parsing ourselves, and leave the rest of the parsing and all the tokenising to libcroco.
- But libcroco doesn’t do CSS3.
- But there are workarounds for that; still, none of them are perfect and they’ll show up very obviously in the language.
- Of course we could start by modifying libcroco to do CSS3, but that might make this project last forever.
Option C is to use libccss to do almost everything, which depends on libcroco for parsing.
- This is what the first draft of Cowbell did.
- This has all the negative points of Option B, and some of its own.
- However, there were some infelicities, including rather inflexible image handling…
- …and no way to expand the range of colours that were allowed.
- We also had to do some things, like rendering the title text, ourselves anyway.
- Again, we could just fix libccss; again, this will delay this project’s going anywhere in a hurry.
It all boils down to “how much of the existing libraries do we reuse, and how much would we have to rewrite or replace”.
I suspect using (and upgrading) libcroco will be pretty feasible, since CSS syntax is pretty consistent – you might need to add some selectors (which should slot in nicely alongside existing selectors) and teach it about mathematical operations in calc() (should be nicely self-contained), but the vast majority of CSS3 features are new properties that follow the same parse rules, not new parse rules.
Rendering is a trickier beast – there’s a lot of complicated stuff in even CSS 1 that’s tricky to get right (float interactions, for example) and re-using existing code would be great. On the other hand, CSS3 additions may well require rewriting large chunks of older features to take newer properties into account.
I suppose the choice of whether or not to use libccss depends on which CSS3 properties you think Cowbell requires.
Browsers have it easy – they only implement the things they think are feasible with their current code-base, and content authors only create documents that use the available features. Cowbell, on the other hand, has a very specific look-and-feel that it must be able to reproduce (specifically, at least 80% of Metacity v2 themes), and anything less will just mean authors continue to creat Metacity v2 themes instead.
There’s two things to consider here: what selectors will be used, and what rules will be allowed. CSS3 adds some to both.
Could you use libccss to do the title (and other) texts too?