Three weeks ago, I had a project idea while napping. I tried to forget it, but ended up prototyping it. Now I named it Hookbill and put it on GitLab. From the README:
I appear to be the last XSLT programmer in the world, and sometimes people get very cross with me when I say those four letters. So I had an idea. What if we did it in JavaScript using Mustache templates?
Just to give a glimpse, here’s the Hookbill template for paragraphs:
{{~#if (if_test element)~}} {{~#var 'cls' normalize=true}} {{element.localname}} {{#if (contains element.attrs.style 'lead')}}lead{{/if}} {{if_class element}} {{/var~}} <p class="{{vars.cls}}" {{call 'html-lang-attrs'}}> {{~call 'html-inline' element.children~}} </p> {{~/if~}}
And here’s the equivalent XSLT for Mallard in yelp-xsl:
<xsl:template mode="mal2html.block.mode" match="mal:p"> <xsl:variable name="if"><xsl:call-template name="mal.if.test"/></xsl:variable><xsl:if test="$if != ''"> <p> <xsl:call-template name="html.class.attr"> <xsl:with-param name="class"> <xsl:text>p</xsl:text> <xsl:if test="contains(concat(' ', @style, ' '), ' lead ')"> <xsl:text> lead</xsl:text> </xsl:if> <xsl:if test="$if != 'true'"> <xsl:text> if-if </xsl:text> <xsl:value-of select="$if"/> </xsl:if> </xsl:with-param> </xsl:call-template> <xsl:call-template name="html.lang.attrs"/> <xsl:apply-templates mode="mal2html.inline.mode"/> </p> </xsl:if> </xsl:template>
Is the hookbill template shorter? For sure. Is it better? In this case, yeah. For some other things, maybe not as much. It does force me to put a lot of logic in JavaScript, outside the templates. And maybe that’s a good thing for getting other people playing with the HTML and CSS.
I don’t know if I’ll continue working on this. It would take a fairly significant time investment to reach feature parity with yelp-xsl, and I have too many projects as it is. But it was fun to play with, and I thought I’d share it.
Interesting.
I want XSLT but make it accept HTML5 as the input (or JSON).
Well, HTML5 has a canonical mapping into XML, so that’s already possible, if you have the right tools supporting the right features. As for JSON, that’s actually part of XSLT3, but I’m still over here using XSLT1, so….
I didn’t realise JSON was in XSLT3. I wasn’t even sure if there was wide support of XSLT 2 yet (I’ve been out of it for a while).
I guess what I really want is something like xsltproc, that does the mapping automatically – so either xsltproc itself, or some sort of htmlproc that does it under the covers.