You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pollen/pollen/scribblings/decode.html

2 lines
184 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><title>Decode</title><link rel="stylesheet" type="text/css" href="scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="racket.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-racket.css" title="default"/><script type="text/javascript" src="scribble-common.js"></script><script type="text/javascript" src="manual-racket.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="scribble-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,&quot;tocview_0&quot;);">&#9658;</a></td><td></td><td><a href="file:///Users/mb/git/pollen/scribblings/decode.html" class="tocviewselflink" data-pltdoc="x">Decode</a></td></tr></table></div><div class="tocviewsublistonly" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1&nbsp;</td><td><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28part._.Typography%29" class="tocviewlink" data-pltdoc="x">Typography</a></td></tr></table></div></div></div><div class="tocsub"><table class="tocsublist" cellspacing="0"><tr><td><span class="tocsublinknumber"></span><a href="#%28part._.Decode%29" class="tocsubseclink" data-pltdoc="x">Decode</a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">decode</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode-elements%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">decode-<wbr></wbr>elements</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._block-txexpr~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">block-<wbr></wbr>txexpr?</span></span></a></td></tr><tr><td><span class="tocsublinknumber">1<tt>&nbsp;</tt></span><a href="#%28part._.Typography%29" class="tocsubseclink" data-pltdoc="x">Typography</a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">whitespace?</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">whitespace/<span class="mywbr"> &nbsp;</span>nbsp?</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-quotes%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">smart-<wbr></wbr>quotes</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-dashes%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">smart-<wbr></wbr>dashes</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._merge-newlines%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">merge-<wbr></wbr>newlines</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">detect-<wbr></wbr>linebreaks</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">detect-<wbr></wbr>paragraphs</span></span></a></td></tr><tr><td><a href="#%28def._%28%28lib._pollen%2Fdecode..rkt%29._wrap-hanging-quotes%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="RktValLink">wrap-<wbr></wbr>hanging-<wbr></wbr>quotes</span></span></a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="versionbox"><span class="versionNoNav">6.3.0.14</span></div><h2><a name="(part._.Decode)"></a><a name="(mod-path._pollen/decode)"></a>Decode</h2><p><table cellspacing="0" cellpadding="0" class="defmodule"><tr><td align="left"><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">require</span></span></span><span class="stt"> </span><a href="file:///Users/mb/git/pollen/scribblings/decode.html" class="RktModLink" data-pltdoc="x"><span class="RktSym">pollen/decode</span></a><span class="RktPn">)</span></td><td align="right"><span class="RpackageSpec"><span class="Smaller">&nbsp;package:</span> <span class="stt">pollen</span></span></td></tr></table></p><p>The <span class="RktSym">doc</span> export of a Pollen markup file is a simple X-expression. <span style="font-style: italic">Decoding</span> refers to any post-processing of this X-expression. The <span class="RktSym">pollen/decode</span> module provides tools for creating decoders.</p><p>The decode step can happen separately from the compilation of the file. But you can also attach a decoder to the markup file&rsquo;s <span class="RktSym">root</span> node, so the decoding happens automatically when the markup is compiled, and thus automatically incorporated into <span class="RktSym">doc</span>. (Following this approach, you could also attach multiple decoders to different tags within <span class="RktSym">doc</span>.)</p><p>You can, of course, embed function calls within Pollen markup. But since markup is optimized for authors, decoding is useful for operations that can or should be moved out of the authoring layer.</p><p>One example is presentation and layout. For instance, <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span> is a decoder function that lets authors mark paragraphs in their source simply by using two carriage returns.</p><p>Another example is conversion of output into a particular data format. Most Pollen functions are optimized for HTML output, but one could write a decoder that targets another format.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._decode))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValDef RktValLink" data-pltdoc="x">decode</a></span></span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktVar">tagged-xexpr</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span>[</td><td valign="top"><span class="RktPn">#:txexpr-tag-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-tag-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:txexpr-attrs-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-attrs-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:txexpr-elements-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-elements-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:block-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">block-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:inline-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">inline-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">string-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:entity-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">entity-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:cdata-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">cdata-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:exclude-tags</span><span class="hspace">&nbsp;</span><span class="RktVar">tags-to-exclude</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:exclude-attrs</span><span class="hspace">&nbsp;</span><span class="RktVar">attrs-to-exclude</span>]<span class="RktPn">)</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr/c</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">tagged-xexpr</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-tag-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">tag</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">tag</span></span></span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-attrs-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-attrs?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-attrs?</span></span></span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">attrs</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-elements-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">elements</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">elements</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">block-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._block-txexpr~3f%29%29" class="RktValLink" data-pltdoc="x">block-txexpr?</a></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">inline-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">string-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">str</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">str</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">entity-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">symbol?</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">valid-char?</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">ent</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">ent</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">cdata-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cdata?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cdata</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cdata</span></span></span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">tags-to-exclude</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">null</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">attrs-to-exclude</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-attrs?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">null</span></span></span></td></tr></table></blockquote></div><div class="SIntrapara">Recursively process a <span class="RktVar">tagged-xexpr</span>, usually the one exported from a Pollen source file as <span class="RktSym">doc</span>.</div></p><p>This function doesn&rsquo;t do much on its own. Rather, it provides the hooks upon which harder-working functions can be hung.</p><p>Recall that in Pollen, all <font class="badlink">(part "tags-are-functions")</font>. By default, the <span class="RktVar">tagged-xexpr</span> from a source file is tagged with <span class="RktSym">root</span>. So the typical way to use <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span> is to attach your decoding functions to it, and then define <span class="RktSym">root</span> to invoke your <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span> function. Then it will be automatically applied to every <span class="RktSym">doc</span> during compile.</p><p>For instance, here&rsquo;s how <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span> is attached to <span class="RktSym">root</span> in <a href="http://practicaltypography.com"><span style="font-style: italic">Butterick&rsquo;s Practical Typography</span></a>. There&rsquo;s not much to it &#8212;</p><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">root</span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym">items</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">root</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktSym">items</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:txexpr-elements-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:block-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">compose1</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">hyphenate</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._wrap-hanging-quotes%29%29" class="RktValLink" data-pltdoc="x">wrap-hanging-quotes</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">compose1</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-quotes%29%29" class="RktValLink" data-pltdoc="x">smart-quotes</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-dashes%29%29" class="RktValLink" data-pltdoc="x">smart-dashes</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">#:exclude-tags</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">style</span><span class="hspace">&nbsp;</span><span class="RktVal">script</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><blockquote class="refpara"><blockquote class="refcolumn"><blockquote class="refcontent"><p>The <span class="RktSym">hyphenate</span> function is not part of Pollen, but rather the <a href="http://github.com/mbutterick/hyphenate"><span class="RktSym">hyphenate</span> package</a>, which you can install separately.</p></blockquote></blockquote></blockquote><p>This illustrates another important point: even though <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span> presents an imposing list of arguments, you&rsquo;re unlikely to use all of them at once. These represent possibilities, not requirements. For instance, let&rsquo;s see what happens when <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span> is invoked without any of its optional arguments.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">root</span><span class="hspace">&nbsp;</span><span class="RktVal">"I wonder"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="hspace">&nbsp;</span><span class="RktVal">"why"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"this works."</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(root "I wonder" (em "why") "this works.")</span></p></td></tr></table></blockquote></div></p><p>Right &#8212;&#160;nothing. That&rsquo;s because the default value for the decoding arguments is the identity function, <span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="stt"> </span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="stt"> </span><span class="RktSym">x</span><span class="RktPn">)</span>. So all the input gets passed through intact unless another action is specified.</p><p>The <span class="RktVar">*-proc</span> arguments of <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span> take procedures that are applied to specific categories of elements within <span class="RktVar">txexpr</span>.</p><p>The <span class="RktVar">txexpr-tag-proc</span> argument is a procedure that handles X-expression tags.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">"I'm from a strange"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">strong</span><span class="hspace">&nbsp;</span><span class="RktVal">"namespace"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Tags are symbols, so a tag-proc should return a symbol</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-tag-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">t</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-&gt;symbol</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">format</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">"ns:~a"</span><span class="hspace">&nbsp;</span><span class="RktSym">t</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(ns:p "I'm from a strange" (ns:strong "namespace"))</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">txexpr-attrs-proc</span> argument is a procedure that handles lists of X-expression attributes. (The <font class="badlink"><span class="RktModLink"><span class="RktSym">txexpr</span></span></font> module, included at no extra charge with Pollen, includes useful helper functions for dealing with these attribute lists.)</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">id</span><span class="hspace">&nbsp;</span><span class="RktVal">"first"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"If I only had a brain."</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Attrs is a list, so cons is OK for simple cases</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-attrs-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cons</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">[</span><span class="RktVal">class</span><span class="hspace">&nbsp;</span><span class="RktVal">"PhD"</span><span class="RktVal">]</span><span class="hspace">&nbsp;</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p ((class "PhD") (id "first")) "If I only had a brain.")</span></p></td></tr></table></blockquote></div></p><p>Note that <span class="RktVar">txexpr-attrs-proc</span> will change the attributes of every tagged X-expression, even those that don&rsquo;t have attributes. This is useful, because sometimes you want to add attributes where none existed before. But be careful, because the behavior may make your processing function overinclusive.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">id</span><span class="hspace">&nbsp;</span><span class="RktVal">"first"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"If I only had a brain."</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">"Me too."</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">This will insert the new attribute everywhere</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-attrs-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cons</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">[</span><span class="RktVal">class</span><span class="hspace">&nbsp;</span><span class="RktVal">"PhD"</span><span class="RktVal">]</span><span class="hspace">&nbsp;</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktRes">'(div</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">((class "PhD"))</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(p ((class "PhD") (id "first")) "If I only had a brain.")</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(p ((class "PhD")) "Me too."))</span></p></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">This will add the new attribute only to non-null attribute lists</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-attrs-proc</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">if</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">null?</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">attrs</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cons</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">[</span><span class="RktVal">class</span><span class="hspace">&nbsp;</span><span class="RktVal">"PhD"</span><span class="RktVal">]</span><span class="hspace">&nbsp;</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">'(div (p ((class "PhD") (id "first")) "If I only had a brain.") (p "Me too."))</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">txexpr-elements-proc</span> argument is a procedure that operates on the list of elements that represents the content of each tagged X-expression. Note that each element of an X-expression is subject to two passes through the decoder: once now, as a member of the list of elements, and also later, through its type-specific decoder (i.e., <span class="RktVar">string-proc</span>, <span class="RktVar">entity-proc</span>, and so on).</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Double"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"toil"</span><span class="hspace">&nbsp;</span><span class="RktVal">amp</span><span class="hspace">&nbsp;</span><span class="RktVal">"trouble"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Every element gets doubled ...</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-elements-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">es</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">append-map</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">e</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">list</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">e</span><span class="hspace">&nbsp;</span><span class="RktSym">e</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">es</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(div "Double" "Double" "\n" "\n" "toil" "toil" amp amp "trouble" "trouble")</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">... but only strings get capitalized</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-elements-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">es</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">append-map</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">e</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">list</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">e</span><span class="hspace">&nbsp;</span><span class="RktSym">e</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">es</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">s</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-upcase</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">s</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">'(div "DOUBLE" "DOUBLE" "\n" "\n" "TOIL" "TOIL" amp amp "TROUBLE" "TROUBLE")</span></p></td></tr></table></blockquote></div></p><p>So why do you need <span class="RktVar">txexpr-elements-proc</span>? Because some types of element decoding depend on context, thus it&rsquo;s necessary to handle the elements as a group. For instance, paragraph detection. The behavior is not merely a <span class="RktSym"><span class="badlink"><span class="RktValLink">map</span></span></span> across each element, because elements are being removed and altered contextually:</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">paras</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-elements-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Context matters. Trailing whitespace is ignored ...</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym">paras</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">body</span><span class="hspace">&nbsp;</span><span class="RktVal">"The first paragraph."</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(body "The first paragraph.")</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">... but whitespace between strings is converted to a break.</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym">paras</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">body</span><span class="hspace">&nbsp;</span><span class="RktVal">"The first paragraph."</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"And another."</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(body (p "The first paragraph.") (p "And another."))</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">A combination of both types</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym">paras</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">body</span><span class="hspace">&nbsp;</span><span class="RktVal">"The first paragraph."</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"And another."</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(body (p "The first paragraph.") (p "And another."))</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">txexpr-proc</span>, <span class="RktVar">block-txexpr-proc</span>, and <span class="RktVar">inline-txexpr-proc</span> arguments are procedures that operate on tagged X-expressions. If the X-expression meets the <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._block-txexpr~3f%29%29" class="RktValLink" data-pltdoc="x">block-txexpr?</a></span> test, it&rsquo;s processed by <span class="RktVar">block-txexpr-proc</span>. Otherwise, it&rsquo;s inline, so it&rsquo;s processed by <span class="RktVar">inline-txexpr-proc</span>. (Careful, however &#8212; these aren&rsquo;t mutually exclusive, because <span class="RktVar">block-txexpr-proc</span> operates on all the elements of a block, including other tagged X-expressions within.) Then both categories are processed by <span class="RktVar">txexpr-proc</span>.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Please"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="hspace">&nbsp;</span><span class="RktVal">"mind the gap"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">h1</span><span class="hspace">&nbsp;</span><span class="RktVal">"Tuesdays only"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">add-ns</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">make-txexpr</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-&gt;symbol</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">format</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">"ns:~a"</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">get-tag</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">get-attrs</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">get-elements</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">div and h1 are block elements, so this will only affect them</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:block-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">add-ns</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(ns:div "Please" (em "mind the gap") (ns:h1 "Tuesdays only"))</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">em is an inline element, so this will only affect it</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:inline-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">add-ns</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(div "Please" (ns:em "mind the gap") (h1 "Tuesdays only"))</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">this will affect all elements</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:block-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">add-ns</span><span class="hspace">&nbsp;</span><span class="RktPn">#:inline-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">add-ns</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(ns:div "Please" (ns:em "mind the gap") (ns:h1 "Tuesdays only"))</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">as will this</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">add-ns</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(ns:div "Please" (ns:em "mind the gap") (ns:h1 "Tuesdays only"))</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">string-proc</span>, <span class="RktVar">entity-proc</span>, and <span class="RktVar">cdata-proc</span> arguments are procedures that operate on X-expressions that are strings, entities, and CDATA, respectively. Deliberately, the output contracts for these procedures accept any kind of X-expression (meaning, the procedure can change the X-expression type).</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">A div with string, entity, and cdata elements</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Moe"</span><span class="hspace">&nbsp;</span><span class="RktVal">amp</span><span class="hspace">&nbsp;</span><span class="RktVal">62</span><span class="hspace">&nbsp;</span><span class="RktRdr">,</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cdata</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">#f</span><span class="hspace">&nbsp;</span><span class="RktVal">#f</span><span class="hspace">&nbsp;</span><span class="RktVal">"3 &gt; 2;"</span><span class="RktPn">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">rulify</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">hr</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">The rulify function is selectively applied to each</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">rulify</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">(list 'div '(hr) 'amp 62 (cdata #f #f "3 &gt; 2;"))</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:entity-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">rulify</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">(list 'div "Moe" #0='(hr) #0# (cdata #f #f "3 &gt; 2;"))</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:cdata-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">rulify</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">'(div "Moe" amp 62 (hr))</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr></table></blockquote></div></p><p>Note that entities come in two flavors &#8212;&#160;symbolic and numeric &#8212; and <span class="RktVar">entity-proc</span> affects both. If you only want to affect one or the other, you can add a test within <span class="RktVar">entity-proc</span>. Symbolic entities can be detected with <span class="RktSym"><span class="badlink"><span class="RktValLink">symbol?</span></span></span>, and numeric entities with <span class="RktSym"><span class="badlink"><span class="RktValLink">valid-char?</span></span></span>:</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">amp</span><span class="hspace">&nbsp;</span><span class="RktVal">62</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">symbolic-detonate</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">if</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">symbol?</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">BOOM</span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:entity-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">symbolic-detonate</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">'(div BOOM 62)</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">numeric-detonate</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">if</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">valid-char?</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">BOOM</span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:entity-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">numeric-detonate</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">'(div amp BOOM)</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr></table></blockquote></div></p><p>The five previous procedures &#8212;&#160;<span class="RktVar">block-txexpr-proc</span>, <span class="RktVar">inline-txexpr-proc</span>, <span class="RktVar">string-proc</span>, <span class="RktVar">entity-proc</span>, and <span class="RktVar">cdata-proc</span> &#8212;&#160;can return either a single X-expression, or a list of X-expressions, which will be spliced into the parent at the same point.</p><p>For instance, earlier we saw how to double elements by using <span class="RktVar">txexpr-elements-proc</span>. But you can accomplish the same thing on a case-by-case basis by returning a list of values:</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">A div with string, entity, and inline-txexpr elements</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">`</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Axl"</span><span class="hspace">&nbsp;</span><span class="RktVal">amp</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">span</span><span class="hspace">&nbsp;</span><span class="RktVal">"Slash"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">doubler</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">list</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">The doubler function is selectively applied to each type of element</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">doubler</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">'(div "Axl" "Axl" amp (span "Slash" "Slash"))</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:entity-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">doubler</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">'(div "Axl" (amp amp) (span "Slash"))</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">print</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:inline-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">doubler</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">'(div "Axl" amp (span "Slash") (span "Slash"))</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr></table></blockquote></div></p><p>Caution: when returning list values, it&rsquo;s possible to trip over the unavoidable ambiguity between a <span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span> and a list of <span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span>s that happens to begin with a symbolic entity:</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">An ambiguous expression</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">amb</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">guitar</span><span class="hspace">&nbsp;</span><span class="RktVal">"player-name"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">and</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">amb</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">amb</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Ambiguity in context</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">gnr</span><span class="hspace">&nbsp;</span><span class="RktVal">"Izzy"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Slash"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">rockit</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">str</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">list</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">guitar</span><span class="hspace">&nbsp;</span><span class="RktSym">str</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Expecting </span><span class="RktCmt">'</span><span class="RktCmt">(gnr guitar "Izzy" guitar "Slash") from next line,</span></td></tr><tr><td><span class="RktCmt">but return value will be treated as tagged X-expression</span></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">rockit</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(gnr (guitar "Izzy") (guitar "Slash"))</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Changing the order makes it unambiguous</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">rockit2</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">str</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">list</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">str</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">guitar</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym">rockit2</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(gnr "Izzy" guitar "Slash" guitar)</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">tags-to-exclude</span> argument is a list of tags that will be exempted from decoding. Though you could get the same result by testing the input within the individual decoding functions, that&rsquo;s tedious and potentially slower.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">"I really think"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="hspace">&nbsp;</span><span class="RktVal">"italics"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"should be lowercase."</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-upcase</span></span></span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p "I REALLY THINK" (em "ITALICS") "SHOULD BE LOWERCASE.")</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-upcase</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:exclude-tags</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p "I REALLY THINK" (em "italics") "SHOULD BE LOWERCASE.")</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">tags-to-exclude</span> argument is useful if you&rsquo;re decoding source that&rsquo;s destined to become HTML. According to the HTML spec, material within a <span class="RktSym">&lt;style&gt;</span> or <span class="RktSym">&lt;script&gt;</span> block needs to be preserved literally. In this example, if the CSS and JavaScript blocks are capitalized, they won&rsquo;t work. So exclude <span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">style</span><span class="stt"> </span><span class="RktVal">script</span><span class="RktVal">)</span>, and problem solved.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">body</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">h1</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">class</span><span class="hspace">&nbsp;</span><span class="RktVal">"Red"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"Let's visit Planet Telex."</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVal">(</span><span class="RktVal">style</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">type</span><span class="hspace">&nbsp;</span><span class="RktVal">"text/css"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">".Red {color: green;}"</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVal">(</span><span class="RktVal">script</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">type</span><span class="hspace">&nbsp;</span><span class="RktVal">"text/javascript"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"var area = h * w;"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-upcase</span></span></span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktRes">'(body</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(h1 ((class "Red")) "LET'S VISIT PLANET TELEX.")</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(style ((type "text/css")) ".RED {COLOR: GREEN;}")</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(script ((type "text/javascript")) "VAR AREA = H * W;"))</span></p></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-upcase</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:exclude-tags</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">style</span><span class="hspace">&nbsp;</span><span class="RktVal">script</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td><p><span class="RktRes">'(body</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(h1 ((class "Red")) "LET'S VISIT PLANET TELEX.")</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(style ((type "text/css")) ".Red {color: green;}")</span></p></td></tr><tr><td><p><span class="RktRes"></span><span class="hspace">&nbsp;&nbsp;</span><span class="RktRes">(script ((type "text/javascript")) "var area = h * w;"))</span></p></td></tr></table></td></tr></table></blockquote></div></p><p>Finally, the <span class="RktVar">attrs-to-exclude</span> argument works the same way as <span class="RktVar">tags-to-exclude</span>, but instead of excluding an element based on its tag, it excludes based on whether the element has a matching attribute/value pair.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">span</span><span class="hspace">&nbsp;</span><span class="RktVal">"No attrs"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">span</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">id</span><span class="hspace">&nbsp;</span><span class="RktVal">"foo"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"One attr"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-upcase</span></span></span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p (span "NO ATTRS") (span ((id "foo")) "ONE ATTR"))</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-upcase</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">#:exclude-attrs</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">id</span><span class="hspace">&nbsp;</span><span class="RktVal">"foo"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p (span "NO ATTRS") (span ((id "foo")) "One attr"))</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._decode-elements))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode-elements%29%29" class="RktValDef RktValLink" data-pltdoc="x">decode-elements</a></span></span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktVar">elements</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span>[</td><td valign="top"><span class="RktPn">#:txexpr-tag-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-tag-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:txexpr-attrs-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-attrs-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:txexpr-elements-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-elements-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:block-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">block-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:inline-txexpr-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">inline-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:string-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">string-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:entity-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">entity-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:cdata-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">cdata-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:exclude-tags</span><span class="hspace">&nbsp;</span><span class="RktVar">tags-to-exclude</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:exclude-attrs</span><span class="hspace">&nbsp;</span><span class="RktVar">attrs-to-exclude</span>]<span class="RktPn">)</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr/c</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">elements</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-tag-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">tag</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">tag</span></span></span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-attrs-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-attrs?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-attrs?</span></span></span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">attrs</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">attrs</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-elements-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktVar">elements</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktVar">elements</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">block-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._block-txexpr~3f%29%29" class="RktValLink" data-pltdoc="x">block-txexpr?</a></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">inline-txexpr-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">string-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">str</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">str</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">entity-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">symbol?</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">valid-char?</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">ent</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym">ent</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">cdata-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cdata?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">or/c</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cdata</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cdata</span></span></span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">tags-to-exclude</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">null</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">attrs-to-exclude</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-attrs?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">null</span></span></span></td></tr></table></blockquote></div><div class="SIntrapara">Identical to <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span>, but takes <span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span> as input rather than a whole tagged X-expression, and likewise returns <span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-elements?</span></span></span> rather than a tagged X-expression. A convenience variant for use inside tag functions.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._block-txexpr~3f))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._block-txexpr~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">block-txexpr?</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">boolean?</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">v</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">any/c</span></span></span></td></tr></table></blockquote></div><div class="SIntrapara">Predicate that tests whether <span class="RktVar">v</span> has a tag that is among the <span class="RktSym"><span class="badlink"><span class="RktValLink">world:current-block-tags</span></span></span>. If not, it is treated as inline.</div></p><p>This predicate affects the behavior of other functions. For instance, <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span> knows that block elements in the markup shouldn&rsquo;t be wrapped in a <span class="RktSym">p</span> tag. So if you introduce a new block element called <span class="RktSym">bloq</span> without configuring it as a block, misbehavior will follow:</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">paras</span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tx</span><span class="hspace">&nbsp;</span><span class="RktPn">#:txexpr-elements-proc</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym">paras</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">body</span><span class="hspace">&nbsp;</span><span class="RktVal">"I want to be a paragraph."</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">bloq</span><span class="hspace">&nbsp;</span><span class="RktVal">"But not me."</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(body (p "I want to be a paragraph.") (p (bloq "But not me.")))</span></p></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Wrong: bloq should not be wrapped</span></td></tr></table></blockquote></div></p><p>To change how this test works, use a <span class="RktSym">config</span> submodule as described in <font class="badlink">(part "settable-values")</font>:</p><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">module</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">config</span><span class="hspace">&nbsp;</span><span class="RktSym">racket/base</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">provide</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">all-defined-out</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">require</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">pollen/world</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">block-tags</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">cons</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">bloq</span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">world:block-tags</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><p>After that change, the result will be:</p><p><span class="RktRes">&rsquo;(body (p "I want to be a paragraph.") (bloq "But not me."))</span></p><p>The default block tags are:</p><p><span class="RktSym">root address article aside blockquote body canvas dd div dl fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hgroup hr li main nav noscript ol output p pre section table tfoot ul video</span></p><h3>1<tt>&nbsp;</tt><a name="(part._.Typography)"></a>Typography</h3><p>An assortment of typography &amp; layout functions, designed to be used with <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._decode%29%29" class="RktValLink" data-pltdoc="x">decode</a></span>. These aren&rsquo;t hard to write. So if you like these, use them. If not, make your own.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._whitespace~3f))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">whitespace?</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">boolean?</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">v</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">any/c</span></span></span></td></tr></table></blockquote></div><div class="SIntrapara">A predicate that returns <span class="RktVal">#t</span> for any stringlike <span class="RktVar">v</span> that&rsquo;s entirely whitespace, but also the empty string, as well as lists and vectors that are made only of <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span> members. Following the <span class="RktSym"><span class="badlink"><span class="RktValLink">regexp-match</span></span></span> convention, <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span> does not return <span class="RktVal">#t</span> for a nonbreaking space. If you prefer that behavior, use <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace/nbsp?</a></span>.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n</span><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktVal">"</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-&gt;symbol</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n</span><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktVal">"</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span><span class="hspace">&nbsp;</span><span class="RktVal">""</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">""</span><span class="hspace">&nbsp;</span><span class="RktVal">"</span><span class="hspace">&nbsp;&nbsp;</span><span class="RktVal">"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">" \n"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">nonbreaking-space</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">format</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">"~a"</span><span class="hspace">&nbsp;</span><span class="RktVal">#\u00A0</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span><span class="hspace">&nbsp;</span><span class="RktSym">nonbreaking-space</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#f</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._whitespace/nbsp~3f))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">whitespace/nbsp?</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">boolean?</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">v</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">any/c</span></span></span></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace?</a></span>, but also returns <span class="RktVal">#t</span> for nonbreaking spaces.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace/nbsp?</a></span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n</span><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktVal">"</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace/nbsp?</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string-&gt;symbol</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n</span><span class="hspace">&nbsp;&nbsp;&nbsp;</span><span class="RktVal">"</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace/nbsp?</a></span><span class="hspace">&nbsp;</span><span class="RktVal">""</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace/nbsp?</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">""</span><span class="hspace">&nbsp;</span><span class="RktVal">"</span><span class="hspace">&nbsp;&nbsp;</span><span class="RktVal">"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">" \n"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">nonbreaking-space</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">format</span></span></span><span class="hspace">&nbsp;</span><span class="RktVal">"~a"</span><span class="hspace">&nbsp;</span><span class="RktVal">#\u00A0</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._whitespace%2Fnbsp~3f%29%29" class="RktValLink" data-pltdoc="x">whitespace/nbsp?</a></span><span class="hspace">&nbsp;</span><span class="RktSym">nonbreaking-space</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">#t</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._smart-quotes))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-quotes%29%29" class="RktValDef RktValLink" data-pltdoc="x">smart-quotes</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">str</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">str</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span></td></tr></table></blockquote></div><div class="SIntrapara">Convert straight quotes in <span class="RktVar">str</span> to curly according to American English conventions.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tricky-string</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVal">"\"Why,\" she could've asked, \"are we in O&#8216;ahu watching 'Mame'?\""</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">display</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tricky-string</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">"Why," she could've asked, "are we in O&#8216;ahu watching 'Mame'?"</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">display</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-quotes%29%29" class="RktValLink" data-pltdoc="x">smart-quotes</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tricky-string</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">&#8220;Why,&#8221; she could&#8217;ve asked, &#8220;are we in O&#8216;ahu watching &#8216;Mame&#8217;?&#8221;</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._smart-dashes))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-dashes%29%29" class="RktValDef RktValLink" data-pltdoc="x">smart-dashes</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">str</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">str</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span></td></tr></table></blockquote></div><div class="SIntrapara">In <span class="RktVar">str</span>, convert three hyphens to an em dash, and two hyphens to an en dash, and remove surrounding spaces.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">define</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tricky-string</span><span class="hspace">&nbsp;</span><span class="RktVal">"I had a few --- OK, like 6--8 --- thin mints."</span><span class="RktPn">)</span></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">display</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym">tricky-string</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">I had a few --- OK, like 6--8 --- thin mints.</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">display</span></span></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._smart-dashes%29%29" class="RktValLink" data-pltdoc="x">smart-dashes</a></span><span class="hspace">&nbsp;</span><span class="RktSym">tricky-string</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">I had a few&#8212;OK, like 6&#8211;8&#8212;thin mints.</span></p></td></tr><tr><td><table cellspacing="0" cellpadding="0"><tr><td></td></tr></table></td></tr><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Monospaced font not great for showing dashes, but you get the idea</span></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._merge-newlines))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._merge-newlines%29%29" class="RktValDef RktValLink" data-pltdoc="x">merge-newlines</a></span></span><span class="hspace">&nbsp;</span><span class="RktVar">elements</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">elements</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Within <span class="RktVar">elements</span>, merge sequential newline characters (<span class="RktVal">"\n"</span>) into a single whitespace element. Helper function used by <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span>.</div></p><p><div class="SIntrapara">Example:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._merge-newlines%29%29" class="RktValLink" data-pltdoc="x">merge-newlines</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"foo"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"bar"</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="hspace">&nbsp;&nbsp;</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">'(p "\n\n" "foo" "\n\n\n" "bar" (em "\n\n\n"))</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._detect-linebreaks))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="RktValDef RktValLink" data-pltdoc="x">detect-linebreaks</a></span></span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktVar">tagged-xexpr-elements</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span>[</td><td valign="top"><span class="RktPn">#:separator</span><span class="hspace">&nbsp;</span><span class="RktVar">linebreak-sep</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:insert</span><span class="hspace">&nbsp;</span><span class="RktVar">linebreak</span>]<span class="RktPn">)</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">&rarr;</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">tagged-xexpr-elements</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">linebreak-sep</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">world:current-linebreak-separator</span></span></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">linebreak</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">br</span><span class="RktVal">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Within <span class="RktVar">tagged-xexpr-elements</span>, convert occurrences of <span class="RktVar">linebreak-sep</span> (<span class="RktVal">"\n"</span> by default) to <span class="RktVar">linebreak</span>, but only if <span class="RktVar">linebreak-sep</span> does not occur between blocks (see <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._block-txexpr~3f%29%29" class="RktValLink" data-pltdoc="x">block-txexpr?</a></span>). Why? Because block-level elements automatically display on a new line, so adding <span class="RktVar">linebreak</span> would be superfluous. In that case, <span class="RktVar">linebreak-sep</span> just disappears.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="RktValLink" data-pltdoc="x">detect-linebreaks</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Two items:"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="hspace">&nbsp;</span><span class="RktVal">"Eggs"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="hspace">&nbsp;</span><span class="RktVal">"Bacon"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(div "Two items:" (br) (em "Eggs") (br) (em "Bacon"))</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="RktValLink" data-pltdoc="x">detect-linebreaks</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Two items:"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Eggs"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Bacon"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(div "Two items:" (div "Eggs") (div "Bacon"))</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._detect-paragraphs))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValDef RktValLink" data-pltdoc="x">detect-paragraphs</a></span></span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktVar">elements</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span>[</td><td valign="top"><span class="RktPn">#:separator</span><span class="hspace">&nbsp;</span><span class="RktVar">paragraph-sep</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:tag</span><span class="hspace">&nbsp;</span><span class="RktVar">paragraph-tag</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:linebreak-proc</span><span class="hspace">&nbsp;</span><span class="RktVar">linebreak-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:force?</span><span class="hspace">&nbsp;</span><span class="RktVar">force-paragraph?</span>]<span class="RktPn">)</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">elements</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">paragraph-sep</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">string?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">world:current-paragraph-separator</span></span></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">paragraph-tag</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">symbol?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">p</span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="argcontract"><tr><td valign="top"><span class="hspace">&nbsp;&nbsp;</span></td><td valign="top"><span class="RktVar">linebreak-proc</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">:</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">(</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">. </span><span class="RktSym"><span class="badlink"><span class="RktValLink">-&gt;</span></span></span><span class="RktPn"> .</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">listof</span></span></span><span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">xexpr?</span></span></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top">=</td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="RktValLink" data-pltdoc="x">detect-linebreaks</a></span></td></tr></table></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">force-paragraph?</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">boolean?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">#f</span></td></tr></table></blockquote></div><div class="SIntrapara">Find paragraphs within <span class="RktVar">elements</span> and wrap them with <span class="RktVar">paragraph-tag</span>. Also handle linebreaks using <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="RktValLink" data-pltdoc="x">detect-linebreaks</a></span>.</div></p><p>What counts as a paragraph? Any <span class="RktVar">elements</span> that are either a) explicitly set apart with <span class="RktVar">paragraph-sep</span>, or b) adjacent to a <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._block-txexpr~3f%29%29" class="RktValLink" data-pltdoc="x">block-txexpr?</a></span> (in which case the paragraph-ness is implied).</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"Explicit para"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Explicit para"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((p "Explicit para") (p "Explicit para"))</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"Explicit para"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Explicit para"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Explicit line"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((p "Explicit para") (p "Explicit para" (br) "Explicit line"))</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"Implied para"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Block"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"Implied para"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((p "Implied para") (div "Block") (p "Implied para"))</span></p></td></tr></table></blockquote></div></p><p>If <span class="RktVar">element</span> is already a block, it will not be wrapped as a paragraph (because in that case, the wrapping would be superfluous). Thus, as a consequence, if <span class="RktVar">paragraph-sep</span> occurs between two blocks, it will be ignored (as in the example below using two sequential <span class="RktSym">div</span> blocks.) Likewise, <span class="RktVar">paragraph-sep</span> will also be ignored if it occurs between a block and a non-block (because a paragraph break is already implied).</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">The explicit "\n\n" makes no difference in these cases</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"First block"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Second block"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((div "First block") (div "Second block"))</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"First block"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Second block"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((div "First block") (div "Second block"))</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"Para"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Block"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((p "Para") (div "Block"))</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"Para"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">div</span><span class="hspace">&nbsp;</span><span class="RktVal">"Block"</span><span class="RktVal">)</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((p "Para") (div "Block"))</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">paragraph-tag</span> argument sets the tag used to wrap paragraphs.</p><p><div class="SIntrapara">Example:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"First para"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Second para"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktPn">#:tag</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">ns:p</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((ns:p "First para") (ns:p "Second para"))</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktVar">linebreak-proc</span> argument allows you to use a different linebreaking procedure other than the usual <span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="RktValLink" data-pltdoc="x">detect-linebreaks</a></span>.</p><p><div class="SIntrapara">Example:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"First para"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Second para"</span><span class="hspace">&nbsp;</span><span class="RktVal">"\n"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Second line"</span><span class="RktVal">)</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktPn">#:linebreak-proc</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><span class="badlink"><span class="RktValLink">&#955;</span></span></span><span class="RktPn">(</span><span class="RktSym">x</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-linebreaks%29%29" class="RktValLink" data-pltdoc="x">detect-linebreaks</a></span><span class="hspace">&nbsp;</span><span class="RktSym">x</span><span class="hspace">&nbsp;</span><span class="RktPn">#:insert</span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">newline</span><span class="RktVal">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p><span class="RktRes">'((p "First para") (p "Second para" (newline) "Second line"))</span></p></td></tr></table></blockquote></div></p><p>The <span class="RktPn">#:force?</span> option will wrap a paragraph tag around <span class="RktVar">elements</span>, even if no explicit or implicit paragraph breaks are found. The <span class="RktPn">#:force?</span> option is useful for when you want to guarantee that you always get a list of blocks.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"This"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">span</span><span class="hspace">&nbsp;</span><span class="RktVal">"will not be"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"a paragraph"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'("This" (span "will not be") "a paragraph")</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._detect-paragraphs%29%29" class="RktValLink" data-pltdoc="x">detect-paragraphs</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">"But this"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">span</span><span class="hspace">&nbsp;</span><span class="RktVal">"will be"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"a paragraph"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktPn">#:force?</span><span class="hspace">&nbsp;</span><span class="RktVal">#t</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'((p "But this" (span "will be") "a paragraph"))</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._((lib._pollen/decode..rkt)._wrap-hanging-quotes))"></a><span title="Provided from: pollen/decode | Package: pollen"><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._wrap-hanging-quotes%29%29" class="RktValDef RktValLink" data-pltdoc="x">wrap-hanging-quotes</a></span></span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktVar">tx</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span>[</td><td valign="top"><span class="RktPn">#:single-preprend</span><span class="hspace">&nbsp;</span><span class="RktVar">single-preprender</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr><tr><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="hspace">&nbsp;</span></td><td valign="top"><span class="RktPn">#:double-preprend</span><span class="hspace">&nbsp;</span><span class="RktVar">double-preprender</span>]<span class="RktPn">)</span></td><td valign="top"><span class="hspace">&nbsp;</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace">&nbsp;</span>&rarr;<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">tx</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr?</span></span></span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">single-preprender</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">squo</span></td></tr><tr><td><span class="hspace">&nbsp;&nbsp;</span><span class="RktVar">double-preprender</span><span class="hspace">&nbsp;</span>:<span class="hspace">&nbsp;</span><span class="RktSym"><span class="badlink"><span class="RktValLink">txexpr-tag?</span></span></span><span class="hspace">&nbsp;</span>=<span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">dquo</span></td></tr></table></blockquote></div><div class="SIntrapara">Find single or double quote marks at the beginning of <span class="RktVar">tx</span> and wrap them in an X-expression with the tag <span class="RktVar">single-preprender</span> or <span class="RktVar">double-preprender</span>, respectively. The default values are <span class="RktVal">'</span><span class="RktVal">squo</span> and <span class="RktVal">'</span><span class="RktVal">dquo</span>.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._wrap-hanging-quotes%29%29" class="RktValLink" data-pltdoc="x">wrap-hanging-quotes</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">"No quote to hang."</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p "No quote to hang.")</span></p></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._wrap-hanging-quotes%29%29" class="RktValLink" data-pltdoc="x">wrap-hanging-quotes</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">"&#8220;What? We need to hang quotes?&#8221;"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p (dquo "&#8220;" "What? We need to hang quotes?&#8221;"))</span></p></td></tr></table></blockquote></div></p><p>In pro typography, quotation marks at the beginning of a line or paragraph are often shifted into the margin slightly to make them appear more optically aligned with the left edge of the text. With a reflowable layout model like HTML, you don&rsquo;t know where your line breaks will be.</p><p>This function will simply insert the <span class="RktVal">'</span><span class="RktVal">squo</span> and <span class="RktVal">'</span><span class="RktVal">dquo</span> tags, which provide hooks that let you do the actual hanging via CSS, like so (actual measurement can be refined to taste):</p><p><table cellspacing="0" cellpadding="0"><tr><td><p><span class="stt">squo {margin-left: -0.25em;}</span></p></td></tr><tr><td><p><span class="stt">dquo {margin-left: -0.50em;}</span></p></td></tr></table></p><p>Be warned: there are many edge cases this function does not handle well.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktCmt">;</span><span class="RktCmt">&nbsp;</span><span class="RktCmt">Argh: this edge case is not handled properly</span></td></tr><tr><td><span class="stt">&gt; </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///Users/mb/git/pollen/scribblings/decode.html#%28def._%28%28lib._pollen%2Fdecode..rkt%29._wrap-hanging-quotes%29%29" class="RktValLink" data-pltdoc="x">wrap-hanging-quotes</a></span><span class="hspace">&nbsp;</span><span class="RktVal">'</span><span class="RktVal">(</span><span class="RktVal">p</span><span class="hspace">&nbsp;</span><span class="RktVal">"&#8220;"</span><span class="hspace">&nbsp;</span><span class="RktVal">(</span><span class="RktVal">em</span><span class="hspace">&nbsp;</span><span class="RktVal">"What?"</span><span class="RktVal">)</span><span class="hspace">&nbsp;</span><span class="RktVal">"We need to hang quotes?&#8221;"</span><span class="RktVal">)</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">'(p "&#8220;" (em "What?") "We need to hang quotes?&#8221;")</span></p></td></tr></table></blockquote></div></p></div></div><div id="contextindicator">&nbsp;</div></body></html>