function
Library: Markup utilities (OMMARKUPUTILITIES)
Import : ommarkuputilities.xmd |
Returns: the content stored in the |
export markup source function consume value markup-buffer b
While a markup stream stored in a markup-buffer
can be read out directly by using the
markup-buffer
as a markup source
, this operation does not change the buffer. The markup
source function consume
, in contrast, removes the markup stream from the buffer at the same time it outputs the
stream. In effect, a markup-buffer
can be used as a queue.
This can be convenient in cases where parts of markup need to be moved around:
global markup-buffer queue element "append" using output as queue output #content element "flush" output consume queue suppress
If the consumer of the markup-buffer
content throws or returns before it consumes the entire available
input, the use of consume
allows us to keep track exactly how much content still remains in the
buffer. For example, the following function consumes its input only up to and including the first markup region:
define markup source function first-region (value markup source s) as repeat output s take any* exit catch #markup-start e signal rethrow repeat output first-region (s) catch #markup-end e2 assert e == e2 signal rethrow return again catch #markup-point e signal rethrow again
We can now use the function first-region to consume and output only the first element accumulated
in queue:
element "first" output first-region (consume queue) suppress
With these rules in place and another element #implied
rule that simply reproduces the element that
triggered it, the example XML input
<doc> <append><p>Title</p><p>Body</p></append> <section> <title><first/></title> <flush/> </section> </doc>
would be transformed into
<doc> <section> <title><p>Title</p></title> <p>Text</p> </section> </doc>