inweb-bootstrap/docs/inweb/3-ts.html
2020-04-07 00:53:26 +01:00

284 lines
43 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/ta</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<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>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../inweb/index.html">inweb</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../foundation-module/index.html">foundation-module</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '3/ts' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#3">Chapter 3: Outputs</a></li><li><b>The Swarm</b></li></ul><p class="purpose">To feed multiple output requests to the weaver, and to present weaver results, and update indexes or contents pages.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Swarming</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Swarming. </b>A "weave" occurs when Inweb takes a portion of the web &mdash; one section, one
chapter, or the whole thing &mdash; and writes it out in a human-readable form (or
in some intermediate state which can be made into one, like a TeX file).
There can be many weaves in a single run of Inweb, in which case we call the
resulting flurry a "swarm", like the glittering cloud of locusts in the title
of Chapter 25 of "On the Banks of Plum Creek".
</p>
<p class="inwebparagraph">This routine is called with mode <code class="display"><span class="extract">SWARM_SECTIONS_SWM</span></code>, <code class="display"><span class="extract">SWARM_CHAPTERS_SWM</span></code> or
<code class="display"><span class="extract">SWARM_INDEX_SWM</span></code>, so in a non-swarming run it isn't called at all.
</p>
<pre class="display">
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">swarm_leader</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">the most inclusive one we weave</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Swarm::weave</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">range</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">swarm_mode</span><span class="plain">, </span><span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">,</span>
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">into</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">docs_mode</span><span class="plain">,</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">breadcrumbs</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">navigation</span><span class="plain">) {</span>
<span class="identifier">swarm_leader</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</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="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">chapter</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">imported</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">swarm_mode</span><span class="plain"> == </span><span class="constant">SWARM_CHAPTERS_SWM</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">chaptered</span><span class="plain"> == </span><span class="constant">TRUE</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Reader::range_within</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_range</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">))) {</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">ch_weave</span><span class="plain"> = </span><span class="functiontext">Swarm::weave_subset</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">,</span>
<span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_range</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">tag</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">, </span><span class="identifier">into</span><span class="plain">, </span><span class="identifier">docs_mode</span><span class="plain">,</span>
<span class="identifier">breadcrumbs</span><span class="plain">, </span><span class="identifier">navigation</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">range</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">swarm_leader</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">ch_weave</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">swarm_mode</span><span class="plain"> == </span><span class="constant">SWARM_SECTIONS_SWM</span><span class="plain">)</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Reader::range_within</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">))</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_weave</span><span class="plain"> = </span><span class="functiontext">Swarm::weave_subset</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">,</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">tag</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">, </span><span class="identifier">into</span><span class="plain">, </span><span class="identifier">docs_mode</span><span class="plain">,</span>
<span class="identifier">breadcrumbs</span><span class="plain">, </span><span class="identifier">navigation</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Swarm::weave_index_templates</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">, (</span><span class="identifier">to</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">, </span><span class="identifier">into</span><span class="plain">, </span><span class="identifier">navigation</span><span class="plain">,</span>
<span class="identifier">breadcrumbs</span><span class="plain">, </span><span class="identifier">docs_mode</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Swarm::weave is used in 1/pc (<a href="1-pc.html#SP7_4_3">&#167;7.4.3</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The following is where an individual weave task begins, whether it comes
from the swarm, or has been specified at the command line (in which case
the call comes from Program Control).
</p>
<pre class="display">
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="functiontext">Swarm::weave_subset</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">range</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">open_afterwards</span><span class="plain">,</span>
<span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">into</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">docs_mode</span><span class="plain">,</span>
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">breadcrumbs</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">navigation</span><span class="plain">) {</span>
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wt</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">no_inweb_errors</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="functiontext">Analyser::analyse_code</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Compile a set of instructions for the weaver</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Weaver::weave_source</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) </span><span class="comment">i.e., the number of lines woven was zero</span>
<span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"empty weave request"</span><span class="plain">);</span>
<span class="functiontext">Formats::post_process_weave</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">, </span><span class="identifier">open_afterwards</span><span class="plain">); </span><span class="comment">e.g., run through TeX</span>
&lt;<span class="cwebmacro">Report on the outcome of the weave to the console</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wt</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Swarm::weave_subset is used in <a href="#SP1">&#167;1</a>, 1/pc (<a href="1-pc.html#SP7_4_3">&#167;7.4.3</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b>Each individual weave generates one of the following sets of instructions:
</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">weave_target</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">weave_web</span><span class="plain">; </span><span class="comment">which web we weave</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">weave_range</span><span class="plain">; </span><span class="comment">which parts of the web in this weave</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">theme_match</span><span class="plain">; </span><span class="comment">pick out only paragraphs with this theme</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">booklet_title</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">; </span><span class="comment">which pattern is to be followed</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">weave_to</span><span class="plain">; </span><span class="comment">where to put it</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">format</span><span class="plain">; </span><span class="comment">plain text, say, or HTML</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cover_sheet_to_use</span><span class="plain">; </span><span class="comment">leafname of the copy, or <code class="display"><span class="extract">NULL</span></code> for no cover</span>
<span class="reserved">void</span><span class="plain"> *</span><span class="identifier">post_processing_results</span><span class="plain">; </span><span class="comment">optional typesetting diagnostics after running through</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">self_contained</span><span class="plain">; </span><span class="comment">make a self-contained file if possible</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">docs_mode</span><span class="plain">; </span><span class="comment">make as part of a <code class="display"><span class="extract">-weave-docs</span></code> run</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">breadcrumbs</span><span class="plain">; </span><span class="comment">non-standard breadcrumb trail, if any</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">navigation</span><span class="plain">; </span><span class="comment">navigation links, or <code class="display"><span class="extract">NULL</span></code> if not supplied</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">weave_target</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure weave_target is accessed in 3/ti, 3/tw, 4/is, 5/wf, 5/tf, 5/hf, 5/rtt and here.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compile a set of instructions for the weaver</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">wt</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">weave_target</span><span class="plain">);</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">weave_range</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">range</span><span class="plain">);</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">pattern</span><span class="plain"> = </span><span class="identifier">pattern</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain"> = </span><span class="identifier">tag</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain"> = </span><span class="identifier">pattern</span><span class="plain">-&gt;</span><span class="element">pattern_format</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">post_processing_results</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">cover_sheet_to_use</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">self_contained</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">docs_mode</span><span class="plain"> = </span><span class="identifier">docs_mode</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">navigation</span><span class="plain"> = </span><span class="identifier">navigation</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">breadcrumbs</span><span class="plain"> = </span><span class="identifier">breadcrumbs</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Reader::web_has_one_section</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">self_contained</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">cover_sheet_to_use</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cover-sheet"</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Translate the subweb range into details of what to weave</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">H</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">redirect_weaves_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">H</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">H</span><span class="plain"> = </span><span class="identifier">into</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">H</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">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">single_file</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">H</span><span class="plain"> = </span><span class="functiontext">Reader::woven_folder</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">H</span><span class="plain"> = </span><span class="functiontext">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">single_file</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">to</span><span class="plain">) {</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">weave_to</span><span class="plain"> = </span><span class="identifier">to</span><span class="plain">;</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">self_contained</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="identifier">weave_to</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">H</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b>From the range and the theme, we work out the weave title, the leafname,
and details of any cover-sheet to use.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Translate the subweb range into details of what to weave</span> <span class="cwebmacronumber">2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<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">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"0"</span><span class="plain">)) {</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain"> = </span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Complete Program"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">single_file</span><span class="plain">) {</span>
<span class="functiontext">Filenames::write_unextended_leafname</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">single_file</span><span class="plain">);</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">leafname</span><span class="plain">, </span><span class="string">"Complete"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">) </span>&lt;<span class="cwebmacro">Change the titling and leafname to match the tagged theme</span> <span class="cwebmacronumber">2.2.1.1</span>&gt;<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="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%d+"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">, </span><span class="string">"Chapter %S"</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</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="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[A-O]"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">, </span><span class="string">"Appendix %S"</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</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="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"P"</span><span class="plain">)) {</span>
<span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain"> = </span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Preliminaries"</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">cover_sheet_to_use</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</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="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'/'</span><span class="plain">) || (</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">' '</span><span class="plain">))</span>
<span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'-'</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="functiontext">Formats::file_extension</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">format</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_1_1"></a><b>&#167;2.2.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Change the titling and leafname to match the tagged theme</span> <span class="cwebmacronumber">2.2.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">, </span><span class="string">"Extracts: %S"</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">-&gt;</span><span class="element">tag_name</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">-&gt;</span><span class="element">tag_name</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2_1">&#167;2.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b>Each weave results in a compressed one-line printed report:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Report on the outcome of the weave to the console</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"[%S: %S -&gt; %f"</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">-&gt;</span><span class="element">format_name</span><span class="plain">, </span><span class="identifier">wt</span><span class="plain">-&gt;</span><span class="element">weave_to</span><span class="plain">);</span>
<span class="functiontext">Formats::report_on_post_processing</span><span class="plain">(</span><span class="identifier">wt</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"]\n"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>After every swarm, we rebuild the index. We first try for a template called
<code class="display"><span class="extract">chaptered-index.html</span></code> or <code class="display"><span class="extract">unchaptered-index.html</span></code>, then fall back on a
generic <code class="display"><span class="extract">index.html</span></code> if those aren't available in the current pattern.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Swarm::weave_index_templates</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">range</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">self_contained</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">into</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">linked_list</span><span class="plain"> *</span><span class="identifier">crumbs</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">docs</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Version Number"</span><span class="plain">)))</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Version Number"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">index_leaf</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">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">chaptered</span><span class="plain">) </span><span class="identifier">index_leaf</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"chaptered-index.html"</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">index_leaf</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"unchaptered-index.html"</span><span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">Patterns::obtain_filename</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">, </span><span class="identifier">index_leaf</span><span class="plain">);</span>
<span class="reserved">if</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">OUT</span><span class="plain"> = </span><span class="functiontext">Patterns::obtain_filename</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"index.html"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">OUT</span><span class="plain">) </span><span class="functiontext">Indexer::run</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">range</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"index.html"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">, </span><span class="identifier">into</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">crumbs</span><span class="plain">, </span><span class="identifier">docs</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">self_contained</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Patterns::copy_payloads_into_weave</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Swarm::weave_index_templates is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-ta.html">Back to 'The Analyser'</a></li><li><a href="3-ti.html">Continue with 'The Indexer'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>