1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-17 06:24:24 +03:00
inform7/docs/core-module/8-ed2.html
2019-03-18 23:36:20 +00:00

686 lines
71 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>8/ed</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 '8/ed2' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">core</a></li><li><a href="index.html#8">Chapter 8: Extensions</a></li><li><b>Extension Documentation</b></li></ul><p class="purpose">To generate HTML documentation for extensions.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>Each extension gets its own page in the external documentation area, but
this page can have two forms: the deluxe version, only produced if an
extension is successfully used, and a cut-down placeholder version, used
if Inform has detected the extension but never used it (and so does not really
understand what it entails). The following routine writes both kinds of page.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Documentation::write_detailed</span><span class="plain">(</span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">) {</span>
<span class="functiontext">Extensions::Documentation::write_extension_documentation</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Documentation::write_sketchy</span><span class="plain">(</span><span class="reserved">extension_census_datum</span><span class="plain"> *</span><span class="identifier">ecd</span><span class="plain">) {</span>
<span class="functiontext">Extensions::Documentation::write_extension_documentation</span><span class="plain">(</span><span class="identifier">ecd</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Documentation::write_detailed is used in 8/ef (<a href="8-ef.html#SP22">&#167;22</a>).</p>
<p class="endnote">The function Extensions::Documentation::write_sketchy is used in 8/ef (<a href="8-ef.html#SP23">&#167;23</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Thus we pass two arguments, <code class="display"><span class="extract">ecd</span></code> and <code class="display"><span class="extract">ef</span></code>, to <code class="display"><span class="extract">Extensions::Documentation::write_extension_documentation</span></code>:
one is a valid pointer, the other null. If <code class="display"><span class="extract">ef</span></code> is valid, we can write a full
page: if <code class="display"><span class="extract">ecd</span></code> is valid, only a sketchy one.
</p>
<p class="inwebparagraph">The outer shell routine calls the inner one first to generate the main
page of the documentation (where <code class="display"><span class="extract">eg_number</span></code> is <code class="display"><span class="extract">-1</span></code>), then uses its return
value (the number of examples provided, which may be 0) to generate
associated files for each example. For instance, we might end up making,
in sequence,
</p>
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">Documentation/Extensions/Emily Short/Locksmith.html</span>
<span class="plain">Documentation/Extensions/Emily Short/Locksmith-eg1.html</span>
<span class="plain">Documentation/Extensions/Emily Short/Locksmith-eg2.html</span>
<span class="plain">Documentation/Extensions/Emily Short/Locksmith-eg3.html</span>
<span class="plain">Documentation/Extensions/Emily Short/Locksmith-eg4.html</span>
</pre>
<p class="inwebparagraph">where these are pathnames relative to the external resources area.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Extensions::Documentation::write_extension_documentation</span><span class="plain">(</span><span class="reserved">extension_census_datum</span><span class="plain"> *</span><span class="identifier">ecd</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</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="identifier">eg_count</span><span class="plain">;</span>
<span class="identifier">eg_count</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::write_extension_documentation_page</span><span class="plain">(</span><span class="identifier">ecd</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, -1);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">=1; </span><span class="identifier">c</span><span class="plain">&lt;=</span><span class="identifier">eg_count</span><span class="plain">; </span><span class="identifier">c</span><span class="plain">++)</span>
<span class="functiontext">Extensions::Documentation::write_extension_documentation_page</span><span class="plain">(</span><span class="identifier">ecd</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Documentation::write_extension_documentation is used in <a href="#SP1">&#167;1</a>, <a href="#SP3_1">&#167;3.1</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Here then is the nub of it. An ECD is not really enough information to go on.
We are not always obliged to make a sketchy page from an ECD: we decide against
in a normal run where a page exists for it already, as otherwise a user with
many extensions installed would detect an annoying slight delay on every run
of Inform &mdash; whereas a slight delay on each census-mode run is acceptable, since
census-mode runs are made only when extensions are installed or uninstalled.
If we do decide to make a page from an ECD, we in fact read the extension into
the lexer so as to make an EF of it. Of course, it won't be a very interesting
EF &mdash; since it wasn't used in compilation there will be no definitions arising
from it, so the top half of its documentation page will be vacant &mdash; but it
will at least provide the extension author's supplied documentation, if there
is any, as well as the correct identifying headings and requirements.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Extensions::Documentation::write_extension_documentation_page</span><span class="plain">(</span><span class="reserved">extension_census_datum</span><span class="plain"> *</span><span class="identifier">ecd</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">eg_number</span><span class="plain">) {</span>
<span class="reserved">extension_identifier</span><span class="plain"> *</span><span class="identifier">eid</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">text_stream</span><span class="plain"> </span><span class="identifier">DOCF_struct</span><span class="plain">;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">DOCF</span><span class="plain"> = &amp;</span><span class="identifier">DOCF_struct</span><span class="plain">;</span>
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">TEST_DOCF</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">page_exists_already</span><span class="plain">, </span><span class="identifier">no_egs</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ecd</span><span class="plain">) </span><span class="identifier">eid</span><span class="plain"> = &amp;(</span><span class="identifier">ecd</span><span class="plain">-</span><span class="element">&gt;ecd_id</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">ef</span><span class="plain">) </span><span class="identifier">eid</span><span class="plain"> = &amp;(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;ef_id</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"WEDP incorrectly called"</span><span class="plain">);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTENSIONS_CENSUS</span><span class="plain">, </span><span class="string">"WEDP %s (%X)/%d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, (</span><span class="identifier">ecd</span><span class="plain">)?</span><span class="string">"ecd"</span><span class="plain">:</span><span class="string">" ef"</span><span class="plain">, </span><span class="identifier">eid</span><span class="plain">, </span><span class="identifier">eg_number</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="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">eid</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eg_number</span><span class="plain"> &gt; 0) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"-eg%d"</span><span class="plain">, </span><span class="identifier">eg_number</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain"> = </span><span class="functiontext">Locations::of_extension_documentation</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">eid</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain">);</span>
<span class="identifier">page_exists_already</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">TEST_DOCF</span><span class="plain"> = </span><span class="identifier">Filenames::fopen</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TEST_DOCF</span><span class="plain">) { </span><span class="identifier">page_exists_already</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">; </span><span class="identifier">fclose</span><span class="plain">(</span><span class="identifier">TEST_DOCF</span><span class="plain">); }</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTENSIONS_CENSUS</span><span class="plain">, </span><span class="string">"WEDP %s: %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, (</span><span class="identifier">page_exists_already</span><span class="plain">)?</span><span class="string">"exists"</span><span class="plain">:</span><span class="string">"does not exist"</span><span class="plain">,</span>
<span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ecd</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">page_exists_already</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) || (</span><span class="identifier">census_mode</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Convert ECD to a text-only EF</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> 0; </span> <span class="comment">ensure no requests sent for further pages about the ECD: see below</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null EF in extension documentation writer"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Pathnames::create_in_file_system</span><span class="plain">(</span>
<span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">pathname_of_extension_docs_inner</span><span class="plain">, </span><span class="identifier">eid</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain">)) == 0)</span>
<span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">DOCF</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">UTF8_ENC</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> 0; </span> <span class="comment">if we lack permissions, e.g., then write no documentation</span>
&lt;<span class="cwebmacro">Write the actual extension documentation page to DOCF</span> <span class="cwebmacronumber">3.2</span>&gt;<span class="plain">;</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">DOCF</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">return</span><span class="plain"> </span><span class="identifier">no_egs</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Documentation::write_extension_documentation_page is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>The reader may wonder why we perform the conversion in this slightly recursive
way, by calling our parent routine again. Wouldn't it be simpler just to set
<code class="display"><span class="extract">ecd</span></code> to null and let events take their course? The answer is that this would
fail if there were examples, because we would return (say) 3 for the number
of examples, and then the routine would be called 3 more times &mdash; but with
the original ECD as argument each time: that would mean reading the file
thrice more, reconverting to EF each time. So we restart the process from
our EF, and return 0 in response to the ECD call to prevent any further ECD
calls.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Convert ECD to a text-only EF</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">eid</span><span class="plain">-</span><span class="element">&gt;raw_author_name</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">AW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="identifier">Feeds::feed_stream</span><span class="plain">(</span><span class="identifier">eid</span><span class="plain">-</span><span class="element">&gt;raw_title</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">TW</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"This sentence provides a firebreak, no more. "</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">AW</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">unsuitable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">TW</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="identifier">ef</span><span class="plain"> = </span><span class="functiontext">Extensions::Inclusion::load</span><span class="plain">(</span><span class="identifier">AW</span><span class="plain">, </span><span class="identifier">TW</span><span class="plain">, -1, </span><span class="identifier">EMPTY_WORDING</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 0; </span> <span class="comment">shouldn't happen: it was there only moments ago</span>
<span class="functiontext">Extensions::Documentation::write_extension_documentation</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b>We now make much the same "paste into the gap in the template" copying
exercise as when generating the home pages for extensions, though with a
different template:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Write the actual extension documentation page to DOCF</span> <span class="cwebmacronumber">3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="identifier">DOCF</span><span class="plain">;</span>
<span class="identifier">HTML::declare_as_HTML</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">HTML::begin_head</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">HTML::title</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Extension"</span><span class="plain">);</span>
<span class="identifier">HTML::incorporate_javascript</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">,</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_HTML_models</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extensionfile.js"</span><span class="plain">));</span>
<span class="identifier">HTML::incorporate_CSS</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_HTML_models</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"main.css"</span><span class="plain">));</span>
<span class="identifier">HTML::end_head</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="identifier">HTML::begin_body</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">HTML::incorporate_HTML</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">pathname_of_HTML_models</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"extensionfile.html"</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Write documentation for a specific extension into the page</span> <span class="cwebmacronumber">3.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">HTML::end_body</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1"></a><b>&#167;3.2.1. </b>And this is the body:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Write documentation for a specific extension into the page</span> <span class="cwebmacronumber">3.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">HTML_OPEN</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="functiontext">Extensions::IDs::is_standard_rules</span><span class="plain">(</span><span class="identifier">eid</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Write Javascript paste icon for source text to include this extension</span> <span class="cwebmacronumber">3.2.1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;b&gt;"</span><span class="plain">);</span>
<span class="functiontext">Extensions::IDs::write_to_HTML_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">eid</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<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="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"class=\</span><span class="plain">"</span><span class="string">smaller\</span><span class="plain">"</span><span class="string">"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write up any restrictions on VM usage</span> <span class="cwebmacronumber">3.2.1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write up the version number, if any, and location</span> <span class="cwebmacronumber">3.2.1.3</span>&gt;<span class="plain">;</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write up the rubric, if any</span> <span class="cwebmacronumber">3.2.1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Write up the table of contents for the extension author's supplied documentation, if any</span> <span class="cwebmacronumber">3.2.1.5</span>&gt;<span class="character">;</span>
&lt;<span class="cwebmacro">Document and dictionary the definitions made in extension file ef</span> <span class="cwebmacronumber">3.2.1.7</span>&gt;<span class="plain">;</span>
<span class="identifier">HTML_TAG</span><span class="plain">(</span><span class="string">"hr"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Write up the extension author's supplied documentation, if any</span> <span class="cwebmacronumber">3.2.1.6</span>&gt;<span class="character">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2">&#167;3.2</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_1"></a><b>&#167;3.2.1.1. </b>UTF-8 transcoding in the following is delegated to <code class="display"><span class="extract">HTML::Javascript::paste</span></code>:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Write Javascript paste icon for source text to include this extension</span> <span class="cwebmacronumber">3.2.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">inclusion_text</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">inclusion_text</span><span class="plain">, </span><span class="string">"Include %X.\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">eid</span><span class="plain">);</span>
<span class="identifier">HTML::Javascript::paste_stream</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">inclusion_text</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">inclusion_text</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1">&#167;3.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_2"></a><b>&#167;3.2.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write up any restrictions on VM usage</span> <span class="cwebmacronumber">3.2.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</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">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&amp;nbsp;"</span><span class="plain">);</span>
<span class="functiontext">VirtualMachines::write_icons</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;VM_restriction_text</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1">&#167;3.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_3"></a><b>&#167;3.2.1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write up the version number, if any, and location</span> <span class="cwebmacronumber">3.2.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;version_loaded</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Version %+W"</span><span class="plain">, </span><span class="identifier">Wordings::one_word</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;version_loaded</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;loaded_from_built_in_area</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;version_loaded</span><span class="plain"> &lt; 0) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Extension"</span><span class="plain">); }</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" built in to Inform"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1">&#167;3.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_4"></a><b>&#167;3.2.1.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write up the rubric, if any</span> <span class="cwebmacronumber">3.2.1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;rubric_as_lexed</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;rubric_as_lexed</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="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;extra_credit_as_lexed</span><span class="plain">) &gt; 0) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;i&gt;%S&lt;/i&gt;"</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;extra_credit_as_lexed</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1">&#167;3.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_5"></a><b>&#167;3.2.1.5. </b>This appears above the definition paragraphs because it tends to be only
large extensions which provide TOCs: and they, ipso facto, make many definitions.
If the TOC were directly at the top of the supplied documentation, it might
easily be scrolled down off screen when the user first visits the page.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Write up the table of contents for the extension author's supplied documentation, if any</span> <span class="cwebmacronumber">3.2.1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;documentation_text</span><span class="plain">)) {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">HTML::Documentation::set_table_of_contents</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;documentation_text</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1">&#167;3.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_6"></a><b>&#167;3.2.1.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Write up the extension author's supplied documentation, if any</span> <span class="cwebmacronumber">3.2.1.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;documentation_text</span><span class="plain">))</span>
<span class="identifier">no_egs</span><span class="plain"> = </span><span class="identifier">HTML::Documentation::set_body_text</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;documentation_text</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">eg_number</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"The extension provides no documentation."</span><span class="plain">);</span>
<span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1">&#167;3.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7"></a><b>&#167;3.2.1.7. </b>Nothing can prevent a certain repetitiousness intruding here, but there is
just enough local knowledge required to make it foolhardy to try to automate
this from a dump of the excerpt meanings table (say). The ordering of
paragraphs, as in Roget's Thesaurus, tries to proceed from solid things
through to diffuse linguistic ones. But the reader of the resulting
documentation page could be forgiven for thinking it a miscellany.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the definitions made in extension file ef</span> <span class="cwebmacronumber">3.2.1.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Extensions::Dictionary::erase_entries</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">);</span>
<span class="functiontext">Extensions::Dictionary::time_stamp</span><span class="plain">(</span><span class="identifier">ef</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Document and dictionary the kinds made in extension</span> <span class="cwebmacronumber">3.2.1.7.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the objects made in extension</span> <span class="cwebmacronumber">3.2.1.7.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the global variables made in extension</span> <span class="cwebmacronumber">3.2.1.7.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the enumerated constant values made in extension</span> <span class="cwebmacronumber">3.2.1.7.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the kinds of action made in extension</span> <span class="cwebmacronumber">3.2.1.7.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the actions made in extension</span> <span class="cwebmacronumber">3.2.1.7.6</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the verbs made in extension</span> <span class="cwebmacronumber">3.2.1.7.7</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the adjectival phrases made in extension</span> <span class="cwebmacronumber">3.2.1.7.8</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the property names made in extension</span> <span class="cwebmacronumber">3.2.1.7.9</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Document and dictionary the use options made in extension</span> <span class="cwebmacronumber">3.2.1.7.10</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1">&#167;3.2.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_1"></a><b>&#167;3.2.1.7.1. </b>Off we go, then. Kinds of object:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the kinds made in extension</span> <span class="cwebmacronumber">3.2.1.7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER_BASE_KINDS</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) {</span>
<span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_creating_sentence</span><span class="plain">(</span><span class="identifier">K</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="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::file_of_origin</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">S</span><span class="plain">))) == </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</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="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="string">"Kinds"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kind"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Kinds::Compare::super</span><span class="plain">(</span><span class="identifier">K</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="identifier">W</span><span class="plain"> = </span><span class="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">FALSE</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">W</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (a kind of %+W)"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_2"></a><b>&#167;3.2.1.7.2. </b>Actual objects:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the objects made in extension</span> <span class="cwebmacronumber">3.2.1.7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">instance</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">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER_OBJECT_INSTANCES</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">OW</span><span class="plain"> = </span><span class="functiontext">Instances::get_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Instances::get_creating_sentence</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">OW</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Lexer::file_of_origin</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="functiontext">Instances::get_creating_sentence</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">))))</span>
<span class="plain">== </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">name_of_its_kind</span><span class="plain">);</span>
<span class="identifier">kind</span><span class="plain"> *</span><span class="identifier">k</span><span class="plain"> = </span><span class="functiontext">Instances::to_kind</span><span class="plain">(</span><span class="identifier">I</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="identifier">Kinds::Behaviour::get_name</span><span class="plain">(</span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">name_of_its_kind</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="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">,</span>
<span class="string">"Physical creations"</span><span class="plain">, </span><span class="identifier">name_of_its_kind</span><span class="plain">, </span><span class="identifier">OW</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (a %S)"</span><span class="plain">, </span><span class="identifier">name_of_its_kind</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">name_of_its_kind</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_3"></a><b>&#167;3.2.1.7.3. </b>Global variables:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the global variables made in extension</span> <span class="cwebmacronumber">3.2.1.7.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">nonlocal_variable</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">, </span><span class="reserved">nonlocal_variable</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">) &gt;= 0) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">NonlocalVariables::is_global</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) == </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Sentences::Headings::indexed</span><span class="plain">(</span><span class="functiontext">Sentences::Headings::of_wording</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)))) {</span>
<span class="reserved">if</span><span class="plain"> (&lt;</span><span class="identifier">value</span><span class="plain">-</span><span class="identifier">understood</span><span class="plain">-</span><span class="identifier">variable</span><span class="plain">-</span><span class="identifier">name</span><span class="plain">&gt;(</span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="identifier">kc</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="string">"Values that vary"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"value"</span><span class="plain">, </span><span class="identifier">q</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_4"></a><b>&#167;3.2.1.7.4. </b>Constants:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the enumerated constant values made in extension</span> <span class="cwebmacronumber">3.2.1.7.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">instance</span><span class="plain"> *</span><span class="identifier">q</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER_ENUMERATION_INSTANCES</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">NW</span><span class="plain"> = </span><span class="functiontext">Instances::get_name</span><span class="plain">(</span><span class="identifier">q</span><span class="plain">, </span><span class="identifier">FALSE</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">NW</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">NW</span><span class="plain">)) == </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="string">"Values"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"value"</span><span class="plain">, </span><span class="identifier">NW</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_5"></a><b>&#167;3.2.1.7.5. </b>Kinds of action:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the kinds of action made in extension</span> <span class="cwebmacronumber">3.2.1.7.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">PL::Actions::Patterns::Named::index_for_extension</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_6"></a><b>&#167;3.2.1.7.6. </b>Actions:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the actions made in extension</span> <span class="cwebmacronumber">3.2.1.7.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">IF_MODULE</span>
<span class="identifier">PL::Actions::Index::index_for_extension</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_7"></a><b>&#167;3.2.1.7.7. </b>Verbs (this one we delegate):
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the verbs made in extension</span> <span class="cwebmacronumber">3.2.1.7.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Index::Lexicon::list_verbs_in_file</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_8"></a><b>&#167;3.2.1.7.8. </b>Adjectival phrases:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the adjectival phrases made in extension</span> <span class="cwebmacronumber">3.2.1.7.8</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">adjectival_phrase</span><span class="plain"> *</span><span class="identifier">adj</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">adj</span><span class="plain">, </span><span class="identifier">adjectival_phrase</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="identifier">Adjectives::get_text</span><span class="plain">(</span><span class="identifier">adj</span><span class="plain">, </span><span class="identifier">FALSE</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">W</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) == </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="string">"Adjectives"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"adjective"</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_9"></a><b>&#167;3.2.1.7.9. </b>Other adjectives:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the property names made in extension</span> <span class="cwebmacronumber">3.2.1.7.9</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="reserved">property</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">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Properties::is_shown_in_index</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) == </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="string">"Properties"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"property"</span><span class="plain">,</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP3_2_1_7_10"></a><b>&#167;3.2.1.7.10. </b>Use options:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Document and dictionary the use options made in extension</span> <span class="cwebmacronumber">3.2.1.7.10</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">use_option</span><span class="plain"> *</span><span class="identifier">uo</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">, </span><span class="reserved">use_option</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">) &gt;= 0) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Lexer::file_of_origin</span><span class="plain">(</span><span class="identifier">Wordings::first_wn</span><span class="plain">(</span><span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) == </span><span class="identifier">ef</span><span class="plain">-</span><span class="element">&gt;read_into_file</span><span class="plain">))</span>
<span class="identifier">kc</span><span class="plain"> = </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">kc</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="string">"Use options"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"use option"</span><span class="plain">,</span>
<span class="identifier">uo</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain"> != 0) </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3_2_1_7">&#167;3.2.1.7</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Finally, the utility routine which keeps count (hence <code class="display"><span class="extract">kc</span></code>) and displays
suitable lists, while entering each entry in turn into the extension
dictionary.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Extensions::Documentation::document_headword</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain">, </span><span class="reserved">extension_file</span><span class="plain"> *</span><span class="identifier">ef</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">par_heading</span><span class="plain">,</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">category</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">if</span><span class="plain"> (</span><span class="identifier">kc</span><span class="plain">++ == 0) { </span><span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"p"</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s: "</span><span class="plain">, </span><span class="identifier">par_heading</span><span class="plain">); }</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", "</span><span class="plain">);</span>
<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">W</span><span class="plain">);</span>
<span class="functiontext">Extensions::Dictionary::new_entry</span><span class="plain">(</span><span class="identifier">category</span><span class="plain">, </span><span class="identifier">ef</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">kc</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Extensions::Documentation::document_headword is used in <a href="#SP3_2_1_7_1">&#167;3.2.1.7.1</a>, <a href="#SP3_2_1_7_2">&#167;3.2.1.7.2</a>, <a href="#SP3_2_1_7_3">&#167;3.2.1.7.3</a>, <a href="#SP3_2_1_7_4">&#167;3.2.1.7.4</a>, <a href="#SP3_2_1_7_8">&#167;3.2.1.7.8</a>, <a href="#SP3_2_1_7_9">&#167;3.2.1.7.9</a>, <a href="#SP3_2_1_7_10">&#167;3.2.1.7.10</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And that at last brings us to a milestone: the end of the Land of Extensions.
We can return to Inform's more usual concerns.
</p>
<hr class="tocbar">
<ul class="toc"><li><a href="8-ed.html">Back to 'Extension Dictionary'</a></li><li><i>(This section ends Chapter 8: Extensions.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>