1370 lines
185 KiB
HTML
1370 lines
185 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>The Weaver</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../inweb/index.html">inweb</a></li>
|
|
</ul>
|
|
<h2>Foundation</h2>
|
|
<ul>
|
|
<li><a href="../foundation-module/index.html">foundation-module</a></li>
|
|
<li><a href="../foundation-test/index.html">foundation-test</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'The Weaver' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#3">Chapter 3: Outputs</a></li><li><b>The Weaver</b></li></ul><p class="purpose">To weave a portion of the code into instructions for TeX.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. The Master Weaver</a></li><li><a href="#SP1_3_1">§1.3.1. The state</a></li><li><a href="#SP1_3_3">§1.3.3. Weaving a section</a></li><li><a href="#SP1_3_3_1_1">§1.3.3.1.1. Reasons to skip things</a></li><li><a href="#SP1_3_3_1_3">§1.3.3.1.3. Headings</a></li><li><a href="#SP1_3_3_1_8">§1.3.3.1.8. Commentary matter</a></li><li><a href="#SP1_3_3_1_9">§1.3.3.1.9. Code-like matter</a></li><li><a href="#SP1_3_3_1_10">§1.3.3.1.10. How paragraphs begin</a></li><li><a href="#SP1_3_3_2">§1.3.3.2. How paragraphs end</a></li><li><a href="#SP2">§2. Endnotes</a></li><li><a href="#SP3">§3. Section tables of contents</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. The Master Weaver. </b>Here's what has happened so far, on a weave run of Inweb: on any other
|
|
sort of run, of course, we would never be in this section of code. The web was
|
|
read completely into memory and fully parsed. A request was then made either
|
|
to swarm a mass of individual weaves, or to make just a single weave, with the
|
|
target in each case being identified by its range. A further decoding layer
|
|
then translated each range into rather more basic details of what to weave and
|
|
where to put the result: and so we arrive at the front door of the routine
|
|
<code class="display"><span class="extract">Weaver::weave_source</span></code> below.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">current_weave_line</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Weaver::weave_source</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">) {</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">TO_struct</span><span class="plain">;</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &</span><span class="identifier">TO_struct</span><span class="plain">;</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">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="identifier">weave_to</span><span class="plain">, </span><span class="constant">UTF8_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
|
|
<span class="functiontext">Errors::fatal_with_file</span><span class="plain">(</span><span class="string">"unable to write woven file"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">weave_to</span><span class="plain">);</span>
|
|
|
|
<<span class="cwebmacro">Weave the banner</span> <span class="cwebmacronumber">1.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-></span><span class="element">cover_sheet_to_use</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) && (</span><span class="functiontext">Reader::web_has_one_section</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Weave head of the cover sheet, if any</span> <span class="cwebmacronumber">1.2</span>><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lines_woven</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">latest_section</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave the body of the material</span> <span class="cwebmacronumber">1.3</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-></span><span class="element">cover_sheet_to_use</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) && (</span><span class="functiontext">Reader::web_has_one_section</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Weave tail of the cover sheet, if any</span> <span class="cwebmacronumber">1.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave the rennab</span> <span class="cwebmacronumber">1.5</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lines_woven</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Weaver::weave_source is used in 3/ts (<a href="3-ts.html#SP2">§2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Weave the banner</span> <span class="cwebmacronumber">1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">banner</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">banner</span><span class="plain">, </span><span class="string">"Weave of '%S' generated by %s"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">booklet_title</span><span class="plain">, </span><span class="constant">INWEB_BUILD</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::top</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">banner</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">banner</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_2"></a><b>§1.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Weave head of the cover sheet, if any</span> <span class="cwebmacronumber">1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-></span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">)))</span>
|
|
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-></span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">booklet_title</span><span class="plain">);</span>
|
|
<span class="functiontext">Indexer::cover_sheet_maker</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">cover_sheet_to_use</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">WEAVE_FIRST_HALF</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3"></a><b>§1.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Weave the body of the material</span> <span class="cwebmacronumber">1.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">weaver_state</span><span class="plain"> </span><span class="identifier">state_at</span><span class="plain">; </span><span class="reserved">weaver_state</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain"> = &</span><span class="identifier">state_at</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Start the weaver with a clean slate</span> <span class="cwebmacronumber">1.3.2</span>><span class="plain">;</span>
|
|
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
|
|
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">chapter</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-></span><span class="element">chapters</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">imported</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">chaptermark</span><span class="plain">);</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-></span><span class="element">sections</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Reader::range_within</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_range</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">weave_range</span><span class="plain">)) {</span>
|
|
<span class="identifier">latest_section</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
|
|
<span class="functiontext">LanguageMethods::begin_weave</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">sectionmark</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Weave this section</span> <span class="cwebmacronumber">1.3.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_4"></a><b>§1.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Weave tail of the cover sheet, if any</span> <span class="cwebmacronumber">1.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-></span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">)))</span>
|
|
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-></span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">booklet_title</span><span class="plain">);</span>
|
|
<span class="functiontext">Indexer::cover_sheet_maker</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">cover_sheet_to_use</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">WEAVE_SECOND_HALF</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_5"></a><b>§1.5. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Weave the rennab</span> <span class="cwebmacronumber">1.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rennab</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">rennab</span><span class="plain">, </span><span class="string">"End of weave"</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::tail</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">rennab</span><span class="plain">, </span><span class="identifier">latest_section</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rennab</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_1"></a><b>§1.3.1. The state. </b>We can now begin on a clean page, by initialising the state of the weaver:
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">REGULAR_MATERIAL</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">MACRO_MATERIAL</span><span class="plain"> </span><span class="comment"> when a macro is being defined...</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DEFINITION_MATERIAL</span><span class="plain"> </span><span class="comment"> ...versus when an <code class="display"><span class="extract">@d</span></code> definition is being made</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CODE_MATERIAL</span><span class="plain"> </span><span class="comment"> verbatim code</span>
|
|
</pre>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weaver_state</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kind_of_material</span><span class="plain">; </span><span class="comment"> one of the enumerated <code class="display"><span class="extract">*_MATERIAL</span></code> constants above</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">line_break_pending</span><span class="plain">; </span><span class="comment"> insert a line break before the next woven line?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_heading_without_vertical_skip</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">show_section_toc_soon</span><span class="plain">; </span><span class="comment"> is a table of contents for the section imminent?</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">horizontal_rule_just_drawn</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_run_of_definitions</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">last_extract_from</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">last_endnoted_para</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">substantive_comment</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chaptermark</span><span class="plain">;</span>
|
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">weaver_state</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The structure weaver_state is private to this section.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_2"></a><b>§1.3.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Start the weaver with a clean slate</span> <span class="cwebmacronumber">1.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">show_section_toc_soon</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">last_extract_from</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">last_endnoted_para</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">chaptermark</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">sectionmark</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3">§1.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3"></a><b>§1.3.3. Weaving a section. </b></p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave this section</span> <span class="cwebmacronumber">1.3.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">current_paragraph</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-></span><span class="element">first_line</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-></span><span class="element">next_line</span><span class="plain">) {</span>
|
|
<span class="identifier">current_weave_line</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Tags::tagged_with</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">theme_match</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">LanguageMethods::skip_in_weaving</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)) {</span>
|
|
<span class="identifier">lines_woven</span><span class="plain">++;</span>
|
|
<<span class="cwebmacro">Weave this line</span> <span class="cwebmacronumber">1.3.3.1</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3">§1.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1"></a><b>§1.3.3.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Weave this line</span> <span class="cwebmacronumber">1.3.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="comment"> In principle, all of these source lines should be woven, but...</span>
|
|
<<span class="cwebmacro">Certain categories of line are excluded from the weave</span> <span class="cwebmacronumber">1.3.3.1.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Respond to any commands aimed at the weaver, and otherwise skip commands</span> <span class="cwebmacronumber">1.3.3.1.2</span>><span class="plain">;</span>
|
|
|
|
<span class="comment"> Some of the more baroque front matter of a section...</span>
|
|
<<span class="cwebmacro">Weave the Purpose marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">If we need to work in a section table of contents and this is a blank line, do it now</span> <span class="cwebmacronumber">1.3.3.1.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Deal with the Interface passage</span> <span class="cwebmacronumber">1.3.3.1.5</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave the Definitions marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.6</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave the section bar as a horizontal rule</span> <span class="cwebmacronumber">1.3.3.1.7</span>><span class="plain">;</span>
|
|
|
|
<span class="comment"> The crucial junction point between modes...</span>
|
|
<<span class="cwebmacro">Deal with the marker for the start of a new paragraph, section or chapter</span> <span class="cwebmacronumber">1.3.3.1.10</span>><span class="plain">;</span>
|
|
|
|
<span class="comment"> With all exotica dealt with, we now just have material to weave verbatim...</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">); </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">is_commentary</span><span class="plain">) </span><<span class="cwebmacro">Weave verbatim matter in commentary style</span> <span class="cwebmacronumber">1.3.3.1.8</span>>
|
|
<span class="reserved">else</span><span class="plain"> </span><<span class="cwebmacro">Weave verbatim matter in code style</span> <span class="cwebmacronumber">1.3.3.1.9</span>><span class="plain">;</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3">§1.3.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_1"></a><b>§1.3.3.1.1. Reasons to skip things. </b>We skip these because we weave their contents in some other way:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Certain categories of line are excluded from the weave</span> <span class="cwebmacronumber">1.3.3.1.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">INTERFACE_BODY_LCAT</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">PURPOSE_BODY_LCAT</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">END_EXTRACT_LCAT</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
|
|
<span class="constant">TRUE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</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">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">BEGIN_CODE_LCAT</span><span class="plain">) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="functiontext">LanguageMethods::reset_syntax_colouring</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_language</span><span class="plain">);</span>
|
|
<span class="reserved">continue</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_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_2"></a><b>§1.3.3.1.2. </b>And lastly we ignore commands, or act on them if they happen to be aimed
|
|
at us; but we don't weave them into the output, that's for sure.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Respond to any commands aimed at the weaver, and otherwise skip commands</span> <span class="cwebmacronumber">1.3.3.1.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">COMMAND_LCAT</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">PAGEBREAK_CMD</span><span class="plain">) </span><span class="functiontext">Formats::pagebreak</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">GRAMMAR_INDEX_CMD</span><span class="plain">) </span><span class="functiontext">InCSupport::weave_grammar_index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">FIGURE_CMD</span><span class="plain">) </span><<span class="cwebmacro">Weave a figure</span> <span class="cwebmacronumber">1.3.3.1.2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">EMBED_CMD</span><span class="plain">) </span><<span class="cwebmacro">Embed some Internet material</span> <span class="cwebmacronumber">1.3.3.1.2.2</span>><span class="plain">;</span>
|
|
<span class="comment"> Otherwise assume it was a tangler command, and ignore it here</span>
|
|
<span class="reserved">continue</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_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_2_1"></a><b>§1.3.3.1.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Weave a figure</span> <span class="cwebmacronumber">1.3.3.1.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">figname</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand</span><span class="plain">;</span>
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%d+)cm: (%c+)"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</span><span class="plain"> > </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
|
|
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"Figure: Xcm:..."</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="constant">0</span><span class="plain">), -1, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) width (%d+)cm"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</span><span class="plain"> < </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
|
|
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"F width Xcm"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="constant">0</span><span class="plain">), -1, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) height (%d+)cm"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</span><span class="plain"> < </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
|
|
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"F height Xcm"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], -1, </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="constant">0</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) as (%c+)"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="identifier">using_syntax</span><span class="plain"> < </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
|
|
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"F as L"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
|
|
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="functiontext">Languages::find_by_name</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">W</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], -1, -1, </span><span class="identifier">pl</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, -1, -1, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_2">§1.3.3.1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_2_2"></a><b>§1.3.3.1.2.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Embed some Internet material</span> <span class="cwebmacronumber">1.3.3.1.2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Formats::embed</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand2</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_2">§1.3.3.1.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_3"></a><b>§1.3.3.1.3. Headings. </b>The purpose is set with a little heading. Its operand is that part of
|
|
the purpose-text which is on the opening line; the rest follows on
|
|
subsequent lines until the next blank.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave the Purpose marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">PURPOSE_LCAT</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_purpose</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="functiontext">Weaver::weave_table_of_contents</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="reserved">continue</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_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_4"></a><b>§1.3.3.1.4. </b>This normally appears just after the Purpose subheading:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">If we need to work in a section table of contents and this is a blank line, do it now</span> <span class="cwebmacronumber">1.3.3.1.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">state</span><span class="plain">-></span><span class="element">show_section_toc_soon</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) && (</span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">text</span><span class="plain">))) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">show_section_toc_soon</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Weaver::weave_table_of_contents</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">))</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</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_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_5"></a><b>§1.3.3.1.5. </b>After which we have the Interface — if we're in Inweb syntax version 1 —
|
|
but it weaves nothing:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Deal with the Interface passage</span> <span class="cwebmacronumber">1.3.3.1.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">INTERFACE_LCAT</span><span class="plain">) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">continue</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_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_6"></a><b>§1.3.3.1.6. </b>And another little heading, again visible only in syntax version 1...
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave the Definitions marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">DEFINITIONS_LCAT</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Definitions"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">continue</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_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_7"></a><b>§1.3.3.1.7. </b>...with the section bar to follow. The bar line completes any half-finished
|
|
paragraph and is set as a horizontal rule (and, once again, can exist only
|
|
in a version 1 web).
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave the section bar as a horizontal rule</span> <span class="cwebmacronumber">1.3.3.1.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">BAR_LCAT</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="identifier">horizontal_rule_just_drawn</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Formats::bar</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
|
|
<span class="reserved">continue</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_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_8"></a><b>§1.3.3.1.8. Commentary matter. </b>Typographically this is a fairly simple business: it's almost the case that
|
|
we only have to transcribe it. But not quite!
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave verbatim matter in commentary style</span> <span class="cwebmacronumber">1.3.3.1.8</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Weave displayed source in its own special style</span> <span class="cwebmacronumber">1.3.3.1.8.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave a blank line as a thin vertical skip and paragraph break</span> <span class="cwebmacronumber">1.3.3.1.8.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave bracketed list indications at start of line into indentation</span> <span class="cwebmacronumber">1.3.3.1.8.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave tabbed code material as a new indented paragraph</span> <span class="cwebmacronumber">1.3.3.1.8.4</span>><span class="plain">;</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="string">"\n"</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_8_1"></a><b>§1.3.3.1.8.1. </b>Displayed source is the material marked with <code class="display"><span class="extract">>></span></code> arrows in column 1.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave displayed source in its own special style</span> <span class="cwebmacronumber">1.3.3.1.8.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">SOURCE_DISPLAY_LCAT</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::display_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand</span><span class="plain">);</span>
|
|
<span class="reserved">continue</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_3_3_1_8">§1.3.3.1.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_8_2"></a><b>§1.3.3.1.8.2. </b>Our style is to use paragraphs without initial-line indentation, so we
|
|
add a vertical skip between them to show the division more clearly.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave a blank line as a thin vertical skip and paragraph break</span> <span class="cwebmacronumber">1.3.3.1.8.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-></span><span class="element">next_line</span><span class="plain">) && (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">next_line</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain">)) {</span>
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> != </span><span class="constant">CODE_MATERIAL</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"\t|(%c*)|(%c*?)"</span><span class="plain">)))</span>
|
|
<span class="functiontext">Formats::blank_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">continue</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_3_3_1_8">§1.3.3.1.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_8_3"></a><b>§1.3.3.1.8.3. </b>Here our extension is simply to provide a tidier way to use TeX's standard
|
|
<code class="display"><span class="extract">\item</span></code> and <code class="display"><span class="extract">\itemitem</span></code> macros for indented list items.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave bracketed list indications at start of line into indentation</span> <span class="cwebmacronumber">1.3.3.1.8.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(...%) (%c*)"</span><span class="plain">)) { </span><span class="comment"> continue single</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(-...%) (%c*)"</span><span class="plain">)) { </span><span class="comment"> continue double</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%((%i+)%) (%c*)"</span><span class="plain">)) { </span><span class="comment"> begin single</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(-(%i+)%) (%c*)"</span><span class="plain">)) { </span><span class="comment"> begin double</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_8">§1.3.3.1.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_8_4"></a><b>§1.3.3.1.8.4. </b>Finally, matter encased in vertical strokes one tab stop in from column 1
|
|
in the source is set indented in code style.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave tabbed code material as a new indented paragraph</span> <span class="cwebmacronumber">1.3.3.1.8.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"\t|(%c*)|(%c*?)"</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="identifier">kind_of_material</span><span class="plain"> != </span><span class="constant">CODE_MATERIAL</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">CODE_MATERIAL</span><span class="plain">,</span>
|
|
<span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">plainer</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">CODE_MATERIAL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="constant">PLAIN_COLOUR</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::source_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">original</span><span class="plain">, </span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
|
|
<span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="identifier">enable_hyperlinks</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">);</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> != </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
|
|
<span class="constant">TRUE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_8">§1.3.3.1.8</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_9"></a><b>§1.3.3.1.9. Code-like matter. </b>Even though Inweb's approach, unlike <code class="display"><span class="extract">CWEB</span></code>'s, is to respect the layout
|
|
of the original, this is still quite typographically complex: commentary
|
|
and macro usage is rendered differently.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave verbatim matter in code style</span> <span class="cwebmacronumber">1.3.3.1.9</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<<span class="cwebmacro">Enter beginlines/endlines mode if necessary</span> <span class="cwebmacronumber">1.3.3.1.9.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Weave a blank line as a thin vertical skip</span> <span class="cwebmacronumber">1.3.3.1.9.2</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tab_stops_of_indentation</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Convert leading space in line matter to a number of tab stops</span> <span class="cwebmacronumber">1.3.3.1.9.3</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Extract any comment matter ending the line to be set in italic</span> <span class="cwebmacronumber">1.3.3.1.9.4</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Give constant definition lines slightly fancier openings</span> <span class="cwebmacronumber">1.3.3.1.9.5</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LanguageMethods::weave_code_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">,</span>
|
|
<span class="identifier">W</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
|
|
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
|
|
<span class="functiontext">LanguageMethods::syntax_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">,</span>
|
|
<span class="plain"> </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">colouring</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Find macro usages and adjust syntax colouring accordingly</span> <span class="cwebmacronumber">1.3.3.1.9.6</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="identifier">in_run_of_definitions</span><span class="plain">) </span><span class="functiontext">Formats::after_definitions</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="functiontext">Formats::source_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">tab_stops_of_indentation</span><span class="plain">, </span><span class="identifier">prefatory</span><span class="plain">,</span>
|
|
<span class="identifier">matter</span><span class="plain">, </span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">, (</span><span class="identifier">found</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
|
|
<span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">enable_hyperlinks</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">);</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_9_1"></a><b>§1.3.3.1.9.1. </b>Code is typeset between the <code class="display"><span class="extract">\beginlines</span></code> and <code class="display"><span class="extract">\endlines</span></code> macros in TeX,
|
|
hence the name of the following paragraph:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Enter beginlines/endlines mode if necessary</span> <span class="cwebmacronumber">1.3.3.1.9.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mode_now</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="identifier">kind_of_material</span><span class="plain"> != </span><span class="constant">CODE_MATERIAL</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">MACRO_DEFINITION_LCAT</span><span class="plain">)</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">MACRO_MATERIAL</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">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">BEGIN_DEFINITION_LCAT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">CONT_DEFINITION_LCAT</span><span class="plain">))</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">DEFINITION_MATERIAL</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">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> == </span><span class="constant">DEFINITION_MATERIAL</span><span class="plain">) &&</span>
|
|
<span class="plain">((</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">CODE_BODY_LCAT</span><span class="plain">) || (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">)) &&</span>
|
|
<span class="plain">(</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">text</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">))</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">DEFINITION_MATERIAL</span><span class="plain">;</span>
|
|
<span class="reserved">else</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">CODE_MATERIAL</span><span class="plain">;</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mode_now</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">,</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">plainer</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</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_3_3_1_9">§1.3.3.1.9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_9_2"></a><b>§1.3.3.1.9.2. </b>A blank line is typeset as a thin vertical skip (no TeX paragraph break
|
|
is needed):
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave a blank line as a thin vertical skip</span> <span class="cwebmacronumber">1.3.3.1.9.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="identifier">line_break_pending</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::blank_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">)) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">continue</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_3_3_1_9">§1.3.3.1.9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_9_3"></a><b>§1.3.3.1.9.3. </b>Examine the white space at the start of the code line, and count the
|
|
number of tab steps of indentation, rating 1 tab = 4 spaces:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Convert leading space in line matter to a number of tab stops</span> <span class="cwebmacronumber">1.3.3.1.9.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">spaces_in</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Characters::is_space_or_tab</span><span class="plain">(</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">) == </span><span class="character">'\t'</span><span class="plain">) {</span>
|
|
<span class="identifier">spaces_in</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">tab_stops_of_indentation</span><span class="plain">++;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="identifier">spaces_in</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spaces_in</span><span class="plain"> == </span><span class="constant">4</span><span class="plain">) {</span>
|
|
<span class="identifier">tab_stops_of_indentation</span><span class="plain">++;</span>
|
|
<span class="identifier">spaces_in</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spaces_in</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">respaced</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">spaces_in</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">respaced</span><span class="plain">, </span><span class="character">' '</span><span class="plain">); </span><span class="identifier">spaces_in</span><span class="plain">--; }</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">respaced</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">respaced</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">respaced</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_3_3_1_9">§1.3.3.1.9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_9_4"></a><b>§1.3.3.1.9.4. </b>Comments which run to the end of a line are set in italic type. If the
|
|
only item on their lines, they are presented at the code tab stop;
|
|
otherwise, they are set flush right.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Extract any comment matter ending the line to be set in italic</span> <span class="cwebmacronumber">1.3.3.1.9.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">part_before_comment</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">part_within_comment</span><span class="plain">);</span>
|
|
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_language</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">) </span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-></span><span class="element">colour_as</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pl</span><span class="plain">) && (</span><span class="functiontext">LanguageMethods::parse_comment</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">,</span>
|
|
<span class="identifier">matter</span><span class="plain">, </span><span class="identifier">part_before_comment</span><span class="plain">, </span><span class="identifier">part_within_comment</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">part_before_comment</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">, </span><span class="identifier">part_within_comment</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">part_before_comment</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">part_within_comment</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">§1.3.3.1.9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_9_5"></a><b>§1.3.3.1.9.5. </b>Set the <code class="display"><span class="extract">@d</span></code> definition escape very slightly more fancily:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Give constant definition lines slightly fancier openings</span> <span class="cwebmacronumber">1.3.3.1.9.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">BEGIN_DEFINITION_LCAT</span><span class="plain">) {</span>
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@d (%c*)"</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@define (%c*)"</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"define"</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@e (%c*)"</span><span class="plain">)) ||</span>
|
|
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@enum (%c*)"</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"enum"</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">§1.3.3.1.9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_9_6"></a><b>§1.3.3.1.9.6. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Find macro usages and adjust syntax colouring accordingly</span> <span class="cwebmacronumber">1.3.3.1.9.6</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)%@%<(%c*?)%@%>(%c*)"</span><span class="plain">)) {</span>
|
|
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain"> = </span><span class="functiontext">Macros::find_by_name</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pmac</span><span class="plain">) {</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
|
|
<span class="functiontext">Formats::source_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">tab_stops_of_indentation</span><span class="plain">, </span><span class="identifier">prefatory</span><span class="plain">,</span>
|
|
<span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">, (</span><span class="identifier">found</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">,</span>
|
|
<span class="constant">FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">enable_hyperlinks</span><span class="plain">);</span>
|
|
<span class="functiontext">LanguageMethods::reset_syntax_colouring</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_language</span><span class="plain">);</span>
|
|
<span class="identifier">found</span><span class="plain">++;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pmac</span><span class="plain">) </span><span class="identifier">defn</span><span class="plain"> = (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain"> == </span><span class="identifier">pmac</span><span class="plain">-></span><span class="element">defining_paragraph</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">defn</span><span class="plain">) </span><span class="identifier">state</span><span class="plain">-></span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pmac</span><span class="plain">) </span><span class="functiontext">Formats::para_macro</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">pmac</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">defn</span><span class="plain">) </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
|
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain"> - </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"> < </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">temp</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">§1.3.3.1.9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_10"></a><b>§1.3.3.1.10. How paragraphs begin. </b></p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Deal with the marker for the start of a new paragraph, section or chapter</span> <span class="cwebmacronumber">1.3.3.1.10</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">HEADING_START_LCAT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">PARAGRAPH_START_LCAT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">CHAPTER_HEADING_LCAT</span><span class="plain">) ||</span>
|
|
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">)) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wv</span><span class="plain">-></span><span class="element">theme_match</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">If this is a paragraph break forced onto a new page, then throw a page</span> <span class="cwebmacronumber">1.3.3.1.10.1</span>><span class="plain">;</span>
|
|
<span class="functiontext">LanguageMethods::reset_syntax_colouring</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_language</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">HEADING_START_LCAT</span><span class="plain">) </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">) </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-></span><span class="element">category</span><span class="plain"> == </span><span class="constant">CHAPTER_HEADING_LCAT</span><span class="plain">) </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Work out the next mark to place into the TeX vertical list</span> <span class="cwebmacronumber">1.3.3.1.10.2</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<<span class="cwebmacro">Choose which TeX macro to use in order to typeset the new paragraph heading</span> <span class="cwebmacronumber">1.3.3.1.10.3</span>><span class="plain">;</span>
|
|
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">);</span>
|
|
<<span class="cwebmacro">Compose the heading text</span> <span class="cwebmacronumber">1.3.3.1.10.4</span>><span class="plain">;</span>
|
|
<span class="functiontext">Formats::paragraph_heading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">TeX_macro</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain">,</span>
|
|
<span class="identifier">heading_text</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">chaptermark</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">sectionmark</span><span class="plain">, </span><span class="identifier">weight</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
|
|
<<span class="cwebmacro">Weave any regular commentary text after the heading on the same line</span> <span class="cwebmacronumber">1.3.3.1.10.5</span>><span class="plain">;</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) </span><span class="functiontext">Formats::chapter_title_page</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
|
|
<span class="reserved">continue</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1">§1.3.3.1</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_10_1"></a><b>§1.3.3.1.10.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">If this is a paragraph break forced onto a new page, then throw a page</span> <span class="cwebmacronumber">1.3.3.1.10.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain">-></span><span class="element">starts_on_new_page</span><span class="plain">)) </span><span class="functiontext">Formats::pagebreak</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">§1.3.3.1.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_10_2"></a><b>§1.3.3.1.10.2. </b>"Marks" are the contrivance by which TeX produces running heads on pages
|
|
which follow the material on those pages: so that the running head for a page
|
|
can show the paragraph range for the material which tops it, for instance.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">The ornament has to be set in math mode, even in the mark. <code class="display"><span class="extract">\S</span></code> and <code class="display"><span class="extract">\P</span></code>,
|
|
making a section sign and a pilcrow respectively, only work in math mode
|
|
because they abbreviate characters found in math fonts but not regular ones,
|
|
in TeX's deeply peculiar font encoding system.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Work out the next mark to place into the TeX vertical list</span> <span class="cwebmacronumber">1.3.3.1.10.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) {</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">chaptermark</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="identifier">text_operand</span><span class="plain">);</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">sectionmark</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">sectionmark</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="identifier">text_operand</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wv</span><span class="plain">-></span><span class="element">pattern</span><span class="plain">-></span><span class="element">show_abbrevs</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">chaptermark</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_range</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">chaptermark</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_range</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">chaptermark</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">sectionmark</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-></span><span class="element">sectionmark</span><span class="plain">, </span><span class="string">" - %S"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">§1.3.3.1.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_10_3"></a><b>§1.3.3.1.10.3. </b>We want to have different heading styles for different weights, and TeX is
|
|
horrible at using macro parameters as function arguments, so we don't want
|
|
to pass the weight that way. Instead we use
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="plain">\weavesection</span>
|
|
<span class="plain">\weavesections</span>
|
|
<span class="plain">\weavesectionss</span>
|
|
<span class="plain">\weavesectionsss</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph">where the weight is the number of terminal <code class="display"><span class="extract">s</span></code>s, 0 to 3. (TeX macros,
|
|
lamentably, are not allowed digits in their name.) In the cases 0 and 1, we
|
|
also have variants <code class="display"><span class="extract">\nsweavesection</span></code> and <code class="display"><span class="extract">\nsweavesections</span></code> which are
|
|
the same, but with the initial vertical spacing removed; these allow us to
|
|
prevent unsightly excess white space in certain configurations of a section.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Choose which TeX macro to use in order to typeset the new paragraph heading</span> <span class="cwebmacronumber">1.3.3.1.10.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesection"</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">1</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesections"</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">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesectionss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesectionsss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wv</span><span class="plain">-></span><span class="element">theme_match</span><span class="plain">) </span><<span class="cwebmacro">Apply special rules for thematic extracts</span> <span class="cwebmacronumber">1.3.3.1.10.3.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">state</span><span class="plain">-></span><span class="element">next_heading_without_vertical_skip</span><span class="plain">) && (</span><span class="identifier">weight</span><span class="plain"> < </span><span class="constant">2</span><span class="plain">)) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"nsweavesection"</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">1</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"nsweavesections"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">§1.3.3.1.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_10_3_1"></a><b>§1.3.3.1.10.3.1. </b>If we are weaving a selection of extracted paragraphs, normal conventions
|
|
about breaking pages at chapters and sections fail to work. So:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Apply special rules for thematic extracts</span> <span class="cwebmacronumber">1.3.3.1.10.3.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesection"</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">1</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesections"</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">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesectionss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesectionsss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; }</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cap</span><span class="plain"> = </span><span class="functiontext">Tags::retrieve_caption</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-></span><span class="element">theme_match</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">cap</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">cap</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">ch_title</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">last_extract_from</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="element">last_extract_from</span><span class="plain"> != </span><span class="identifier">S</span><span class="plain">) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">last_extract_from</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">extr</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">extr</span><span class="plain">, </span><span class="string">"From %S: %S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-></span><span class="identifier">md</span><span class="plain">-></span><span class="element">ch_title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">sect_title</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">extr</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">ch_title</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">extr</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_3_3_1_10_3">§1.3.3.1.10.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_10_4"></a><b>§1.3.3.1.10.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Compose the heading text</span> <span class="cwebmacronumber">1.3.3.1.10.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">);</span>
|
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">ch_title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*?: (%c*)"</span><span class="plain">))</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">ch_title</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="string">"%S: %S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-></span><span class="element">md</span><span class="plain">-></span><span class="element">ch_range</span><span class="plain">, </span><span class="identifier">brief_title</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">);</span>
|
|
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&</span><span class="identifier">mr</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) && (</span><span class="functiontext">Reader::web_has_one_section</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">))) {</span>
|
|
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-></span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Title"</span><span class="plain">));</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) && (</span><span class="identifier">wv</span><span class="plain">-></span><span class="element">pattern</span><span class="plain">-></span><span class="element">number_sections</span><span class="plain">) && (</span><span class="identifier">S</span><span class="plain">-></span><span class="element">printed_number</span><span class="plain"> >= </span><span class="constant">0</span><span class="plain">))</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="string">"%d. "</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">printed_number</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand</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_3_3_1_10">§1.3.3.1.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_1_10_5"></a><b>§1.3.3.1.10.5. </b>There's quite likely ordinary text on the line following the paragraph
|
|
start indication, too, so we need to weave this out:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Weave any regular commentary text after the heading on the same line</span> <span class="cwebmacronumber">1.3.3.1.10.5</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand2</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-></span><span class="element">text_operand2</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">TRUE</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_3_3_1_10">§1.3.3.1.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP1_3_3_2"></a><b>§1.3.3.2. How paragraphs end. </b>At the end of a paragraph, on the other hand, we do this:
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mode_now</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-></span><span class="identifier">kind_of_material</span><span class="plain"> != </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
|
|
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mode_now</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-></span><span class="element">kind_of_material</span><span class="plain">,</span>
|
|
<span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">?(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">plainer</span><span class="plain">):</span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) && (</span><span class="identifier">current_paragraph</span><span class="plain"> != </span><span class="identifier">state</span><span class="plain">-></span><span class="element">last_endnoted_para</span><span class="plain">)) {</span>
|
|
<span class="identifier">state</span><span class="plain">-></span><span class="element">last_endnoted_para</span><span class="plain"> = </span><span class="identifier">current_paragraph</span><span class="plain">;</span>
|
|
<span class="functiontext">Weaver::show_endnotes_on_previous_paragraph</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">current_paragraph</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">) </span><span class="identifier">current_paragraph</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-></span><span class="element">owning_paragraph</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP1_3_3">§1.3.3</a>, <a href="#SP1_3_3_1_7">§1.3.3.1.7</a>, <a href="#SP1_3_3_1_10">§1.3.3.1.10</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Endnotes. </b>The endnotes describe function calls from far away, or unexpected
|
|
structure usage, or how <code class="display"><span class="extract">CWEB</span></code>-style code substitutions were made.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Weaver::show_endnotes_on_previous_paragraph</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">,</span>
|
|
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
|
<span class="functiontext">Tags::show_endnote_on_ifdefs</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-></span><span class="element">defines_macro</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Show endnote on where paragraph macro is used</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">function</span><span class="plain"> *</span><span class="identifier">fn</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">, </span><span class="reserved">function</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">functions</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Show endnote on where this function is used</span> <span class="cwebmacronumber">2.2</span>><span class="plain">;</span>
|
|
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">st</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">structures</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Show endnote on where this C structure is accessed</span> <span class="cwebmacronumber">2.3</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Weaver::show_endnotes_on_previous_paragraph is used in <a href="#SP1_3_3_2">§1.3.3.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Show endnote on where paragraph macro is used</span> <span class="cwebmacronumber">2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"This code is "</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ct</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">macro_usage</span><span class="plain"> *</span><span class="identifier">mu</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">mu</span><span class="plain">, </span><span class="reserved">macro_usage</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">defines_macro</span><span class="plain">-></span><span class="element">macro_usages</span><span class="plain">)</span>
|
|
<span class="identifier">ct</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ct</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"never used"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">mu</span><span class="plain">, </span><span class="reserved">macro_usage</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">defines_macro</span><span class="plain">-></span><span class="element">macro_usages</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> != </span><span class="identifier">mu</span><span class="plain">-></span><span class="element">used_in_paragraph</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">used_flag</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> < </span><span class="identifier">ct</span><span class="plain">-1) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" and "</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"used in "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Formats::locale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mu</span><span class="plain">-></span><span class="element">used_in_paragraph</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">++;</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">mu</span><span class="plain">-></span><span class="element">multiplicity</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</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="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (twice)"</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">3</span><span class="plain">: </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (three times)"</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">4</span><span class="plain">: </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (four times)"</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">5</span><span class="plain">: </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (five times)"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="identifier">default:</span><span class="plain"> {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">mt</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">mt</span><span class="plain">, </span><span class="string">" (%d times)"</span><span class="plain">, </span><span class="identifier">mu</span><span class="plain">-></span><span class="element">multiplicity</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mt</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">mt</span><span class="plain">);</span>
|
|
<span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_2"></a><b>§2.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Show endnote on where this function is used</span> <span class="cwebmacronumber">2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="reserved">hash_table_entry</span><span class="plain"> *</span><span class="identifier">hte</span><span class="plain"> =</span>
|
|
<span class="functiontext">Analyser::find_hash_entry_for_section</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">-></span><span class="element">function_header_at</span><span class="plain">-></span><span class="element">owning_section</span><span class="plain">,</span>
|
|
<span class="identifier">fn</span><span class="plain">-></span><span class="element">function_name</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"The function "</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">fn</span><span class="plain">-></span><span class="element">function_name</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">hash_table_entry_usage</span><span class="plain"> *</span><span class="identifier">hteu</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">last_cited_in</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">count_under</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">hteu</span><span class="plain">, </span><span class="reserved">hash_table_entry_usage</span><span class="plain">, </span><span class="identifier">hte</span><span class="plain">-></span><span class="element">usages</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain"> != </span><span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">) &&</span>
|
|
<span class="plain">(</span><span class="identifier">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain"> == </span><span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">))</span>
|
|
<<span class="cwebmacro">Cite usage of function here</span> <span class="cwebmacronumber">2.2.1</span>><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">hteu</span><span class="plain">, </span><span class="reserved">hash_table_entry_usage</span><span class="plain">, </span><span class="identifier">hte</span><span class="plain">-></span><span class="element">usages</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain"> != </span><span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Cite usage of function here</span> <span class="cwebmacronumber">2.2.1</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">used_flag</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" appears nowhere else"</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">last_cited_in</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">) && (</span><span class="identifier">last_cited_in</span><span class="plain">))</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">")"</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>§2.2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Cite usage of function here</span> <span class="cwebmacronumber">2.2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">used_flag</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" is used in "</span><span class="plain">);</span>
|
|
<span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">-></span><span class="element">under_section</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">last_cited_in</span><span class="plain">) && (</span><span class="identifier">S</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">)) {</span>
|
|
<span class="identifier">count_under</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_cited_in</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_cited_in</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"), "</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">-></span><span class="element">sect_range</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" ("</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count_under</span><span class="plain">++ > </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::locale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">last_cited_in</span><span class="plain"> = </span><span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2_2">§2.2</a> (twice).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3"></a><b>§2.3. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Show endnote on where this C structure is accessed</span> <span class="cwebmacronumber">2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"The structure "</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">st</span><span class="plain">-></span><span class="element">structure_name</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">) </span><span class="identifier">S</span><span class="plain">-></span><span class="element">scratch_flag</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">structure_element</span><span class="plain"> *</span><span class="identifier">elt</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">elt</span><span class="plain">, </span><span class="reserved">structure_element</span><span class="plain">, </span><span class="identifier">st</span><span class="plain">-></span><span class="element">elements</span><span class="plain">) {</span>
|
|
<span class="reserved">hash_table_entry</span><span class="plain"> *</span><span class="identifier">hte</span><span class="plain"> =</span>
|
|
<span class="functiontext">Analyser::find_hash_entry_for_section</span><span class="plain">(</span><span class="identifier">elt</span><span class="plain">-></span><span class="element">element_created_at</span><span class="plain">-></span><span class="element">owning_section</span><span class="plain">,</span>
|
|
<span class="identifier">elt</span><span class="plain">-></span><span class="element">element_name</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hte</span><span class="plain">) {</span>
|
|
<span class="reserved">hash_table_entry_usage</span><span class="plain"> *</span><span class="identifier">hteu</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">hteu</span><span class="plain">, </span><span class="reserved">hash_table_entry_usage</span><span class="plain">, </span><span class="identifier">hte</span><span class="plain">-></span><span class="element">usages</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hteu</span><span class="plain">-></span><span class="identifier">form_of_usage</span><span class="plain"> & </span><span class="constant">ELEMENT_ACCESS_USAGE</span><span class="plain">)</span>
|
|
<span class="identifier">hteu</span><span class="plain">-></span><span class="element">usage_recorded_at</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">-></span><span class="element">scratch_flag</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">usage_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">external</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-></span><span class="element">scratch_flag</span><span class="plain">) {</span>
|
|
<span class="identifier">usage_count</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">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">) </span><span class="identifier">external</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">external</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" is private to this section"</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" is accessed in "</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="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">-></span><span class="element">scratch_flag</span><span class="plain">) && (</span><span class="identifier">S</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">)) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">++ > </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_range</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-></span><span class="element">under_section</span><span class="plain">-></span><span class="element">scratch_flag</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" and here"</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Section tables of contents. </b>These appear at the top of each woven section, and give links to the paragraphs
|
|
marked as <code class="display"><span class="extract">@h</span></code> headings.
|
|
</p>
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Weaver::weave_table_of_contents</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">noteworthy</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">paragraphs</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain">-></span><span class="element">weight</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) && ((</span><span class="identifier">S</span><span class="plain">-></span><span class="element">barred</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">-></span><span class="element">above_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)))</span>
|
|
<span class="identifier">noteworthy</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noteworthy</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
|
|
<span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">sect_range</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">noteworthy</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-></span><span class="element">paragraphs</span><span class="plain">)</span>
|
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain">-></span><span class="element">weight</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) && ((</span><span class="identifier">S</span><span class="plain">-></span><span class="element">barred</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">-></span><span class="element">above_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">))) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noteworthy</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">ornament</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="element">paragraph_number</span><span class="plain">);</span>
|
|
<span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="identifier">loc</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-></span><span class="identifier">first_line_in_paragraph</span><span class="plain">-></span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
|
|
<span class="identifier">noteworthy</span><span class="plain">++;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">4</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Weaver::weave_table_of_contents is used in <a href="#SP1_3_3_1_3">§1.3.3.1.3</a>, <a href="#SP1_3_3_1_4">§1.3.3.1.4</a>.</p>
|
|
|
|
<hr class="tocbar">
|
|
<ul class="toc"><li><a href="3-ti.html">Back to 'The Indexer'</a></li><li><a href="3-tt.html">Continue with 'The Tangler'</a></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|