mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 10:04:21 +03:00
477 lines
73 KiB
HTML
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">★</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">§1. Definitions</a></li><li><a href="#SP5">§5. Volumes</a></li><li><a href="#SP6">§6. Section title scanning</a></li><li><a href="#SP7">§7. The manifest file</a></li><li><a href="#SP8">§8. Ebook markup</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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>§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>§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>§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>
|
|
|
|
<<span class="cwebmacro">Work out title and abbreviation if these aren't supplied</span> <span class="cwebmacronumber">5.1</span>><span class="character">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_volumes</span><span class="plain"> > 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>
|
|
|
|
<<span class="cwebmacro">Ensure that no two volumes have the same abbreviation or the same prefix</span> <span class="cwebmacronumber">5.2</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_volumes</span><span class="plain"> >= </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">>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">>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">>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">>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">>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">>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">>vol_chapter_count</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">V</span><span class="plain">-</span><span class="element">>vol_section_count</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>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">§5.1.2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Work out title and abbreviation if these aren't supplied</span> <span class="cwebmacronumber">5.1</span>> =
|
|
</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"><</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"> >= </span><span class="character">'a'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> <= </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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5_2"></a><b>§5.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Ensure that no two volumes have the same abbreviation or the same prefix</span> <span class="cwebmacronumber">5.2</span>> =
|
|
</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"> < </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">>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">>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">§5</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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">>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">>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">, &</span><span class="identifier">sr</span><span class="plain">);</span>
|
|
<span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>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">>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"> > 0) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">>vol_URL</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>sections</span><span class="plain">[0]-</span><span class="element">>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"><</span><span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>0) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">>previous_section</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>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"><</span><span class="identifier">V</span><span class="plain">-</span><span class="element">>vol_section_count</span><span class="plain">-1) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>sections</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">>next_section</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>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"><</span><span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">>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">>0) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">>previous_chapter</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>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"><</span><span class="identifier">V</span><span class="plain">-</span><span class="element">>vol_chapter_count</span><span class="plain">-1) </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>chapters</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">>next_chapter</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">>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">(&</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">(&</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">>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">>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">>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">>no_doc_reference_symbols</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>number_within_volume</span><span class="plain"> = </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>s</span><span class="plain">++;</span>
|
|
<span class="identifier">sr</span><span class="plain">-</span><span class="element">>owner</span><span class="plain">-</span><span class="element">>sections</span><span class="plain">[</span><span class="identifier">S</span><span class="plain">-</span><span class="element">>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>
|
|
<<span class="cwebmacro">Strip away heading tags, but act on those filtering out the section</span> <span class="cwebmacronumber">6.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Deal with this as a chapter heading</span> <span class="cwebmacronumber">6.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Deal with this as a section heading</span> <span class="cwebmacronumber">6.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</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">§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>§6.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Strip away heading tags, but act on those filtering out the section</span> <span class="cwebmacronumber">6.1</span>> =
|
|
</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">(&</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">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</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">(&</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">(&</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">(&</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">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_2"></a><b>§6.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Deal with this as a chapter heading</span> <span class="cwebmacronumber">6.2</span>> =
|
|
</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">(&</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">>owner</span><span class="plain">-</span><span class="element">>chapters</span><span class="plain">[</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>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">>chs</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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">>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">>ch</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>chapter_title</span><span class="plain">);</span>
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">(&</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">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_3"></a><b>§6.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Deal with this as a section heading</span> <span class="cwebmacronumber">6.3</span>> =
|
|
</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">>ch</span><span class="plain"> > 0)?</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>owner</span><span class="plain">-</span><span class="element">>chapters</span><span class="plain">[</span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>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">>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">>chs</span><span class="plain">++;</span>
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>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">>ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>chs</span><span class="plain">);</span>
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>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">>v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>chs</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>owner</span><span class="plain">-</span><span class="element">>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">>owner</span><span class="plain">-</span><span class="element">>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">>owner</span><span class="plain">-</span><span class="element">>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">>owner</span><span class="plain">-</span><span class="element">>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="cwebmacro">Work out section URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.1</span>><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">>begins_which_chapter</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Work out chapter URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.2</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6">§6</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_3_1"></a><b>§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">
|
|
<<span class="cwebmacrodefn">Work out section URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.1</span>> =
|
|
</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">>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">>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">>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">>owner</span><span class="plain">-</span><span class="element">>vol_prefix</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>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">>owner</span><span class="plain">-</span><span class="element">>vol_abbrev</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>owner</span><span class="plain">-</span><span class="element">>vol_abbrev</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>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">>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">>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">>chs</span><span class="plain">);</span>
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>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">>owner</span><span class="plain">-</span><span class="element">>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">>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">>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">>ch</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>chs</span><span class="plain">);</span>
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>owner</span><span class="plain">-</span><span class="element">>vol_title</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>section_anchor</span><span class="plain">) > 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">>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">>section_anchor</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6_3">§6.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6_3_2"></a><b>§6.3.2. </b>And similarly for chapters.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Work out chapter URLs and anchors, depending on granularity</span> <span class="cwebmacronumber">6.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>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">>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">>v</span><span class="plain">, </span><span class="identifier">sr</span><span class="plain">-</span><span class="element">>ch</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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">>chapter_anchor</span><span class="plain">) > 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>chapter_anchor</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP6_3">§6.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§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">>destination</span><span class="plain">, </span><span class="identifier">indoc_settings</span><span class="plain">-</span><span class="element">>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"> = &</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"><</span><span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>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">>label</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>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">§1.4</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§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">>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">>ebook_ref</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">>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">§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>
|
|
|