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.