yelp-build: link to pages in another directory?

A. Jesse Jiryu Davis <jesse at emptysquare.net>
Mon Apr 27 15:05:33 EDT 2015

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/20150427/e716dd09/attachment.html>