1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 01:54:21 +03:00
inform7/docs/indoc/2-haj.html
2020-01-25 23:42:42 +00:00

868 lines
122 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>2/utc</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of '2/haj' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">indoc 4</a></li><li><a href="index.html#2">Chapter 2: Processing</a></li><li><b>HTML and JavaScript</b></li></ul><p class="purpose">HTML utility code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP4">&#167;4. Images</a></li><li><a href="#SP8">&#167;8. HTML file structure</a></li><li><a href="#SP12">&#167;12. Miscellaneous HTML</a></li><li><a href="#SP20">&#167;20. Definitions</a></li><li><a href="#SP22">&#167;22. Topping and tailing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Keeping track of which images are referred to in the HTML we generate:
</p>
<pre class="display">
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">image_usages</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">how many times, if at all, this image has been used</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">image_usage</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">usage_count</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">resolved_to</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">image_usage</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">image_source</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">src</span><span class="plain">; </span> <span class="comment">a location from which images can be taken</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">image_source</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure image_usage is accessed in 3/fln and here.</p>
<p class="endnote">The structure image_source is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>We can either generate entirely fresh HTML pages, or we can inject
material into a division inside a copy of an existing page: this is called
"top-and-tailing".
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">first_request_for_tt</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span> <span class="comment">will the next request be the first?</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DSET_main_tail_matter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DSET_main_top_matter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DSET_section_tail_matter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DSET_section_top_matter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Images. </b>In the Inform application, a special <code class="display"><span class="extract">http</span></code> transport called <code class="display"><span class="extract">inform:</span></code> is used
for references to the in-app documentation, so an image called <code class="display"><span class="extract">orange.png</span></code>
will be found at the URL <code class="display"><span class="extract">inform:/orange.png</span></code>.
</p>
<p class="inwebparagraph">Otherwise, of course, we need to make an images folder alongside the HTML
we produce. It will be called <code class="display"><span class="extract">images</span></code>, so relative to the HTML, the URL
would then be <code class="display"><span class="extract">images/orange.png</span></code>.
</p>
<p class="inwebparagraph">However, it"s also possible that the book"s instructions tell us to use
images from an already-existing location instead.
</p>
<p class="inwebparagraph">Note that each time the URL of an image is looked up, we make a note of it,
so that we can keep track of which images we actually need.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::image_URL</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">image_usages</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">image_usages</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(100, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="reserved">image_usage</span><span class="plain"> *</span><span class="identifier">iu</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Dictionaries::find</span><span class="plain">(</span><span class="identifier">image_usages</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">)) {</span>
<span class="identifier">iu</span><span class="plain"> = </span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">image_usages</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Dictionaries::create</span><span class="plain">(</span><span class="identifier">image_usages</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">iu</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">image_usage</span><span class="plain">);</span>
<span class="identifier">iu</span><span class="plain">-</span><span class="element">&gt;usage_count</span><span class="plain"> = 0;</span>
<span class="identifier">iu</span><span class="plain">-</span><span class="element">&gt;leafname</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="functiontext">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">image_usages</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">iu</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">iu</span><span class="plain">-</span><span class="element">&gt;usage_count</span><span class="plain">++;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;images_path</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;html_for_Inform_application</span><span class="plain"> == 1) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"inform:/%/f"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;images_copy</span><span class="plain">)</span>
<span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"images"</span><span class="plain">), </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%/f"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">iu</span><span class="plain">-</span><span class="element">&gt;resolved_to</span><span class="plain"> = </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::image_URL is used in <a href="#SP13">&#167;13</a>, <a href="#SP17">&#167;17</a>, 1/mn (<a href="1-mn.html#SP1_1">&#167;1.1</a>), 2/rr (<a href="2-rr.html#SP4_5">&#167;4.5</a>), 2/css (<a href="2-css.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>For ebook use only:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::note_images</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">image_usage</span><span class="plain"> *</span><span class="identifier">iu</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">iu</span><span class="plain">, </span><span class="reserved">image_usage</span><span class="plain">)</span>
<span class="functiontext">Epub::note_image</span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;ebook</span><span class="plain">, </span><span class="identifier">iu</span><span class="plain">-</span><span class="element">&gt;resolved_to</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::note_images is used in 1/mn (<a href="1-mn.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>Suppose we are indeed copying images into place: we have to get them from
somewhere. The somewheres are folders called "image sources", and this routine
adds one:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::add_image_source</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
<span class="reserved">image_source</span><span class="plain"> *</span><span class="identifier">is</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">image_source</span><span class="plain">);</span>
<span class="identifier">is</span><span class="plain">-</span><span class="element">&gt;src</span><span class="plain"> = </span><span class="identifier">path</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::add_image_source is used in 1/ins (<a href="1-ins.html#SP3">&#167;3</a>, <a href="1-ins.html#SP5_1">&#167;5.1</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>During the copying process, we look for each image, say <code class="display"><span class="extract">orange.png</span></code>, in
each of these image sources, starting from the most recently added and
working backwards. As soon as we find a file of that name, we copy it over.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::copy_images</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;images_copy</span><span class="plain">) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;destination</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"images"</span><span class="plain">);</span>
<span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">image_usage</span><span class="plain"> *</span><span class="identifier">iu</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">iu</span><span class="plain">, </span><span class="reserved">image_usage</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">image_source</span><span class="plain"> *</span><span class="identifier">is</span><span class="plain">;</span>
<span class="identifier">LOOP_BACKWARDS_OVER</span><span class="plain">(</span><span class="identifier">is</span><span class="plain">, </span><span class="reserved">image_source</span><span class="plain">) {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">is</span><span class="plain">-</span><span class="element">&gt;src</span><span class="plain">, </span><span class="identifier">iu</span><span class="plain">-</span><span class="element">&gt;leafname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">)) {</span>
<span class="identifier">found</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Shell::copy</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="string">"-f"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) { </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"unable to find the image %S"</span><span class="plain">, </span><span class="identifier">iu</span><span class="plain">-</span><span class="element">&gt;leafname</span><span class="plain">); }</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::copy_images is used in 1/mn (<a href="1-mn.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. HTML file structure. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::begin_file</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">) {</span>
<span class="functiontext">HTML::declare_as_HTML</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;XHTML</span><span class="plain">);</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">CSS</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">V</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_CSS_leafname</span><span class="plain">) &gt; 0))</span>
<span class="identifier">CSS</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_CSS_leafname</span><span class="plain">);</span>
<span class="functiontext">HTML::begin_head</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">CSS</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">monthname</span><span class="plain">[12] = { </span><span class="string">"Jan"</span><span class="plain">, </span><span class="string">"Feb"</span><span class="plain">, </span><span class="string">"Mar"</span><span class="plain">, </span><span class="string">"Apr"</span><span class="plain">, </span><span class="string">"May"</span><span class="plain">, </span><span class="string">"Jun"</span><span class="plain">, </span><span class="string">"Jul"</span><span class="plain">, </span><span class="string">"Aug"</span><span class="plain">, </span><span class="string">"Sep"</span><span class="plain">, </span><span class="string">"Oct"</span><span class="plain">, </span><span class="string">"Nov"</span><span class="plain">, </span><span class="string">"Dec"</span><span class="plain"> };</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">, </span><span class="string">"Generated by indoc on %d %s %d"</span><span class="plain">,</span>
<span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mday</span><span class="plain">, </span><span class="identifier">monthname</span><span class="plain">[</span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_mon</span><span class="plain">], </span><span class="identifier">the_present</span><span class="plain">-&gt;</span><span class="identifier">tm_year</span><span class="plain">+1900);</span>
<span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::write_title</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;title&gt;%S&lt;/title&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::begin_file is used in 2/rnd (<a href="2-rnd.html#SP16_2">&#167;16.2</a>), 3/iu (<a href="3-iu.html#SP1">&#167;1</a>), 4/cm (<a href="4-cm.html#SP9_1">&#167;9.1</a>).</p>
<p class="endnote">The function HTMLUtilities::write_title is used in 2/rnd (<a href="2-rnd.html#SP16_2">&#167;16.2</a>), 3/iu (<a href="3-iu.html#SP1">&#167;1</a>), 4/cm (<a href="4-cm.html#SP9_1">&#167;9.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Here's text within a link:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::general_link</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cl</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="functiontext">HTML::begin_link_with_class</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">cl</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="functiontext">HTML::end_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::general_link is used in <a href="#SP11">&#167;11</a>, 3/iu (<a href="3-iu.html#SP4">&#167;4</a>), 3/cai (<a href="3-cai.html#SP9_2_3_4">&#167;9.2.3.4</a>, <a href="3-cai.html#SP9_2_3_5">&#167;9.2.3.5</a>), 3/ei (<a href="3-ei.html#SP3_5">&#167;3.5</a>), 4/cm (<a href="4-cm.html#SP5">&#167;5</a>, <a href="4-cm.html#SP6">&#167;6</a>, <a href="4-cm.html#SP9_3_1">&#167;9.3.1</a>, <a href="4-cm.html#SP9_3_2_1">&#167;9.3.2.1</a>, <a href="4-cm.html#SP10">&#167;10</a>), 4/ca (<a href="4-ca.html#SP5">&#167;5</a>, <a href="4-ca.html#SP6">&#167;6</a>), 4/ct (<a href="4-ct.html#SP3">&#167;3</a>, <a href="4-ct.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>And a link with both text and a title (tooltip) tag:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::titled_link</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cl</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ti</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="functiontext">HTML::begin_link_with_class_title</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">cl</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">, </span><span class="identifier">ti</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="functiontext">HTML::end_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::titled_link appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>And a standardised paragraph which is itself a link:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::textual_link</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::general_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"standardlink"</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::textual_link is used in 4/cm (<a href="4-cm.html#SP9_3_1">&#167;9.3.1</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. Miscellaneous HTML. </b>Horizontal ruled lines.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::ruled_line</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">)</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"----------------------------------------------------------------------\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::ruled_line is used in 2/rnd (<a href="2-rnd.html#SP9_1">&#167;9.1</a>), 4/nd (<a href="4-nd.html#SP6">&#167;6</a>), 4/cm (<a href="4-cm.html#SP4">&#167;4</a>), 4/ca (<a href="4-ca.html#SP4">&#167;4</a>), 4/ct (<a href="4-ct.html#SP5">&#167;5</a>), 4/cr (<a href="4-cr.html#SP5">&#167;5</a>, <a href="4-cr.html#SP6">&#167;6</a>), 4/cu (<a href="4-cu.html#SP5">&#167;5</a>, <a href="4-cu.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>Images.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::image_element</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"alt=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string"> src=\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::image_URL</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"img"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::image_element_scaled</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">xsize</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">ysize</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"alt=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string"> src=\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::image_URL</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string"> width=\</span><span class="plain">"</span><span class="string">%d\</span><span class="plain">"</span><span class="string"> height=\</span><span class="plain">"</span><span class="string">%d\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">xsize</span><span class="plain">, </span><span class="identifier">ysize</span><span class="plain">);</span>
<span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"img"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::image_with_id</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"alt=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string"> src=\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::image_URL</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string"> id=\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"img"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::asterisk_image</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">asterisk\</span><span class="plain">"</span><span class="string"> alt=\</span><span class="plain">"</span><span class="string">*\</span><span class="plain">"</span><span class="string"> src=\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::image_URL</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::tag_sc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"img"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::image_element is used in 2/rnd (<a href="2-rnd.html#SP11_2_2_3">&#167;11.2.2.3</a>), 4/ct (<a href="4-ct.html#SP3">&#167;3</a>), 4/cr (<a href="4-cr.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function HTMLUtilities::image_element_scaled is used in 2/rnd (<a href="2-rnd.html#SP11_2_2_3">&#167;11.2.2.3</a>).</p>
<p class="endnote">The function HTMLUtilities::image_with_id is used in 4/cm (<a href="4-cm.html#SP6">&#167;6</a>), 4/ca (<a href="4-ca.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function HTMLUtilities::asterisk_image is used in 2/exm (<a href="2-exm.html#SP8_2_2">&#167;8.2.2</a>), 2/rnd (<a href="2-rnd.html#SP14">&#167;14</a>), 4/cr (<a href="4-cr.html#SP6_2">&#167;6.2</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>The "extra" functions here are for revealing or concealing page content
when the user clicks a button. Each such piece of content is in its own
uniquely-ID'd <code class="display"><span class="extract">&lt;div&gt;</span></code>, as follows:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::extra_div_open</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">) {</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"div"</span><span class="plain">, </span><span class="string">"id=\</span><span class="plain">"</span><span class="string">extra%d\</span><span class="plain">"</span><span class="string"> style=\</span><span class="plain">"</span><span class="string">display: none;\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::extra_div_open is used in 4/cm (<a href="4-cm.html#SP9_3_2_1">&#167;9.3.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>And the following links provide the wiring for the buttons:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::extra_link</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">onclick</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">onclick</span><span class="plain">, </span><span class="string">"showExtra('extra%d', 'plus%d'); return false;"</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">HTML::begin_link_with_class_onclick</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#"</span><span class="plain">, </span><span class="identifier">onclick</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">onclick</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"alt=\</span><span class="plain">"</span><span class="string">show\</span><span class="plain">"</span><span class="string"> id=\</span><span class="plain">"</span><span class="string">plus%d\</span><span class="plain">"</span><span class="string"> src=\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extra"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"img"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;#160;"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::all_extras_link</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;#160;"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">onclick</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">onclick</span><span class="plain">, </span><span class="string">"showExtra%S(); return false;"</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">);</span>
<span class="functiontext">HTML::begin_link_with_class_onclick</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"#"</span><span class="plain">, </span><span class="identifier">onclick</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">onclick</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"alt=\</span><span class="plain">"</span><span class="string">show\</span><span class="plain">"</span><span class="string"> id=\</span><span class="plain">"</span><span class="string">plus%S\</span><span class="plain">"</span><span class="string"> src=\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extrab"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">, </span><span class="string">"\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"img"</span><span class="plain">, </span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">details</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::extra_link is used in 4/cm (<a href="4-cm.html#SP9_3_2_1">&#167;9.3.2.1</a>).</p>
<p class="endnote">The function HTMLUtilities::all_extras_link is used in 4/cm (<a href="4-cm.html#SP9_3_2">&#167;9.3.2</a>).</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>These links call some standard Javascript functions, thus:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::write_javascript_for_buttons</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" function showExtra(id, imid) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" if (document.getElementById(id).style.display == 'block') {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(id).style.display = 'none';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(imid).src = '"</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extra"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" } else {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(id).style.display = 'block';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(imid).src = '"</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extraclose"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" function onLoaded() {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" if (window.location.hash) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" var hash = window.location.hash.substring(2);\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" if (hash.search(\</span><span class="plain">"</span><span class="string">_\</span><span class="plain">"</span><span class="string">) &gt;= 0) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" var res = hash.split(\</span><span class="plain">"</span><span class="string">_\</span><span class="plain">"</span><span class="string">);\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" showExample(\</span><span class="plain">"</span><span class="string">example\</span><span class="plain">"</span><span class="string">+res[1]);\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" } else {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" showExample(\</span><span class="plain">"</span><span class="string">example\</span><span class="plain">"</span><span class="string">+hash);\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" window.onload=onLoaded;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" function showExample(id) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" if (document.getElementById(id).style.display == 'block') {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(id).style.display = 'none';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" } else {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(id).style.display = 'block';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" function openExtra(id, imid) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(id).style.display = 'block';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(imid).src = '"</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extraclose"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" function closeExtra(id, imid) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(id).style.display = 'none';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById(imid).src = '"</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extra"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::write_javascript_for_buttons is used in 2/rnd (<a href="2-rnd.html#SP16_2">&#167;16.2</a>), 4/cm (<a href="4-cm.html#SP9_1">&#167;9.1</a>).</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b>Where:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">img</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">img</span><span class="plain">, </span><span class="string">"%S.png"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::image_URL</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">img</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">img</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::extra_icon is used in <a href="#SP15">&#167;15</a>, <a href="#SP16">&#167;16</a>, <a href="#SP18">&#167;18</a>.</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>And the following compiles a set of specific functions for numbered buttons,
used on the Contents page:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::write_javascript_for_contents_buttons</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" function showExtra%S() {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_abbrev</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" if (document.getElementById('plus%S').src.indexOf('"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_abbrev</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extrab"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"') &gt;= 0) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_chapter_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bn</span><span class="plain"> = (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">)*1000+</span><span class="identifier">i</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" openExtra('extra%d', 'plus%d');\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">bn</span><span class="plain">, </span><span class="identifier">bn</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById('plus%S').src = '"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_abbrev</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extracloseb"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" } else {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_chapter_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bn</span><span class="plain"> = (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">)*1000+</span><span class="identifier">i</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" closeExtra('extra%d', 'plus%d');\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">bn</span><span class="plain">, </span><span class="identifier">bn</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" document.getElementById('plus%S').src = '"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_abbrev</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::extra_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extrab"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"';\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" }\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::write_javascript_for_contents_buttons is used in 4/cm (<a href="4-cm.html#SP9_1">&#167;9.1</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>JavaScript to handle the paste icon works differently on different platforms.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::paste_script</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">content</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">code_num</span><span class="plain">) {</span>
<span class="functiontext">HTML::open_javascript</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"function pasteCode"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(code"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d(code"</span><span class="plain">, </span><span class="identifier">code_num</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_Andrew</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" var myProject = window.Project;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_David</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" var myProject = external.Project;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" myProject.selectView('source');\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" myProject.pasteCode("</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">) == 0) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"code"</span><span class="plain">); }</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'%S'"</span><span class="plain">, </span><span class="identifier">content</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">");\</span><span class="plain">n</span><span class="string">}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::close_javascript</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::create_script</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">content</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">code_num</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">titling</span><span class="plain">) {</span>
<span class="functiontext">HTML::open_javascript</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"function createNewProject"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(code"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d(code"</span><span class="plain">, </span><span class="identifier">code_num</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", title) {\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_Andrew</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" var myProject = window.Project;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;javascript_paste_method</span><span class="plain"> == </span><span class="constant">PASTEMODE_David</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" var myProject = external.Project;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" myProject.createNewProject("</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"title"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'%S'"</span><span class="plain">, </span><span class="identifier">titling</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">content</span><span class="plain">) == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"code"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"'%S'"</span><span class="plain">, </span><span class="identifier">content</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">");\</span><span class="plain">n</span><span class="string">}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::close_javascript</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::paste_script is used in 2/rnd (<a href="2-rnd.html#SP11_2_2_3">&#167;11.2.2.3</a>, <a href="2-rnd.html#SP16_2">&#167;16.2</a>).</p>
<p class="endnote">The function HTMLUtilities::create_script is used in 2/rnd (<a href="2-rnd.html#SP11_2_2_3">&#167;11.2.2.3</a>, <a href="2-rnd.html#SP16_2">&#167;16.2</a>).</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. Definitions. </b>Some nice little boxes for syntax definitions in computery manuals:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_definition_anchors</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::definition_box</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">defn</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sigil</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">, </span><span class="string">"defn%d"</span><span class="plain">, </span><span class="identifier">no_definition_anchors</span><span class="plain">++);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">, </span><span class="string">"START PHRASE \</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">comment</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"div"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">definition\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::anchor</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::defn_unpack</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"END PHRASE"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">defnhead</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defnhead</span><span class="plain">, </span><span class="string">"definition of %S"</span><span class="plain">, </span><span class="identifier">sigil</span><span class="plain">);</span>
<span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">defnhead</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">defnhead</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"PHRASE: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::end_definition_box</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;format</span><span class="plain"> == </span><span class="constant">HTML_FORMAT</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"end definition"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"div"</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::definition_box is used in 2/rr (<a href="2-rr.html#SP4_6_2">&#167;4.6.2</a>).</p>
<p class="endnote">The function HTMLUtilities::end_definition_box is used in 2/rr (<a href="2-rr.html#SP4_6_2">&#167;4.6.2</a>).</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>Though these are in fact quite a lot of trouble:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::defn_unpack</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">given_defn</span><span class="plain">, </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">anchor</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
&lt;<span class="cwebmacro">Given alternates divided by an ampersand, recurse to unpack each in turn</span> <span class="cwebmacronumber">21.1</span>&gt;<span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">given_defn</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Work out an index mark for this definition</span> <span class="cwebmacronumber">21.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;inform_definitions_mode</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Rewrite definition as an HTML paragraph of class defnprototype</span> <span class="cwebmacronumber">21.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Set the kind of the result of the phrase in italic, not bold</span> <span class="cwebmacronumber">21.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Specially set and specially index a phrase to decide a condition</span> <span class="cwebmacronumber">21.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Specially set and specially index a text substitution</span> <span class="cwebmacronumber">21.6</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Tidy up the definition paragraph</span> <span class="cwebmacronumber">21.7</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">definitionterm\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::defn_unpack is used in <a href="#SP20">&#167;20</a>, <a href="#SP21_1">&#167;21.1</a>.</p>
<p class="inwebparagraph"><a id="SP21_1"></a><b>&#167;21.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Given alternates divided by an ampersand, recurse to unpack each in turn</span> <span class="cwebmacronumber">21.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">given_defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) &amp; (%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">HTMLUtilities::defn_unpack</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;or:&lt;/i&gt;&amp;#160;&amp;#160;&amp;#160;"</span><span class="plain">);</span>
<span class="functiontext">HTMLUtilities::defn_unpack</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21_2"></a><b>&#167;21.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Work out an index mark for this definition</span> <span class="cwebmacronumber">21.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">given_defn</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;inform_definitions_mode</span><span class="plain">) </span><span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" ...%c*"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">L</span><span class="string">": *"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">, </span><span class="string">"=___=!definition"</span><span class="plain">);</span>
<span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21_3"></a><b>&#167;21.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Rewrite definition as an HTML paragraph of class defnprototype</span> <span class="cwebmacronumber">21.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">proto</span><span class="plain">);</span>
<span class="functiontext">HTML::open</span><span class="plain">(</span><span class="identifier">proto</span><span class="plain">, </span><span class="string">"p"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"class='defnprototype'"</span><span class="plain">);</span>
<span class="comment">given alternative wordings, put only the first in boldface</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%i+?)/(%C+)"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%0&lt;/b&gt;/%1&lt;b&gt;"</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">proto</span><span class="plain">, </span><span class="string">"&lt;b&gt;%S&lt;/b&gt;"</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">);</span>
<span class="functiontext">HTML::close</span><span class="plain">(</span><span class="identifier">proto</span><span class="plain">, </span><span class="string">"p"</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">proto</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21_4"></a><b>&#167;21.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Set the kind of the result of the phrase in italic, not bold</span> <span class="cwebmacronumber">21.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*) ... (%c*?)&lt;/b&gt;"</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="string">"%S&lt;/b&gt; ... &lt;i&gt;"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">L</span><span class="string">"&lt;b&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">L</span><span class="string">"&lt;/b&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="string">"%S&lt;/i&gt;"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21_5"></a><b>&#167;21.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Specially set and specially index a phrase to decide a condition</span> <span class="cwebmacronumber">21.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;b&gt;if (%c*)"</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*a condition%c*"</span><span class="plain">))) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="string">"&lt;i&gt;if&lt;/i&gt; &lt;b&gt;%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"if "</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_ATSTART</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">index_alph</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(%c*?%) (%c*)"</span><span class="plain">)) </span><span class="identifier">index_alph</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="string">"%S=___=!if-definition"</span><span class="plain">, </span><span class="identifier">index_as</span><span class="plain">);</span>
<span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">index_alph</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21_6"></a><b>&#167;21.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Specially set and specially index a text substitution</span> <span class="cwebmacronumber">21.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;b&gt;say \</span><span class="plain">"</span><span class="string">%[(%c*)%]\</span><span class="plain">"</span><span class="string">&lt;/b&gt;"</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="string">"say \</span><span class="plain">"</span><span class="string">[&lt;b&gt;%S&lt;/b&gt;]\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"say "</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_ATSTART</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">index_alph</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">index_as</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[%(?:%(%c*?%) %)?(%c*)%]"</span><span class="plain">)) </span><span class="identifier">index_alph</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="string">"%S=___=!say-definition"</span><span class="plain">, </span><span class="identifier">index_as</span><span class="plain">);</span>
<span class="functiontext">Indexes::mark_index_term</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">anchor</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">index_alph</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">term</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP21_7"></a><b>&#167;21.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Tidy up the definition paragraph</span> <span class="cwebmacronumber">21.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;b&gt;&lt;/b&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="functiontext">Regexp::replace</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"&lt;/b&gt;&lt;b&gt;"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">REP_REPEATING</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">star</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">star</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">star</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c)(%c*)"</span><span class="plain">)) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]; </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">star</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">ch</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"("</span><span class="plain">)) { </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="string">"&lt;/b&gt;"</span><span class="plain">); </span><span class="identifier">bl</span><span class="plain">++; }</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">ch</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">ch</span><span class="plain">, </span><span class="identifier">I</span><span class="string">")"</span><span class="plain">)) { </span><span class="identifier">bl</span><span class="plain">--; </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">defn</span><span class="plain">, </span><span class="string">"&lt;b&gt;"</span><span class="plain">); }</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">star</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP21">&#167;21</a>.</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. Topping and tailing. </b>If we're preparing HTML for use in a website, we probably want our
documentation content to be just one <code class="display"><span class="extract">&lt;div&gt;</span></code> in a larger page whose
design <code class="display"><span class="extract">indoc</span></code> knows nothing about. The following therefore lets us
use an external file as the prototype, cutting it up into a head before
the text <code class="display"><span class="extract">[TEXT]</span></code> and a tail afterwards.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::read_top_and_tail_matter</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">main_flag</span><span class="plain">) {</span>
<span class="reserved">tt_helper_state</span><span class="plain"> </span><span class="identifier">tths</span><span class="plain">;</span>
<span class="identifier">tths</span><span class="element">.pretext</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">main_flag</span><span class="plain">) {</span>
<span class="identifier">DSET_main_top_matter</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">DSET_main_tail_matter</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">tths</span><span class="element">.top_text</span><span class="plain"> = </span><span class="identifier">DSET_main_top_matter</span><span class="plain">;</span>
<span class="identifier">tths</span><span class="element">.tail_text</span><span class="plain"> = </span><span class="identifier">DSET_main_tail_matter</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">DSET_section_top_matter</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">DSET_section_tail_matter</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">tths</span><span class="element">.top_text</span><span class="plain"> = </span><span class="identifier">DSET_section_top_matter</span><span class="plain">;</span>
<span class="identifier">tths</span><span class="element">.tail_text</span><span class="plain"> = </span><span class="identifier">DSET_section_tail_matter</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't read top and tail file"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext">HTMLUtilities::tt_helper</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">tths</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::read_top_and_tail_matter is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b></p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">tt_helper_state</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pretext</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">top_text</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tail_text</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">tt_helper_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::tt_helper</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">v_tths</span><span class="plain">) {</span>
<span class="reserved">tt_helper_state</span><span class="plain"> *</span><span class="identifier">tths</span><span class="plain"> = (</span><span class="reserved">tt_helper_state</span><span class="plain"> *) </span><span class="identifier">v_tths</span><span class="plain">;</span>
<span class="functiontext">Str::trim_white_space_at_end</span><span class="plain">(</span><span class="identifier">line</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)%[TEXT%](%c*)"</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;top_text</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">HTML::begin_div_with_id</span><span class="plain">(</span><span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;top_text</span><span class="plain">, </span><span class="string">"bodytext"</span><span class="plain">);</span>
<span class="functiontext">HTML::end_div</span><span class="plain">(</span><span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;tail_text</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;tail_text</span><span class="plain">, </span><span class="string">"%S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;pretext</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;pretext</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;top_text</span><span class="plain">, </span><span class="string">"%S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">tths</span><span class="plain">-</span><span class="element">&gt;tail_text</span><span class="plain">, </span><span class="string">"%S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::tt_helper is used in <a href="#SP22">&#167;22</a>.</p>
<p class="endnote">The structure tt_helper_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>And this routine caches requests for tops or tails.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTMLUtilities::get_tt_matter</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">top</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_request_for_tt</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;top_and_tail_sections</span><span class="plain">)</span>
<span class="functiontext">HTMLUtilities::read_top_and_tail_matter</span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;top_and_tail_sections</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;top_and_tail</span><span class="plain">)</span>
<span class="functiontext">HTMLUtilities::read_top_and_tail_matter</span><span class="plain">(</span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;top_and_tail</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">first_request_for_tt</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">top</span><span class="plain"> == 1) &amp;&amp; (</span><span class="functiontext">main</span><span class="plain"> == 1)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">DSET_main_top_matter</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">top</span><span class="plain"> == 1) &amp;&amp; (</span><span class="functiontext">main</span><span class="plain"> == 0)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">DSET_main_tail_matter</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">top</span><span class="plain"> == 0) &amp;&amp; (</span><span class="functiontext">main</span><span class="plain"> == 1)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">DSET_section_top_matter</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">top</span><span class="plain"> == 0) &amp;&amp; (</span><span class="functiontext">main</span><span class="plain"> == 0)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">DSET_section_tail_matter</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function HTMLUtilities::get_tt_matter is used in 2/rnd (<a href="2-rnd.html#SP16_2">&#167;16.2</a>, <a href="2-rnd.html#SP16_1_1">&#167;16.1.1</a>), 3/iu (<a href="3-iu.html#SP1">&#167;1</a>, <a href="3-iu.html#SP2">&#167;2</a>), 4/cm (<a href="4-cm.html#SP9_1">&#167;9.1</a>, <a href="4-cm.html#SP9_2">&#167;9.2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-utc.html">Back to 'Updating the Cross-References'</a></li><li><a href="2-css.html">Continue with 'CSS'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>