inweb-bootstrap/docs/inweb/5-fm.html

1083 lines
141 KiB
HTML
Raw Normal View History

2019-02-04 22:26:45 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-09 17:32:37 +00:00
<title>Format Methods</title>
<meta name="viewport" content="width=device-width initial-scale=1">
2019-02-04 22:26:45 +00:00
<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">
2020-04-10 20:29:28 +00:00
2019-02-04 22:26:45 +00:00
</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">
2020-04-09 17:32:37 +00:00
<!--Weave of 'Format Methods' 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#5">Chapter 5: Formats</a></li><li><b>Format Methods</b></li></ul><p class="purpose">To characterise the relevant differences in behaviour between the various weaving formats offered, such as HTML, ePub, or TeX.</p>
2019-02-04 22:26:45 +00:00
<ul class="toc"><li><a href="#SP1">&#167;1. Formats</a></li><li><a href="#SP3">&#167;3. Creation</a></li><li><a href="#SP4">&#167;4. Methods</a></li><li><a href="#SP31">&#167;31. Post-processing</a></li></ul><hr class="tocbar">
2019-02-04 22:26:45 +00:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Formats. </b>Exactly as in the previous chapter, each format expresses its behaviour
through optional method calls.
</p>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weave_format</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">format_name</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">woven_extension</span><span class="plain">;</span>
<span class="constant">METHOD_CALLS</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">weave_format</span><span class="plain">;</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="functiontext">Formats::create_weave_format</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ext</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain">);</span>
<span class="identifier">wf</span><span class="plain">-&gt;</span><span class="element">format_name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">wf</span><span class="plain">-&gt;</span><span class="element">woven_extension</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">ext</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="identifier">ENABLE_METHOD_CALLS</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">);</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wf</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="functiontext">Formats::find_by_name</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_insensitive</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">wf</span><span class="plain">-&gt;</span><span class="element">format_name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wf</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::create_weave_format is used in 5/ptf (<a href="5-ptf.html#SP1">&#167;1</a>), 5/tf (<a href="5-tf.html#SP1_1">&#167;1.1</a>, <a href="5-tf.html#SP1_2">&#167;1.2</a>, <a href="5-tf.html#SP1_3">&#167;1.3</a>), 5/hf (<a href="5-hf.html#SP1_1">&#167;1.1</a>, <a href="5-hf.html#SP1_2">&#167;1.2</a>).</p>
<p class="endnote">The function Formats::find_by_name is used in <a href="#SP33">&#167;33</a>, 1/ptt (<a href="1-ptt.html#SP3_2">&#167;3.2</a>).</p>
2019-02-04 22:26:45 +00:00
<p class="endnote">The structure weave_format is accessed in 3/ts and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Note that this is the file extension before any post-processing. For
example, PDFs are made by weaving a TeX file and then running this through
<code class="display"><span class="extract">pdftex</span></code>. The extension here will be <code class="display"><span class="extract">.tex</span></code> because that's what the weave
stage produces, even though we will later end up with a <code class="display"><span class="extract">.pdf</span></code>.
</p>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Formats::file_extension</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wf</span><span class="plain">-&gt;</span><span class="identifier">woven_extension</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::file_extension is used in 3/ts (<a href="3-ts.html#SP2_2_1">&#167;2.2.1</a>), 3/ti (<a href="3-ti.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Creation. </b>This must be performed very early in Inweb's run.
</p>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::create_weave_formats</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="functiontext">TeX::create</span><span class="plain">();</span>
<span class="functiontext">PlainText::create</span><span class="plain">();</span>
<span class="functiontext">HTMLFormat::create</span><span class="plain">();</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::create_weave_formats is used in 1/pc (<a href="1-pc.html#SP6_1">&#167;6.1</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Methods. </b>These two don't allow output to be produced: they're for any setting up and
putting away that needs tp be done.
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">BEGIN_WEAVING_FOR_MTID</span></code> is called before any output is generated, indeed,
before even the filename(s) for the output are worked out. Note that it
can return a <code class="display"><span class="extract">*_SWM</span></code> code to change the swarm behaviour of the weave to come;
this is helpful for EPUB weaving.
</p>
<p class="inwebparagraph">More simply, <code class="display"><span class="extract">END_WEAVING_FOR_MTID</span></code> is called when all weaving is done.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">BEGIN_WEAVING_FOR_MTID</span>
<span class="definitionkeyword">enum</span> <span class="constant">END_WEAVING_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">BEGIN_WEAVING_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">)</span>
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">END_WEAVING_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Formats::begin_weaving</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_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">IMETHOD_CALL</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">-&gt;</span><span class="element">pattern_format</span><span class="plain">, </span><span class="constant">BEGIN_WEAVING_FOR_MTID</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::end_weaving</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_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">pattern</span><span class="plain">-&gt;</span><span class="element">pattern_format</span><span class="plain">, </span><span class="constant">END_WEAVING_FOR_MTID</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::begin_weaving is used in 1/pc (<a href="1-pc.html#SP7_4_3">&#167;7.4.3</a>).</p>
2019-02-04 22:26:45 +00:00
<p class="endnote">The function Formats::end_weaving is used in 1/pc (<a href="1-pc.html#SP7_4_3">&#167;7.4.3</a>).</p>
2019-02-04 22:26:45 +00:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Now the weave output, roughly in order from top to bottom.
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">TOP_FOR_MTID</span></code> has the opportunity to put a header at the top of the woven
file. The <code class="display"><span class="extract">comment</span></code> will be anodyne text such as "Weave of... generated at...",
which isn't intended to be read by human eyes, and might become e.g. an
HTML comment.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">TOP_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">TOP_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">comment</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::top</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">text_stream</span><span class="plain"> *</span><span class="identifier">comment</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">TOP_FOR_MTID</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">comment</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::top is used in 3/tw (<a href="3-tw.html#SP1_1">&#167;1.1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The <code class="display"><span class="extract">TOC_FOR_MTID</span></code> method should weave a table of contents at the top of a section.
It is called with four possible values of <code class="display"><span class="extract">stage</span></code>:
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) 1 for the introductory text, which is in <code class="display"><span class="extract">text1</span></code>;
</li><li>(b) 2 for a division between contents items;
</li><li>(c) 3 for a contents item, with paragraph number <code class="display"><span class="extract">text1</span></code> and heading <code class="display"><span class="extract">text2</span></code>;
</li><li>(d) 4 for any concluding text, such as a full stop, or skipped line.
</li></ul>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">TOC_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">TOC_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text2</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="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::toc</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">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text1</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text2</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="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">TOC_FOR_MTID</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">stage</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::toc is used in 3/tw (<a href="3-tw.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>When whole chapters are wovem, or all-in-one weaves include multiple
chapters, the format can add a table of chapter contents, or some similar
interstitial material. This is how:
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">CHAPTER_TP_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">CHAPTER_TP_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</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">void</span><span class="plain"> </span><span class="functiontext">Formats::chapter_title_page</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">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">CHAPTER_TP_FOR_MTID</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>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::chapter_title_page is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_10">&#167;1.3.3.1.10</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>The <code class="display"><span class="extract">SUBHEADING_FOR_MTID</span></code> method is expected to produce subheadings of
two levels of importance, where <code class="display"><span class="extract">level</span></code> is
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) 1 for extract subheadings used in themed weaves, or
</li><li>(b) 2 for minor headings such as the "Purpose" at the top of a section,
or (for old webs which still have them) "Definitions" headings.
</li></ul>
<p class="inwebparagraph">Note that paragraph headings (the result of <code class="display"><span class="extract">@h</span></code>) do not fall under this
method. The <code class="display"><span class="extract">heading</span></code> is the text for it; the <code class="display"><span class="extract">addendum</span></code> if not <code class="display"><span class="extract">NULL</span></code> is
some supplementary text, used in some cases for running heads.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">SUBHEADING_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">SUBHEADING_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">level</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">addendum</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::subheading</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">int</span><span class="plain"> </span><span class="identifier">level</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">addendum</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">SUBHEADING_FOR_MTID</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">level</span><span class="plain">, </span><span class="identifier">heading</span><span class="plain">, </span><span class="identifier">addendum</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::subheading is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_3">&#167;1.3.3.1.3</a>, <a href="3-tw.html#SP1_3_3_1_6">&#167;1.3.3.1.6</a>, <a href="3-tw.html#SP1_3_3_1_10_3_1">&#167;1.3.3.1.10.3.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>And now we do paragraph headings. This method has rather a lot of
arguments, but for most formats, some can be ignored. In particular
<code class="display"><span class="extract">TeX_macro</span></code>, <code class="display"><span class="extract">chaptermark</span></code>, and <code class="display"><span class="extract">sectionmark</span></code> have been precalculated for
the benefit of the TeX format, and all other formats can leave them be.
</p>
<p class="inwebparagraph"><code class="display"><span class="extract">weight</span></code> is more significant, and is
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) 1 for a <code class="display"><span class="extract">@h</span></code> paragraph heading,
</li><li>(b) 2 for a section heading,
</li><li>(c) 3 for a chapter heading.
</li></ul>
<p class="inwebparagraph">In each case, the text of the heading is (unsurprisingly) in <code class="display"><span class="extract">heading_text</span></code>.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">PARAGRAPH_HEADING_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">PARAGRAPH_HEADING_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">TeX_macro</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">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading_text</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">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</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="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::paragraph_heading</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">text_stream</span><span class="plain"> *</span><span class="identifier">TeX_macro</span><span class="plain">,</span>
2020-04-09 17:32:37 +00:00
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading_text</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">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain">) {</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
2020-04-09 17:32:37 +00:00
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARAGRAPH_HEADING_FOR_MTID</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">P</span><span class="plain">,</span>
<span class="identifier">heading_text</span><span class="plain">, </span><span class="identifier">chaptermark</span><span class="plain">, </span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="identifier">weight</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::paragraph_heading is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_10">&#167;1.3.3.1.10</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>The following method is expected to weave a piece of code, which has already
been syntax-coloured; there can also be some indentation, and perhaps even some
<code class="display"><span class="extract">prefatory</span></code> text before the line of code, and also potentially a
<code class="display"><span class="extract">concluding_comment</span></code> at the end of the line.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">SOURCE_CODE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">SOURCE_CODE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</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="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prefatory</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">colouring</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">concluding_comment</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">starts</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">finishes</span><span class="plain">,</span>
2020-04-09 13:00:28 +00:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">code_mode</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">linked</span><span class="plain">)</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::source_code</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">int</span><span class="plain"> </span><span class="identifier">tab_stops_of_indentation</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prefatory</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">colouring</span><span class="plain">,</span>
2020-04-09 13:00:28 +00:00
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">concluding_comment</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">starts</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">finishes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">code_mode</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">linked</span><span class="plain">) {</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">SOURCE_CODE_FOR_MTID</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>
2020-04-09 13:00:28 +00:00
<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">starts</span><span class="plain">, </span><span class="identifier">finishes</span><span class="plain">, </span><span class="identifier">code_mode</span><span class="plain">, </span><span class="identifier">linked</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::source_code is used in <a href="#SP11">&#167;11</a>, 3/tw (<a href="3-tw.html#SP1_3_3_1_8_4">&#167;1.3.3.1.8.4</a>, <a href="3-tw.html#SP1_3_3_1_9">&#167;1.3.3.1.9</a>, <a href="3-tw.html#SP1_3_3_1_9_6">&#167;1.3.3.1.9.6</a>).</p>
2019-02-04 22:26:45 +00:00
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>More primitively, this method weaves a piece of code which has been coloured
drably in a uniform <code class="display"><span class="extract">EXTRACT_COLOUR</span></code> colour. This is used for weaving words like
<code class="display"><span class="extract">these_ones</span></code> of code given inside commentary.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">INLINE_CODE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">INLINE_CODE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pre</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::source_fragment</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">text_stream</span><span class="plain"> *</span><span class="identifier">fragment</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">INLINE_CODE_FOR_MTID</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>
2019-02-04 22:26:45 +00:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">fragment</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">EXTRACT_COLOUR</span><span class="plain">);</span>
2020-04-09 13:00:28 +00:00
<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">0</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">fragment</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">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="constant">FALSE</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">INLINE_CODE_FOR_MTID</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>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::source_fragment is used in <a href="#SP24">&#167;24</a>.</p>
2019-02-04 22:26:45 +00:00
2020-04-09 13:00:28 +00:00
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>And this weaves a URL, hyperlinking it where possible.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">URL_FOR_MTID</span>
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">URL_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">url</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">content</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">external</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::url</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">text_stream</span><span class="plain"> *</span><span class="identifier">url</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">content</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">external</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Methods::provided</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">-&gt;</span><span class="identifier">methods</span><span class="plain">, </span><span class="constant">URL_FOR_MTID</span><span class="plain">)) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">URL_FOR_MTID</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">url</span><span class="plain">, </span><span class="identifier">content</span><span class="plain">, </span><span class="identifier">external</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">content</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::url is used in <a href="#SP24_2">&#167;24.2</a>, <a href="#SP24_3_1">&#167;24.3.1</a>, 5/hf (<a href="5-hf.html#SP10_1">&#167;10.1</a>, <a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p>
2020-04-09 13:00:28 +00:00
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>This method produces the <code class="display"><span class="extract">&gt;&gt; Example</span></code> bits of example source text, really
2019-02-04 22:26:45 +00:00
a convenience for Inform 7 code commentary.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">DISPLAY_LINE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-09 17:32:37 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">DISPLAY_LINE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">from</span><span class="plain">)</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::display_line</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">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">DISPLAY_LINE_FOR_MTID</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">from</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::display_line is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_8_1">&#167;1.3.3.1.8.1</a>).</p>
2020-04-09 13:00:28 +00:00
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b><code class="display"><span class="extract">ITEM_FOR_MTID</span></code> produces an item marker in a typical (a), (b), (c), ... sort
2019-02-04 22:26:45 +00:00
of list. <code class="display"><span class="extract">depth</span></code> can be 1 or 2: you can have lists in lists, but not lists in
lists in lists. <code class="display"><span class="extract">label</span></code> is the marker text, e.g., <code class="display"><span class="extract">a</span></code>, <code class="display"><span class="extract">b</span></code>, <code class="display"><span class="extract">c</span></code>, ...; it can
also be empty, in which case the method should move to the matching level of
indentation but not weave any bracketed marker.
</p>
<p class="inwebparagraph"></p>
<ul class="items"><li>(a) This was produced by <code class="display"><span class="extract">depth</span></code> equal to 1, <code class="display"><span class="extract">label</span></code> equal to <code class="display"><span class="extract">a</span></code>.
<ul class="items"><li>(i) This was produced by <code class="display"><span class="extract">depth</span></code> equal to 2, <code class="display"><span class="extract">label</span></code> equal to <code class="display"><span class="extract">i</span></code>.
</li><li>(ii) This was produced by <code class="display"><span class="extract">depth</span></code> equal to 2, <code class="display"><span class="extract">label</span></code> equal to <code class="display"><span class="extract">ii</span></code>.
</li></ul>
<li> This was produced by <code class="display"><span class="extract">depth</span></code> equal to 1, <code class="display"><span class="extract">label</span></code> empty.
</li><li>(b) This was produced by <code class="display"><span class="extract">depth</span></code> equal to 1, <code class="display"><span class="extract">label</span></code> equal to <code class="display"><span class="extract">b</span></code>.
</li></ul>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">ITEM_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">ITEM_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">label</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::item</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">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">label</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">ITEM_FOR_MTID</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">depth</span><span class="plain">, </span><span class="identifier">label</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::item is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_8_3">&#167;1.3.3.1.8.3</a>).</p>
2020-04-09 13:00:28 +00:00
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>The "bar" is a horizontal line across the page, but it's woven only for
2019-02-04 22:26:45 +00:00
very old webs nowadays. New formats really needn't implement this.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">BAR_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">BAR_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::bar</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">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BAR_FOR_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::bar is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_7">&#167;1.3.3.1.7</a>).</p>
2020-04-09 13:00:28 +00:00
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b><code class="display"><span class="extract">FIGURE_FOR_MTID</span></code> has to weave a figure, i.e., render an image in some way.
2019-02-04 22:26:45 +00:00
<code class="display"><span class="extract">figname</span></code> should be (the text of) a leafname within the <code class="display"><span class="extract">Figures</span></code> directory
of the web.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">FIGURE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">FIGURE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">figname</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">w</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">h</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="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::figure</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">text_stream</span><span class="plain"> *</span><span class="identifier">figname</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">w</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">h</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="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">FIGURE_FOR_MTID</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">, </span><span class="identifier">w</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">pl</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::figure is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2_1">&#167;1.3.3.1.2.1</a>).</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b><code class="display"><span class="extract">EMBED_FOR_MTID</span></code> has to embed some Internet-sourced content. <code class="display"><span class="extract">service</span></code>
here is something like <code class="display"><span class="extract">YouTube</span></code> or <code class="display"><span class="extract">Soundcloud</span></code>, and <code class="display"><span class="extract">ID</span></code> is whatever code
that service uses to identify the video/audio in question.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">EMBED_FOR_MTID</span>
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">EMBED_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">service</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ID</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::embed</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">text_stream</span><span class="plain"> *</span><span class="identifier">service</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ID</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">EMBED_FOR_MTID</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">service</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::embed is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2_2">&#167;1.3.3.1.2.2</a>).</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b>This method weaves an angle-bracketed paragraph macro name. <code class="display"><span class="extract">defn</span></code> is set
2019-02-04 22:26:45 +00:00
if and only if this is the place where the macro is defined &mdash; the usual
thing is to render some sort of equals sign after it, if so.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">PARA_MACRO_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">PARA_MACRO_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</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="reserved">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::para_macro</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">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</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="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARA_MACRO_FOR_MTID</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>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::para_macro is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_9_6">&#167;1.3.3.1.9.6</a>).</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b>For many formats, page breaks are meaningless, and in that case this method
2019-02-04 22:26:45 +00:00
should not be provided. Inweb uses them only for cosmetic benefit (and rarely
at that), so no harm is done if there's no visual indication here.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">PAGEBREAK_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">PAGEBREAK_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::pagebreak</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">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PAGEBREAK_FOR_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::pagebreak is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_2">&#167;1.3.3.1.2</a>, <a href="3-tw.html#SP1_3_3_1_10_1">&#167;1.3.3.1.10.1</a>).</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b>"Blank line" here might better be called "vertical skip of some kind". The
2019-02-04 22:26:45 +00:00
following should render some kind of skip, and may want to take note of whether
this happens in commentary or in code: the <code class="display"><span class="extract">in_comment</span></code> flag provides this
information.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">BLANK_LINE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">BLANK_LINE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_comment</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::blank_line</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">int</span><span class="plain"> </span><span class="identifier">in_comment</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BLANK_LINE_FOR_MTID</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">in_comment</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::blank_line is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_8_2">&#167;1.3.3.1.8.2</a>, <a href="3-tw.html#SP1_3_3_1_9_2">&#167;1.3.3.1.9.2</a>).</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>Another opportunity for vertical tidying-up. At the beginning of a code
2019-02-04 22:26:45 +00:00
line which occurs after a run of <code class="display"><span class="extract">@d</span></code> or <code class="display"><span class="extract">@e</span></code> definitions, this method is
called. It can then insert a little vertical gap to separate the code from
the definitions.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">AFTER_DEFINITIONS_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">AFTER_DEFINITIONS_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::after_definitions</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">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">AFTER_DEFINITIONS_FOR_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::after_definitions is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_9">&#167;1.3.3.1.9</a>).</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b>This method is called when the weaver changes "material" &mdash; for example,
2019-02-04 22:26:45 +00:00
from <code class="display"><span class="extract">REGULAR_MATERIAL</span></code> to <code class="display"><span class="extract">CODE_MATERIAL</span></code>. The flag <code class="display"><span class="extract">content</span></code> is set if
the line on which this happens contains some content which will then be
woven; it will be clear for blank lines, or lines intercepted by the
weaver and turned into something else (such as list items).
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">CHANGE_MATERIAL_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">CHANGE_MATERIAL_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">old_material</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">content</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">plainly</span><span class="plain">)</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::change_material</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">int</span><span class="plain"> </span><span class="identifier">old_material</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">content</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">plainly</span><span class="plain">) {</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">CHANGE_MATERIAL_FOR_MTID</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">old_material</span><span class="plain">, </span><span class="identifier">new_material</span><span class="plain">,</span>
<span class="identifier">content</span><span class="plain">, </span><span class="identifier">plainly</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-08 15:25:37 +00:00
<p class="endnote">The function Formats::change_material is used in 3/tw (<a href="3-tw.html#SP1_3_3_1_1">&#167;1.3.3.1.1</a>, <a href="3-tw.html#SP1_3_3_1_8_3">&#167;1.3.3.1.8.3</a>, <a href="3-tw.html#SP1_3_3_1_8_4">&#167;1.3.3.1.8.4</a>, <a href="3-tw.html#SP1_3_3_1_9_1">&#167;1.3.3.1.9.1</a>, <a href="3-tw.html#SP1_3_3_2">&#167;1.3.3.2</a>).</p>
2019-02-04 22:26:45 +00:00
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b>This is called on a change of colour. "Colour" is really a shorthand way
2019-02-04 22:26:45 +00:00
of saying something more like "style", but seemed less ambiguous. In HTML,
this might trigger a change of CSS span style; in plain text, it would do
nothing.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">CHANGE_COLOUR_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">CHANGE_COLOUR_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">col</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_code</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::change_colour</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">int</span><span class="plain"> </span><span class="identifier">col</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_code</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">CHANGE_COLOUR_FOR_MTID</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">col</span><span class="plain">, </span><span class="identifier">in_code</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-04-09 17:32:37 +00:00
<p class="endnote">The function Formats::change_colour is used in 5/tf (<a href="5-tf.html#SP8_2">&#167;8.2</a>, <a href="5-tf.html#SP15">&#167;15</a>), 5/hf (<a href="5-hf.html#SP10_3">&#167;10.3</a>).</p>
2019-02-04 22:26:45 +00:00
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>The following takes text, divides it up at stroke-mark boundaries &mdash;
2019-02-04 22:26:45 +00:00
that is, <code class="display"><span class="extract">this is inside</span></code>, this is outside &mdash; and sends contiguous pieces
of it either to <code class="display"><span class="extract">Formats::source_fragment</span></code> or <code class="display"><span class="extract">Formats::text_fragment</span></code>
as appropriate.
</p>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::text</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">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="functiontext">Formats::text_r</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">id</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::text_comment</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">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
<span class="functiontext">Formats::text_r</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">id</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::text_r</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">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">within</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">comments</span><span class="plain">) {</span>
2020-04-09 17:32:37 +00:00
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">code_in_comments_notation</span><span class="plain"> =</span>
<span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">comments</span><span class="plain">)?(</span><span class="identifier">I</span><span class="string">"Code In Code Comments Notation"</span><span class="plain">):(</span><span class="identifier">I</span><span class="string">"Code In Commentary Notation"</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Split text and code extracts</span> <span class="cwebmacronumber">24.1</span>&gt;<span class="plain">;</span>
2020-04-09 17:32:37 +00:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Recognose hyperlinks</span> <span class="cwebmacronumber">24.2</span>&gt;<span class="plain">;</span>
2020-04-09 17:32:37 +00:00
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">xref_notation</span><span class="plain"> = </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"Cross-References Notation"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ne</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Off"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Recognise cross-references</span> <span class="cwebmacronumber">24.3</span>&gt;<span class="plain">;</span>
2020-04-09 17:32:37 +00:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">within</span><span class="plain">) {</span>
<span class="functiontext">Formats::source_fragment</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">id</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Formats::text_fragment</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">id</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::text is used in 2/tgs (<a href="2-tgs.html#SP7">&#167;7</a>, <a href="2-tgs.html#SP7_1">&#167;7.1</a>), 3/tw (<a href="3-tw.html#SP1_3_3_1_8">&#167;1.3.3.1.8</a>, <a href="3-tw.html#SP1_3_3_1_8_4">&#167;1.3.3.1.8.4</a>, <a href="3-tw.html#SP1_3_3_1_10_5">&#167;1.3.3.1.10.5</a>, <a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2">&#167;2.2</a>, <a href="3-tw.html#SP2_2_1">&#167;2.2.1</a>, <a href="3-tw.html#SP2_3">&#167;2.3</a>), 5/ptf (<a href="5-ptf.html#SP3">&#167;3</a>), 5/tf (<a href="5-tf.html#SP4">&#167;4</a>), 5/hf (<a href="5-hf.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Formats::text_comment is used in 5/tf (<a href="5-tf.html#SP24_2">&#167;24.2</a>), 5/hf (<a href="5-hf.html#SP10">&#167;10</a>).</p>
<p class="endnote">The function Formats::text_r is used in <a href="#SP24_1">&#167;24.1</a>, <a href="#SP24_2">&#167;24.2</a>, <a href="#SP24_3_1">&#167;24.3.1</a>.</p>
2020-04-09 17:32:37 +00:00
<p class="inwebparagraph"><a id="SP24_1"></a><b>&#167;24.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Split text and code extracts</span> <span class="cwebmacronumber">24.1</span>&gt; =
2020-04-09 17:32:37 +00:00
</code></p>
<pre class="displaydefn">
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\\'</span><span class="plain">) </span><span class="identifier">i</span><span class="plain"> += </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">) - </span><span class="constant">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">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">code_in_comments_notation</span><span class="plain">)) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">,</span>
<span class="identifier">i</span><span class="plain"> + </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">code_in_comments_notation</span><span class="plain">)), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
<span class="functiontext">Formats::text_r</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">before</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Formats::text_r</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">after</span><span class="plain">, (</span><span class="identifier">within</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
<span class="plain">}</span>
2020-04-09 17:32:37 +00:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
2020-04-09 17:32:37 +00:00
<p class="inwebparagraph"><a id="SP24_2"></a><b>&#167;24.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Recognose hyperlinks</span> <span class="cwebmacronumber">24.2</span>&gt; =
2020-04-09 17:32:37 +00:00
</code></p>
<pre class="displaydefn">
2020-04-09 13:00:28 +00:00
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
2020-04-09 17:32:37 +00:00
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"http://"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"https://"</span><span class="plain">))) {</span>
2020-04-09 13:00:28 +00:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</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>
2020-04-09 17:32:37 +00:00
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">after</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(https*://%C+)(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Formats::text_r</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">before</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Formats::url</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="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="functiontext">Formats::text_r</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="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
2019-02-04 22:26:45 +00:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP24_3"></a><b>&#167;24.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Recognise cross-references</span> <span class="cwebmacronumber">24.3</span>&gt; =
2020-04-09 17:32:37 +00:00
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">xref_notation</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">within</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">xref_notation</span><span class="plain">))) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">+1;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">j</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::includes_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">, </span><span class="identifier">xref_notation</span><span class="plain">)) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">, </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
<span class="functiontext">Str::substr</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">, </span><span class="functiontext">Str::at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> + </span><span class="identifier">N</span><span class="plain">), </span><span class="functiontext">Str::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">));</span>
&lt;<span class="cwebmacro">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">24.3.1</span>&gt;<span class="plain">;</span>
2020-04-09 17:32:37 +00:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">before</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">reference</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">after</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">allow</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">j</span><span class="plain">++;</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="#SP24">&#167;24</a>.</p>
2020-04-09 17:32:37 +00:00
<p class="inwebparagraph"><a id="SP24_3_1"></a><b>&#167;24.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Attempt to resolve the cross-reference</span> <span class="cwebmacronumber">24.3.1</span>&gt; =
2020-04-09 17:32:37 +00:00
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Formats::resolve_reference_in_weave</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">reference</span><span class="plain">,</span>
<span class="identifier">current_weave_line</span><span class="plain">)) {</span>
<span class="functiontext">Formats::text_r</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">before</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="functiontext">Formats::url</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">url</span><span class="plain">, </span><span class="identifier">title</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">Formats::text_r</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">after</span><span class="plain">, </span><span class="identifier">within</span><span class="plain">, </span><span class="identifier">comments</span><span class="plain">);</span>
<span class="identifier">allow</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24_3">&#167;24.3</a>.</p>
2020-04-09 17:32:37 +00:00
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. </b>The following must decide what a reference like "Chapter 3" should refer
2020-04-09 17:32:37 +00:00
to: that is, whether it makes unamgiguous sense, and if so, what URL we should
link to, and what the full text of the link might be.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Formats::resolve_reference_in_weave</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">url</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">,</span>
<span class="reserved">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">text</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="reserved">module</span><span class="plain"> *</span><span class="identifier">found_M</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">section_md</span><span class="plain"> *</span><span class="identifier">found_Sm</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">named_as_module</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">WebModules::named_reference</span><span class="plain">(&amp;</span><span class="identifier">found_M</span><span class="plain">, &amp;</span><span class="identifier">found_Sm</span><span class="plain">, &amp;</span><span class="identifier">named_as_module</span><span class="plain">,</span>
<span class="identifier">title</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="identifier">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">, </span><span class="identifier">text</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">N</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"No section has this name"</span><span class="plain">, </span><span class="identifier">L</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="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &gt; </span><span class="constant">1</span><span class="plain">) {</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Multiple sections might be meant here"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="functiontext">WebModules::named_reference</span><span class="plain">(&amp;</span><span class="identifier">found_M</span><span class="plain">, &amp;</span><span class="identifier">found_Sm</span><span class="plain">, &amp;</span><span class="identifier">named_as_module</span><span class="plain">,</span>
<span class="identifier">title</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="identifier">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="constant">TRUE</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="plain">} </span><span class="reserved">else</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">found_S</span><span class="plain"> = </span><span class="identifier">NULL</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">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">chapters</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">-&gt;</span><span class="element">sections</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain"> == </span><span class="identifier">found_Sm</span><span class="plain">) </span><span class="identifier">found_S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"could not locate S"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_M</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"could not locate M"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found_M</span><span class="plain"> != </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="string">"../%S-module/"</span><span class="plain">, </span><span class="identifier">found_M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">HTMLFormat::section_URL</span><span class="plain">(</span><span class="identifier">url</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">found_S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">named_as_module</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">found_M</span><span class="plain"> != </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">as_module</span><span class="plain">)) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">title</span><span class="plain">, </span><span class="string">" (in %S)"</span><span class="plain">, </span><span class="identifier">found_M</span><span class="plain">-&gt;</span><span class="element">module_name</span><span class="plain">);</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>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2019-02-04 22:26:45 +00:00
<p class="endnote">The function Formats::resolve_reference_in_weave is used in <a href="#SP24_3_1">&#167;24.3.1</a>, 5/hf (<a href="5-hf.html#SP10_2_1">&#167;10.2.1</a>).</p>
2019-02-04 22:26:45 +00:00
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b><code class="display"><span class="extract">COMMENTARY_TEXT_FOR_MTID</span></code> straightforwardly weaves out a run of contiguous
2019-02-04 22:26:45 +00:00
text. Ordinarily, any formulae written in TeX notation (i.e., in dollar signs
used as brackets) will be transmogrified into a plain text paraphrase, but
the <code class="display"><span class="extract">PRESERVE_MATH_MODE_FOR_MTID</span></code> can prevent this. (And of course the TeX
format does, because it wants to keep the formulae in all their glory.)
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">COMMENTARY_TEXT_FOR_MTID</span>
<span class="definitionkeyword">enum</span> <span class="constant">PRESERVE_MATH_MODE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-10 20:29:28 +00:00
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">PRESERVE_MATH_MODE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">,</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">)</span>
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">COMMENTARY_TEXT_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">matter</span><span class="plain">)</span>
2019-02-04 22:26:45 +00:00
2020-04-06 11:26:10 +00:00
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::text_fragment</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">text_stream</span><span class="plain"> *</span><span class="identifier">fragment</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
2020-04-08 11:19:34 +00:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</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="functiontext">Str::eq_wide_string</span><span class="plain">(</span>
<span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_web</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"TeX Mathematics Notation"</span><span class="plain">), </span><span class="identifier">L</span><span class="string">"On"</span><span class="plain">)) {</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
2020-04-10 20:29:28 +00:00
<span class="identifier">IMETHOD_CALL</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PRESERVE_MATH_MODE_FOR_MTID</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">fragment</span><span class="plain">);</span>
2020-04-08 11:19:34 +00:00
<span class="plain">}</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">TeX::remove_math_mode</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">fragment</span><span class="plain">);</span>
2020-04-10 20:29:28 +00:00
<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">matter</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">matter</span><span class="plain">, </span><span class="identifier">fragment</span><span class="plain">);</span>
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">COMMENTARY_TEXT_FOR_MTID</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>
2019-02-04 22:26:45 +00:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::text_fragment is used in <a href="#SP24">&#167;24</a>.</p>
2019-02-04 22:26:45 +00:00
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b>The weaver has special typographical support for the stand-alone Inform
2019-02-04 22:26:45 +00:00
document of Preform grammar, and this is the hook for it. Most formats
should ignore it.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">PREFORM_DOCUMENT_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">PREFORM_DOCUMENT_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</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">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="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">concluding_comment</span><span class="plain">)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Formats::preform_document</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">web</span><span class="plain"> *</span><span class="identifier">W</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="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">concluding_comment</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">IMETHOD_CALL</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PREFORM_DOCUMENT_FOR_MTID</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">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>
2019-02-04 22:26:45 +00:00
<span class="identifier">concluding_comment</span><span class="plain">);</span>
2020-04-06 11:26:10 +00:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::preform_document is used in 4/is (<a href="4-is.html#SP16">&#167;16</a>).</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. </b>When the weaver adds one of its endnotes &mdash; "This function is used in...",
2019-02-04 22:26:45 +00:00
or some such &mdash; it calls this method twice, once before the start, with
<code class="display"><span class="extract">end</span></code> set to 1, and once after the end, with <code class="display"><span class="extract">end</span></code> set to 2.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">ENDNOTE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">ENDNOTE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::endnote</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">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">ENDNOTE_FOR_MTID</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">end</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::endnote is used in 2/tgs (<a href="2-tgs.html#SP7">&#167;7</a>, <a href="2-tgs.html#SP7_1">&#167;7.1</a>), 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2">&#167;2.2</a>, <a href="3-tw.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP29"></a><b>&#167;29. </b>"Locale" here isn't used in the Unix sense. It means text which describes
2019-02-04 22:26:45 +00:00
a range of numbered paragraphs, from <code class="display"><span class="extract">par1</span></code> to <code class="display"><span class="extract">par2</span></code>, though <code class="display"><span class="extract">par2</span></code> can
instead be null, in which case the description is of just one para. (This
is often used in endnotes.)
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">LOCALE_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">LOCALE_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">par1</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">par2</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::locale</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">par1</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">par2</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">LOCALE_FOR_MTID</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">par1</span><span class="plain">, </span><span class="identifier">par2</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::locale is used in 3/tw (<a href="3-tw.html#SP2_1">&#167;2.1</a>, <a href="3-tw.html#SP2_2_1">&#167;2.2.1</a>), 5/ptf (<a href="5-ptf.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b>And finally: the bottom of the woven file. The <code class="display"><span class="extract">comment</span></code> is, again, not
2019-02-04 22:26:45 +00:00
intended for human eyes, and will be some sort of "End of weave" remark.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">TAIL_FOR_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">TAIL_FOR_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">comment</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">void</span><span class="plain"> </span><span class="functiontext">Formats::tail</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">text_stream</span><span class="plain"> *</span><span class="identifier">comment</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">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">;</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">TAIL_FOR_MTID</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">comment</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::tail is used in 3/tw (<a href="3-tw.html#SP1_5">&#167;1.5</a>).</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. Post-processing. </b>Consider what happens when Inweb makes a PDF, via TeX. The initial weave is
2019-02-04 22:26:45 +00:00
to a TeX file; it's then "post-processing" which will turn this into a PDF.
The following method calls allow such two-stage formats to function; in
this case, it would be the PDF format which provides the necessary methods
to turn TeX into PDF. The important method is this one:
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">POST_PROCESS_POS_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">POST_PROCESS_POS_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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">int</span><span class="plain"> </span><span class="identifier">open_afterwards</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Formats::post_process_weave</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">int</span><span class="plain"> </span><span class="identifier">open_afterwards</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">, </span><span class="constant">POST_PROCESS_POS_MTID</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">open_afterwards</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::post_process_weave is used in 3/ts (<a href="3-ts.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. </b>Optionally, a fancy report can be printed out, to describe what has been
2019-02-04 22:26:45 +00:00
done:
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">POST_PROCESS_REPORT_POS_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">POST_PROCESS_REPORT_POS_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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">void</span><span class="plain"> </span><span class="functiontext">Formats::report_on_post_processing</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="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">, </span><span class="constant">POST_PROCESS_REPORT_POS_MTID</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::report_on_post_processing is used in 3/ts (<a href="3-ts.html#SP2_3">&#167;2.3</a>).</p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. </b>After post-processing, an index file is sometimes needed. For example, if a
2019-02-04 22:26:45 +00:00
big web is woven to a swarm of PDFs, one for each section, then we also want
to make an index page in HTML which provides annotated links to those PDFs.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">INDEX_PDFS_POS_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">INDEX_PDFS_POS_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain">)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Formats::index_pdfs</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">format</span><span class="plain">) {</span>
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="functiontext">Formats::find_by_name</span><span class="plain">(</span><span class="identifier">format</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wf</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">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">IMETHOD_CALLV</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">INDEX_PDFS_POS_MTID</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::index_pdfs appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP34"></a><b>&#167;34. </b>And in that index file, we may want to substitute in values for placeholder
2019-02-04 22:26:45 +00:00
text like <code class="display"><span class="extract">[[PDF Size]]</span></code> in the template file. This is the <code class="display"><span class="extract">detail</span></code>.
</p>
<pre class="definitions">
2020-04-06 11:26:10 +00:00
<span class="definitionkeyword">enum</span> <span class="constant">POST_PROCESS_SUBSTITUTE_POS_MTID</span>
2019-02-04 22:26:45 +00:00
</pre>
<pre class="display">
2020-04-06 11:26:10 +00:00
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">POST_PROCESS_SUBSTITUTE_POS_MTID</span><span class="plain">, </span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</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="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">detail</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Formats::substitute_post_processing_data</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">text_stream</span><span class="plain"> *</span><span class="identifier">detail</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">IMETHOD_CALL</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">format</span><span class="plain">, </span><span class="constant">POST_PROCESS_SUBSTITUTE_POS_MTID</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">detail</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
2019-02-04 22:26:45 +00:00
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Formats::substitute_post_processing_data is used in 3/ti (<a href="3-ti.html#SP5_1_8_2">&#167;5.1.8.2</a>, <a href="3-ti.html#SP5_1_8_3">&#167;5.1.8.3</a>, <a href="3-ti.html#SP5_1_8_4">&#167;5.1.8.4</a>).</p>
2019-02-04 22:26:45 +00:00
2019-03-12 23:32:12 +00:00
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 5: Formats.)</i></li><li><a href="5-ptf.html">Continue with 'Plain Text Format'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
2019-02-04 22:26:45 +00:00
</body>
</html>