1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/indoc/2-ss.html
2019-04-22 15:42:10 +01:00

477 lines
73 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/cs</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/ss' 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>Structural Scan</b></li></ul><p class="purpose">Finding out how a volume divides up into chapters and sections.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Volumes</a></li><li><a href="#SP6">&#167;6. Section title scanning</a></li><li><a href="#SP7">&#167;7. The manifest file</a></li><li><a href="#SP8">&#167;8. Ebook markup</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>Projects are divided into volumes, which are divided into chapters, which
in turn are divided into sections.
</p>
<p class="inwebparagraph">Volumes count from 0, in order of creation, so these are arrays.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_VOLUMES</span><span class="plain"> 100</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_CHAPTERS_PER_VOLUME</span><span class="plain"> 100</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_SECTIONS_PER_VOLUME</span><span class="plain"> 1000</span>
<span class="definitionkeyword">define</span> <span class="constant">MAX_EXAMPLES_PER_VOLUME</span><span class="plain"> </span><span class="constant">MAX_EXAMPLES</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">volume</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">vol_title</span><span class="plain">; </span> <span class="comment">e.g., "What Katy Did Next"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_abbrev</span><span class="plain">; </span> <span class="comment">e.g., "WKDN"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_prefix</span><span class="plain">; </span> <span class="comment">e.g., "K"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">vol_rawtext_filename</span><span class="plain">; </span> <span class="comment">source file</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_CSS_leafname</span><span class="plain">; </span> <span class="comment">CSS file used for pages in this volume</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">vol_URL</span><span class="plain">; </span> <span class="comment">link to start of volume</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">vol_chapter_count</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">vol_section_count</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">chapters</span><span class="plain">[</span><span class="constant">MAX_CHAPTERS_PER_VOLUME</span><span class="plain">]; </span> <span class="comment">these count from 1</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">sections</span><span class="plain">[</span><span class="constant">MAX_SECTIONS_PER_VOLUME</span><span class="plain">]; </span> <span class="comment">but these count from 0</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">example</span><span class="plain"> *</span><span class="identifier">examples_sequence</span><span class="plain">[</span><span class="constant">MAX_EXAMPLES_PER_VOLUME</span><span class="plain">]; </span> <span class="comment">also these</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">sections_by_name</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">volume</span><span class="plain">;</span>
<span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">volumes</span><span class="plain">[</span><span class="constant">MAX_VOLUMES</span><span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure volume is accessed in 1/mn, 1/ins, 2/exm, 2/rnd, 2/rr, 2/haj, 2/css, 3/cai, 3/ei, 4/nd, 4/cm, 4/ct, 4/cr, 4/cu and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Chapters:
</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">chapter</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">chapter_title</span><span class="plain">; </span> <span class="comment">e.g., "The Pension Suisse"</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">chapter_number</span><span class="plain">; </span> <span class="comment">counting from 1</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chapter_full_title</span><span class="plain">; </span> <span class="comment">e.g., "Chapter 7: The Pension Suisse"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">begins_at_section</span><span class="plain">; </span> <span class="comment">e.g., section 51 might be the first of chapter 7</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chapter_anchor</span><span class="plain">; </span> <span class="comment">HTML anchor to place at front of chapter, if any</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chapter_URL</span><span class="plain">; </span> <span class="comment">link to start of chapter</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">next_chapter</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">previous_chapter</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_chapter</span><span class="plain"> *</span><span class="identifier">ebook_ref</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">chapter</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure chapter is accessed in 5/ee, 2/rnd, 3/ei, 4/nd, 4/cl, 4/cm, 4/ca, 4/ct, 4/cr, 4/cu and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Sections:
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_DRS_PER_SECTION</span><span class="plain"> 100</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">in_which_chapter</span><span class="plain">; </span> <span class="comment">e.g., 7</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">begins_which_chapter</span><span class="plain">; </span> <span class="comment">e.g., 7, but -1 if it doesn't open a chapter</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">unlabelled_title</span><span class="plain">; </span> <span class="comment">e.g., "Corsica"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">label</span><span class="plain">; </span> <span class="comment">e.g., "7.1"</span>
<span class="reserved">struct</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="comment">e.g, "7.1. Corsica"</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sort_code</span><span class="plain">; </span> <span class="comment">a formatted version of the label for alphabetic sorting</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">section_filename</span><span class="plain">; </span> <span class="comment">filename to write this section (and perhaps others) into</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">section_file_title</span><span class="plain">; </span> <span class="comment">title the whole file will have</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">section_anchor</span><span class="plain">; </span> <span class="comment">HTML anchor to place at front of section, if any</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">section_URL</span><span class="plain">; </span> <span class="comment">link to start of section</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">unanchored_URL</span><span class="plain">; </span> <span class="comment">link to start of file holding this</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_doc_reference_symbols</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">doc_reference_symbols</span><span class="plain">[</span><span class="constant">MAX_DRS_PER_SECTION</span><span class="plain">];</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">next_section</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">previous_section</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">number_within_volume</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">section</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure section is accessed in 2/exm, 2/rnd, 2/utsr, 3/cai, 3/ei, 4/nd, 4/cl, 4/cm, 4/ca, 4/ct, 4/cr, 4/cu and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Volumes. </b>These are created when we scan the instructions file.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::create_volume</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">book_path</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leaf</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">abbrev_supplied</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">, </span><span class="identifier">abbrev_supplied</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Work out title and abbreviation if these aren't supplied</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="character">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_volumes</span><span class="plain"> &gt; 0) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">, </span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Ensure that no two volumes have the same abbreviation or the same prefix</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_volumes</span><span class="plain"> &gt;= </span><span class="constant">MAX_VOLUMES</span><span class="plain">) </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"too many volumes"</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">CREATE</span><span class="plain">(</span><span class="reserved">volume</span><span class="plain">);</span>
<span class="identifier">volumes</span><span class="plain">[</span><span class="identifier">no_volumes</span><span class="plain">++] = </span><span class="identifier">V</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_prefix</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">pre</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">Str::duplicate</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_rawtext_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">book_path</span><span class="plain">, </span><span class="identifier">leaf</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="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_URL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_chapter_count</span><span class="plain"> = 0;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_section_count</span><span class="plain"> = 0;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;sections_by_name</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="identifier">PRINT</span><span class="plain">(</span><span class="string">"Volume %d: %S %S %S %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">no_volumes</span><span class="plain">-1, </span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">abbrev</span><span class="plain">, </span><span class="identifier">pre</span><span class="plain">,</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_rawtext_filename</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Scanner::create_volume is used in 1/ins (<a href="1-ins.html#SP5_1_2">&#167;5.1.2</a>).</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Work out title and abbreviation if these aren't supplied</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">) == 0) </span><span class="identifier">title</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"Untitled"</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">abbrev</span><span class="plain">) == 0) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">f</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"A "</span><span class="plain">)) </span><span class="identifier">f</span><span class="plain"> = 2;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"An "</span><span class="plain">)) </span><span class="identifier">f</span><span class="plain"> = 3;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::begins_with_wide_string</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"The "</span><span class="plain">)) </span><span class="identifier">f</span><span class="plain"> = 4;</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">=</span><span class="identifier">f</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">title</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">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Characters::is_whitespace</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">)) </span><span class="reserved">continue</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="character">'a'</span><span class="plain">) &amp;&amp; (</span><span class="identifier">c</span><span class="plain"> &lt;= </span><span class="character">'z'</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Ensure that no two volumes have the same abbreviation or the same prefix</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<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">no_volumes</span><span class="plain">; </span><span class="identifier">i</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">abbrev</span><span class="plain">, </span><span class="identifier">volumes</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;vol_abbrev</span><span class="plain">)) || (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">) == 0))</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">abbrev</span><span class="plain">, </span><span class="string">"_%d"</span><span class="plain">, </span><span class="identifier">i</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">pre</span><span class="plain">, </span><span class="identifier">volumes</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;vol_prefix</span><span class="plain">)) || (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">) == 0))</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">pre</span><span class="plain">, </span><span class="string">"_%d"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Section title scanning. </b>This is a much skimpier first-pass-only scan which looks for section titles,
marrying them up with block numbers.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::scan_rawtext_for_section_titles</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">filename</span><span class="plain"> *</span><span class="identifier">rawtext_filename</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_rawtext_filename</span><span class="plain">;</span>
<span class="reserved">sr_helper_state</span><span class="plain"> </span><span class="identifier">sr</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="element">.s</span><span class="plain"> = 0;</span>
<span class="identifier">sr</span><span class="element">.ch</span><span class="plain"> = 0;</span>
<span class="identifier">sr</span><span class="element">.chs</span><span class="plain"> = 0;</span>
<span class="identifier">sr</span><span class="element">.v</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;allocation_id</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="element">.owner</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">;</span>
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">rawtext_filename</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open instructions file"</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext">Scanner::scan_rawtext_helper</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &amp;</span><span class="identifier">sr</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_section_count</span><span class="plain"> = </span><span class="identifier">sr</span><span class="element">.s</span><span class="plain">;</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">sr</span><span class="element">.ch</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_URL</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sr</span><span class="element">.s</span><span class="plain"> &gt; 0) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;vol_URL</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;sections</span><span class="plain">[0]-</span><span class="element">&gt;unanchored_URL</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_section_count</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&gt;0) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;previous_section</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">-1];</span>
<span class="reserved">if</span><span class="plain"> (</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_section_count</span><span class="plain">-1) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;next_section</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1];</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="identifier">V</span><span class="plain">-</span><span class="element">&gt;chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;chapter_number</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">+1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&gt;0) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;previous_chapter</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">-1];</span>
<span class="reserved">if</span><span class="plain"> (</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">-1) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;next_chapter</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1];</span>
<span class="plain">}</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">sr_helper_state</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">v</span><span class="plain">; </span> <span class="comment">volume number</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">s</span><span class="plain">; </span> <span class="comment">section number within the volume, starting from 0</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ch</span><span class="plain">; </span> <span class="comment">chapter number within the volume, starting from 1</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">chs</span><span class="plain">; </span> <span class="comment">section number within current chapter, starting from 1</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">volume</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">sr_helper_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::scan_rawtext_helper</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">nl</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_sr</span><span class="plain">) {</span>
<span class="reserved">sr_helper_state</span><span class="plain"> *</span><span class="identifier">sr</span><span class="plain"> = (</span><span class="reserved">sr_helper_state</span><span class="plain"> *) </span><span class="identifier">v_sr</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">nl</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) "</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">nl</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</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">nl</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[(%c*?)%] (%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">CREATE</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="element">&gt;next_section</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;previous_section</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;begins_which_chapter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;no_doc_reference_symbols</span><span class="plain"> = 0;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;number_within_volume</span><span class="plain"> = </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;s</span><span class="plain">++;</span>
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;sections</span><span class="plain">[</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;number_within_volume</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">chi</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0];</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stitle</span><span class="plain"> = </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1];</span>
&lt;<span class="cwebmacro">Strip away heading tags, but act on those filtering out the section</span> <span class="cwebmacronumber">6.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Deal with this as a chapter heading</span> <span class="cwebmacronumber">6.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Deal with this as a section heading</span> <span class="cwebmacronumber">6.3</span>&gt;<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 Scanner::scan_rawtext_for_section_titles is used in 1/mn (<a href="1-mn.html#SP1_2">&#167;1.2</a>).</p>
<p class="endnote">The function Scanner::scan_rawtext_helper appears nowhere else.</p>
<p class="endnote">The structure sr_helper_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Strip away heading tags, but act on those filtering out the section</span> <span class="cwebmacronumber">6.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr2</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">chi</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"{(%c*?:}(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">chi</span><span class="plain">, </span><span class="identifier">mr2</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Symbols::perform_ifdef</span><span class="plain">(</span><span class="identifier">mr2</span><span class="element">.exp</span><span class="plain">[0]) == </span><span class="constant">FALSE</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="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*) {%c*?} *"</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">mr2</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?) "</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">stitle</span><span class="plain">, </span><span class="identifier">mr2</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with this as a chapter heading</span> <span class="cwebmacronumber">6.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr2</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">mr2</span><span class="plain">, </span><span class="identifier">chi</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Chapter: (%c*)"</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="identifier">CREATE</span><span class="plain">(</span><span class="reserved">chapter</span><span class="plain">);</span>
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;chapters</span><span class="plain">[</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">++] = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;chs</span><span class="plain"> = 0;</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr2</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_full_title</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_full_title</span><span class="plain">, </span><span class="string">"Chapter %d: %S"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_title</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;begins_which_chapter</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;begins_at_section</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;next_chapter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;previous_chapter</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;ebook_ref</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Deal with this as a section heading</span> <span class="cwebmacronumber">6.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = (</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain"> &gt; 0)?</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;chapters</span><span class="plain">[</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">-1]: </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;in_which_chapter</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;chs</span><span class="plain">++;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;label</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;label</span><span class="plain">, </span><span class="string">"%d.%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;sort_code</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;sort_code</span><span class="plain">, </span><span class="string">"%03d-%03d-%03d-000"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="string">"%S. %S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;label</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;unlabelled_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="functiontext">Dictionaries::create</span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="functiontext">Dictionaries::write_value</span><span class="plain">(</span>
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">)</span>
<span class="functiontext">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="functiontext">Characters::toupper</span><span class="plain">(</span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)));</span>
<span class="functiontext">Dictionaries::create</span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">);</span>
<span class="functiontext">Dictionaries::write_value</span><span class="plain">(</span>
<span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;sections_by_name</span><span class="plain">, </span><span class="identifier">stitle</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">S</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Work out section URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;begins_which_chapter</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Work out chapter URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_1"></a><b>&#167;6.3.1. </b>This is relevant only to HTML, of course. The idea is that each section
has some linkable location, in the form of either a file URL, or a file plus
an anchor name: for example, it might be <code class="display"><span class="extract">WKDN_7.html#s4</span></code>. If the
anchor is blank, the filename alone is used.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out section URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">extension</span><span class="plain"> = </span><span class="string">"txt"</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">extension</span><span class="plain"> = </span><span class="string">"html"</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</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;granularity</span><span class="plain"> == </span><span class="constant">SECTION_GRANULARITY</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">)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%Sdoc%d.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;vol_prefix</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;s</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S_%d_%d.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;vol_abbrev</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;chs</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_anchor</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_file_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;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="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;granularity</span><span class="plain"> == </span><span class="constant">CHAPTER_GRANULARITY</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S_%d.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;vol_abbrev</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_anchor</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_anchor</span><span class="plain">, </span><span class="string">"s%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_file_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_full_title</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">leaf</span><span class="plain">, </span><span class="string">"%S.%s"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;vol_abbrev</span><span class="plain">, </span><span class="identifier">extension</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_anchor</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_anchor</span><span class="plain">, </span><span class="string">"c%d_s%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;chs</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_file_title</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain">-</span><span class="element">&gt;vol_title</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_filename</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;destination</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_URL</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;unanchored_URL</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</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">S</span><span class="plain">-</span><span class="element">&gt;section_anchor</span><span class="plain">) &gt; 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_URL</span><span class="plain">, </span><span class="string">"#%S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_anchor</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP6_3_2"></a><b>&#167;6.3.2. </b>And similarly for chapters.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out chapter URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_anchor</span><span class="plain"> = </span><span class="functiontext">Str::new</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;granularity</span><span class="plain"> == </span><span class="constant">SECTION_GRANULARITY</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">indoc_settings</span><span class="plain">-</span><span class="element">&gt;granularity</span><span class="plain"> == </span><span class="constant">CHAPTER_GRANULARITY</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain"> == 1) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_anchor</span><span class="plain">, </span><span class="string">"chapter_%d_%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</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">C</span><span class="plain">-</span><span class="element">&gt;chapter_anchor</span><span class="plain">, </span><span class="string">"chapter_%d_%d"</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">&gt;ch</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_URL</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;unanchored_URL</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">C</span><span class="plain">-</span><span class="element">&gt;chapter_anchor</span><span class="plain">) &gt; 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_URL</span><span class="plain">, </span><span class="string">"#%S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;chapter_anchor</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP6_3">&#167;6.3</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. The manifest file. </b>Its destiny is to hold a simple machine-readable contents listing, and it
helps the Inform application in searching the online documentation.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::write_manifest_file</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">filename</span><span class="plain"> *</span><span class="identifier">M</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;destination</span><span class="plain">, </span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">&gt;manifest_leafname</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">M_struct</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;</span><span class="identifier">M_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Streams::open_to_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">, </span><span class="constant">UTF8_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="functiontext">Errors::fatal_with_file</span><span class="plain">(</span><span class="string">"can't write manifest file"</span><span class="plain">, </span><span class="identifier">M</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_section_count</span><span class="plain">; </span><span class="identifier">i</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">V</span><span class="plain">-</span><span class="element">&gt;sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"doc%d.html: %S %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;label</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Streams::close</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 Scanner::write_manifest_file is used in 1/mn (<a href="1-mn.html#SP1_4">&#167;1.4</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Ebook markup. </b>This places internal markup within files in the EPUB version.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Scanner::mark_up_ebook</span><span class="plain">(</span><span class="reserved">void</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</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="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;in_which_chapter</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">) </span><span class="functiontext">Epub::set_mark_in_chapter</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;ebook_ref</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;section_URL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Scanner::mark_up_ebook is used in 1/mn (<a href="1-mn.html#SP1">&#167;1</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 2: Processing.)</i></li><li><a href="2-exm.html">Continue with 'Examples'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>