yelp-build: link to pages in another directory?

A. Jesse Jiryu Davis <jesse at emptysquare.net>
Fri Oct 23 11:40:38 EDT 2015

Here is the promised article:

http://emptysqua.re/blog/link-mallard-html-with-yelp-build/

... it's just a recap of this mailing-list discussion, but I hope it will
help people Googling this question. It was, besides, an excuse to use an
appealing Audubon drawing of ducks.

On Fri, May 1, 2015 at 11:45 PM, A. Jesse Jiryu Davis <jesse at emptysquare.net
> wrote:

> Shaun, option #2 worked perfectly for me; I'm going to deploy it soon.
> Thank you so much. I'm going to write up an article on this solution and
> share it with you in case you want to use it for an example in the Yelp or
> Mallard docs.
>
> On Mon, Apr 27, 2015 at 3:05 PM, A. Jesse Jiryu Davis <
> jesse at emptysquare.net> wrote:
>
>> Thanks so much for this explanation, and especially for writing me the
>> XSLT! I'm going to try option #2 soon and let you know.
>>
>> On Mon, Apr 27, 2015 at 10:45 AM, Shaun McCance <shaunm at gnome.org> wrote:
>>
>>> Hi Jesse,
>>>
>>> I'm going to CC mallard-list. I think this is generally interesting to
>>> Mallard folks. Answers inline below:
>>>
>>> On Sun, 2015-04-26 at 17:10 -0400, A. Jesse Jiryu Davis wrote:
>>> > Hi Gnome folk,
>>> >
>>> >
>>> > I'm taking over a project, the MongoDB C Driver, that Christian
>>> > Hergert documented in Mallard. It builds with yelp-build. The
>>> > documentation is split into two directories, one here:
>>>
>>> > https://github.com/mongodb/libbson/tree/master/doc
>>>
>>> > And the other here:
>>>
>>> > https://github.com/mongodb/mongo-c-driver/tree/master/doc
>>>
>>> > Pages in the latter directory include references to pages in the
>>> > former. (But not vice versa.) We build each directory with a separate
>>> > invocation of "yelp-build html <directory>".
>>> >
>>> >
>>> > THE PROBLEM: when a page in the "mongo-c-driver" directory reference
>>> > pages in the "libbson" directory, our current build system doesn't
>>> > make correct HTML links. For example, the "bson_error_t" link here:
>>> >
>>> > http://api.mongodb.org/c/current/mongoc_collection_update.html
>>> >
>>> >
>>> >
>>> > ... tries to link to a bson_error_t.html page in the *same* directory,
>>> > instead of to the proper page here:
>>> >
>>> >
>>> > https://api.mongodb.org/libbson/current/bson_error_t.html
>>> >
>>> >
>>> >
>>> > Since the link is wrong, it's a 404, which on our particular server
>>> > means you're redirected to the home page. People rightly call this a
>>> > bug in our documentation: https://jira.mongodb.org/browse/CDRIVER-524
>>>
>>> Right. So Mallard, at its core, is about creating documents, where a
>>> document is a collection of pages. Cross-references are links inside a
>>> document. Linking to other documents requires something else. You would
>>> have the same issue with DocBook or anything else document-based.
>>>
>>> > I tried just putting the two invocations into a single one:
>>> >
>>> >
>>> > $ yelp-build html libbson/doc mongo-c-driver/doc
>>> >
>>> >
>>> > But that munges all the documentation together badly, instead of link
>>> > from one to the other. Here's the output of that:
>>> >
>>> >
>>> > http://emptysqua.re/merged-libbson-libmongoc-docs/
>>>
>>> Doing this, you're effectively making a single document that contains
>>> all the pages from two directories.
>>>
>>> > How can I tell yelp-build to take a reference from a file in
>>> > "mongo-c-driver/" to an id in the other directory, like
>>> > "bson_error_t", and render it as a URL like
>>> > "../libbson/bson_error_t.html"? Instead of what it does right now,
>>> > which is render a link to "bson_error_t.html" in the current
>>> > directory, where no such file exists.
>>>
>>> I can think of three options:
>>>
>>> 1) Just use hrefs.
>>> 2) Create an xref extension.
>>> 3) Use Pintail.
>>>
>>>
>>> 1) Just use hrefs. If you know where your docs are published, and you
>>> only care about them being published in that one place, then just use
>>> the href attribute to give an honest-to-goodness URL:
>>>
>>> <code
>>> href="https://api.mongodb.org/libbson/current/bson_error_t.html
>>> ">bson_error_t</code>
>>>
>>> This is very straightforward if it fits your needs, but it has no
>>> flexibility in terms of where things are published or viewed. This
>>> wouldn't work well in GNOME, for example, because docs are viewed both
>>> locally in Yelp and online.
>>>
>>>
>>> 2) Create an xref extension. Any xref that contains a "/" or ":" is an
>>> extended xref in Mallard. So you could do something like:
>>>
>>> <code xref="mongodb:libbson/bson_error_t">bson_error_t</code>
>>>
>>> You'd have to provide an implementation for that, of course.
>>>
>>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>>> version="1.0">
>>> <xsl:template name="mal.link.target.custom">
>>>  <xsl:param name="node" select="."/>
>>>  <xsl:param name="xref" select="$node/@xref"/>
>>>  <xsl:if test="starts-with($xref, 'mongodb:')">
>>>   <xsl:variable name="ref" select="substring-after($xref, 'mongodb:')"/>
>>>   <xsl:text>https://api.mongodb.org/</xsl:text>
>>>   <xsl:value-of select="substring-before($ref, '/')"/>
>>>   <xsl:text>/current/</xsl:text>
>>>   <xsl:value-of select="substring-after($ref, '/')"/>
>>>   <xsl:text>.html</xsl:text>
>>>  </xsl:if>
>>> </xsl:template>
>>> </xsl:stylesheet>
>>>
>>> Put that in a file and pass it to yelp-build with -x. (Warning: I did
>>> not test this code.) This can be nicer to type, and is more flexible.
>>> For example, if you want to publish to a staging server, you can edit
>>> the extension stylesheet to reflect that. This is exactly what GNOME
>>> does in Yelp to let you link to local documents with help: xrefs.
>>>
>>> You could even provide both these xrefs and hrefs, like this:
>>>
>>> <code xref="mongodb:libbson/bson_error_t"
>>> href="https://api.mongodb.org/libbson/current/bson_error_t.html
>>> ">bson_error_t</code>
>>>
>>> When you build with your extensions that understands mongodb: xrefs,
>>> those will be used. But if I grab your docs and build with vanilla
>>> yelp-build, href will be used instead. You lose the ease-of-typing, but
>>> gain portability.
>>>
>>>
>>> 3) Use Pintail instead of yelp-build. yelp-build gives you a reasonable
>>> amount of power to plug into it, but it's meant to be a fire-and-forget
>>> single-document builder. Pintail, on the other hand, builds entire sites
>>> of multiple Mallard documents. (It could potentially build documents in
>>> other source formats, with plugins.)
>>>
>>> https://github.com/projectmallard/pintail
>>>
>>> Pintail lets you references pages in other directories ("documents") by
>>> putting slashes in your xref.
>>>
>>> <code xref="/libbson/current/bson_error_t">bson_error_t</code>
>>>
>>> Just as with the previous option, you could use both xref and href to
>>> have better portability with tools that don't support the extended
>>> xrefs.
>>>
>>> <code xref="/libbson/current/bson_error_t"
>>> href="https://api.mongodb.org/libbson/current/bson_error_t.html
>>> ">bson_error_t</code>
>>>
>>> Again, portability vs ease-of-typing. The nice thing is that you can get
>>> all the goodness of inside-document xrefs, like automatic link text and
>>> tooltips. You could pull that off with option (2), but with considerable
>>> effort that the small extension stylesheet I provided.
>>>
>>> Pintail is still pretty early in development. There are surely kinks.
>>> But it is being used today to build projectmallard.org (and, in fact,
>>> conf.openhelp.cc, because why not).
>>>
>>> --
>>> Shaun
>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://projectmallard.org/pipermail/mallard-list/attachments/20151023/e30cdc7e/attachment.html>