1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/core-module/22-pi.html

377 lines
41 KiB
HTML
Raw Normal View History

2019-03-17 14:40:57 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>22/tp2</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2019-03-17 14:40:57 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2019-03-17 14:40:57 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
2019-03-17 14:40:57 +02:00
<!--Weave of '22/pi' generated by 7-->
2020-03-22 12:50:19 +02:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#22">Chapter 22: Phrases</a></li><li><b>Phrasebook Index</b></li></ul><p class="purpose">To compile most of the HTML page for the Phrasebook index.</p>
2019-03-17 14:40:57 +02:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>The Phrasebook is produced in two passes. On pass 1, we show just the
divisions and subdivisions, making a contents page for the Phrasebook; on pass
2, we include the actual phrases, making the body text for the Phrasebook.
</p>
<p class="inwebparagraph">The divisions (which look like headings on the Index, but we don't call them
that to avoid confusion with source text headings) correspond to the
extensions in which phrases are defined. If N extensions were included
then there are divisions 0, 1, ..., N, where 0, ..., N-1 correspond
to the extensions in inclusion order, with the Standard Rules being division 0.
Division N represents the source text itself.
</p>
<p class="inwebparagraph">The subdivisions (in effect subheadings on the Index) correspond to headings,
within the divisions, under which phrases are defined. Note that some headings
suppress indexing of their definitions.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::Index::index_page_Phrasebook</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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">pass</span><span class="plain">=1; </span><span class="identifier">pass</span><span class="plain">&lt;=2; </span><span class="identifier">pass</span><span class="plain">++) {</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">last_extension_named</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">division</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="identifier">inform_extension</span><span class="plain">); </span><span class="identifier">division</span><span class="plain"> &lt;= </span><span class="identifier">N</span><span class="plain">; </span><span class="identifier">division</span><span class="plain">++) {</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">heading</span><span class="plain"> *</span><span class="identifier">last_heading_named</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_subdivision_yet</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">CLW</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph</span><span class="plain">, *</span><span class="identifier">run_begin</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">, </span><span class="reserved">phrase</span><span class="plain">) {</span>
<span class="comment">include only if this is a To... phrase</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Phrases::Usage::get_effect</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-&gt;</span><span class="element">usage_data</span><span class="plain">)) != </span><span class="constant">TO_PHRASE_EFF</span><span class="plain">)</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">continue</span><span class="plain">;</span>
<span class="comment">and only if it is under an indexed heading</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">heading</span><span class="plain"> *</span><span class="identifier">this_heading</span><span class="plain"> =</span>
<span class="identifier">Headings::of_wording</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="functiontext">Phrases::declaration_node</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">)));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Headings::indexed</span><span class="plain">(</span><span class="identifier">this_heading</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="comment">and only if that heading lies in the piece of source for this division</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">inform_extension</span><span class="plain"> *</span><span class="identifier">this_extension</span><span class="plain"> =</span>
2020-03-11 02:21:09 +02:00
<span class="identifier">Headings::get_extension_containing</span><span class="plain">(</span><span class="identifier">this_heading</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">division</span><span class="plain"> == </span><span class="identifier">N</span><span class="plain">) { </span><span class="comment">skip phrase unless it's in the source text</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_extension</span><span class="plain"> != </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> { </span><span class="comment">skip phrase unless it's defined in the extension for this division</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">this_extension</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">this_extension</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain"> != </span><span class="identifier">division</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_extension_named</span><span class="plain"> != </span><span class="identifier">this_extension</span><span class="plain">) </span>&lt;<span class="cwebmacro">Mark a division in the Phrasebook</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_heading</span><span class="plain"> != </span><span class="identifier">last_heading_named</span><span class="plain">) </span>&lt;<span class="cwebmacro">Mark a subdivision in the Phrasebook</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
<span class="identifier">last_heading_named</span><span class="plain"> = </span><span class="identifier">this_heading</span><span class="plain">;</span>
<span class="identifier">last_extension_named</span><span class="plain"> = </span><span class="identifier">this_extension</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span>&lt;<span class="cwebmacro">Actually index the phrase</span> <span class="cwebmacronumber">1.3</span>&gt;<span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Index::index_page_Phrasebook appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>We call the null extension the source text; we don't call the Standard
Rules anything, as that goes without saying; and otherwise we produce
the extension's name as a major subheading in our index.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Mark a division in the Phrasebook</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">this_extension</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"in1\""</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;Defined in the source&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<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">Extensions::is_standard</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"in1\""</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;From the extension "</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">Extensions::write_name_to_file</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" by "</span><span class="plain">);</span>
2020-02-27 03:43:11 +02:00
<span class="identifier">Extensions::write_author_to_file</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">no_subdivision_yet</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_2"></a><b>&#167;1.2. </b>In pass 1, subdivisions are shown in a comma-separated list; in pass 2,
each has a paragraph of its own.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Mark a subdivision in the Phrasebook</span> <span class="cwebmacronumber">1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-03-11 02:21:09 +02:00
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">HW</span><span class="plain"> = </span><span class="identifier">Headings::get_text</span><span class="plain">(</span><span class="identifier">this_heading</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">HW</span><span class="plain">)) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span>&lt;<span class="cwebmacro">Strip away bracketed matter in the heading name</span> <span class="cwebmacronumber">1.2.1</span>&gt;<span class="plain">;</span>
2020-02-27 03:43:11 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Extensions::is_standard</span><span class="plain">(</span><span class="identifier">this_extension</span><span class="plain">))</span>
2019-03-17 14:40:57 +02:00
&lt;<span class="cwebmacro">Mark a faked division due to inter-hyphen clue in SR heading</span> <span class="cwebmacronumber">1.2.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">no_subdivision_yet</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Index::anchor_numbered</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ph</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"in2\""</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">HW</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">HW</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Miscellaneous"</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">Index::below_link_numbered</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ph</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;/b&gt;"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">no_subdivision_yet</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_2_1"></a><b>&#167;1.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Strip away bracketed matter in the heading name</span> <span class="cwebmacronumber">1.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">parenthesis</span><span class="plain">&gt;(</span><span class="identifier">HW</span><span class="plain">)) </span><span class="identifier">HW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">parenthesis</span><span class="plain">&gt;, </span><span class="constant">1</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_2">&#167;1.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_2_2"></a><b>&#167;1.2.2. </b>The Standard Rules contain such a profusion of phrase definitions that,
without making use of subheadings, the Phrasebook Index would be a shapeless
list in which it was impossible to find things.
</p>
<p class="inwebparagraph">So the indexer in fact looks at headings in the source text and attempts
to group definitions by them. In particular, in the Standard Rules, it looks
for headings with this form:
</p>
<blockquote>
<p>Blah blah blah - Major title - Minor title</p>
</blockquote>
<p class="inwebparagraph">For example, we might have
</p>
<blockquote>
<p>Section SR5/3/2 - Control phrases - While</p>
</blockquote>
<p class="inwebparagraph">which would match the first production below. The first piece is discarded,
and the second and third pieces used as headings and subheadings respectively.
</p>
<pre class="display">
2020-03-11 02:21:09 +02:00
<span class="plain">&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">with</span><span class="plain">-</span><span class="identifier">parenthesis</span><span class="plain">&gt; ::=</span>
<span class="plain">{&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;} ( &lt;</span><span class="identifier">definite</span><span class="plain">-</span><span class="identifier">article</span><span class="plain">&gt; ... ) |</span>
<span class="plain">{&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;} ( ... ) |</span>
<span class="plain">{&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;}</span>
2019-03-17 14:40:57 +02:00
2020-03-11 02:21:09 +02:00
<span class="plain">&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt; ::=</span>
2020-04-07 03:06:09 +03:00
<span class="plain">... - ... - ... | ==&gt; </span><span class="constant">3</span>
<span class="plain">... - ... | ==&gt; </span><span class="constant">2</span>
<span class="plain">... ==&gt; </span><span class="constant">1</span>
2019-03-17 14:40:57 +02:00
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP1_2_3"></a><b>&#167;1.2.3. </b>We then extract "Control phrases" as the "clue".
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Mark a faked division due to inter-hyphen clue in SR heading</span> <span class="cwebmacronumber">1.2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-03-11 02:21:09 +02:00
<span class="plain">&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;(</span><span class="identifier">HW</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </span><span class="constant">3</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;, </span><span class="constant">2</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">CLW</span><span class="plain">)) || (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">CLW</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">CLW</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pass</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"in1\""</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;%+W&lt;/b&gt;"</span><span class="plain">, </span><span class="identifier">CLW</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">no_subdivision_yet</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">HW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;, </span><span class="constant">3</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">HW</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;, </span><span class="constant">1</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_2">&#167;1.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_3"></a><b>&#167;1.3. </b>We see where <code class="display"><span class="extract">ph</span></code> is in a run of phrases which share a common documentation
symbol; only the first in the run has a plus-sign link to reveal the box of
documentation in question, and only the last in the run is followed by the
code for the box.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Actually index the phrase</span> <span class="cwebmacronumber">1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">ph2</span><span class="plain"> = </span><span class="identifier">ph</span><span class="plain">, *</span><span class="identifier">run_end</span><span class="plain"> = </span><span class="identifier">ph</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Phrases::Index::ph_same_doc</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">, </span><span class="identifier">run_begin</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">run_begin</span><span class="plain"> = </span><span class="identifier">ph</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">ph2</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Phrases::Index::ph_same_doc</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">, </span><span class="identifier">ph2</span><span class="plain">))) {</span>
<span class="identifier">run_end</span><span class="plain"> = </span><span class="identifier">ph2</span><span class="plain">; </span><span class="identifier">ph2</span><span class="plain"> = </span><span class="identifier">NEXT_OBJECT</span><span class="plain">(</span><span class="identifier">ph2</span><span class="plain">, </span><span class="reserved">phrase</span><span class="plain">);</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">, </span><span class="string">"class=\"tightin2\""</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">run_begin</span><span class="plain"> == </span><span class="identifier">ph</span><span class="plain">) </span><span class="identifier">Index::extra_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">run_end</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">Index::noextra_link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="functiontext">Phrases::TypeData::Textual::write_index_representation</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, &amp;(</span><span class="identifier">ph</span><span class="plain">-&gt;</span><span class="element">type_data</span><span class="plain">), </span><span class="identifier">ph</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Phrases::TypeData::deprecated</span><span class="plain">(&amp;(</span><span class="identifier">ph</span><span class="plain">-&gt;</span><span class="element">type_data</span><span class="plain">)))</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Index::deprecation_icon</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">run_begin</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Index::link</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">ParseTree::get_text</span><span class="plain">(</span><span class="identifier">ph</span><span class="plain">-&gt;</span><span class="element">declaration_node</span><span class="plain">)));</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">run_end</span><span class="plain"> == </span><span class="identifier">ph</span><span class="plain">) {</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">Index::extra_div_open</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ph</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="string">"e0e0e0"</span><span class="plain">);</span>
<span class="functiontext">Phrases::TypeData::Textual::write_reveal_box</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, &amp;(</span><span class="identifier">run_begin</span><span class="plain">-&gt;</span><span class="element">type_data</span><span class="plain">), </span><span class="identifier">run_begin</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">Index::extra_div_close</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">"e0e0e0"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Where the following detects if two phrases have the same documentation
symbol, i.e., are essentially rewordings of the same phrase, and will have
a single shared reveal-box:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Phrases::Index::ph_same_doc</span><span class="plain">(</span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">p1</span><span class="plain">, </span><span class="reserved">phrase</span><span class="plain"> *</span><span class="identifier">p2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">p1</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">p2</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) ||</span>
2020-04-07 03:06:09 +03:00
<span class="plain">(</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">p1</span><span class="plain">-&gt;</span><span class="element">ph_documentation_symbol</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Wordings::empty</span><span class="plain">(</span><span class="identifier">p2</span><span class="plain">-&gt;</span><span class="element">ph_documentation_symbol</span><span class="plain">)))</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::match</span><span class="plain">(</span><span class="identifier">p1</span><span class="plain">-&gt;</span><span class="element">ph_documentation_symbol</span><span class="plain">, </span><span class="identifier">p2</span><span class="plain">-&gt;</span><span class="element">ph_documentation_symbol</span><span class="plain">))</span>
2019-03-17 14:40:57 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Index::ph_same_doc is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>This is nothing to do with phrases, but as we've defined &lt;heading-name-hyphenated&gt;
above, it may as well go here.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Phrases::Index::index_definition_area</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">show_if_unhyphenated</span><span class="plain">) {</span>
2020-03-11 02:21:09 +02:00
<span class="plain">&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;(</span><span class="identifier">W</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> ((&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt; == </span><span class="constant">1</span><span class="plain">) &amp;&amp; (</span><span class="identifier">show_if_unhyphenated</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"b"</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (&lt;&lt;</span><span class="identifier">r</span><span class="plain">&gt;&gt;) {</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;, </span><span class="constant">2</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;, </span><span class="constant">2</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">GET_RW</span><span class="plain">(&lt;</span><span class="identifier">heading</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">-</span><span class="identifier">hyphenated</span><span class="plain">&gt;, </span><span class="constant">3</span><span class="plain">);</span>
2019-03-17 14:40:57 +02:00
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%+W - %+W"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"b"</span><span class="plain">);</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"br"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Phrases::Index::index_definition_area is used in 5/nv (<a href="5-nv.html#SP27_2">&#167;27.2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="22-tp2.html">Back to 'Timed Phrases'</a></li><li><i>(This section ends Chapter 22: Phrases.)</i></li></ul><hr class="tocbar">
2019-04-22 17:42:10 +03:00
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2019-03-17 14:40:57 +02:00
</body>
</html>